diff --git a/.submitproject b/.submitproject index 67b331150376..0da416307a26 100644 --- a/.submitproject +++ b/.submitproject @@ -1,20 +1,20 @@ [submitproject "filter"] includedSubdirectoryPatterns = .sourcefilters includedSubdirectoryPatterns = Configurations/ - includedSubdirectoryPatterns = Source/ - includedSubdirectoryPatterns = WebKitLibraries/SDKs/*.internal-additions.sdk/ + includedSubdirectoryPatterns = Source/bmalloc/ + includedSubdirectoryPatterns = Source/JavaScriptCore/ + includedSubdirectoryPatterns = Source/WebCore/ + includedSubdirectoryPatterns = Source/WebDriver/ + includedSubdirectoryPatterns = Source/WebGPU/ + includedSubdirectoryPatterns = Source/WebInspectorUI/ + includedSubdirectoryPatterns = Source/WebKit/ + includedSubdirectoryPatterns = Source/WebKitLegacy/ + includedSubdirectoryPatterns = Source/WTF/ + includedSubdirectoryPatterns = Source/ThirdParty/ANGLE/ + includedSubdirectoryPatterns = Source/ThirdParty/libwebrtc/ excludedSubdirectoryPatterns = Source/ThirdParty/libwebrtc/Source/third_party/boringssl/src/util excludedSubdirectoryPatterns = Source/ThirdParty/libwebrtc/Source/webrtc/examples - excludedSubdirectoryPatterns = Source/ThirdParty/capstone - excludedSubdirectoryPatterns = Source/ThirdParty/d3flamegraphjs - excludedSubdirectoryPatterns = Source/ThirdParty/d3js - excludedSubdirectoryPatterns = Source/ThirdParty/gmock - excludedSubdirectoryPatterns = Source/ThirdParty/gtest - excludedSubdirectoryPatterns = Source/ThirdParty/libsysprof-capture - excludedSubdirectoryPatterns = Source/ThirdParty/qunit - excludedSubdirectoryPatterns = Source/ThirdParty/skia - excludedSubdirectoryPatterns = Source/ThirdParty/unifdef - excludedSubdirectoryPatterns = Source/ThirdParty/xdgmime excludedSubdirectoryPatterns = Source/*/SaferCPPExpectations/ + includedSubdirectoryPatterns = WebKitLibraries/SDKs/*.internal-additions.sdk/ [submitproject "gitmodules"] enabled = false diff --git a/.submitproject-append b/.submitproject-append new file mode 100644 index 000000000000..c3d0ce2c5b6a --- /dev/null +++ b/.submitproject-append @@ -0,0 +1,9 @@ +[submitproject "filter"] + includedSubdirectoryPatterns = Source/ThirdParty/gmock + includedSubdirectoryPatterns = Source/ThirdParty/gtest + includedSubdirectoryPatterns = Tools/DumpRenderTree + includedSubdirectoryPatterns = Tools/ImageDiff + includedSubdirectoryPatterns = Tools/MiniBrowser + includedSubdirectoryPatterns = Tools/TestRunnerShared + includedSubdirectoryPatterns = Tools/WebKitTestRunner + excludedSubdirectoryPatterns = Tools/WebKitTestRunner/gtk diff --git a/.wkdev-sdk-version b/.wkdev-sdk-version index b5c719b9b4e7..0c0de28c02e8 100644 --- a/.wkdev-sdk-version +++ b/.wkdev-sdk-version @@ -1 +1 @@ -2.53-v2-2352e15 +2.53-v5-3bdf4b8 diff --git a/CMakeLists.txt b/CMakeLists.txt index 84002fb5154f..0726e8c795c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,6 +61,26 @@ if (PORT STREQUAL "IOS") endif () endif () +if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS" AND NOT CMAKE_OSX_SYSROOT) + # Set CMAKE_OSX_SYSROOT before the project() call below. project() runs ABI + # detection tests whose results are cached; having the wrong sysroot there + # would cause those cached results to refer to a different SDK than actual + # builds use. OptionsMac.cmake (which sets this via WEBKIT_XCRUN) is loaded + # only after project() via include(WebKitCommon), so it is too late. + # WEBKIT_XCRUN is also unavailable here because WebKitXcrun.cmake is + # included by OptionsMac.cmake. + execute_process(COMMAND xcrun --sdk macosx --show-sdk-path + OUTPUT_VARIABLE _macos_sysroot + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _xcrun_result + ERROR_QUIET) + if (_xcrun_result EQUAL 0 AND _macos_sysroot) + set(CMAKE_OSX_SYSROOT "${_macos_sysroot}" CACHE PATH "macOS SDK path" FORCE) + endif () + unset(_macos_sysroot) + unset(_xcrun_result) +endif () + project(WebKit LANGUAGES C CXX) # ----------------------------------------------------------------------------- @@ -111,23 +131,24 @@ if (SWIFT_REQUIRED) endif () # Override Swift compiler to a wrapper script to work around the - # fact pkg-config feeds CFLAGS even to swiftc. - # Guard against cache poisoning: if CMAKE_Swift_COMPILER already IS the - # wrapper (from a previous configure), find the real compiler via 'which'. + # 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) - execute_process(COMMAND which swiftc RESULT_VARIABLE _which_retcode OUTPUT_VARIABLE _real_swiftc OUTPUT_STRIP_TRAILING_WHITESPACE) - if (NOT _which_retcode EQUAL 0) - message(FATAL_ERROR "swiftc not found in PATH") + if (NOT ORIGINAL_Swift_COMPILER) + find_program(ORIGINAL_Swift_COMPILER NAMES swiftc REQUIRED) endif () else () - set(_real_swiftc "${CMAKE_Swift_COMPILER}") + set(ORIGINAL_Swift_COMPILER "${CMAKE_Swift_COMPILER}" CACHE FILEPATH "Original Swift compiler" FORCE) endif () - set(ORIGINAL_Swift_COMPILER "${_real_swiftc}" CACHE FILEPATH "Original Swift compiler" FORCE) - set(CMAKE_Swift_COMPILER "${_swift_wrapper}" CACHE FILEPATH "Swift compiler wrapper" FORCE) + set(CMAKE_Swift_COMPILER "${_swift_wrapper}") add_compile_options($<$:--original-swift-compiler=${ORIGINAL_Swift_COMPILER}>) + add_link_options($<$:--original-swift-compiler=${ORIGINAL_Swift_COMPILER}>) + # The static archive rule () uses neither + # nor link options, so inject the flag directly into the template. + string(REPLACE "" + " --original-swift-compiler=${ORIGINAL_Swift_COMPILER}" + CMAKE_Swift_CREATE_STATIC_LIBRARY "${CMAKE_Swift_CREATE_STATIC_LIBRARY}") unset(_swift_wrapper) - unset(_real_swiftc) endif () # ----------------------------------------------------------------------------- diff --git a/CMakePresets.json b/CMakePresets.json index e5fc6ff04ea1..d8982f0f074f 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -226,6 +226,10 @@ "type": "STRING", "value": "thread" }, + "USE_SYSTEM_MALLOC": { + "type": "BOOL", + "value": "ON" + }, "ENABLE_EXPERIMENTAL_FEATURES": { "type": "BOOL", "value": "OFF" diff --git a/Configurations/CommonBase.xcconfig b/Configurations/CommonBase.xcconfig index 456e13fe9c4e..93c38fc34db7 100644 --- a/Configurations/CommonBase.xcconfig +++ b/Configurations/CommonBase.xcconfig @@ -30,6 +30,7 @@ WK_ENABLE_SLOW_BUILD_VERIFICATION = $(WK_ENABLE_SLOW_BUILD_VERIFICATION_$(CONFIGURATION)); WK_ENABLE_SLOW_BUILD_VERIFICATION_Production = YES; +__ALLOW_EXCLUDED_USER_SCRIPT_SANDBOXING_PHASE_NAMES = YES; // Prefix Definitions // @@ -47,10 +48,15 @@ WK_GCC_OPTIMIZATION_LEVEL_SANITIZER_OVERRIDE_NO = $(WK_DEFAULT_GCC_OPTIMIZATION_ WK_GCC_OPTIMIZATION_LEVEL_SANITIZER_OVERRIDE_YES = $(WK_SANITIZER_GCC_OPTIMIZATION_LEVEL); WK_OS_UNFAIR_LOCK_INLINE_CFLAGS = $(WK_OS_UNFAIR_LOCK_INLINE_CFLAGS_$(USE_INTERNAL_SDK)); -WK_OS_UNFAIR_LOCK_INLINE_CFLAGS_YES = OS_UNFAIR_LOCK_INLINE=1 +WK_OS_UNFAIR_LOCK_INLINE_CFLAGS_YES = OS_UNFAIR_LOCK_INLINE=1; -WK_GCC_PREPROCESSOR_DEFINITIONS = $(WK_GCC_PREPROCESSOR_DEFINITIONS_$(USE_INTERNAL_SDK)); -WK_GCC_PREPROCESSOR_DEFINITIONS_YES = $(WK_OS_UNFAIR_LOCK_INLINE_CFLAGS) __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 +WK_ENGINEERING_BUILD = $(WK_ENGINEERING_BUILD_$(CONFIGURATION)); +WK_ENGINEERING_BUILD_Debug = 1; +WK_ENGINEERING_BUILD_Release = 1; +WK_ENGINEERING_BUILD_Production = 0; + +WK_GCC_PREPROCESSOR_DEFINITIONS = $(WK_GCC_PREPROCESSOR_DEFINITIONS_$(USE_INTERNAL_SDK)) ENGINEERING_BUILD=$(WK_ENGINEERING_BUILD); +WK_GCC_PREPROCESSOR_DEFINITIONS_YES = $(WK_OS_UNFAIR_LOCK_INLINE_CFLAGS) __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0; GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(WK_GCC_PREPROCESSOR_DEFINITIONS); WK_COMMON_OTHER_CFLAGS = $(WK_SANITIZER_OTHER_CFLAGS) $(WK_COMMON_OTHER_CFLAGS_PGO_$(WK_OR_$(WK_ENABLE_PGO_USE)_$(ENABLE_LLVM_PROFILE_GENERATION))); diff --git a/Configurations/Version.xcconfig b/Configurations/Version.xcconfig index be74af8f0599..206a058fde57 100644 --- a/Configurations/Version.xcconfig +++ b/Configurations/Version.xcconfig @@ -23,7 +23,7 @@ MAJOR_VERSION = 625; MINOR_VERSION = 1; -TINY_VERSION = 18; +TINY_VERSION = 19; MICRO_VERSION = 0; NANO_VERSION = 0; FULL_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(TINY_VERSION); diff --git a/Configurations/WebKitProjectPaths.xcconfig b/Configurations/WebKitProjectPaths.xcconfig index fd3c0f886bc6..cc9974de1603 100644 --- a/Configurations/WebKitProjectPaths.xcconfig +++ b/Configurations/WebKitProjectPaths.xcconfig @@ -80,6 +80,12 @@ UMBRELLA_FRAMEWORKS_DIR_OVERRIDE_YES = $(WK_OVERRIDE_FRAMEWORKS_DIR); WK_WEBKITADDITIONS_HEADERS_FOLDER_PATH = $(BUILT_PRODUCTS_DIR)$(WK_LIBRARY_HEADERS_FOLDER_PATH)/WebKitAdditions; WK_WEBKITADDITIONS_HEADERS_FOLDER_PATH[config=Production] = $(SDK_DIR)$(WK_LIBRARY_HEADERS_FOLDER_PATH)/WebKitAdditions; +WK_WEBKITADDITIONS_POSTPROCESS_SCRIPTS_INPUT = $(WK_WEBKITADDITIONS_POSTPROCESS_SCRIPTS_INPUT_$(USE_INTERNAL_SDK)_$(WK_IS_INSTALLHDRS)); +WK_WEBKITADDITIONS_POSTPROCESS_SCRIPTS_INPUT_YES_NO = $(WK_WEBKITADDITIONS_HEADERS_FOLDER_PATH)/Scripts/postprocess-framework-headers-definitions; + +WK_WEBKITADDITIONS_BRANCH_CONFIG_INPUT = $(WK_WEBKITADDITIONS_BRANCH_CONFIG_INPUT_$(USE_INTERNAL_SDK)_$(WK_IS_INSTALLHDRS)); +WK_WEBKITADDITIONS_BRANCH_CONFIG_INPUT_YES_NO = $(WK_WEBKITADDITIONS_HEADERS_FOLDER_PATH)/Scripts/branch_config.json; + // The root directory of the workspace / WebKit repo is determined by how many directories up "Source" or "Tools" is from the SRCROOT. WK_WORKSPACE_DIR = $(WK_WORKSPACE_DIR_1_$(SRCROOT:dir:standardizepath:file):standardizepath:default=$(WK_WORKSPACE_DIR_2_$(SRCROOT:dir:standardizepath:dir:standardizepath:file):standardizepath:default=$(WK_WORKSPACE_DIR_3_$(SRCROOT:dir:standardizepath:dir:standardizepath:dir:standardizepath:file):standardizepath:default=$(WK_WORKSPACE_DIR_4_$(SRCROOT:dir:standardizepath:dir:standardizepath:dir:standardizepath:dir:standardizepath:file):standardizepath:default=$(WK_WORKSPACE_DIR_5_$(SRCROOT:dir:standardizepath:dir:standardizepath:dir:standardizepath:dir:standardizepath:dir:standardizepath:file):standardizepath:default=$(WK_WORKSPACE_DIR_6_$(SRCROOT:dir:standardizepath:dir:standardizepath:dir:standardizepath:dir:standardizepath:dir:standardizepath:dir:standardizepath:file):standardizepath)))))); WK_WORKSPACE_DIR_1_Source = $(SRCROOT)/../..; diff --git a/JSTests/microbenchmarks/array-includes-string-8bit-long.js b/JSTests/microbenchmarks/array-includes-string-8bit-long.js new file mode 100644 index 000000000000..607856f3aab0 --- /dev/null +++ b/JSTests/microbenchmarks/array-includes-string-8bit-long.js @@ -0,0 +1,23 @@ +function makeString(len, ch) { + let s = ""; + for (let i = 0; i < len; ++i) + s += ch; + return s; +} + +function test(arr, key) { + return arr.includes(key); +} +noInline(test); + +let arr = []; +for (let i = 0; i < 64; ++i) + arr.push(String.fromCharCode(65 + (i % 26)) + makeString(63, "x")); + +let key = "@" + makeString(63, "x"); +let result = 0; +for (let i = 0; i < 5e4; ++i) + result += test(arr, key) ? 1 : 0; + +if (result !== 0) + throw new Error("bad result: " + result); diff --git a/JSTests/microbenchmarks/array-indexof-string-8bit-long.js b/JSTests/microbenchmarks/array-indexof-string-8bit-long.js new file mode 100644 index 000000000000..261bf357ff8b --- /dev/null +++ b/JSTests/microbenchmarks/array-indexof-string-8bit-long.js @@ -0,0 +1,23 @@ +function makeString(len, ch) { + let s = ""; + for (let i = 0; i < len; ++i) + s += ch; + return s; +} + +function test(arr, key) { + return arr.indexOf(key); +} +noInline(test); + +let arr = []; +for (let i = 0; i < 64; ++i) + arr.push(String.fromCharCode(65 + (i % 26)) + makeString(63, "x")); + +let key = "@" + makeString(63, "x"); +let result = 0; +for (let i = 0; i < 5e4; ++i) + result += test(arr, key); + +if (result !== -5e4) + throw new Error("bad result: " + result); diff --git a/JSTests/microbenchmarks/array-indexof-string-8bit-short.js b/JSTests/microbenchmarks/array-indexof-string-8bit-short.js new file mode 100644 index 000000000000..5c8645e2face --- /dev/null +++ b/JSTests/microbenchmarks/array-indexof-string-8bit-short.js @@ -0,0 +1,23 @@ +function makeString(len, ch) { + let s = ""; + for (let i = 0; i < len; ++i) + s += ch; + return s; +} + +function test(arr, key) { + return arr.indexOf(key); +} +noInline(test); + +let arr = []; +for (let i = 0; i < 64; ++i) + arr.push(String.fromCharCode(65 + (i % 26)) + makeString(3, "x")); + +let key = "@" + makeString(3, "x"); +let result = 0; +for (let i = 0; i < 5e4; ++i) + result += test(arr, key); + +if (result !== -5e4) + throw new Error("bad result: " + result); diff --git a/JSTests/microbenchmarks/await-object-literal.js b/JSTests/microbenchmarks/await-object-literal.js new file mode 100644 index 000000000000..2df4c0a9fb33 --- /dev/null +++ b/JSTests/microbenchmarks/await-object-literal.js @@ -0,0 +1,14 @@ +// Stresses isDefinitelyNonThenable() through `await object`, the dominant pattern +// in async functions returning plain objects. + +async function run() { + let acc = 0; + for (let i = 0; i < 1e6; i++) { + const o = await { a: i, b: i + 1, c: i + 2 }; + acc += o.a; + } + return acc; +} + +run(); +drainMicrotasks(); diff --git a/JSTests/microbenchmarks/date-now-elapsed.js b/JSTests/microbenchmarks/date-now-elapsed.js new file mode 100644 index 000000000000..a41f7db0bfd6 --- /dev/null +++ b/JSTests/microbenchmarks/date-now-elapsed.js @@ -0,0 +1,7 @@ +var sum = 0; +var start = Date.now(); +for (var i = 0; i < 1e6; ++i) { + var diff = Date.now() - start; + if (diff >= 0 && diff < 1e9) + sum += diff; +} diff --git a/JSTests/microbenchmarks/date-now.js b/JSTests/microbenchmarks/date-now.js new file mode 100644 index 000000000000..fa3fc55b30f8 --- /dev/null +++ b/JSTests/microbenchmarks/date-now.js @@ -0,0 +1,3 @@ +var sum = 0; +for (var i = 0; i < 1e6; ++i) + sum += Date.now(); diff --git a/JSTests/microbenchmarks/promise-all-non-thenable-object.js b/JSTests/microbenchmarks/promise-all-non-thenable-object.js new file mode 100644 index 000000000000..76fd7525b34c --- /dev/null +++ b/JSTests/microbenchmarks/promise-all-non-thenable-object.js @@ -0,0 +1,8 @@ +const array = []; +for (let i = 0; i < 12; i++) + array.push({ value: i }); + +for (var i = 0; i < 1e4; ++i) + Promise.all(array); + +drainMicrotasks(); diff --git a/JSTests/microbenchmarks/promise-all-non-thenable.js b/JSTests/microbenchmarks/promise-all-non-thenable.js new file mode 100644 index 000000000000..676d0c1c9719 --- /dev/null +++ b/JSTests/microbenchmarks/promise-all-non-thenable.js @@ -0,0 +1,8 @@ +const array = []; +for (let i = 0; i < 12; i++) + array.push(i); + +for (var i = 0; i < 1e4; ++i) + Promise.all(array); + +drainMicrotasks(); diff --git a/JSTests/microbenchmarks/promise-all-settled-non-thenable.js b/JSTests/microbenchmarks/promise-all-settled-non-thenable.js new file mode 100644 index 000000000000..75e6149a9bb9 --- /dev/null +++ b/JSTests/microbenchmarks/promise-all-settled-non-thenable.js @@ -0,0 +1,8 @@ +const array = []; +for (let i = 0; i < 12; i++) + array.push(i); + +for (var i = 0; i < 1e4; ++i) + Promise.allSettled(array); + +drainMicrotasks(); diff --git a/JSTests/microbenchmarks/promise-race-non-thenable.js b/JSTests/microbenchmarks/promise-race-non-thenable.js new file mode 100644 index 000000000000..d6e897262e3e --- /dev/null +++ b/JSTests/microbenchmarks/promise-race-non-thenable.js @@ -0,0 +1,8 @@ +const array = []; +for (let i = 0; i < 12; i++) + array.push(i); + +for (var i = 0; i < 1e4; ++i) + Promise.race(array); + +drainMicrotasks(); diff --git a/JSTests/microbenchmarks/promise-resolve-non-thenable-object.js b/JSTests/microbenchmarks/promise-resolve-non-thenable-object.js new file mode 100644 index 000000000000..f4a73065db34 --- /dev/null +++ b/JSTests/microbenchmarks/promise-resolve-non-thenable-object.js @@ -0,0 +1,2 @@ +for (var i = 0; i < 1e6; ++i) + Promise.resolve({ a: i, b: i + 1, c: i + 2 }); diff --git a/JSTests/microbenchmarks/promise-resolve-object-literal.js b/JSTests/microbenchmarks/promise-resolve-object-literal.js new file mode 100644 index 000000000000..3dc6210b1f74 --- /dev/null +++ b/JSTests/microbenchmarks/promise-resolve-object-literal.js @@ -0,0 +1,6 @@ +// Stresses isDefinitelyNonThenable() through Promise.resolve(object). Resolving a +// plain object literal must check whether it is a thenable, which walks the +// prototype chain unless cached on the Structure. + +for (var i = 0; i < 1e6; ++i) + Promise.resolve({ a: i, b: i + 1, c: i + 2 }); diff --git a/JSTests/microbenchmarks/promise-then-chain-object-literal.js b/JSTests/microbenchmarks/promise-then-chain-object-literal.js new file mode 100644 index 000000000000..327b90f7da4d --- /dev/null +++ b/JSTests/microbenchmarks/promise-then-chain-object-literal.js @@ -0,0 +1,8 @@ +// Stresses isDefinitelyNonThenable() through a `.then()` handler chain that returns +// plain object literals — every link must check whether the returned object is a +// thenable. + +let p = Promise.resolve({ a: 1, b: 2, c: 3 }); +for (let i = 0; i < 1e6; i++) + p = p.then((x) => ({ a: x.a + 1, b: x.b + 1, c: x.c + 1 })); +drainMicrotasks(); diff --git a/JSTests/microbenchmarks/regexp-match-digit-cached.js b/JSTests/microbenchmarks/regexp-match-digit-cached.js new file mode 100644 index 000000000000..076a0548aaf9 --- /dev/null +++ b/JSTests/microbenchmarks/regexp-match-digit-cached.js @@ -0,0 +1,14 @@ +// Hot-path microbenchmark for String.prototype.match with a cached primordial +// RegExp argument. The DFG StringMatch node is converted to RegExpMatchFast in +// fixup, guarded by a CheckStructure on the primordial RegExp structure. + +function match(string, regexp) +{ + return string.match(regexp); +} +noInline(match); + +var string = "abc1def2ghi3jkl4mno5"; +var regexp = /[0-9]/g; +for (var i = 0; i < 1e6; ++i) + match(string, regexp); diff --git a/JSTests/microbenchmarks/regexp-match-digit-literal.js b/JSTests/microbenchmarks/regexp-match-digit-literal.js new file mode 100644 index 000000000000..1e680abfc288 --- /dev/null +++ b/JSTests/microbenchmarks/regexp-match-digit-literal.js @@ -0,0 +1,13 @@ +// Hot-path microbenchmark for String.prototype.match with a RegExp literal +// allocated on every call. Stresses the primordial-RegExp fast path together +// with regex allocation. + +function match(string) +{ + return string.match(/[0-9]/g); +} +noInline(match); + +var string = "abc1def2ghi3jkl4mno5"; +for (var i = 0; i < 1e6; ++i) + match(string); diff --git a/JSTests/microbenchmarks/string-match-digit-short.js b/JSTests/microbenchmarks/string-match-digit-short.js new file mode 100644 index 000000000000..cda3e83451fe --- /dev/null +++ b/JSTests/microbenchmarks/string-match-digit-short.js @@ -0,0 +1,14 @@ +// Hot-path microbenchmark for String.prototype.match with a short literal +// string regexp source. This exercises the DFG StringMatch fast path for the +// common case where the regexp arg is a string and gets coerced via +// RegExp construction. + +function match(string, regexp) +{ + return string.match(regexp); +} +noInline(match); + +var string = "abc1def2ghi3jkl4mno5"; +for (var i = 0; i < 1e7; ++i) + match(string, "[0-9]"); diff --git a/JSTests/microbenchmarks/string-match-letter-short.js b/JSTests/microbenchmarks/string-match-letter-short.js new file mode 100644 index 000000000000..87d4eb1c4ab9 --- /dev/null +++ b/JSTests/microbenchmarks/string-match-letter-short.js @@ -0,0 +1,12 @@ +// Hot-path microbenchmark for String.prototype.match with a single-char +// literal pattern. Targets the simple non-global match fast path. + +function match(string, regexp) +{ + return string.match(regexp); +} +noInline(match); + +var string = "alpha bravo charlie delta echo foxtrot golf"; +for (var i = 0; i < 1e7; ++i) + match(string, "a"); diff --git a/JSTests/modules/import-defer-dynamic-evaluation.js b/JSTests/modules/import-defer-dynamic-evaluation.js new file mode 100644 index 000000000000..538319385f60 --- /dev/null +++ b/JSTests/modules/import-defer-dynamic-evaluation.js @@ -0,0 +1,22 @@ +//@ requireOptions("--useImportDefer=1") +import { shouldBe } from "./resources/assert.js"; + +globalThis.deferEvaluations = []; + +// A graph with no asynchronous transitive dependencies must not run any module +// body before the import.defer() promise resolves. +const ns = await import.defer("./import-defer/eval-tracker.js"); +shouldBe(JSON.stringify(globalThis.deferEvaluations), "[]"); + +// A symbol-keyed lookup must not trigger evaluation either. +shouldBe(ns[Symbol.toStringTag], "Deferred Module"); +shouldBe(JSON.stringify(globalThis.deferEvaluations), "[]"); + +// First non-symbol access evaluates the module synchronously. +shouldBe(ns.value, 42); +shouldBe(JSON.stringify(globalThis.deferEvaluations), JSON.stringify(["eval-tracker"])); + +// Subsequent import.defer() calls hand back the same namespace and never re-evaluate. +const ns2 = await import.defer("./import-defer/eval-tracker.js"); +shouldBe(ns2, ns); +shouldBe(JSON.stringify(globalThis.deferEvaluations), JSON.stringify(["eval-tracker"])); diff --git a/JSTests/modules/import-defer-dynamic-rejects.js b/JSTests/modules/import-defer-dynamic-rejects.js new file mode 100644 index 000000000000..0274f74a0b71 --- /dev/null +++ b/JSTests/modules/import-defer-dynamic-rejects.js @@ -0,0 +1,24 @@ +//@ requireOptions("--useImportDefer=1") +import { shouldBe, shouldThrow } from "./resources/assert.js"; + +// A TLA-bearing transitive dependency that rejects must reject the +// import.defer() promise (the deferred root never executes). +let rejected; +try { + await import.defer("./import-defer/cycle-a.js"); +} catch (error) { + rejected = error; +} +shouldBe(rejected.someError, "tla-reject"); + +// A deferred module that throws synchronously when accessed must NOT reject +// the import.defer() promise; the throw happens at access time. +const ns = await import.defer("./import-defer/throws.js"); +shouldBe(Object.prototype.toString.call(ns), "[object Deferred Module]"); +let thrown; +try { + ns.value; +} catch (error) { + thrown = error; +} +shouldBe(thrown.someError, "deferred-throw"); diff --git a/JSTests/modules/import-defer-dynamic-syntax.js b/JSTests/modules/import-defer-dynamic-syntax.js new file mode 100644 index 000000000000..e2223e3742a7 --- /dev/null +++ b/JSTests/modules/import-defer-dynamic-syntax.js @@ -0,0 +1,23 @@ +//@ requireOptions("--useImportDefer=1") +import { shouldBe, shouldThrow } from "./resources/assert.js"; + +// import.defer expects call arguments, mirroring import(). +shouldThrow(() => eval("import.defer"), "SyntaxError: Unexpected end of script"); +shouldThrow(() => eval("import.defer.foo"), "SyntaxError: Unexpected token '.'. import call expects one or two arguments."); +shouldThrow(() => eval("import.defer()"), "SyntaxError: Unexpected token ')'"); +shouldThrow(() => eval("new import.defer('./import-defer/dep.js')"), "SyntaxError: Cannot use new with import."); +shouldThrow(() => eval("import.deferred('foo')"), "SyntaxError: Unexpected identifier 'deferred'. \"import.\" can only be followed with meta or defer."); + +// Trailing commas and the second options argument are accepted, like import(). +shouldBe(typeof import.defer("./import-defer/dep.js",), "object"); +shouldBe(typeof import.defer("./import-defer/dep.js", { with: {} }), "object"); +shouldBe(typeof import.defer("./import-defer/dep.js", { with: {} },), "object"); + +// Specifier ToString abrupt completion rejects (instead of throwing synchronously). +let rejected; +try { + await import.defer({ toString() { throw new Error("specifier"); } }); +} catch (error) { + rejected = error; +} +shouldBe(rejected.message, "specifier"); diff --git a/JSTests/modules/import-defer-dynamic-tla.js b/JSTests/modules/import-defer-dynamic-tla.js new file mode 100644 index 000000000000..87a5bff60cda --- /dev/null +++ b/JSTests/modules/import-defer-dynamic-tla.js @@ -0,0 +1,13 @@ +//@ requireOptions("--useImportDefer=1") +import { shouldBe } from "./resources/assert.js"; + +// import.defer() of a graph with TLA must eagerly evaluate the TLA-bearing +// dependency (and its sync deps) before the promise resolves, but the deferred +// root and the rest of the synchronous chain stay unevaluated. +const ns = await import.defer("./import-defer/tla-parent.js"); +shouldBe(JSON.stringify(globalThis.deferTLAEvaluations), JSON.stringify(["tla-dep-of-tla", "tla-child"])); +shouldBe(Object.prototype.toString.call(ns), "[object Deferred Module]"); + +// Touching the namespace evaluates the rest synchronously. +shouldBe(ns.value, 1); +shouldBe(JSON.stringify(globalThis.deferTLAEvaluations), JSON.stringify(["tla-dep-of-tla", "tla-child", "sync-dep", "tla-parent"])); diff --git a/JSTests/modules/import-defer-dynamic.js b/JSTests/modules/import-defer-dynamic.js new file mode 100644 index 000000000000..7fc087ae8393 --- /dev/null +++ b/JSTests/modules/import-defer-dynamic.js @@ -0,0 +1,18 @@ +//@ requireOptions("--useImportDefer=1") +import { shouldBe } from "./resources/assert.js"; +import defer * as nsStatic from "./import-defer/dep.js"; + +const ns = await import.defer("./import-defer/dep.js"); + +// Dynamic and static defer must hand back the same deferred namespace identity. +shouldBe(ns, nsStatic); +shouldBe(Object.prototype.toString.call(ns), "[object Deferred Module]"); + +// Deferred namespaces hide "then" so the resolution algorithm doesn't unwrap them. +shouldBe(ns.then, undefined); +shouldBe(Reflect.has(ns, "then"), false); + +// Touching the namespace evaluates the module synchronously. +shouldBe(ns.value, 1); +// "then" stays hidden on the deferred namespace even after evaluation. +shouldBe(ns.then, undefined); diff --git a/JSTests/modules/indirect-export-error.js b/JSTests/modules/indirect-export-error.js index 41dbebd30726..2b919a99264b 100644 --- a/JSTests/modules/indirect-export-error.js +++ b/JSTests/modules/indirect-export-error.js @@ -14,4 +14,11 @@ Promise.all([ .then($vm.abort, function (error) { shouldBe(String(error), `SyntaxError: Indirectly exported binding name 'default' cannot be resolved by star export entries.`); }).catch($vm.abort), + // exportEntries iterates in source order (OrderedHashMap), so the reported + // name is always the first unresolvable export — not whichever the hash + // table happens to place first. + import('./indirect-export-error/indirect-export-source-order.js') + .then($vm.abort, function (error) { + shouldBe(String(error), `SyntaxError: Indirectly exported binding name 'aaa' is not found.`); + }).catch($vm.abort), ]).catch($vm.abort); diff --git a/JSTests/modules/indirect-export-error/indirect-export-source-order-2.js b/JSTests/modules/indirect-export-error/indirect-export-source-order-2.js new file mode 100644 index 000000000000..6986207ecba4 --- /dev/null +++ b/JSTests/modules/indirect-export-error/indirect-export-source-order-2.js @@ -0,0 +1 @@ +// Intentionally empty: none of the names re-exported by indirect-export-source-order.js exist here. diff --git a/JSTests/modules/indirect-export-error/indirect-export-source-order.js b/JSTests/modules/indirect-export-error/indirect-export-source-order.js new file mode 100644 index 000000000000..6d6204a301ce --- /dev/null +++ b/JSTests/modules/indirect-export-error/indirect-export-source-order.js @@ -0,0 +1 @@ +export { aaa, bbb, ccc, ddd, eee, fff, ggg, hhh } from "./indirect-export-source-order-2.js"; diff --git a/JSTests/stress/array-indexof-includes-string-word-compare.js b/JSTests/stress/array-indexof-includes-string-word-compare.js new file mode 100644 index 000000000000..b8c94421ee98 --- /dev/null +++ b/JSTests/stress/array-indexof-includes-string-word-compare.js @@ -0,0 +1,138 @@ +function shouldBe(actual, expected) +{ + if (actual !== expected) + throw new Error('bad value: ' + actual + ' expected ' + expected); +} + +function freshCopy(s) { + return (s + "!").slice(0, s.length); +} + +// Long 8-bit strings (length >= 8) so the word-at-a-time path runs. +(function () { + function indexOf(array, value) + { + return array.indexOf(value); + } + noInline(indexOf); + + function includes(array, value) + { + return array.includes(value); + } + noInline(includes); + + const N = 50; + const array = []; + for (let i = 0; i < N; ++i) + array.push(freshCopy(String.fromCharCode(65 + i) + "x".repeat(31))); + + for (let i = 0; i < testLoopCount; ++i) { + const targetIdx = i % N; + const target = freshCopy(String.fromCharCode(65 + targetIdx) + "x".repeat(31)); + shouldBe(indexOf(array, target), targetIdx); + shouldBe(includes(array, target), true); + const missing = freshCopy("@" + "x".repeat(31)); + shouldBe(indexOf(array, missing), -1); + shouldBe(includes(array, missing), false); + const tailMismatch = freshCopy(String.fromCharCode(65 + targetIdx) + "x".repeat(30) + "y"); + shouldBe(indexOf(array, tailMismatch), -1); + shouldBe(includes(array, tailMismatch), false); + } +}()); + +// Length not a multiple of 8: exercises the overlapping word tail. +(function () { + function indexOf(array, value) + { + return array.indexOf(value); + } + noInline(indexOf); + + const N = 32; + const array = []; + for (let i = 0; i < N; ++i) + array.push(freshCopy(String.fromCharCode(65 + i) + "y".repeat(12))); + + for (let i = 0; i < testLoopCount; ++i) { + const targetIdx = i % N; + const target = freshCopy(String.fromCharCode(65 + targetIdx) + "y".repeat(12)); + shouldBe(indexOf(array, target), targetIdx); + const headMismatch = freshCopy("@" + "y".repeat(12)); + shouldBe(indexOf(array, headMismatch), -1); + } +}()); + +// Short strings (length < 8) still go through the byte loop. +(function () { + function indexOf(array, value) + { + return array.indexOf(value); + } + noInline(indexOf); + + const N = 50; + const array = []; + for (let i = 0; i < N; ++i) + array.push(freshCopy("ab" + String.fromCharCode(65 + i))); + + for (let i = 0; i < testLoopCount; ++i) { + const targetIdx = i % N; + const target = freshCopy("ab" + String.fromCharCode(65 + targetIdx)); + shouldBe(indexOf(array, target), targetIdx); + shouldBe(indexOf(array, freshCopy("ab@")), -1); + } +}()); + +// 16-bit search element bails to the slow path; verify it still produces the right result. +(function () { + function indexOf(array, value) + { + return array.indexOf(value); + } + noInline(indexOf); + + function includes(array, value) + { + return array.includes(value); + } + noInline(includes); + + const N = 32; + const array = []; + for (let i = 0; i < N; ++i) + array.push(freshCopy(String.fromCharCode(0x3041 + i) + "あ".repeat(11))); + + for (let i = 0; i < testLoopCount; ++i) { + const targetIdx = i % N; + const target = freshCopy(String.fromCharCode(0x3041 + targetIdx) + "あ".repeat(11)); + shouldBe(indexOf(array, target), targetIdx); + shouldBe(includes(array, target), true); + const missing = freshCopy("ヿ" + "あ".repeat(11)); + shouldBe(indexOf(array, missing), -1); + shouldBe(includes(array, missing), false); + } +}()); + +// Mixed-width: 8-bit search vs 16-bit array elements that compare equal goes to the slow path. +(function () { + function indexOf(array, value) + { + return array.indexOf(value); + } + noInline(indexOf); + + const N = 32; + const array = []; + for (let i = 0; i < N; ++i) { + // Force 16-bit storage even though the contents are Latin-1. + const s = ("あ" + String.fromCharCode(65 + i) + "z".repeat(10)).slice(1); + array.push(s); + } + + for (let i = 0; i < testLoopCount; ++i) { + const targetIdx = i % N; + const target = freshCopy(String.fromCharCode(65 + targetIdx) + "z".repeat(10)); + shouldBe(indexOf(array, target), targetIdx); + } +}()); diff --git a/JSTests/stress/array-shift-intrinsic.js b/JSTests/stress/array-shift-intrinsic.js new file mode 100644 index 000000000000..88ffcb995484 --- /dev/null +++ b/JSTests/stress/array-shift-intrinsic.js @@ -0,0 +1,156 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("Bad value: " + actual + ", expected: " + expected); +} + +function shiftOnce(array) { + return array.shift(); +} +noInline(shiftOnce); + +function drain(array) { + var results = []; + while (array.length) + results.push(array.shift()); + return results; +} +noInline(drain); + +// Length-0: fast path returns undefined. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = []; + shouldBe(shiftOnce(array), undefined); + shouldBe(array.length, 0); + } +})(); + +// Length-1 Int32 fast path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = [42]; + shouldBe(shiftOnce(array), 42); + shouldBe(array.length, 0); + } +})(); + +// Length-1 Double fast path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = [3.5]; + shouldBe(shiftOnce(array), 3.5); + shouldBe(array.length, 0); + } +})(); + +// Length-1 Contiguous fast path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = ["only"]; + shouldBe(shiftOnce(array), "only"); + shouldBe(array.length, 0); + } +})(); + +// Multi-element Int32: drains via slow path (operationArrayShift). +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var results = drain([1, 2, 3, 4, 5]); + shouldBe(results.length, 5); + shouldBe(results[0], 1); + shouldBe(results[1], 2); + shouldBe(results[2], 3); + shouldBe(results[3], 4); + shouldBe(results[4], 5); + } +})(); + +// Multi-element Double: drains via slow path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var results = drain([1.5, 2.5, 3.5, 4.5]); + shouldBe(results.length, 4); + shouldBe(results[0], 1.5); + shouldBe(results[1], 2.5); + shouldBe(results[2], 3.5); + shouldBe(results[3], 4.5); + } +})(); + +// Multi-element Contiguous: drains via slow path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var results = drain(["a", "b", "c"]); + shouldBe(results.length, 3); + shouldBe(results[0], "a"); + shouldBe(results[1], "b"); + shouldBe(results[2], "c"); + } +})(); + +// Length-1 Int32 hole: storage[0] is empty, fast path must take slow case. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = [1]; + delete array[0]; + shouldBe(array.length, 1); + shouldBe(shiftOnce(array), undefined); + shouldBe(array.length, 0); + } +})(); + +// Length-1 Double hole: storage[0] is NaN-bit-pattern, fast path must take slow case. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = [1.5]; + delete array[0]; + shouldBe(array.length, 1); + shouldBe(shiftOnce(array), undefined); + shouldBe(array.length, 0); + } +})(); + +// Length-1 Double containing real NaN: fast path branchIfNaN takes slow case but result must be NaN. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = [NaN]; + var result = shiftOnce(array); + shouldBe(result !== result, true); + shouldBe(array.length, 0); + } +})(); + +// Repeated shift on the same array exercises arrayMode transitions and slow path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = [10, 20, 30]; + shouldBe(shiftOnce(array), 10); + shouldBe(shiftOnce(array), 20); + shouldBe(shiftOnce(array), 30); + shouldBe(shiftOnce(array), undefined); + shouldBe(array.length, 0); + } +})(); + +// With Array.prototype[0] set, a length-1 hole array must shift to the +// prototype value. The intrinsic's slow path (operationArrayShift) reads +// through the prototype chain via getIndex. +(function () { + function shiftIsolated(array) { + return array.shift(); + } + noInline(shiftIsolated); + + for (var i = 0; i < testLoopCount; ++i) + shiftIsolated([1]); + + Array.prototype[0] = "proto-zero"; + try { + var array = [42]; + delete array[0]; + shouldBe(shiftIsolated(array), "proto-zero"); + shouldBe(array.length, 0); + } finally { + delete Array.prototype[0]; + } +})(); diff --git a/JSTests/stress/array-sort-inline-ai-cell-butterfly-validation.js b/JSTests/stress/array-sort-inline-ai-cell-butterfly-validation.js new file mode 100644 index 000000000000..2ed32b2e1daf --- /dev/null +++ b/JSTests/stress/array-sort-inline-ai-cell-butterfly-validation.js @@ -0,0 +1,17 @@ +//@ requireOptions("--useConcurrentJIT=0", "--jitPolicyScale=0.1", "--validateAbstractInterpreterState=1", "--validateDFGClobberize=1") + +// FTL ArraySortCompact returns a JSCellButterfly (SpecCellOther), not a +// JSObject. The DFG abstract interpreter (and prediction propagation) used to +// claim SpecObjectOther for this node, which is a disjoint, wrong type proof. +// With --validateAbstractInterpreterState=1 the FTL probe traps deterministically. +// This test ensures the AI/prediction match the runtime cell type so no probe fires. + +function sortIt(a, cmp) { return a.sort(cmp); } +noInline(sortIt); + +let cmp = (x, y) => x.idx - y.idx; +let template = []; +for (let i = 0; i < 8; i++) template.push({ idx: i }); + +for (let i = 0; i < testLoopCount; i++) + sortIt(template.slice(), cmp); diff --git a/JSTests/stress/array-sort-inline-isnan-comparator-cps.js b/JSTests/stress/array-sort-inline-isnan-comparator-cps.js new file mode 100644 index 000000000000..c47107576eb7 --- /dev/null +++ b/JSTests/stress/array-sort-inline-isnan-comparator-cps.js @@ -0,0 +1,22 @@ +function opt(a1) { + let array = [0, 2, ({valueOf: -Infinity, 0: 0, done: a1})]; + function process(arg) { + function toDict(o) { + } + toDict((Array.prototype.sort.call(arg, (isNaN)))); + } + process(array); + try { + Object.defineProperty((class a2 extends ("outer " + ("inner " + (WebAssembly.CompileError.prototype))) { get ['5']() { class a3 { + constructor() { + if (new.target) { class a4 { + }; + } + } + }; + } }), 'next', {set: (parseInt((function([a5 = 0x80000000, a6 = (a4.at(a1))] = []) {})))}); + } catch (x) {} +} +try { opt(Infinity); } catch (y) {} +try { opt((new Map().entries())); } catch (y) {} +try { opt(Math.E); } catch (y) {} diff --git a/JSTests/stress/array-sort-inline-nested-in-comparator.js b/JSTests/stress/array-sort-inline-nested-in-comparator.js new file mode 100644 index 000000000000..790e6fb213a4 --- /dev/null +++ b/JSTests/stress/array-sort-inline-nested-in-comparator.js @@ -0,0 +1,42 @@ +//@ requireOptions("--useConcurrentJIT=0") +// +// Nested sort: the inlined comparator itself calls Array.prototype.sort, so the +// inner handleArraySort's private cross-block tmps must not alias the outer's. + +function makeIntArr(n) { + let a = []; + for (let i = 0; i < n; i++) + a.push((n - i) | 0); + return a; +} + +let neighbours = []; +for (let i = 0; i < 4096; i++) + neighbours.push(makeIntArr(3)); +let inner = makeIntArr(3); +for (let i = 0; i < 4096; i++) + neighbours.push(makeIntArr(3)); + +function innerCmp(a, b) { return 0; } + +function outerCmp(a, b) { + (a instanceof Object); // forces a checkpoint in outerCmp. + inner.sort(innerCmp); + return false; +} + +function test(arr) { return arr.sort(outerCmp); } +noInline(test); + +for (let i = 0; i < testLoopCount; i++) + test(makeIntArr(5)); + +for (let i = 0; i < neighbours.length; i++) { + if (neighbours[i].length !== 3) + throw new Error("neighbour " + i + " corrupted: length = " + neighbours[i].length); +} +gc(); + +let result = test(makeIntArr(5)); +if (result.length !== 5) + throw new Error("outer result corrupted: " + JSON.stringify(result)); diff --git a/JSTests/stress/array-unshift-intrinsic-ftl.js b/JSTests/stress/array-unshift-intrinsic-ftl.js new file mode 100644 index 000000000000..f91b42126ab6 --- /dev/null +++ b/JSTests/stress/array-unshift-intrinsic-ftl.js @@ -0,0 +1,123 @@ +//@ runFTLNoCJIT + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("Bad value: " + actual + ", expected: " + expected); +} + +function unshiftOnce(array, v) { + return array.unshift(v); +} +noInline(unshiftOnce); + +// Force-tier coverage of compileArrayUnshift for Int32, Double, and Contiguous, +// including the inline length-1 shift and the slow-path fallbacks. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var contig = ["a"]; + shouldBe(unshiftOnce(contig, "b"), 2); + shouldBe(contig[0], "b"); + shouldBe(contig[1], "a"); + + var ints = [42]; + shouldBe(unshiftOnce(ints, 7), 2); + shouldBe(ints[0], 7); + shouldBe(ints[1], 42); + + var doubles = [1.5]; + shouldBe(unshiftOnce(doubles, 2.5), 2); + shouldBe(doubles[0], 2.5); + shouldBe(doubles[1], 1.5); + + var emptyContig = []; + shouldBe(unshiftOnce(emptyContig, "x"), 1); + shouldBe(emptyContig[0], "x"); + + // Length >= 2: slow path under FTL. + var big = ["a", "b", "c"]; + shouldBe(unshiftOnce(big, "z"), 4); + shouldBe(big[0], "z"); + shouldBe(big[3], "c"); + + // Double hole: slow path under FTL. + var holed = [1.5]; + delete holed[0]; + shouldBe(unshiftOnce(holed, 9.5), 2); + shouldBe(holed[0], 9.5); + } +})(); + +// Zero-arg unshift compiled under FTL must lower to a length read. +(function () { + function unshiftNone(a) { return a.unshift(); } + noInline(unshiftNone); + for (var i = 0; i < testLoopCount; ++i) { + var array = ["a", "b", "c"]; + shouldBe(unshiftNone(array), 3); + shouldBe(array.length, 3); + } +})(); + +// FTL Double NaN speculation: warm up to FTL, then pass NaN once. The +// DoubleRepRealUse speculation in FTL must OSR exit (FTL_TYPE_CHECK on +// doubleNotEqualOrUnordered) and the slow path must produce a valid array. +(function () { + function unshiftDouble(a, v) { return a.unshift(v); } + noInline(unshiftDouble); + for (var i = 0; i < testLoopCount; ++i) { + var array = [1.5]; + shouldBe(unshiftDouble(array, 2.5), 2); + } + + var array = [1.5]; + var r = unshiftDouble(array, NaN); + shouldBe(r, 2); + shouldBe(array.length, 2); + shouldBe(Number.isNaN(array[0]), true); + shouldBe(array[1], 1.5); +})(); + +// Multi-element unshift compiled under FTL: write all elements into the scratch +// buffer and call the multi-element operation. +(function () { + function unshiftThree(a, x, y, z) { return a.unshift(x, y, z); } + noInline(unshiftThree); + for (var i = 0; i < testLoopCount; ++i) { + var contig = ["x", "y"]; + shouldBe(unshiftThree(contig, "a", "b", "c"), 5); + shouldBe(contig[0], "a"); + shouldBe(contig[2], "c"); + shouldBe(contig[3], "x"); + + var ints = [10]; + shouldBe(unshiftThree(ints, 1, 2, 3), 4); + shouldBe(ints[0], 1); + shouldBe(ints[2], 3); + shouldBe(ints[3], 10); + + var doubles = [10.5]; + shouldBe(unshiftThree(doubles, 1.5, 2.5, 3.5), 4); + shouldBe(doubles[0], 1.5); + shouldBe(doubles[2], 3.5); + shouldBe(doubles[3], 10.5); + } +})(); + +// Multi-element unshift NaN speculation under FTL. +(function () { + function unshiftThree(a, x, y, z) { return a.unshift(x, y, z); } + noInline(unshiftThree); + for (var i = 0; i < testLoopCount; ++i) { + var array = [10.5]; + shouldBe(unshiftThree(array, 1.5, 2.5, 3.5), 4); + } + + var array = [10.5]; + var r = unshiftThree(array, 1.5, NaN, 3.5); + shouldBe(r, 4); + shouldBe(array.length, 4); + shouldBe(array[0], 1.5); + shouldBe(Number.isNaN(array[1]), true); + shouldBe(array[2], 3.5); + shouldBe(array[3], 10.5); +})(); diff --git a/JSTests/stress/array-unshift-intrinsic.js b/JSTests/stress/array-unshift-intrinsic.js new file mode 100644 index 000000000000..e29286024834 --- /dev/null +++ b/JSTests/stress/array-unshift-intrinsic.js @@ -0,0 +1,418 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("Bad value: " + actual + ", expected: " + expected); +} + +function unshiftOnce(array, v) { + return array.unshift(v); +} +noInline(unshiftOnce); + +function unshiftMany(array, a, b, c) { + return array.unshift(a, b, c); +} +noInline(unshiftMany); + +// Length-0 Contiguous fast path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = ["seed"]; + array.length = 0; + shouldBe(unshiftOnce(array, "x"), 1); + shouldBe(array.length, 1); + shouldBe(array[0], "x"); + } +})(); + +// Length-1 Contiguous fast path: existing element shifts to [1]. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = ["existing"]; + shouldBe(unshiftOnce(array, "front"), 2); + shouldBe(array.length, 2); + shouldBe(array[0], "front"); + shouldBe(array[1], "existing"); + } +})(); + +// Length-0 Int32 fast path. +(function () { + function unshiftInt(a, v) { return a.unshift(v); } + noInline(unshiftInt); + for (var i = 0; i < testLoopCount; ++i) { + var array = [42]; + array.length = 0; + shouldBe(unshiftInt(array, 7), 1); + shouldBe(array.length, 1); + shouldBe(array[0], 7); + } +})(); + +// Length-1 Int32 fast path. +(function () { + function unshiftInt(a, v) { return a.unshift(v); } + noInline(unshiftInt); + for (var i = 0; i < testLoopCount; ++i) { + var array = [99]; + shouldBe(unshiftInt(array, 7), 2); + shouldBe(array.length, 2); + shouldBe(array[0], 7); + shouldBe(array[1], 99); + } +})(); + +// Length-0 Double fast path. +(function () { + function unshiftDouble(a, v) { return a.unshift(v); } + noInline(unshiftDouble); + for (var i = 0; i < testLoopCount; ++i) { + var array = [1.5]; + array.length = 0; + shouldBe(unshiftDouble(array, 2.5), 1); + shouldBe(array.length, 1); + shouldBe(array[0], 2.5); + } +})(); + +// Length-1 Double fast path. +(function () { + function unshiftDouble(a, v) { return a.unshift(v); } + noInline(unshiftDouble); + for (var i = 0; i < testLoopCount; ++i) { + var array = [1.5]; + shouldBe(unshiftDouble(array, 2.5), 2); + shouldBe(array.length, 2); + shouldBe(array[0], 2.5); + shouldBe(array[1], 1.5); + } +})(); + +// Length-1 Double hole (NaN-bit-pattern at [0]): fast path branchIfNaN takes slow case. +(function () { + function unshiftDouble(a, v) { return a.unshift(v); } + noInline(unshiftDouble); + for (var i = 0; i < testLoopCount; ++i) { + var array = [1.5]; + delete array[0]; + shouldBe(array.length, 1); + shouldBe(unshiftDouble(array, 2.5), 2); + shouldBe(array.length, 2); + shouldBe(array[0], 2.5); + } +})(); + +// NaN value passed after warmup: DoubleRepRealUse speculation must OSR exit, and the +// slow path must produce a valid 2-element array. Run enough iterations to warm up +// the JIT, then pass NaN once. +(function () { + function unshiftDouble(a, v) { return a.unshift(v); } + noInline(unshiftDouble); + for (var i = 0; i < testLoopCount; ++i) { + var array = [1.5]; + shouldBe(unshiftDouble(array, 2.5), 2); + } + + var array = [1.5]; + var r = unshiftDouble(array, NaN); + shouldBe(r, 2); + shouldBe(array.length, 2); + shouldBe(Number.isNaN(array[0]), true); + shouldBe(array[1], 1.5); +})(); + +// NaN value for a length-0 Double array after warmup. +(function () { + function unshiftDouble(a, v) { return a.unshift(v); } + noInline(unshiftDouble); + for (var i = 0; i < testLoopCount; ++i) { + var array = [2.5]; + array.length = 0; + shouldBe(unshiftDouble(array, 3.5), 1); + } + + var array = [2.5]; + array.length = 0; + var r = unshiftDouble(array, NaN); + shouldBe(r, 1); + shouldBe(array.length, 1); + shouldBe(Number.isNaN(array[0]), true); +})(); + +// Length-0 Double then unshift: result must be spec-correct regardless of +// whether the inline fast path or the slow path is taken. +(function () { + function unshiftDouble(a, v) { return a.unshift(v); } + noInline(unshiftDouble); + for (var i = 0; i < testLoopCount; ++i) { + var array = [1.5]; + array.length = 0; + var seenLength = unshiftDouble(array, 3.5); + shouldBe(seenLength, 1); + shouldBe(array.length, 1); + shouldBe(array[0], 3.5); + } +})(); + +// Length >= 2: slow path via operationArrayUnshift. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = ["a", "b", "c"]; + shouldBe(unshiftOnce(array, "z"), 4); + shouldBe(array.length, 4); + shouldBe(array[0], "z"); + shouldBe(array[1], "a"); + shouldBe(array[2], "b"); + shouldBe(array[3], "c"); + } +})(); + +// Multi-arg unshift (3 args): the intrinsic now handles this via the multi-element +// scratch-buffer path. Verify the result is spec-correct. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = ["a"]; + shouldBe(unshiftMany(array, 1, 2, 3), 4); + shouldBe(array.length, 4); + shouldBe(array[0], 1); + shouldBe(array[1], 2); + shouldBe(array[2], 3); + shouldBe(array[3], "a"); + } +})(); + +// Two-arg unshift on Int32 array. +(function () { + function unshiftTwo(a, x, y) { return a.unshift(x, y); } + noInline(unshiftTwo); + for (var i = 0; i < testLoopCount; ++i) { + var array = [10]; + shouldBe(unshiftTwo(array, 1, 2), 3); + shouldBe(array.length, 3); + shouldBe(array[0], 1); + shouldBe(array[1], 2); + shouldBe(array[2], 10); + } +})(); + +// Two-arg unshift on Double array (exercises operationArrayUnshiftDoubleMultiple). +(function () { + function unshiftTwo(a, x, y) { return a.unshift(x, y); } + noInline(unshiftTwo); + for (var i = 0; i < testLoopCount; ++i) { + var array = [10.5]; + shouldBe(unshiftTwo(array, 1.5, 2.5), 3); + shouldBe(array.length, 3); + shouldBe(array[0], 1.5); + shouldBe(array[1], 2.5); + shouldBe(array[2], 10.5); + } +})(); + +// Multi-arg unshift on a length-0 array (no memmove needed; pure write at front). +(function () { + function unshiftThree(a, x, y, z) { return a.unshift(x, y, z); } + noInline(unshiftThree); + for (var i = 0; i < testLoopCount; ++i) { + var array = []; + shouldBe(unshiftThree(array, 1, 2, 3), 3); + shouldBe(array.length, 3); + shouldBe(array[0], 1); + shouldBe(array[1], 2); + shouldBe(array[2], 3); + } +})(); + +// Multi-arg unshift on a Contiguous array with multiple existing elements +// (exercises memmove of elementCount slots). +(function () { + function unshiftFour(a, p, q, r, s) { return a.unshift(p, q, r, s); } + noInline(unshiftFour); + for (var i = 0; i < testLoopCount; ++i) { + var array = ["x", "y", "z"]; + shouldBe(unshiftFour(array, "a", "b", "c", "d"), 7); + shouldBe(array.length, 7); + shouldBe(array[0], "a"); + shouldBe(array[1], "b"); + shouldBe(array[2], "c"); + shouldBe(array[3], "d"); + shouldBe(array[4], "x"); + shouldBe(array[5], "y"); + shouldBe(array[6], "z"); + } +})(); + +// Multi-arg unshift NaN speculation: passing a NaN in any slot must OSR exit +// (DoubleRepRealUse on each element). After warmup, feed a NaN and verify the +// slow path still produces a valid array. +(function () { + function unshiftThree(a, x, y, z) { return a.unshift(x, y, z); } + noInline(unshiftThree); + for (var i = 0; i < testLoopCount; ++i) { + var array = [10.5]; + shouldBe(unshiftThree(array, 1.5, 2.5, 3.5), 4); + } + + var array = [10.5]; + var r = unshiftThree(array, 1.5, NaN, 3.5); + shouldBe(r, 4); + shouldBe(array.length, 4); + shouldBe(array[0], 1.5); + shouldBe(Number.isNaN(array[1]), true); + shouldBe(array[2], 3.5); + shouldBe(array[3], 10.5); +})(); + +// Multi-arg unshift on Int32 array with non-int (should refine arrayMode to +// Double or Contiguous depending on prediction). +(function () { + function unshiftTwo(a, x, y) { return a.unshift(x, y); } + noInline(unshiftTwo); + // Warm up with all int values. + for (var i = 0; i < testLoopCount; ++i) { + var array = [3]; + shouldBe(unshiftTwo(array, 1, 2), 3); + } + // Then pass an object: array gets promoted (or fast path bails) and the + // operation slow path handles it. + var array = [3]; + var o = { toString() { return "obj"; } }; + var r = unshiftTwo(array, "a", o); + shouldBe(r, 3); + shouldBe(array[0], "a"); + shouldBe(array[1], o); + shouldBe(array[2], 3); +})(); + +// Many-element unshift (exercise scratch buffer with an interesting size). +(function () { + function unshift10(a, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { + return a.unshift(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); + } + noInline(unshift10); + for (var i = 0; i < testLoopCount; ++i) { + var array = [100]; + shouldBe(unshift10(array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 11); + shouldBe(array.length, 11); + for (var k = 0; k < 10; ++k) + shouldBe(array[k], k); + shouldBe(array[10], 100); + } +})(); + +// Zero-arg unshift: the intrinsic inlines this as a length read. +(function () { + function unshiftNone(a) { return a.unshift(); } + noInline(unshiftNone); + for (var i = 0; i < testLoopCount; ++i) { + var array = ["a", "b", "c"]; + shouldBe(unshiftNone(array), 3); + shouldBe(array.length, 3); + shouldBe(array[0], "a"); + shouldBe(array[2], "c"); + + var empty = []; + shouldBe(unshiftNone(empty), 0); + shouldBe(empty.length, 0); + } +})(); + +// Length-1 hole: storage[0] is empty, fast path must take slow case. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = ["filler"]; + delete array[0]; + shouldBe(array.length, 1); + shouldBe(unshiftOnce(array, "new-front"), 2); + shouldBe(array.length, 2); + shouldBe(array[0], "new-front"); + shouldBe(array[1], undefined); + } +})(); + +// Repeated unshifts grow the array beyond the inline length-1 path. +(function () { + for (var i = 0; i < testLoopCount; ++i) { + var array = []; + unshiftOnce(array, "a"); + unshiftOnce(array, "b"); + unshiftOnce(array, "c"); + unshiftOnce(array, "d"); + shouldBe(array.length, 4); + shouldBe(array[0], "d"); + shouldBe(array[1], "c"); + shouldBe(array[2], "b"); + shouldBe(array[3], "a"); + } +})(); + +// ArrayStorage indexing: the intrinsic bails to the native function and the +// result must still match spec. We force ArrayStorage by writing a sparse index. +(function () { + function unshiftStorage(a, v) { return a.unshift(v); } + noInline(unshiftStorage); + var template = []; + template[100000] = "sparse"; + template.length = 3; + for (var i = 0; i < testLoopCount; ++i) { + var array = template.slice(); + // Force ArrayStorage on this instance too. + array[100000] = "sparse"; + array.length = 3; + shouldBe(unshiftStorage(array, "front"), 4); + shouldBe(array.length, 4); + shouldBe(array[0], "front"); + } +})(); + +// Length-1 with Array.prototype[1] setter installed BEFORE warmup: the intrinsic +// can never inline (prototype chain isn't sane at compile time), and the slow +// path is spec-compliant: it does [[Set]] which walks the prototype chain and +// invokes the setter. The setter doesn't store, so array[1] is undefined. +(function () { + function unshiftIsolated(array, v) { + return array.unshift(v); + } + noInline(unshiftIsolated); + + var setterCalls = 0; + Array.prototype.__defineSetter__("1", function() { setterCalls++; }); + try { + for (var i = 0; i < testLoopCount; ++i) { + var array = ["only"]; + unshiftIsolated(array, "front"); + shouldBe(array.length, 2); + shouldBe(array[0], "front"); + shouldBe(array[1], undefined); + } + shouldBe(setterCalls, testLoopCount); + } finally { + delete Array.prototype[1]; + } +})(); + +// Same scenario but install the setter AFTER warmup. The inline fast path is +// JIT'd against a sane prototype chain. Installing the setter must invalidate +// the inline code; the subsequent call goes through the slow path which calls +// the setter (matching the pre-warmup case). +(function () { + function unshiftIsolated(array, v) { + return array.unshift(v); + } + noInline(unshiftIsolated); + + for (var i = 0; i < testLoopCount; ++i) + unshiftIsolated(["a"], "x"); + + var setterCalls = 0; + Array.prototype.__defineSetter__("1", function() { setterCalls++; }); + try { + var array = ["only"]; + unshiftIsolated(array, "front"); + shouldBe(array.length, 2); + shouldBe(array[0], "front"); + shouldBe(array[1], undefined); + shouldBe(setterCalls, 1); + } finally { + delete Array.prototype[1]; + } +})(); diff --git a/JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-argument.js b/JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-argument.js index 9cb0309931fd..7068d186a82f 100644 --- a/JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-argument.js +++ b/JSTests/stress/asynciterator-prototype-symbol-async-dispose-return-argument.js @@ -5,11 +5,10 @@ function shouldBe(a, b) { throw new Error(`Expected ${b} but got ${a}`); } -// %AsyncIteratorPrototype%[@@asyncDispose] step 6.a: -// Let result be Completion(Call(return.[[Value]], O, « undefined »)). -// The return method must be called with exactly one argument (undefined), -// matching for-await-of abrupt completion semantics. The sync -// %IteratorPrototype%[@@dispose] calls return with no arguments (« »). +// %AsyncIteratorPrototype%[@@asyncDispose] step 6.a (per tc39/proposal-explicit-resource-management#273): +// Let result be Completion(Call(return.[[Value]], O)). +// The return method must be called with no arguments, matching the sync +// %IteratorPrototype%[@@dispose], which also calls return with no arguments (« »). async function* ag() {} const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(ag()))); @@ -24,11 +23,11 @@ const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(Objec }; iter[Symbol.asyncDispose](); drainMicrotasks(); - shouldBe(argsLength, 1); + shouldBe(argsLength, 0); shouldBe(arg0, undefined); } -// Sync @@dispose should still call return with no arguments +// Sync @@dispose should also call return with no arguments { const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); let argsLength; @@ -51,5 +50,28 @@ const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(Objec }; iter[Symbol.asyncDispose](); drainMicrotasks(); - shouldBe(argsLength, 1); + shouldBe(argsLength, 0); +} + +// Async generator's own return is also called with no arguments via @@asyncDispose +{ + let argsLength; + async function* gen() { + try { + yield 1; + } finally { + // for-await-of abrupt completion would pass undefined here, but + // @@asyncDispose passes nothing, so the rest binding is empty. + } + } + const it = gen(); + const origReturn = AsyncIteratorPrototype.return; + // Override return on the instance to observe the argument count. + it.return = function(...args) { + argsLength = args.length; + return Promise.resolve({ value: undefined, done: true }); + }; + it[Symbol.asyncDispose](); + drainMicrotasks(); + shouldBe(argsLength, 0); } diff --git a/JSTests/stress/date-now-jit.js b/JSTests/stress/date-now-jit.js new file mode 100644 index 000000000000..bcdfd4d6094e --- /dev/null +++ b/JSTests/stress/date-now-jit.js @@ -0,0 +1,41 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual); +} + +// Date.now() must return a finite, non-negative integer through all JIT tiers. +function basic() { + return Date.now(); +} +noInline(basic); + +for (var i = 0; i < testLoopCount; ++i) { + var t = basic(); + shouldBe(typeof t, 'number'); + shouldBe(Number.isFinite(t), true); + shouldBe(Number.isInteger(t), true); + shouldBe(t >= 0, true); +} + +// Two Date.now() calls inside the same hot function must not be CSE'd into +// one, and the call inside the loop must not be LICM-hoisted out. If either +// happened, the loop below would never observe the clock advancing and the +// spin guard would fire. +function spinUntilAdvance() { + var start = Date.now(); + var spin = 0; + var t; + do { + t = Date.now(); + if (++spin > 1e8) + throw new Error('Date.now() did not advance after ' + spin + ' iterations; likely CSE/LICM bug'); + } while (t === start); + return t - start; +} +noInline(spinUntilAdvance); + +for (var i = 0; i < 200; ++i) { + var diff = spinUntilAdvance(); + if (diff <= 0) + throw new Error('Date.now() went backwards: diff=' + diff); +} diff --git a/JSTests/stress/dfg-perform-promise-then-one-handler-exit-ok.js b/JSTests/stress/dfg-perform-promise-then-one-handler-exit-ok.js new file mode 100644 index 000000000000..cc363ee7a4e9 --- /dev/null +++ b/JSTests/stress/dfg-perform-promise-then-one-handler-exit-ok.js @@ -0,0 +1,16 @@ +function opt(a1, a2) { + try { + } catch (x) { + }; + function a3(a, i) { + }; + with ((Promise.resolve(-0).then(a3))) { + byteLength = (({flags: a5, source: a6}) => (({valueOf: a7, throw: a8}) => (new Proxy(Infinity, ((async () => await 9.431092e-317)))))) + }; +} +for (let i = 0; i < testLoopCount; i++) { + try { + opt((Float32Array.prototype.BYTES_PER_ELEMENT), 2.3023e-320); + } catch (e) { + } +} diff --git a/JSTests/stress/dfg-promise-resolve-fulfilled-object.js b/JSTests/stress/dfg-promise-resolve-fulfilled-object.js new file mode 100644 index 000000000000..d1b125342446 --- /dev/null +++ b/JSTests/stress/dfg-promise-resolve-fulfilled-object.js @@ -0,0 +1,117 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected ' + expected + ')'); +} + +// Each scenario uses its own noInline helper so the PromiseResolve call site stays +// monomorphic and the intended ConstantFoldingPhase branch is actually exercised. + +// Branch 3: plain non-thenable object with a single watched structure -> folds to +// NewResolvedPromise(isResolvedValueKnownNonThenable), inline-allocated fulfilled. +function resolveObject(o) { + return Promise.resolve(o); +} +noInline(resolveObject); + +// Branch 1: non-object argument -> trivially non-thenable. +function resolveValue(v) { + return Promise.resolve(v); +} +noInline(resolveValue); + +// `then` present -> tryEnsureAbsence fails, no fold, object must be adopted. +function resolveThenable(o) { + return Promise.resolve(o); +} +noInline(resolveThenable); + +// Non-default constructor -> not folded, goes through the species path. +class MyPromise extends Promise { } +function resolveSubclass(o) { + return Promise.resolve.call(MyPromise, o); +} +noInline(resolveSubclass); + +// Dedicated monomorphic site for the watchpoint-invalidation scenario. +function Proto() { } +function resolveProto(o) { + return Promise.resolve(o); +} +noInline(resolveProto); + +async function main() { + // 1. Plain object: fulfilled with the object itself, distinct promise cell. + for (let i = 0; i < testLoopCount; ++i) { + let o = { a: i, b: i + 1 }; + let p = resolveObject(o); + shouldBe(p instanceof Promise, true); + shouldBe(p !== o, true); + shouldBe(await p, o); + } + + // 2. .then() handler receives the object; chaining and microtask ordering. + for (let i = 0; i < testLoopCount; ++i) { + let o = { x: i }; + let order = []; + let q = resolveObject(o).then(v => { order.push("then"); return v.x; }); + order.push("sync"); + shouldBe(await q, i); + shouldBe(order.join(","), "sync,then"); + } + + // 3. Branch 1: non-object values are non-thenable. + for (let i = 0; i < testLoopCount; ++i) { + shouldBe(await resolveValue(i), i); + shouldBe(await resolveValue(undefined), undefined); + shouldBe(await resolveValue("s" + (i & 7)), "s" + (i & 7)); + shouldBe(await resolveValue(null), null); + shouldBe(await resolveValue(i & 1 ? true : false), !!(i & 1)); + } + + // 4. GC stress: the inline-allocated promise must keep its slot value alive. + { + let promises = []; + let objects = []; + for (let i = 0; i < testLoopCount; ++i) { + let o = { g: i }; + objects.push(o); + promises.push(resolveObject(o)); + } + gc(); + for (let i = 0; i < promises.length; ++i) { + shouldBe(promises[i] !== objects[i], true); + shouldBe(await promises[i], objects[i]); + } + } + + // 5. Subclass constructor: not folded, still correct, produces a MyPromise. + for (let i = 0; i < testLoopCount; ++i) { + let o = { s: i }; + let p = resolveSubclass(o); + shouldBe(p instanceof MyPromise, true); + shouldBe(await p, o); + } + + // 6. `then` as an own property: object IS thenable, must be adopted (no fold). + for (let i = 0; i < testLoopCount; ++i) { + let adopted = false; + let o = { then(resolve) { adopted = true; resolve("own-then-" + (i & 15)); } }; + shouldBe(await resolveThenable(o), "own-then-" + (i & 15)); + shouldBe(adopted, true); + } + + // 7. Watchpoint invalidation: after tiering up on a non-thenable structure, + // adding a callable `then` to the prototype must invalidate the fast path + // so later calls adopt the now-thenable object instead of fulfilling with it. + for (let i = 0; i < testLoopCount; ++i) { + let o = new Proto(); + shouldBe(await resolveProto(o), o); + } + Proto.prototype.then = function (resolve) { resolve("via-proto-then"); }; + for (let i = 0; i < testLoopCount; ++i) { + let o = new Proto(); + shouldBe(await resolveProto(o), "via-proto-then"); + } +} + +main().catch($vm.abort); diff --git a/JSTests/stress/dynamic-import-inline-microtask-result-promise.js b/JSTests/stress/dynamic-import-inline-microtask-result-promise.js new file mode 100644 index 000000000000..b12dbca9f899 --- /dev/null +++ b/JSTests/stress/dynamic-import-inline-microtask-result-promise.js @@ -0,0 +1,92 @@ +// Regression test for performPromiseThenWithInternalMicrotask taking the +// inline-reaction fast path when a result JSPromise* is supplied. The result +// promise is stashed in JSPromise's payloadCell and must be recovered in +// settleInlineInternalMicrotask (and spillInlineReaction) so the result +// promise observed by JS resolves/rejects with the right value. +// +// The user-visible path is JSModuleLoader::loadModule wiring up +// ModuleLoadLinkEvaluateSettled — i.e. every dynamic import() call. + +var abort = $vm.abort; + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("expected " + String(expected) + ", got " + String(actual)); +} + +(async function () { + { + const m = await import('./import-tests/cocoa.js'); + shouldBe(m.hello(), 42); + shouldBe(typeof m.Cocoa, 'function'); + } + + // Re-import: a fresh resultPromise is allocated and routed through the + // inline path on every call, even when the underlying module is cached. + { + const a = await import('./import-tests/cocoa.js'); + const b = await import('./import-tests/cocoa.js'); + const c = await import('./import-tests/cocoa.js'); + shouldBe(a, b); + shouldBe(b, c); + } + + // Many concurrent imports of the same module: each gets its own pending + // intermediate promise + inline reaction. If the inline payloadCell were + // aliased or overwritten across imports, some awaits would see undefined + // or the wrong namespace. + { + const promises = []; + for (let i = 0; i < 64; ++i) + promises.push(import('./import-tests/cocoa.js')); + const results = await Promise.all(promises); + for (const r of results) + shouldBe(r.hello(), 42); + } + + // Concurrent imports of distinct modules — the per-import resultPromise + // stashed in payloadCell must not leak across imports. + { + const [cocoa, should] = await Promise.all([ + import('./import-tests/cocoa.js'), + import('./import-tests/should.js'), + ]); + shouldBe(cocoa.hello(), 42); + shouldBe(typeof should.shouldBe, 'function'); + } + + // Nested dynamic import (import() invoked from inside an imported module) + // — exercises the inline path on a different referrer. + { + const multiple = await import('./import-tests/multiple.js'); + const inner = await multiple.result(); + shouldBe(typeof inner, 'object'); + } + + // Failure path: the resultPromise must reject with the load error rather + // than resolve with undefined. + { + let err = null; + try { + await import('./this-module-does-not-exist.js'); + } catch (e) { + err = e; + } + if (err === null) + throw new Error('missing module did not reject'); + } + + // Interleave: kick off a failing import and a successful import together; + // both resultPromises sit in their own payloadCell slot and must settle + // independently with the right outcome. + { + const ok = import('./import-tests/cocoa.js'); + const bad = import('./this-module-does-not-exist.js').then( + () => { throw new Error('bad import resolved'); }, + e => 'rejected' + ); + const [okValue, badValue] = await Promise.all([ok, bad]); + shouldBe(okValue.hello(), 42); + shouldBe(badValue, 'rejected'); + } +}()).then(() => {}, abort); diff --git a/JSTests/stress/ftl-multigetbyoffset-constant-numberuse.js b/JSTests/stress/ftl-multigetbyoffset-constant-numberuse.js new file mode 100644 index 000000000000..750e87801f58 --- /dev/null +++ b/JSTests/stress/ftl-multigetbyoffset-constant-numberuse.js @@ -0,0 +1,33 @@ +let proto = { prop: function() {} }; +let obj1 = Object.create(proto); // Structure A: Property is Constant:Function +let obj2 = Object.create(proto); +obj2.prop = NaN; // Structure B: Property is Load:0 + +function trigger(arr) { + let res = 0; + for (let i = 0; i < arr.length; i++) { + let val = arr[i].prop; + // Math.min forces a DoubleRepUse edge + res += Math.min(val, 1.0); + } + return res; +} + +// 1. Warm up Baseline JIT with Structure B only. +// This sets up the ValueProfile to predict DoublePureNaN. +let arr_warmup = new Array(100).fill(obj2); +for (let i = 0; i < 5; i++) trigger(arr_warmup); + +// 2. Populate the IC with Structure A EXACTLY ONCE. +// We put it at the beginning of the array, followed by Structure B. +// By the time the basic block finishes and ValueProfile is flushed, +// the bucket contains NaN from obj2! +let arr_once = [obj1, obj2, obj2, obj2, obj2]; +trigger(arr_once); + +// 3. Trigger DFG/FTL compilation. +// The DFG will see the IC has both structures, but the ValueProfile ONLY predicts Number. +// This generates a MultiGetByOffset with a Constant:Function, but predicting Number. +// DFGValueRepReductionPhase will try to convert the Constant:Function to a double. +let arr_dfg = new Array(1000).fill(obj2); +for (let i = 0; i < 1000; i++) trigger(arr_dfg); diff --git a/JSTests/stress/iterator-prototype-flatMap-return-no-arguments.js b/JSTests/stress/iterator-prototype-flatMap-return-no-arguments.js new file mode 100644 index 000000000000..31464b00c80f --- /dev/null +++ b/JSTests/stress/iterator-prototype-flatMap-return-no-arguments.js @@ -0,0 +1,130 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`Expected ${expected} but got ${actual}`); +} + +// Iterator.prototype.flatMap installs an internal wrapper whose `return` forwards +// to the underlying iterator's `return`. Per the spec (and matching IteratorClose +// in ECMA-262), the underlying `return` must be invoked with NO arguments, +// not with `undefined`. See tc39/proposal-explicit-resource-management#273 +// for the parallel async-iterator fix. + +// Triggered via abrupt completion (`break` inside the for-of) of the helper. +{ + let argsLength = -1; + let arg0 = "sentinel"; + const baseIterator = { + count: 0, + next() { + if (this.count < 3) + return { done: false, value: ++this.count }; + return { done: true }; + }, + return(...args) { + argsLength = args.length; + arg0 = args[0]; + return { done: true }; + }, + }; + const iter = { [Symbol.iterator]() { return baseIterator; } }; + + let pulled = 0; + for (const item of Iterator.from(iter).flatMap(x => [x])) { + pulled++; + if (pulled === 1) + break; + } + shouldBe(pulled, 1); + shouldBe(argsLength, 0); + shouldBe(arg0, undefined); +} + +// Triggered via explicit `.return()` on the helper. +{ + let argsLength = -1; + const baseIterator = { + count: 0, + next() { + if (this.count < 5) + return { done: false, value: ++this.count }; + return { done: true }; + }, + return(...args) { + argsLength = args.length; + return { done: true }; + }, + }; + const iter = { [Symbol.iterator]() { return baseIterator; } }; + + const helper = Iterator.from(iter).flatMap(x => [x]); + helper.next(); + helper.return(); + shouldBe(argsLength, 0); +} + +// Observable via `arguments` (no rest binding). +{ + let argsLength = -1; + const baseIterator = { + count: 0, + next() { + if (this.count < 3) + return { done: false, value: ++this.count }; + return { done: true }; + }, + return() { + argsLength = arguments.length; + return { done: true }; + }, + }; + const iter = { [Symbol.iterator]() { return baseIterator; } }; + + for (const item of Iterator.from(iter).flatMap(x => [x])) { + break; + } + shouldBe(argsLength, 0); +} + +// Sanity: when no abrupt completion occurs, `return` is not invoked at all. +{ + let invoked = 0; + const baseIterator = { + count: 0, + next() { + if (this.count < 3) + return { done: false, value: ++this.count }; + return { done: true }; + }, + return() { + invoked++; + return { done: true }; + }, + }; + const iter = { [Symbol.iterator]() { return baseIterator; } }; + + let pulled = 0; + for (const item of Iterator.from(iter).flatMap(x => [x])) + pulled++; + shouldBe(pulled, 3); + shouldBe(invoked, 0); +} + +// null return should be treated the same as undefined: no call, no throw. +{ + const iterated = Object.create(Iterator.prototype); + let count = 0; + iterated.next = function() { + if (count++ < 3) return { done: false, value: count }; + return { done: true }; + }; + iterated.return = null; + + let threw = false; + try { + for (const item of iterated.flatMap(x => [x])) + break; + } catch (e) { + threw = true; + } + shouldBe(threw, false); +} diff --git a/JSTests/stress/megamorphic-ic-symbol.js b/JSTests/stress/megamorphic-ic-symbol.js new file mode 100644 index 000000000000..8fcbcd8f5d82 --- /dev/null +++ b/JSTests/stress/megamorphic-ic-symbol.js @@ -0,0 +1,130 @@ +function shouldBe(a, b) { + if (a !== b) + throw new Error("expected " + b + " got " + a); +} + +function makeShapes(count) { + let shapes = []; + for (let i = 0; i < count; i++) { + let c = class { + *[Symbol.iterator]() { yield i; } + }; + c.prototype["p" + i] = i; + shapes.push(new c()); + } + return shapes; +} + +const shapes = makeShapes(100); + +// Symbol-only GetByVal at megamorphic site. +{ + function getSym(o) { return o[Symbol.iterator]; } + noInline(getSym); + for (let i = 0; i < 200; i++) + for (let s of shapes) + getSym(s); + for (let i = 0; i < 10000; i++) + shouldBe(typeof getSym([1, 2, 3]), "function"); +} + +// Symbol-only InByVal at megamorphic site. +{ + function inSym(o) { return Symbol.iterator in o; } + noInline(inSym); + for (let i = 0; i < 200; i++) + for (let s of shapes) + inSym(s); + for (let i = 0; i < 10000; i++) + shouldBe(inSym([1, 2, 3]), true); + shouldBe(inSym(Object.create(null)), false); +} + +// Symbol-only PutByVal at megamorphic site. +{ + let target = {}; + function putSym(o, v) { o[Symbol.toStringTag] = v; } + noInline(putSym); + for (let i = 0; i < 200; i++) + for (let s of shapes) + putSym(s, i); + for (let i = 0; i < 10000; i++) + putSym(target, "X" + i); + shouldBe(target[Symbol.toStringTag], "X9999"); +} + +// Mixed String + Symbol at the same megamorphic site. +{ + const stringKeys = ["p0", "p1", "p2"]; + const symbolKeys = [Symbol.iterator, Symbol.toStringTag, Symbol.toPrimitive]; + function getMixed(o, k) { return o[k]; } + function inMixed(o, k) { return k in o; } + function putMixed(o, k, v) { o[k] = v; } + noInline(getMixed); + noInline(inMixed); + noInline(putMixed); + for (let i = 0; i < 200; i++) { + for (let s of shapes) { + for (let k of stringKeys) { + getMixed(s, k); + inMixed(s, k); + putMixed(s, k, i); + } + for (let k of symbolKeys) { + getMixed(s, k); + inMixed(s, k); + putMixed(s, k, i); + } + } + } + let arr = [1, 2, 3]; + for (let i = 0; i < 10000; i++) { + shouldBe(getMixed(arr, "length"), 3); + shouldBe(typeof getMixed(arr, Symbol.iterator), "function"); + shouldBe(inMixed(arr, "length"), true); + shouldBe(inMixed(arr, Symbol.iterator), true); + } + let bag = {}; + for (let i = 0; i < 10000; i++) { + putMixed(bag, "x", i); + putMixed(bag, Symbol.toStringTag, i); + } + shouldBe(bag.x, 9999); + shouldBe(bag[Symbol.toStringTag], 9999); +} + +// Cache invalidation when Symbol-keyed prototype property changes. +{ + function getSym(o) { return o[Symbol.toPrimitive]; } + noInline(getSym); + let arr = [1, 2, 3]; + for (let i = 0; i < 200; i++) + for (let s of shapes) + getSym(s); + for (let i = 0; i < 1000; i++) + shouldBe(getSym(arr), undefined); + Array.prototype[Symbol.toPrimitive] = function () { return "added"; }; + for (let i = 0; i < 1000; i++) + shouldBe(typeof getSym(arr), "function"); + delete Array.prototype[Symbol.toPrimitive]; + for (let i = 0; i < 1000; i++) + shouldBe(getSym(arr), undefined); +} + +// Symbol value is non-cell at a mixed site (must fall to slow path, not crash). +{ + function getMixed(o, k) { return o[k]; } + noInline(getMixed); + for (let i = 0; i < 200; i++) { + for (let s of shapes) { + getMixed(s, "p0"); + getMixed(s, Symbol.iterator); + } + } + let arr = [1, 2, 3]; + for (let i = 0; i < 10000; i++) { + shouldBe(getMixed(arr, 0), 1); + shouldBe(getMixed(arr, "length"), 3); + shouldBe(typeof getMixed(arr, Symbol.iterator), "function"); + } +} diff --git a/JSTests/stress/object-define-property-fields-spilled-arg.js b/JSTests/stress/object-define-property-fields-spilled-arg.js new file mode 100644 index 000000000000..047556177856 --- /dev/null +++ b/JSTests/stress/object-define-property-fields-spilled-arg.js @@ -0,0 +1,25 @@ +// Regression test for a DFG/FTL frame layout bug. operationObjectDefinePropertyFromFields +// used to take 9 GPR args, exceeding ARM64's 8-arg-register budget (and x86_64's 6). +// The 9th argument was poked to [sp + 0], but maxFrameExtentForSlowPathCall is 0 on +// those targets, so [sp + 0] aliased the lowest spill slot and corrupted whatever was +// spilled there. Here, the spilled value happens to be the function argument that +// later feeds a ValueAdd; reading the corrupted slot crashed in operationValueAddNotNumber. +// The fix passes the six descriptor slots through a scratch buffer instead of as +// direct C-call arguments, keeping the operation at four GPR args. + +function opt(input) { + Object.defineProperty((function (t, x) { t.y = x; }), 'reject', { get: (({ valueOf: (/(? this.species)(); + } + } catch (x) { } +} +for (let i = 0; i < testLoopCount; i++) { + try { + opt(-5.3049894784e-314); + } catch (e) { } +} diff --git a/JSTests/stress/perform-promise-then-one-handler.js b/JSTests/stress/perform-promise-then-one-handler.js new file mode 100644 index 000000000000..7fe56bdb46ff --- /dev/null +++ b/JSTests/stress/perform-promise-then-one-handler.js @@ -0,0 +1,167 @@ +// Exercises both the converted (PerformPromiseThenOneHandler) and non-converted +// (PerformPromiseThen) paths produced by DFGConstantFoldingPhase. Each test +// function is noInline'd and run in a hot loop so DFG/FTL tier-up is forced. +// +// Conversion happens in DFGConstantFoldingPhase only when the abstract interpreter +// has *proven* that one handler is SpecFunction and the other is SpecOther +// (undefined or null). Otherwise we keep the generic 4-child PerformPromiseThen +// node, whose runtime semantics this test also verifies. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual + ' vs ' + expected); +} + +async function shouldReject(p, expected) { + try { + await p; + } catch (e) { + shouldBe(e, expected); + return; + } + throw new Error('expected rejection with ' + expected); +} + +// --- Converted FulfillHandler kind: .then(fn) — onRejected is implicit undefined --- +function fulfillOnly(p) { + return p.then(v => v + 1); +} +noInline(fulfillOnly); + +// --- Converted RejectHandler kind: .then(undefined, fn) --- +function rejectOnlyUndefined(p) { + return p.then(undefined, e => 'caught:' + e); +} +noInline(rejectOnlyUndefined); + +// --- Converted RejectHandler kind: .then(null, fn) — null is also SpecOther --- +function rejectOnlyNull(p) { + return p.then(null, e => 'null-caught:' + e); +} +noInline(rejectOnlyNull); + +// --- Non-converted: two callable handlers — neither side is SpecOther --- +function bothHandlers(p) { + return p.then(v => 'ok:' + v, e => 'err:' + e); +} +noInline(bothHandlers); + +// --- Non-converted: a non-callable, non-Other literal as fulfill handler --- +// AI proves SpecInt32, which is neither SpecFunction nor SpecOther → keep PerformPromiseThen. +// Runtime treats non-callable as no-handler → fulfill value passes through; the +// rejection handler runs on rejection. +function intHandlerWithReject(p) { + return p.then(1, e => 'int-rej:' + e); +} +noInline(intHandlerWithReject); + +async function main() { + for (let i = 0; i < testLoopCount; ++i) { + // 1. Converted fulfill, pending → fast inline write. + { + let resolve, p = new Promise(r => { resolve = r; }); + let q = fulfillOnly(p); + resolve(i); + shouldBe(await q, i + 1); + } + + // 2. Converted fulfill, already-fulfilled → JIT precondition fails on status, + // takes inline slow branch (calls operationPerformPromiseThenOneHandler). + shouldBe(await fulfillOnly(Promise.resolve(i)), i + 1); + + // 3. Converted fulfill, rejection passes through (no onRejected → propagation). + await shouldReject(fulfillOnly(Promise.reject('boom-' + i)), 'boom-' + i); + + // 4. Converted reject (undefined fulfill), pending → fast inline write. + { + let reject, p = new Promise((_, rj) => { reject = rj; }); + let q = rejectOnlyUndefined(p); + reject('e-' + i); + shouldBe(await q, 'caught:e-' + i); + } + + // 5. Converted reject (undefined fulfill), already-rejected → slow branch. + shouldBe(await rejectOnlyUndefined(Promise.reject('rej-' + i)), 'caught:rej-' + i); + + // 6. Converted reject, fulfillment passes through. + shouldBe(await rejectOnlyUndefined(Promise.resolve('keep-' + i)), 'keep-' + i); + + // 7. Converted reject (null fulfill), pending. + { + let reject, p = new Promise((_, rj) => { reject = rj; }); + let q = rejectOnlyNull(p); + reject('n-' + i); + shouldBe(await q, 'null-caught:n-' + i); + } + + // 8. Non-converted (two handlers), fulfilled side. + shouldBe(await bothHandlers(Promise.resolve(i)), 'ok:' + i); + + // 9. Non-converted (two handlers), rejected side. + shouldBe(await bothHandlers(Promise.reject('x-' + i)), 'err:x-' + i); + + // 10. Non-converted (two handlers), pending → fulfilled. + { + let resolve, p = new Promise(r => { resolve = r; }); + let q = bothHandlers(p); + resolve(i); + shouldBe(await q, 'ok:' + i); + } + + // 11. Non-converted (two handlers), pending → rejected. + { + let reject, p = new Promise((_, rj) => { reject = rj; }); + let q = bothHandlers(p); + reject('p-' + i); + shouldBe(await q, 'err:p-' + i); + } + + // 12. Non-converted (int handler), fulfillment passes through. + shouldBe(await intHandlerWithReject(Promise.resolve('pass-' + i)), 'pass-' + i); + + // 13. Non-converted (int handler), rejection runs user handler. + shouldBe(await intHandlerWithReject(Promise.reject('bang-' + i)), 'int-rej:bang-' + i); + + // 14. Multi-await on the same pending promise: first .then takes the + // inline-fast path; the second/third force a spill into a real + // JSSlimPromiseReaction chain. + { + let resolve, p = new Promise(r => { resolve = r; }); + let a = fulfillOnly(p); + let b = fulfillOnly(p); + let c = fulfillOnly(p); + resolve(i); + shouldBe(await a, i + 1); + shouldBe(await b, i + 1); + shouldBe(await c, i + 1); + } + + // 15. isHandledFlag pre-set on a pending promise, with no reaction yet + // (state=Pending, kind=None, payload=null). The JIT fast-path precondition + // mask intentionally ignores isHandledFlag, so the fast path must still + // proceed correctly: the OR of isHandledFlag into m_packed is a no-op and + // the reaction is installed as normal. This state is unreachable from + // pure JS, so we use $vm.markPromiseAsHandled to construct it. + { + let resolve, p = new Promise(r => { resolve = r; }); + $vm.markPromiseAsHandled(p); + let q = fulfillOnly(p); + resolve(i); + shouldBe(await q, i + 1); + } + + // 16. Same as above for the RejectHandler kind. + { + let reject, p = new Promise((_, rj) => { reject = rj; }); + $vm.markPromiseAsHandled(p); + let q = rejectOnlyUndefined(p); + reject('h-' + i); + shouldBe(await q, 'caught:h-' + i); + } + } +} + +main().then( + () => {}, + e => { print('FAIL: ' + (e && e.stack || e)); $vm.abort(); } +); diff --git a/JSTests/stress/promise-combinator-non-thenable-element.js b/JSTests/stress/promise-combinator-non-thenable-element.js new file mode 100644 index 000000000000..036499a96f47 --- /dev/null +++ b/JSTests/stress/promise-combinator-non-thenable-element.js @@ -0,0 +1,197 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: actual=${JSON.stringify(actual)} expected=${JSON.stringify(expected)}`); +} + +function shouldThrow(func, errorMessage) { + let errorThrown = false; + try { func(); } catch (e) { + errorThrown = true; + if (String(e) !== errorMessage) + throw new Error(`bad error: ${e}`); + } + if (!errorThrown) + throw new Error("not thrown"); +} + +const log = []; +function tick(label) { Promise.resolve().then(() => log.push(label)); } + +async function main() { + // Promise.all over primitives, non-thenable objects, and promises. + { + const obj = { a: 1 }; + const p = Promise.resolve("p"); + const result = await Promise.all([1, "two", obj, p, null, undefined, 3.5, true, Symbol.for("s"), 4n]); + shouldBe(result.length, 10); + shouldBe(result[0], 1); + shouldBe(result[1], "two"); + shouldBe(result[2], obj); + shouldBe(result[3], "p"); + shouldBe(result[4], null); + shouldBe(result[5], undefined); + shouldBe(result[6], 3.5); + shouldBe(result[7], true); + shouldBe(result[8], Symbol.for("s")); + shouldBe(result[9], 4n); + } + + // Microtask ordering must be unchanged: each non-thenable element still + // burns exactly one tick before the outer promise resolves, so the "all" + // callback (queued by the 3rd element job) drains after the 4 ticks that + // were already queued at that point. + { + log.length = 0; + Promise.all([1, 2, 3]).then(() => log.push("all")); + tick("a"); tick("b"); tick("c"); tick("d"); + for (var i = 0; i < 8; ++i) + await null; + shouldBe(JSON.stringify(log), '["a","b","c","d","all"]'); + } + + // Promise.allSettled + { + const obj = { foo: 1 }; + const result = await Promise.allSettled([1, obj, Promise.reject("err"), null]); + shouldBe(result.length, 4); + shouldBe(result[0].status, "fulfilled"); + shouldBe(result[0].value, 1); + shouldBe(result[1].status, "fulfilled"); + shouldBe(result[1].value, obj); + shouldBe(result[2].status, "rejected"); + shouldBe(result[2].reason, "err"); + shouldBe(result[3].status, "fulfilled"); + shouldBe(result[3].value, null); + } + + // Promise.any — all rejecting except one non-thenable. + { + const result = await Promise.any([Promise.reject("a"), 42, Promise.reject("b")]); + shouldBe(result, 42); + } + { + let aggregate; + try { + await Promise.any([Promise.reject("x"), Promise.reject("y")]); + } catch (e) { aggregate = e; } + shouldBe(aggregate instanceof AggregateError, true); + } + + // Promise.race — first non-thenable wins. + { + const result = await Promise.race([1, 2, Promise.resolve(3)]); + shouldBe(result, 1); + } + { + const never = new Promise(() => {}); + const result = await Promise.race([never, "fast"]); + shouldBe(result, "fast"); + } + + // Thenable elements still go through Promise.resolve(thenable) machinery. + { + let calls = 0; + const thenable = { + then(resolve, reject) { calls++; resolve(99); } + }; + const result = await Promise.all([1, thenable, 2]); + shouldBe(JSON.stringify(result), '[1,99,2]'); + shouldBe(calls, 1); + } + + // Object that gains `then` via Object.prototype.then must not take the + // non-thenable fast path: the watchpoint must drop us into the + // Promise.resolve(thenable) machinery for plain objects. + { + const plain = { plain: true }; + let plainObjectAdopted = false; + Object.prototype.then = function (resolve) { + if (this === plain) + plainObjectAdopted = true; + resolve("hijacked"); + }; + try { + // Note: the result array also goes through the hijacked then. + const result = await Promise.all([1, plain, 2]); + shouldBe(result, "hijacked"); + shouldBe(plainObjectAdopted, true); + } finally { + delete Object.prototype.then; + } + } + + // A Structure cached as DefinitelyNonThenable before the watchpoint fires + // must not be treated as non-thenable afterward. + { + class Box { constructor(value) { this.value = value; } } + const result1 = await Promise.all([new Box(1), new Box(2)]); + shouldBe(result1[0].value, 1); + shouldBe(result1[1].value, 2); + + let boxAdopted = false; + Object.prototype.then = function (resolve) { + if (this instanceof Box) + boxAdopted = true; + resolve("hijacked"); + }; + try { + await Promise.all([new Box(3)]); + shouldBe(boxAdopted, true); + } finally { + delete Object.prototype.then; + } + } + + // Promise subclass with custom Symbol.species must not take the fast path. + { + class MyPromise extends Promise { + static get [Symbol.species]() { return Promise; } + } + const result = await Promise.all([1, MyPromise.resolve(2), 3]); + shouldBe(JSON.stringify(result), "[1,2,3]"); + } + + // A crafted Promise.prototype.then must be invoked per element, even for non-thenable ones. + { + const originalThen = Promise.prototype.then; + const counted = (combinator, elements) => { + let thenCalls = 0; + Promise.prototype.then = function (onFulfilled, onRejected) { + thenCalls++; + return originalThen.call(this, onFulfilled, onRejected); + }; + try { + Promise[combinator](elements); + } finally { + Promise.prototype.then = originalThen; + } + return thenCalls; + }; + shouldBe(counted("all", [1, "two", null]) >= 3, true); + shouldBe(counted("allSettled", [1, "two", null]) >= 3, true); + shouldBe(counted("any", [1, "two", null]) >= 3, true); + shouldBe(counted("race", [1, "two", null]) >= 3, true); + + Promise.prototype.then = function (onFulfilled, onRejected) { + return originalThen.call(this, onFulfilled, onRejected); + }; + try { + const result = await Promise.all([1, "two", null, true]); + shouldBe(JSON.stringify(result), '[1,"two",null,true]'); + } finally { + Promise.prototype.then = originalThen; + } + } + + // Empty iterable. + { + const result = await Promise.all([]); + shouldBe(result.length, 0); + } +} + +let failed = null; +main().catch((e) => { failed = e; }); +drainMicrotasks(); +if (failed) + throw failed; diff --git a/JSTests/stress/promise-resolve-non-thenable-structure-cache-cross-realm.js b/JSTests/stress/promise-resolve-non-thenable-structure-cache-cross-realm.js new file mode 100644 index 000000000000..80929d2eece7 --- /dev/null +++ b/JSTests/stress/promise-resolve-non-thenable-structure-cache-cross-realm.js @@ -0,0 +1,75 @@ +// The isDefinitelyNonThenable Structure cache compares structure->realm() against +// the calling JSGlobalObject before trusting a cached `true`. This test exercises +// cross-realm Promise resolution to ensure a cache populated by one realm's +// watchpoint set is never trusted by another realm. + +function shouldBe(actual, expected, msg) { + if (actual !== expected) + throw new Error(`bad value (${msg ?? ""}): got ${String(actual)}, expected ${String(expected)}`); +} + +function asyncTest(fn) { + let done = false; + let error; + fn().then(() => { done = true; }, (e) => { error = e; done = true; }); + drainMicrotasks(); + if (!done) + throw new Error("async test did not settle: " + fn.name); + if (error) + throw error; +} + +const other = createGlobalObject(); +const otherObject = other.Function("return { a: 1, b: 2, c: 3 };")(); +const otherProto = other.Object.prototype; + +// --- 1. Resolve a foreign object literal in this realm. --- +asyncTest(async function resolveForeignObject() { + for (let i = 0; i < testLoopCount; i++) { + const o = await Promise.resolve(otherObject); + shouldBe(o.a, 1); + shouldBe(o.b, 2); + shouldBe(o.c, 3); + } +}); + +// --- 2. The other realm warms its own cache, then this realm resolves the +// same Structure. Each realm's watchpoint set must guard independently. --- +asyncTest(async function bothRealmsWarm() { + // Warm the other realm. + other.Function("p", ` + for (let i = 0; i < 100; i++) + p.resolve({ a: i }); + `)(other.Promise); + other.drainMicrotasks(); + + // Now resolve foreign objects from this realm. + const factory = other.Function("i", "return { a: i, b: i * 2 };"); + for (let i = 0; i < 100; i++) { + const o = await Promise.resolve(factory(i)); + shouldBe(o.a, i, "bothRealmsWarm.a"); + shouldBe(o.b, i * 2, "bothRealmsWarm.b"); + } +}); + +// --- 3. Poison the OTHER realm's Object.prototype.then. The structure of +// otherObject lives in the other realm; resolving it from THIS realm +// must observe the foreign `then`. --- +asyncTest(async function poisonOtherRealmObjectProto() { + // Warm-up resolves from this realm. + const factory = other.Function("i", "return { p: i };"); + for (let i = 0; i < 100; i++) { + const o = await Promise.resolve(factory(i)); + shouldBe(o.p, i, "poisonOtherRealm.warm"); + } + // Poison the foreign Object.prototype. + other.Function(` + Object.prototype.then = function(resolve) { resolve("foreign-poisoned"); }; + `)(); + try { + const v = await Promise.resolve(factory(42)); + shouldBe(v, "foreign-poisoned", "poisonOtherRealm.afterPoison"); + } finally { + other.Function("delete Object.prototype.then;")(); + } +}); diff --git a/JSTests/stress/promise-resolve-non-thenable-structure-cache-dictionary.js b/JSTests/stress/promise-resolve-non-thenable-structure-cache-dictionary.js new file mode 100644 index 000000000000..3d374ef7e018 --- /dev/null +++ b/JSTests/stress/promise-resolve-non-thenable-structure-cache-dictionary.js @@ -0,0 +1,88 @@ +//@ requireOptions("--useDollarVM=1") +// Dictionary structures are mutated in place when properties are added, so the +// Structure-level isDefinitelyNonThenable cache must not store NonThenable for +// them: a later in-place addition of `then` would not invalidate the cache and +// the promise would resolve with the object instead of calling its `then`. +// +// These tests warm the cache on a dictionary structure, then add `then` in +// place and check that promise resolution observes it. + +function shouldBe(actual, expected, msg) { + if (actual !== expected) + throw new Error(`bad value (${msg ?? ""}): got ${String(actual)}, expected ${String(expected)}`); +} + +function asyncTest(fn) { + let done = false; + let error; + fn().then(() => { done = true; }, (e) => { error = e; done = true; }); + drainMicrotasks(); + if (!done) + throw new Error("async test did not settle: " + fn.name); + if (error) + throw error; +} + +// --- 1. CacheableDictionary: add `then` in place after warm-up --- +asyncTest(async function cacheableDictionaryGainsThen() { + const o = { a: 1, b: 2, c: 3 }; + $vm.toCacheableDictionary(o); + + // Warm: would tempt the cache to record NonThenable on the dictionary structure. + for (let i = 0; i < testLoopCount; i++) + shouldBe((await o).a, 1, "cacheableDict.warm"); + + // In-place mutation: same Structure object, now thenable. + o.then = function (resolve) { resolve("dict-then"); }; + for (let i = 0; i < 100; i++) + shouldBe(await o, "dict-then", "cacheableDict.poisoned"); + + // In-place removal: must also be observed (only loses the optimization if cached as MaybeThenable). + delete o.then; + for (let i = 0; i < 100; i++) + shouldBe((await o).a, 1, "cacheableDict.afterDelete"); +}); + +// --- 2. UncacheableDictionary: same, after delete forces UncacheableDictionary --- +asyncTest(async function uncacheableDictionaryGainsThen() { + const o = { a: 1, b: 2, c: 3 }; + $vm.toUncacheableDictionary(o); + + for (let i = 0; i < testLoopCount; i++) + shouldBe((await o).a, 1, "uncacheableDict.warm"); + + o.then = function (resolve) { resolve("uncacheable-dict-then"); }; + for (let i = 0; i < 100; i++) + shouldBe(await o, "uncacheable-dict-then", "uncacheableDict.poisoned"); + + delete o.then; + for (let i = 0; i < 100; i++) + shouldBe((await o).a, 1, "uncacheableDict.afterDelete"); +}); + +// --- 3. CacheableDictionary via Promise.resolve --- +asyncTest(async function cacheableDictionaryPromiseResolve() { + const o = { x: 42 }; + $vm.toCacheableDictionary(o); + + for (let i = 0; i < testLoopCount; i++) + shouldBe((await Promise.resolve(o)).x, 42, "cacheableDict.resolve.warm"); + + o.then = function (resolve) { resolve("resolved-then"); }; + for (let i = 0; i < 100; i++) + shouldBe(await Promise.resolve(o), "resolved-then", "cacheableDict.resolve.poisoned"); +}); + +// --- 4. Dictionary with null prototype: shortest cacheable chain shape --- +asyncTest(async function dictionaryNullProtoGainsThen() { + const o = Object.create(null); + o.a = 1; + $vm.toCacheableDictionary(o); + + for (let i = 0; i < testLoopCount; i++) + shouldBe((await o).a, 1, "nullProtoDict.warm"); + + o.then = function (resolve) { resolve("null-proto-then"); }; + for (let i = 0; i < 100; i++) + shouldBe(await o, "null-proto-then", "nullProtoDict.poisoned"); +}); diff --git a/JSTests/stress/promise-resolve-non-thenable-structure-cache.js b/JSTests/stress/promise-resolve-non-thenable-structure-cache.js new file mode 100644 index 000000000000..fe3d6742556a --- /dev/null +++ b/JSTests/stress/promise-resolve-non-thenable-structure-cache.js @@ -0,0 +1,323 @@ +// Stress test for the Structure-level isDefinitelyNonThenable cache. +// +// The cache stores "this Structure's prototype chain definitely cannot resolve a +// thenable" in a 2-bit field on Structure. A `true` cache is sound only while the +// realm's promiseThenWatchpointSet (which also watches `then` absence on +// Object.prototype) is intact. Each test below stresses a path where the cache +// might miscompile if the watchpoint or fallback walk were wrong. + +function shouldBe(actual, expected, msg) { + if (actual !== expected) + throw new Error(`bad value (${msg ?? ""}): got ${String(actual)}, expected ${String(expected)}`); +} + +function asyncTest(fn) { + let done = false; + let error; + fn().then(() => { done = true; }, (e) => { error = e; done = true; }); + drainMicrotasks(); + if (!done) + throw new Error("async test did not settle: " + fn.name); + if (error) + throw error; +} + +// --- 1. Plain object literal: cache hit fast path --- +asyncTest(async function plainObjectLiteral() { + for (let i = 0; i < testLoopCount; i++) { + const o = await { a: i, b: i + 1, c: i + 2 }; + shouldBe(o.a, i); + shouldBe(o.b, i + 1); + shouldBe(o.c, i + 2); + } +}); + +// --- 2. Promise.resolve with object literal --- +asyncTest(async function promiseResolveObjectLiteral() { + for (let i = 0; i < testLoopCount; i++) { + const o = await Promise.resolve({ x: i, y: i * 2 }); + shouldBe(o.x, i); + shouldBe(o.y, i * 2); + } +}); + +// --- 3. Object with own `then` property (data property) --- +asyncTest(async function ownThenDataProperty() { + for (let i = 0; i < 100; i++) { + const v = await { then(resolve) { resolve(i); } }; + shouldBe(v, i, "ownThenDataProperty"); + } +}); + +// --- 4. Object with own `then` getter --- +asyncTest(async function ownThenGetter() { + for (let i = 0; i < 100; i++) { + const v = await { get then() { return (resolve) => resolve(i * 3); } }; + shouldBe(v, i * 3, "ownThenGetter"); + } +}); + +// --- 5. Null prototype object --- +asyncTest(async function nullProto() { + for (let i = 0; i < 100; i++) { + const o = Object.create(null); + o.a = i; + const v = await o; + shouldBe(v.a, i, "nullProto"); + } +}); + +// --- 6. Frozen / sealed objects --- +asyncTest(async function frozenSealed() { + const f = Object.freeze({ a: 1 }); + shouldBe((await f).a, 1, "frozen"); + const s = Object.seal({ b: 2 }); + shouldBe((await s).b, 2, "sealed"); + const p = Object.preventExtensions({ c: 3 }); + shouldBe((await p).c, 3, "preventExtensions"); +}); + +// --- 7. Class instance: deep prototype chain (Uncacheable state) --- +asyncTest(async function classInstanceDeepChain() { + class A { constructor() { this.a = 1; } } + class B extends A { constructor() { super(); this.b = 2; } } + class C extends B { constructor() { super(); this.c = 3; } } + for (let i = 0; i < testLoopCount; i++) { + const o = await new C(); + shouldBe(o.a, 1); + shouldBe(o.b, 2); + shouldBe(o.c, 3); + } +}); + +// --- 8. Class proto gains `then` after cache warm-up --- +asyncTest(async function classProtoGainsThen() { + class Foo { constructor() { this.x = 1; } } + // Warm. + for (let i = 0; i < 100; i++) { + const o = await new Foo(); + shouldBe(o.x, 1); + } + // Poison the proto. The Structure for Foo instances is Uncacheable + // (chain depth >= 2), so this MUST be picked up immediately by the walk. + Foo.prototype.then = function(resolve) { resolve("foo-thenable"); }; + const v = await new Foo(); + shouldBe(v, "foo-thenable", "classProtoGainsThen"); + delete Foo.prototype.then; + // After delete, behavior should revert. + const o2 = await new Foo(); + shouldBe(o2.x, 1, "classProtoThenDeleted"); +}); + +// --- 9. Many distinct shapes: Structure-level cache must not bleed across shapes --- +asyncTest(async function megamorphicShapes() { + function makeShape(i) { + const o = {}; + for (let j = 0; j <= i % 8; j++) + o["p" + j] = j; + return o; + } + for (let i = 0; i < 200; i++) { + const o = await makeShape(i); + shouldBe(o.p0, 0); + } +}); + +// --- 10. Property addition transitions to a fresh Structure with NotComputed state --- +asyncTest(async function structureTransition() { + for (let i = 0; i < 100; i++) { + const o = { a: 1 }; + shouldBe((await o).a, 1); + o.b = 2; // transition to a new Structure + shouldBe((await o).b, 2); + o.then = function(resolve) { resolve("tail-then"); }; // another transition; now thenable + const v = await o; + shouldBe(v, "tail-then", "structureTransition.then"); + } +}); + +// --- 11. for-await-of (iterator result objects {value, done}) --- +asyncTest(async function forAwaitOf() { + async function* gen() { + yield { v: 1 }; + yield { v: 2 }; + yield { v: 3 }; + } + let sum = 0; + for (let i = 0; i < 100; i++) { + for await (const x of gen()) + sum += x.v; + } + shouldBe(sum, 600, "forAwaitOf"); +}); + +// --- 12. async generator returning object literals --- +asyncTest(async function asyncGenObjectLiterals() { + async function* g() { + for (let i = 0; i < 50; i++) + yield { i }; + } + let acc = 0; + for await (const o of g()) + acc += o.i; + shouldBe(acc, 1225, "asyncGenObjectLiterals"); +}); + +// --- 13. Promise.all with mixed thenables and non-thenables --- +asyncTest(async function promiseAllMixed() { + const results = await Promise.all([ + { a: 1 }, + Promise.resolve({ a: 2 }), + { then(resolve) { resolve({ a: 3 }); } }, + Object.create(null, { a: { value: 4 } }), + ]); + shouldBe(results[0].a, 1); + shouldBe(results[1].a, 2); + shouldBe(results[2].a, 3); + shouldBe(results[3].a, 4); +}); + +// --- 14. Same Structure shared across many objects --- +asyncTest(async function sharedStructure() { + function make(i) { return { x: i, y: i, z: i }; } + for (let i = 0; i < testLoopCount; i++) { + const o = await make(i); + shouldBe(o.x, i); + } +}); + +// --- 15. Symbol-keyed properties don't poison the cache --- +asyncTest(async function symbolKeysHarmless() { + const sym = Symbol("k"); + for (let i = 0; i < 100; i++) { + const o = { a: i, [sym]: i * 10 }; + const v = await o; + shouldBe(v.a, i); + shouldBe(v[sym], i * 10); + } +}); + +// --- 16. then defined as accessor on the object's prototype --- +asyncTest(async function thenAccessorOnProto() { + function Wrapper(v) { this.v = v; } + Object.defineProperty(Wrapper.prototype, "then", { + get() { const v = this.v; return (resolve) => resolve("w" + v); }, + configurable: true, + }); + const r = await new Wrapper(7); + shouldBe(r, "w7", "thenAccessorOnProto"); +}); + +// --- 17. `then` added in the middle of a deep prototype chain --- +asyncTest(async function thenMidChain() { + class A { constructor() { this.a = 1; } } + class B extends A { constructor() { super(); this.b = 2; } } + class C extends B { constructor() { super(); this.c = 3; } } + // Warm. + for (let i = 0; i < 100; i++) + shouldBe((await new C()).c, 3); + // Add `then` to A.prototype: two hops away from a C instance, but still on the chain. + A.prototype.then = function(resolve) { resolve("mid-chain"); }; + try { + const v = await new C(); + shouldBe(v, "mid-chain", "thenMidChain"); + } finally { + delete A.prototype.then; + } + shouldBe((await new C()).c, 3, "thenMidChain.afterDelete"); +}); + +// --- 18. Object.setPrototypeOf changes the chain after warm-up --- +asyncTest(async function setPrototypeOf() { + function MakeProto() {} + const obj = { v: 1 }; + Object.setPrototypeOf(obj, MakeProto.prototype); // transition to a new Structure + for (let i = 0; i < 100; i++) + shouldBe((await obj).v, 1); + // Replace the proto with a thenable. This causes another transition. + Object.setPrototypeOf(obj, { then(resolve) { resolve("sp-thenable"); } }); + const v = await obj; + shouldBe(v, "sp-thenable", "setPrototypeOf"); +}); + +// --- 19. Reflect.construct with custom newTarget (poly-proto-ish path) --- +asyncTest(async function reflectConstruct() { + function Base() { this.b = 1; } + function Derived() { this.d = 2; } + Derived.prototype = Object.create(Base.prototype); + for (let i = 0; i < 100; i++) { + const o = Reflect.construct(Base, [], Derived); + const v = await o; + shouldBe(v.b, 1, "reflectConstruct"); + } +}); + +// --- 20. Array and TypedArray (built-in prototype chains) --- +asyncTest(async function builtins() { + const arr = await [1, 2, 3]; + shouldBe(arr.length, 3, "array"); + const ta = await new Uint8Array([4, 5, 6]); + shouldBe(ta[0], 4, "typedArray"); + const map = await new Map([[1, "a"]]); + shouldBe(map.get(1), "a", "map"); +}); + +// --- 21. Proxy: getOwnPropertyDescriptor trap must always be consulted --- +asyncTest(async function proxyAlwaysSlow() { + let trapCalled = false; + const target = { a: 1 }; + const handler = { + get(t, k) { + if (k === "then") + trapCalled = true; + return Reflect.get(t, k); + }, + }; + const v = await new Proxy(target, handler); + shouldBe(v.a, 1, "proxy.value"); + shouldBe(trapCalled, true, "proxy.trapCalled"); +}); + +// --- 22. Object.prototype gains a NON-`then` property after warm-up. +// The adaptive watchpoint must re-arm on the new Structure (not fire), +// so the cache stays usable AND the result stays correct. --- +asyncTest(async function objectProtoNonThenAdditionHarmless() { + // Warm. + for (let i = 0; i < testLoopCount; i++) + shouldBe((await { a: i, b: i }).a, i); + Object.prototype.someUnrelatedProperty = 42; + try { + for (let i = 0; i < 100; i++) { + const o = await { a: i, b: i }; + shouldBe(o.a, i, "nonThenAddition.a"); + shouldBe(o.someUnrelatedProperty, 42, "nonThenAddition.proto"); + } + } finally { + delete Object.prototype.someUnrelatedProperty; + } +}); + +// --- 23. Object.prototype.then poison MUST come last: +// it permanently fires the watchpoint set for this realm. --- +asyncTest(async function objectProtoThenPoisonLast() { + // Warm the cache for several Structures. + for (let i = 0; i < testLoopCount; i++) + await { a: i, b: i, c: i }; + + Object.prototype.then = function(resolve) { resolve("op-poisoned"); }; + try { + const v1 = await { a: 1, b: 2, c: 3 }; + shouldBe(v1, "op-poisoned", "objectProtoThenPoison.literal"); + const v2 = await { p0: 0 }; // a different shape, also covered + shouldBe(v2, "op-poisoned", "objectProtoThenPoison.otherShape"); + class Z { constructor() { this.z = 1; } } + const v3 = await new Z(); // class instance: walk reaches Object.prototype + shouldBe(v3, "op-poisoned", "objectProtoThenPoison.classInstance"); + } finally { + delete Object.prototype.then; + } + // After delete, watchpoint stays fired -> always slow path, but result is correct. + const v4 = await { a: 1, b: 2, c: 3 }; + shouldBe(v4.a, 1, "afterDelete.a"); + shouldBe(v4.b, 2, "afterDelete.b"); +}); diff --git a/JSTests/stress/spread-set-own-symbol-iterator-side-effects.js b/JSTests/stress/spread-set-own-symbol-iterator-side-effects.js new file mode 100644 index 000000000000..76c811699f50 --- /dev/null +++ b/JSTests/stress/spread-set-own-symbol-iterator-side-effects.js @@ -0,0 +1,39 @@ +//@ runDefault("--useConcurrentJIT=0") + +// Spread(SetObjectUse): the abstract interpreter must not retain structure +// proofs across the node when the operand isn't proven to carry the original +// Set structure, since the lowered slow path (operationSpreadSet) can invoke a +// user-defined Symbol.iterator. + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error("bad value"); +} + +let obj; + +// Pre-create the {a}->Accessor transition so the warmup structure isn't a watchable leaf. +{ + let t = { a: 1.1 }; + Object.defineProperty(t, "a", { get() { return 1; } }); +} + +let setWithOwnIterator = new Set([1]); +setWithOwnIterator[Symbol.iterator] = function* () { + Object.defineProperty(obj, "a", { get() { return 1; }, configurable: true }); + yield 1; +}; + +function f(set, o) { + let x = o.a; + let arr = [...set]; + return o.a; +} +noInline(f); + +let plainSet = new Set([1]); +for (let i = 0; i < testLoopCount; i++) + f(plainSet, { a: 1.1 }); + +obj = { a: 1.1 }; +shouldBe(f(setWithOwnIterator, obj), 1); diff --git a/JSTests/stress/string-prototype-match-edge-cases.js b/JSTests/stress/string-prototype-match-edge-cases.js new file mode 100644 index 000000000000..9d13cbfa7253 --- /dev/null +++ b/JSTests/stress/string-prototype-match-edge-cases.js @@ -0,0 +1,180 @@ +// Exercises edge cases of String.prototype.match across the LLInt/Baseline/DFG/FTL +// tiers, in particular around the C++ host function and the StringMatch DFG node. + +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"); +} + +// ----- |this| coercion ----- +shouldBe("abc1".match(/[0-9]/), ["1"]); +shouldBe(String.prototype.match.call(12345, /3/), ["3"]); +shouldBe(String.prototype.match.call(true, /ru/), ["ru"]); +shouldBe(String.prototype.match.call({ toString() { return "obj1"; } }, /[0-9]/), ["1"]); +shouldThrow(() => String.prototype.match.call(null, /a/), "TypeError"); +shouldThrow(() => String.prototype.match.call(undefined, /a/), "TypeError"); + +// ----- regexp argument types ----- +// undefined / no argument: RegExpCreate(undefined, undefined) -> /(?:)/ +shouldBe("abc".match(), [""]); +shouldBe("abc".match(undefined), [""]); +// null -> /null/ +shouldBe("anull".match(null), ["null"]); +shouldBe("abc".match(null), null); +// number -> /123/ +shouldBe("a123b".match(123), ["123"]); +// boolean -> /true/ +shouldBe("xtruey".match(true), ["true"]); +// string regexp pattern +shouldBe("abc1def2".match("[0-9]"), ["1"]); +shouldBe("aaa".match("a+"), ["aaa"]); +// invalid regexp pattern from string -> SyntaxError +shouldThrow(() => "abc".match("["), "SyntaxError"); +shouldThrow(() => "abc".match("(?"), "SyntaxError"); +// Symbol cannot be coerced to a string when constructing the regexp. +shouldThrow(() => "abc".match(Symbol("s")), "TypeError"); + +// ----- flag combinations ----- +shouldBe("abc1def2ghi3".match(/[0-9]/g), ["1", "2", "3"]); +shouldBe("abc1def2".match(/[0-9]/), ["1"]); +shouldBe("1abc".match(/[0-9]/y), ["1"]); +shouldBe("abc1".match(/[0-9]/y), null); +shouldBe("ABC".match(/abc/i), ["ABC"]); +shouldBe("a\nb".match(/^b/m), ["b"]); +shouldBe("a\u{1F600}b".match(/./gu), ["a", "\u{1F600}", "b"]); +shouldBe("a\u{1F600}b".match(/./gv), ["a", "\u{1F600}", "b"]); +// Capture groups +shouldBe("ab".match(/(a)(b)/), ["ab", "a", "b"]); +shouldBe("ab".match(/(?a)(?b)/).groups, { x: "a", y: "b" }); + +// ----- lastIndex behavior ----- +{ + var g = /[0-9]/g; + g.lastIndex = 5; + // RegExp.prototype[@@match] sets lastIndex to 0 for global regexps before iterating. + shouldBe("1a2b3".match(g), ["1", "2", "3"]); + shouldBe(g.lastIndex, 0); +} +{ + var y = /[0-9]/y; + y.lastIndex = 3; + shouldBe("abc1def".match(y), ["1"]); + shouldBe(y.lastIndex, 4); +} +{ + // Non-numeric lastIndex must not break the spec semantics: the watchpoint fast + // path bails out and the full lookup path is used. + var g2 = /[0-9]/g; + g2.lastIndex = { valueOf() { return 0; } }; + shouldBe("1a2b3".match(g2), ["1", "2", "3"]); +} + +// ----- per-instance @@match override on a RegExp ----- +{ + var re = /a/; + re[Symbol.match] = function (s) { return ["instance-override", s]; }; + shouldBe("hello".match(re), ["instance-override", "hello"]); +} +// per-instance @@match deleted -> falls back to RegExp.prototype[@@match] +{ + var re2 = /[0-9]/; + re2[Symbol.match] = undefined; + // GetMethod returns undefined -> falls through to step 3-5: ToString(/[0-9]/) = "/[0-9]/" + // and "abc1" matched against /\/[0-9]\// (literal slash) -> null + shouldBe("abc1".match(re2), null); + shouldBe("/3/x".match(re2), ["/3/"]); +} +{ + var re3 = /[0-9]/; + re3[Symbol.match] = null; + // GetMethod returns undefined for null too -> same as above + shouldBe("/3/x".match(re3), ["/3/"]); +} +{ + var re4 = /[0-9]/; + re4[Symbol.match] = "not callable"; + shouldThrow(() => "abc1".match(re4), "TypeError"); +} + +// ----- @@match on a plain object (custom matcher) ----- +{ + var obj = { [Symbol.match](s) { return [s, "custom"]; } }; + shouldBe("hello".match(obj), ["hello", "custom"]); +} +{ + var obj2 = { [Symbol.match]: 42 }; + shouldThrow(() => "hello".match(obj2), "TypeError"); +} +// @@match getter side effects +{ + var log = []; + var obj3 = { + get [Symbol.match]() { + log.push("get @@match"); + return function (s) { log.push("call @@match"); return [s]; }; + } + }; + shouldBe("hi".match(obj3), ["hi"]); + shouldBe(log, ["get @@match", "call @@match"]); +} + +// ----- Subclassed RegExp ----- +{ + class MyRegExp extends RegExp { } + var mr = new MyRegExp("[0-9]", "g"); + shouldBe("a1b2c3".match(mr), ["1", "2", "3"]); +} +{ + class MyRegExp2 extends RegExp { + [Symbol.match](s) { return ["subclass", s]; } + } + var mr2 = new MyRegExp2("a"); + shouldBe("hello".match(mr2), ["subclass", "hello"]); +} + +// ----- flags getter side effects via custom regexp object ----- +{ + var log = []; + var fake = { + [Symbol.match]: RegExp.prototype[Symbol.match], + get flags() { log.push("flags"); return "g"; }, + get global() { log.push("global"); return true; }, + get hasIndices() { return false; }, + get ignoreCase() { return false; }, + get multiline() { return false; }, + get sticky() { return false; }, + get unicode() { return false; }, + get unicodeSets() { return false; }, + get dotAll() { return false; }, + lastIndex: 0, + exec(s) { + log.push("exec"); + if (this.lastIndex >= s.length) return null; + var idx = this.lastIndex; + this.lastIndex = idx + 1; + return Object.assign([s[idx]], { index: idx, input: s }); + } + }; + shouldBe("ab".match(fake), ["a", "b"]); + if (log.indexOf("flags") === -1) + throw new Error("custom flags getter must be invoked"); + if (log.indexOf("exec") === -1) + throw new Error("custom exec must be invoked"); +} + +print("PASSED"); diff --git a/JSTests/stress/string-prototype-match-strength-reduction.js b/JSTests/stress/string-prototype-match-strength-reduction.js new file mode 100644 index 000000000000..67f7e9b75044 --- /dev/null +++ b/JSTests/stress/string-prototype-match-strength-reduction.js @@ -0,0 +1,101 @@ +// Exercises the DFG path where a StringMatch node is converted to RegExpMatchFast +// in fixup and then further strength-reduced to RegExpMatchFastGlobal / +// RegExpExecNonGlobalOrSticky for known-flag literal RegExp arguments. + +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); +} + +// Global literal: StringMatch -> RegExpMatchFast -> RegExpMatchFastGlobal +function matchGlobalLiteral(str) { + return str.match(/[0-9]/g); +} +noInline(matchGlobalLiteral); +for (var i = 0; i < 1e5; ++i) + shouldBe(matchGlobalLiteral("a1b2c3"), ["1", "2", "3"]); +shouldBe(matchGlobalLiteral("nope"), null); + +// Non-global literal: StringMatch -> RegExpMatchFast -> RegExpExec +function matchNonGlobalLiteral(str) { + return str.match(/[0-9]/); +} +noInline(matchNonGlobalLiteral); +for (var i = 0; i < 1e5; ++i) + shouldBe(matchNonGlobalLiteral("a1b2c3"), ["1"]); +shouldBe(matchNonGlobalLiteral("nope"), null); + +// Sticky literal: not strength-reduced to global; goes through RegExpExec. +function matchStickyLiteral(str) { + return str.match(/[0-9]/y); +} +noInline(matchStickyLiteral); +for (var i = 0; i < 1e5; ++i) + shouldBe(matchStickyLiteral("1abc"), ["1"]); +shouldBe(matchStickyLiteral("a1bc"), null); + +// Unicode global literal exercising surrogate handling. +function matchUnicodeGlobal(str) { + return str.match(/./gu); +} +noInline(matchUnicodeGlobal); +for (var i = 0; i < 1e5; ++i) + shouldBe(matchUnicodeGlobal("a\u{1F600}b"), ["a", "\u{1F600}", "b"]); + +// Cached RegExp parameter: StringMatch -> RegExpMatchFast (no strength reduction +// since the regexp is not a constant). +function matchCached(str, re) { + return str.match(re); +} +noInline(matchCached); +var cached = /[0-9]/g; +for (var i = 0; i < 1e5; ++i) + shouldBe(matchCached("a1b2c3", cached), ["1", "2", "3"]); + +// Non-global cached. +var cachedNonGlobal = /[0-9]/; +for (var i = 0; i < 1e5; ++i) + shouldBe(matchCached("a1b2c3", cachedNonGlobal), ["1"]); + +// String pattern: StringMatch with StringUse on child2. +function matchStringPattern(str, pat) { + return str.match(pat); +} +noInline(matchStringPattern); +for (var i = 0; i < 1e5; ++i) + shouldBe(matchStringPattern("a1b2c3", "[0-9]"), ["1"]); + +// Mixed monomorphic: function that sees both global and non-global regexps. +function matchPoly(str, re) { + return str.match(re); +} +noInline(matchPoly); +var g = /[0-9]/g; +var ng = /[0-9]/; +for (var i = 0; i < 1e5; ++i) { + shouldBe(matchPoly("a1b2c3", g), ["1", "2", "3"]); + shouldBe(matchPoly("a1b2c3", ng), ["1"]); +} + +// Result array structure: exec result should be a RegExpMatchesArray. +{ + var r = "ab12".match(/(\d)(\d)/); + shouldBe(r.length, 3); + shouldBe(r.index, 2); + shouldBe(r.input, "ab12"); + shouldBe(r[0], "12"); + shouldBe(r[1], "1"); + shouldBe(r[2], "2"); +} + +// Legacy properties recorded after a non-global match. +{ + "abc1def".match(/[0-9]/); + shouldBe(RegExp.lastMatch, "1"); + shouldBe(RegExp.leftContext, "abc"); + shouldBe(RegExp.rightContext, "def"); +} + +print("PASSED"); diff --git a/JSTests/stress/string-prototype-match-watchpoint-invalidation.js b/JSTests/stress/string-prototype-match-watchpoint-invalidation.js new file mode 100644 index 000000000000..04d0a28115a5 --- /dev/null +++ b/JSTests/stress/string-prototype-match-watchpoint-invalidation.js @@ -0,0 +1,178 @@ +// Verifies that String.prototype.match honors dynamic mutations of @@match-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) { + var a = JSON.stringify(actual); + var e = JSON.stringify(expected); + if (a !== e) + throw new Error("expected " + e + " but got " + a); +} + +// 1. Per-instance @@match override after JIT compilation with a primordial RegExp. +(function () { + function match(str, re) { return str.match(re); } + noInline(match); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + re[Symbol.match] = function (s) { return ["override:" + s]; }; + shouldBe(match("a1b2c3", re), ["override:a1b2c3"]); +})(); + +// 2. RegExp.prototype[@@match] replaced after JIT compilation. +(function () { + function match(str, re) { return str.match(re); } + noInline(match); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + var saved = RegExp.prototype[Symbol.match]; + RegExp.prototype[Symbol.match] = function (s) { return ["proto:" + s]; }; + try { + shouldBe(match("a1b2c3", re), ["proto:a1b2c3"]); + } finally { + RegExp.prototype[Symbol.match] = saved; + } +})(); + +// 3. RegExp.prototype.exec replaced after JIT compilation. +(function () { + function match(str, re) { return str.match(re); } + noInline(match); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + var saved = RegExp.prototype.exec; + var execCount = 0; + RegExp.prototype.exec = function (s) { + execCount++; + return saved.call(this, s); + }; + try { + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + if (execCount === 0) + throw new Error("custom RegExp.prototype.exec must be observed"); + } finally { + RegExp.prototype.exec = saved; + } +})(); + +// 4. String.prototype[@@match] defined after JIT compilation with a string regexp. +(function () { + function match(str, pat) { return str.match(pat); } + noInline(match); + for (var i = 0; i < 1e4; ++i) + shouldBe(match("abc1def2", "[0-9]"), ["1"]); + // Per current spec ("2. If regexp is not Object"), a primitive pattern argument + // does NOT trigger a GetMethod(@@match) lookup, so a user-installed + // String.prototype[@@match] is not observed for a primitive string pattern. + // (See also test262 cstm-matcher-on-string-primitive.js.) + Object.defineProperty(String.prototype, Symbol.match, { + configurable: true, + value: function () { return ["string-proto"]; } + }); + try { + shouldBe(match("abc1def2", "[0-9]"), ["1"]); + // But a String *object* DOES go through @@match. + shouldBe("abc1def2".match(new String("[0-9]")), ["string-proto"]); + } finally { + delete String.prototype[Symbol.match]; + } +})(); + +// 5. RegExp.prototype.global replaced after JIT compilation. +(function () { + function match(str, re) { return str.match(re); } + noInline(match); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + var savedDescriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, "global"); + Object.defineProperty(RegExp.prototype, "global", { + configurable: true, + get() { return false; } + }); + try { + // With global=false, RegExp.prototype[@@match] takes the non-global path: + // a single RegExpExec(R, S). lastIndex stays 0 after the global resets above. + shouldBe(match("a1b2c3", re), ["1"]); + } finally { + Object.defineProperty(RegExp.prototype, "global", savedDescriptor); + } +})(); + +// 6. Setting non-numeric lastIndex after JIT compilation. +(function () { + function match(str, re) { return str.match(re); } + noInline(match); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + var valueOfCount = 0; + re.lastIndex = { valueOf() { valueOfCount++; return 0; } }; + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + // The slow path is hit after this since the compiled fast path bailed out. +})(); + +// 7. Reflect.setPrototypeOf to a non-RegExp prototype after JIT compilation. +(function () { + function match(str, re) { return str.match(re); } + noInline(match); + var re = /[0-9]/g; + for (var i = 0; i < 1e4; ++i) + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); + var weird = /[0-9]/g; + Object.setPrototypeOf(weird, { + [Symbol.match](s) { return ["weird:" + s]; } + }); + shouldBe(match("a1b2c3", weird), ["weird:a1b2c3"]); + // The fast path must keep working for normal regexps after seeing one weird instance. + shouldBe(match("a1b2c3", re), ["1", "2", "3"]); +})(); + +// 8. ToString(this) mutates the regexp instance between the fast-path check and +// the C++ RegExpMatchFast engine. Per spec, RegExp.prototype[@@match] reads +// R.flags and dispatches to RegExpExec(R, S) *after* S = ToString(string), so +// the user-installed exec must be observed. +(function () { + var re = /a/; + var receiver = { + toString() { + re.exec = function () { var r = ["evil"]; r.index = 0; r.input = "abc"; return r; }; + return "abc"; + } + }; + shouldBe(String.prototype.match.call(receiver, re), ["evil"]); +})(); +(function () { + // Mutating RegExp.prototype.exec inside ToString fires regExpPrimordialPropertiesWatchpointSet. + var re = /a/; + var saved = RegExp.prototype.exec; + var receiver = { + toString() { + RegExp.prototype.exec = function () { var r = ["evil"]; r.index = 0; r.input = "abc"; return r; }; + return "abc"; + } + }; + try { + shouldBe(String.prototype.match.call(receiver, re), ["evil"]); + } finally { + RegExp.prototype.exec = saved; + } +})(); +(function () { + // Mutating lastIndex to a non-number inside ToString. + var re = /a/g; + var valueOfCount = 0; + var receiver = { + toString() { + re.lastIndex = { valueOf() { valueOfCount++; return 0; } }; + return "abc"; + } + }; + shouldBe(String.prototype.match.call(receiver, re), ["a"]); +})(); + +print("PASSED"); diff --git a/JSTests/stress/string-substr-strength-reduction.js b/JSTests/stress/string-substr-strength-reduction.js new file mode 100644 index 000000000000..4e1c3cb07dab --- /dev/null +++ b/JSTests/stress/string-substr-strength-reduction.js @@ -0,0 +1,47 @@ +function shouldBe(actual, expected) { + if (!Object.is(actual, expected)) { + throw new Error(`Bad value: ${actual}!`); + } +} + +// Each function uses literal constants so the strength-reduction phase +// can fold the StringSubstr node into a constant string. +const cases = [ + [() => "ABCDE".substr(0, 5), "ABCDE"], + [() => "ABCDE".substr(1, 3), "BCD"], + [() => "ABCDE".substr(2), "CDE"], + [() => "ABCDE".substr(0), "ABCDE"], + [() => "ABCDE".substr(2, 0), ""], + [() => "ABCDE".substr(2, -1), ""], + [() => "ABCDE".substr(0, -100), ""], + [() => "ABCDE".substr(2, 100), "CDE"], + [() => "ABCDE".substr(-2), "DE"], + [() => "ABCDE".substr(-2, 1), "D"], + [() => "ABCDE".substr(-100, 3), "ABC"], + [() => "ABCDE".substr(-100, 100), "ABCDE"], + [() => "ABCDE".substr(5), ""], + [() => "ABCDE".substr(100), ""], + [() => "ABCDE".substr(100, 100), ""], + [() => "ABCDE".substr(0, 1), "A"], + [() => "ABCDE".substr(4, 1), "E"], + [() => "ABCDE".substr(-1, 1), "E"], + [() => "ABCDE".substr(-5, 1), "A"], + // Identity (start=0 with span covering whole string) + [() => "ABCDE".substr(0, 5), "ABCDE"], + // Empty source string + [() => "".substr(0, 10), ""], + [() => "".substr(-1, 1), ""], + [() => "".substr(5, 1), ""], + // Unicode (constant string with surrogates) + [() => "𠮷野家".substr(0, 2), "𠮷"], + [() => "𠮷野家".substr(2, 99), "野家"], + [() => "𠮷野家".substr(-10, 10), "𠮷野家"], +]; + +for (const [fn, expected] of cases) + noInline(fn); + +for (let i = 0; i < testLoopCount; ++i) { + for (const [fn, expected] of cases) + shouldBe(fn(), expected); +} diff --git a/JSTests/stress/string-substr.js b/JSTests/stress/string-substr.js new file mode 100644 index 000000000000..d5a5c60444bc --- /dev/null +++ b/JSTests/stress/string-substr.js @@ -0,0 +1,122 @@ +function shouldBe(actual, expected) { + if (!Object.is(actual, expected)) { + throw new Error(`Bad value: ${actual}!`); + } +} + +for (var i = 0; i < testLoopCount; i++) { + // basic + const str = "ABCDE"; + shouldBe(str.substr(0, 5), str); + shouldBe(str.substr(0, 3), "ABC"); + shouldBe(str.substr(1, 3), "BCD"); + shouldBe(str.substr(2), "CDE"); + shouldBe(str.substr(2, 1), "C"); + shouldBe(str.substr(0), str); + + // length clamping + shouldBe(str.substr(2, 0), ""); + shouldBe(str.substr(2, 100), "CDE"); + shouldBe(str.substr(0, 100), str); + + // negative length + shouldBe(str.substr(2, -1), ""); + shouldBe(str.substr(0, -100), ""); + shouldBe(str.substr(-3, -1), ""); + + // negative start + shouldBe(str.substr(-2), "DE"); + shouldBe(str.substr(-2, 1), "D"); + shouldBe(str.substr(-2, 100), "DE"); + shouldBe(str.substr(-str.length), str); + shouldBe(str.substr(-str.length - 1), str); + shouldBe(str.substr(-100, 3), "ABC"); + shouldBe(str.substr(-100, 100), str); + + // out of range start + shouldBe(str.substr(5), ""); + shouldBe(str.substr(5, 1), ""); + shouldBe(str.substr(100), ""); + shouldBe(str.substr(100, 100), ""); + + // single-character fast path + shouldBe(str.substr(0, 1), "A"); + shouldBe(str.substr(4, 1), "E"); + shouldBe(str.substr(-1, 1), "E"); + shouldBe(str.substr(-5, 1), "A"); + + // NaN, Infinity + shouldBe(str.substr(NaN), str); + shouldBe(str.substr(NaN, NaN), ""); + shouldBe(str.substr(NaN, 2), "AB"); + shouldBe(str.substr(2, NaN), ""); + shouldBe(str.substr(Infinity), ""); + shouldBe(str.substr(-Infinity), str); + shouldBe(str.substr(0, Infinity), str); + shouldBe(str.substr(2, Infinity), "CDE"); + shouldBe(str.substr(Infinity, Infinity), ""); + shouldBe(str.substr(-Infinity, 2), "AB"); + shouldBe(str.substr(2, -Infinity), ""); + shouldBe(str.substr(-Infinity, -Infinity), ""); + shouldBe(str.substr(-Infinity, Infinity), str); + shouldBe(str.substr(Infinity, -Infinity), ""); + + // type cast + shouldBe(str.substr("1", "3"), "BCD"); + shouldBe(str.substr("a", "c"), ""); + shouldBe(str.substr(true, false), ""); + shouldBe(str.substr(true, true), "B"); + shouldBe(str.substr(null, undefined), str); + shouldBe(str.substr(undefined, null), ""); + shouldBe(str.substr("2", 2), "CD"); + shouldBe(str.substr(2, "2"), "CD"); + + // decimal number + shouldBe(str.substr(1.9, 2.2), "BC"); + shouldBe(str.substr(0.1, 0.9), ""); + shouldBe(str.substr(0.9, 1.1), "A"); + + // empty string + shouldBe("".substr(-10), ""); + shouldBe("".substr(0), ""); + shouldBe("".substr(10), ""); + shouldBe("".substr(0, 1), ""); + shouldBe("".substr(1, 1), ""); + shouldBe("".substr(-1, 2), ""); + + // unicode + const uni = "𠮷野家"; + shouldBe(uni.substr(0, 2), "𠮷"); + shouldBe(uni.substr(2, 99), "野家"); + shouldBe(uni.substr(-10, 10), "𠮷野家"); + + // emoji + const emoji = "🐟💨🍅🌈"; + shouldBe(emoji.substr(0, 2), "🐟"); + shouldBe(emoji.substr(2, 2), "💨"); + shouldBe(emoji.substr(0, 4), "🐟💨"); + shouldBe(emoji.substr(0, 0), ""); + shouldBe(emoji.substr(0), emoji); + shouldBe(emoji.substr(-Infinity, Infinity), emoji); + + // edge cases + shouldBe(str.substr(), str); + shouldBe(str.substr(undefined), str); + shouldBe(str.substr(null), str); + shouldBe(str.substr(undefined, undefined), str); + shouldBe(str.substr(0, 0), ""); + shouldBe(str.substr(0, -0), ""); + shouldBe(str.substr(-0, 0), ""); + shouldBe(str.substr(-0, -0), ""); + + // rope strings (force ConcatString path) + const rope = "foo" + (i & 1 ? "bar" : "baz"); + shouldBe(rope.substr(0, 3), "foo"); + shouldBe(rope.substr(3, 3), i & 1 ? "bar" : "baz"); + shouldBe(rope.substr(2, 1), "o"); + shouldBe(rope.substr(-3), i & 1 ? "bar" : "baz"); + shouldBe(rope.substr(2, 100), i & 1 ? "obar" : "obaz"); + shouldBe(rope.substr(100), ""); + shouldBe(rope.substr(2, 0), ""); + shouldBe(rope.substr(2, -1), ""); +} diff --git a/JSTests/stress/symbol-prototype-to-string-intrinsic.js b/JSTests/stress/symbol-prototype-to-string-intrinsic.js new file mode 100644 index 000000000000..c3dbe20d2a4f --- /dev/null +++ b/JSTests/stress/symbol-prototype-to-string-intrinsic.js @@ -0,0 +1,160 @@ +function shouldBe(actual, expected) +{ + if (actual !== expected) + throw new Error('bad value: ' + actual + ' (expected: ' + expected + ')'); +} + +function shouldThrow(func, errorType) +{ + let threw = false; + try { + func(); + } catch (e) { + threw = true; + if (!(e instanceof errorType)) + throw new Error('unexpected error: ' + e); + } + if (!threw) + throw new Error('did not throw'); +} + +// 1. SymbolUse fast path: repeated .toString() on a Symbol with a description. +(function () { + function test(sym) { + return sym.toString(); + } + noInline(test); + + const sym = Symbol("cocoa"); + for (let i = 0; i < testLoopCount; ++i) + shouldBe(test(sym), "Symbol(cocoa)"); +}()); + +// 2. SymbolUse fast path: Symbol with no description must stringify as "Symbol()". +(function () { + function test(sym) { + return sym.toString(); + } + noInline(test); + + const sym = Symbol(); + for (let i = 0; i < testLoopCount; ++i) + shouldBe(test(sym), "Symbol()"); +}()); + +// 3. Well-known symbols should tier up and return "Symbol(Symbol.iterator)" etc. +(function () { + function test(sym) { + return sym.toString(); + } + noInline(test); + + for (let i = 0; i < testLoopCount; ++i) { + shouldBe(test(Symbol.iterator), "Symbol(Symbol.iterator)"); + shouldBe(test(Symbol.asyncIterator), "Symbol(Symbol.asyncIterator)"); + shouldBe(test(Symbol.hasInstance), "Symbol(Symbol.hasInstance)"); + } +}()); + +// 4. Cached result must be stable across many invocations (same observable value). +(function () { + function test(sym) { + return sym.toString(); + } + noInline(test); + + const sym = Symbol("stable"); + const first = test(sym); + for (let i = 0; i < testLoopCount; ++i) + shouldBe(test(sym), first); +}()); + +// 5. String(symbol) goes through stringConstructor's symbol fast path and should +// match Symbol.prototype.toString.call(symbol). +(function () { + function viaString(sym) { + return String(sym); + } + function viaToString(sym) { + return sym.toString(); + } + noInline(viaString); + noInline(viaToString); + + const sym = Symbol("matcha"); + for (let i = 0; i < testLoopCount; ++i) { + shouldBe(viaString(sym), "Symbol(matcha)"); + shouldBe(viaString(sym), viaToString(sym)); + } +}()); + +// 6. Symbol.prototype.description must return undefined (not null) for a +// descriptionless Symbol, per ECMA-262 20.4.3.2. +(function () { + function desc(sym) { + return sym.description; + } + noInline(desc); + + const withDesc = Symbol("rize"); + const withoutDesc = Symbol(); + for (let i = 0; i < testLoopCount; ++i) { + shouldBe(desc(withDesc), "rize"); + shouldBe(desc(withoutDesc), undefined); + } +}()); + +// 7. Symbol.prototype.toString.call on a non-Symbol must throw TypeError. +// Exercises the generic (non-intrinsified) path and its OSR behavior. +(function () { + const toString = Symbol.prototype.toString; + function test(receiver) { + return toString.call(receiver); + } + noInline(test); + + for (let i = 0; i < testLoopCount; ++i) { + shouldThrow(() => test({}), TypeError); + shouldThrow(() => test("not a symbol"), TypeError); + shouldThrow(() => test(42), TypeError); + shouldThrow(() => test(undefined), TypeError); + } +}()); + +// 8. Symbol created from a non-string description (coerced via toString) should +// preserve the coerced description across repeated toString() calls. +(function () { + function test(sym) { + return sym.toString(); + } + noInline(test); + + const descriptor = { toString() { return "coerced"; } }; + const sym = Symbol(descriptor); + for (let i = 0; i < testLoopCount; ++i) + shouldBe(test(sym), "Symbol(coerced)"); +}()); + +// 9. OSR-exit path: feed a non-Symbol to a function that has tiered up on +// Symbols. The SymbolUse speculation must fail cleanly and the call must +// fall back to the generic toString (which throws TypeError for non-Symbol +// receivers when invoked via Symbol.prototype.toString.call). +(function () { + const toString = Symbol.prototype.toString; + function test(receiver) { + return toString.call(receiver); + } + noInline(test); + + const sym = Symbol("kilimanjaro"); + // Warm up on Symbol to encourage speculation. + for (let i = 0; i < testLoopCount; ++i) + shouldBe(test(sym), "Symbol(kilimanjaro)"); + + // Now hit the non-Symbol path. + shouldThrow(() => test({}), TypeError); + + // And make sure the Symbol path still works after OSR exit. + for (let i = 0; i < testLoopCount; ++i) + shouldBe(test(sym), "Symbol(kilimanjaro)"); +}()); diff --git a/JSTests/stress/typedarray-constructor-allocatetypedarray-before-isdetachedbuffer-prototype-getter-detach.js b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-isdetachedbuffer-prototype-getter-detach.js new file mode 100644 index 000000000000..228e9fb31fd7 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-isdetachedbuffer-prototype-getter-detach.js @@ -0,0 +1,78 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +class ExpectedError extends Error { } + +function ConstructorWithThrowingPrototype(detach) { + return Object.defineProperty(function () { }.bind(null), "prototype", { + get() { + if (detach) + detach(); + throw new ExpectedError(); + } + }); +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer, detach } of createBuffers()) { + // the step 7-a |AllocateTypedArray| of https://tc39.es/ecma262/2026/#sec-typedarray + // should be executed before the step 6 |IsDetachedBuffer(buffer)| of https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // + // Variant: if the buffer is detached in |AllocateTypedArray|. + const constructor = ConstructorWithThrowingPrototype(detach); + shouldThrow(label, () => { + Reflect.construct(Ctor, [buffer, 0, 0], constructor); + }, ExpectedError, ''); + } +} diff --git a/JSTests/stress/typedarray-constructor-allocatetypedarray-before-isdetachedbuffer.js b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-isdetachedbuffer.js new file mode 100644 index 000000000000..1f8c59ac3b11 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-isdetachedbuffer.js @@ -0,0 +1,76 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +class ExpectedError extends Error { } + +function ConstructorWithThrowingPrototype(detach) { + return Object.defineProperty(function () { }.bind(null), "prototype", { + get() { + if (detach) + detach(); + throw new ExpectedError(); + } + }); +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer } of createBuffers()) { + // the step 7-a |AllocateTypedArray| of https://tc39.es/ecma262/2026/#sec-typedarray + // should be executed before the step 6 |IsDetachedBuffer(buffer)| of https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + const constructor = ConstructorWithThrowingPrototype(); + shouldThrow(label, () => { + Reflect.construct(Ctor, [buffer, 0, 0], constructor); + }, ExpectedError, ''); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-allocatetypedarray-before-toindex-byteoffset.js b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-toindex-byteoffset.js new file mode 100644 index 000000000000..b32684283b75 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-toindex-byteoffset.js @@ -0,0 +1,84 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +const poisonedValue = new Proxy({}, new Proxy({}, { + get() { + // Throws an exception when any proxy trap is invoked. + throw new Error("Poisoned Value"); + } +})); + +class ExpectedError extends Error { } + +function ConstructorWithThrowingPrototype(detach) { + return Object.defineProperty(function () { }.bind(null), "prototype", { + get() { + if (detach) + detach(); + throw new ExpectedError(); + } + }); +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer } of createBuffers()) { + const constructor = ConstructorWithThrowingPrototype(); + + // the step 7-a |AllocateTypedArray| of https://tc39.es/ecma262/2026/#sec-typedarray + // should be executed before the step 2 |ToIndex(byteOffset)| of https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + shouldThrow(label, () => { + Reflect.construct(Ctor, [buffer, poisonedValue, 0], constructor); + }, ExpectedError, ''); + } +} diff --git a/JSTests/stress/typedarray-constructor-allocatetypedarray-before-toindex-length.js b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-toindex-length.js new file mode 100644 index 000000000000..8ccf74744f40 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-allocatetypedarray-before-toindex-length.js @@ -0,0 +1,84 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +const poisonedValue = new Proxy({}, new Proxy({}, { + get() { + // Throws an exception when any proxy trap is invoked. + throw new Error("Poisoned Value"); + } +})); + +class ExpectedError extends Error { } + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ConstructorWithThrowingPrototype(detach) { + return Object.defineProperty(function(){}.bind(null), "prototype", { + get() { + if (detach) + detach(); + throw new ExpectedError(); + } + }); +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer } of createBuffers()) { + const constructor = ConstructorWithThrowingPrototype(); + + // the step 7-a |AllocateTypedArray| of https://tc39.es/ecma262/2026/#sec-typedarray + // should be executed before the step 5-a |ToIndex(length)| of https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + shouldThrow(label, () => { + Reflect.construct(Ctor, [buffer, 0, poisonedValue], constructor) + }, ExpectedError, ''); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-isdetachedbuffer-weird-byteoffset.js b/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-isdetachedbuffer-weird-byteoffset.js new file mode 100644 index 000000000000..46b269a3de5e --- /dev/null +++ b/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-isdetachedbuffer-weird-byteoffset.js @@ -0,0 +1,86 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + // Int8Array, + Uint16Array, + Uint32Array, + // Uint8Array, + // Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + assert(Ctor.BYTES_PER_ELEMENT !== 1, `${label}: |byteOffset % 1| is always 0. We cannot test what we want to test`); + + for (const { buffer, detach } of createBuffers()) { + const byteOffset = ValueReturning(1, detach); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // + // the step 3 |offset modulo elementSize ≠ 0| should be executed before the step 6 |IsDetachedBuffer(buffer)|. + // + // Variant: The step 2 |ToIndex(byteOffset)| detach the buffer. + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, 0); + }, RangeError, "byteOffset modulo TypedArray.BYTES_PER_ELEMENT must be 0"); + } +} + diff --git a/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-isdetachedbuffer.js b/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-isdetachedbuffer.js new file mode 100644 index 000000000000..2cc735c44f17 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-isdetachedbuffer.js @@ -0,0 +1,83 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + // Int8Array, + Uint16Array, + Uint32Array, + // Uint8Array, + // Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + assert(Ctor.BYTES_PER_ELEMENT !== 1, `${label}: |byteOffset % 1| is always 0. We cannot test what we want to test`); + + for (const { buffer, detach } of createBuffers()) { + detach(); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // + // the step 3 |offset modulo elementSize ≠ 0| should be executed before the step 6 |IsDetachedBuffer(buffer)|. + shouldThrow(label, () => { + new Ctor(buffer, 1, 0); + }, RangeError, "byteOffset modulo TypedArray.BYTES_PER_ELEMENT must be 0"); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-toindex-length.js b/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-toindex-length.js new file mode 100644 index 000000000000..d57be517fb8b --- /dev/null +++ b/JSTests/stress/typedarray-constructor-byteoffset-modulo-elementsize-before-toindex-length.js @@ -0,0 +1,78 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +const poisonedValue = new Proxy({}, new Proxy({}, { + get() { + // Throws an exception when any proxy trap is invoked. + throw new Error("Poisoned Value"); + } +})); + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + // Int8Array, + Uint16Array, + Uint32Array, + // Uint8Array, + // Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + assert(Ctor.BYTES_PER_ELEMENT !== 1, `${label}: |byteOffset % 1| is always 0. We cannot test what we want to test`); + + for (const { buffer } of createBuffers()) { + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // + // the step 3 |offset modulo elementSize ≠ 0| should be executed before the step 5.a |ToIndex(length)|. + shouldThrow(label, () => { + new Ctor(buffer, 1, poisonedValue); + }, RangeError, 'byteOffset modulo TypedArray.BYTES_PER_ELEMENT must be 0'); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-isdetachbuffer-before-bufferbytelength-modulo-elementsize-weird-byteoffset-detach.js b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-bufferbytelength-modulo-elementsize-weird-byteoffset-detach.js new file mode 100644 index 000000000000..685ea1f26241 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-bufferbytelength-modulo-elementsize-weird-byteoffset-detach.js @@ -0,0 +1,85 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + //Int8Array, + Uint16Array, + Uint32Array, + //Uint8Array, + //Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + assert(Ctor.BYTES_PER_ELEMENT !== 1, `${label}: |bufferByteLength % 1| is always 0. We cannot test what we want to test`); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 6 |IsDetachedBuffer(buffer)| should be executed + // before the step 9-a-i |bufferByteLength modulo elementSize ≠ 0|. + // + // Variant: the step 2 |ToIndex(byteOffset)| detach the buffer. + for (const { buffer, detach } of createBuffers([1, 9])) { + const byteOffset = ValueReturning(0, detach); + + shouldThrow(label, () => { + new Ctor(buffer, byteOffset); + }, TypeError, "Buffer is already detached"); + } +} + diff --git a/JSTests/stress/typedarray-constructor-isdetachbuffer-before-bufferbytelength-modulo-elementsize.js b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-bufferbytelength-modulo-elementsize.js new file mode 100644 index 000000000000..99788eca2f75 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-bufferbytelength-modulo-elementsize.js @@ -0,0 +1,73 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + //Int8Array, + Uint16Array, + Uint32Array, + //Uint8Array, + //Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + assert(Ctor.BYTES_PER_ELEMENT !== 1, `${label}: |bufferByteLength % 1| is always 0. We cannot test what we want to test`); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 6 |IsDetachedBuffer(buffer)| should be executed + // before the step 9-a-i |bufferByteLength modulo elementSize ≠ 0|. + for (const { buffer, detach } of createBuffers([1, 9])) { + detach(); + + shouldThrow(label, () => { + new Ctor(buffer, 0); + }, TypeError, "Buffer is already detached"); + } +} + diff --git a/JSTests/stress/typedarray-constructor-isdetachbuffer-before-newbytelength-lt-0-weird-byteoffset.js b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-newbytelength-lt-0-weird-byteoffset.js new file mode 100644 index 000000000000..4f4d8d2d87a8 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-newbytelength-lt-0-weird-byteoffset.js @@ -0,0 +1,87 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + const byteOffset = 64; + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 6 |IsDetachedBuffer(buffer)| should be executed + // before the step 9-a-iii |newByteLength < 0|. + // + // Variant: the step 2 |ToIndex(byteOffset)| detach the buffer. + for (const { buffer, detach } of createBuffers()) { + assert(buffer.byteLength - byteOffset < 0, `${label}: newByteLength |bufferByteLength - offset| condition is expected`); + + const weirdByteOffset = ValueReturning(byteOffset, detach); + shouldThrow(label, () => { + new Ctor(buffer, weirdByteOffset); + }, TypeError, "Buffer is already detached"); + } +} + diff --git a/JSTests/stress/typedarray-constructor-isdetachbuffer-before-newbytelength-lt-0.js b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-newbytelength-lt-0.js new file mode 100644 index 000000000000..0a1db252eb87 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-newbytelength-lt-0.js @@ -0,0 +1,112 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +const poisonedValue = new Proxy({}, new Proxy({}, { + get() { + // Throws an exception when any proxy trap is invoked. + throw new Error("Poisoned Value"); + } +})); + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ConstructorWithThrowingPrototype(detach) { + return Object.defineProperty(function(){}.bind(null), "prototype", { + get() { + if (detach) + detach(); + throw new ExpectedError(); + } + }); +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + const byteOffset = 64; + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 6 |IsDetachedBuffer(buffer)| should be executed + // before the step 9-a-iii |newByteLength < 0|. + for (const { buffer, detach } of createBuffers()) { + assert(buffer.byteLength - byteOffset < 0, `${label}: newByteLength |bufferByteLength - offset| condition is expected`); + + detach(); + + shouldThrow(label, () => { + new Ctor(buffer, byteOffset); + }, TypeError, "Buffer is already detached"); + } +} diff --git a/JSTests/stress/typedarray-constructor-isdetachbuffer-before-offset+newbytelength-gt-bufferbytelength-byteoffset-too-large.js b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-offset+newbytelength-gt-bufferbytelength-byteoffset-too-large.js new file mode 100644 index 000000000000..ca917a3811ef --- /dev/null +++ b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-offset+newbytelength-gt-bufferbytelength-byteoffset-too-large.js @@ -0,0 +1,119 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +const poisonedValue = new Proxy({}, new Proxy({}, { + get() { + // Throws an exception when any proxy trap is invoked. + throw new Error("Poisoned Value"); + } +})); + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ConstructorWithThrowingPrototype(detach) { + return Object.defineProperty(function(){}.bind(null), "prototype", { + get() { + if (detach) + detach(); + throw new ExpectedError(); + } + }); +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + const byteOffset = 64; + const length = 0; + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 6 |IsDetachedBuffer(buffer)| should be executed + // before the step 9-b-ii |offset+newByteLength > bufferByteLength|. + // + // Variant: The given byteOffset is too large. + for (const { buffer, detach } of createBuffers()) { + { + // the step 9-b-i + const newByteLength = length * Ctor.BYTES_PER_ELEMENT; + assert((byteOffset + newByteLength) > buffer.byteLength, `${label}: |offset+newByteLength > bufferByteLength| is expected`); + } + + const weirdLength = ValueReturning(length, detach);; + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, weirdLength); + }, TypeError, "Buffer is already detached"); + } +} diff --git a/JSTests/stress/typedarray-constructor-isdetachbuffer-before-offset+newbytelength-gt-bufferbytelength-length-too-large.js b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-offset+newbytelength-gt-bufferbytelength-length-too-large.js new file mode 100644 index 000000000000..d15f267cba00 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-isdetachbuffer-before-offset+newbytelength-gt-bufferbytelength-length-too-large.js @@ -0,0 +1,98 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function assert(ok, message = '') { + if (!ok) + throw new Error(`Assertion!: ${message}`); +} + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +const poisonedValue = new Proxy({}, new Proxy({}, { + get() { + // Throws an exception when any proxy trap is invoked. + throw new Error("Poisoned Value"); + } +})); + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + const byteOffset = 0; + const length = 64; + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 6 |IsDetachedBuffer(buffer)| should be executed + // before the step 9-b-ii |offset+newByteLength > bufferByteLength|. + // + // Variant: The given length is too large + for (const { buffer, detach } of createBuffers()) { + { + // the step 9-b-i + const newByteLength = length * Ctor.BYTES_PER_ELEMENT; + assert((byteOffset + newByteLength) > buffer.byteLength, `${label}: |offset+newByteLength > bufferByteLength| is expected`); + } + + const weirdLength = ValueReturning(length, detach);; + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, weirdLength); + }, TypeError, "Buffer is already detached"); + } +} diff --git a/JSTests/stress/typedarray-constructor-toindex-byteoffset-before-isdetachedbuffer-weird-byteoffset-detach.js b/JSTests/stress/typedarray-constructor-toindex-byteoffset-before-isdetachedbuffer-weird-byteoffset-detach.js new file mode 100644 index 000000000000..0158594c7d45 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-toindex-byteoffset-before-isdetachedbuffer-weird-byteoffset-detach.js @@ -0,0 +1,79 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +class ExpectedError extends Error { } + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // Ensure the step 2 |ToIndex(byteOffset)| should be executed before step 6 |IsDetachedBuffer(buffer)|. + // + // Variant: ToIndex(byteOffset) detach the buffer. + for (const { buffer, detach } of createBuffers()) { + const byteOffset = ValueThrowing(detach); + + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, 0) + }, ExpectedError, ''); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-toindex-byteoffset-before-isdetachedbuffer.js b/JSTests/stress/typedarray-constructor-toindex-byteoffset-before-isdetachedbuffer.js new file mode 100644 index 000000000000..7ba7aace7a97 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-toindex-byteoffset-before-isdetachedbuffer.js @@ -0,0 +1,78 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +class ExpectedError extends Error { } + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer, detach } of createBuffers()) { + detach(); + const byteOffset = ValueThrowing(); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // Ensure the step 2 |ToIndex(byteOffset)| should be executed before step 6 |IsDetachedBuffer(buffer)|. + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, 0); + }, ExpectedError, ''); + } +} diff --git a/JSTests/stress/typedarray-constructor-toindex-byteoffset-detach-buffer.js b/JSTests/stress/typedarray-constructor-toindex-byteoffset-detach-buffer.js new file mode 100644 index 000000000000..5be625365b69 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-toindex-byteoffset-detach-buffer.js @@ -0,0 +1,76 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + // if the step 2 |ToIndex(byteOffset)| detaches the array buffer, + // the step 6 |IsDetachedBuffer(buffer)| should catch it. + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + for (const { buffer, detach } of createBuffers()) { + const byteOffset = ValueReturning(0, detach); + + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, 0) + }, TypeError, 'Buffer is already detached'); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer-weird-byteoffset-detach.js b/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer-weird-byteoffset-detach.js new file mode 100644 index 000000000000..66d0d3db9430 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer-weird-byteoffset-detach.js @@ -0,0 +1,90 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +class ExpectedError extends Error { } + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer, detach } of createBuffers()) { + const byteOffset = ValueReturning(0, detach); + const length = ValueThrowing(); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 5.a |ToIndex(length)| should be executed before step 6 |IsDetachedBuffer(buffer)|. + // + // Variant: the step 2 |ToIndex(byteOffset)| detach the buffer. + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, length); + }, ExpectedError, ''); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer-weird-length-detach.js b/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer-weird-length-detach.js new file mode 100644 index 000000000000..420c0315d89f --- /dev/null +++ b/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer-weird-length-detach.js @@ -0,0 +1,80 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +class ExpectedError extends Error { } + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer, detach } of createBuffers()) { + const byteOffset = 0; + const length = ValueThrowing(detach); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 5.a |ToIndex(length)| should be executed before the step 6 |IsDetachedBuffer(buffer)|. + // + // Variant: the step 5.a |ToIndex(length)| detach the buffer. + shouldThrow(label, () => { + new Ctor(buffer, byteOffset, length); + }, ExpectedError, ''); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer.js b/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer.js new file mode 100644 index 000000000000..4080f0465928 --- /dev/null +++ b/JSTests/stress/typedarray-constructor-toindex-length-before-isdetachedbuffer.js @@ -0,0 +1,78 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +class ExpectedError extends Error { } + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueThrowing(detach) { + return { + valueOf() { + if (detach) + detach(); + throw new ExpectedError(); + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer, detach } of createBuffers()) { + detach(); + const length = ValueThrowing(); + + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // the step 5.a |ToIndex(length)| should be executed before the step 6 |IsDetachedBuffer(buffer)|. + shouldThrow(label, () => { + new Ctor(buffer, 0, length); + }, ExpectedError, ''); + } +} \ No newline at end of file diff --git a/JSTests/stress/typedarray-constructor-toindex-length-detach-buffer.js b/JSTests/stress/typedarray-constructor-toindex-length-detach-buffer.js new file mode 100644 index 000000000000..0958a6928c3e --- /dev/null +++ b/JSTests/stress/typedarray-constructor-toindex-length-detach-buffer.js @@ -0,0 +1,77 @@ +// The original is https://github.com/tc39/test262/blob/d0c1b4555b03dd404873fd6422a4b5da00136500/test/staging/sm/TypedArray/constructor-buffer-sequence.js + +function shouldThrow(caseName, fn, expectedErrorCtor, expectedErrorMessage) { + if (!caseName) + throw new Error(`must specify test case name`); + + const expected = `${expectedErrorCtor.name}(${expectedErrorMessage})`; + try { + fn(); + throw new Error(`${caseName}: Expected to throw ${expected}, but succeeded`); + } catch (e) { + const actual = `${e.name}(${e.message})`; + if (!(e instanceof expectedErrorCtor) || e.message !== expectedErrorMessage) + throw new Error(`${caseName}: Expected ${expected} but got ${actual}`); + } +} + +const otherGlobal = $.createRealm().global; + +class ExpectedError extends Error { } + +function* createBuffers(lengths = [0, 8]) { + for (const length of lengths) { + const buffer = new ArrayBuffer(length); + yield { + buffer, + detach: () => $.detachArrayBuffer(buffer), + }; + } + + for (const length of lengths) { + const buffer = new otherGlobal.ArrayBuffer(length); + yield { + buffer, + detach: () => otherGlobal.$.detachArrayBuffer(buffer), + }; + } +} + +function ValueReturning(value, detach) { + return { + valueOf() { + if (detach) + detach(); + return value; + } + }; +} + +const TEST_TARGET = [ + BigInt64Array, + BigUint64Array, + Float16Array, + Float32Array, + Float64Array, + Int16Array, + Int32Array, + Int8Array, + Uint16Array, + Uint32Array, + Uint8Array, + Uint8ClampedArray, +]; + +for (const Ctor of TEST_TARGET) { + const label = Ctor.name; + + for (const { buffer, detach } of createBuffers()) { + // https://tc39.es/ecma262/2026/#sec-initializetypedarrayfromarraybuffer + // If the step 5-a |ToIndex(length)| of detach the buffer, + // the step 6 |IsDetachedBuffer(buffer)| should catch it. + const length = ValueReturning(0, detach); + shouldThrow(label, () => { + new Ctor(buffer, 0, length); + }, TypeError, 'Buffer is already detached'); + } +} \ No newline at end of file diff --git a/JSTests/test262/config.yaml b/JSTests/test262/config.yaml index c4533fa7254b..db107751fd1b 100644 --- a/JSTests/test262/config.yaml +++ b/JSTests/test262/config.yaml @@ -20,67 +20,6 @@ skip: - await-dictionary - import-bytes paths: - # Dynamic import.defer() is not yet implemented. - - test/language/expressions/dynamic-import/import-defer - - test/language/import/import-defer/deferred-namespace-object/identity.js - - test/language/expressions/dynamic-import/catch/nested-arrow-import-catch-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-async-arrow-function-await-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-async-arrow-function-return-await-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-async-function-await-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-async-function-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-async-function-return-await-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-async-gen-await-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-block-import-catch-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-block-labeled-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-do-while-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-else-import-catch-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-function-import-catch-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-if-import-catch-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/nested-while-import-catch-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/catch/top-level-import-catch-import-defer-specifier-tostring-abrupt-rejects.js - - test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-block-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-block-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-else-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-else-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-function-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-function-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-if-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-if-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-while-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-while-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/nested-with-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/nested-with-import-defer-script-code-valid.js - - test/language/expressions/dynamic-import/syntax/valid/top-level-import-defer-empty-str-is-valid-assign-expr.js - - test/language/expressions/dynamic-import/syntax/valid/top-level-import-defer-script-code-valid.js # 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 # Incorrect tests, see https://github.com/tc39/test262/issues/4980 diff --git a/JSTests/test262/expectations.yaml b/JSTests/test262/expectations.yaml index 1f0b6e4bdd8a..c96db0a530dd 100644 --- a/JSTests/test262/expectations.yaml +++ b/JSTests/test262/expectations.yaml @@ -894,9 +894,6 @@ test/staging/sm/RegExp/unicode-braced.js: test/staging/sm/RegExp/unicode-class-braced.js: default: 'SyntaxError: Invalid regular expression: regular expression too large' strict mode: 'SyntaxError: Invalid regular expression: regular expression too large' -test/staging/sm/TypedArray/constructor-buffer-sequence.js: - default: 'Test262Error: Expected a ExpectedError but got a Error' - strict mode: 'Test262Error: Expected a ExpectedError but got a Error' 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. ' diff --git a/JSTests/wasm/stress/lazy-table-copy-preserves-laziness.js b/JSTests/wasm/stress/lazy-table-copy-preserves-laziness.js new file mode 100644 index 000000000000..cabe51ef6b95 --- /dev/null +++ b/JSTests/wasm/stress/lazy-table-copy-preserves-laziness.js @@ -0,0 +1,67 @@ +import { instantiate } from "../wabt-wrapper.js" +import * as assert from "../assert.js" + +// table.copy moves entries between slots without forcing the JS-side +// representation of a slot to be observed. After copying, the destination +// slots behave identically to the source slots: call_indirect works on them, +// table.get returns the same function object as the source, and ref.func to +// the same function also matches. + +let wat = ` +(module + (type $sig (func (param i32) (result i32))) + (table $t (export "t") 16 16 funcref) + (elem (i32.const 0) $a $b $c $d) + + (func $a (param i32) (result i32) (i32.add (local.get 0) (i32.const 1))) + (func $b (param i32) (result i32) (i32.add (local.get 0) (i32.const 2))) + (func $c (param i32) (result i32) (i32.add (local.get 0) (i32.const 3))) + (func $d (param i32) (result i32) (i32.add (local.get 0) (i32.const 4))) + + (func (export "doCopy") + (table.copy (i32.const 8) (i32.const 0) (i32.const 4))) + + (func (export "callIndirect") (param i32 i32) (result i32) + (call_indirect (type $sig) (local.get 1) (local.get 0))) + + (func (export "refSrc") (result funcref) (ref.func $a)) +) +` + +async function test() { + const { t, doCopy, callIndirect, refSrc } = (await instantiate(wat, {}, {})).exports + + // Copy slots 0..3 to 8..11. Nothing has been observed from JS yet. + doCopy() + + // call_indirect works on the copied slots. + assert.eq(callIndirect(8, 100), 101) // $a + assert.eq(callIndirect(9, 100), 102) // $b + assert.eq(callIndirect(10, 100), 103) // $c + assert.eq(callIndirect(11, 100), 104) // $d + + // Observing the destination first still produces a callable function. + const aFromDst = t.get(8) + assert.eq(typeof aFromDst, "function") + assert.eq(aFromDst(50), 51) + + // Source and destination of the copy refer to the same function and + // therefore return the same function object. + const aFromSrc = t.get(0) + assert.eq(aFromSrc === aFromDst, true) + assert.eq(refSrc() === aFromDst, true) + + // A different function in the copied range gives a different object, + // and source/destination identity holds for it too. + const bFromDst = t.get(9) + assert.eq(bFromDst !== aFromDst, true) + assert.eq(t.get(1) === bFromDst, true) + assert.eq(bFromDst(50), 52) + + fullGC() + assert.eq(t.get(8) === aFromDst, true) + assert.eq(callIndirect(11, 0), 4) + assert.eq(t.get(11)(0), 4) +} + +await assert.asyncTest(test()) diff --git a/JSTests/wasm/stress/lazy-table-cross-instance.js b/JSTests/wasm/stress/lazy-table-cross-instance.js new file mode 100644 index 000000000000..a8ceebf27124 --- /dev/null +++ b/JSTests/wasm/stress/lazy-table-cross-instance.js @@ -0,0 +1,68 @@ +import { compile } from "../wabt-wrapper.js" +import * as assert from "../assert.js" + +// When module A imports module B's table and re-exports it, JS observing the +// table through A must produce the same function objects as observing it +// through B, and calling those functions must execute B's code. call_indirect +// through the imported table must also work without ever observing the slot +// from JS. + +let watB = ` +(module + (table $t (export "t") 2 2 funcref) + (elem (i32.const 0) $foo $bar) + + (func $foo (export "foo") (param i32) (result i32) + (i32.add (local.get 0) (i32.const 1000))) + + (func $bar (export "bar") (param i32) (result i32) + (i32.add (local.get 0) (i32.const 2000))) +) +` + +let watA = ` +(module + (type $sig (func (param i32) (result i32))) + (import "B" "t" (table $t 2 2 funcref)) + (export "t" (table $t)) + + (func (export "callViaImportedTable") (param i32 i32) (result i32) + (call_indirect (type $sig) (local.get 1) (local.get 0))) +) +` + +async function test() { + const moduleB = await compile(watB) + const moduleA = await compile(watA) + + const instB = new WebAssembly.Instance(moduleB) + const instA = new WebAssembly.Instance(moduleA, { B: { t: instB.exports.t } }) + + // call_indirect through the imported table on never-observed slots. + assert.eq(instA.exports.callViaImportedTable(0, 5), 1005) + assert.eq(instA.exports.callViaImportedTable(1, 5), 2005) + + // Re-exported table aliases B's table. + assert.eq(instA.exports.t, instB.exports.t) + + // Reading from A's exported table returns B's exported function objects, + // and calling them executes B's code. + const fooFromA = instA.exports.t.get(0) + assert.eq(fooFromA === instB.exports.foo, true) + assert.eq(fooFromA(7), 1007) + + const barFromA = instA.exports.t.get(1) + assert.eq(barFromA === instB.exports.bar, true) + assert.eq(barFromA(7), 2007) + + // call_indirect continues to work after JS has observed the slots. + assert.eq(instA.exports.callViaImportedTable(0, 9), 1009) + + // Identity and behavior survive GC. + fullGC() + assert.eq(instA.exports.t.get(0) === instB.exports.foo, true) + assert.eq(instA.exports.t.get(0)(11), 1011) + assert.eq(instA.exports.callViaImportedTable(1, 11), 2011) +} + +await assert.asyncTest(test()) diff --git a/JSTests/wasm/stress/lazy-table-identity-across-paths.js b/JSTests/wasm/stress/lazy-table-identity-across-paths.js new file mode 100644 index 000000000000..13527725fe06 --- /dev/null +++ b/JSTests/wasm/stress/lazy-table-identity-across-paths.js @@ -0,0 +1,42 @@ +import { instantiate } from "../wabt-wrapper.js" +import * as assert from "../assert.js" + +// All three ways of getting a funcref for the same internal function should +// produce the same function object: +// 1. the exports object +// 2. ref.func from wasm +// 3. table.get from JS + +let wat = ` +(module + (table $t (export "t") 1 1 funcref) + (elem (i32.const 0) $foo) + + (func $foo (export "foo") (param i32) (result i32) + (i32.add (local.get 0) (i32.const 100))) + + (func (export "refToFoo") (result funcref) + (ref.func $foo)) +) +` + +async function test() { + const { t, foo, refToFoo } = (await instantiate(wat, {}, {})).exports + + assert.eq(foo(1), 101) + + const fromRefFunc = refToFoo() + assert.eq(fromRefFunc === foo, true) + + const fromTable = t.get(0) + assert.eq(fromTable === foo, true) + assert.eq(fromTable === fromRefFunc, true) + + // Identity holds across GC. + fullGC() + assert.eq(t.get(0) === foo, true) + assert.eq(refToFoo() === foo, true) + assert.eq(t.get(0)(5), 105) +} + +await assert.asyncTest(test()) diff --git a/JSTests/wasm/stress/lazy-table-wrappers.js b/JSTests/wasm/stress/lazy-table-wrappers.js new file mode 100644 index 000000000000..1d202d9a4a37 --- /dev/null +++ b/JSTests/wasm/stress/lazy-table-wrappers.js @@ -0,0 +1,63 @@ +import { instantiate } from "../wabt-wrapper.js" +import * as assert from "../assert.js" + +// Funcref tables initialized by an element segment are usable from both wasm +// (call_indirect) and JS (table.get), and the wrappers returned by table.get +// keep stable identity across repeated reads and across GC. + +let wat = ` +(module + (type $sig (func (param i32) (result i32))) + (table (export "t") 4 4 funcref) + (elem (i32.const 0) $a $b $c $d) + + (func $a (param i32) (result i32) (i32.add (local.get 0) (i32.const 10))) + (func $b (param i32) (result i32) (i32.add (local.get 0) (i32.const 20))) + (func $c (param i32) (result i32) (i32.add (local.get 0) (i32.const 30))) + (func $d (param i32) (result i32) (i32.add (local.get 0) (i32.const 40))) + + (func (export "callIndirect") (param i32 i32) (result i32) + (call_indirect (type $sig) (local.get 1) (local.get 0)) + ) +) +` + +async function test() { + const { t, callIndirect } = (await instantiate(wat, {}, {})).exports + + // call_indirect on slots that have never been observed from JS. + assert.eq(callIndirect(0, 5), 15) + assert.eq(callIndirect(1, 5), 25) + assert.eq(callIndirect(2, 5), 35) + assert.eq(callIndirect(3, 5), 45) + + // First JS observation: the slot becomes a callable function. + const f0a = t.get(0) + assert.eq(typeof f0a, "function") + assert.eq(f0a(7), 17) + + // Repeated reads of the same slot return the same function object. + const f0b = t.get(0) + assert.eq(f0a === f0b, true) + + // Different slots are distinct functions. + const f1 = t.get(1) + assert.eq(f1 !== f0a, true) + assert.eq(f1(7), 27) + + // Identity survives GC. + fullGC() + assert.eq(t.get(0) === f0a, true) + assert.eq(t.get(1) === f1, true) + + // call_indirect still works after JS has observed (and after GC). + assert.eq(callIndirect(0, 100), 110) + assert.eq(callIndirect(2, 100), 130) + + // Storing a funcref via JS makes table.get return the very object set. + t.set(2, f0a) + assert.eq(t.get(2) === f0a, true) + assert.eq(callIndirect(2, 5), 15) +} + +await assert.asyncTest(test()) diff --git a/JSTests/wasm/stress/pglite.js b/JSTests/wasm/stress/pglite.js new file mode 100644 index 000000000000..9db88519179a --- /dev/null +++ b/JSTests/wasm/stress/pglite.js @@ -0,0 +1,98 @@ +//@ memoryHog! +//@ skip if $memoryLimited +//@ runDefaultWasm + +// PGlite (PostgreSQL 17.5 compiled to wasm via Emscripten) running in the jsc shell. +// This is a heavy real-world wasm module (~8.5 MB, ~11k functions, dynamic linking, +// setjmp/longjmp, memory growth) — a good integration stress test for the wasm +// pipeline: compilation, IPInt/BBQ/OMG tier-up, indirect calls, traps, and GC. +// +// The test cases below are ported from Bun's pglite test suite +// (test/js/third_party/@electric-sql/pglite/pglite.test.ts and +// test/js/third_party/pg-gateway/pglite.test.ts), driving the wasm module +// directly via the PostgreSQL wire protocol instead of through Bun's networking +// stack. See resources/pglite/jsc-harness.js for the shim layer. + +load("./resources/pglite/jsc-harness.js"); + +function shouldBe(actual, expected, msg) { + if (JSON.stringify(actual) !== JSON.stringify(expected)) + throw new Error(`${msg}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`); +} + +function shouldThrow(fn, code, msg) { + let threw = false; + try { fn(); } catch (e) { threw = true; if (code && e.code !== code) throw new Error(`${msg}: expected code ${code}, got ${e.code} (${e.message})`); } + if (!threw) throw new Error(`${msg}: expected to throw`); +} + +asyncTestStart(1); + +(async () => { + const db = await startPGlite("./resources/pglite"); + + // --- Bun test 1: pglite.test.ts "can initialize successfully" --- + { + const { rows, fields } = db.query("SELECT version();"); + shouldBe(fields, [{ name: "version", dataTypeID: 25 }], "version() field"); + if (!/^PostgreSQL 17\.\d+ on \S+, compiled by emcc /.test(rows[0][0])) + throw new Error("Unexpected version(): " + rows[0][0]); + } + + // --- Bun test 2: pg-gateway/pglite.test.ts (wasm-relevant parts) --- + // Set up the same schema and data the Bun test uses. + db.query(` + CREATE TABLE IF NOT EXISTS test_table ( + id SERIAL PRIMARY KEY, + name TEXT NOT NULL + ); + INSERT INTO test_table (name) VALUES ('Test 1'), ('Test 2'), ('Test 3'); + `); + + // "prepared statement without parameters" — extended query protocol, no params. + { + const { rows } = db.queryParams("SELECT * FROM test_table WHERE id = 1"); + shouldBe(rows, [["1", "Test 1"]], "prepared no-param"); + } + + // "using prepared statement" — extended query protocol with a parameter. + { + const { rows } = db.queryParams("SELECT * FROM test_table WHERE id = $1", [1]); + shouldBe(rows, [["1", "Test 1"]], "prepared with param"); + } + + // "using simple query" — simple query protocol. + { + const { rows } = db.query("SELECT * FROM test_table WHERE id = 1"); + shouldBe(rows, [["1", "Test 1"]], "simple query"); + } + + // "using unsafe with parameters" — same wire protocol path as queryParams. + { + const { rows } = db.queryParams("SELECT * FROM test_table WHERE id = $1", ["1"]); + shouldBe(rows, [["1", "Test 1"]], "unsafe with param"); + } + + // Extra coverage: verify ordering / multi-row / aggregates / errors. + { + const { rows } = db.query("SELECT id, name FROM test_table ORDER BY id DESC"); + shouldBe(rows, [["3", "Test 3"], ["2", "Test 2"], ["1", "Test 1"]], "order by desc"); + } + { + const { rows } = db.query("SELECT count(*)::int, min(id)::int, max(id)::int FROM test_table"); + shouldBe(rows, [["3", "1", "3"]], "aggregates"); + } + { + // Errors propagate through the wire protocol with a SQLSTATE code. + shouldThrow(() => db.query("SELECT * FROM no_such_table"), "42P01", "undefined table"); + // Backend recovers after an error. + const { rows } = db.query("SELECT 1::int"); + shouldBe(rows, [["1"]], "recover after error"); + } + + db.close(); + asyncTestPassed(); +})().catch((e) => { + print("FAIL: " + e + "\n" + (e && e.stack || "")); + // Fall through without calling asyncTestPassed() => non-zero exit. +}); diff --git a/JSTests/wasm/stress/resources/pglite/LICENSE.Emscripten b/JSTests/wasm/stress/resources/pglite/LICENSE.Emscripten new file mode 100644 index 000000000000..70cabe388d27 --- /dev/null +++ b/JSTests/wasm/stress/resources/pglite/LICENSE.Emscripten @@ -0,0 +1,102 @@ +Emscripten is available under 2 licenses, the MIT license and the +University of Illinois/NCSA Open Source License. + +Both are permissive open source licenses, with little if any +practical difference between them. + +The reason for offering both is that (1) the MIT license is +well-known, while (2) the University of Illinois/NCSA Open Source +License allows Emscripten's code to be integrated upstream into +LLVM, which uses that license, should the opportunity arise. + +The full text of both licenses follows. + +============================================================================== + +Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== + +Copyright (c) 2010-2014 Emscripten authors, see AUTHORS file. +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal with the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimers. + + Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimers + in the documentation and/or other materials provided with the + distribution. + + Neither the names of Mozilla, + nor the names of its contributors may be used to endorse + or promote products derived from this Software without specific prior + written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. + +============================================================================== + +This program uses portions of Node.js source code located in src/library_path.js, +in accordance with the terms of the MIT license. Node's license follows: + + """ + Copyright Joyent, Inc. and other Node contributors. All rights reserved. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + """ + +The musl libc project is bundled in this repo, and it has the MIT license, see +system/lib/libc/musl/COPYRIGHT + +The third_party/ subdirectory contains code with other licenses. None of it is +used by default, but certain options use it (e.g., the optional closure compiler +flag will run closure compiler from third_party/). + diff --git a/JSTests/wasm/stress/resources/pglite/LICENSE.PostgreSQL b/JSTests/wasm/stress/resources/pglite/LICENSE.PostgreSQL new file mode 100644 index 000000000000..be2d694b0385 --- /dev/null +++ b/JSTests/wasm/stress/resources/pglite/LICENSE.PostgreSQL @@ -0,0 +1,23 @@ +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. diff --git a/JSTests/wasm/stress/resources/pglite/LICENSE.pglite b/JSTests/wasm/stress/resources/pglite/LICENSE.pglite new file mode 100644 index 000000000000..655a3c59d60f --- /dev/null +++ b/JSTests/wasm/stress/resources/pglite/LICENSE.pglite @@ -0,0 +1,23 @@ +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. diff --git a/JSTests/wasm/stress/resources/pglite/README.md b/JSTests/wasm/stress/resources/pglite/README.md new file mode 100644 index 000000000000..86c8d1f714c8 --- /dev/null +++ b/JSTests/wasm/stress/resources/pglite/README.md @@ -0,0 +1,14 @@ +# PGlite test resources + +This directory contains a vendored build of [PGlite](https://github.com/electric-sql/pglite), +PostgreSQL 17.5 compiled to WebAssembly via Emscripten. + +## Licenses + +The vendored binaries combine code from three projects: + +| Component | License | File | +| ------------------------------------------------- | -------------------------------- | ----------------------------- | +| PGlite | PostgreSQL License (chosen from Apache-2.0 OR PostgreSQL dual license) | `LICENSE.pglite` | +| PostgreSQL 17.5 | PostgreSQL License | `LICENSE.PostgreSQL` | +| Emscripten 3.1.74 (libc + JS runtime glue in `pglite.js` / `pglite.wasm`) | MIT OR NCSA (dual) | `LICENSE.Emscripten` | diff --git a/JSTests/wasm/stress/resources/pglite/jsc-harness.js b/JSTests/wasm/stress/resources/pglite/jsc-harness.js new file mode 100644 index 000000000000..4a08b77e80c8 --- /dev/null +++ b/JSTests/wasm/stress/resources/pglite/jsc-harness.js @@ -0,0 +1,240 @@ +// PGlite (PostgreSQL compiled to wasm) test harness for the jsc shell. +// +// Vendored from npm @electric-sql/pglite@0.3.15 (Apache-2.0, see LICENSE). +// pglite.js / pglite.wasm / pglite.data are unmodified. This harness drives the +// raw Emscripten module directly: we don't use the PGlite TypeScript API +// (index.js) because its dynamic-import / fetch / Worker / IndexedDB +// abstractions are not available in the shell. Instead we configure the +// Emscripten Module hooks ourselves and speak the PostgreSQL wire protocol +// directly via the `_set_read_write_cbs` / `_interactive_one` exports — the +// same mechanism index.js uses internally. + +// --- Polyfills the prebuilt Emscripten glue expects --- +// crypto.getRandomValues — used by Emscripten's initRandomFill. A deterministic +// PRNG is fine for tests (and makes runs reproducible). +if (typeof globalThis.crypto === "undefined") { + let seed = 0x12345678; + globalThis.crypto = { + getRandomValues(view) { + const bytes = new Uint8Array(view.buffer, view.byteOffset, view.byteLength); + for (let i = 0; i < bytes.length; i++) { + seed = (seed * 1103515245 + 12345) & 0x7fffffff; + bytes[i] = seed & 0xff; + } + return view; + } + }; +} +if (typeof globalThis.console === "undefined" || globalThis.console === undefined) { + const noop = () => {}; + globalThis.console = { log: noop, warn: noop, error: noop, info: noop, debug: noop, trace: noop, assert: noop }; +} +if (typeof globalThis.queueMicrotask === "undefined") + globalThis.queueMicrotask = (fn) => Promise.resolve().then(fn); + +// --- PostgreSQL wire protocol message builders --- +const PGProtocol = { + // Build a frontend message: tag byte + int32be(length incl. self) + body + message(tag, body) { + const len = 4 + body.length; + const out = new Uint8Array(1 + 4 + body.length); + out[0] = tag; + out[1] = (len >>> 24) & 0xff; out[2] = (len >>> 16) & 0xff; + out[3] = (len >>> 8) & 0xff; out[4] = len & 0xff; + out.set(body, 5); + return out; + }, + cstr(s) { + const out = new Uint8Array(s.length + 1); + for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 0xff; + return out; + }, + i16(n) { return new Uint8Array([(n >>> 8) & 0xff, n & 0xff]); }, + i32(n) { return new Uint8Array([(n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff]); }, + cat(...parts) { + let total = 0; + for (const p of parts) total += p.length; + const out = new Uint8Array(total); + let off = 0; + for (const p of parts) { out.set(p, off); off += p.length; } + return out; + }, + // Q: simple query + query(sql) { return this.message(0x51, this.cstr(sql)); }, + // P: parse — name, query, param type OIDs (0 = let server infer) + parse(name, sql, paramTypes = []) { + return this.message(0x50, this.cat( + this.cstr(name), this.cstr(sql), this.i16(paramTypes.length), + ...paramTypes.map(t => this.i32(t)))); + }, + // B: bind — portal, statement, param format codes, params (text), result format codes + bind(portal, stmt, params = []) { + const paramParts = []; + for (const p of params) { + if (p === null) { paramParts.push(this.i32(-1)); continue; } + const bytes = this.cstr(String(p)); + paramParts.push(this.i32(bytes.length - 1), bytes.subarray(0, bytes.length - 1)); + } + return this.message(0x42, this.cat( + this.cstr(portal), this.cstr(stmt), + this.i16(0), // 0 param format codes => all text + this.i16(params.length), ...paramParts, + this.i16(0))); // 0 result format codes => all text + }, + // D: describe portal or statement + describe(kind, name) { return this.message(0x44, this.cat(new Uint8Array([kind.charCodeAt(0)]), this.cstr(name))); }, + // E: execute portal, maxRows (0 = unlimited) + execute(portal, maxRows = 0) { return this.message(0x45, this.cat(this.cstr(portal), this.i32(maxRows))); }, + // S: sync + sync() { return this.message(0x53, new Uint8Array(0)); }, +}; + +// Backend message parser. Returns { rows: string[][], fields: {name,dataTypeID}[], commandTags: string[] }. +function parseBackendMessages(bytes) { + const rows = [], fields = [], commandTags = []; + const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + let i = 0; + while (i < bytes.length) { + const tag = String.fromCharCode(bytes[i]); + const len = dv.getInt32(i + 1, false); + const bodyStart = i + 5, bodyEnd = i + 1 + len; + if (tag === "T") { + let p = bodyStart; + const n = dv.getInt16(p, false); p += 2; + for (let f = 0; f < n; f++) { + let end = p; while (bytes[end] !== 0) end++; + let name = ""; for (let q = p; q < end; q++) name += String.fromCharCode(bytes[q]); + p = end + 1; + p += 4; p += 2; + const dataTypeID = dv.getInt32(p, false); p += 4; + p += 2; p += 4; p += 2; + fields.push({ name, dataTypeID }); + } + } else if (tag === "D") { + let p = bodyStart; + const n = dv.getInt16(p, false); p += 2; + const row = []; + for (let c = 0; c < n; c++) { + const colLen = dv.getInt32(p, false); p += 4; + if (colLen === -1) { row.push(null); continue; } + let s = ""; for (let q = p; q < p + colLen; q++) s += String.fromCharCode(bytes[q]); + p += colLen; + row.push(s); + } + rows.push(row); + } else if (tag === "C") { + let s = ""; for (let q = bodyStart; q < bodyEnd && bytes[q] !== 0; q++) s += String.fromCharCode(bytes[q]); + commandTags.push(s); + } else if (tag === "E") { + let p = bodyStart, msg = "", code = ""; + while (p < bodyEnd && bytes[p] !== 0) { + const ft = String.fromCharCode(bytes[p]); p++; + let end = p; while (bytes[end] !== 0) end++; + let v = ""; for (let q = p; q < end; q++) v += String.fromCharCode(bytes[q]); + p = end + 1; + if (ft === "M") msg = v; + if (ft === "C") code = v; + } + const e = new Error(`PostgreSQL error ${code}: ${msg}`); + e.code = code; + throw e; + } + i = bodyEnd; + } + return { rows, fields, commandTags }; +} + +async function startPGlite(resourceDir, opts = {}) { + const wasmBytes = readFile(resourceDir + "/pglite.wasm", "binary"); + const dataBytes = readFile(resourceDir + "/pglite.data", "binary"); + // import() resolves relative to this file's URL, not cwd. pglite.js is a sibling. + const PostgresMod = (await import("./pglite.js")).default; + + const PREFIX = "/tmp/pglite"; // where the Emscripten file_packager preamble unpacks pglite.data + const PGDATA = "/pgdata"; + + const mod = await PostgresMod({ + wasmBinary: wasmBytes, + getPreloadedPackage: (name, size) => + dataBytes.buffer.slice(dataBytes.byteOffset, dataBytes.byteOffset + dataBytes.byteLength), + locateFile: (path) => path, + print: opts.print || (() => {}), + printErr: opts.printErr || (() => {}), + // PGlite passes its config through argv (its PostgreSQL fork parses these). + arguments: [ + `PGDATA=${PGDATA}`, `PREFIX=${PREFIX}`, + `PGUSER=${opts.username ?? "postgres"}`, `PGDATABASE=${opts.database ?? "template1"}`, + "MODE=REACT", "REPL=N", + ], + WASM_PREFIX: PREFIX, + noExitRuntime: true, + preRun: [(m) => { + m.FS.mkdirTree(PGDATA); + // /dev/blob device used by PGlite for COPY ... FROM/TO blob streams. Provide a + // minimal no-op version; tests don't exercise blob COPY. + const dev = m.FS.makedev(64, 0); + m.FS.registerDevice(dev, { open: () => {}, close: () => {}, read: () => 0, + write: (s, b, o, l) => l, llseek: () => 0 }); + m.FS.mkdev("/dev/blob", dev); + }], + }); + + // Wire-protocol I/O channel via Emscripten addFunction callbacks. + // readCb(destPtr, max): JS -> wasm (request bytes). writeCb(srcPtr, len): wasm -> JS (response bytes). + let pendingReq = new Uint8Array(0), reqOff = 0, respChunks = []; + const readCb = mod.addFunction((destPtr, max) => { + const n = Math.min(pendingReq.length - reqOff, max); + if (n > 0) { mod.HEAP8.set(pendingReq.subarray(reqOff, reqOff + n), destPtr); reqOff += n; } + return n; + }, "iii"); + const writeCb = mod.addFunction((srcPtr, len) => { + respChunks.push(mod.HEAPU8.slice(srcPtr, srcPtr + len)); + return len; + }, "iii"); + mod._set_read_write_cbs(readCb, writeCb); + + const initRes = mod._pgl_initdb(); + if (initRes & 1) throw new Error("INITDB: failed to execute"); + mod._pgl_backend(); + + function execProtocolRaw(bytes) { + pendingReq = bytes; reqOff = 0; respChunks = []; + mod._interactive_one(bytes.length, bytes[0]); + pendingReq = new Uint8Array(0); reqOff = 0; + let total = 0; for (const c of respChunks) total += c.length; + const out = new Uint8Array(total); + let off = 0; for (const c of respChunks) { out.set(c, off); off += c.length; } + return out; + } + + // PGlite's TS wrapper does this after backend boot too. + execProtocolRaw(PGProtocol.query("SET search_path TO public;")); + + return { + mod, + execProtocolRaw, + // Simple query protocol. + query(sql) { + return parseBackendMessages(execProtocolRaw(PGProtocol.query(sql))); + }, + // Extended query protocol with text parameters (Parse/Bind/Describe/Execute/Sync). + queryParams(sql, params = []) { + const req = PGProtocol.cat( + PGProtocol.parse("", sql), + PGProtocol.bind("", "", params), + PGProtocol.describe("P", ""), + PGProtocol.execute(""), + PGProtocol.sync()); + return parseBackendMessages(execProtocolRaw(req)); + }, + close() { + try { mod._pgl_shutdown(); } catch (e) {} + mod.removeFunction(readCb); + mod.removeFunction(writeCb); + }, + }; +} + +globalThis.startPGlite = startPGlite; +globalThis.PGProtocol = PGProtocol; +globalThis.parseBackendMessages = parseBackendMessages; diff --git a/JSTests/wasm/stress/resources/pglite/pglite.data b/JSTests/wasm/stress/resources/pglite/pglite.data new file mode 100644 index 000000000000..3186b9e79604 Binary files /dev/null and b/JSTests/wasm/stress/resources/pglite/pglite.data differ diff --git a/JSTests/wasm/stress/resources/pglite/pglite.js b/JSTests/wasm/stress/resources/pglite/pglite.js new file mode 100644 index 000000000000..c6c1b37ff8bf --- /dev/null +++ b/JSTests/wasm/stress/resources/pglite/pglite.js @@ -0,0 +1,16 @@ + +var Module = (() => { + var _scriptName = import.meta.url; + + return ( +async function(moduleArg = {}) { + var moduleRtn; + +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");let dirname=import.meta.url;if(dirname.startsWith("data:")){dirname="/"}var require=createRequire(dirname)}Module["expectedDataFileDownloads"]??=0;Module["expectedDataFileDownloads"]++;(()=>{var isPthread=typeof ENVIRONMENT_IS_PTHREAD!="undefined"&&ENVIRONMENT_IS_PTHREAD;var isWasmWorker=typeof ENVIRONMENT_IS_WASM_WORKER!="undefined"&&ENVIRONMENT_IS_WASM_WORKER;if(isPthread||isWasmWorker)return;var isNode=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";function loadPackage(metadata){var PACKAGE_PATH="";if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/")}else if(typeof process==="undefined"&&typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.substring(0,location.pathname.lastIndexOf("/"))+"/")}var PACKAGE_NAME="pglite.data";var REMOTE_PACKAGE_BASE="pglite.data";var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata["remote_package_size"];function fetchRemotePackage(packageName,packageSize,callback,errback){if(isNode){require("fs").readFile(packageName,(err,contents)=>{if(err){errback(err)}else{callback(contents.buffer)}});return}Module["dataFileDownloads"]??={};fetch(packageName).catch(cause=>Promise.reject(new Error(`Network Error: ${packageName}`,{cause}))).then(response=>{if(!response.ok){return Promise.reject(new Error(`${response.status}: ${response.url}`))}if(!response.body&&response.arrayBuffer){return response.arrayBuffer().then(callback)}const reader=response.body.getReader();const iterate=()=>reader.read().then(handleChunk).catch(cause=>Promise.reject(new Error(`Unexpected error while handling : ${response.url} ${cause}`,{cause})));const chunks=[];const headers=response.headers;const total=Number(headers.get("Content-Length")??packageSize);let loaded=0;const handleChunk=({done,value})=>{if(!done){chunks.push(value);loaded+=value.length;Module["dataFileDownloads"][packageName]={loaded,total};let totalLoaded=0;let totalSize=0;for(const download of Object.values(Module["dataFileDownloads"])){totalLoaded+=download.loaded;totalSize+=download.total}Module["setStatus"]?.(`Downloading data... (${totalLoaded}/${totalSize})`);return iterate()}else{const packageData=new Uint8Array(chunks.map(c=>c.length).reduce((a,b)=>a+b,0));let offset=0;for(const chunk of chunks){packageData.set(chunk,offset);offset+=chunk.length}callback(packageData.buffer)}};Module["setStatus"]?.("Downloading data...");return iterate()})}function handleError(error){console.error("package error:",error)}var fetchedCallback=null;var fetched=Module["getPreloadedPackage"]?Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE):null;if(!fetched)fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE,data=>{if(fetchedCallback){fetchedCallback(data);fetchedCallback=null}else{fetched=data}},handleError);function runWithFS(Module){function assert(check,msg){if(!check)throw msg+(new Error).stack}Module["FS_createPath"]("/","home",true,true);Module["FS_createPath"]("/home","web_user",true,true);Module["FS_createPath"]("/","tmp",true,true);Module["FS_createPath"]("/tmp","pglite",true,true);Module["FS_createPath"]("/tmp/pglite","bin",true,true);Module["FS_createPath"]("/tmp/pglite","lib",true,true);Module["FS_createPath"]("/tmp/pglite/lib","postgresql",true,true);Module["FS_createPath"]("/tmp/pglite/lib/postgresql","pgxs",true,true);Module["FS_createPath"]("/tmp/pglite/lib/postgresql/pgxs","config",true,true);Module["FS_createPath"]("/tmp/pglite/lib/postgresql/pgxs","src",true,true);Module["FS_createPath"]("/tmp/pglite/lib/postgresql/pgxs/src","makefiles",true,true);Module["FS_createPath"]("/tmp/pglite","share",true,true);Module["FS_createPath"]("/tmp/pglite/share","postgresql",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql","extension",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql","timezone",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Africa",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","America",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone/America","Argentina",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone/America","Indiana",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone/America","Kentucky",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone/America","North_Dakota",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Antarctica",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Arctic",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Asia",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Atlantic",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Australia",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Brazil",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Canada",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Chile",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Etc",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Europe",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Indian",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Mexico",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","Pacific",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql/timezone","US",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql","timezonesets",true,true);Module["FS_createPath"]("/tmp/pglite/share/postgresql","tsearch_data",true,true);function DataRequest(start,end,audio){this.start=start;this.end=end;this.audio=audio}DataRequest.prototype={requests:{},open:function(mode,name){this.name=name;this.requests[name]=this;Module["addRunDependency"](`fp ${this.name}`)},send:function(){},onload:function(){var byteArray=this.byteArray.subarray(this.start,this.end);this.finish(byteArray)},finish:function(byteArray){var that=this;Module["FS_createDataFile"](this.name,null,byteArray,true,true,true);Module["removeRunDependency"](`fp ${that.name}`);this.requests[this.name]=null}};var files=metadata["files"];for(var i=0;i{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(!import.meta.url.startsWith("data:")){scriptDirectory=nodePath.dirname(require("url").fileURLToPath(import.meta.url))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var dynamicLibraries=Module["dynamicLibraries"]||[];var wasmBinary=Module["wasmBinary"];function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE!="undefined"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,"base64");return new Uint8Array(buf.buffer,buf.byteOffset,buf.length)}var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;ifilename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){if(Module["locateFile"]){var f="pglite.wasm";if(!isDataURI(f)){return locateFile(f)}return f}return new URL("pglite.wasm",import.meta.url).href}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{env:wasmImports,wasi_snapshot_preview1:wasmImports,"GOT.mem":new Proxy(wasmImports,GOTHandler),"GOT.func":new Proxy(wasmImports,GOTHandler)}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=relocateExports(wasmExports,1024);var metadata=getDylinkMetadata(module);if(metadata.neededDynlibs){dynamicLibraries=metadata.neededDynlibs.concat(dynamicLibraries)}mergeLibSymbols(wasmExports,"main");LDSO.init();loadDylibs();addOnInit(wasmExports["__wasm_call_ctors"]);__RELOC_FUNCS__.push(wasmExports["__wasm_apply_data_relocs"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}var info=getWasmImports();if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);receiveInstantiationResult(result);return result}catch(e){readyPromiseReject(e);return}}var ASM_CONSTS={2537480:$0=>{Module.is_worker=typeof WorkerGlobalScope!=="undefined"&&self instanceof WorkerGlobalScope;Module.FD_BUFFER_MAX=$0;Module.emscripten_copy_to=console.warn},2537652:()=>{Module["postMessage"]=function custom_postMessage(event){console.log("# pg_main_emsdk.c:544: onCustomMessage:",event)}},2537781:()=>{if(Module.is_worker){function onCustomMessage(event){console.log("onCustomMessage:",event)}Module["onCustomMessage"]=onCustomMessage}else{Module["postMessage"]=function custom_postMessage(event){switch(event.type){case"raw":{break}case"stdin":{stringToUTF8(event.data,1,Module.FD_BUFFER_MAX);break}case"rcon":{break}default:console.warn("custom_postMessage?",event)}}}}};class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var GOT={};var currentModuleWeakSymbols=new Set([]);var GOTHandler={get(obj,symName){var rtn=GOT[symName];if(!rtn){rtn=GOT[symName]=new WebAssembly.Global({value:"i32",mutable:true})}if(!currentModuleWeakSymbols.has(symName)){rtn.required=true}return rtn}};var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var getDylinkMetadata=binary=>{var offset=0;var end=0;function getU8(){return binary[offset++]}function getLEB(){var ret=0;var mul=1;while(1){var byte=binary[offset++];ret+=(byte&127)*mul;mul*=128;if(!(byte&128))break}return ret}function getString(){var len=getLEB();offset+=len;return UTF8ArrayToString(binary,offset-len,len)}function failIf(condition,message){if(condition)throw new Error(message)}var name="dylink.0";if(binary instanceof WebAssembly.Module){var dylinkSection=WebAssembly.Module.customSections(binary,name);if(dylinkSection.length===0){name="dylink";dylinkSection=WebAssembly.Module.customSections(binary,name)}failIf(dylinkSection.length===0,"need dylink section");binary=new Uint8Array(dylinkSection[0]);end=binary.length}else{var int32View=new Uint32Array(new Uint8Array(binary.subarray(0,24)).buffer);var magicNumberFound=int32View[0]==1836278016;failIf(!magicNumberFound,"need to see wasm magic number");failIf(binary[8]!==0,"need the dylink section to be first");offset=9;var section_size=getLEB();end=offset+section_size;name=getString()}var customSection={neededDynlibs:[],tlsExports:new Set,weakImports:new Set};if(name=="dylink"){customSection.memorySize=getLEB();customSection.memoryAlign=getLEB();customSection.tableSize=getLEB();customSection.tableAlign=getLEB();var neededDynlibsCount=getLEB();for(var i=0;i>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var newDSO=(name,handle,syms)=>{var dso={refcount:Infinity,name,exports:syms,global:true};LDSO.loadedLibsByName[name]=dso;if(handle!=undefined){LDSO.loadedLibsByHandle[handle]=dso}return dso};var LDSO={loadedLibsByName:{},loadedLibsByHandle:{},init(){newDSO("__main__",0,wasmImports)}};var ___heap_base=2765600;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var getMemory=size=>{if(runtimeInitialized){return _calloc(size,1)}var ret=___heap_base;var end=ret+alignMemory(size,16);___heap_base=end;GOT["__heap_base"].value=end;return ret};var isInternalSym=symName=>["__cpp_exception","__c_longjmp","__wasm_apply_data_relocs","__dso_handle","__tls_size","__tls_align","__set_stack_limits","_emscripten_tls_init","__wasm_init_tls","__wasm_call_ctors","__start_em_asm","__stop_em_asm","__start_em_js","__stop_em_js"].includes(symName)||symName.startsWith("__em_js__");var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var sigToWasmTypes=sig=>{var typeNames={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={i:127,p:127,j:126,f:125,d:124,e:111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{e:{f:func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTableMirror=[];var wasmTable=new WebAssembly.Table({initial:5610,element:"anyfunc"});var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var updateGOT=(exports,replace)=>{for(var symName in exports){if(isInternalSym(symName)){continue}var value=exports[symName];GOT[symName]||=new WebAssembly.Global({value:"i32",mutable:true});if(replace||GOT[symName].value==0){if(typeof value=="function"){GOT[symName].value=addFunction(value)}else if(typeof value=="number"){GOT[symName].value=value}else{err(`unhandled export type for '${symName}': ${typeof value}`)}}}};var relocateExports=(exports,memoryBase,replace)=>{var relocated={};for(var e in exports){var value=exports[e];if(typeof value=="object"){value=value.value}if(typeof value=="number"){value+=memoryBase}relocated[e]=value}updateGOT(relocated,replace);return relocated};var isSymbolDefined=symName=>{var existing=wasmImports[symName];if(!existing||existing.stub){return false}return true};var dynCall=(sig,ptr,args=[])=>{var rtn=getWasmTableEntry(ptr)(...args);return rtn};var stackSave=()=>_emscripten_stack_get_current();var stackRestore=val=>__emscripten_stack_restore(val);var createInvokeFunction=sig=>(ptr,...args)=>{var sp=stackSave();try{return dynCall(sig,ptr,args)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);if(sig[0]=="j")return 0n}};var resolveGlobalSymbol=(symName,direct=false)=>{var sym;if(isSymbolDefined(symName)){sym=wasmImports[symName]}else if(symName.startsWith("invoke_")){sym=wasmImports[symName]=createInvokeFunction(symName.split("_")[1])}return{sym,name:symName}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var loadWebAssemblyModule=(binary,flags,libName,localScope,handle)=>{var metadata=getDylinkMetadata(binary);currentModuleWeakSymbols=metadata.weakImports;function loadModule(){var firstLoad=!handle||!HEAP8[handle+8];if(firstLoad){var memAlign=Math.pow(2,metadata.memoryAlign);var memoryBase=metadata.memorySize?alignMemory(getMemory(metadata.memorySize+memAlign),memAlign):0;var tableBase=metadata.tableSize?wasmTable.length:0;if(handle){HEAP8[handle+8]=1;HEAPU32[handle+12>>2]=memoryBase;HEAP32[handle+16>>2]=metadata.memorySize;HEAPU32[handle+20>>2]=tableBase;HEAP32[handle+24>>2]=metadata.tableSize}}else{memoryBase=HEAPU32[handle+12>>2];tableBase=HEAPU32[handle+20>>2]}var tableGrowthNeeded=tableBase+metadata.tableSize-wasmTable.length;if(tableGrowthNeeded>0){wasmTable.grow(tableGrowthNeeded)}var moduleExports;function resolveSymbol(sym){var resolved=resolveGlobalSymbol(sym).sym;if(!resolved&&localScope){resolved=localScope[sym]}if(!resolved){resolved=moduleExports[sym]}return resolved}var proxyHandler={get(stubs,prop){switch(prop){case"__memory_base":return memoryBase;case"__table_base":return tableBase}if(prop in wasmImports&&!wasmImports[prop].stub){return wasmImports[prop]}if(!(prop in stubs)){var resolved;stubs[prop]=(...args)=>{resolved||=resolveSymbol(prop);return resolved(...args)}}return stubs[prop]}};var proxy=new Proxy({},proxyHandler);var info={"GOT.mem":new Proxy({},GOTHandler),"GOT.func":new Proxy({},GOTHandler),env:proxy,wasi_snapshot_preview1:proxy};function postInstantiation(module,instance){updateTableMap(tableBase,metadata.tableSize);moduleExports=relocateExports(instance.exports,memoryBase);if(!flags.allowUndefined){reportUndefinedSymbols()}function addEmAsm(addr,body){var args=[];var arity=0;for(;arity<16;arity++){if(body.indexOf("$"+arity)!=-1){args.push("$"+arity)}else{break}}args=args.join(",");var func=`(${args}) => { ${body} };`;ASM_CONSTS[start]=eval(func)}if("__start_em_asm"in moduleExports){var start=moduleExports["__start_em_asm"];var stop=moduleExports["__stop_em_asm"];while(start ${body};`;moduleExports[name]=eval(func)}for(var name in moduleExports){if(name.startsWith("__em_js__")){var start=moduleExports[name];var jsString=UTF8ToString(start);var parts=jsString.split("<::>");addEmJs(name.replace("__em_js__",""),parts[0],parts[1]);delete moduleExports[name]}}var applyRelocs=moduleExports["__wasm_apply_data_relocs"];if(applyRelocs){if(runtimeInitialized){applyRelocs()}else{__RELOC_FUNCS__.push(applyRelocs)}}var init=moduleExports["__wasm_call_ctors"];if(init){if(runtimeInitialized){init()}else{__ATINIT__.push(init)}}return moduleExports}if(flags.loadAsync){if(binary instanceof WebAssembly.Module){var instance=new WebAssembly.Instance(binary,info);return Promise.resolve(postInstantiation(binary,instance))}return WebAssembly.instantiate(binary,info).then(result=>postInstantiation(result.module,result.instance))}var module=binary instanceof WebAssembly.Module?binary:new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return postInstantiation(module,instance)}if(flags.loadAsync){return metadata.neededDynlibs.reduce((chain,dynNeeded)=>chain.then(()=>loadDynamicLibrary(dynNeeded,flags,localScope)),Promise.resolve()).then(loadModule)}metadata.neededDynlibs.forEach(needed=>loadDynamicLibrary(needed,flags,localScope));return loadModule()};var mergeLibSymbols=(exports,libName)=>{for(var[sym,exp]of Object.entries(exports)){const setImport=target=>{if(!isSymbolDefined(target)){wasmImports[target]=exp}};setImport(sym);const main_alias="__main_argc_argv";if(sym=="main"){setImport(main_alias)}if(sym==main_alias){setImport("main")}}};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var preloadPlugins=Module["preloadPlugins"]||[];var registerWasmPlugin=()=>{var wasmPlugin={promiseChainEnd:Promise.resolve(),canHandle:name=>!Module["noWasmDecoding"]&&name.endsWith(".so"),handle:(byteArray,name,onload,onerror)=>{wasmPlugin["promiseChainEnd"]=wasmPlugin["promiseChainEnd"].then(()=>loadWebAssemblyModule(byteArray,{loadAsync:true,nodelete:true},name,{})).then(exports=>{preloadedWasm[name]=exports;onload(byteArray)},error=>{err(`failed to instantiate wasm: ${name}: ${error}`);onerror()})}};preloadPlugins.push(wasmPlugin)};var preloadedWasm={};function loadDynamicLibrary(libName,flags={global:true,nodelete:true},localScope,handle){var dso=LDSO.loadedLibsByName[libName];if(dso){if(!flags.global){if(localScope){Object.assign(localScope,dso.exports)}}else if(!dso.global){dso.global=true;mergeLibSymbols(dso.exports,libName)}if(flags.nodelete&&dso.refcount!==Infinity){dso.refcount=Infinity}dso.refcount++;if(handle){LDSO.loadedLibsByHandle[handle]=dso}return flags.loadAsync?Promise.resolve(true):true}dso=newDSO(libName,handle,"loading");dso.refcount=flags.nodelete?Infinity:1;dso.global=flags.global;function loadLibData(){if(handle){var data=HEAPU32[handle+28>>2];var dataSize=HEAPU32[handle+32>>2];if(data&&dataSize){var libData=HEAP8.slice(data,data+dataSize);return flags.loadAsync?Promise.resolve(libData):libData}}var libFile=locateFile(libName);if(flags.loadAsync){return asyncLoad(libFile)}if(!readBinary){throw new Error(`${libFile}: file not found, and synchronous loading of external files is not available`)}return readBinary(libFile)}function getExports(){var preloaded=preloadedWasm[libName];if(preloaded){return flags.loadAsync?Promise.resolve(preloaded):preloaded}if(flags.loadAsync){return loadLibData().then(libData=>loadWebAssemblyModule(libData,flags,libName,localScope,handle))}return loadWebAssemblyModule(loadLibData(),flags,libName,localScope,handle)}function moduleLoaded(exports){if(dso.global){mergeLibSymbols(exports,libName)}else if(localScope){Object.assign(localScope,exports)}dso.exports=exports}if(flags.loadAsync){return getExports().then(exports=>{moduleLoaded(exports);return true})}moduleLoaded(getExports());return true}var reportUndefinedSymbols=()=>{for(var[symName,entry]of Object.entries(GOT)){if(entry.value==0){var value=resolveGlobalSymbol(symName,true).sym;if(!value&&!entry.required){continue}if(typeof value=="function"){entry.value=addFunction(value,value.sig)}else if(typeof value=="number"){entry.value=value}else{throw new Error(`bad export type for '${symName}': ${typeof value}`)}}}};var loadDylibs=()=>{if(!dynamicLibraries.length){reportUndefinedSymbols();return}addRunDependency("loadDylibs");dynamicLibraries.reduce((chain,lib)=>chain.then(()=>loadDynamicLibrary(lib,{loadAsync:true,global:true,nodelete:true,allowUndefined:true})),Promise.resolve()).then(()=>{reportUndefinedSymbols();removeRunDependency("loadDylibs")})};var noExitRuntime=Module["noExitRuntime"]||true;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr]=value;break;case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);___assert_fail.sig="vppip";var ___call_sighandler=(fp,sig)=>getWasmTableEntry(fp)(sig);___call_sighandler.sig="vpi";var ___memory_base=new WebAssembly.Global({value:"i32",mutable:false},1024);Module["___memory_base"]=___memory_base;var ___stack_pointer=new WebAssembly.Global({value:"i32",mutable:true},2765600);Module["___stack_pointer"]=___stack_pointer;var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size)};var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(ptr)zeroMemory(ptr,size);return ptr};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url).then(processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var IDBFS={dbs:{},indexedDB:()=>{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",queuePersist:mount=>{function onPersistComplete(){if(mount.idbPersistState==="again")startPersist();else mount.idbPersistState=0}function startPersist(){mount.idbPersistState="idb";IDBFS.syncfs(mount,false,onPersistComplete)}if(!mount.idbPersistState){mount.idbPersistState=setTimeout(startPersist,0)}else if(mount.idbPersistState==="idb"){mount.idbPersistState="again"}},mount:mount=>{var mnt=MEMFS.mount(mount);if(mount?.opts?.autoPersist){mnt.idbPersistState=0;var memfs_node_ops=mnt.node_ops;mnt.node_ops=Object.assign({},mnt.node_ops);mnt.node_ops.mknod=(parent,name,mode,dev)=>{var node=memfs_node_ops.mknod(parent,name,mode,dev);node.node_ops=mnt.node_ops;node.idbfs_mount=mnt.mount;node.memfs_stream_ops=node.stream_ops;node.stream_ops=Object.assign({},node.stream_ops);node.stream_ops.write=(stream,buffer,offset,length,position,canOwn)=>{stream.node.isModified=true;return node.memfs_stream_ops.write(stream,buffer,offset,length,position,canOwn)};node.stream_ops.close=stream=>{var n=stream.node;if(n.isModified){IDBFS.queuePersist(n.idbfs_mount);n.isModified=false}if(n.memfs_stream_ops.close)return n.memfs_stream_ops.close(stream)};return node};mnt.node_ops.mkdir=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.mkdir(...args));mnt.node_ops.rmdir=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.rmdir(...args));mnt.node_ops.symlink=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.symlink(...args));mnt.node_ops.unlink=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.unlink(...args));mnt.node_ops.rename=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.rename(...args))}return mnt},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(e.target.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>PATH.join2(root,p)}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push(...FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(e.target.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db,entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>callback(null,event.target.result);req.onerror=e=>{callback(e.target.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(key=>{var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(key=>{if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=transaction.onabort=e=>{done(e.target.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var NODEFS={isWindows:false,staticInit(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process.binding("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],256:flags["O_NOCTTY"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"],131072:flags["O_NOFOLLOW"]}},convertNodeCode(e){var code=e.code;return ERRNO_CODES[code]},tryFSOperation(f){try{return f()}catch(e){if(!e.code)throw e;if(e.code==="UNKNOWN")throw new FS.ErrnoError(28);throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},mount(mount){return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(28)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode(path){return NODEFS.tryFSOperation(()=>{var mode=fs.lstatSync(path).mode;if(NODEFS.isWindows){mode|=(mode&292)>>2}return mode})},realPath(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join(...parts)},flagsForNode(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;flags&=~65536;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(flags){throw new FS.ErrnoError(28)}return newFlags},node_ops:{getattr(node){var path=NODEFS.realPath(node);var stat;NODEFS.tryFSOperation(()=>stat=fs.lstatSync(path));if(NODEFS.isWindows){if(!stat.blksize){stat.blksize=4096}if(!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}stat.mode|=(stat.mode&292)>>2}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr(node,attr){var path=NODEFS.realPath(node);NODEFS.tryFSOperation(()=>{if(attr.mode!==undefined){var mode=attr.mode;if(NODEFS.isWindows){mode&=384}fs.chmodSync(path,mode);node.mode=attr.mode}if(attr.atime||attr.mtime){var atime=attr.atime&&new Date(attr.atime);var mtime=attr.mtime&&new Date(attr.mtime);fs.utimesSync(path,atime,mtime)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}})},lookup(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);NODEFS.tryFSOperation(()=>{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}});return node},rename(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{FS.unlink(newPath)}catch(e){}NODEFS.tryFSOperation(()=>fs.renameSync(oldPath,newPath));oldNode.name=newName},unlink(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);NODEFS.tryFSOperation(()=>fs.unlinkSync(path))},rmdir(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);NODEFS.tryFSOperation(()=>fs.rmdirSync(path))},readdir(node){var path=NODEFS.realPath(node);return NODEFS.tryFSOperation(()=>fs.readdirSync(path))},symlink(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);NODEFS.tryFSOperation(()=>fs.symlinkSync(oldPath,newPath))},readlink(node){var path=NODEFS.realPath(node);return NODEFS.tryFSOperation(()=>fs.readlinkSync(path))},statfs(path){var stats=NODEFS.tryFSOperation(()=>fs.statfsSync(path));stats.frsize=stats.bsize;return stats}},stream_ops:{open(stream){var path=NODEFS.realPath(stream.node);NODEFS.tryFSOperation(()=>{if(FS.isFile(stream.node.mode)){stream.shared.refcount=1;stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}})},close(stream){NODEFS.tryFSOperation(()=>{if(FS.isFile(stream.node.mode)&&stream.nfd&&--stream.shared.refcount===0){fs.closeSync(stream.nfd)}})},dup(stream){stream.shared.refcount++},read(stream,buffer,offset,length,position){if(length===0)return 0;return NODEFS.tryFSOperation(()=>fs.readSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),0,length,position))},write(stream,buffer,offset,length,position){return NODEFS.tryFSOperation(()=>fs.writeSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),0,length,position))},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){NODEFS.tryFSOperation(()=>{var stat=fs.fstatSync(stream.nfd);position+=stat.size})}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr=mmapAlloc(length);NODEFS.stream_ops.read(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}},msync(stream,buffer,offset,length,mmapFlags){NODEFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path)return{path:"",node:null};opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p&&p!==".");var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};var parent=FS.lookupPath(path,{follow:true}).node;if(parent?.node_ops.statfs){Object.assign(rtn,parent.node_ops.statfs(parent.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS,IDBFS,NODEFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;_fflush(0);for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};var ___syscall__newselect=function(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=(fd,low,high,val)=>fd<32?low&val:high&val;for(var fd=0;fd>2]:0,tv_usec=readfds?HEAP32[timeout+4>>2]:0;timeoutInMillis=(tv_sec+tv_usec/1e6)*1e3}flags=stream.stream_ops.poll(stream,timeoutInMillis)}if(flags&1&&check(fd,srcReadLow,srcReadHigh,mask)){fd<32?dstReadLow=dstReadLow|mask:dstReadHigh=dstReadHigh|mask;total++}if(flags&4&&check(fd,srcWriteLow,srcWriteHigh,mask)){fd<32?dstWriteLow=dstWriteLow|mask:dstWriteHigh=dstWriteHigh|mask;total++}if(flags&2&&check(fd,srcExceptLow,srcExceptHigh,mask)){fd<32?dstExceptLow=dstExceptLow|mask:dstExceptHigh=dstExceptHigh|mask;total++}}if(readfds){HEAP32[readfds>>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}};___syscall__newselect.sig="iipppp";var SOCKFS={websocketArgs:{},callbacks:{},on(event,callback){SOCKFS.callbacks[event]=callback},emit(event,param){SOCKFS.callbacks[event]?.(param)},mount(mount){SOCKFS.websocketArgs=Module["websocket"]||{};(Module["websocket"]??={})["on"]=SOCKFS.on;return FS.createNode(null,"/",16895,0)},createSocket(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family,type,protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return`socket[${SOCKFS.nextname.current++}]`},websocket_sock_ops:{createPeer(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var url="ws:#".replace("#","//");var subProtocols="binary";var opts=undefined;if(SOCKFS.websocketArgs["url"]){url=SOCKFS.websocketArgs["url"]}if(SOCKFS.websocketArgs["subprotocol"]){subProtocols=SOCKFS.websocketArgs["subprotocol"]}else if(SOCKFS.websocketArgs["subprotocol"]===null){subProtocols="null"}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr,port,socket:ws,msg_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.msg_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer(sock,addr,port){return sock.peers[addr+":"+port]},addPeer(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents(sock,peer){var first=true;var handleOpen=function(){sock.connecting=false;SOCKFS.emit("open",sock.stream.fd);try{var queued=peer.msg_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.msg_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data});SOCKFS.emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){SOCKFS.emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;SOCKFS.emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){SOCKFS.emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;SOCKFS.emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){if(sock.connecting){mask|=4}else{mask|=16}}return mask},ioctl(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i{var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket};var inetNtop4=addr=>(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255);var inetNtop6=ints=>{var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word{var family=HEAP16[sa>>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family,addr,port}};var inetPton4=str=>{var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0};var jstoi_q=str=>parseInt(str);var inetPton6=str=>{var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w{var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info};function ___syscall_bind(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_bind.sig="iippiii";function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_chdir.sig="ip";function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_chmod.sig="ipi";function ___syscall_dup(fd){try{var old=SYSCALLS.getStreamFromFD(fd);return FS.dupStream(old).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_dup.sig="ii";function ___syscall_dup3(fd,newfd,flags){try{var old=SYSCALLS.getStreamFromFD(fd);if(old.fd===newfd)return-28;if(newfd<0||newfd>=FS.MAX_OPEN_FDS)return-8;var existing=FS.getStream(newfd);if(existing)FS.close(existing);return FS.dupStream(old,newfd).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_dup3.sig="iiii";function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_faccessat.sig="iipii";var ___syscall_fadvise64=(fd,offset,len,advice)=>0;___syscall_fadvise64.sig="iijji";var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function ___syscall_fallocate(fd,mode,offset,len){offset=bigintToI53Checked(offset);len=bigintToI53Checked(len);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.allocate(stream,offset,len);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_fallocate.sig="iiijj";var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_fcntl64.sig="iiip";function ___syscall_fdatasync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_fdatasync.sig="ii";function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_fstat64.sig="iip";function ___syscall_ftruncate64(fd,length){length=bigintToI53Checked(length);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_ftruncate64.sig="iij";var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>3]=BigInt(id);HEAP64[dirp+pos+8>>3]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_getdents64.sig="iipp";function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_ioctl.sig="iiip";function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_lstat64.sig="ipp";function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_mkdirat.sig="iipi";function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_newfstatat.sig="iippi";function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_openat.sig="iipip";var PIPEFS={BUCKET_BUFFER_SIZE:8192,mount(mount){return FS.createNode(null,"/",16384|511,0)},createPipe(){var pipe={buckets:[],refcnt:2};pipe.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var rName=PIPEFS.nextname();var wName=PIPEFS.nextname();var rNode=FS.createNode(PIPEFS.root,rName,4096,0);var wNode=FS.createNode(PIPEFS.root,wName,4096,0);rNode.pipe=pipe;wNode.pipe=pipe;var readableStream=FS.createStream({path:rName,node:rNode,flags:0,seekable:false,stream_ops:PIPEFS.stream_ops});rNode.stream=readableStream;var writableStream=FS.createStream({path:wName,node:wNode,flags:1,seekable:false,stream_ops:PIPEFS.stream_ops});wNode.stream=writableStream;return{readable_fd:readableStream.fd,writable_fd:writableStream.fd}},stream_ops:{poll(stream){var pipe=stream.node.pipe;if((stream.flags&2097155)===1){return 256|4}if(pipe.buckets.length>0){for(var i=0;i0){return 64|1}}}return 0},ioctl(stream,request,varargs){return 28},fsync(stream){return 28},read(stream,buffer,offset,length,position){var pipe=stream.node.pipe;var currentLength=0;for(var i=0;i=dataLen){currBucket.buffer.set(data,currBucket.offset);currBucket.offset+=dataLen;return dataLen}else if(freeBytesInCurrBuffer>0){currBucket.buffer.set(data.subarray(0,freeBytesInCurrBuffer),currBucket.offset);currBucket.offset+=freeBytesInCurrBuffer;data=data.subarray(freeBytesInCurrBuffer,data.byteLength)}var numBuckets=data.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0;var remElements=data.byteLength%PIPEFS.BUCKET_BUFFER_SIZE;for(var i=0;i0){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:data.byteLength,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data)}return dataLen},close(stream){var pipe=stream.node.pipe;pipe.refcnt--;if(pipe.refcnt===0){pipe.buckets=null}}},nextname(){if(!PIPEFS.nextname.current){PIPEFS.nextname.current=0}return"pipe["+PIPEFS.nextname.current+++"]"}};function ___syscall_pipe(fdPtr){try{if(fdPtr==0){throw new FS.ErrnoError(21)}var res=PIPEFS.createPipe();HEAP32[fdPtr>>2]=res.readable_fd;HEAP32[fdPtr+4>>2]=res.writable_fd;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_pipe.sig="ip";function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_readlinkat.sig="iippp";var writeSockaddr=(sa,family,addr,port,addrlen)=>{switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0};function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_recvfrom.sig="iippipp";function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_renameat.sig="iipip";function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_rmdir.sig="ip";function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);if(!addr){return FS.write(sock.stream,HEAP8,message,length)}var dest=getSocketAddress(addr,addr_len);return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_sendto.sig="iippipp";function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_socket.sig="iiiiiii";function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_stat64.sig="ipp";function ___syscall_symlinkat(target,dirfd,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);linkpath=SYSCALLS.calculateAt(dirfd,linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_symlinkat.sig="ipip";function ___syscall_truncate64(path,length){length=bigintToI53Checked(length);try{if(isNaN(length))return 61;path=SYSCALLS.getStr(path);FS.truncate(path,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_truncate64.sig="ipj";function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}___syscall_unlinkat.sig="iipi";var ___table_base=new WebAssembly.Global({value:"i32",mutable:false},1);Module["___table_base"]=___table_base;var __abort_js=()=>abort("");__abort_js.sig="v";var ENV={};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var dlSetError=msg=>{var sp=stackSave();var cmsg=stringToUTF8OnStack(msg);___dl_seterr(cmsg,0);stackRestore(sp)};var dlopenInternal=(handle,jsflags)=>{var filename=UTF8ToString(handle+36);var flags=HEAP32[handle+4>>2];filename=PATH.normalize(filename);var global=Boolean(flags&256);var localScope=global?null:{};var combinedFlags={global,nodelete:Boolean(flags&4096),loadAsync:jsflags.loadAsync};if(jsflags.loadAsync){return loadDynamicLibrary(filename,combinedFlags,localScope,handle)}try{return loadDynamicLibrary(filename,combinedFlags,localScope,handle)}catch(e){dlSetError(`Could not load dynamic lib: ${filename}\n${e}`);return 0}};var __dlopen_js=handle=>dlopenInternal(handle,{loadAsync:false});__dlopen_js.sig="pp";var __dlsym_js=(handle,symbol,symbolIndex)=>{symbol=UTF8ToString(symbol);var result;var newSymIndex;var lib=LDSO.loadedLibsByHandle[handle];if(!lib.exports.hasOwnProperty(symbol)||lib.exports[symbol].stub){dlSetError(`Tried to lookup unknown symbol "${symbol}" in dynamic lib: ${lib.name}`);return 0}newSymIndex=Object.keys(lib.exports).indexOf(symbol);result=lib.exports[symbol];if(typeof result=="function"){var addr=getFunctionAddress(result);if(addr){result=addr}else{result=addFunction(result,result.sig);HEAPU32[symbolIndex>>2]=newSymIndex}}return result};__dlsym_js.sig="pppp";var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);__emscripten_memcpy_js.sig="vppp";var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};__emscripten_runtime_keepalive_clear.sig="v";var __emscripten_system=command=>{if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52};__emscripten_system.sig="ip";var __emscripten_throw_longjmp=()=>{throw Infinity};__emscripten_throw_longjmp.sig="v";function __gmtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}__gmtime_js.sig="vjp";var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}__localtime_js.sig="vjp";function __mmap_js(len,prot,flags,fd,offset,allocated,addr){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}__mmap_js.sig="ipiiijpp";function __munmap_js(addr,len,prot,flags,fd,offset){offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}__munmap_js.sig="ippiiij";var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};_proc_exit.sig="vi";var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;_exit.sig="vi";var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();_emscripten_get_now.sig="d";var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};__setitimer_js.sig="iid";var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetDate.now();_emscripten_date_now.sig="d";var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}_clock_time_get.sig="iijp";var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==106?HEAP64[buf>>3]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);_emscripten_asm_const_int.sig="ippp";var _emscripten_force_exit=status=>{__emscripten_runtime_keepalive_clear();_exit(status)};_emscripten_force_exit.sig="vi";var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};_emscripten_resize_heap.sig="ip";var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};_environ_get.sig="ipp";var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};_environ_sizes_get.sig="ipp";function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_close.sig="ii";function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf]=type;HEAP16[pbuf+2>>1]=flags;HEAP64[pbuf+8>>3]=BigInt(rightsBase);HEAP64[pbuf+16>>3]=BigInt(rightsInheriting);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_fdstat_get.sig="iip";var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_pread.sig="iippjp";var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_pwrite.sig="iippjp";function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_read.sig="iippp";function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_seek.sig="iijip";function _fd_sync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);if(stream.stream_ops?.fsync){return stream.stream_ops.fsync(stream)}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_sync.sig="ii";function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}_fd_write.sig="iippp";var _getaddrinfo=(node,service,hint,out)=>{var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAPU32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,_htonl(1)]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0};_getaddrinfo.sig="ipppp";var _getnameinfo=(sa,salen,node,nodelen,serv,servlen,flags)=>{var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0};_getnameinfo.sig="ipipipii";var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var removeFunction=index=>{functionsInTableMap.delete(getWasmTableEntry(index));setWasmTableEntry(index,null);freeTableIndexes.push(index)};var FS_createPath=FS.createPath;var FS_unlink=path=>FS.unlink(path);var FS_createLazyFile=FS.createLazyFile;var FS_createDevice=FS.createDevice;var setTempRet0=val=>__emscripten_tempret_set(val);var _setTempRet0=setTempRet0;Module["_setTempRet0"]=_setTempRet0;var getTempRet0=val=>__emscripten_tempret_get();var _getTempRet0=getTempRet0;Module["_getTempRet0"]=_getTempRet0;registerWasmPlugin();FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack="";if(ENVIRONMENT_IS_NODE){NODEFS.staticInit()}var wasmImports={__assert_fail:___assert_fail,__call_sighandler:___call_sighandler,__heap_base:___heap_base,__indirect_function_table:wasmTable,__memory_base:___memory_base,__stack_pointer:___stack_pointer,__syscall__newselect:___syscall__newselect,__syscall_bind:___syscall_bind,__syscall_chdir:___syscall_chdir,__syscall_chmod:___syscall_chmod,__syscall_dup:___syscall_dup,__syscall_dup3:___syscall_dup3,__syscall_faccessat:___syscall_faccessat,__syscall_fadvise64:___syscall_fadvise64,__syscall_fallocate:___syscall_fallocate,__syscall_fcntl64:___syscall_fcntl64,__syscall_fdatasync:___syscall_fdatasync,__syscall_fstat64:___syscall_fstat64,__syscall_ftruncate64:___syscall_ftruncate64,__syscall_getcwd:___syscall_getcwd,__syscall_getdents64:___syscall_getdents64,__syscall_ioctl:___syscall_ioctl,__syscall_lstat64:___syscall_lstat64,__syscall_mkdirat:___syscall_mkdirat,__syscall_newfstatat:___syscall_newfstatat,__syscall_openat:___syscall_openat,__syscall_pipe:___syscall_pipe,__syscall_readlinkat:___syscall_readlinkat,__syscall_recvfrom:___syscall_recvfrom,__syscall_renameat:___syscall_renameat,__syscall_rmdir:___syscall_rmdir,__syscall_sendto:___syscall_sendto,__syscall_socket:___syscall_socket,__syscall_stat64:___syscall_stat64,__syscall_symlinkat:___syscall_symlinkat,__syscall_truncate64:___syscall_truncate64,__syscall_unlinkat:___syscall_unlinkat,__table_base:___table_base,_abort_js:__abort_js,_dlopen_js:__dlopen_js,_dlsym_js:__dlsym_js,_emscripten_memcpy_js:__emscripten_memcpy_js,_emscripten_runtime_keepalive_clear:__emscripten_runtime_keepalive_clear,_emscripten_system:__emscripten_system,_emscripten_throw_longjmp:__emscripten_throw_longjmp,_gmtime_js:__gmtime_js,_localtime_js:__localtime_js,_mmap_js:__mmap_js,_munmap_js:__munmap_js,_setitimer_js:__setitimer_js,_tzset_js:__tzset_js,clock_time_get:_clock_time_get,emscripten_asm_const_int:_emscripten_asm_const_int,emscripten_date_now:_emscripten_date_now,emscripten_force_exit:_emscripten_force_exit,emscripten_get_now:_emscripten_get_now,emscripten_resize_heap:_emscripten_resize_heap,environ_get:_environ_get,environ_sizes_get:_environ_sizes_get,exit:_exit,fd_close:_fd_close,fd_fdstat_get:_fd_fdstat_get,fd_pread:_fd_pread,fd_pwrite:_fd_pwrite,fd_read:_fd_read,fd_seek:_fd_seek,fd_sync:_fd_sync,fd_write:_fd_write,getTempRet0:_getTempRet0,getaddrinfo:_getaddrinfo,getnameinfo:_getnameinfo,invoke_di,invoke_i,invoke_id,invoke_ii,invoke_iii,invoke_iiii,invoke_iiiii,invoke_iiiiii,invoke_iiiiiii,invoke_iiiiiiii,invoke_iiiiiiiii,invoke_iiiiiiiiii,invoke_iiiiiiiiiii,invoke_iiiiiiiiiiiiii,invoke_iiiiiiiiiiiiiiiiii,invoke_iiiiiji,invoke_iiiij,invoke_iiiijii,invoke_iiij,invoke_iiji,invoke_ij,invoke_ijiiiii,invoke_ijiiiiii,invoke_j,invoke_ji,invoke_jii,invoke_jiiii,invoke_jiiiiii,invoke_jiiiiiiiii,invoke_v,invoke_vi,invoke_vid,invoke_vii,invoke_viii,invoke_viiii,invoke_viiiii,invoke_viiiiii,invoke_viiiiiii,invoke_viiiiiiii,invoke_viiiiiiiii,invoke_viiiiiiiiiiii,invoke_viiiji,invoke_viij,invoke_viiji,invoke_viijii,invoke_viijiiii,invoke_vij,invoke_viji,invoke_vijiji,invoke_vj,invoke_vji,memory:wasmMemory,proc_exit:_proc_exit,setTempRet0:_setTempRet0};var wasmExports;createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["__wasm_call_ctors"])();var _fopen=Module["_fopen"]=(a0,a1)=>(_fopen=Module["_fopen"]=wasmExports["fopen"])(a0,a1);var _fflush=Module["_fflush"]=a0=>(_fflush=Module["_fflush"]=wasmExports["fflush"])(a0);var ___errno_location=Module["___errno_location"]=()=>(___errno_location=Module["___errno_location"]=wasmExports["__errno_location"])();var _ProcessInterrupts=Module["_ProcessInterrupts"]=()=>(_ProcessInterrupts=Module["_ProcessInterrupts"]=wasmExports["ProcessInterrupts"])();var _errstart_cold=Module["_errstart_cold"]=(a0,a1)=>(_errstart_cold=Module["_errstart_cold"]=wasmExports["errstart_cold"])(a0,a1);var _errcode=Module["_errcode"]=a0=>(_errcode=Module["_errcode"]=wasmExports["errcode"])(a0);var _errmsg=Module["_errmsg"]=(a0,a1)=>(_errmsg=Module["_errmsg"]=wasmExports["errmsg"])(a0,a1);var _errfinish=Module["_errfinish"]=(a0,a1,a2)=>(_errfinish=Module["_errfinish"]=wasmExports["errfinish"])(a0,a1,a2);var _puts=Module["_puts"]=a0=>(_puts=Module["_puts"]=wasmExports["puts"])(a0);var _errstart=Module["_errstart"]=(a0,a1)=>(_errstart=Module["_errstart"]=wasmExports["errstart"])(a0,a1);var _errmsg_internal=Module["_errmsg_internal"]=(a0,a1)=>(_errmsg_internal=Module["_errmsg_internal"]=wasmExports["errmsg_internal"])(a0,a1);var _errdetail=Module["_errdetail"]=(a0,a1)=>(_errdetail=Module["_errdetail"]=wasmExports["errdetail"])(a0,a1);var _errhint=Module["_errhint"]=(a0,a1)=>(_errhint=Module["_errhint"]=wasmExports["errhint"])(a0,a1);var _pg_parse_query=Module["_pg_parse_query"]=a0=>(_pg_parse_query=Module["_pg_parse_query"]=wasmExports["pg_parse_query"])(a0);var _gettimeofday=Module["_gettimeofday"]=(a0,a1)=>(_gettimeofday=Module["_gettimeofday"]=wasmExports["gettimeofday"])(a0,a1);var _raw_parser=Module["_raw_parser"]=(a0,a1)=>(_raw_parser=Module["_raw_parser"]=wasmExports["raw_parser"])(a0,a1);var _initStringInfo=Module["_initStringInfo"]=a0=>(_initStringInfo=Module["_initStringInfo"]=wasmExports["initStringInfo"])(a0);var _appendStringInfoString=Module["_appendStringInfoString"]=(a0,a1)=>(_appendStringInfoString=Module["_appendStringInfoString"]=wasmExports["appendStringInfoString"])(a0,a1);var _appendStringInfo=Module["_appendStringInfo"]=(a0,a1,a2)=>(_appendStringInfo=Module["_appendStringInfo"]=wasmExports["appendStringInfo"])(a0,a1,a2);var _errdetail_internal=Module["_errdetail_internal"]=(a0,a1)=>(_errdetail_internal=Module["_errdetail_internal"]=wasmExports["errdetail_internal"])(a0,a1);var _pfree=Module["_pfree"]=a0=>(_pfree=Module["_pfree"]=wasmExports["pfree"])(a0);var _list_make1_impl=Module["_list_make1_impl"]=(a0,a1)=>(_list_make1_impl=Module["_list_make1_impl"]=wasmExports["list_make1_impl"])(a0,a1);var _QueryRewrite=Module["_QueryRewrite"]=a0=>(_QueryRewrite=Module["_QueryRewrite"]=wasmExports["QueryRewrite"])(a0);var _pg_plan_query=Module["_pg_plan_query"]=(a0,a1,a2,a3)=>(_pg_plan_query=Module["_pg_plan_query"]=wasmExports["pg_plan_query"])(a0,a1,a2,a3);var _palloc0=Module["_palloc0"]=a0=>(_palloc0=Module["_palloc0"]=wasmExports["palloc0"])(a0);var _lappend=Module["_lappend"]=(a0,a1)=>(_lappend=Module["_lappend"]=wasmExports["lappend"])(a0,a1);var _GetCurrentTimestamp=Module["_GetCurrentTimestamp"]=()=>(_GetCurrentTimestamp=Module["_GetCurrentTimestamp"]=wasmExports["GetCurrentTimestamp"])();var _pg_prng_double=Module["_pg_prng_double"]=a0=>(_pg_prng_double=Module["_pg_prng_double"]=wasmExports["pg_prng_double"])(a0);var _pg_snprintf=Module["_pg_snprintf"]=(a0,a1,a2,a3)=>(_pg_snprintf=Module["_pg_snprintf"]=wasmExports["pg_snprintf"])(a0,a1,a2,a3);var _die=Module["_die"]=a0=>(_die=Module["_die"]=wasmExports["die"])(a0);var _check_stack_depth=Module["_check_stack_depth"]=()=>(_check_stack_depth=Module["_check_stack_depth"]=wasmExports["check_stack_depth"])();var _pre_format_elog_string=Module["_pre_format_elog_string"]=(a0,a1)=>(_pre_format_elog_string=Module["_pre_format_elog_string"]=wasmExports["pre_format_elog_string"])(a0,a1);var _format_elog_string=Module["_format_elog_string"]=(a0,a1)=>(_format_elog_string=Module["_format_elog_string"]=wasmExports["format_elog_string"])(a0,a1);var _pstrdup=Module["_pstrdup"]=a0=>(_pstrdup=Module["_pstrdup"]=wasmExports["pstrdup"])(a0);var _SplitIdentifierString=Module["_SplitIdentifierString"]=(a0,a1,a2)=>(_SplitIdentifierString=Module["_SplitIdentifierString"]=wasmExports["SplitIdentifierString"])(a0,a1,a2);var _list_free=Module["_list_free"]=a0=>(_list_free=Module["_list_free"]=wasmExports["list_free"])(a0);var _pg_strcasecmp=Module["_pg_strcasecmp"]=(a0,a1)=>(_pg_strcasecmp=Module["_pg_strcasecmp"]=wasmExports["pg_strcasecmp"])(a0,a1);var _guc_malloc=Module["_guc_malloc"]=(a0,a1)=>(_guc_malloc=Module["_guc_malloc"]=wasmExports["guc_malloc"])(a0,a1);var _SetConfigOption=Module["_SetConfigOption"]=(a0,a1,a2,a3)=>(_SetConfigOption=Module["_SetConfigOption"]=wasmExports["SetConfigOption"])(a0,a1,a2,a3);var _pg_sprintf=Module["_pg_sprintf"]=(a0,a1,a2)=>(_pg_sprintf=Module["_pg_sprintf"]=wasmExports["pg_sprintf"])(a0,a1,a2);var _strcmp=Module["_strcmp"]=(a0,a1)=>(_strcmp=Module["_strcmp"]=wasmExports["strcmp"])(a0,a1);var _strdup=Module["_strdup"]=a0=>(_strdup=Module["_strdup"]=wasmExports["strdup"])(a0);var _atoi=Module["_atoi"]=a0=>(_atoi=Module["_atoi"]=wasmExports["atoi"])(a0);var _strlcpy=Module["_strlcpy"]=(a0,a1,a2)=>(_strlcpy=Module["_strlcpy"]=wasmExports["strlcpy"])(a0,a1,a2);var _pgl_shutdown=Module["_pgl_shutdown"]=()=>(_pgl_shutdown=Module["_pgl_shutdown"]=wasmExports["pgl_shutdown"])();var _pgl_closed=Module["_pgl_closed"]=()=>(_pgl_closed=Module["_pgl_closed"]=wasmExports["pgl_closed"])();var _MemoryContextReset=Module["_MemoryContextReset"]=a0=>(_MemoryContextReset=Module["_MemoryContextReset"]=wasmExports["MemoryContextReset"])(a0);var _resetStringInfo=Module["_resetStringInfo"]=a0=>(_resetStringInfo=Module["_resetStringInfo"]=wasmExports["resetStringInfo"])(a0);var _getc=Module["_getc"]=a0=>(_getc=Module["_getc"]=wasmExports["getc"])(a0);var _appendStringInfoChar=Module["_appendStringInfoChar"]=(a0,a1)=>(_appendStringInfoChar=Module["_appendStringInfoChar"]=wasmExports["appendStringInfoChar"])(a0,a1);var _strlen=Module["_strlen"]=a0=>(_strlen=Module["_strlen"]=wasmExports["strlen"])(a0);var _strncmp=Module["_strncmp"]=(a0,a1,a2)=>(_strncmp=Module["_strncmp"]=wasmExports["strncmp"])(a0,a1,a2);var _pg_fprintf=Module["_pg_fprintf"]=(a0,a1,a2)=>(_pg_fprintf=Module["_pg_fprintf"]=wasmExports["pg_fprintf"])(a0,a1,a2);var _pgstat_report_activity=Module["_pgstat_report_activity"]=(a0,a1)=>(_pgstat_report_activity=Module["_pgstat_report_activity"]=wasmExports["pgstat_report_activity"])(a0,a1);var _errhidestmt=Module["_errhidestmt"]=a0=>(_errhidestmt=Module["_errhidestmt"]=wasmExports["errhidestmt"])(a0);var _GetTransactionSnapshot=Module["_GetTransactionSnapshot"]=()=>(_GetTransactionSnapshot=Module["_GetTransactionSnapshot"]=wasmExports["GetTransactionSnapshot"])();var _PushActiveSnapshot=Module["_PushActiveSnapshot"]=a0=>(_PushActiveSnapshot=Module["_PushActiveSnapshot"]=wasmExports["PushActiveSnapshot"])(a0);var _AllocSetContextCreateInternal=Module["_AllocSetContextCreateInternal"]=(a0,a1,a2,a3,a4)=>(_AllocSetContextCreateInternal=Module["_AllocSetContextCreateInternal"]=wasmExports["AllocSetContextCreateInternal"])(a0,a1,a2,a3,a4);var _PopActiveSnapshot=Module["_PopActiveSnapshot"]=()=>(_PopActiveSnapshot=Module["_PopActiveSnapshot"]=wasmExports["PopActiveSnapshot"])();var _CreateDestReceiver=Module["_CreateDestReceiver"]=a0=>(_CreateDestReceiver=Module["_CreateDestReceiver"]=wasmExports["CreateDestReceiver"])(a0);var _CommitTransactionCommand=Module["_CommitTransactionCommand"]=()=>(_CommitTransactionCommand=Module["_CommitTransactionCommand"]=wasmExports["CommitTransactionCommand"])();var _CommandCounterIncrement=Module["_CommandCounterIncrement"]=()=>(_CommandCounterIncrement=Module["_CommandCounterIncrement"]=wasmExports["CommandCounterIncrement"])();var _MemoryContextDelete=Module["_MemoryContextDelete"]=a0=>(_MemoryContextDelete=Module["_MemoryContextDelete"]=wasmExports["MemoryContextDelete"])(a0);var _StartTransactionCommand=Module["_StartTransactionCommand"]=()=>(_StartTransactionCommand=Module["_StartTransactionCommand"]=wasmExports["StartTransactionCommand"])();var ___wasm_setjmp_test=Module["___wasm_setjmp_test"]=(a0,a1)=>(___wasm_setjmp_test=Module["___wasm_setjmp_test"]=wasmExports["__wasm_setjmp_test"])(a0,a1);var _pg_printf=Module["_pg_printf"]=(a0,a1)=>(_pg_printf=Module["_pg_printf"]=wasmExports["pg_printf"])(a0,a1);var ___wasm_setjmp=Module["___wasm_setjmp"]=(a0,a1,a2)=>(___wasm_setjmp=Module["___wasm_setjmp"]=wasmExports["__wasm_setjmp"])(a0,a1,a2);var _FlushErrorState=Module["_FlushErrorState"]=()=>(_FlushErrorState=Module["_FlushErrorState"]=wasmExports["FlushErrorState"])();var _emscripten_longjmp=Module["_emscripten_longjmp"]=(a0,a1)=>(_emscripten_longjmp=Module["_emscripten_longjmp"]=wasmExports["emscripten_longjmp"])(a0,a1);var _enlargeStringInfo=Module["_enlargeStringInfo"]=(a0,a1)=>(_enlargeStringInfo=Module["_enlargeStringInfo"]=wasmExports["enlargeStringInfo"])(a0,a1);var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["malloc"])(a0);var _realloc=Module["_realloc"]=(a0,a1)=>(_realloc=Module["_realloc"]=wasmExports["realloc"])(a0,a1);var _getenv=Module["_getenv"]=a0=>(_getenv=Module["_getenv"]=wasmExports["getenv"])(a0);var _strspn=Module["_strspn"]=(a0,a1)=>(_strspn=Module["_strspn"]=wasmExports["strspn"])(a0,a1);var _memcpy=Module["_memcpy"]=(a0,a1,a2)=>(_memcpy=Module["_memcpy"]=wasmExports["memcpy"])(a0,a1,a2);var _fileno=Module["_fileno"]=a0=>(_fileno=Module["_fileno"]=wasmExports["fileno"])(a0);var _strchr=Module["_strchr"]=(a0,a1)=>(_strchr=Module["_strchr"]=wasmExports["strchr"])(a0,a1);var _free=Module["_free"]=a0=>(_free=Module["_free"]=wasmExports["free"])(a0);var _pg_vsnprintf=Module["_pg_vsnprintf"]=(a0,a1,a2,a3)=>(_pg_vsnprintf=Module["_pg_vsnprintf"]=wasmExports["pg_vsnprintf"])(a0,a1,a2,a3);var _strcpy=Module["_strcpy"]=(a0,a1)=>(_strcpy=Module["_strcpy"]=wasmExports["strcpy"])(a0,a1);var _psprintf=Module["_psprintf"]=(a0,a1)=>(_psprintf=Module["_psprintf"]=wasmExports["psprintf"])(a0,a1);var _stat=Module["_stat"]=(a0,a1)=>(_stat=Module["_stat"]=wasmExports["stat"])(a0,a1);var _fwrite=Module["_fwrite"]=(a0,a1,a2,a3)=>(_fwrite=Module["_fwrite"]=wasmExports["fwrite"])(a0,a1,a2,a3);var _strftime=Module["_strftime"]=(a0,a1,a2,a3)=>(_strftime=Module["_strftime"]=wasmExports["strftime"])(a0,a1,a2,a3);var _strstr=Module["_strstr"]=(a0,a1)=>(_strstr=Module["_strstr"]=wasmExports["strstr"])(a0,a1);var _atexit=Module["_atexit"]=a0=>(_atexit=Module["_atexit"]=wasmExports["atexit"])(a0);var _strtol=Module["_strtol"]=(a0,a1,a2)=>(_strtol=Module["_strtol"]=wasmExports["strtol"])(a0,a1,a2);var _ferror=Module["_ferror"]=a0=>(_ferror=Module["_ferror"]=wasmExports["ferror"])(a0);var _clear_error=Module["_clear_error"]=()=>(_clear_error=Module["_clear_error"]=wasmExports["clear_error"])();var _interactive_one=Module["_interactive_one"]=(a0,a1)=>(_interactive_one=Module["_interactive_one"]=wasmExports["interactive_one"])(a0,a1);var _pq_getmsgint=Module["_pq_getmsgint"]=(a0,a1)=>(_pq_getmsgint=Module["_pq_getmsgint"]=wasmExports["pq_getmsgint"])(a0,a1);var _palloc=Module["_palloc"]=a0=>(_palloc=Module["_palloc"]=wasmExports["palloc"])(a0);var _makeParamList=Module["_makeParamList"]=a0=>(_makeParamList=Module["_makeParamList"]=wasmExports["makeParamList"])(a0);var _getTypeInputInfo=Module["_getTypeInputInfo"]=(a0,a1,a2)=>(_getTypeInputInfo=Module["_getTypeInputInfo"]=wasmExports["getTypeInputInfo"])(a0,a1,a2);var _pnstrdup=Module["_pnstrdup"]=(a0,a1)=>(_pnstrdup=Module["_pnstrdup"]=wasmExports["pnstrdup"])(a0,a1);var _MemoryContextSetParent=Module["_MemoryContextSetParent"]=(a0,a1)=>(_MemoryContextSetParent=Module["_MemoryContextSetParent"]=wasmExports["MemoryContextSetParent"])(a0,a1);var _pgl_backend=Module["_pgl_backend"]=()=>(_pgl_backend=Module["_pgl_backend"]=wasmExports["pgl_backend"])();var _pgl_initdb=Module["_pgl_initdb"]=()=>(_pgl_initdb=Module["_pgl_initdb"]=wasmExports["pgl_initdb"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["__main_argc_argv"])(a0,a1);var _appendStringInfoStringQuoted=Module["_appendStringInfoStringQuoted"]=(a0,a1,a2)=>(_appendStringInfoStringQuoted=Module["_appendStringInfoStringQuoted"]=wasmExports["appendStringInfoStringQuoted"])(a0,a1,a2);var _set_errcontext_domain=Module["_set_errcontext_domain"]=a0=>(_set_errcontext_domain=Module["_set_errcontext_domain"]=wasmExports["set_errcontext_domain"])(a0);var _errcontext_msg=Module["_errcontext_msg"]=(a0,a1)=>(_errcontext_msg=Module["_errcontext_msg"]=wasmExports["errcontext_msg"])(a0,a1);var _pg_is_ascii=Module["_pg_is_ascii"]=a0=>(_pg_is_ascii=Module["_pg_is_ascii"]=wasmExports["pg_is_ascii"])(a0);var _memchr=Module["_memchr"]=(a0,a1,a2)=>(_memchr=Module["_memchr"]=wasmExports["memchr"])(a0,a1,a2);var _strrchr=Module["_strrchr"]=(a0,a1)=>(_strrchr=Module["_strrchr"]=wasmExports["strrchr"])(a0,a1);var _xsltFreeStylesheet=Module["_xsltFreeStylesheet"]=a0=>(_xsltFreeStylesheet=Module["_xsltFreeStylesheet"]=wasmExports["xsltFreeStylesheet"])(a0);var _xsltParseStylesheetDoc=Module["_xsltParseStylesheetDoc"]=a0=>(_xsltParseStylesheetDoc=Module["_xsltParseStylesheetDoc"]=wasmExports["xsltParseStylesheetDoc"])(a0);var _xsltSaveResultToString=Module["_xsltSaveResultToString"]=(a0,a1,a2,a3)=>(_xsltSaveResultToString=Module["_xsltSaveResultToString"]=wasmExports["xsltSaveResultToString"])(a0,a1,a2,a3);var _xsltCleanupGlobals=Module["_xsltCleanupGlobals"]=()=>(_xsltCleanupGlobals=Module["_xsltCleanupGlobals"]=wasmExports["xsltCleanupGlobals"])();var _xsltNewTransformContext=Module["_xsltNewTransformContext"]=(a0,a1)=>(_xsltNewTransformContext=Module["_xsltNewTransformContext"]=wasmExports["xsltNewTransformContext"])(a0,a1);var _xsltFreeTransformContext=Module["_xsltFreeTransformContext"]=a0=>(_xsltFreeTransformContext=Module["_xsltFreeTransformContext"]=wasmExports["xsltFreeTransformContext"])(a0);var _xsltApplyStylesheetUser=Module["_xsltApplyStylesheetUser"]=(a0,a1,a2,a3,a4,a5)=>(_xsltApplyStylesheetUser=Module["_xsltApplyStylesheetUser"]=wasmExports["xsltApplyStylesheetUser"])(a0,a1,a2,a3,a4,a5);var _xsltNewSecurityPrefs=Module["_xsltNewSecurityPrefs"]=()=>(_xsltNewSecurityPrefs=Module["_xsltNewSecurityPrefs"]=wasmExports["xsltNewSecurityPrefs"])();var _xsltFreeSecurityPrefs=Module["_xsltFreeSecurityPrefs"]=a0=>(_xsltFreeSecurityPrefs=Module["_xsltFreeSecurityPrefs"]=wasmExports["xsltFreeSecurityPrefs"])(a0);var _xsltSetSecurityPrefs=Module["_xsltSetSecurityPrefs"]=(a0,a1,a2)=>(_xsltSetSecurityPrefs=Module["_xsltSetSecurityPrefs"]=wasmExports["xsltSetSecurityPrefs"])(a0,a1,a2);var _xsltSetCtxtSecurityPrefs=Module["_xsltSetCtxtSecurityPrefs"]=(a0,a1)=>(_xsltSetCtxtSecurityPrefs=Module["_xsltSetCtxtSecurityPrefs"]=wasmExports["xsltSetCtxtSecurityPrefs"])(a0,a1);var _xsltSecurityForbid=Module["_xsltSecurityForbid"]=(a0,a1,a2)=>(_xsltSecurityForbid=Module["_xsltSecurityForbid"]=wasmExports["xsltSecurityForbid"])(a0,a1,a2);var _replace_percent_placeholders=Module["_replace_percent_placeholders"]=(a0,a1,a2,a3)=>(_replace_percent_placeholders=Module["_replace_percent_placeholders"]=wasmExports["replace_percent_placeholders"])(a0,a1,a2,a3);var _memset=Module["_memset"]=(a0,a1,a2)=>(_memset=Module["_memset"]=wasmExports["memset"])(a0,a1,a2);var _MemoryContextAllocZero=Module["_MemoryContextAllocZero"]=(a0,a1)=>(_MemoryContextAllocZero=Module["_MemoryContextAllocZero"]=wasmExports["MemoryContextAllocZero"])(a0,a1);var _MemoryContextAllocExtended=Module["_MemoryContextAllocExtended"]=(a0,a1,a2)=>(_MemoryContextAllocExtended=Module["_MemoryContextAllocExtended"]=wasmExports["MemoryContextAllocExtended"])(a0,a1,a2);var _hash_bytes=Module["_hash_bytes"]=(a0,a1)=>(_hash_bytes=Module["_hash_bytes"]=wasmExports["hash_bytes"])(a0,a1);var _memcmp=Module["_memcmp"]=(a0,a1,a2)=>(_memcmp=Module["_memcmp"]=wasmExports["memcmp"])(a0,a1,a2);var _repalloc=Module["_repalloc"]=(a0,a1)=>(_repalloc=Module["_repalloc"]=wasmExports["repalloc"])(a0,a1);var _pg_qsort=Module["_pg_qsort"]=(a0,a1,a2,a3)=>(_pg_qsort=Module["_pg_qsort"]=wasmExports["pg_qsort"])(a0,a1,a2,a3);var _OpenTransientFile=Module["_OpenTransientFile"]=(a0,a1)=>(_OpenTransientFile=Module["_OpenTransientFile"]=wasmExports["OpenTransientFile"])(a0,a1);var _errcode_for_file_access=Module["_errcode_for_file_access"]=()=>(_errcode_for_file_access=Module["_errcode_for_file_access"]=wasmExports["errcode_for_file_access"])();var _read=Module["_read"]=(a0,a1,a2)=>(_read=Module["_read"]=wasmExports["read"])(a0,a1,a2);var _CloseTransientFile=Module["_CloseTransientFile"]=a0=>(_CloseTransientFile=Module["_CloseTransientFile"]=wasmExports["CloseTransientFile"])(a0);var _time=Module["_time"]=a0=>(_time=Module["_time"]=wasmExports["time"])(a0);var _close=Module["_close"]=a0=>(_close=Module["_close"]=wasmExports["close"])(a0);var ___multi3=Module["___multi3"]=(a0,a1,a2,a3,a4)=>(___multi3=Module["___multi3"]=wasmExports["__multi3"])(a0,a1,a2,a3,a4);var _isalnum=Module["_isalnum"]=a0=>(_isalnum=Module["_isalnum"]=wasmExports["isalnum"])(a0);var _wait_result_to_str=Module["_wait_result_to_str"]=a0=>(_wait_result_to_str=Module["_wait_result_to_str"]=wasmExports["wait_result_to_str"])(a0);var _float_to_shortest_decimal_bufn=Module["_float_to_shortest_decimal_bufn"]=(a0,a1)=>(_float_to_shortest_decimal_bufn=Module["_float_to_shortest_decimal_bufn"]=wasmExports["float_to_shortest_decimal_bufn"])(a0,a1);var _float_to_shortest_decimal_buf=Module["_float_to_shortest_decimal_buf"]=(a0,a1)=>(_float_to_shortest_decimal_buf=Module["_float_to_shortest_decimal_buf"]=wasmExports["float_to_shortest_decimal_buf"])(a0,a1);var _memmove=Module["_memmove"]=(a0,a1,a2)=>(_memmove=Module["_memmove"]=wasmExports["memmove"])(a0,a1,a2);var _pwrite=Module["_pwrite"]=(a0,a1,a2,a3)=>(_pwrite=Module["_pwrite"]=wasmExports["pwrite"])(a0,a1,a2,a3);var _hash_bytes_extended=Module["_hash_bytes_extended"]=(a0,a1,a2)=>(_hash_bytes_extended=Module["_hash_bytes_extended"]=wasmExports["hash_bytes_extended"])(a0,a1,a2);var _calloc=(a0,a1)=>(_calloc=wasmExports["calloc"])(a0,a1);var _IsValidJsonNumber=Module["_IsValidJsonNumber"]=(a0,a1)=>(_IsValidJsonNumber=Module["_IsValidJsonNumber"]=wasmExports["IsValidJsonNumber"])(a0,a1);var _appendBinaryStringInfo=Module["_appendBinaryStringInfo"]=(a0,a1,a2)=>(_appendBinaryStringInfo=Module["_appendBinaryStringInfo"]=wasmExports["appendBinaryStringInfo"])(a0,a1,a2);var _makeStringInfo=Module["_makeStringInfo"]=()=>(_makeStringInfo=Module["_makeStringInfo"]=wasmExports["makeStringInfo"])();var _GetDatabaseEncodingName=Module["_GetDatabaseEncodingName"]=()=>(_GetDatabaseEncodingName=Module["_GetDatabaseEncodingName"]=wasmExports["GetDatabaseEncodingName"])();var _ScanKeywordLookup=Module["_ScanKeywordLookup"]=(a0,a1)=>(_ScanKeywordLookup=Module["_ScanKeywordLookup"]=wasmExports["ScanKeywordLookup"])(a0,a1);var _strtoul=Module["_strtoul"]=(a0,a1,a2)=>(_strtoul=Module["_strtoul"]=wasmExports["strtoul"])(a0,a1,a2);var _sscanf=Module["_sscanf"]=(a0,a1,a2)=>(_sscanf=Module["_sscanf"]=wasmExports["sscanf"])(a0,a1,a2);var _strtoull=Module["_strtoull"]=(a0,a1,a2)=>(_strtoull=Module["_strtoull"]=wasmExports["strtoull"])(a0,a1,a2);var _pg_prng_uint64=Module["_pg_prng_uint64"]=a0=>(_pg_prng_uint64=Module["_pg_prng_uint64"]=wasmExports["pg_prng_uint64"])(a0);var _pg_prng_uint32=Module["_pg_prng_uint32"]=a0=>(_pg_prng_uint32=Module["_pg_prng_uint32"]=wasmExports["pg_prng_uint32"])(a0);var _log=Module["_log"]=a0=>(_log=Module["_log"]=wasmExports["log"])(a0);var _sin=Module["_sin"]=a0=>(_sin=Module["_sin"]=wasmExports["sin"])(a0);var _readdir=Module["_readdir"]=a0=>(_readdir=Module["_readdir"]=wasmExports["readdir"])(a0);var _forkname_to_number=Module["_forkname_to_number"]=a0=>(_forkname_to_number=Module["_forkname_to_number"]=wasmExports["forkname_to_number"])(a0);var _unlink=Module["_unlink"]=a0=>(_unlink=Module["_unlink"]=wasmExports["unlink"])(a0);var _pg_utf_mblen_private=Module["_pg_utf_mblen_private"]=a0=>(_pg_utf_mblen_private=Module["_pg_utf_mblen_private"]=wasmExports["pg_utf_mblen_private"])(a0);var _bsearch=Module["_bsearch"]=(a0,a1,a2,a3,a4)=>(_bsearch=Module["_bsearch"]=wasmExports["bsearch"])(a0,a1,a2,a3,a4);var _palloc_extended=Module["_palloc_extended"]=(a0,a1)=>(_palloc_extended=Module["_palloc_extended"]=wasmExports["palloc_extended"])(a0,a1);var _appendStringInfoSpaces=Module["_appendStringInfoSpaces"]=(a0,a1)=>(_appendStringInfoSpaces=Module["_appendStringInfoSpaces"]=wasmExports["appendStringInfoSpaces"])(a0,a1);var _geteuid=Module["_geteuid"]=()=>(_geteuid=Module["_geteuid"]=wasmExports["geteuid"])();var _fcntl=Module["_fcntl"]=(a0,a1,a2)=>(_fcntl=Module["_fcntl"]=wasmExports["fcntl"])(a0,a1,a2);var _pg_popcount_optimized=Module["_pg_popcount_optimized"]=(a0,a1)=>(_pg_popcount_optimized=Module["_pg_popcount_optimized"]=wasmExports["pg_popcount_optimized"])(a0,a1);var _pg_strong_random=Module["_pg_strong_random"]=(a0,a1)=>(_pg_strong_random=Module["_pg_strong_random"]=wasmExports["pg_strong_random"])(a0,a1);var _open=Module["_open"]=(a0,a1,a2)=>(_open=Module["_open"]=wasmExports["open"])(a0,a1,a2);var _pg_usleep=Module["_pg_usleep"]=a0=>(_pg_usleep=Module["_pg_usleep"]=wasmExports["pg_usleep"])(a0);var _nanosleep=Module["_nanosleep"]=(a0,a1)=>(_nanosleep=Module["_nanosleep"]=wasmExports["nanosleep"])(a0,a1);var _getpid=Module["_getpid"]=()=>(_getpid=Module["_getpid"]=wasmExports["getpid"])();var _qsort_arg=Module["_qsort_arg"]=(a0,a1,a2,a3,a4)=>(_qsort_arg=Module["_qsort_arg"]=wasmExports["qsort_arg"])(a0,a1,a2,a3,a4);var _strerror=Module["_strerror"]=a0=>(_strerror=Module["_strerror"]=wasmExports["strerror"])(a0);var _RelationGetNumberOfBlocksInFork=Module["_RelationGetNumberOfBlocksInFork"]=(a0,a1)=>(_RelationGetNumberOfBlocksInFork=Module["_RelationGetNumberOfBlocksInFork"]=wasmExports["RelationGetNumberOfBlocksInFork"])(a0,a1);var _ExtendBufferedRel=Module["_ExtendBufferedRel"]=(a0,a1,a2,a3)=>(_ExtendBufferedRel=Module["_ExtendBufferedRel"]=wasmExports["ExtendBufferedRel"])(a0,a1,a2,a3);var _MarkBufferDirty=Module["_MarkBufferDirty"]=a0=>(_MarkBufferDirty=Module["_MarkBufferDirty"]=wasmExports["MarkBufferDirty"])(a0);var _XLogBeginInsert=Module["_XLogBeginInsert"]=()=>(_XLogBeginInsert=Module["_XLogBeginInsert"]=wasmExports["XLogBeginInsert"])();var _XLogRegisterData=Module["_XLogRegisterData"]=(a0,a1)=>(_XLogRegisterData=Module["_XLogRegisterData"]=wasmExports["XLogRegisterData"])(a0,a1);var _XLogInsert=Module["_XLogInsert"]=(a0,a1)=>(_XLogInsert=Module["_XLogInsert"]=wasmExports["XLogInsert"])(a0,a1);var _UnlockReleaseBuffer=Module["_UnlockReleaseBuffer"]=a0=>(_UnlockReleaseBuffer=Module["_UnlockReleaseBuffer"]=wasmExports["UnlockReleaseBuffer"])(a0);var _brin_build_desc=Module["_brin_build_desc"]=a0=>(_brin_build_desc=Module["_brin_build_desc"]=wasmExports["brin_build_desc"])(a0);var _EnterParallelMode=Module["_EnterParallelMode"]=()=>(_EnterParallelMode=Module["_EnterParallelMode"]=wasmExports["EnterParallelMode"])();var _CreateParallelContext=Module["_CreateParallelContext"]=(a0,a1,a2)=>(_CreateParallelContext=Module["_CreateParallelContext"]=wasmExports["CreateParallelContext"])(a0,a1,a2);var _RegisterSnapshot=Module["_RegisterSnapshot"]=a0=>(_RegisterSnapshot=Module["_RegisterSnapshot"]=wasmExports["RegisterSnapshot"])(a0);var _table_parallelscan_estimate=Module["_table_parallelscan_estimate"]=(a0,a1)=>(_table_parallelscan_estimate=Module["_table_parallelscan_estimate"]=wasmExports["table_parallelscan_estimate"])(a0,a1);var _add_size=Module["_add_size"]=(a0,a1)=>(_add_size=Module["_add_size"]=wasmExports["add_size"])(a0,a1);var _tuplesort_estimate_shared=Module["_tuplesort_estimate_shared"]=a0=>(_tuplesort_estimate_shared=Module["_tuplesort_estimate_shared"]=wasmExports["tuplesort_estimate_shared"])(a0);var _InitializeParallelDSM=Module["_InitializeParallelDSM"]=a0=>(_InitializeParallelDSM=Module["_InitializeParallelDSM"]=wasmExports["InitializeParallelDSM"])(a0);var _UnregisterSnapshot=Module["_UnregisterSnapshot"]=a0=>(_UnregisterSnapshot=Module["_UnregisterSnapshot"]=wasmExports["UnregisterSnapshot"])(a0);var _DestroyParallelContext=Module["_DestroyParallelContext"]=a0=>(_DestroyParallelContext=Module["_DestroyParallelContext"]=wasmExports["DestroyParallelContext"])(a0);var _ExitParallelMode=Module["_ExitParallelMode"]=()=>(_ExitParallelMode=Module["_ExitParallelMode"]=wasmExports["ExitParallelMode"])();var _shm_toc_allocate=Module["_shm_toc_allocate"]=(a0,a1)=>(_shm_toc_allocate=Module["_shm_toc_allocate"]=wasmExports["shm_toc_allocate"])(a0,a1);var _ConditionVariableInit=Module["_ConditionVariableInit"]=a0=>(_ConditionVariableInit=Module["_ConditionVariableInit"]=wasmExports["ConditionVariableInit"])(a0);var _s_init_lock_sema=Module["_s_init_lock_sema"]=(a0,a1)=>(_s_init_lock_sema=Module["_s_init_lock_sema"]=wasmExports["s_init_lock_sema"])(a0,a1);var _table_parallelscan_initialize=Module["_table_parallelscan_initialize"]=(a0,a1,a2)=>(_table_parallelscan_initialize=Module["_table_parallelscan_initialize"]=wasmExports["table_parallelscan_initialize"])(a0,a1,a2);var _tuplesort_initialize_shared=Module["_tuplesort_initialize_shared"]=(a0,a1,a2)=>(_tuplesort_initialize_shared=Module["_tuplesort_initialize_shared"]=wasmExports["tuplesort_initialize_shared"])(a0,a1,a2);var _shm_toc_insert=Module["_shm_toc_insert"]=(a0,a1,a2)=>(_shm_toc_insert=Module["_shm_toc_insert"]=wasmExports["shm_toc_insert"])(a0,a1,a2);var _LaunchParallelWorkers=Module["_LaunchParallelWorkers"]=a0=>(_LaunchParallelWorkers=Module["_LaunchParallelWorkers"]=wasmExports["LaunchParallelWorkers"])(a0);var _WaitForParallelWorkersToAttach=Module["_WaitForParallelWorkersToAttach"]=a0=>(_WaitForParallelWorkersToAttach=Module["_WaitForParallelWorkersToAttach"]=wasmExports["WaitForParallelWorkersToAttach"])(a0);var _tas_sema=Module["_tas_sema"]=a0=>(_tas_sema=Module["_tas_sema"]=wasmExports["tas_sema"])(a0);var _s_lock=Module["_s_lock"]=(a0,a1,a2,a3)=>(_s_lock=Module["_s_lock"]=wasmExports["s_lock"])(a0,a1,a2,a3);var _s_unlock_sema=Module["_s_unlock_sema"]=a0=>(_s_unlock_sema=Module["_s_unlock_sema"]=wasmExports["s_unlock_sema"])(a0);var _ConditionVariableSleep=Module["_ConditionVariableSleep"]=(a0,a1)=>(_ConditionVariableSleep=Module["_ConditionVariableSleep"]=wasmExports["ConditionVariableSleep"])(a0,a1);var _ConditionVariableCancelSleep=Module["_ConditionVariableCancelSleep"]=()=>(_ConditionVariableCancelSleep=Module["_ConditionVariableCancelSleep"]=wasmExports["ConditionVariableCancelSleep"])();var _tuplesort_performsort=Module["_tuplesort_performsort"]=a0=>(_tuplesort_performsort=Module["_tuplesort_performsort"]=wasmExports["tuplesort_performsort"])(a0);var _tuplesort_end=Module["_tuplesort_end"]=a0=>(_tuplesort_end=Module["_tuplesort_end"]=wasmExports["tuplesort_end"])(a0);var _brin_deform_tuple=Module["_brin_deform_tuple"]=(a0,a1,a2)=>(_brin_deform_tuple=Module["_brin_deform_tuple"]=wasmExports["brin_deform_tuple"])(a0,a1,a2);var _log_newpage_buffer=Module["_log_newpage_buffer"]=(a0,a1)=>(_log_newpage_buffer=Module["_log_newpage_buffer"]=wasmExports["log_newpage_buffer"])(a0,a1);var _LockBuffer=Module["_LockBuffer"]=(a0,a1)=>(_LockBuffer=Module["_LockBuffer"]=wasmExports["LockBuffer"])(a0,a1);var _ReleaseBuffer=Module["_ReleaseBuffer"]=a0=>(_ReleaseBuffer=Module["_ReleaseBuffer"]=wasmExports["ReleaseBuffer"])(a0);var _IndexGetRelation=Module["_IndexGetRelation"]=(a0,a1)=>(_IndexGetRelation=Module["_IndexGetRelation"]=wasmExports["IndexGetRelation"])(a0,a1);var _table_open=Module["_table_open"]=(a0,a1)=>(_table_open=Module["_table_open"]=wasmExports["table_open"])(a0,a1);var _ReadBufferExtended=Module["_ReadBufferExtended"]=(a0,a1,a2,a3,a4)=>(_ReadBufferExtended=Module["_ReadBufferExtended"]=wasmExports["ReadBufferExtended"])(a0,a1,a2,a3,a4);var _table_close=Module["_table_close"]=(a0,a1)=>(_table_close=Module["_table_close"]=wasmExports["table_close"])(a0,a1);var _build_reloptions=Module["_build_reloptions"]=(a0,a1,a2,a3,a4,a5)=>(_build_reloptions=Module["_build_reloptions"]=wasmExports["build_reloptions"])(a0,a1,a2,a3,a4,a5);var _RelationGetIndexScan=Module["_RelationGetIndexScan"]=(a0,a1,a2)=>(_RelationGetIndexScan=Module["_RelationGetIndexScan"]=wasmExports["RelationGetIndexScan"])(a0,a1,a2);var _pgstat_assoc_relation=Module["_pgstat_assoc_relation"]=a0=>(_pgstat_assoc_relation=Module["_pgstat_assoc_relation"]=wasmExports["pgstat_assoc_relation"])(a0);var _index_getprocinfo=Module["_index_getprocinfo"]=(a0,a1,a2)=>(_index_getprocinfo=Module["_index_getprocinfo"]=wasmExports["index_getprocinfo"])(a0,a1,a2);var _fmgr_info_copy=Module["_fmgr_info_copy"]=(a0,a1,a2)=>(_fmgr_info_copy=Module["_fmgr_info_copy"]=wasmExports["fmgr_info_copy"])(a0,a1,a2);var _FunctionCall4Coll=Module["_FunctionCall4Coll"]=(a0,a1,a2,a3,a4,a5)=>(_FunctionCall4Coll=Module["_FunctionCall4Coll"]=wasmExports["FunctionCall4Coll"])(a0,a1,a2,a3,a4,a5);var _FunctionCall1Coll=Module["_FunctionCall1Coll"]=(a0,a1,a2)=>(_FunctionCall1Coll=Module["_FunctionCall1Coll"]=wasmExports["FunctionCall1Coll"])(a0,a1,a2);var _brin_free_desc=Module["_brin_free_desc"]=a0=>(_brin_free_desc=Module["_brin_free_desc"]=wasmExports["brin_free_desc"])(a0);var _WaitForParallelWorkersToFinish=Module["_WaitForParallelWorkersToFinish"]=a0=>(_WaitForParallelWorkersToFinish=Module["_WaitForParallelWorkersToFinish"]=wasmExports["WaitForParallelWorkersToFinish"])(a0);var _PageGetFreeSpace=Module["_PageGetFreeSpace"]=a0=>(_PageGetFreeSpace=Module["_PageGetFreeSpace"]=wasmExports["PageGetFreeSpace"])(a0);var _BufferGetBlockNumber=Module["_BufferGetBlockNumber"]=a0=>(_BufferGetBlockNumber=Module["_BufferGetBlockNumber"]=wasmExports["BufferGetBlockNumber"])(a0);var _BuildIndexInfo=Module["_BuildIndexInfo"]=a0=>(_BuildIndexInfo=Module["_BuildIndexInfo"]=wasmExports["BuildIndexInfo"])(a0);var _Int64GetDatum=Module["_Int64GetDatum"]=a0=>(_Int64GetDatum=Module["_Int64GetDatum"]=wasmExports["Int64GetDatum"])(a0);var _DirectFunctionCall2Coll=Module["_DirectFunctionCall2Coll"]=(a0,a1,a2,a3)=>(_DirectFunctionCall2Coll=Module["_DirectFunctionCall2Coll"]=wasmExports["DirectFunctionCall2Coll"])(a0,a1,a2,a3);var _RecoveryInProgress=Module["_RecoveryInProgress"]=()=>(_RecoveryInProgress=Module["_RecoveryInProgress"]=wasmExports["RecoveryInProgress"])();var _GetUserIdAndSecContext=Module["_GetUserIdAndSecContext"]=(a0,a1)=>(_GetUserIdAndSecContext=Module["_GetUserIdAndSecContext"]=wasmExports["GetUserIdAndSecContext"])(a0,a1);var _SetUserIdAndSecContext=Module["_SetUserIdAndSecContext"]=(a0,a1)=>(_SetUserIdAndSecContext=Module["_SetUserIdAndSecContext"]=wasmExports["SetUserIdAndSecContext"])(a0,a1);var _NewGUCNestLevel=Module["_NewGUCNestLevel"]=()=>(_NewGUCNestLevel=Module["_NewGUCNestLevel"]=wasmExports["NewGUCNestLevel"])();var _RestrictSearchPath=Module["_RestrictSearchPath"]=()=>(_RestrictSearchPath=Module["_RestrictSearchPath"]=wasmExports["RestrictSearchPath"])();var _index_open=Module["_index_open"]=(a0,a1)=>(_index_open=Module["_index_open"]=wasmExports["index_open"])(a0,a1);var _object_ownercheck=Module["_object_ownercheck"]=(a0,a1,a2)=>(_object_ownercheck=Module["_object_ownercheck"]=wasmExports["object_ownercheck"])(a0,a1,a2);var _aclcheck_error=Module["_aclcheck_error"]=(a0,a1,a2)=>(_aclcheck_error=Module["_aclcheck_error"]=wasmExports["aclcheck_error"])(a0,a1,a2);var _AtEOXact_GUC=Module["_AtEOXact_GUC"]=(a0,a1)=>(_AtEOXact_GUC=Module["_AtEOXact_GUC"]=wasmExports["AtEOXact_GUC"])(a0,a1);var _relation_close=Module["_relation_close"]=(a0,a1)=>(_relation_close=Module["_relation_close"]=wasmExports["relation_close"])(a0,a1);var _GetUserId=Module["_GetUserId"]=()=>(_GetUserId=Module["_GetUserId"]=wasmExports["GetUserId"])();var _ReadBuffer=Module["_ReadBuffer"]=(a0,a1)=>(_ReadBuffer=Module["_ReadBuffer"]=wasmExports["ReadBuffer"])(a0,a1);var _shm_toc_lookup=Module["_shm_toc_lookup"]=(a0,a1,a2)=>(_shm_toc_lookup=Module["_shm_toc_lookup"]=wasmExports["shm_toc_lookup"])(a0,a1,a2);var _tuplesort_attach_shared=Module["_tuplesort_attach_shared"]=(a0,a1)=>(_tuplesort_attach_shared=Module["_tuplesort_attach_shared"]=wasmExports["tuplesort_attach_shared"])(a0,a1);var _index_close=Module["_index_close"]=(a0,a1)=>(_index_close=Module["_index_close"]=wasmExports["index_close"])(a0,a1);var _table_beginscan_parallel=Module["_table_beginscan_parallel"]=(a0,a1)=>(_table_beginscan_parallel=Module["_table_beginscan_parallel"]=wasmExports["table_beginscan_parallel"])(a0,a1);var _ConditionVariableSignal=Module["_ConditionVariableSignal"]=a0=>(_ConditionVariableSignal=Module["_ConditionVariableSignal"]=wasmExports["ConditionVariableSignal"])(a0);var _datumCopy=Module["_datumCopy"]=(a0,a1,a2)=>(_datumCopy=Module["_datumCopy"]=wasmExports["datumCopy"])(a0,a1,a2);var _lookup_type_cache=Module["_lookup_type_cache"]=(a0,a1)=>(_lookup_type_cache=Module["_lookup_type_cache"]=wasmExports["lookup_type_cache"])(a0,a1);var _get_fn_opclass_options=Module["_get_fn_opclass_options"]=a0=>(_get_fn_opclass_options=Module["_get_fn_opclass_options"]=wasmExports["get_fn_opclass_options"])(a0);var _pg_detoast_datum=Module["_pg_detoast_datum"]=a0=>(_pg_detoast_datum=Module["_pg_detoast_datum"]=wasmExports["pg_detoast_datum"])(a0);var _index_getprocid=Module["_index_getprocid"]=(a0,a1,a2)=>(_index_getprocid=Module["_index_getprocid"]=wasmExports["index_getprocid"])(a0,a1,a2);var _init_local_reloptions=Module["_init_local_reloptions"]=(a0,a1)=>(_init_local_reloptions=Module["_init_local_reloptions"]=wasmExports["init_local_reloptions"])(a0,a1);var _FunctionCall2Coll=Module["_FunctionCall2Coll"]=(a0,a1,a2,a3)=>(_FunctionCall2Coll=Module["_FunctionCall2Coll"]=wasmExports["FunctionCall2Coll"])(a0,a1,a2,a3);var _SysCacheGetAttrNotNull=Module["_SysCacheGetAttrNotNull"]=(a0,a1,a2)=>(_SysCacheGetAttrNotNull=Module["_SysCacheGetAttrNotNull"]=wasmExports["SysCacheGetAttrNotNull"])(a0,a1,a2);var _ReleaseSysCache=Module["_ReleaseSysCache"]=a0=>(_ReleaseSysCache=Module["_ReleaseSysCache"]=wasmExports["ReleaseSysCache"])(a0);var _fmgr_info_cxt=Module["_fmgr_info_cxt"]=(a0,a1,a2)=>(_fmgr_info_cxt=Module["_fmgr_info_cxt"]=wasmExports["fmgr_info_cxt"])(a0,a1,a2);var _Float8GetDatum=Module["_Float8GetDatum"]=a0=>(_Float8GetDatum=Module["_Float8GetDatum"]=wasmExports["Float8GetDatum"])(a0);var _numeric_sub=Module["_numeric_sub"]=a0=>(_numeric_sub=Module["_numeric_sub"]=wasmExports["numeric_sub"])(a0);var _DirectFunctionCall1Coll=Module["_DirectFunctionCall1Coll"]=(a0,a1,a2)=>(_DirectFunctionCall1Coll=Module["_DirectFunctionCall1Coll"]=wasmExports["DirectFunctionCall1Coll"])(a0,a1,a2);var _pg_detoast_datum_packed=Module["_pg_detoast_datum_packed"]=a0=>(_pg_detoast_datum_packed=Module["_pg_detoast_datum_packed"]=wasmExports["pg_detoast_datum_packed"])(a0);var _add_local_int_reloption=Module["_add_local_int_reloption"]=(a0,a1,a2,a3,a4,a5,a6)=>(_add_local_int_reloption=Module["_add_local_int_reloption"]=wasmExports["add_local_int_reloption"])(a0,a1,a2,a3,a4,a5,a6);var _getTypeOutputInfo=Module["_getTypeOutputInfo"]=(a0,a1,a2)=>(_getTypeOutputInfo=Module["_getTypeOutputInfo"]=wasmExports["getTypeOutputInfo"])(a0,a1,a2);var _fmgr_info=Module["_fmgr_info"]=(a0,a1)=>(_fmgr_info=Module["_fmgr_info"]=wasmExports["fmgr_info"])(a0,a1);var _OutputFunctionCall=Module["_OutputFunctionCall"]=(a0,a1)=>(_OutputFunctionCall=Module["_OutputFunctionCall"]=wasmExports["OutputFunctionCall"])(a0,a1);var _cstring_to_text_with_len=Module["_cstring_to_text_with_len"]=(a0,a1)=>(_cstring_to_text_with_len=Module["_cstring_to_text_with_len"]=wasmExports["cstring_to_text_with_len"])(a0,a1);var _accumArrayResult=Module["_accumArrayResult"]=(a0,a1,a2,a3,a4)=>(_accumArrayResult=Module["_accumArrayResult"]=wasmExports["accumArrayResult"])(a0,a1,a2,a3,a4);var _makeArrayResult=Module["_makeArrayResult"]=(a0,a1)=>(_makeArrayResult=Module["_makeArrayResult"]=wasmExports["makeArrayResult"])(a0,a1);var _OidOutputFunctionCall=Module["_OidOutputFunctionCall"]=(a0,a1)=>(_OidOutputFunctionCall=Module["_OidOutputFunctionCall"]=wasmExports["OidOutputFunctionCall"])(a0,a1);var _cstring_to_text=Module["_cstring_to_text"]=a0=>(_cstring_to_text=Module["_cstring_to_text"]=wasmExports["cstring_to_text"])(a0);var _PageGetExactFreeSpace=Module["_PageGetExactFreeSpace"]=a0=>(_PageGetExactFreeSpace=Module["_PageGetExactFreeSpace"]=wasmExports["PageGetExactFreeSpace"])(a0);var _PageIndexTupleOverwrite=Module["_PageIndexTupleOverwrite"]=(a0,a1,a2,a3)=>(_PageIndexTupleOverwrite=Module["_PageIndexTupleOverwrite"]=wasmExports["PageIndexTupleOverwrite"])(a0,a1,a2,a3);var _PageInit=Module["_PageInit"]=(a0,a1,a2)=>(_PageInit=Module["_PageInit"]=wasmExports["PageInit"])(a0,a1,a2);var _PageAddItemExtended=Module["_PageAddItemExtended"]=(a0,a1,a2,a3,a4)=>(_PageAddItemExtended=Module["_PageAddItemExtended"]=wasmExports["PageAddItemExtended"])(a0,a1,a2,a3,a4);var _LockRelationForExtension=Module["_LockRelationForExtension"]=(a0,a1)=>(_LockRelationForExtension=Module["_LockRelationForExtension"]=wasmExports["LockRelationForExtension"])(a0,a1);var _UnlockRelationForExtension=Module["_UnlockRelationForExtension"]=(a0,a1)=>(_UnlockRelationForExtension=Module["_UnlockRelationForExtension"]=wasmExports["UnlockRelationForExtension"])(a0,a1);var _smgropen=Module["_smgropen"]=(a0,a1)=>(_smgropen=Module["_smgropen"]=wasmExports["smgropen"])(a0,a1);var _smgrpin=Module["_smgrpin"]=a0=>(_smgrpin=Module["_smgrpin"]=wasmExports["smgrpin"])(a0);var _ItemPointerEquals=Module["_ItemPointerEquals"]=(a0,a1)=>(_ItemPointerEquals=Module["_ItemPointerEquals"]=wasmExports["ItemPointerEquals"])(a0,a1);var _detoast_external_attr=Module["_detoast_external_attr"]=a0=>(_detoast_external_attr=Module["_detoast_external_attr"]=wasmExports["detoast_external_attr"])(a0);var _CreateTemplateTupleDesc=Module["_CreateTemplateTupleDesc"]=a0=>(_CreateTemplateTupleDesc=Module["_CreateTemplateTupleDesc"]=wasmExports["CreateTemplateTupleDesc"])(a0);var _TupleDescInitEntry=Module["_TupleDescInitEntry"]=(a0,a1,a2,a3,a4,a5)=>(_TupleDescInitEntry=Module["_TupleDescInitEntry"]=wasmExports["TupleDescInitEntry"])(a0,a1,a2,a3,a4,a5);var _SearchSysCache1=Module["_SearchSysCache1"]=(a0,a1)=>(_SearchSysCache1=Module["_SearchSysCache1"]=wasmExports["SearchSysCache1"])(a0,a1);var _SearchSysCacheList=Module["_SearchSysCacheList"]=(a0,a1,a2,a3,a4)=>(_SearchSysCacheList=Module["_SearchSysCacheList"]=wasmExports["SearchSysCacheList"])(a0,a1,a2,a3,a4);var _check_amproc_signature=Module["_check_amproc_signature"]=(a0,a1,a2,a3,a4,a5)=>(_check_amproc_signature=Module["_check_amproc_signature"]=wasmExports["check_amproc_signature"])(a0,a1,a2,a3,a4,a5);var _check_amoptsproc_signature=Module["_check_amoptsproc_signature"]=a0=>(_check_amoptsproc_signature=Module["_check_amoptsproc_signature"]=wasmExports["check_amoptsproc_signature"])(a0);var _format_procedure=Module["_format_procedure"]=a0=>(_format_procedure=Module["_format_procedure"]=wasmExports["format_procedure"])(a0);var _format_operator=Module["_format_operator"]=a0=>(_format_operator=Module["_format_operator"]=wasmExports["format_operator"])(a0);var _check_amop_signature=Module["_check_amop_signature"]=(a0,a1,a2,a3)=>(_check_amop_signature=Module["_check_amop_signature"]=wasmExports["check_amop_signature"])(a0,a1,a2,a3);var _identify_opfamily_groups=Module["_identify_opfamily_groups"]=(a0,a1)=>(_identify_opfamily_groups=Module["_identify_opfamily_groups"]=wasmExports["identify_opfamily_groups"])(a0,a1);var _format_type_be=Module["_format_type_be"]=a0=>(_format_type_be=Module["_format_type_be"]=wasmExports["format_type_be"])(a0);var _ReleaseCatCacheList=Module["_ReleaseCatCacheList"]=a0=>(_ReleaseCatCacheList=Module["_ReleaseCatCacheList"]=wasmExports["ReleaseCatCacheList"])(a0);var _format_type_with_typemod=Module["_format_type_with_typemod"]=(a0,a1)=>(_format_type_with_typemod=Module["_format_type_with_typemod"]=wasmExports["format_type_with_typemod"])(a0,a1);var _DatumGetEOHP=Module["_DatumGetEOHP"]=a0=>(_DatumGetEOHP=Module["_DatumGetEOHP"]=wasmExports["DatumGetEOHP"])(a0);var _EOH_get_flat_size=Module["_EOH_get_flat_size"]=a0=>(_EOH_get_flat_size=Module["_EOH_get_flat_size"]=wasmExports["EOH_get_flat_size"])(a0);var _EOH_flatten_into=Module["_EOH_flatten_into"]=(a0,a1,a2)=>(_EOH_flatten_into=Module["_EOH_flatten_into"]=wasmExports["EOH_flatten_into"])(a0,a1,a2);var _getmissingattr=Module["_getmissingattr"]=(a0,a1,a2)=>(_getmissingattr=Module["_getmissingattr"]=wasmExports["getmissingattr"])(a0,a1,a2);var _hash_create=Module["_hash_create"]=(a0,a1,a2,a3)=>(_hash_create=Module["_hash_create"]=wasmExports["hash_create"])(a0,a1,a2,a3);var _hash_search=Module["_hash_search"]=(a0,a1,a2,a3)=>(_hash_search=Module["_hash_search"]=wasmExports["hash_search"])(a0,a1,a2,a3);var _nocachegetattr=Module["_nocachegetattr"]=(a0,a1,a2)=>(_nocachegetattr=Module["_nocachegetattr"]=wasmExports["nocachegetattr"])(a0,a1,a2);var _heap_form_tuple=Module["_heap_form_tuple"]=(a0,a1,a2)=>(_heap_form_tuple=Module["_heap_form_tuple"]=wasmExports["heap_form_tuple"])(a0,a1,a2);var _heap_modify_tuple=Module["_heap_modify_tuple"]=(a0,a1,a2,a3,a4)=>(_heap_modify_tuple=Module["_heap_modify_tuple"]=wasmExports["heap_modify_tuple"])(a0,a1,a2,a3,a4);var _heap_deform_tuple=Module["_heap_deform_tuple"]=(a0,a1,a2,a3)=>(_heap_deform_tuple=Module["_heap_deform_tuple"]=wasmExports["heap_deform_tuple"])(a0,a1,a2,a3);var _heap_modify_tuple_by_cols=Module["_heap_modify_tuple_by_cols"]=(a0,a1,a2,a3,a4,a5)=>(_heap_modify_tuple_by_cols=Module["_heap_modify_tuple_by_cols"]=wasmExports["heap_modify_tuple_by_cols"])(a0,a1,a2,a3,a4,a5);var _heap_freetuple=Module["_heap_freetuple"]=a0=>(_heap_freetuple=Module["_heap_freetuple"]=wasmExports["heap_freetuple"])(a0);var _index_form_tuple=Module["_index_form_tuple"]=(a0,a1,a2)=>(_index_form_tuple=Module["_index_form_tuple"]=wasmExports["index_form_tuple"])(a0,a1,a2);var _nocache_index_getattr=Module["_nocache_index_getattr"]=(a0,a1,a2)=>(_nocache_index_getattr=Module["_nocache_index_getattr"]=wasmExports["nocache_index_getattr"])(a0,a1,a2);var _index_deform_tuple=Module["_index_deform_tuple"]=(a0,a1,a2,a3)=>(_index_deform_tuple=Module["_index_deform_tuple"]=wasmExports["index_deform_tuple"])(a0,a1,a2,a3);var _slot_getsomeattrs_int=Module["_slot_getsomeattrs_int"]=(a0,a1)=>(_slot_getsomeattrs_int=Module["_slot_getsomeattrs_int"]=wasmExports["slot_getsomeattrs_int"])(a0,a1);var _pg_ltoa=Module["_pg_ltoa"]=(a0,a1)=>(_pg_ltoa=Module["_pg_ltoa"]=wasmExports["pg_ltoa"])(a0,a1);var _relation_open=Module["_relation_open"]=(a0,a1)=>(_relation_open=Module["_relation_open"]=wasmExports["relation_open"])(a0,a1);var _LockRelationOid=Module["_LockRelationOid"]=(a0,a1)=>(_LockRelationOid=Module["_LockRelationOid"]=wasmExports["LockRelationOid"])(a0,a1);var _try_relation_open=Module["_try_relation_open"]=(a0,a1)=>(_try_relation_open=Module["_try_relation_open"]=wasmExports["try_relation_open"])(a0,a1);var _relation_openrv=Module["_relation_openrv"]=(a0,a1)=>(_relation_openrv=Module["_relation_openrv"]=wasmExports["relation_openrv"])(a0,a1);var _RangeVarGetRelidExtended=Module["_RangeVarGetRelidExtended"]=(a0,a1,a2,a3,a4)=>(_RangeVarGetRelidExtended=Module["_RangeVarGetRelidExtended"]=wasmExports["RangeVarGetRelidExtended"])(a0,a1,a2,a3,a4);var _add_reloption_kind=Module["_add_reloption_kind"]=()=>(_add_reloption_kind=Module["_add_reloption_kind"]=wasmExports["add_reloption_kind"])();var _register_reloptions_validator=Module["_register_reloptions_validator"]=(a0,a1)=>(_register_reloptions_validator=Module["_register_reloptions_validator"]=wasmExports["register_reloptions_validator"])(a0,a1);var _add_int_reloption=Module["_add_int_reloption"]=(a0,a1,a2,a3,a4,a5,a6)=>(_add_int_reloption=Module["_add_int_reloption"]=wasmExports["add_int_reloption"])(a0,a1,a2,a3,a4,a5,a6);var _MemoryContextStrdup=Module["_MemoryContextStrdup"]=(a0,a1)=>(_MemoryContextStrdup=Module["_MemoryContextStrdup"]=wasmExports["MemoryContextStrdup"])(a0,a1);var _transformRelOptions=Module["_transformRelOptions"]=(a0,a1,a2,a3,a4,a5)=>(_transformRelOptions=Module["_transformRelOptions"]=wasmExports["transformRelOptions"])(a0,a1,a2,a3,a4,a5);var _deconstruct_array_builtin=Module["_deconstruct_array_builtin"]=(a0,a1,a2,a3,a4)=>(_deconstruct_array_builtin=Module["_deconstruct_array_builtin"]=wasmExports["deconstruct_array_builtin"])(a0,a1,a2,a3,a4);var _defGetString=Module["_defGetString"]=a0=>(_defGetString=Module["_defGetString"]=wasmExports["defGetString"])(a0);var _defGetBoolean=Module["_defGetBoolean"]=a0=>(_defGetBoolean=Module["_defGetBoolean"]=wasmExports["defGetBoolean"])(a0);var _untransformRelOptions=Module["_untransformRelOptions"]=a0=>(_untransformRelOptions=Module["_untransformRelOptions"]=wasmExports["untransformRelOptions"])(a0);var _text_to_cstring=Module["_text_to_cstring"]=a0=>(_text_to_cstring=Module["_text_to_cstring"]=wasmExports["text_to_cstring"])(a0);var _makeString=Module["_makeString"]=a0=>(_makeString=Module["_makeString"]=wasmExports["makeString"])(a0);var _makeDefElem=Module["_makeDefElem"]=(a0,a1,a2)=>(_makeDefElem=Module["_makeDefElem"]=wasmExports["makeDefElem"])(a0,a1,a2);var _heap_reloptions=Module["_heap_reloptions"]=(a0,a1,a2)=>(_heap_reloptions=Module["_heap_reloptions"]=wasmExports["heap_reloptions"])(a0,a1,a2);var _MemoryContextAlloc=Module["_MemoryContextAlloc"]=(a0,a1)=>(_MemoryContextAlloc=Module["_MemoryContextAlloc"]=wasmExports["MemoryContextAlloc"])(a0,a1);var _parse_bool=Module["_parse_bool"]=(a0,a1)=>(_parse_bool=Module["_parse_bool"]=wasmExports["parse_bool"])(a0,a1);var _parse_int=Module["_parse_int"]=(a0,a1,a2,a3)=>(_parse_int=Module["_parse_int"]=wasmExports["parse_int"])(a0,a1,a2,a3);var _parse_real=Module["_parse_real"]=(a0,a1,a2,a3)=>(_parse_real=Module["_parse_real"]=wasmExports["parse_real"])(a0,a1,a2,a3);var _ScanKeyInit=Module["_ScanKeyInit"]=(a0,a1,a2,a3,a4)=>(_ScanKeyInit=Module["_ScanKeyInit"]=wasmExports["ScanKeyInit"])(a0,a1,a2,a3,a4);var _dsm_segment_handle=Module["_dsm_segment_handle"]=a0=>(_dsm_segment_handle=Module["_dsm_segment_handle"]=wasmExports["dsm_segment_handle"])(a0);var _dsm_create=Module["_dsm_create"]=(a0,a1)=>(_dsm_create=Module["_dsm_create"]=wasmExports["dsm_create"])(a0,a1);var _dsm_segment_address=Module["_dsm_segment_address"]=a0=>(_dsm_segment_address=Module["_dsm_segment_address"]=wasmExports["dsm_segment_address"])(a0);var _dsm_attach=Module["_dsm_attach"]=a0=>(_dsm_attach=Module["_dsm_attach"]=wasmExports["dsm_attach"])(a0);var _dsm_detach=Module["_dsm_detach"]=a0=>(_dsm_detach=Module["_dsm_detach"]=wasmExports["dsm_detach"])(a0);var _ShmemInitStruct=Module["_ShmemInitStruct"]=(a0,a1,a2)=>(_ShmemInitStruct=Module["_ShmemInitStruct"]=wasmExports["ShmemInitStruct"])(a0,a1,a2);var _LWLockAcquire=Module["_LWLockAcquire"]=(a0,a1)=>(_LWLockAcquire=Module["_LWLockAcquire"]=wasmExports["LWLockAcquire"])(a0,a1);var _LWLockRelease=Module["_LWLockRelease"]=a0=>(_LWLockRelease=Module["_LWLockRelease"]=wasmExports["LWLockRelease"])(a0);var _LWLockInitialize=Module["_LWLockInitialize"]=(a0,a1)=>(_LWLockInitialize=Module["_LWLockInitialize"]=wasmExports["LWLockInitialize"])(a0,a1);var _MemoryContextMemAllocated=Module["_MemoryContextMemAllocated"]=(a0,a1)=>(_MemoryContextMemAllocated=Module["_MemoryContextMemAllocated"]=wasmExports["MemoryContextMemAllocated"])(a0,a1);var _GetCurrentCommandId=Module["_GetCurrentCommandId"]=a0=>(_GetCurrentCommandId=Module["_GetCurrentCommandId"]=wasmExports["GetCurrentCommandId"])(a0);var _toast_open_indexes=Module["_toast_open_indexes"]=(a0,a1,a2,a3)=>(_toast_open_indexes=Module["_toast_open_indexes"]=wasmExports["toast_open_indexes"])(a0,a1,a2,a3);var _RelationGetIndexList=Module["_RelationGetIndexList"]=a0=>(_RelationGetIndexList=Module["_RelationGetIndexList"]=wasmExports["RelationGetIndexList"])(a0);var _systable_beginscan=Module["_systable_beginscan"]=(a0,a1,a2,a3,a4,a5)=>(_systable_beginscan=Module["_systable_beginscan"]=wasmExports["systable_beginscan"])(a0,a1,a2,a3,a4,a5);var _systable_getnext=Module["_systable_getnext"]=a0=>(_systable_getnext=Module["_systable_getnext"]=wasmExports["systable_getnext"])(a0);var _systable_endscan=Module["_systable_endscan"]=a0=>(_systable_endscan=Module["_systable_endscan"]=wasmExports["systable_endscan"])(a0);var _toast_close_indexes=Module["_toast_close_indexes"]=(a0,a1,a2)=>(_toast_close_indexes=Module["_toast_close_indexes"]=wasmExports["toast_close_indexes"])(a0,a1,a2);var _systable_beginscan_ordered=Module["_systable_beginscan_ordered"]=(a0,a1,a2,a3,a4)=>(_systable_beginscan_ordered=Module["_systable_beginscan_ordered"]=wasmExports["systable_beginscan_ordered"])(a0,a1,a2,a3,a4);var _systable_getnext_ordered=Module["_systable_getnext_ordered"]=(a0,a1)=>(_systable_getnext_ordered=Module["_systable_getnext_ordered"]=wasmExports["systable_getnext_ordered"])(a0,a1);var _systable_endscan_ordered=Module["_systable_endscan_ordered"]=a0=>(_systable_endscan_ordered=Module["_systable_endscan_ordered"]=wasmExports["systable_endscan_ordered"])(a0);var _init_toast_snapshot=Module["_init_toast_snapshot"]=a0=>(_init_toast_snapshot=Module["_init_toast_snapshot"]=wasmExports["init_toast_snapshot"])(a0);var _convert_tuples_by_position=Module["_convert_tuples_by_position"]=(a0,a1,a2)=>(_convert_tuples_by_position=Module["_convert_tuples_by_position"]=wasmExports["convert_tuples_by_position"])(a0,a1,a2);var _execute_attr_map_tuple=Module["_execute_attr_map_tuple"]=(a0,a1)=>(_execute_attr_map_tuple=Module["_execute_attr_map_tuple"]=wasmExports["execute_attr_map_tuple"])(a0,a1);var _ExecStoreVirtualTuple=Module["_ExecStoreVirtualTuple"]=a0=>(_ExecStoreVirtualTuple=Module["_ExecStoreVirtualTuple"]=wasmExports["ExecStoreVirtualTuple"])(a0);var _bms_is_member=Module["_bms_is_member"]=(a0,a1)=>(_bms_is_member=Module["_bms_is_member"]=wasmExports["bms_is_member"])(a0,a1);var _bms_add_member=Module["_bms_add_member"]=(a0,a1)=>(_bms_add_member=Module["_bms_add_member"]=wasmExports["bms_add_member"])(a0,a1);var _CreateTupleDescCopy=Module["_CreateTupleDescCopy"]=a0=>(_CreateTupleDescCopy=Module["_CreateTupleDescCopy"]=wasmExports["CreateTupleDescCopy"])(a0);var _ResourceOwnerEnlarge=Module["_ResourceOwnerEnlarge"]=a0=>(_ResourceOwnerEnlarge=Module["_ResourceOwnerEnlarge"]=wasmExports["ResourceOwnerEnlarge"])(a0);var _ResourceOwnerRemember=Module["_ResourceOwnerRemember"]=(a0,a1,a2)=>(_ResourceOwnerRemember=Module["_ResourceOwnerRemember"]=wasmExports["ResourceOwnerRemember"])(a0,a1,a2);var _DecrTupleDescRefCount=Module["_DecrTupleDescRefCount"]=a0=>(_DecrTupleDescRefCount=Module["_DecrTupleDescRefCount"]=wasmExports["DecrTupleDescRefCount"])(a0);var _ResourceOwnerForget=Module["_ResourceOwnerForget"]=(a0,a1,a2)=>(_ResourceOwnerForget=Module["_ResourceOwnerForget"]=wasmExports["ResourceOwnerForget"])(a0,a1,a2);var _datumIsEqual=Module["_datumIsEqual"]=(a0,a1,a2,a3)=>(_datumIsEqual=Module["_datumIsEqual"]=wasmExports["datumIsEqual"])(a0,a1,a2,a3);var _TupleDescInitEntryCollation=Module["_TupleDescInitEntryCollation"]=(a0,a1,a2)=>(_TupleDescInitEntryCollation=Module["_TupleDescInitEntryCollation"]=wasmExports["TupleDescInitEntryCollation"])(a0,a1,a2);var _stringToNode=Module["_stringToNode"]=a0=>(_stringToNode=Module["_stringToNode"]=wasmExports["stringToNode"])(a0);var _pg_detoast_datum_copy=Module["_pg_detoast_datum_copy"]=a0=>(_pg_detoast_datum_copy=Module["_pg_detoast_datum_copy"]=wasmExports["pg_detoast_datum_copy"])(a0);var _get_typlenbyvalalign=Module["_get_typlenbyvalalign"]=(a0,a1,a2,a3)=>(_get_typlenbyvalalign=Module["_get_typlenbyvalalign"]=wasmExports["get_typlenbyvalalign"])(a0,a1,a2,a3);var _deconstruct_array=Module["_deconstruct_array"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_deconstruct_array=Module["_deconstruct_array"]=wasmExports["deconstruct_array"])(a0,a1,a2,a3,a4,a5,a6,a7);var _tbm_add_tuples=Module["_tbm_add_tuples"]=(a0,a1,a2,a3)=>(_tbm_add_tuples=Module["_tbm_add_tuples"]=wasmExports["tbm_add_tuples"])(a0,a1,a2,a3);var _ginPostingListDecode=Module["_ginPostingListDecode"]=(a0,a1)=>(_ginPostingListDecode=Module["_ginPostingListDecode"]=wasmExports["ginPostingListDecode"])(a0,a1);var _ItemPointerCompare=Module["_ItemPointerCompare"]=(a0,a1)=>(_ItemPointerCompare=Module["_ItemPointerCompare"]=wasmExports["ItemPointerCompare"])(a0,a1);var _LockPage=Module["_LockPage"]=(a0,a1,a2)=>(_LockPage=Module["_LockPage"]=wasmExports["LockPage"])(a0,a1,a2);var _UnlockPage=Module["_UnlockPage"]=(a0,a1,a2)=>(_UnlockPage=Module["_UnlockPage"]=wasmExports["UnlockPage"])(a0,a1,a2);var _vacuum_delay_point=Module["_vacuum_delay_point"]=()=>(_vacuum_delay_point=Module["_vacuum_delay_point"]=wasmExports["vacuum_delay_point"])();var _RecordFreeIndexPage=Module["_RecordFreeIndexPage"]=(a0,a1)=>(_RecordFreeIndexPage=Module["_RecordFreeIndexPage"]=wasmExports["RecordFreeIndexPage"])(a0,a1);var _IndexFreeSpaceMapVacuum=Module["_IndexFreeSpaceMapVacuum"]=a0=>(_IndexFreeSpaceMapVacuum=Module["_IndexFreeSpaceMapVacuum"]=wasmExports["IndexFreeSpaceMapVacuum"])(a0);var _log_newpage_range=Module["_log_newpage_range"]=(a0,a1,a2,a3,a4)=>(_log_newpage_range=Module["_log_newpage_range"]=wasmExports["log_newpage_range"])(a0,a1,a2,a3,a4);var _GetFreeIndexPage=Module["_GetFreeIndexPage"]=a0=>(_GetFreeIndexPage=Module["_GetFreeIndexPage"]=wasmExports["GetFreeIndexPage"])(a0);var _ConditionalLockBuffer=Module["_ConditionalLockBuffer"]=a0=>(_ConditionalLockBuffer=Module["_ConditionalLockBuffer"]=wasmExports["ConditionalLockBuffer"])(a0);var _LockBufferForCleanup=Module["_LockBufferForCleanup"]=a0=>(_LockBufferForCleanup=Module["_LockBufferForCleanup"]=wasmExports["LockBufferForCleanup"])(a0);var _gistcheckpage=Module["_gistcheckpage"]=(a0,a1)=>(_gistcheckpage=Module["_gistcheckpage"]=wasmExports["gistcheckpage"])(a0,a1);var _PageIndexMultiDelete=Module["_PageIndexMultiDelete"]=(a0,a1,a2)=>(_PageIndexMultiDelete=Module["_PageIndexMultiDelete"]=wasmExports["PageIndexMultiDelete"])(a0,a1,a2);var _smgrnblocks=Module["_smgrnblocks"]=(a0,a1)=>(_smgrnblocks=Module["_smgrnblocks"]=wasmExports["smgrnblocks"])(a0,a1);var _list_free_deep=Module["_list_free_deep"]=a0=>(_list_free_deep=Module["_list_free_deep"]=wasmExports["list_free_deep"])(a0);var _pairingheap_remove_first=Module["_pairingheap_remove_first"]=a0=>(_pairingheap_remove_first=Module["_pairingheap_remove_first"]=wasmExports["pairingheap_remove_first"])(a0);var _pairingheap_add=Module["_pairingheap_add"]=(a0,a1)=>(_pairingheap_add=Module["_pairingheap_add"]=wasmExports["pairingheap_add"])(a0,a1);var _float_overflow_error=Module["_float_overflow_error"]=()=>(_float_overflow_error=Module["_float_overflow_error"]=wasmExports["float_overflow_error"])();var _float_underflow_error=Module["_float_underflow_error"]=()=>(_float_underflow_error=Module["_float_underflow_error"]=wasmExports["float_underflow_error"])();var _DirectFunctionCall5Coll=Module["_DirectFunctionCall5Coll"]=(a0,a1,a2,a3,a4,a5,a6)=>(_DirectFunctionCall5Coll=Module["_DirectFunctionCall5Coll"]=wasmExports["DirectFunctionCall5Coll"])(a0,a1,a2,a3,a4,a5,a6);var _pairingheap_allocate=Module["_pairingheap_allocate"]=(a0,a1)=>(_pairingheap_allocate=Module["_pairingheap_allocate"]=wasmExports["pairingheap_allocate"])(a0,a1);var _GenerationContextCreate=Module["_GenerationContextCreate"]=(a0,a1,a2,a3,a4)=>(_GenerationContextCreate=Module["_GenerationContextCreate"]=wasmExports["GenerationContextCreate"])(a0,a1,a2,a3,a4);var _pgstat_progress_update_param=Module["_pgstat_progress_update_param"]=(a0,a1)=>(_pgstat_progress_update_param=Module["_pgstat_progress_update_param"]=wasmExports["pgstat_progress_update_param"])(a0,a1);var __hash_getbuf=Module["__hash_getbuf"]=(a0,a1,a2,a3)=>(__hash_getbuf=Module["__hash_getbuf"]=wasmExports["_hash_getbuf"])(a0,a1,a2,a3);var __hash_relbuf=Module["__hash_relbuf"]=(a0,a1)=>(__hash_relbuf=Module["__hash_relbuf"]=wasmExports["_hash_relbuf"])(a0,a1);var __hash_get_indextuple_hashkey=Module["__hash_get_indextuple_hashkey"]=a0=>(__hash_get_indextuple_hashkey=Module["__hash_get_indextuple_hashkey"]=wasmExports["_hash_get_indextuple_hashkey"])(a0);var __hash_getbuf_with_strategy=Module["__hash_getbuf_with_strategy"]=(a0,a1,a2,a3,a4)=>(__hash_getbuf_with_strategy=Module["__hash_getbuf_with_strategy"]=wasmExports["_hash_getbuf_with_strategy"])(a0,a1,a2,a3,a4);var __hash_ovflblkno_to_bitno=Module["__hash_ovflblkno_to_bitno"]=(a0,a1)=>(__hash_ovflblkno_to_bitno=Module["__hash_ovflblkno_to_bitno"]=wasmExports["_hash_ovflblkno_to_bitno"])(a0,a1);var _list_member_oid=Module["_list_member_oid"]=(a0,a1)=>(_list_member_oid=Module["_list_member_oid"]=wasmExports["list_member_oid"])(a0,a1);var _HeapTupleSatisfiesVisibility=Module["_HeapTupleSatisfiesVisibility"]=(a0,a1,a2)=>(_HeapTupleSatisfiesVisibility=Module["_HeapTupleSatisfiesVisibility"]=wasmExports["HeapTupleSatisfiesVisibility"])(a0,a1,a2);var _read_stream_begin_relation=Module["_read_stream_begin_relation"]=(a0,a1,a2,a3,a4,a5,a6)=>(_read_stream_begin_relation=Module["_read_stream_begin_relation"]=wasmExports["read_stream_begin_relation"])(a0,a1,a2,a3,a4,a5,a6);var _GetAccessStrategy=Module["_GetAccessStrategy"]=a0=>(_GetAccessStrategy=Module["_GetAccessStrategy"]=wasmExports["GetAccessStrategy"])(a0);var _FreeAccessStrategy=Module["_FreeAccessStrategy"]=a0=>(_FreeAccessStrategy=Module["_FreeAccessStrategy"]=wasmExports["FreeAccessStrategy"])(a0);var _read_stream_end=Module["_read_stream_end"]=a0=>(_read_stream_end=Module["_read_stream_end"]=wasmExports["read_stream_end"])(a0);var _heap_getnext=Module["_heap_getnext"]=(a0,a1)=>(_heap_getnext=Module["_heap_getnext"]=wasmExports["heap_getnext"])(a0,a1);var _HeapTupleSatisfiesVacuum=Module["_HeapTupleSatisfiesVacuum"]=(a0,a1,a2)=>(_HeapTupleSatisfiesVacuum=Module["_HeapTupleSatisfiesVacuum"]=wasmExports["HeapTupleSatisfiesVacuum"])(a0,a1,a2);var _GetMultiXactIdMembers=Module["_GetMultiXactIdMembers"]=(a0,a1,a2,a3)=>(_GetMultiXactIdMembers=Module["_GetMultiXactIdMembers"]=wasmExports["GetMultiXactIdMembers"])(a0,a1,a2,a3);var _TransactionIdPrecedes=Module["_TransactionIdPrecedes"]=(a0,a1)=>(_TransactionIdPrecedes=Module["_TransactionIdPrecedes"]=wasmExports["TransactionIdPrecedes"])(a0,a1);var _HeapTupleGetUpdateXid=Module["_HeapTupleGetUpdateXid"]=a0=>(_HeapTupleGetUpdateXid=Module["_HeapTupleGetUpdateXid"]=wasmExports["HeapTupleGetUpdateXid"])(a0);var _visibilitymap_clear=Module["_visibilitymap_clear"]=(a0,a1,a2,a3)=>(_visibilitymap_clear=Module["_visibilitymap_clear"]=wasmExports["visibilitymap_clear"])(a0,a1,a2,a3);var _pgstat_count_heap_insert=Module["_pgstat_count_heap_insert"]=(a0,a1)=>(_pgstat_count_heap_insert=Module["_pgstat_count_heap_insert"]=wasmExports["pgstat_count_heap_insert"])(a0,a1);var _ExecFetchSlotHeapTuple=Module["_ExecFetchSlotHeapTuple"]=(a0,a1,a2)=>(_ExecFetchSlotHeapTuple=Module["_ExecFetchSlotHeapTuple"]=wasmExports["ExecFetchSlotHeapTuple"])(a0,a1,a2);var _PageGetHeapFreeSpace=Module["_PageGetHeapFreeSpace"]=a0=>(_PageGetHeapFreeSpace=Module["_PageGetHeapFreeSpace"]=wasmExports["PageGetHeapFreeSpace"])(a0);var _visibilitymap_pin=Module["_visibilitymap_pin"]=(a0,a1,a2)=>(_visibilitymap_pin=Module["_visibilitymap_pin"]=wasmExports["visibilitymap_pin"])(a0,a1,a2);var _HeapTupleSatisfiesUpdate=Module["_HeapTupleSatisfiesUpdate"]=(a0,a1,a2)=>(_HeapTupleSatisfiesUpdate=Module["_HeapTupleSatisfiesUpdate"]=wasmExports["HeapTupleSatisfiesUpdate"])(a0,a1,a2);var _TransactionIdIsCurrentTransactionId=Module["_TransactionIdIsCurrentTransactionId"]=a0=>(_TransactionIdIsCurrentTransactionId=Module["_TransactionIdIsCurrentTransactionId"]=wasmExports["TransactionIdIsCurrentTransactionId"])(a0);var _TransactionIdDidCommit=Module["_TransactionIdDidCommit"]=a0=>(_TransactionIdDidCommit=Module["_TransactionIdDidCommit"]=wasmExports["TransactionIdDidCommit"])(a0);var _TransactionIdIsInProgress=Module["_TransactionIdIsInProgress"]=a0=>(_TransactionIdIsInProgress=Module["_TransactionIdIsInProgress"]=wasmExports["TransactionIdIsInProgress"])(a0);var _bms_free=Module["_bms_free"]=a0=>(_bms_free=Module["_bms_free"]=wasmExports["bms_free"])(a0);var _bms_add_members=Module["_bms_add_members"]=(a0,a1)=>(_bms_add_members=Module["_bms_add_members"]=wasmExports["bms_add_members"])(a0,a1);var _bms_next_member=Module["_bms_next_member"]=(a0,a1)=>(_bms_next_member=Module["_bms_next_member"]=wasmExports["bms_next_member"])(a0,a1);var _bms_overlap=Module["_bms_overlap"]=(a0,a1)=>(_bms_overlap=Module["_bms_overlap"]=wasmExports["bms_overlap"])(a0,a1);var _MultiXactIdPrecedes=Module["_MultiXactIdPrecedes"]=(a0,a1)=>(_MultiXactIdPrecedes=Module["_MultiXactIdPrecedes"]=wasmExports["MultiXactIdPrecedes"])(a0,a1);var _heap_tuple_needs_eventual_freeze=Module["_heap_tuple_needs_eventual_freeze"]=a0=>(_heap_tuple_needs_eventual_freeze=Module["_heap_tuple_needs_eventual_freeze"]=wasmExports["heap_tuple_needs_eventual_freeze"])(a0);var _PrefetchBuffer=Module["_PrefetchBuffer"]=(a0,a1,a2,a3)=>(_PrefetchBuffer=Module["_PrefetchBuffer"]=wasmExports["PrefetchBuffer"])(a0,a1,a2,a3);var _XLogRecGetBlockTagExtended=Module["_XLogRecGetBlockTagExtended"]=(a0,a1,a2,a3,a4,a5)=>(_XLogRecGetBlockTagExtended=Module["_XLogRecGetBlockTagExtended"]=wasmExports["XLogRecGetBlockTagExtended"])(a0,a1,a2,a3,a4,a5);var _read_stream_next_buffer=Module["_read_stream_next_buffer"]=(a0,a1)=>(_read_stream_next_buffer=Module["_read_stream_next_buffer"]=wasmExports["read_stream_next_buffer"])(a0,a1);var _smgrexists=Module["_smgrexists"]=(a0,a1)=>(_smgrexists=Module["_smgrexists"]=wasmExports["smgrexists"])(a0,a1);var _table_slot_create=Module["_table_slot_create"]=(a0,a1)=>(_table_slot_create=Module["_table_slot_create"]=wasmExports["table_slot_create"])(a0,a1);var _ExecDropSingleTupleTableSlot=Module["_ExecDropSingleTupleTableSlot"]=a0=>(_ExecDropSingleTupleTableSlot=Module["_ExecDropSingleTupleTableSlot"]=wasmExports["ExecDropSingleTupleTableSlot"])(a0);var _CreateExecutorState=Module["_CreateExecutorState"]=()=>(_CreateExecutorState=Module["_CreateExecutorState"]=wasmExports["CreateExecutorState"])();var _MakePerTupleExprContext=Module["_MakePerTupleExprContext"]=a0=>(_MakePerTupleExprContext=Module["_MakePerTupleExprContext"]=wasmExports["MakePerTupleExprContext"])(a0);var _GetOldestNonRemovableTransactionId=Module["_GetOldestNonRemovableTransactionId"]=a0=>(_GetOldestNonRemovableTransactionId=Module["_GetOldestNonRemovableTransactionId"]=wasmExports["GetOldestNonRemovableTransactionId"])(a0);var _FreeExecutorState=Module["_FreeExecutorState"]=a0=>(_FreeExecutorState=Module["_FreeExecutorState"]=wasmExports["FreeExecutorState"])(a0);var _MakeSingleTupleTableSlot=Module["_MakeSingleTupleTableSlot"]=(a0,a1)=>(_MakeSingleTupleTableSlot=Module["_MakeSingleTupleTableSlot"]=wasmExports["MakeSingleTupleTableSlot"])(a0,a1);var _ExecStoreHeapTuple=Module["_ExecStoreHeapTuple"]=(a0,a1,a2)=>(_ExecStoreHeapTuple=Module["_ExecStoreHeapTuple"]=wasmExports["ExecStoreHeapTuple"])(a0,a1,a2);var _visibilitymap_get_status=Module["_visibilitymap_get_status"]=(a0,a1,a2)=>(_visibilitymap_get_status=Module["_visibilitymap_get_status"]=wasmExports["visibilitymap_get_status"])(a0,a1,a2);var _ExecStoreAllNullTuple=Module["_ExecStoreAllNullTuple"]=a0=>(_ExecStoreAllNullTuple=Module["_ExecStoreAllNullTuple"]=wasmExports["ExecStoreAllNullTuple"])(a0);var _XidInMVCCSnapshot=Module["_XidInMVCCSnapshot"]=(a0,a1)=>(_XidInMVCCSnapshot=Module["_XidInMVCCSnapshot"]=wasmExports["XidInMVCCSnapshot"])(a0,a1);var _hash_seq_init=Module["_hash_seq_init"]=(a0,a1)=>(_hash_seq_init=Module["_hash_seq_init"]=wasmExports["hash_seq_init"])(a0,a1);var _hash_seq_search=Module["_hash_seq_search"]=a0=>(_hash_seq_search=Module["_hash_seq_search"]=wasmExports["hash_seq_search"])(a0);var _ftruncate=Module["_ftruncate"]=(a0,a1)=>(_ftruncate=Module["_ftruncate"]=wasmExports["ftruncate"])(a0,a1);var _fd_fsync_fname=Module["_fd_fsync_fname"]=(a0,a1)=>(_fd_fsync_fname=Module["_fd_fsync_fname"]=wasmExports["fd_fsync_fname"])(a0,a1);var _get_namespace_name=Module["_get_namespace_name"]=a0=>(_get_namespace_name=Module["_get_namespace_name"]=wasmExports["get_namespace_name"])(a0);var _GetRecordedFreeSpace=Module["_GetRecordedFreeSpace"]=(a0,a1)=>(_GetRecordedFreeSpace=Module["_GetRecordedFreeSpace"]=wasmExports["GetRecordedFreeSpace"])(a0,a1);var _vac_estimate_reltuples=Module["_vac_estimate_reltuples"]=(a0,a1,a2,a3)=>(_vac_estimate_reltuples=Module["_vac_estimate_reltuples"]=wasmExports["vac_estimate_reltuples"])(a0,a1,a2,a3);var _WaitLatch=Module["_WaitLatch"]=(a0,a1,a2,a3)=>(_WaitLatch=Module["_WaitLatch"]=wasmExports["WaitLatch"])(a0,a1,a2,a3);var _ResetLatch=Module["_ResetLatch"]=a0=>(_ResetLatch=Module["_ResetLatch"]=wasmExports["ResetLatch"])(a0);var _clock_gettime=Module["_clock_gettime"]=(a0,a1)=>(_clock_gettime=Module["_clock_gettime"]=wasmExports["clock_gettime"])(a0,a1);var _WalUsageAccumDiff=Module["_WalUsageAccumDiff"]=(a0,a1,a2)=>(_WalUsageAccumDiff=Module["_WalUsageAccumDiff"]=wasmExports["WalUsageAccumDiff"])(a0,a1,a2);var _BufferUsageAccumDiff=Module["_BufferUsageAccumDiff"]=(a0,a1,a2)=>(_BufferUsageAccumDiff=Module["_BufferUsageAccumDiff"]=wasmExports["BufferUsageAccumDiff"])(a0,a1,a2);var _visibilitymap_prepare_truncate=Module["_visibilitymap_prepare_truncate"]=(a0,a1)=>(_visibilitymap_prepare_truncate=Module["_visibilitymap_prepare_truncate"]=wasmExports["visibilitymap_prepare_truncate"])(a0,a1);var _pg_class_aclcheck=Module["_pg_class_aclcheck"]=(a0,a1,a2)=>(_pg_class_aclcheck=Module["_pg_class_aclcheck"]=wasmExports["pg_class_aclcheck"])(a0,a1,a2);var _btboolcmp=Module["_btboolcmp"]=a0=>(_btboolcmp=Module["_btboolcmp"]=wasmExports["btboolcmp"])(a0);var _btint2cmp=Module["_btint2cmp"]=a0=>(_btint2cmp=Module["_btint2cmp"]=wasmExports["btint2cmp"])(a0);var _btint4cmp=Module["_btint4cmp"]=a0=>(_btint4cmp=Module["_btint4cmp"]=wasmExports["btint4cmp"])(a0);var _btint8cmp=Module["_btint8cmp"]=a0=>(_btint8cmp=Module["_btint8cmp"]=wasmExports["btint8cmp"])(a0);var _btoidcmp=Module["_btoidcmp"]=a0=>(_btoidcmp=Module["_btoidcmp"]=wasmExports["btoidcmp"])(a0);var _btcharcmp=Module["_btcharcmp"]=a0=>(_btcharcmp=Module["_btcharcmp"]=wasmExports["btcharcmp"])(a0);var __bt_form_posting=Module["__bt_form_posting"]=(a0,a1,a2)=>(__bt_form_posting=Module["__bt_form_posting"]=wasmExports["_bt_form_posting"])(a0,a1,a2);var __bt_mkscankey=Module["__bt_mkscankey"]=(a0,a1)=>(__bt_mkscankey=Module["__bt_mkscankey"]=wasmExports["_bt_mkscankey"])(a0,a1);var __bt_checkpage=Module["__bt_checkpage"]=(a0,a1)=>(__bt_checkpage=Module["__bt_checkpage"]=wasmExports["_bt_checkpage"])(a0,a1);var __bt_compare=Module["__bt_compare"]=(a0,a1,a2,a3)=>(__bt_compare=Module["__bt_compare"]=wasmExports["_bt_compare"])(a0,a1,a2,a3);var __bt_relbuf=Module["__bt_relbuf"]=(a0,a1)=>(__bt_relbuf=Module["__bt_relbuf"]=wasmExports["_bt_relbuf"])(a0,a1);var __bt_search=Module["__bt_search"]=(a0,a1,a2,a3,a4)=>(__bt_search=Module["__bt_search"]=wasmExports["_bt_search"])(a0,a1,a2,a3,a4);var __bt_binsrch_insert=Module["__bt_binsrch_insert"]=(a0,a1)=>(__bt_binsrch_insert=Module["__bt_binsrch_insert"]=wasmExports["_bt_binsrch_insert"])(a0,a1);var __bt_freestack=Module["__bt_freestack"]=a0=>(__bt_freestack=Module["__bt_freestack"]=wasmExports["_bt_freestack"])(a0);var __bt_metaversion=Module["__bt_metaversion"]=(a0,a1,a2)=>(__bt_metaversion=Module["__bt_metaversion"]=wasmExports["_bt_metaversion"])(a0,a1,a2);var __bt_allequalimage=Module["__bt_allequalimage"]=(a0,a1)=>(__bt_allequalimage=Module["__bt_allequalimage"]=wasmExports["_bt_allequalimage"])(a0,a1);var _before_shmem_exit=Module["_before_shmem_exit"]=(a0,a1)=>(_before_shmem_exit=Module["_before_shmem_exit"]=wasmExports["before_shmem_exit"])(a0,a1);var _cancel_before_shmem_exit=Module["_cancel_before_shmem_exit"]=(a0,a1)=>(_cancel_before_shmem_exit=Module["_cancel_before_shmem_exit"]=wasmExports["cancel_before_shmem_exit"])(a0,a1);var _pg_re_throw=Module["_pg_re_throw"]=()=>(_pg_re_throw=Module["_pg_re_throw"]=wasmExports["pg_re_throw"])();var _get_opfamily_member=Module["_get_opfamily_member"]=(a0,a1,a2,a3)=>(_get_opfamily_member=Module["_get_opfamily_member"]=wasmExports["get_opfamily_member"])(a0,a1,a2,a3);var __bt_check_natts=Module["__bt_check_natts"]=(a0,a1,a2,a3)=>(__bt_check_natts=Module["__bt_check_natts"]=wasmExports["_bt_check_natts"])(a0,a1,a2,a3);var _strncpy=Module["_strncpy"]=(a0,a1,a2)=>(_strncpy=Module["_strncpy"]=wasmExports["strncpy"])(a0,a1,a2);var _timestamptz_to_str=Module["_timestamptz_to_str"]=a0=>(_timestamptz_to_str=Module["_timestamptz_to_str"]=wasmExports["timestamptz_to_str"])(a0);var _XLogRecGetBlockRefInfo=Module["_XLogRecGetBlockRefInfo"]=(a0,a1,a2,a3,a4)=>(_XLogRecGetBlockRefInfo=Module["_XLogRecGetBlockRefInfo"]=wasmExports["XLogRecGetBlockRefInfo"])(a0,a1,a2,a3,a4);var _varstr_cmp=Module["_varstr_cmp"]=(a0,a1,a2,a3,a4)=>(_varstr_cmp=Module["_varstr_cmp"]=wasmExports["varstr_cmp"])(a0,a1,a2,a3,a4);var _exprType=Module["_exprType"]=a0=>(_exprType=Module["_exprType"]=wasmExports["exprType"])(a0);var _GetActiveSnapshot=Module["_GetActiveSnapshot"]=()=>(_GetActiveSnapshot=Module["_GetActiveSnapshot"]=wasmExports["GetActiveSnapshot"])();var _errdetail_relkind_not_supported=Module["_errdetail_relkind_not_supported"]=a0=>(_errdetail_relkind_not_supported=Module["_errdetail_relkind_not_supported"]=wasmExports["errdetail_relkind_not_supported"])(a0);var _table_openrv=Module["_table_openrv"]=(a0,a1)=>(_table_openrv=Module["_table_openrv"]=wasmExports["table_openrv"])(a0,a1);var _table_slot_callbacks=Module["_table_slot_callbacks"]=a0=>(_table_slot_callbacks=Module["_table_slot_callbacks"]=wasmExports["table_slot_callbacks"])(a0);var _clamp_row_est=Module["_clamp_row_est"]=a0=>(_clamp_row_est=Module["_clamp_row_est"]=wasmExports["clamp_row_est"])(a0);var _estimate_expression_value=Module["_estimate_expression_value"]=(a0,a1)=>(_estimate_expression_value=Module["_estimate_expression_value"]=wasmExports["estimate_expression_value"])(a0,a1);var _XLogFlush=Module["_XLogFlush"]=a0=>(_XLogFlush=Module["_XLogFlush"]=wasmExports["XLogFlush"])(a0);var _get_call_result_type=Module["_get_call_result_type"]=(a0,a1,a2)=>(_get_call_result_type=Module["_get_call_result_type"]=wasmExports["get_call_result_type"])(a0,a1,a2);var _HeapTupleHeaderGetDatum=Module["_HeapTupleHeaderGetDatum"]=a0=>(_HeapTupleHeaderGetDatum=Module["_HeapTupleHeaderGetDatum"]=wasmExports["HeapTupleHeaderGetDatum"])(a0);var _GenericXLogStart=Module["_GenericXLogStart"]=a0=>(_GenericXLogStart=Module["_GenericXLogStart"]=wasmExports["GenericXLogStart"])(a0);var _GenericXLogRegisterBuffer=Module["_GenericXLogRegisterBuffer"]=(a0,a1,a2)=>(_GenericXLogRegisterBuffer=Module["_GenericXLogRegisterBuffer"]=wasmExports["GenericXLogRegisterBuffer"])(a0,a1,a2);var _GenericXLogFinish=Module["_GenericXLogFinish"]=a0=>(_GenericXLogFinish=Module["_GenericXLogFinish"]=wasmExports["GenericXLogFinish"])(a0);var _GenericXLogAbort=Module["_GenericXLogAbort"]=a0=>(_GenericXLogAbort=Module["_GenericXLogAbort"]=wasmExports["GenericXLogAbort"])(a0);var _errmsg_plural=Module["_errmsg_plural"]=(a0,a1,a2,a3)=>(_errmsg_plural=Module["_errmsg_plural"]=wasmExports["errmsg_plural"])(a0,a1,a2,a3);var _ReadNextMultiXactId=Module["_ReadNextMultiXactId"]=()=>(_ReadNextMultiXactId=Module["_ReadNextMultiXactId"]=wasmExports["ReadNextMultiXactId"])();var _ReadMultiXactIdRange=Module["_ReadMultiXactIdRange"]=(a0,a1)=>(_ReadMultiXactIdRange=Module["_ReadMultiXactIdRange"]=wasmExports["ReadMultiXactIdRange"])(a0,a1);var _MultiXactIdPrecedesOrEquals=Module["_MultiXactIdPrecedesOrEquals"]=(a0,a1)=>(_MultiXactIdPrecedesOrEquals=Module["_MultiXactIdPrecedesOrEquals"]=wasmExports["MultiXactIdPrecedesOrEquals"])(a0,a1);var _init_MultiFuncCall=Module["_init_MultiFuncCall"]=a0=>(_init_MultiFuncCall=Module["_init_MultiFuncCall"]=wasmExports["init_MultiFuncCall"])(a0);var _TupleDescGetAttInMetadata=Module["_TupleDescGetAttInMetadata"]=a0=>(_TupleDescGetAttInMetadata=Module["_TupleDescGetAttInMetadata"]=wasmExports["TupleDescGetAttInMetadata"])(a0);var _per_MultiFuncCall=Module["_per_MultiFuncCall"]=a0=>(_per_MultiFuncCall=Module["_per_MultiFuncCall"]=wasmExports["per_MultiFuncCall"])(a0);var _BuildTupleFromCStrings=Module["_BuildTupleFromCStrings"]=(a0,a1)=>(_BuildTupleFromCStrings=Module["_BuildTupleFromCStrings"]=wasmExports["BuildTupleFromCStrings"])(a0,a1);var _end_MultiFuncCall=Module["_end_MultiFuncCall"]=(a0,a1)=>(_end_MultiFuncCall=Module["_end_MultiFuncCall"]=wasmExports["end_MultiFuncCall"])(a0,a1);var _GetCurrentSubTransactionId=Module["_GetCurrentSubTransactionId"]=()=>(_GetCurrentSubTransactionId=Module["_GetCurrentSubTransactionId"]=wasmExports["GetCurrentSubTransactionId"])();var _WaitForBackgroundWorkerShutdown=Module["_WaitForBackgroundWorkerShutdown"]=a0=>(_WaitForBackgroundWorkerShutdown=Module["_WaitForBackgroundWorkerShutdown"]=wasmExports["WaitForBackgroundWorkerShutdown"])(a0);var _RegisterDynamicBackgroundWorker=Module["_RegisterDynamicBackgroundWorker"]=(a0,a1)=>(_RegisterDynamicBackgroundWorker=Module["_RegisterDynamicBackgroundWorker"]=wasmExports["RegisterDynamicBackgroundWorker"])(a0,a1);var _BackgroundWorkerUnblockSignals=Module["_BackgroundWorkerUnblockSignals"]=()=>(_BackgroundWorkerUnblockSignals=Module["_BackgroundWorkerUnblockSignals"]=wasmExports["BackgroundWorkerUnblockSignals"])();var _BackgroundWorkerInitializeConnectionByOid=Module["_BackgroundWorkerInitializeConnectionByOid"]=(a0,a1,a2)=>(_BackgroundWorkerInitializeConnectionByOid=Module["_BackgroundWorkerInitializeConnectionByOid"]=wasmExports["BackgroundWorkerInitializeConnectionByOid"])(a0,a1,a2);var _GetDatabaseEncoding=Module["_GetDatabaseEncoding"]=()=>(_GetDatabaseEncoding=Module["_GetDatabaseEncoding"]=wasmExports["GetDatabaseEncoding"])();var _RmgrNotFound=Module["_RmgrNotFound"]=a0=>(_RmgrNotFound=Module["_RmgrNotFound"]=wasmExports["RmgrNotFound"])(a0);var _InitMaterializedSRF=Module["_InitMaterializedSRF"]=(a0,a1)=>(_InitMaterializedSRF=Module["_InitMaterializedSRF"]=wasmExports["InitMaterializedSRF"])(a0,a1);var _tuplestore_putvalues=Module["_tuplestore_putvalues"]=(a0,a1,a2,a3)=>(_tuplestore_putvalues=Module["_tuplestore_putvalues"]=wasmExports["tuplestore_putvalues"])(a0,a1,a2,a3);var _AllocateFile=Module["_AllocateFile"]=(a0,a1)=>(_AllocateFile=Module["_AllocateFile"]=wasmExports["AllocateFile"])(a0,a1);var _FreeFile=Module["_FreeFile"]=a0=>(_FreeFile=Module["_FreeFile"]=wasmExports["FreeFile"])(a0);var _fd_durable_rename=Module["_fd_durable_rename"]=(a0,a1,a2)=>(_fd_durable_rename=Module["_fd_durable_rename"]=wasmExports["fd_durable_rename"])(a0,a1,a2);var _BlessTupleDesc=Module["_BlessTupleDesc"]=a0=>(_BlessTupleDesc=Module["_BlessTupleDesc"]=wasmExports["BlessTupleDesc"])(a0);var _fstat=Module["_fstat"]=(a0,a1)=>(_fstat=Module["_fstat"]=wasmExports["fstat"])(a0,a1);var _superuser_arg=Module["_superuser_arg"]=a0=>(_superuser_arg=Module["_superuser_arg"]=wasmExports["superuser_arg"])(a0);var _wal_segment_close=Module["_wal_segment_close"]=a0=>(_wal_segment_close=Module["_wal_segment_close"]=wasmExports["wal_segment_close"])(a0);var _wal_segment_open=Module["_wal_segment_open"]=(a0,a1,a2)=>(_wal_segment_open=Module["_wal_segment_open"]=wasmExports["wal_segment_open"])(a0,a1,a2);var _XLogReaderAllocate=Module["_XLogReaderAllocate"]=(a0,a1,a2,a3)=>(_XLogReaderAllocate=Module["_XLogReaderAllocate"]=wasmExports["XLogReaderAllocate"])(a0,a1,a2,a3);var _XLogReadRecord=Module["_XLogReadRecord"]=(a0,a1)=>(_XLogReadRecord=Module["_XLogReadRecord"]=wasmExports["XLogReadRecord"])(a0,a1);var _XLogReaderFree=Module["_XLogReaderFree"]=a0=>(_XLogReaderFree=Module["_XLogReaderFree"]=wasmExports["XLogReaderFree"])(a0);var _GetTopFullTransactionId=Module["_GetTopFullTransactionId"]=()=>(_GetTopFullTransactionId=Module["_GetTopFullTransactionId"]=wasmExports["GetTopFullTransactionId"])();var _GetCurrentTransactionNestLevel=Module["_GetCurrentTransactionNestLevel"]=()=>(_GetCurrentTransactionNestLevel=Module["_GetCurrentTransactionNestLevel"]=wasmExports["GetCurrentTransactionNestLevel"])();var _ResourceOwnerCreate=Module["_ResourceOwnerCreate"]=(a0,a1)=>(_ResourceOwnerCreate=Module["_ResourceOwnerCreate"]=wasmExports["ResourceOwnerCreate"])(a0,a1);var _RegisterXactCallback=Module["_RegisterXactCallback"]=(a0,a1)=>(_RegisterXactCallback=Module["_RegisterXactCallback"]=wasmExports["RegisterXactCallback"])(a0,a1);var _RegisterSubXactCallback=Module["_RegisterSubXactCallback"]=(a0,a1)=>(_RegisterSubXactCallback=Module["_RegisterSubXactCallback"]=wasmExports["RegisterSubXactCallback"])(a0,a1);var _BeginInternalSubTransaction=Module["_BeginInternalSubTransaction"]=a0=>(_BeginInternalSubTransaction=Module["_BeginInternalSubTransaction"]=wasmExports["BeginInternalSubTransaction"])(a0);var _ReleaseCurrentSubTransaction=Module["_ReleaseCurrentSubTransaction"]=()=>(_ReleaseCurrentSubTransaction=Module["_ReleaseCurrentSubTransaction"]=wasmExports["ReleaseCurrentSubTransaction"])();var _ResourceOwnerDelete=Module["_ResourceOwnerDelete"]=a0=>(_ResourceOwnerDelete=Module["_ResourceOwnerDelete"]=wasmExports["ResourceOwnerDelete"])(a0);var _RollbackAndReleaseCurrentSubTransaction=Module["_RollbackAndReleaseCurrentSubTransaction"]=()=>(_RollbackAndReleaseCurrentSubTransaction=Module["_RollbackAndReleaseCurrentSubTransaction"]=wasmExports["RollbackAndReleaseCurrentSubTransaction"])();var _ReleaseExternalFD=Module["_ReleaseExternalFD"]=()=>(_ReleaseExternalFD=Module["_ReleaseExternalFD"]=wasmExports["ReleaseExternalFD"])();var _GetFlushRecPtr=Module["_GetFlushRecPtr"]=a0=>(_GetFlushRecPtr=Module["_GetFlushRecPtr"]=wasmExports["GetFlushRecPtr"])(a0);var _GetXLogReplayRecPtr=Module["_GetXLogReplayRecPtr"]=a0=>(_GetXLogReplayRecPtr=Module["_GetXLogReplayRecPtr"]=wasmExports["GetXLogReplayRecPtr"])(a0);var _TimestampDifferenceMilliseconds=Module["_TimestampDifferenceMilliseconds"]=(a0,a1)=>(_TimestampDifferenceMilliseconds=Module["_TimestampDifferenceMilliseconds"]=wasmExports["TimestampDifferenceMilliseconds"])(a0,a1);var _numeric_in=Module["_numeric_in"]=a0=>(_numeric_in=Module["_numeric_in"]=wasmExports["numeric_in"])(a0);var _DirectFunctionCall3Coll=Module["_DirectFunctionCall3Coll"]=(a0,a1,a2,a3,a4)=>(_DirectFunctionCall3Coll=Module["_DirectFunctionCall3Coll"]=wasmExports["DirectFunctionCall3Coll"])(a0,a1,a2,a3,a4);var _XLogFindNextRecord=Module["_XLogFindNextRecord"]=(a0,a1)=>(_XLogFindNextRecord=Module["_XLogFindNextRecord"]=wasmExports["XLogFindNextRecord"])(a0,a1);var _RestoreBlockImage=Module["_RestoreBlockImage"]=(a0,a1,a2)=>(_RestoreBlockImage=Module["_RestoreBlockImage"]=wasmExports["RestoreBlockImage"])(a0,a1,a2);var _timestamptz_in=Module["_timestamptz_in"]=a0=>(_timestamptz_in=Module["_timestamptz_in"]=wasmExports["timestamptz_in"])(a0);var _fscanf=Module["_fscanf"]=(a0,a1,a2)=>(_fscanf=Module["_fscanf"]=wasmExports["fscanf"])(a0,a1,a2);var _XLogRecStoreStats=Module["_XLogRecStoreStats"]=(a0,a1)=>(_XLogRecStoreStats=Module["_XLogRecStoreStats"]=wasmExports["XLogRecStoreStats"])(a0,a1);var _hash_get_num_entries=Module["_hash_get_num_entries"]=a0=>(_hash_get_num_entries=Module["_hash_get_num_entries"]=wasmExports["hash_get_num_entries"])(a0);var _read_local_xlog_page_no_wait=Module["_read_local_xlog_page_no_wait"]=(a0,a1,a2,a3,a4)=>(_read_local_xlog_page_no_wait=Module["_read_local_xlog_page_no_wait"]=wasmExports["read_local_xlog_page_no_wait"])(a0,a1,a2,a3,a4);var _escape_json=Module["_escape_json"]=(a0,a1)=>(_escape_json=Module["_escape_json"]=wasmExports["escape_json"])(a0,a1);var _list_sort=Module["_list_sort"]=(a0,a1)=>(_list_sort=Module["_list_sort"]=wasmExports["list_sort"])(a0,a1);var _getegid=Module["_getegid"]=()=>(_getegid=Module["_getegid"]=wasmExports["getegid"])();var _pg_checksum_page=Module["_pg_checksum_page"]=(a0,a1)=>(_pg_checksum_page=Module["_pg_checksum_page"]=wasmExports["pg_checksum_page"])(a0,a1);var _bbsink_forward_end_archive=Module["_bbsink_forward_end_archive"]=a0=>(_bbsink_forward_end_archive=Module["_bbsink_forward_end_archive"]=wasmExports["bbsink_forward_end_archive"])(a0);var _bbsink_forward_begin_manifest=Module["_bbsink_forward_begin_manifest"]=a0=>(_bbsink_forward_begin_manifest=Module["_bbsink_forward_begin_manifest"]=wasmExports["bbsink_forward_begin_manifest"])(a0);var _bbsink_forward_end_manifest=Module["_bbsink_forward_end_manifest"]=a0=>(_bbsink_forward_end_manifest=Module["_bbsink_forward_end_manifest"]=wasmExports["bbsink_forward_end_manifest"])(a0);var _bbsink_forward_end_backup=Module["_bbsink_forward_end_backup"]=(a0,a1,a2)=>(_bbsink_forward_end_backup=Module["_bbsink_forward_end_backup"]=wasmExports["bbsink_forward_end_backup"])(a0,a1,a2);var _bbsink_forward_cleanup=Module["_bbsink_forward_cleanup"]=a0=>(_bbsink_forward_cleanup=Module["_bbsink_forward_cleanup"]=wasmExports["bbsink_forward_cleanup"])(a0);var _list_concat=Module["_list_concat"]=(a0,a1)=>(_list_concat=Module["_list_concat"]=wasmExports["list_concat"])(a0,a1);var _bbsink_forward_begin_backup=Module["_bbsink_forward_begin_backup"]=a0=>(_bbsink_forward_begin_backup=Module["_bbsink_forward_begin_backup"]=wasmExports["bbsink_forward_begin_backup"])(a0);var _bbsink_forward_archive_contents=Module["_bbsink_forward_archive_contents"]=(a0,a1)=>(_bbsink_forward_archive_contents=Module["_bbsink_forward_archive_contents"]=wasmExports["bbsink_forward_archive_contents"])(a0,a1);var _bbsink_forward_begin_archive=Module["_bbsink_forward_begin_archive"]=(a0,a1)=>(_bbsink_forward_begin_archive=Module["_bbsink_forward_begin_archive"]=wasmExports["bbsink_forward_begin_archive"])(a0,a1);var _bbsink_forward_manifest_contents=Module["_bbsink_forward_manifest_contents"]=(a0,a1)=>(_bbsink_forward_manifest_contents=Module["_bbsink_forward_manifest_contents"]=wasmExports["bbsink_forward_manifest_contents"])(a0,a1);var _has_privs_of_role=Module["_has_privs_of_role"]=(a0,a1)=>(_has_privs_of_role=Module["_has_privs_of_role"]=wasmExports["has_privs_of_role"])(a0,a1);var _BaseBackupAddTarget=Module["_BaseBackupAddTarget"]=(a0,a1,a2)=>(_BaseBackupAddTarget=Module["_BaseBackupAddTarget"]=wasmExports["BaseBackupAddTarget"])(a0,a1,a2);var _list_copy=Module["_list_copy"]=a0=>(_list_copy=Module["_list_copy"]=wasmExports["list_copy"])(a0);var _tuplestore_puttuple=Module["_tuplestore_puttuple"]=(a0,a1)=>(_tuplestore_puttuple=Module["_tuplestore_puttuple"]=wasmExports["tuplestore_puttuple"])(a0,a1);var _makeRangeVar=Module["_makeRangeVar"]=(a0,a1,a2)=>(_makeRangeVar=Module["_makeRangeVar"]=wasmExports["makeRangeVar"])(a0,a1,a2);var _DefineIndex=Module["_DefineIndex"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_DefineIndex=Module["_DefineIndex"]=wasmExports["DefineIndex"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _fread=Module["_fread"]=(a0,a1,a2,a3)=>(_fread=Module["_fread"]=wasmExports["fread"])(a0,a1,a2,a3);var _clearerr=Module["_clearerr"]=a0=>(_clearerr=Module["_clearerr"]=wasmExports["clearerr"])(a0);var _copyObjectImpl=Module["_copyObjectImpl"]=a0=>(_copyObjectImpl=Module["_copyObjectImpl"]=wasmExports["copyObjectImpl"])(a0);var _lappend_oid=Module["_lappend_oid"]=(a0,a1)=>(_lappend_oid=Module["_lappend_oid"]=wasmExports["lappend_oid"])(a0,a1);var _makeTypeNameFromNameList=Module["_makeTypeNameFromNameList"]=a0=>(_makeTypeNameFromNameList=Module["_makeTypeNameFromNameList"]=wasmExports["makeTypeNameFromNameList"])(a0);var _CatalogTupleUpdate=Module["_CatalogTupleUpdate"]=(a0,a1,a2)=>(_CatalogTupleUpdate=Module["_CatalogTupleUpdate"]=wasmExports["CatalogTupleUpdate"])(a0,a1,a2);var _get_rel_name=Module["_get_rel_name"]=a0=>(_get_rel_name=Module["_get_rel_name"]=wasmExports["get_rel_name"])(a0);var _CatalogTupleDelete=Module["_CatalogTupleDelete"]=(a0,a1)=>(_CatalogTupleDelete=Module["_CatalogTupleDelete"]=wasmExports["CatalogTupleDelete"])(a0,a1);var _CatalogTupleInsert=Module["_CatalogTupleInsert"]=(a0,a1)=>(_CatalogTupleInsert=Module["_CatalogTupleInsert"]=wasmExports["CatalogTupleInsert"])(a0,a1);var _recordDependencyOn=Module["_recordDependencyOn"]=(a0,a1,a2)=>(_recordDependencyOn=Module["_recordDependencyOn"]=wasmExports["recordDependencyOn"])(a0,a1,a2);var _get_element_type=Module["_get_element_type"]=a0=>(_get_element_type=Module["_get_element_type"]=wasmExports["get_element_type"])(a0);var _object_aclcheck=Module["_object_aclcheck"]=(a0,a1,a2,a3)=>(_object_aclcheck=Module["_object_aclcheck"]=wasmExports["object_aclcheck"])(a0,a1,a2,a3);var _superuser=Module["_superuser"]=()=>(_superuser=Module["_superuser"]=wasmExports["superuser"])();var _SearchSysCacheAttName=Module["_SearchSysCacheAttName"]=(a0,a1)=>(_SearchSysCacheAttName=Module["_SearchSysCacheAttName"]=wasmExports["SearchSysCacheAttName"])(a0,a1);var _new_object_addresses=Module["_new_object_addresses"]=()=>(_new_object_addresses=Module["_new_object_addresses"]=wasmExports["new_object_addresses"])();var _free_object_addresses=Module["_free_object_addresses"]=a0=>(_free_object_addresses=Module["_free_object_addresses"]=wasmExports["free_object_addresses"])(a0);var _performMultipleDeletions=Module["_performMultipleDeletions"]=(a0,a1,a2)=>(_performMultipleDeletions=Module["_performMultipleDeletions"]=wasmExports["performMultipleDeletions"])(a0,a1,a2);var _recordDependencyOnExpr=Module["_recordDependencyOnExpr"]=(a0,a1,a2,a3)=>(_recordDependencyOnExpr=Module["_recordDependencyOnExpr"]=wasmExports["recordDependencyOnExpr"])(a0,a1,a2,a3);var _query_tree_walker_impl=Module["_query_tree_walker_impl"]=(a0,a1,a2,a3)=>(_query_tree_walker_impl=Module["_query_tree_walker_impl"]=wasmExports["query_tree_walker_impl"])(a0,a1,a2,a3);var _expression_tree_walker_impl=Module["_expression_tree_walker_impl"]=(a0,a1,a2)=>(_expression_tree_walker_impl=Module["_expression_tree_walker_impl"]=wasmExports["expression_tree_walker_impl"])(a0,a1,a2);var _add_exact_object_address=Module["_add_exact_object_address"]=(a0,a1)=>(_add_exact_object_address=Module["_add_exact_object_address"]=wasmExports["add_exact_object_address"])(a0,a1);var _get_rel_relkind=Module["_get_rel_relkind"]=a0=>(_get_rel_relkind=Module["_get_rel_relkind"]=wasmExports["get_rel_relkind"])(a0);var _get_typtype=Module["_get_typtype"]=a0=>(_get_typtype=Module["_get_typtype"]=wasmExports["get_typtype"])(a0);var _list_delete_last=Module["_list_delete_last"]=a0=>(_list_delete_last=Module["_list_delete_last"]=wasmExports["list_delete_last"])(a0);var _type_is_collatable=Module["_type_is_collatable"]=a0=>(_type_is_collatable=Module["_type_is_collatable"]=wasmExports["type_is_collatable"])(a0);var _GetSysCacheOid=Module["_GetSysCacheOid"]=(a0,a1,a2,a3,a4,a5)=>(_GetSysCacheOid=Module["_GetSysCacheOid"]=wasmExports["GetSysCacheOid"])(a0,a1,a2,a3,a4,a5);var _CheckTableNotInUse=Module["_CheckTableNotInUse"]=(a0,a1)=>(_CheckTableNotInUse=Module["_CheckTableNotInUse"]=wasmExports["CheckTableNotInUse"])(a0,a1);var _construct_array=Module["_construct_array"]=(a0,a1,a2,a3,a4,a5)=>(_construct_array=Module["_construct_array"]=wasmExports["construct_array"])(a0,a1,a2,a3,a4,a5);var _make_parsestate=Module["_make_parsestate"]=a0=>(_make_parsestate=Module["_make_parsestate"]=wasmExports["make_parsestate"])(a0);var _transformExpr=Module["_transformExpr"]=(a0,a1,a2)=>(_transformExpr=Module["_transformExpr"]=wasmExports["transformExpr"])(a0,a1,a2);var _equal=Module["_equal"]=(a0,a1)=>(_equal=Module["_equal"]=wasmExports["equal"])(a0,a1);var _pull_var_clause=Module["_pull_var_clause"]=(a0,a1)=>(_pull_var_clause=Module["_pull_var_clause"]=wasmExports["pull_var_clause"])(a0,a1);var _get_attname=Module["_get_attname"]=(a0,a1,a2)=>(_get_attname=Module["_get_attname"]=wasmExports["get_attname"])(a0,a1,a2);var _coerce_to_target_type=Module["_coerce_to_target_type"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_coerce_to_target_type=Module["_coerce_to_target_type"]=wasmExports["coerce_to_target_type"])(a0,a1,a2,a3,a4,a5,a6,a7);var _nodeToString=Module["_nodeToString"]=a0=>(_nodeToString=Module["_nodeToString"]=wasmExports["nodeToString"])(a0);var _parser_errposition=Module["_parser_errposition"]=(a0,a1)=>(_parser_errposition=Module["_parser_errposition"]=wasmExports["parser_errposition"])(a0,a1);var _exprTypmod=Module["_exprTypmod"]=a0=>(_exprTypmod=Module["_exprTypmod"]=wasmExports["exprTypmod"])(a0);var _get_base_element_type=Module["_get_base_element_type"]=a0=>(_get_base_element_type=Module["_get_base_element_type"]=wasmExports["get_base_element_type"])(a0);var _SystemFuncName=Module["_SystemFuncName"]=a0=>(_SystemFuncName=Module["_SystemFuncName"]=wasmExports["SystemFuncName"])(a0);var _CreateTrigger=Module["_CreateTrigger"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_CreateTrigger=Module["_CreateTrigger"]=wasmExports["CreateTrigger"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _plan_create_index_workers=Module["_plan_create_index_workers"]=(a0,a1)=>(_plan_create_index_workers=Module["_plan_create_index_workers"]=wasmExports["plan_create_index_workers"])(a0,a1);var _get_rel_namespace=Module["_get_rel_namespace"]=a0=>(_get_rel_namespace=Module["_get_rel_namespace"]=wasmExports["get_rel_namespace"])(a0);var _ConditionalLockRelationOid=Module["_ConditionalLockRelationOid"]=(a0,a1)=>(_ConditionalLockRelationOid=Module["_ConditionalLockRelationOid"]=wasmExports["ConditionalLockRelationOid"])(a0,a1);var _RelnameGetRelid=Module["_RelnameGetRelid"]=a0=>(_RelnameGetRelid=Module["_RelnameGetRelid"]=wasmExports["RelnameGetRelid"])(a0);var _get_relkind_objtype=Module["_get_relkind_objtype"]=a0=>(_get_relkind_objtype=Module["_get_relkind_objtype"]=wasmExports["get_relkind_objtype"])(a0);var _RelationIsVisible=Module["_RelationIsVisible"]=a0=>(_RelationIsVisible=Module["_RelationIsVisible"]=wasmExports["RelationIsVisible"])(a0);var _get_func_arg_info=Module["_get_func_arg_info"]=(a0,a1,a2,a3)=>(_get_func_arg_info=Module["_get_func_arg_info"]=wasmExports["get_func_arg_info"])(a0,a1,a2,a3);var _NameListToString=Module["_NameListToString"]=a0=>(_NameListToString=Module["_NameListToString"]=wasmExports["NameListToString"])(a0);var _OpernameGetOprid=Module["_OpernameGetOprid"]=(a0,a1,a2)=>(_OpernameGetOprid=Module["_OpernameGetOprid"]=wasmExports["OpernameGetOprid"])(a0,a1,a2);var _makeRangeVarFromNameList=Module["_makeRangeVarFromNameList"]=a0=>(_makeRangeVarFromNameList=Module["_makeRangeVarFromNameList"]=wasmExports["makeRangeVarFromNameList"])(a0);var _quote_identifier=Module["_quote_identifier"]=a0=>(_quote_identifier=Module["_quote_identifier"]=wasmExports["quote_identifier"])(a0);var _GetSearchPathMatcher=Module["_GetSearchPathMatcher"]=a0=>(_GetSearchPathMatcher=Module["_GetSearchPathMatcher"]=wasmExports["GetSearchPathMatcher"])(a0);var _SearchPathMatchesCurrentEnvironment=Module["_SearchPathMatchesCurrentEnvironment"]=a0=>(_SearchPathMatchesCurrentEnvironment=Module["_SearchPathMatchesCurrentEnvironment"]=wasmExports["SearchPathMatchesCurrentEnvironment"])(a0);var _get_collation_oid=Module["_get_collation_oid"]=(a0,a1)=>(_get_collation_oid=Module["_get_collation_oid"]=wasmExports["get_collation_oid"])(a0,a1);var _CacheRegisterSyscacheCallback=Module["_CacheRegisterSyscacheCallback"]=(a0,a1,a2)=>(_CacheRegisterSyscacheCallback=Module["_CacheRegisterSyscacheCallback"]=wasmExports["CacheRegisterSyscacheCallback"])(a0,a1,a2);var _get_extension_oid=Module["_get_extension_oid"]=(a0,a1)=>(_get_extension_oid=Module["_get_extension_oid"]=wasmExports["get_extension_oid"])(a0,a1);var _get_role_oid=Module["_get_role_oid"]=(a0,a1)=>(_get_role_oid=Module["_get_role_oid"]=wasmExports["get_role_oid"])(a0,a1);var _GetForeignServerByName=Module["_GetForeignServerByName"]=(a0,a1)=>(_GetForeignServerByName=Module["_GetForeignServerByName"]=wasmExports["GetForeignServerByName"])(a0,a1);var _typeStringToTypeName=Module["_typeStringToTypeName"]=(a0,a1)=>(_typeStringToTypeName=Module["_typeStringToTypeName"]=wasmExports["typeStringToTypeName"])(a0,a1);var _list_make2_impl=Module["_list_make2_impl"]=(a0,a1,a2)=>(_list_make2_impl=Module["_list_make2_impl"]=wasmExports["list_make2_impl"])(a0,a1,a2);var _GetUserNameFromId=Module["_GetUserNameFromId"]=(a0,a1)=>(_GetUserNameFromId=Module["_GetUserNameFromId"]=wasmExports["GetUserNameFromId"])(a0,a1);var _format_type_extended=Module["_format_type_extended"]=(a0,a1,a2)=>(_format_type_extended=Module["_format_type_extended"]=wasmExports["format_type_extended"])(a0,a1,a2);var _quote_qualified_identifier=Module["_quote_qualified_identifier"]=(a0,a1)=>(_quote_qualified_identifier=Module["_quote_qualified_identifier"]=wasmExports["quote_qualified_identifier"])(a0,a1);var _get_tablespace_name=Module["_get_tablespace_name"]=a0=>(_get_tablespace_name=Module["_get_tablespace_name"]=wasmExports["get_tablespace_name"])(a0);var _GetForeignServerExtended=Module["_GetForeignServerExtended"]=(a0,a1)=>(_GetForeignServerExtended=Module["_GetForeignServerExtended"]=wasmExports["GetForeignServerExtended"])(a0,a1);var _GetForeignServer=Module["_GetForeignServer"]=a0=>(_GetForeignServer=Module["_GetForeignServer"]=wasmExports["GetForeignServer"])(a0);var _construct_empty_array=Module["_construct_empty_array"]=a0=>(_construct_empty_array=Module["_construct_empty_array"]=wasmExports["construct_empty_array"])(a0);var _format_type_be_qualified=Module["_format_type_be_qualified"]=a0=>(_format_type_be_qualified=Module["_format_type_be_qualified"]=wasmExports["format_type_be_qualified"])(a0);var _get_namespace_name_or_temp=Module["_get_namespace_name_or_temp"]=a0=>(_get_namespace_name_or_temp=Module["_get_namespace_name_or_temp"]=wasmExports["get_namespace_name_or_temp"])(a0);var _list_make3_impl=Module["_list_make3_impl"]=(a0,a1,a2,a3)=>(_list_make3_impl=Module["_list_make3_impl"]=wasmExports["list_make3_impl"])(a0,a1,a2,a3);var _construct_md_array=Module["_construct_md_array"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_construct_md_array=Module["_construct_md_array"]=wasmExports["construct_md_array"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _pull_varattnos=Module["_pull_varattnos"]=(a0,a1,a2)=>(_pull_varattnos=Module["_pull_varattnos"]=wasmExports["pull_varattnos"])(a0,a1,a2);var _get_func_name=Module["_get_func_name"]=a0=>(_get_func_name=Module["_get_func_name"]=wasmExports["get_func_name"])(a0);var _construct_array_builtin=Module["_construct_array_builtin"]=(a0,a1,a2)=>(_construct_array_builtin=Module["_construct_array_builtin"]=wasmExports["construct_array_builtin"])(a0,a1,a2);var _makeObjectName=Module["_makeObjectName"]=(a0,a1,a2)=>(_makeObjectName=Module["_makeObjectName"]=wasmExports["makeObjectName"])(a0,a1,a2);var _get_primary_key_attnos=Module["_get_primary_key_attnos"]=(a0,a1,a2)=>(_get_primary_key_attnos=Module["_get_primary_key_attnos"]=wasmExports["get_primary_key_attnos"])(a0,a1,a2);var _bms_is_subset=Module["_bms_is_subset"]=(a0,a1)=>(_bms_is_subset=Module["_bms_is_subset"]=wasmExports["bms_is_subset"])(a0,a1);var _getExtensionOfObject=Module["_getExtensionOfObject"]=(a0,a1)=>(_getExtensionOfObject=Module["_getExtensionOfObject"]=wasmExports["getExtensionOfObject"])(a0,a1);var _find_inheritance_children=Module["_find_inheritance_children"]=(a0,a1)=>(_find_inheritance_children=Module["_find_inheritance_children"]=wasmExports["find_inheritance_children"])(a0,a1);var _lappend_int=Module["_lappend_int"]=(a0,a1)=>(_lappend_int=Module["_lappend_int"]=wasmExports["lappend_int"])(a0,a1);var _has_superclass=Module["_has_superclass"]=a0=>(_has_superclass=Module["_has_superclass"]=wasmExports["has_superclass"])(a0);var _CheckFunctionValidatorAccess=Module["_CheckFunctionValidatorAccess"]=(a0,a1)=>(_CheckFunctionValidatorAccess=Module["_CheckFunctionValidatorAccess"]=wasmExports["CheckFunctionValidatorAccess"])(a0,a1);var _AcquireRewriteLocks=Module["_AcquireRewriteLocks"]=(a0,a1,a2)=>(_AcquireRewriteLocks=Module["_AcquireRewriteLocks"]=wasmExports["AcquireRewriteLocks"])(a0,a1,a2);var _function_parse_error_transpose=Module["_function_parse_error_transpose"]=a0=>(_function_parse_error_transpose=Module["_function_parse_error_transpose"]=wasmExports["function_parse_error_transpose"])(a0);var _geterrposition=Module["_geterrposition"]=()=>(_geterrposition=Module["_geterrposition"]=wasmExports["geterrposition"])();var _getinternalerrposition=Module["_getinternalerrposition"]=()=>(_getinternalerrposition=Module["_getinternalerrposition"]=wasmExports["getinternalerrposition"])();var _pg_mblen=Module["_pg_mblen"]=a0=>(_pg_mblen=Module["_pg_mblen"]=wasmExports["pg_mblen"])(a0);var _pg_mbstrlen_with_len=Module["_pg_mbstrlen_with_len"]=(a0,a1)=>(_pg_mbstrlen_with_len=Module["_pg_mbstrlen_with_len"]=wasmExports["pg_mbstrlen_with_len"])(a0,a1);var _errposition=Module["_errposition"]=a0=>(_errposition=Module["_errposition"]=wasmExports["errposition"])(a0);var _internalerrposition=Module["_internalerrposition"]=a0=>(_internalerrposition=Module["_internalerrposition"]=wasmExports["internalerrposition"])(a0);var _internalerrquery=Module["_internalerrquery"]=a0=>(_internalerrquery=Module["_internalerrquery"]=wasmExports["internalerrquery"])(a0);var _list_delete_nth_cell=Module["_list_delete_nth_cell"]=(a0,a1)=>(_list_delete_nth_cell=Module["_list_delete_nth_cell"]=wasmExports["list_delete_nth_cell"])(a0,a1);var _get_array_type=Module["_get_array_type"]=a0=>(_get_array_type=Module["_get_array_type"]=wasmExports["get_array_type"])(a0);var _smgrtruncate2=Module["_smgrtruncate2"]=(a0,a1,a2,a3,a4)=>(_smgrtruncate2=Module["_smgrtruncate2"]=wasmExports["smgrtruncate2"])(a0,a1,a2,a3,a4);var _smgrreadv=Module["_smgrreadv"]=(a0,a1,a2,a3,a4)=>(_smgrreadv=Module["_smgrreadv"]=wasmExports["smgrreadv"])(a0,a1,a2,a3,a4);var _NewRelationCreateToastTable=Module["_NewRelationCreateToastTable"]=(a0,a1)=>(_NewRelationCreateToastTable=Module["_NewRelationCreateToastTable"]=wasmExports["NewRelationCreateToastTable"])(a0,a1);var _transformStmt=Module["_transformStmt"]=(a0,a1)=>(_transformStmt=Module["_transformStmt"]=wasmExports["transformStmt"])(a0,a1);var _exprLocation=Module["_exprLocation"]=a0=>(_exprLocation=Module["_exprLocation"]=wasmExports["exprLocation"])(a0);var _ParseFuncOrColumn=Module["_ParseFuncOrColumn"]=(a0,a1,a2,a3,a4,a5,a6)=>(_ParseFuncOrColumn=Module["_ParseFuncOrColumn"]=wasmExports["ParseFuncOrColumn"])(a0,a1,a2,a3,a4,a5,a6);var _exprCollation=Module["_exprCollation"]=a0=>(_exprCollation=Module["_exprCollation"]=wasmExports["exprCollation"])(a0);var _transformDistinctClause=Module["_transformDistinctClause"]=(a0,a1,a2,a3)=>(_transformDistinctClause=Module["_transformDistinctClause"]=wasmExports["transformDistinctClause"])(a0,a1,a2,a3);var _makeTargetEntry=Module["_makeTargetEntry"]=(a0,a1,a2,a3)=>(_makeTargetEntry=Module["_makeTargetEntry"]=wasmExports["makeTargetEntry"])(a0,a1,a2,a3);var _makeAlias=Module["_makeAlias"]=(a0,a1)=>(_makeAlias=Module["_makeAlias"]=wasmExports["makeAlias"])(a0,a1);var _addRangeTableEntryForSubquery=Module["_addRangeTableEntryForSubquery"]=(a0,a1,a2,a3,a4)=>(_addRangeTableEntryForSubquery=Module["_addRangeTableEntryForSubquery"]=wasmExports["addRangeTableEntryForSubquery"])(a0,a1,a2,a3,a4);var _makeVar=Module["_makeVar"]=(a0,a1,a2,a3,a4,a5)=>(_makeVar=Module["_makeVar"]=wasmExports["makeVar"])(a0,a1,a2,a3,a4,a5);var _makeBoolean=Module["_makeBoolean"]=a0=>(_makeBoolean=Module["_makeBoolean"]=wasmExports["makeBoolean"])(a0);var _makeInteger=Module["_makeInteger"]=a0=>(_makeInteger=Module["_makeInteger"]=wasmExports["makeInteger"])(a0);var _makeTypeName=Module["_makeTypeName"]=a0=>(_makeTypeName=Module["_makeTypeName"]=wasmExports["makeTypeName"])(a0);var _makeFuncCall=Module["_makeFuncCall"]=(a0,a1,a2,a3)=>(_makeFuncCall=Module["_makeFuncCall"]=wasmExports["makeFuncCall"])(a0,a1,a2,a3);var _list_make4_impl=Module["_list_make4_impl"]=(a0,a1,a2,a3,a4)=>(_list_make4_impl=Module["_list_make4_impl"]=wasmExports["list_make4_impl"])(a0,a1,a2,a3,a4);var _get_sortgroupclause_tle=Module["_get_sortgroupclause_tle"]=(a0,a1)=>(_get_sortgroupclause_tle=Module["_get_sortgroupclause_tle"]=wasmExports["get_sortgroupclause_tle"])(a0,a1);var _flatten_join_alias_vars=Module["_flatten_join_alias_vars"]=(a0,a1,a2)=>(_flatten_join_alias_vars=Module["_flatten_join_alias_vars"]=wasmExports["flatten_join_alias_vars"])(a0,a1,a2);var _list_member_int=Module["_list_member_int"]=(a0,a1)=>(_list_member_int=Module["_list_member_int"]=wasmExports["list_member_int"])(a0,a1);var _addRangeTableEntryForENR=Module["_addRangeTableEntryForENR"]=(a0,a1,a2)=>(_addRangeTableEntryForENR=Module["_addRangeTableEntryForENR"]=wasmExports["addRangeTableEntryForENR"])(a0,a1,a2);var _typenameTypeIdAndMod=Module["_typenameTypeIdAndMod"]=(a0,a1,a2,a3)=>(_typenameTypeIdAndMod=Module["_typenameTypeIdAndMod"]=wasmExports["typenameTypeIdAndMod"])(a0,a1,a2,a3);var _get_typcollation=Module["_get_typcollation"]=a0=>(_get_typcollation=Module["_get_typcollation"]=wasmExports["get_typcollation"])(a0);var _strip_implicit_coercions=Module["_strip_implicit_coercions"]=a0=>(_strip_implicit_coercions=Module["_strip_implicit_coercions"]=wasmExports["strip_implicit_coercions"])(a0);var _get_sortgroupref_tle=Module["_get_sortgroupref_tle"]=(a0,a1)=>(_get_sortgroupref_tle=Module["_get_sortgroupref_tle"]=wasmExports["get_sortgroupref_tle"])(a0,a1);var _contain_aggs_of_level=Module["_contain_aggs_of_level"]=(a0,a1)=>(_contain_aggs_of_level=Module["_contain_aggs_of_level"]=wasmExports["contain_aggs_of_level"])(a0,a1);var _typeidType=Module["_typeidType"]=a0=>(_typeidType=Module["_typeidType"]=wasmExports["typeidType"])(a0);var _typeTypeCollation=Module["_typeTypeCollation"]=a0=>(_typeTypeCollation=Module["_typeTypeCollation"]=wasmExports["typeTypeCollation"])(a0);var _typeLen=Module["_typeLen"]=a0=>(_typeLen=Module["_typeLen"]=wasmExports["typeLen"])(a0);var _typeByVal=Module["_typeByVal"]=a0=>(_typeByVal=Module["_typeByVal"]=wasmExports["typeByVal"])(a0);var _makeConst=Module["_makeConst"]=(a0,a1,a2,a3,a4,a5,a6)=>(_makeConst=Module["_makeConst"]=wasmExports["makeConst"])(a0,a1,a2,a3,a4,a5,a6);var _lookup_rowtype_tupdesc=Module["_lookup_rowtype_tupdesc"]=(a0,a1)=>(_lookup_rowtype_tupdesc=Module["_lookup_rowtype_tupdesc"]=wasmExports["lookup_rowtype_tupdesc"])(a0,a1);var _bms_del_member=Module["_bms_del_member"]=(a0,a1)=>(_bms_del_member=Module["_bms_del_member"]=wasmExports["bms_del_member"])(a0,a1);var _list_member=Module["_list_member"]=(a0,a1)=>(_list_member=Module["_list_member"]=wasmExports["list_member"])(a0,a1);var _type_is_rowtype=Module["_type_is_rowtype"]=a0=>(_type_is_rowtype=Module["_type_is_rowtype"]=wasmExports["type_is_rowtype"])(a0);var _bit_in=Module["_bit_in"]=a0=>(_bit_in=Module["_bit_in"]=wasmExports["bit_in"])(a0);var _bms_union=Module["_bms_union"]=(a0,a1)=>(_bms_union=Module["_bms_union"]=wasmExports["bms_union"])(a0,a1);var _varstr_levenshtein_less_equal=Module["_varstr_levenshtein_less_equal"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_varstr_levenshtein_less_equal=Module["_varstr_levenshtein_less_equal"]=wasmExports["varstr_levenshtein_less_equal"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _errsave_start=Module["_errsave_start"]=(a0,a1)=>(_errsave_start=Module["_errsave_start"]=wasmExports["errsave_start"])(a0,a1);var _errsave_finish=Module["_errsave_finish"]=(a0,a1,a2,a3)=>(_errsave_finish=Module["_errsave_finish"]=wasmExports["errsave_finish"])(a0,a1,a2,a3);var _makeColumnDef=Module["_makeColumnDef"]=(a0,a1,a2,a3)=>(_makeColumnDef=Module["_makeColumnDef"]=wasmExports["makeColumnDef"])(a0,a1,a2,a3);var _GetDefaultOpClass=Module["_GetDefaultOpClass"]=(a0,a1)=>(_GetDefaultOpClass=Module["_GetDefaultOpClass"]=wasmExports["GetDefaultOpClass"])(a0,a1);var _scanner_init=Module["_scanner_init"]=(a0,a1,a2,a3)=>(_scanner_init=Module["_scanner_init"]=wasmExports["scanner_init"])(a0,a1,a2,a3);var _scanner_finish=Module["_scanner_finish"]=a0=>(_scanner_finish=Module["_scanner_finish"]=wasmExports["scanner_finish"])(a0);var _core_yylex=Module["_core_yylex"]=(a0,a1,a2)=>(_core_yylex=Module["_core_yylex"]=wasmExports["core_yylex"])(a0,a1,a2);var _isxdigit=Module["_isxdigit"]=a0=>(_isxdigit=Module["_isxdigit"]=wasmExports["isxdigit"])(a0);var _scanner_isspace=Module["_scanner_isspace"]=a0=>(_scanner_isspace=Module["_scanner_isspace"]=wasmExports["scanner_isspace"])(a0);var _truncate_identifier=Module["_truncate_identifier"]=(a0,a1,a2)=>(_truncate_identifier=Module["_truncate_identifier"]=wasmExports["truncate_identifier"])(a0,a1,a2);var _downcase_truncate_identifier=Module["_downcase_truncate_identifier"]=(a0,a1,a2)=>(_downcase_truncate_identifier=Module["_downcase_truncate_identifier"]=wasmExports["downcase_truncate_identifier"])(a0,a1,a2);var _pg_database_encoding_max_length=Module["_pg_database_encoding_max_length"]=()=>(_pg_database_encoding_max_length=Module["_pg_database_encoding_max_length"]=wasmExports["pg_database_encoding_max_length"])();var _namein=Module["_namein"]=a0=>(_namein=Module["_namein"]=wasmExports["namein"])(a0);var _BlockSampler_Init=Module["_BlockSampler_Init"]=(a0,a1,a2,a3)=>(_BlockSampler_Init=Module["_BlockSampler_Init"]=wasmExports["BlockSampler_Init"])(a0,a1,a2,a3);var _reservoir_init_selection_state=Module["_reservoir_init_selection_state"]=(a0,a1)=>(_reservoir_init_selection_state=Module["_reservoir_init_selection_state"]=wasmExports["reservoir_init_selection_state"])(a0,a1);var _reservoir_get_next_S=Module["_reservoir_get_next_S"]=(a0,a1,a2)=>(_reservoir_get_next_S=Module["_reservoir_get_next_S"]=wasmExports["reservoir_get_next_S"])(a0,a1,a2);var _sampler_random_fract=Module["_sampler_random_fract"]=a0=>(_sampler_random_fract=Module["_sampler_random_fract"]=wasmExports["sampler_random_fract"])(a0);var _BlockSampler_HasMore=Module["_BlockSampler_HasMore"]=a0=>(_BlockSampler_HasMore=Module["_BlockSampler_HasMore"]=wasmExports["BlockSampler_HasMore"])(a0);var _BlockSampler_Next=Module["_BlockSampler_Next"]=a0=>(_BlockSampler_Next=Module["_BlockSampler_Next"]=wasmExports["BlockSampler_Next"])(a0);var _Async_Notify=Module["_Async_Notify"]=(a0,a1)=>(_Async_Notify=Module["_Async_Notify"]=wasmExports["Async_Notify"])(a0,a1);var _RangeVarCallbackMaintainsTable=Module["_RangeVarCallbackMaintainsTable"]=(a0,a1,a2,a3)=>(_RangeVarCallbackMaintainsTable=Module["_RangeVarCallbackMaintainsTable"]=wasmExports["RangeVarCallbackMaintainsTable"])(a0,a1,a2,a3);var _make_new_heap=Module["_make_new_heap"]=(a0,a1,a2,a3,a4)=>(_make_new_heap=Module["_make_new_heap"]=wasmExports["make_new_heap"])(a0,a1,a2,a3,a4);var _finish_heap_swap=Module["_finish_heap_swap"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_finish_heap_swap=Module["_finish_heap_swap"]=wasmExports["finish_heap_swap"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _wasm_OpenPipeStream=Module["_wasm_OpenPipeStream"]=(a0,a1)=>(_wasm_OpenPipeStream=Module["_wasm_OpenPipeStream"]=wasmExports["wasm_OpenPipeStream"])(a0,a1);var _ClosePipeStream=Module["_ClosePipeStream"]=a0=>(_ClosePipeStream=Module["_ClosePipeStream"]=wasmExports["ClosePipeStream"])(a0);var _BeginCopyFrom=Module["_BeginCopyFrom"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_BeginCopyFrom=Module["_BeginCopyFrom"]=wasmExports["BeginCopyFrom"])(a0,a1,a2,a3,a4,a5,a6,a7);var _EndCopyFrom=Module["_EndCopyFrom"]=a0=>(_EndCopyFrom=Module["_EndCopyFrom"]=wasmExports["EndCopyFrom"])(a0);var _ProcessCopyOptions=Module["_ProcessCopyOptions"]=(a0,a1,a2,a3)=>(_ProcessCopyOptions=Module["_ProcessCopyOptions"]=wasmExports["ProcessCopyOptions"])(a0,a1,a2,a3);var _CopyFromErrorCallback=Module["_CopyFromErrorCallback"]=a0=>(_CopyFromErrorCallback=Module["_CopyFromErrorCallback"]=wasmExports["CopyFromErrorCallback"])(a0);var _NextCopyFrom=Module["_NextCopyFrom"]=(a0,a1,a2,a3)=>(_NextCopyFrom=Module["_NextCopyFrom"]=wasmExports["NextCopyFrom"])(a0,a1,a2,a3);var _ExecInitExpr=Module["_ExecInitExpr"]=(a0,a1)=>(_ExecInitExpr=Module["_ExecInitExpr"]=wasmExports["ExecInitExpr"])(a0,a1);var _tolower=Module["_tolower"]=a0=>(_tolower=Module["_tolower"]=wasmExports["tolower"])(a0);var _PushCopiedSnapshot=Module["_PushCopiedSnapshot"]=a0=>(_PushCopiedSnapshot=Module["_PushCopiedSnapshot"]=wasmExports["PushCopiedSnapshot"])(a0);var _UpdateActiveSnapshotCommandId=Module["_UpdateActiveSnapshotCommandId"]=()=>(_UpdateActiveSnapshotCommandId=Module["_UpdateActiveSnapshotCommandId"]=wasmExports["UpdateActiveSnapshotCommandId"])();var _CreateQueryDesc=Module["_CreateQueryDesc"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_CreateQueryDesc=Module["_CreateQueryDesc"]=wasmExports["CreateQueryDesc"])(a0,a1,a2,a3,a4,a5,a6,a7);var _ExecutorStart=Module["_ExecutorStart"]=(a0,a1)=>(_ExecutorStart=Module["_ExecutorStart"]=wasmExports["ExecutorStart"])(a0,a1);var _ExecutorFinish=Module["_ExecutorFinish"]=a0=>(_ExecutorFinish=Module["_ExecutorFinish"]=wasmExports["ExecutorFinish"])(a0);var _ExecutorEnd=Module["_ExecutorEnd"]=a0=>(_ExecutorEnd=Module["_ExecutorEnd"]=wasmExports["ExecutorEnd"])(a0);var _FreeQueryDesc=Module["_FreeQueryDesc"]=a0=>(_FreeQueryDesc=Module["_FreeQueryDesc"]=wasmExports["FreeQueryDesc"])(a0);var _pg_server_to_any=Module["_pg_server_to_any"]=(a0,a1,a2)=>(_pg_server_to_any=Module["_pg_server_to_any"]=wasmExports["pg_server_to_any"])(a0,a1,a2);var _ExecutorRun=Module["_ExecutorRun"]=(a0,a1,a2,a3)=>(_ExecutorRun=Module["_ExecutorRun"]=wasmExports["ExecutorRun"])(a0,a1,a2,a3);var _CreateTableAsRelExists=Module["_CreateTableAsRelExists"]=a0=>(_CreateTableAsRelExists=Module["_CreateTableAsRelExists"]=wasmExports["CreateTableAsRelExists"])(a0);var _DefineRelation=Module["_DefineRelation"]=(a0,a1,a2,a3,a4,a5)=>(_DefineRelation=Module["_DefineRelation"]=wasmExports["DefineRelation"])(a0,a1,a2,a3,a4,a5);var _oidin=Module["_oidin"]=a0=>(_oidin=Module["_oidin"]=wasmExports["oidin"])(a0);var _GetCommandTagName=Module["_GetCommandTagName"]=a0=>(_GetCommandTagName=Module["_GetCommandTagName"]=wasmExports["GetCommandTagName"])(a0);var _ExplainBeginOutput=Module["_ExplainBeginOutput"]=a0=>(_ExplainBeginOutput=Module["_ExplainBeginOutput"]=wasmExports["ExplainBeginOutput"])(a0);var _NewExplainState=Module["_NewExplainState"]=()=>(_NewExplainState=Module["_NewExplainState"]=wasmExports["NewExplainState"])();var _ExplainEndOutput=Module["_ExplainEndOutput"]=a0=>(_ExplainEndOutput=Module["_ExplainEndOutput"]=wasmExports["ExplainEndOutput"])(a0);var _ExplainPrintPlan=Module["_ExplainPrintPlan"]=(a0,a1)=>(_ExplainPrintPlan=Module["_ExplainPrintPlan"]=wasmExports["ExplainPrintPlan"])(a0,a1);var _ExplainPrintTriggers=Module["_ExplainPrintTriggers"]=(a0,a1)=>(_ExplainPrintTriggers=Module["_ExplainPrintTriggers"]=wasmExports["ExplainPrintTriggers"])(a0,a1);var _ExplainPrintJITSummary=Module["_ExplainPrintJITSummary"]=(a0,a1)=>(_ExplainPrintJITSummary=Module["_ExplainPrintJITSummary"]=wasmExports["ExplainPrintJITSummary"])(a0,a1);var _InstrEndLoop=Module["_InstrEndLoop"]=a0=>(_InstrEndLoop=Module["_InstrEndLoop"]=wasmExports["InstrEndLoop"])(a0);var _ExplainPropertyInteger=Module["_ExplainPropertyInteger"]=(a0,a1,a2,a3)=>(_ExplainPropertyInteger=Module["_ExplainPropertyInteger"]=wasmExports["ExplainPropertyInteger"])(a0,a1,a2,a3);var _ExplainQueryText=Module["_ExplainQueryText"]=(a0,a1)=>(_ExplainQueryText=Module["_ExplainQueryText"]=wasmExports["ExplainQueryText"])(a0,a1);var _ExplainPropertyText=Module["_ExplainPropertyText"]=(a0,a1,a2)=>(_ExplainPropertyText=Module["_ExplainPropertyText"]=wasmExports["ExplainPropertyText"])(a0,a1,a2);var _ExplainQueryParameters=Module["_ExplainQueryParameters"]=(a0,a1,a2)=>(_ExplainQueryParameters=Module["_ExplainQueryParameters"]=wasmExports["ExplainQueryParameters"])(a0,a1,a2);var _get_func_namespace=Module["_get_func_namespace"]=a0=>(_get_func_namespace=Module["_get_func_namespace"]=wasmExports["get_func_namespace"])(a0);var _get_rel_type_id=Module["_get_rel_type_id"]=a0=>(_get_rel_type_id=Module["_get_rel_type_id"]=wasmExports["get_rel_type_id"])(a0);var _set_config_option=Module["_set_config_option"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_set_config_option=Module["_set_config_option"]=wasmExports["set_config_option"])(a0,a1,a2,a3,a4,a5,a6,a7);var _pg_any_to_server=Module["_pg_any_to_server"]=(a0,a1,a2)=>(_pg_any_to_server=Module["_pg_any_to_server"]=wasmExports["pg_any_to_server"])(a0,a1,a2);var _DirectFunctionCall4Coll=Module["_DirectFunctionCall4Coll"]=(a0,a1,a2,a3,a4,a5)=>(_DirectFunctionCall4Coll=Module["_DirectFunctionCall4Coll"]=wasmExports["DirectFunctionCall4Coll"])(a0,a1,a2,a3,a4,a5);var _list_delete_cell=Module["_list_delete_cell"]=(a0,a1)=>(_list_delete_cell=Module["_list_delete_cell"]=wasmExports["list_delete_cell"])(a0,a1);var _GetForeignDataWrapper=Module["_GetForeignDataWrapper"]=a0=>(_GetForeignDataWrapper=Module["_GetForeignDataWrapper"]=wasmExports["GetForeignDataWrapper"])(a0);var _CreateExprContext=Module["_CreateExprContext"]=a0=>(_CreateExprContext=Module["_CreateExprContext"]=wasmExports["CreateExprContext"])(a0);var _EnsurePortalSnapshotExists=Module["_EnsurePortalSnapshotExists"]=()=>(_EnsurePortalSnapshotExists=Module["_EnsurePortalSnapshotExists"]=wasmExports["EnsurePortalSnapshotExists"])();var _CheckIndexCompatible=Module["_CheckIndexCompatible"]=(a0,a1,a2,a3)=>(_CheckIndexCompatible=Module["_CheckIndexCompatible"]=wasmExports["CheckIndexCompatible"])(a0,a1,a2,a3);var _pgstat_count_truncate=Module["_pgstat_count_truncate"]=a0=>(_pgstat_count_truncate=Module["_pgstat_count_truncate"]=wasmExports["pgstat_count_truncate"])(a0);var _SPI_connect=Module["_SPI_connect"]=()=>(_SPI_connect=Module["_SPI_connect"]=wasmExports["SPI_connect"])();var _SPI_exec=Module["_SPI_exec"]=(a0,a1)=>(_SPI_exec=Module["_SPI_exec"]=wasmExports["SPI_exec"])(a0,a1);var _SPI_execute=Module["_SPI_execute"]=(a0,a1,a2)=>(_SPI_execute=Module["_SPI_execute"]=wasmExports["SPI_execute"])(a0,a1,a2);var _SPI_getvalue=Module["_SPI_getvalue"]=(a0,a1,a2)=>(_SPI_getvalue=Module["_SPI_getvalue"]=wasmExports["SPI_getvalue"])(a0,a1,a2);var _generate_operator_clause=Module["_generate_operator_clause"]=(a0,a1,a2,a3,a4,a5)=>(_generate_operator_clause=Module["_generate_operator_clause"]=wasmExports["generate_operator_clause"])(a0,a1,a2,a3,a4,a5);var _SPI_finish=Module["_SPI_finish"]=()=>(_SPI_finish=Module["_SPI_finish"]=wasmExports["SPI_finish"])();var _CreateTransientRelDestReceiver=Module["_CreateTransientRelDestReceiver"]=a0=>(_CreateTransientRelDestReceiver=Module["_CreateTransientRelDestReceiver"]=wasmExports["CreateTransientRelDestReceiver"])(a0);var _MemoryContextSetIdentifier=Module["_MemoryContextSetIdentifier"]=(a0,a1)=>(_MemoryContextSetIdentifier=Module["_MemoryContextSetIdentifier"]=wasmExports["MemoryContextSetIdentifier"])(a0,a1);var _checkExprHasSubLink=Module["_checkExprHasSubLink"]=a0=>(_checkExprHasSubLink=Module["_checkExprHasSubLink"]=wasmExports["checkExprHasSubLink"])(a0);var _SetTuplestoreDestReceiverParams=Module["_SetTuplestoreDestReceiverParams"]=(a0,a1,a2,a3,a4,a5)=>(_SetTuplestoreDestReceiverParams=Module["_SetTuplestoreDestReceiverParams"]=wasmExports["SetTuplestoreDestReceiverParams"])(a0,a1,a2,a3,a4,a5);var _tuplestore_rescan=Module["_tuplestore_rescan"]=a0=>(_tuplestore_rescan=Module["_tuplestore_rescan"]=wasmExports["tuplestore_rescan"])(a0);var _MemoryContextDeleteChildren=Module["_MemoryContextDeleteChildren"]=a0=>(_MemoryContextDeleteChildren=Module["_MemoryContextDeleteChildren"]=wasmExports["MemoryContextDeleteChildren"])(a0);var _ReleaseCachedPlan=Module["_ReleaseCachedPlan"]=(a0,a1)=>(_ReleaseCachedPlan=Module["_ReleaseCachedPlan"]=wasmExports["ReleaseCachedPlan"])(a0,a1);var _nextval=Module["_nextval"]=a0=>(_nextval=Module["_nextval"]=wasmExports["nextval"])(a0);var _textToQualifiedNameList=Module["_textToQualifiedNameList"]=a0=>(_textToQualifiedNameList=Module["_textToQualifiedNameList"]=wasmExports["textToQualifiedNameList"])(a0);var _tuplestore_gettupleslot=Module["_tuplestore_gettupleslot"]=(a0,a1,a2,a3)=>(_tuplestore_gettupleslot=Module["_tuplestore_gettupleslot"]=wasmExports["tuplestore_gettupleslot"])(a0,a1,a2,a3);var _list_delete=Module["_list_delete"]=(a0,a1)=>(_list_delete=Module["_list_delete"]=wasmExports["list_delete"])(a0,a1);var _tuplestore_end=Module["_tuplestore_end"]=a0=>(_tuplestore_end=Module["_tuplestore_end"]=wasmExports["tuplestore_end"])(a0);var _quote_literal_cstr=Module["_quote_literal_cstr"]=a0=>(_quote_literal_cstr=Module["_quote_literal_cstr"]=wasmExports["quote_literal_cstr"])(a0);var _contain_mutable_functions=Module["_contain_mutable_functions"]=a0=>(_contain_mutable_functions=Module["_contain_mutable_functions"]=wasmExports["contain_mutable_functions"])(a0);var _ExecuteTruncateGuts=Module["_ExecuteTruncateGuts"]=(a0,a1,a2,a3,a4,a5)=>(_ExecuteTruncateGuts=Module["_ExecuteTruncateGuts"]=wasmExports["ExecuteTruncateGuts"])(a0,a1,a2,a3,a4,a5);var _bms_make_singleton=Module["_bms_make_singleton"]=a0=>(_bms_make_singleton=Module["_bms_make_singleton"]=wasmExports["bms_make_singleton"])(a0);var _tuplestore_puttupleslot=Module["_tuplestore_puttupleslot"]=(a0,a1)=>(_tuplestore_puttupleslot=Module["_tuplestore_puttupleslot"]=wasmExports["tuplestore_puttupleslot"])(a0,a1);var _tuplestore_begin_heap=Module["_tuplestore_begin_heap"]=(a0,a1,a2)=>(_tuplestore_begin_heap=Module["_tuplestore_begin_heap"]=wasmExports["tuplestore_begin_heap"])(a0,a1,a2);var _ExecForceStoreHeapTuple=Module["_ExecForceStoreHeapTuple"]=(a0,a1,a2)=>(_ExecForceStoreHeapTuple=Module["_ExecForceStoreHeapTuple"]=wasmExports["ExecForceStoreHeapTuple"])(a0,a1,a2);var _strtod=Module["_strtod"]=(a0,a1)=>(_strtod=Module["_strtod"]=wasmExports["strtod"])(a0,a1);var _plain_crypt_verify=Module["_plain_crypt_verify"]=(a0,a1,a2,a3)=>(_plain_crypt_verify=Module["_plain_crypt_verify"]=wasmExports["plain_crypt_verify"])(a0,a1,a2,a3);var _ProcessConfigFile=Module["_ProcessConfigFile"]=a0=>(_ProcessConfigFile=Module["_ProcessConfigFile"]=wasmExports["ProcessConfigFile"])(a0);var _ExecReScan=Module["_ExecReScan"]=a0=>(_ExecReScan=Module["_ExecReScan"]=wasmExports["ExecReScan"])(a0);var _ExecAsyncResponse=Module["_ExecAsyncResponse"]=a0=>(_ExecAsyncResponse=Module["_ExecAsyncResponse"]=wasmExports["ExecAsyncResponse"])(a0);var _ExecAsyncRequestDone=Module["_ExecAsyncRequestDone"]=(a0,a1)=>(_ExecAsyncRequestDone=Module["_ExecAsyncRequestDone"]=wasmExports["ExecAsyncRequestDone"])(a0,a1);var _ExecAsyncRequestPending=Module["_ExecAsyncRequestPending"]=a0=>(_ExecAsyncRequestPending=Module["_ExecAsyncRequestPending"]=wasmExports["ExecAsyncRequestPending"])(a0);var _ExprEvalPushStep=Module["_ExprEvalPushStep"]=(a0,a1)=>(_ExprEvalPushStep=Module["_ExprEvalPushStep"]=wasmExports["ExprEvalPushStep"])(a0,a1);var _ExecInitExprWithParams=Module["_ExecInitExprWithParams"]=(a0,a1)=>(_ExecInitExprWithParams=Module["_ExecInitExprWithParams"]=wasmExports["ExecInitExprWithParams"])(a0,a1);var _ExecInitExprList=Module["_ExecInitExprList"]=(a0,a1)=>(_ExecInitExprList=Module["_ExecInitExprList"]=wasmExports["ExecInitExprList"])(a0,a1);var _MakeExpandedObjectReadOnlyInternal=Module["_MakeExpandedObjectReadOnlyInternal"]=a0=>(_MakeExpandedObjectReadOnlyInternal=Module["_MakeExpandedObjectReadOnlyInternal"]=wasmExports["MakeExpandedObjectReadOnlyInternal"])(a0);var _tuplesort_puttupleslot=Module["_tuplesort_puttupleslot"]=(a0,a1)=>(_tuplesort_puttupleslot=Module["_tuplesort_puttupleslot"]=wasmExports["tuplesort_puttupleslot"])(a0,a1);var _ArrayGetNItems=Module["_ArrayGetNItems"]=(a0,a1)=>(_ArrayGetNItems=Module["_ArrayGetNItems"]=wasmExports["ArrayGetNItems"])(a0,a1);var _expanded_record_fetch_tupdesc=Module["_expanded_record_fetch_tupdesc"]=a0=>(_expanded_record_fetch_tupdesc=Module["_expanded_record_fetch_tupdesc"]=wasmExports["expanded_record_fetch_tupdesc"])(a0);var _expanded_record_fetch_field=Module["_expanded_record_fetch_field"]=(a0,a1,a2)=>(_expanded_record_fetch_field=Module["_expanded_record_fetch_field"]=wasmExports["expanded_record_fetch_field"])(a0,a1,a2);var _JsonbValueToJsonb=Module["_JsonbValueToJsonb"]=a0=>(_JsonbValueToJsonb=Module["_JsonbValueToJsonb"]=wasmExports["JsonbValueToJsonb"])(a0);var _boolout=Module["_boolout"]=a0=>(_boolout=Module["_boolout"]=wasmExports["boolout"])(a0);var _lookup_rowtype_tupdesc_domain=Module["_lookup_rowtype_tupdesc_domain"]=(a0,a1,a2)=>(_lookup_rowtype_tupdesc_domain=Module["_lookup_rowtype_tupdesc_domain"]=wasmExports["lookup_rowtype_tupdesc_domain"])(a0,a1,a2);var _MemoryContextGetParent=Module["_MemoryContextGetParent"]=a0=>(_MemoryContextGetParent=Module["_MemoryContextGetParent"]=wasmExports["MemoryContextGetParent"])(a0);var _DeleteExpandedObject=Module["_DeleteExpandedObject"]=a0=>(_DeleteExpandedObject=Module["_DeleteExpandedObject"]=wasmExports["DeleteExpandedObject"])(a0);var _ExecFindJunkAttributeInTlist=Module["_ExecFindJunkAttributeInTlist"]=(a0,a1)=>(_ExecFindJunkAttributeInTlist=Module["_ExecFindJunkAttributeInTlist"]=wasmExports["ExecFindJunkAttributeInTlist"])(a0,a1);var _standard_ExecutorStart=Module["_standard_ExecutorStart"]=(a0,a1)=>(_standard_ExecutorStart=Module["_standard_ExecutorStart"]=wasmExports["standard_ExecutorStart"])(a0,a1);var _standard_ExecutorRun=Module["_standard_ExecutorRun"]=(a0,a1,a2,a3)=>(_standard_ExecutorRun=Module["_standard_ExecutorRun"]=wasmExports["standard_ExecutorRun"])(a0,a1,a2,a3);var _standard_ExecutorFinish=Module["_standard_ExecutorFinish"]=a0=>(_standard_ExecutorFinish=Module["_standard_ExecutorFinish"]=wasmExports["standard_ExecutorFinish"])(a0);var _standard_ExecutorEnd=Module["_standard_ExecutorEnd"]=a0=>(_standard_ExecutorEnd=Module["_standard_ExecutorEnd"]=wasmExports["standard_ExecutorEnd"])(a0);var _InstrAlloc=Module["_InstrAlloc"]=(a0,a1,a2)=>(_InstrAlloc=Module["_InstrAlloc"]=wasmExports["InstrAlloc"])(a0,a1,a2);var _get_typlenbyval=Module["_get_typlenbyval"]=(a0,a1,a2)=>(_get_typlenbyval=Module["_get_typlenbyval"]=wasmExports["get_typlenbyval"])(a0,a1,a2);var _InputFunctionCall=Module["_InputFunctionCall"]=(a0,a1,a2,a3)=>(_InputFunctionCall=Module["_InputFunctionCall"]=wasmExports["InputFunctionCall"])(a0,a1,a2,a3);var _FreeExprContext=Module["_FreeExprContext"]=(a0,a1)=>(_FreeExprContext=Module["_FreeExprContext"]=wasmExports["FreeExprContext"])(a0,a1);var _ExecOpenScanRelation=Module["_ExecOpenScanRelation"]=(a0,a1,a2)=>(_ExecOpenScanRelation=Module["_ExecOpenScanRelation"]=wasmExports["ExecOpenScanRelation"])(a0,a1,a2);var _bms_intersect=Module["_bms_intersect"]=(a0,a1)=>(_bms_intersect=Module["_bms_intersect"]=wasmExports["bms_intersect"])(a0,a1);var _ExecGetReturningSlot=Module["_ExecGetReturningSlot"]=(a0,a1)=>(_ExecGetReturningSlot=Module["_ExecGetReturningSlot"]=wasmExports["ExecGetReturningSlot"])(a0,a1);var _ExecGetResultRelCheckAsUser=Module["_ExecGetResultRelCheckAsUser"]=(a0,a1)=>(_ExecGetResultRelCheckAsUser=Module["_ExecGetResultRelCheckAsUser"]=wasmExports["ExecGetResultRelCheckAsUser"])(a0,a1);var _get_call_expr_argtype=Module["_get_call_expr_argtype"]=(a0,a1)=>(_get_call_expr_argtype=Module["_get_call_expr_argtype"]=wasmExports["get_call_expr_argtype"])(a0,a1);var _tuplestore_clear=Module["_tuplestore_clear"]=a0=>(_tuplestore_clear=Module["_tuplestore_clear"]=wasmExports["tuplestore_clear"])(a0);var _InstrUpdateTupleCount=Module["_InstrUpdateTupleCount"]=(a0,a1)=>(_InstrUpdateTupleCount=Module["_InstrUpdateTupleCount"]=wasmExports["InstrUpdateTupleCount"])(a0,a1);var _tuplesort_begin_heap=Module["_tuplesort_begin_heap"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_tuplesort_begin_heap=Module["_tuplesort_begin_heap"]=wasmExports["tuplesort_begin_heap"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _tuplesort_gettupleslot=Module["_tuplesort_gettupleslot"]=(a0,a1,a2,a3,a4)=>(_tuplesort_gettupleslot=Module["_tuplesort_gettupleslot"]=wasmExports["tuplesort_gettupleslot"])(a0,a1,a2,a3,a4);var _AddWaitEventToSet=Module["_AddWaitEventToSet"]=(a0,a1,a2,a3,a4)=>(_AddWaitEventToSet=Module["_AddWaitEventToSet"]=wasmExports["AddWaitEventToSet"])(a0,a1,a2,a3,a4);var _GetNumRegisteredWaitEvents=Module["_GetNumRegisteredWaitEvents"]=a0=>(_GetNumRegisteredWaitEvents=Module["_GetNumRegisteredWaitEvents"]=wasmExports["GetNumRegisteredWaitEvents"])(a0);var _get_attstatsslot=Module["_get_attstatsslot"]=(a0,a1,a2,a3,a4)=>(_get_attstatsslot=Module["_get_attstatsslot"]=wasmExports["get_attstatsslot"])(a0,a1,a2,a3,a4);var _free_attstatsslot=Module["_free_attstatsslot"]=a0=>(_free_attstatsslot=Module["_free_attstatsslot"]=wasmExports["free_attstatsslot"])(a0);var _tuplesort_reset=Module["_tuplesort_reset"]=a0=>(_tuplesort_reset=Module["_tuplesort_reset"]=wasmExports["tuplesort_reset"])(a0);var _pairingheap_first=Module["_pairingheap_first"]=a0=>(_pairingheap_first=Module["_pairingheap_first"]=wasmExports["pairingheap_first"])(a0);var _bms_nonempty_difference=Module["_bms_nonempty_difference"]=(a0,a1)=>(_bms_nonempty_difference=Module["_bms_nonempty_difference"]=wasmExports["bms_nonempty_difference"])(a0,a1);var _SPI_connect_ext=Module["_SPI_connect_ext"]=a0=>(_SPI_connect_ext=Module["_SPI_connect_ext"]=wasmExports["SPI_connect_ext"])(a0);var _SPI_commit=Module["_SPI_commit"]=()=>(_SPI_commit=Module["_SPI_commit"]=wasmExports["SPI_commit"])();var _CopyErrorData=Module["_CopyErrorData"]=()=>(_CopyErrorData=Module["_CopyErrorData"]=wasmExports["CopyErrorData"])();var _ReThrowError=Module["_ReThrowError"]=a0=>(_ReThrowError=Module["_ReThrowError"]=wasmExports["ReThrowError"])(a0);var _SPI_commit_and_chain=Module["_SPI_commit_and_chain"]=()=>(_SPI_commit_and_chain=Module["_SPI_commit_and_chain"]=wasmExports["SPI_commit_and_chain"])();var _SPI_rollback=Module["_SPI_rollback"]=()=>(_SPI_rollback=Module["_SPI_rollback"]=wasmExports["SPI_rollback"])();var _SPI_rollback_and_chain=Module["_SPI_rollback_and_chain"]=()=>(_SPI_rollback_and_chain=Module["_SPI_rollback_and_chain"]=wasmExports["SPI_rollback_and_chain"])();var _SPI_freetuptable=Module["_SPI_freetuptable"]=a0=>(_SPI_freetuptable=Module["_SPI_freetuptable"]=wasmExports["SPI_freetuptable"])(a0);var _SPI_execute_extended=Module["_SPI_execute_extended"]=(a0,a1)=>(_SPI_execute_extended=Module["_SPI_execute_extended"]=wasmExports["SPI_execute_extended"])(a0,a1);var _SPI_execute_plan=Module["_SPI_execute_plan"]=(a0,a1,a2,a3,a4)=>(_SPI_execute_plan=Module["_SPI_execute_plan"]=wasmExports["SPI_execute_plan"])(a0,a1,a2,a3,a4);var _SPI_execp=Module["_SPI_execp"]=(a0,a1,a2,a3)=>(_SPI_execp=Module["_SPI_execp"]=wasmExports["SPI_execp"])(a0,a1,a2,a3);var _SPI_execute_plan_extended=Module["_SPI_execute_plan_extended"]=(a0,a1)=>(_SPI_execute_plan_extended=Module["_SPI_execute_plan_extended"]=wasmExports["SPI_execute_plan_extended"])(a0,a1);var _SPI_execute_plan_with_paramlist=Module["_SPI_execute_plan_with_paramlist"]=(a0,a1,a2,a3)=>(_SPI_execute_plan_with_paramlist=Module["_SPI_execute_plan_with_paramlist"]=wasmExports["SPI_execute_plan_with_paramlist"])(a0,a1,a2,a3);var _SPI_prepare=Module["_SPI_prepare"]=(a0,a1,a2)=>(_SPI_prepare=Module["_SPI_prepare"]=wasmExports["SPI_prepare"])(a0,a1,a2);var _SPI_prepare_extended=Module["_SPI_prepare_extended"]=(a0,a1)=>(_SPI_prepare_extended=Module["_SPI_prepare_extended"]=wasmExports["SPI_prepare_extended"])(a0,a1);var _SPI_keepplan=Module["_SPI_keepplan"]=a0=>(_SPI_keepplan=Module["_SPI_keepplan"]=wasmExports["SPI_keepplan"])(a0);var _SPI_freeplan=Module["_SPI_freeplan"]=a0=>(_SPI_freeplan=Module["_SPI_freeplan"]=wasmExports["SPI_freeplan"])(a0);var _SPI_copytuple=Module["_SPI_copytuple"]=a0=>(_SPI_copytuple=Module["_SPI_copytuple"]=wasmExports["SPI_copytuple"])(a0);var _SPI_returntuple=Module["_SPI_returntuple"]=(a0,a1)=>(_SPI_returntuple=Module["_SPI_returntuple"]=wasmExports["SPI_returntuple"])(a0,a1);var _SPI_fnumber=Module["_SPI_fnumber"]=(a0,a1)=>(_SPI_fnumber=Module["_SPI_fnumber"]=wasmExports["SPI_fnumber"])(a0,a1);var _SPI_fname=Module["_SPI_fname"]=(a0,a1)=>(_SPI_fname=Module["_SPI_fname"]=wasmExports["SPI_fname"])(a0,a1);var _SPI_getbinval=Module["_SPI_getbinval"]=(a0,a1,a2,a3)=>(_SPI_getbinval=Module["_SPI_getbinval"]=wasmExports["SPI_getbinval"])(a0,a1,a2,a3);var _SPI_gettype=Module["_SPI_gettype"]=(a0,a1)=>(_SPI_gettype=Module["_SPI_gettype"]=wasmExports["SPI_gettype"])(a0,a1);var _SPI_gettypeid=Module["_SPI_gettypeid"]=(a0,a1)=>(_SPI_gettypeid=Module["_SPI_gettypeid"]=wasmExports["SPI_gettypeid"])(a0,a1);var _SPI_getrelname=Module["_SPI_getrelname"]=a0=>(_SPI_getrelname=Module["_SPI_getrelname"]=wasmExports["SPI_getrelname"])(a0);var _SPI_palloc=Module["_SPI_palloc"]=a0=>(_SPI_palloc=Module["_SPI_palloc"]=wasmExports["SPI_palloc"])(a0);var _SPI_datumTransfer=Module["_SPI_datumTransfer"]=(a0,a1,a2)=>(_SPI_datumTransfer=Module["_SPI_datumTransfer"]=wasmExports["SPI_datumTransfer"])(a0,a1,a2);var _datumTransfer=Module["_datumTransfer"]=(a0,a1,a2)=>(_datumTransfer=Module["_datumTransfer"]=wasmExports["datumTransfer"])(a0,a1,a2);var _SPI_cursor_open_with_paramlist=Module["_SPI_cursor_open_with_paramlist"]=(a0,a1,a2,a3)=>(_SPI_cursor_open_with_paramlist=Module["_SPI_cursor_open_with_paramlist"]=wasmExports["SPI_cursor_open_with_paramlist"])(a0,a1,a2,a3);var _SPI_cursor_parse_open=Module["_SPI_cursor_parse_open"]=(a0,a1,a2)=>(_SPI_cursor_parse_open=Module["_SPI_cursor_parse_open"]=wasmExports["SPI_cursor_parse_open"])(a0,a1,a2);var _SPI_cursor_find=Module["_SPI_cursor_find"]=a0=>(_SPI_cursor_find=Module["_SPI_cursor_find"]=wasmExports["SPI_cursor_find"])(a0);var _SPI_cursor_fetch=Module["_SPI_cursor_fetch"]=(a0,a1,a2)=>(_SPI_cursor_fetch=Module["_SPI_cursor_fetch"]=wasmExports["SPI_cursor_fetch"])(a0,a1,a2);var _SPI_scroll_cursor_fetch=Module["_SPI_scroll_cursor_fetch"]=(a0,a1,a2)=>(_SPI_scroll_cursor_fetch=Module["_SPI_scroll_cursor_fetch"]=wasmExports["SPI_scroll_cursor_fetch"])(a0,a1,a2);var _SPI_scroll_cursor_move=Module["_SPI_scroll_cursor_move"]=(a0,a1,a2)=>(_SPI_scroll_cursor_move=Module["_SPI_scroll_cursor_move"]=wasmExports["SPI_scroll_cursor_move"])(a0,a1,a2);var _SPI_cursor_close=Module["_SPI_cursor_close"]=a0=>(_SPI_cursor_close=Module["_SPI_cursor_close"]=wasmExports["SPI_cursor_close"])(a0);var _SPI_plan_is_valid=Module["_SPI_plan_is_valid"]=a0=>(_SPI_plan_is_valid=Module["_SPI_plan_is_valid"]=wasmExports["SPI_plan_is_valid"])(a0);var _SPI_result_code_string=Module["_SPI_result_code_string"]=a0=>(_SPI_result_code_string=Module["_SPI_result_code_string"]=wasmExports["SPI_result_code_string"])(a0);var _SPI_plan_get_plan_sources=Module["_SPI_plan_get_plan_sources"]=a0=>(_SPI_plan_get_plan_sources=Module["_SPI_plan_get_plan_sources"]=wasmExports["SPI_plan_get_plan_sources"])(a0);var _SPI_plan_get_cached_plan=Module["_SPI_plan_get_cached_plan"]=a0=>(_SPI_plan_get_cached_plan=Module["_SPI_plan_get_cached_plan"]=wasmExports["SPI_plan_get_cached_plan"])(a0);var _SPI_register_relation=Module["_SPI_register_relation"]=a0=>(_SPI_register_relation=Module["_SPI_register_relation"]=wasmExports["SPI_register_relation"])(a0);var _create_queryEnv=Module["_create_queryEnv"]=()=>(_create_queryEnv=Module["_create_queryEnv"]=wasmExports["create_queryEnv"])();var _register_ENR=Module["_register_ENR"]=(a0,a1)=>(_register_ENR=Module["_register_ENR"]=wasmExports["register_ENR"])(a0,a1);var _SPI_register_trigger_data=Module["_SPI_register_trigger_data"]=a0=>(_SPI_register_trigger_data=Module["_SPI_register_trigger_data"]=wasmExports["SPI_register_trigger_data"])(a0);var _tuplestore_tuple_count=Module["_tuplestore_tuple_count"]=a0=>(_tuplestore_tuple_count=Module["_tuplestore_tuple_count"]=wasmExports["tuplestore_tuple_count"])(a0);var _GetUserMapping=Module["_GetUserMapping"]=(a0,a1)=>(_GetUserMapping=Module["_GetUserMapping"]=wasmExports["GetUserMapping"])(a0,a1);var _GetForeignTable=Module["_GetForeignTable"]=a0=>(_GetForeignTable=Module["_GetForeignTable"]=wasmExports["GetForeignTable"])(a0);var _GetForeignColumnOptions=Module["_GetForeignColumnOptions"]=(a0,a1)=>(_GetForeignColumnOptions=Module["_GetForeignColumnOptions"]=wasmExports["GetForeignColumnOptions"])(a0,a1);var _initClosestMatch=Module["_initClosestMatch"]=(a0,a1,a2)=>(_initClosestMatch=Module["_initClosestMatch"]=wasmExports["initClosestMatch"])(a0,a1,a2);var _updateClosestMatch=Module["_updateClosestMatch"]=(a0,a1)=>(_updateClosestMatch=Module["_updateClosestMatch"]=wasmExports["updateClosestMatch"])(a0,a1);var _getClosestMatch=Module["_getClosestMatch"]=a0=>(_getClosestMatch=Module["_getClosestMatch"]=wasmExports["getClosestMatch"])(a0);var _GetExistingLocalJoinPath=Module["_GetExistingLocalJoinPath"]=a0=>(_GetExistingLocalJoinPath=Module["_GetExistingLocalJoinPath"]=wasmExports["GetExistingLocalJoinPath"])(a0);var _bloom_create=Module["_bloom_create"]=(a0,a1,a2)=>(_bloom_create=Module["_bloom_create"]=wasmExports["bloom_create"])(a0,a1,a2);var _bloom_free=Module["_bloom_free"]=a0=>(_bloom_free=Module["_bloom_free"]=wasmExports["bloom_free"])(a0);var _bloom_add_element=Module["_bloom_add_element"]=(a0,a1,a2)=>(_bloom_add_element=Module["_bloom_add_element"]=wasmExports["bloom_add_element"])(a0,a1,a2);var _bloom_lacks_element=Module["_bloom_lacks_element"]=(a0,a1,a2)=>(_bloom_lacks_element=Module["_bloom_lacks_element"]=wasmExports["bloom_lacks_element"])(a0,a1,a2);var _bloom_prop_bits_set=Module["_bloom_prop_bits_set"]=a0=>(_bloom_prop_bits_set=Module["_bloom_prop_bits_set"]=wasmExports["bloom_prop_bits_set"])(a0);var _gai_strerror=Module["_gai_strerror"]=a0=>(_gai_strerror=Module["_gai_strerror"]=wasmExports["gai_strerror"])(a0);var _socket=Module["_socket"]=(a0,a1,a2)=>(_socket=Module["_socket"]=wasmExports["socket"])(a0,a1,a2);var _connect=Module["_connect"]=(a0,a1,a2)=>(_connect=Module["_connect"]=wasmExports["connect"])(a0,a1,a2);var _send=Module["_send"]=(a0,a1,a2,a3)=>(_send=Module["_send"]=wasmExports["send"])(a0,a1,a2,a3);var _recv=Module["_recv"]=(a0,a1,a2,a3)=>(_recv=Module["_recv"]=wasmExports["recv"])(a0,a1,a2,a3);var _be_lo_unlink=Module["_be_lo_unlink"]=a0=>(_be_lo_unlink=Module["_be_lo_unlink"]=wasmExports["be_lo_unlink"])(a0);var _text_to_cstring_buffer=Module["_text_to_cstring_buffer"]=(a0,a1,a2)=>(_text_to_cstring_buffer=Module["_text_to_cstring_buffer"]=wasmExports["text_to_cstring_buffer"])(a0,a1,a2);var _set_read_write_cbs=Module["_set_read_write_cbs"]=(a0,a1)=>(_set_read_write_cbs=Module["_set_read_write_cbs"]=wasmExports["set_read_write_cbs"])(a0,a1);var _setsockopt=Module["_setsockopt"]=(a0,a1,a2,a3,a4)=>(_setsockopt=Module["_setsockopt"]=wasmExports["setsockopt"])(a0,a1,a2,a3,a4);var _getsockopt=Module["_getsockopt"]=(a0,a1,a2,a3,a4)=>(_getsockopt=Module["_getsockopt"]=wasmExports["getsockopt"])(a0,a1,a2,a3,a4);var _getsockname=Module["_getsockname"]=(a0,a1,a2)=>(_getsockname=Module["_getsockname"]=wasmExports["getsockname"])(a0,a1,a2);var _poll=Module["_poll"]=(a0,a1,a2)=>(_poll=Module["_poll"]=wasmExports["poll"])(a0,a1,a2);var _pg_mb2wchar_with_len=Module["_pg_mb2wchar_with_len"]=(a0,a1,a2)=>(_pg_mb2wchar_with_len=Module["_pg_mb2wchar_with_len"]=wasmExports["pg_mb2wchar_with_len"])(a0,a1,a2);var _pg_regcomp=Module["_pg_regcomp"]=(a0,a1,a2,a3,a4)=>(_pg_regcomp=Module["_pg_regcomp"]=wasmExports["pg_regcomp"])(a0,a1,a2,a3,a4);var _pg_regerror=Module["_pg_regerror"]=(a0,a1,a2,a3)=>(_pg_regerror=Module["_pg_regerror"]=wasmExports["pg_regerror"])(a0,a1,a2,a3);var _strcat=Module["_strcat"]=(a0,a1)=>(_strcat=Module["_strcat"]=wasmExports["strcat"])(a0,a1);var _pq_sendtext=Module["_pq_sendtext"]=(a0,a1,a2)=>(_pq_sendtext=Module["_pq_sendtext"]=wasmExports["pq_sendtext"])(a0,a1,a2);var _pq_sendfloat4=Module["_pq_sendfloat4"]=(a0,a1)=>(_pq_sendfloat4=Module["_pq_sendfloat4"]=wasmExports["pq_sendfloat4"])(a0,a1);var _pq_sendfloat8=Module["_pq_sendfloat8"]=(a0,a1)=>(_pq_sendfloat8=Module["_pq_sendfloat8"]=wasmExports["pq_sendfloat8"])(a0,a1);var _pq_begintypsend=Module["_pq_begintypsend"]=a0=>(_pq_begintypsend=Module["_pq_begintypsend"]=wasmExports["pq_begintypsend"])(a0);var _pq_endtypsend=Module["_pq_endtypsend"]=a0=>(_pq_endtypsend=Module["_pq_endtypsend"]=wasmExports["pq_endtypsend"])(a0);var _pq_getmsgfloat4=Module["_pq_getmsgfloat4"]=a0=>(_pq_getmsgfloat4=Module["_pq_getmsgfloat4"]=wasmExports["pq_getmsgfloat4"])(a0);var _pq_getmsgfloat8=Module["_pq_getmsgfloat8"]=a0=>(_pq_getmsgfloat8=Module["_pq_getmsgfloat8"]=wasmExports["pq_getmsgfloat8"])(a0);var _pq_getmsgtext=Module["_pq_getmsgtext"]=(a0,a1,a2)=>(_pq_getmsgtext=Module["_pq_getmsgtext"]=wasmExports["pq_getmsgtext"])(a0,a1,a2);var _pg_strtoint32=Module["_pg_strtoint32"]=a0=>(_pg_strtoint32=Module["_pg_strtoint32"]=wasmExports["pg_strtoint32"])(a0);var _bms_membership=Module["_bms_membership"]=a0=>(_bms_membership=Module["_bms_membership"]=wasmExports["bms_membership"])(a0);var _list_make5_impl=Module["_list_make5_impl"]=(a0,a1,a2,a3,a4,a5)=>(_list_make5_impl=Module["_list_make5_impl"]=wasmExports["list_make5_impl"])(a0,a1,a2,a3,a4,a5);var _list_insert_nth=Module["_list_insert_nth"]=(a0,a1,a2)=>(_list_insert_nth=Module["_list_insert_nth"]=wasmExports["list_insert_nth"])(a0,a1,a2);var _list_member_ptr=Module["_list_member_ptr"]=(a0,a1)=>(_list_member_ptr=Module["_list_member_ptr"]=wasmExports["list_member_ptr"])(a0,a1);var _list_append_unique_ptr=Module["_list_append_unique_ptr"]=(a0,a1)=>(_list_append_unique_ptr=Module["_list_append_unique_ptr"]=wasmExports["list_append_unique_ptr"])(a0,a1);var _make_opclause=Module["_make_opclause"]=(a0,a1,a2,a3,a4,a5,a6)=>(_make_opclause=Module["_make_opclause"]=wasmExports["make_opclause"])(a0,a1,a2,a3,a4,a5,a6);var _exprIsLengthCoercion=Module["_exprIsLengthCoercion"]=(a0,a1)=>(_exprIsLengthCoercion=Module["_exprIsLengthCoercion"]=wasmExports["exprIsLengthCoercion"])(a0,a1);var _fix_opfuncids=Module["_fix_opfuncids"]=a0=>(_fix_opfuncids=Module["_fix_opfuncids"]=wasmExports["fix_opfuncids"])(a0);var _CleanQuerytext=Module["_CleanQuerytext"]=(a0,a1,a2)=>(_CleanQuerytext=Module["_CleanQuerytext"]=wasmExports["CleanQuerytext"])(a0,a1,a2);var _EnableQueryId=Module["_EnableQueryId"]=()=>(_EnableQueryId=Module["_EnableQueryId"]=wasmExports["EnableQueryId"])();var _find_base_rel=Module["_find_base_rel"]=(a0,a1)=>(_find_base_rel=Module["_find_base_rel"]=wasmExports["find_base_rel"])(a0,a1);var _add_path=Module["_add_path"]=(a0,a1)=>(_add_path=Module["_add_path"]=wasmExports["add_path"])(a0,a1);var _pathkeys_contained_in=Module["_pathkeys_contained_in"]=(a0,a1)=>(_pathkeys_contained_in=Module["_pathkeys_contained_in"]=wasmExports["pathkeys_contained_in"])(a0,a1);var _create_sort_path=Module["_create_sort_path"]=(a0,a1,a2,a3,a4)=>(_create_sort_path=Module["_create_sort_path"]=wasmExports["create_sort_path"])(a0,a1,a2,a3,a4);var _set_baserel_size_estimates=Module["_set_baserel_size_estimates"]=(a0,a1)=>(_set_baserel_size_estimates=Module["_set_baserel_size_estimates"]=wasmExports["set_baserel_size_estimates"])(a0,a1);var _clauselist_selectivity=Module["_clauselist_selectivity"]=(a0,a1,a2,a3,a4)=>(_clauselist_selectivity=Module["_clauselist_selectivity"]=wasmExports["clauselist_selectivity"])(a0,a1,a2,a3,a4);var _get_tablespace_page_costs=Module["_get_tablespace_page_costs"]=(a0,a1,a2)=>(_get_tablespace_page_costs=Module["_get_tablespace_page_costs"]=wasmExports["get_tablespace_page_costs"])(a0,a1,a2);var _cost_qual_eval=Module["_cost_qual_eval"]=(a0,a1,a2)=>(_cost_qual_eval=Module["_cost_qual_eval"]=wasmExports["cost_qual_eval"])(a0,a1,a2);var _estimate_num_groups=Module["_estimate_num_groups"]=(a0,a1,a2,a3,a4)=>(_estimate_num_groups=Module["_estimate_num_groups"]=wasmExports["estimate_num_groups"])(a0,a1,a2,a3,a4);var _cost_sort=Module["_cost_sort"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_cost_sort=Module["_cost_sort"]=wasmExports["cost_sort"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _get_sortgrouplist_exprs=Module["_get_sortgrouplist_exprs"]=(a0,a1)=>(_get_sortgrouplist_exprs=Module["_get_sortgrouplist_exprs"]=wasmExports["get_sortgrouplist_exprs"])(a0,a1);var _make_restrictinfo=Module["_make_restrictinfo"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_make_restrictinfo=Module["_make_restrictinfo"]=wasmExports["make_restrictinfo"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _generate_implied_equalities_for_column=Module["_generate_implied_equalities_for_column"]=(a0,a1,a2,a3,a4)=>(_generate_implied_equalities_for_column=Module["_generate_implied_equalities_for_column"]=wasmExports["generate_implied_equalities_for_column"])(a0,a1,a2,a3,a4);var _eclass_useful_for_merging=Module["_eclass_useful_for_merging"]=(a0,a1,a2)=>(_eclass_useful_for_merging=Module["_eclass_useful_for_merging"]=wasmExports["eclass_useful_for_merging"])(a0,a1,a2);var _join_clause_is_movable_to=Module["_join_clause_is_movable_to"]=(a0,a1)=>(_join_clause_is_movable_to=Module["_join_clause_is_movable_to"]=wasmExports["join_clause_is_movable_to"])(a0,a1);var _get_plan_rowmark=Module["_get_plan_rowmark"]=(a0,a1)=>(_get_plan_rowmark=Module["_get_plan_rowmark"]=wasmExports["get_plan_rowmark"])(a0,a1);var _update_mergeclause_eclasses=Module["_update_mergeclause_eclasses"]=(a0,a1)=>(_update_mergeclause_eclasses=Module["_update_mergeclause_eclasses"]=wasmExports["update_mergeclause_eclasses"])(a0,a1);var _find_join_rel=Module["_find_join_rel"]=(a0,a1)=>(_find_join_rel=Module["_find_join_rel"]=wasmExports["find_join_rel"])(a0,a1);var _make_canonical_pathkey=Module["_make_canonical_pathkey"]=(a0,a1,a2,a3,a4)=>(_make_canonical_pathkey=Module["_make_canonical_pathkey"]=wasmExports["make_canonical_pathkey"])(a0,a1,a2,a3,a4);var _get_sortgroupref_clause_noerr=Module["_get_sortgroupref_clause_noerr"]=(a0,a1)=>(_get_sortgroupref_clause_noerr=Module["_get_sortgroupref_clause_noerr"]=wasmExports["get_sortgroupref_clause_noerr"])(a0,a1);var _extract_actual_clauses=Module["_extract_actual_clauses"]=(a0,a1)=>(_extract_actual_clauses=Module["_extract_actual_clauses"]=wasmExports["extract_actual_clauses"])(a0,a1);var _change_plan_targetlist=Module["_change_plan_targetlist"]=(a0,a1,a2)=>(_change_plan_targetlist=Module["_change_plan_targetlist"]=wasmExports["change_plan_targetlist"])(a0,a1,a2);var _make_foreignscan=Module["_make_foreignscan"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_make_foreignscan=Module["_make_foreignscan"]=wasmExports["make_foreignscan"])(a0,a1,a2,a3,a4,a5,a6,a7);var _tlist_member=Module["_tlist_member"]=(a0,a1)=>(_tlist_member=Module["_tlist_member"]=wasmExports["tlist_member"])(a0,a1);var _pull_vars_of_level=Module["_pull_vars_of_level"]=(a0,a1)=>(_pull_vars_of_level=Module["_pull_vars_of_level"]=wasmExports["pull_vars_of_level"])(a0,a1);var _IncrementVarSublevelsUp=Module["_IncrementVarSublevelsUp"]=(a0,a1,a2)=>(_IncrementVarSublevelsUp=Module["_IncrementVarSublevelsUp"]=wasmExports["IncrementVarSublevelsUp"])(a0,a1,a2);var _standard_planner=Module["_standard_planner"]=(a0,a1,a2,a3)=>(_standard_planner=Module["_standard_planner"]=wasmExports["standard_planner"])(a0,a1,a2,a3);var _get_relids_in_jointree=Module["_get_relids_in_jointree"]=(a0,a1,a2)=>(_get_relids_in_jointree=Module["_get_relids_in_jointree"]=wasmExports["get_relids_in_jointree"])(a0,a1,a2);var _add_new_columns_to_pathtarget=Module["_add_new_columns_to_pathtarget"]=(a0,a1)=>(_add_new_columns_to_pathtarget=Module["_add_new_columns_to_pathtarget"]=wasmExports["add_new_columns_to_pathtarget"])(a0,a1);var _get_agg_clause_costs=Module["_get_agg_clause_costs"]=(a0,a1,a2)=>(_get_agg_clause_costs=Module["_get_agg_clause_costs"]=wasmExports["get_agg_clause_costs"])(a0,a1,a2);var _grouping_is_sortable=Module["_grouping_is_sortable"]=a0=>(_grouping_is_sortable=Module["_grouping_is_sortable"]=wasmExports["grouping_is_sortable"])(a0);var _copy_pathtarget=Module["_copy_pathtarget"]=a0=>(_copy_pathtarget=Module["_copy_pathtarget"]=wasmExports["copy_pathtarget"])(a0);var _create_projection_path=Module["_create_projection_path"]=(a0,a1,a2,a3)=>(_create_projection_path=Module["_create_projection_path"]=wasmExports["create_projection_path"])(a0,a1,a2,a3);var _GetSysCacheHashValue=Module["_GetSysCacheHashValue"]=(a0,a1,a2,a3,a4)=>(_GetSysCacheHashValue=Module["_GetSysCacheHashValue"]=wasmExports["GetSysCacheHashValue"])(a0,a1,a2,a3,a4);var _get_translated_update_targetlist=Module["_get_translated_update_targetlist"]=(a0,a1,a2,a3)=>(_get_translated_update_targetlist=Module["_get_translated_update_targetlist"]=wasmExports["get_translated_update_targetlist"])(a0,a1,a2,a3);var _add_row_identity_var=Module["_add_row_identity_var"]=(a0,a1,a2,a3)=>(_add_row_identity_var=Module["_add_row_identity_var"]=wasmExports["add_row_identity_var"])(a0,a1,a2,a3);var _get_rel_all_updated_cols=Module["_get_rel_all_updated_cols"]=(a0,a1)=>(_get_rel_all_updated_cols=Module["_get_rel_all_updated_cols"]=wasmExports["get_rel_all_updated_cols"])(a0,a1);var _get_baserel_parampathinfo=Module["_get_baserel_parampathinfo"]=(a0,a1,a2)=>(_get_baserel_parampathinfo=Module["_get_baserel_parampathinfo"]=wasmExports["get_baserel_parampathinfo"])(a0,a1,a2);var _create_foreignscan_path=Module["_create_foreignscan_path"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_create_foreignscan_path=Module["_create_foreignscan_path"]=wasmExports["create_foreignscan_path"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _create_foreign_join_path=Module["_create_foreign_join_path"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_create_foreign_join_path=Module["_create_foreign_join_path"]=wasmExports["create_foreign_join_path"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _create_foreign_upper_path=Module["_create_foreign_upper_path"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_create_foreign_upper_path=Module["_create_foreign_upper_path"]=wasmExports["create_foreign_upper_path"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _adjust_limit_rows_costs=Module["_adjust_limit_rows_costs"]=(a0,a1,a2,a3,a4)=>(_adjust_limit_rows_costs=Module["_adjust_limit_rows_costs"]=wasmExports["adjust_limit_rows_costs"])(a0,a1,a2,a3,a4);var _add_to_flat_tlist=Module["_add_to_flat_tlist"]=(a0,a1)=>(_add_to_flat_tlist=Module["_add_to_flat_tlist"]=wasmExports["add_to_flat_tlist"])(a0,a1);var _get_fn_expr_argtype=Module["_get_fn_expr_argtype"]=(a0,a1)=>(_get_fn_expr_argtype=Module["_get_fn_expr_argtype"]=wasmExports["get_fn_expr_argtype"])(a0,a1);var _on_shmem_exit=Module["_on_shmem_exit"]=(a0,a1)=>(_on_shmem_exit=Module["_on_shmem_exit"]=wasmExports["on_shmem_exit"])(a0,a1);var _SignalHandlerForConfigReload=Module["_SignalHandlerForConfigReload"]=a0=>(_SignalHandlerForConfigReload=Module["_SignalHandlerForConfigReload"]=wasmExports["SignalHandlerForConfigReload"])(a0);var _SignalHandlerForShutdownRequest=Module["_SignalHandlerForShutdownRequest"]=a0=>(_SignalHandlerForShutdownRequest=Module["_SignalHandlerForShutdownRequest"]=wasmExports["SignalHandlerForShutdownRequest"])(a0);var _procsignal_sigusr1_handler=Module["_procsignal_sigusr1_handler"]=a0=>(_procsignal_sigusr1_handler=Module["_procsignal_sigusr1_handler"]=wasmExports["procsignal_sigusr1_handler"])(a0);var _RegisterBackgroundWorker=Module["_RegisterBackgroundWorker"]=a0=>(_RegisterBackgroundWorker=Module["_RegisterBackgroundWorker"]=wasmExports["RegisterBackgroundWorker"])(a0);var _WaitForBackgroundWorkerStartup=Module["_WaitForBackgroundWorkerStartup"]=(a0,a1)=>(_WaitForBackgroundWorkerStartup=Module["_WaitForBackgroundWorkerStartup"]=wasmExports["WaitForBackgroundWorkerStartup"])(a0,a1);var _GetConfigOption=Module["_GetConfigOption"]=(a0,a1,a2)=>(_GetConfigOption=Module["_GetConfigOption"]=wasmExports["GetConfigOption"])(a0,a1,a2);var _toupper=Module["_toupper"]=a0=>(_toupper=Module["_toupper"]=wasmExports["toupper"])(a0);var _pg_reg_getinitialstate=Module["_pg_reg_getinitialstate"]=a0=>(_pg_reg_getinitialstate=Module["_pg_reg_getinitialstate"]=wasmExports["pg_reg_getinitialstate"])(a0);var _pg_reg_getfinalstate=Module["_pg_reg_getfinalstate"]=a0=>(_pg_reg_getfinalstate=Module["_pg_reg_getfinalstate"]=wasmExports["pg_reg_getfinalstate"])(a0);var _pg_reg_getnumoutarcs=Module["_pg_reg_getnumoutarcs"]=(a0,a1)=>(_pg_reg_getnumoutarcs=Module["_pg_reg_getnumoutarcs"]=wasmExports["pg_reg_getnumoutarcs"])(a0,a1);var _pg_reg_getoutarcs=Module["_pg_reg_getoutarcs"]=(a0,a1,a2,a3)=>(_pg_reg_getoutarcs=Module["_pg_reg_getoutarcs"]=wasmExports["pg_reg_getoutarcs"])(a0,a1,a2,a3);var _pg_reg_getnumcolors=Module["_pg_reg_getnumcolors"]=a0=>(_pg_reg_getnumcolors=Module["_pg_reg_getnumcolors"]=wasmExports["pg_reg_getnumcolors"])(a0);var _pg_reg_colorisbegin=Module["_pg_reg_colorisbegin"]=(a0,a1)=>(_pg_reg_colorisbegin=Module["_pg_reg_colorisbegin"]=wasmExports["pg_reg_colorisbegin"])(a0,a1);var _pg_reg_colorisend=Module["_pg_reg_colorisend"]=(a0,a1)=>(_pg_reg_colorisend=Module["_pg_reg_colorisend"]=wasmExports["pg_reg_colorisend"])(a0,a1);var _pg_reg_getnumcharacters=Module["_pg_reg_getnumcharacters"]=(a0,a1)=>(_pg_reg_getnumcharacters=Module["_pg_reg_getnumcharacters"]=wasmExports["pg_reg_getnumcharacters"])(a0,a1);var _pg_reg_getcharacters=Module["_pg_reg_getcharacters"]=(a0,a1,a2,a3)=>(_pg_reg_getcharacters=Module["_pg_reg_getcharacters"]=wasmExports["pg_reg_getcharacters"])(a0,a1,a2,a3);var _OutputPluginPrepareWrite=Module["_OutputPluginPrepareWrite"]=(a0,a1)=>(_OutputPluginPrepareWrite=Module["_OutputPluginPrepareWrite"]=wasmExports["OutputPluginPrepareWrite"])(a0,a1);var _OutputPluginWrite=Module["_OutputPluginWrite"]=(a0,a1)=>(_OutputPluginWrite=Module["_OutputPluginWrite"]=wasmExports["OutputPluginWrite"])(a0,a1);var _array_contains_nulls=Module["_array_contains_nulls"]=a0=>(_array_contains_nulls=Module["_array_contains_nulls"]=wasmExports["array_contains_nulls"])(a0);var _hash_seq_term=Module["_hash_seq_term"]=a0=>(_hash_seq_term=Module["_hash_seq_term"]=wasmExports["hash_seq_term"])(a0);var _FreeErrorData=Module["_FreeErrorData"]=a0=>(_FreeErrorData=Module["_FreeErrorData"]=wasmExports["FreeErrorData"])(a0);var _RelidByRelfilenumber=Module["_RelidByRelfilenumber"]=(a0,a1)=>(_RelidByRelfilenumber=Module["_RelidByRelfilenumber"]=wasmExports["RelidByRelfilenumber"])(a0,a1);var _WaitLatchOrSocket=Module["_WaitLatchOrSocket"]=(a0,a1,a2,a3,a4)=>(_WaitLatchOrSocket=Module["_WaitLatchOrSocket"]=wasmExports["WaitLatchOrSocket"])(a0,a1,a2,a3,a4);var _get_row_security_policies=Module["_get_row_security_policies"]=(a0,a1,a2,a3,a4,a5,a6)=>(_get_row_security_policies=Module["_get_row_security_policies"]=wasmExports["get_row_security_policies"])(a0,a1,a2,a3,a4,a5,a6);var _hash_estimate_size=Module["_hash_estimate_size"]=(a0,a1)=>(_hash_estimate_size=Module["_hash_estimate_size"]=wasmExports["hash_estimate_size"])(a0,a1);var _ShmemInitHash=Module["_ShmemInitHash"]=(a0,a1,a2,a3,a4)=>(_ShmemInitHash=Module["_ShmemInitHash"]=wasmExports["ShmemInitHash"])(a0,a1,a2,a3,a4);var _LockBufHdr=Module["_LockBufHdr"]=a0=>(_LockBufHdr=Module["_LockBufHdr"]=wasmExports["LockBufHdr"])(a0);var _EvictUnpinnedBuffer=Module["_EvictUnpinnedBuffer"]=a0=>(_EvictUnpinnedBuffer=Module["_EvictUnpinnedBuffer"]=wasmExports["EvictUnpinnedBuffer"])(a0);var _have_free_buffer=Module["_have_free_buffer"]=()=>(_have_free_buffer=Module["_have_free_buffer"]=wasmExports["have_free_buffer"])();var _copy_file=Module["_copy_file"]=(a0,a1)=>(_copy_file=Module["_copy_file"]=wasmExports["copy_file"])(a0,a1);var _AcquireExternalFD=Module["_AcquireExternalFD"]=()=>(_AcquireExternalFD=Module["_AcquireExternalFD"]=wasmExports["AcquireExternalFD"])();var _GetNamedDSMSegment=Module["_GetNamedDSMSegment"]=(a0,a1,a2,a3)=>(_GetNamedDSMSegment=Module["_GetNamedDSMSegment"]=wasmExports["GetNamedDSMSegment"])(a0,a1,a2,a3);var _RequestAddinShmemSpace=Module["_RequestAddinShmemSpace"]=a0=>(_RequestAddinShmemSpace=Module["_RequestAddinShmemSpace"]=wasmExports["RequestAddinShmemSpace"])(a0);var _GetRunningTransactionData=Module["_GetRunningTransactionData"]=()=>(_GetRunningTransactionData=Module["_GetRunningTransactionData"]=wasmExports["GetRunningTransactionData"])();var _BackendXidGetPid=Module["_BackendXidGetPid"]=a0=>(_BackendXidGetPid=Module["_BackendXidGetPid"]=wasmExports["BackendXidGetPid"])(a0);var _LWLockRegisterTranche=Module["_LWLockRegisterTranche"]=(a0,a1)=>(_LWLockRegisterTranche=Module["_LWLockRegisterTranche"]=wasmExports["LWLockRegisterTranche"])(a0,a1);var _GetNamedLWLockTranche=Module["_GetNamedLWLockTranche"]=a0=>(_GetNamedLWLockTranche=Module["_GetNamedLWLockTranche"]=wasmExports["GetNamedLWLockTranche"])(a0);var _LWLockNewTrancheId=Module["_LWLockNewTrancheId"]=()=>(_LWLockNewTrancheId=Module["_LWLockNewTrancheId"]=wasmExports["LWLockNewTrancheId"])();var _RequestNamedLWLockTranche=Module["_RequestNamedLWLockTranche"]=(a0,a1)=>(_RequestNamedLWLockTranche=Module["_RequestNamedLWLockTranche"]=wasmExports["RequestNamedLWLockTranche"])(a0,a1);var _standard_ProcessUtility=Module["_standard_ProcessUtility"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_standard_ProcessUtility=Module["_standard_ProcessUtility"]=wasmExports["standard_ProcessUtility"])(a0,a1,a2,a3,a4,a5,a6,a7);var _lookup_ts_dictionary_cache=Module["_lookup_ts_dictionary_cache"]=a0=>(_lookup_ts_dictionary_cache=Module["_lookup_ts_dictionary_cache"]=wasmExports["lookup_ts_dictionary_cache"])(a0);var _get_tsearch_config_filename=Module["_get_tsearch_config_filename"]=(a0,a1)=>(_get_tsearch_config_filename=Module["_get_tsearch_config_filename"]=wasmExports["get_tsearch_config_filename"])(a0,a1);var _lowerstr=Module["_lowerstr"]=a0=>(_lowerstr=Module["_lowerstr"]=wasmExports["lowerstr"])(a0);var _readstoplist=Module["_readstoplist"]=(a0,a1,a2)=>(_readstoplist=Module["_readstoplist"]=wasmExports["readstoplist"])(a0,a1,a2);var _lowerstr_with_len=Module["_lowerstr_with_len"]=(a0,a1)=>(_lowerstr_with_len=Module["_lowerstr_with_len"]=wasmExports["lowerstr_with_len"])(a0,a1);var _searchstoplist=Module["_searchstoplist"]=(a0,a1)=>(_searchstoplist=Module["_searchstoplist"]=wasmExports["searchstoplist"])(a0,a1);var _tsearch_readline_begin=Module["_tsearch_readline_begin"]=(a0,a1)=>(_tsearch_readline_begin=Module["_tsearch_readline_begin"]=wasmExports["tsearch_readline_begin"])(a0,a1);var _tsearch_readline=Module["_tsearch_readline"]=a0=>(_tsearch_readline=Module["_tsearch_readline"]=wasmExports["tsearch_readline"])(a0);var _t_isspace=Module["_t_isspace"]=a0=>(_t_isspace=Module["_t_isspace"]=wasmExports["t_isspace"])(a0);var _tsearch_readline_end=Module["_tsearch_readline_end"]=a0=>(_tsearch_readline_end=Module["_tsearch_readline_end"]=wasmExports["tsearch_readline_end"])(a0);var _stringToQualifiedNameList=Module["_stringToQualifiedNameList"]=(a0,a1)=>(_stringToQualifiedNameList=Module["_stringToQualifiedNameList"]=wasmExports["stringToQualifiedNameList"])(a0,a1);var _t_isdigit=Module["_t_isdigit"]=a0=>(_t_isdigit=Module["_t_isdigit"]=wasmExports["t_isdigit"])(a0);var _t_isalnum=Module["_t_isalnum"]=a0=>(_t_isalnum=Module["_t_isalnum"]=wasmExports["t_isalnum"])(a0);var _get_restriction_variable=Module["_get_restriction_variable"]=(a0,a1,a2,a3,a4,a5)=>(_get_restriction_variable=Module["_get_restriction_variable"]=wasmExports["get_restriction_variable"])(a0,a1,a2,a3,a4,a5);var _MemoryContextAllocHuge=Module["_MemoryContextAllocHuge"]=(a0,a1)=>(_MemoryContextAllocHuge=Module["_MemoryContextAllocHuge"]=wasmExports["MemoryContextAllocHuge"])(a0,a1);var _WaitEventExtensionNew=Module["_WaitEventExtensionNew"]=a0=>(_WaitEventExtensionNew=Module["_WaitEventExtensionNew"]=wasmExports["WaitEventExtensionNew"])(a0);var _expand_array=Module["_expand_array"]=(a0,a1,a2)=>(_expand_array=Module["_expand_array"]=wasmExports["expand_array"])(a0,a1,a2);var _arraycontsel=Module["_arraycontsel"]=a0=>(_arraycontsel=Module["_arraycontsel"]=wasmExports["arraycontsel"])(a0);var _arraycontjoinsel=Module["_arraycontjoinsel"]=a0=>(_arraycontjoinsel=Module["_arraycontjoinsel"]=wasmExports["arraycontjoinsel"])(a0);var _initArrayResult=Module["_initArrayResult"]=(a0,a1,a2)=>(_initArrayResult=Module["_initArrayResult"]=wasmExports["initArrayResult"])(a0,a1,a2);var _array_create_iterator=Module["_array_create_iterator"]=(a0,a1,a2)=>(_array_create_iterator=Module["_array_create_iterator"]=wasmExports["array_create_iterator"])(a0,a1,a2);var _array_iterate=Module["_array_iterate"]=(a0,a1,a2)=>(_array_iterate=Module["_array_iterate"]=wasmExports["array_iterate"])(a0,a1,a2);var _ArrayGetIntegerTypmods=Module["_ArrayGetIntegerTypmods"]=(a0,a1)=>(_ArrayGetIntegerTypmods=Module["_ArrayGetIntegerTypmods"]=wasmExports["ArrayGetIntegerTypmods"])(a0,a1);var _boolin=Module["_boolin"]=a0=>(_boolin=Module["_boolin"]=wasmExports["boolin"])(a0);var _cash_cmp=Module["_cash_cmp"]=a0=>(_cash_cmp=Module["_cash_cmp"]=wasmExports["cash_cmp"])(a0);var _int64_to_numeric=Module["_int64_to_numeric"]=a0=>(_int64_to_numeric=Module["_int64_to_numeric"]=wasmExports["int64_to_numeric"])(a0);var _numeric_div=Module["_numeric_div"]=a0=>(_numeric_div=Module["_numeric_div"]=wasmExports["numeric_div"])(a0);var _date_eq=Module["_date_eq"]=a0=>(_date_eq=Module["_date_eq"]=wasmExports["date_eq"])(a0);var _date_lt=Module["_date_lt"]=a0=>(_date_lt=Module["_date_lt"]=wasmExports["date_lt"])(a0);var _date_le=Module["_date_le"]=a0=>(_date_le=Module["_date_le"]=wasmExports["date_le"])(a0);var _date_gt=Module["_date_gt"]=a0=>(_date_gt=Module["_date_gt"]=wasmExports["date_gt"])(a0);var _date_ge=Module["_date_ge"]=a0=>(_date_ge=Module["_date_ge"]=wasmExports["date_ge"])(a0);var _date_cmp=Module["_date_cmp"]=a0=>(_date_cmp=Module["_date_cmp"]=wasmExports["date_cmp"])(a0);var _date_mi=Module["_date_mi"]=a0=>(_date_mi=Module["_date_mi"]=wasmExports["date_mi"])(a0);var _time_eq=Module["_time_eq"]=a0=>(_time_eq=Module["_time_eq"]=wasmExports["time_eq"])(a0);var _time_lt=Module["_time_lt"]=a0=>(_time_lt=Module["_time_lt"]=wasmExports["time_lt"])(a0);var _time_le=Module["_time_le"]=a0=>(_time_le=Module["_time_le"]=wasmExports["time_le"])(a0);var _time_gt=Module["_time_gt"]=a0=>(_time_gt=Module["_time_gt"]=wasmExports["time_gt"])(a0);var _time_ge=Module["_time_ge"]=a0=>(_time_ge=Module["_time_ge"]=wasmExports["time_ge"])(a0);var _time_cmp=Module["_time_cmp"]=a0=>(_time_cmp=Module["_time_cmp"]=wasmExports["time_cmp"])(a0);var _time_mi_time=Module["_time_mi_time"]=a0=>(_time_mi_time=Module["_time_mi_time"]=wasmExports["time_mi_time"])(a0);var _timetz_cmp=Module["_timetz_cmp"]=a0=>(_timetz_cmp=Module["_timetz_cmp"]=wasmExports["timetz_cmp"])(a0);var _TransferExpandedObject=Module["_TransferExpandedObject"]=(a0,a1)=>(_TransferExpandedObject=Module["_TransferExpandedObject"]=wasmExports["TransferExpandedObject"])(a0,a1);var _numeric_lt=Module["_numeric_lt"]=a0=>(_numeric_lt=Module["_numeric_lt"]=wasmExports["numeric_lt"])(a0);var _numeric_ge=Module["_numeric_ge"]=a0=>(_numeric_ge=Module["_numeric_ge"]=wasmExports["numeric_ge"])(a0);var _err_generic_string=Module["_err_generic_string"]=(a0,a1)=>(_err_generic_string=Module["_err_generic_string"]=wasmExports["err_generic_string"])(a0,a1);var _domain_check=Module["_domain_check"]=(a0,a1,a2,a3,a4)=>(_domain_check=Module["_domain_check"]=wasmExports["domain_check"])(a0,a1,a2,a3,a4);var _enum_lt=Module["_enum_lt"]=a0=>(_enum_lt=Module["_enum_lt"]=wasmExports["enum_lt"])(a0);var _enum_le=Module["_enum_le"]=a0=>(_enum_le=Module["_enum_le"]=wasmExports["enum_le"])(a0);var _enum_ge=Module["_enum_ge"]=a0=>(_enum_ge=Module["_enum_ge"]=wasmExports["enum_ge"])(a0);var _enum_gt=Module["_enum_gt"]=a0=>(_enum_gt=Module["_enum_gt"]=wasmExports["enum_gt"])(a0);var _enum_cmp=Module["_enum_cmp"]=a0=>(_enum_cmp=Module["_enum_cmp"]=wasmExports["enum_cmp"])(a0);var _make_expanded_record_from_typeid=Module["_make_expanded_record_from_typeid"]=(a0,a1,a2)=>(_make_expanded_record_from_typeid=Module["_make_expanded_record_from_typeid"]=wasmExports["make_expanded_record_from_typeid"])(a0,a1,a2);var _make_expanded_record_from_tupdesc=Module["_make_expanded_record_from_tupdesc"]=(a0,a1)=>(_make_expanded_record_from_tupdesc=Module["_make_expanded_record_from_tupdesc"]=wasmExports["make_expanded_record_from_tupdesc"])(a0,a1);var _make_expanded_record_from_exprecord=Module["_make_expanded_record_from_exprecord"]=(a0,a1)=>(_make_expanded_record_from_exprecord=Module["_make_expanded_record_from_exprecord"]=wasmExports["make_expanded_record_from_exprecord"])(a0,a1);var _expanded_record_set_tuple=Module["_expanded_record_set_tuple"]=(a0,a1,a2,a3)=>(_expanded_record_set_tuple=Module["_expanded_record_set_tuple"]=wasmExports["expanded_record_set_tuple"])(a0,a1,a2,a3);var _expanded_record_get_tuple=Module["_expanded_record_get_tuple"]=a0=>(_expanded_record_get_tuple=Module["_expanded_record_get_tuple"]=wasmExports["expanded_record_get_tuple"])(a0);var _deconstruct_expanded_record=Module["_deconstruct_expanded_record"]=a0=>(_deconstruct_expanded_record=Module["_deconstruct_expanded_record"]=wasmExports["deconstruct_expanded_record"])(a0);var _expanded_record_lookup_field=Module["_expanded_record_lookup_field"]=(a0,a1,a2)=>(_expanded_record_lookup_field=Module["_expanded_record_lookup_field"]=wasmExports["expanded_record_lookup_field"])(a0,a1,a2);var _expanded_record_set_field_internal=Module["_expanded_record_set_field_internal"]=(a0,a1,a2,a3,a4,a5)=>(_expanded_record_set_field_internal=Module["_expanded_record_set_field_internal"]=wasmExports["expanded_record_set_field_internal"])(a0,a1,a2,a3,a4,a5);var _expanded_record_set_fields=Module["_expanded_record_set_fields"]=(a0,a1,a2,a3)=>(_expanded_record_set_fields=Module["_expanded_record_set_fields"]=wasmExports["expanded_record_set_fields"])(a0,a1,a2,a3);var _float4in_internal=Module["_float4in_internal"]=(a0,a1,a2,a3,a4)=>(_float4in_internal=Module["_float4in_internal"]=wasmExports["float4in_internal"])(a0,a1,a2,a3,a4);var _strtof=Module["_strtof"]=(a0,a1)=>(_strtof=Module["_strtof"]=wasmExports["strtof"])(a0,a1);var _float8in_internal=Module["_float8in_internal"]=(a0,a1,a2,a3,a4)=>(_float8in_internal=Module["_float8in_internal"]=wasmExports["float8in_internal"])(a0,a1,a2,a3,a4);var _float8out_internal=Module["_float8out_internal"]=a0=>(_float8out_internal=Module["_float8out_internal"]=wasmExports["float8out_internal"])(a0);var _btfloat4cmp=Module["_btfloat4cmp"]=a0=>(_btfloat4cmp=Module["_btfloat4cmp"]=wasmExports["btfloat4cmp"])(a0);var _btfloat8cmp=Module["_btfloat8cmp"]=a0=>(_btfloat8cmp=Module["_btfloat8cmp"]=wasmExports["btfloat8cmp"])(a0);var _acos=Module["_acos"]=a0=>(_acos=Module["_acos"]=wasmExports["acos"])(a0);var _asin=Module["_asin"]=a0=>(_asin=Module["_asin"]=wasmExports["asin"])(a0);var _cos=Module["_cos"]=a0=>(_cos=Module["_cos"]=wasmExports["cos"])(a0);var _str_tolower=Module["_str_tolower"]=(a0,a1,a2)=>(_str_tolower=Module["_str_tolower"]=wasmExports["str_tolower"])(a0,a1,a2);var _pushJsonbValue=Module["_pushJsonbValue"]=(a0,a1,a2)=>(_pushJsonbValue=Module["_pushJsonbValue"]=wasmExports["pushJsonbValue"])(a0,a1,a2);var _numeric_float4=Module["_numeric_float4"]=a0=>(_numeric_float4=Module["_numeric_float4"]=wasmExports["numeric_float4"])(a0);var _numeric_cmp=Module["_numeric_cmp"]=a0=>(_numeric_cmp=Module["_numeric_cmp"]=wasmExports["numeric_cmp"])(a0);var _numeric_eq=Module["_numeric_eq"]=a0=>(_numeric_eq=Module["_numeric_eq"]=wasmExports["numeric_eq"])(a0);var _numeric_is_nan=Module["_numeric_is_nan"]=a0=>(_numeric_is_nan=Module["_numeric_is_nan"]=wasmExports["numeric_is_nan"])(a0);var _timestamp_cmp=Module["_timestamp_cmp"]=a0=>(_timestamp_cmp=Module["_timestamp_cmp"]=wasmExports["timestamp_cmp"])(a0);var _macaddr_cmp=Module["_macaddr_cmp"]=a0=>(_macaddr_cmp=Module["_macaddr_cmp"]=wasmExports["macaddr_cmp"])(a0);var _macaddr_lt=Module["_macaddr_lt"]=a0=>(_macaddr_lt=Module["_macaddr_lt"]=wasmExports["macaddr_lt"])(a0);var _macaddr_le=Module["_macaddr_le"]=a0=>(_macaddr_le=Module["_macaddr_le"]=wasmExports["macaddr_le"])(a0);var _macaddr_eq=Module["_macaddr_eq"]=a0=>(_macaddr_eq=Module["_macaddr_eq"]=wasmExports["macaddr_eq"])(a0);var _macaddr_ge=Module["_macaddr_ge"]=a0=>(_macaddr_ge=Module["_macaddr_ge"]=wasmExports["macaddr_ge"])(a0);var _macaddr_gt=Module["_macaddr_gt"]=a0=>(_macaddr_gt=Module["_macaddr_gt"]=wasmExports["macaddr_gt"])(a0);var _macaddr8_cmp=Module["_macaddr8_cmp"]=a0=>(_macaddr8_cmp=Module["_macaddr8_cmp"]=wasmExports["macaddr8_cmp"])(a0);var _macaddr8_lt=Module["_macaddr8_lt"]=a0=>(_macaddr8_lt=Module["_macaddr8_lt"]=wasmExports["macaddr8_lt"])(a0);var _macaddr8_le=Module["_macaddr8_le"]=a0=>(_macaddr8_le=Module["_macaddr8_le"]=wasmExports["macaddr8_le"])(a0);var _macaddr8_eq=Module["_macaddr8_eq"]=a0=>(_macaddr8_eq=Module["_macaddr8_eq"]=wasmExports["macaddr8_eq"])(a0);var _macaddr8_ge=Module["_macaddr8_ge"]=a0=>(_macaddr8_ge=Module["_macaddr8_ge"]=wasmExports["macaddr8_ge"])(a0);var _macaddr8_gt=Module["_macaddr8_gt"]=a0=>(_macaddr8_gt=Module["_macaddr8_gt"]=wasmExports["macaddr8_gt"])(a0);var _current_query=Module["_current_query"]=a0=>(_current_query=Module["_current_query"]=wasmExports["current_query"])(a0);var _unpack_sql_state=Module["_unpack_sql_state"]=a0=>(_unpack_sql_state=Module["_unpack_sql_state"]=wasmExports["unpack_sql_state"])(a0);var _get_fn_expr_rettype=Module["_get_fn_expr_rettype"]=a0=>(_get_fn_expr_rettype=Module["_get_fn_expr_rettype"]=wasmExports["get_fn_expr_rettype"])(a0);var _btnamecmp=Module["_btnamecmp"]=a0=>(_btnamecmp=Module["_btnamecmp"]=wasmExports["btnamecmp"])(a0);var _inet_in=Module["_inet_in"]=a0=>(_inet_in=Module["_inet_in"]=wasmExports["inet_in"])(a0);var _network_cmp=Module["_network_cmp"]=a0=>(_network_cmp=Module["_network_cmp"]=wasmExports["network_cmp"])(a0);var _convert_network_to_scalar=Module["_convert_network_to_scalar"]=(a0,a1,a2)=>(_convert_network_to_scalar=Module["_convert_network_to_scalar"]=wasmExports["convert_network_to_scalar"])(a0,a1,a2);var _numeric_gt=Module["_numeric_gt"]=a0=>(_numeric_gt=Module["_numeric_gt"]=wasmExports["numeric_gt"])(a0);var _numeric_le=Module["_numeric_le"]=a0=>(_numeric_le=Module["_numeric_le"]=wasmExports["numeric_le"])(a0);var _numeric_float8_no_overflow=Module["_numeric_float8_no_overflow"]=a0=>(_numeric_float8_no_overflow=Module["_numeric_float8_no_overflow"]=wasmExports["numeric_float8_no_overflow"])(a0);var _oidout=Module["_oidout"]=a0=>(_oidout=Module["_oidout"]=wasmExports["oidout"])(a0);var _interval_mi=Module["_interval_mi"]=a0=>(_interval_mi=Module["_interval_mi"]=wasmExports["interval_mi"])(a0);var _quote_ident=Module["_quote_ident"]=a0=>(_quote_ident=Module["_quote_ident"]=wasmExports["quote_ident"])(a0);var _pg_wchar2mb_with_len=Module["_pg_wchar2mb_with_len"]=(a0,a1,a2)=>(_pg_wchar2mb_with_len=Module["_pg_wchar2mb_with_len"]=wasmExports["pg_wchar2mb_with_len"])(a0,a1,a2);var _pg_get_indexdef_columns_extended=Module["_pg_get_indexdef_columns_extended"]=(a0,a1)=>(_pg_get_indexdef_columns_extended=Module["_pg_get_indexdef_columns_extended"]=wasmExports["pg_get_indexdef_columns_extended"])(a0,a1);var _pg_get_querydef=Module["_pg_get_querydef"]=(a0,a1)=>(_pg_get_querydef=Module["_pg_get_querydef"]=wasmExports["pg_get_querydef"])(a0,a1);var _strcspn=Module["_strcspn"]=(a0,a1)=>(_strcspn=Module["_strcspn"]=wasmExports["strcspn"])(a0,a1);var _generic_restriction_selectivity=Module["_generic_restriction_selectivity"]=(a0,a1,a2,a3,a4,a5)=>(_generic_restriction_selectivity=Module["_generic_restriction_selectivity"]=wasmExports["generic_restriction_selectivity"])(a0,a1,a2,a3,a4,a5);var _genericcostestimate=Module["_genericcostestimate"]=(a0,a1,a2,a3)=>(_genericcostestimate=Module["_genericcostestimate"]=wasmExports["genericcostestimate"])(a0,a1,a2,a3);var _tidin=Module["_tidin"]=a0=>(_tidin=Module["_tidin"]=wasmExports["tidin"])(a0);var _tidout=Module["_tidout"]=a0=>(_tidout=Module["_tidout"]=wasmExports["tidout"])(a0);var _timestamp_in=Module["_timestamp_in"]=a0=>(_timestamp_in=Module["_timestamp_in"]=wasmExports["timestamp_in"])(a0);var _timestamp_eq=Module["_timestamp_eq"]=a0=>(_timestamp_eq=Module["_timestamp_eq"]=wasmExports["timestamp_eq"])(a0);var _timestamp_lt=Module["_timestamp_lt"]=a0=>(_timestamp_lt=Module["_timestamp_lt"]=wasmExports["timestamp_lt"])(a0);var _timestamp_gt=Module["_timestamp_gt"]=a0=>(_timestamp_gt=Module["_timestamp_gt"]=wasmExports["timestamp_gt"])(a0);var _timestamp_le=Module["_timestamp_le"]=a0=>(_timestamp_le=Module["_timestamp_le"]=wasmExports["timestamp_le"])(a0);var _timestamp_ge=Module["_timestamp_ge"]=a0=>(_timestamp_ge=Module["_timestamp_ge"]=wasmExports["timestamp_ge"])(a0);var _interval_eq=Module["_interval_eq"]=a0=>(_interval_eq=Module["_interval_eq"]=wasmExports["interval_eq"])(a0);var _interval_lt=Module["_interval_lt"]=a0=>(_interval_lt=Module["_interval_lt"]=wasmExports["interval_lt"])(a0);var _interval_gt=Module["_interval_gt"]=a0=>(_interval_gt=Module["_interval_gt"]=wasmExports["interval_gt"])(a0);var _interval_le=Module["_interval_le"]=a0=>(_interval_le=Module["_interval_le"]=wasmExports["interval_le"])(a0);var _interval_ge=Module["_interval_ge"]=a0=>(_interval_ge=Module["_interval_ge"]=wasmExports["interval_ge"])(a0);var _interval_cmp=Module["_interval_cmp"]=a0=>(_interval_cmp=Module["_interval_cmp"]=wasmExports["interval_cmp"])(a0);var _timestamp_mi=Module["_timestamp_mi"]=a0=>(_timestamp_mi=Module["_timestamp_mi"]=wasmExports["timestamp_mi"])(a0);var _interval_um=Module["_interval_um"]=a0=>(_interval_um=Module["_interval_um"]=wasmExports["interval_um"])(a0);var _has_fn_opclass_options=Module["_has_fn_opclass_options"]=a0=>(_has_fn_opclass_options=Module["_has_fn_opclass_options"]=wasmExports["has_fn_opclass_options"])(a0);var _uuid_in=Module["_uuid_in"]=a0=>(_uuid_in=Module["_uuid_in"]=wasmExports["uuid_in"])(a0);var _uuid_out=Module["_uuid_out"]=a0=>(_uuid_out=Module["_uuid_out"]=wasmExports["uuid_out"])(a0);var _uuid_cmp=Module["_uuid_cmp"]=a0=>(_uuid_cmp=Module["_uuid_cmp"]=wasmExports["uuid_cmp"])(a0);var _gen_random_uuid=Module["_gen_random_uuid"]=a0=>(_gen_random_uuid=Module["_gen_random_uuid"]=wasmExports["gen_random_uuid"])(a0);var _varbit_in=Module["_varbit_in"]=a0=>(_varbit_in=Module["_varbit_in"]=wasmExports["varbit_in"])(a0);var _biteq=Module["_biteq"]=a0=>(_biteq=Module["_biteq"]=wasmExports["biteq"])(a0);var _bitlt=Module["_bitlt"]=a0=>(_bitlt=Module["_bitlt"]=wasmExports["bitlt"])(a0);var _bitle=Module["_bitle"]=a0=>(_bitle=Module["_bitle"]=wasmExports["bitle"])(a0);var _bitgt=Module["_bitgt"]=a0=>(_bitgt=Module["_bitgt"]=wasmExports["bitgt"])(a0);var _bitge=Module["_bitge"]=a0=>(_bitge=Module["_bitge"]=wasmExports["bitge"])(a0);var _bitcmp=Module["_bitcmp"]=a0=>(_bitcmp=Module["_bitcmp"]=wasmExports["bitcmp"])(a0);var _bpchareq=Module["_bpchareq"]=a0=>(_bpchareq=Module["_bpchareq"]=wasmExports["bpchareq"])(a0);var _bpcharlt=Module["_bpcharlt"]=a0=>(_bpcharlt=Module["_bpcharlt"]=wasmExports["bpcharlt"])(a0);var _bpcharle=Module["_bpcharle"]=a0=>(_bpcharle=Module["_bpcharle"]=wasmExports["bpcharle"])(a0);var _bpchargt=Module["_bpchargt"]=a0=>(_bpchargt=Module["_bpchargt"]=wasmExports["bpchargt"])(a0);var _bpcharge=Module["_bpcharge"]=a0=>(_bpcharge=Module["_bpcharge"]=wasmExports["bpcharge"])(a0);var _bpcharcmp=Module["_bpcharcmp"]=a0=>(_bpcharcmp=Module["_bpcharcmp"]=wasmExports["bpcharcmp"])(a0);var _texteq=Module["_texteq"]=a0=>(_texteq=Module["_texteq"]=wasmExports["texteq"])(a0);var _text_lt=Module["_text_lt"]=a0=>(_text_lt=Module["_text_lt"]=wasmExports["text_lt"])(a0);var _text_le=Module["_text_le"]=a0=>(_text_le=Module["_text_le"]=wasmExports["text_le"])(a0);var _text_gt=Module["_text_gt"]=a0=>(_text_gt=Module["_text_gt"]=wasmExports["text_gt"])(a0);var _text_ge=Module["_text_ge"]=a0=>(_text_ge=Module["_text_ge"]=wasmExports["text_ge"])(a0);var _bttextcmp=Module["_bttextcmp"]=a0=>(_bttextcmp=Module["_bttextcmp"]=wasmExports["bttextcmp"])(a0);var _byteaeq=Module["_byteaeq"]=a0=>(_byteaeq=Module["_byteaeq"]=wasmExports["byteaeq"])(a0);var _bytealt=Module["_bytealt"]=a0=>(_bytealt=Module["_bytealt"]=wasmExports["bytealt"])(a0);var _byteale=Module["_byteale"]=a0=>(_byteale=Module["_byteale"]=wasmExports["byteale"])(a0);var _byteagt=Module["_byteagt"]=a0=>(_byteagt=Module["_byteagt"]=wasmExports["byteagt"])(a0);var _byteage=Module["_byteage"]=a0=>(_byteage=Module["_byteage"]=wasmExports["byteage"])(a0);var _byteacmp=Module["_byteacmp"]=a0=>(_byteacmp=Module["_byteacmp"]=wasmExports["byteacmp"])(a0);var _to_hex32=Module["_to_hex32"]=a0=>(_to_hex32=Module["_to_hex32"]=wasmExports["to_hex32"])(a0);var _varstr_levenshtein=Module["_varstr_levenshtein"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_varstr_levenshtein=Module["_varstr_levenshtein"]=wasmExports["varstr_levenshtein"])(a0,a1,a2,a3,a4,a5,a6,a7);var _pg_xml_init=Module["_pg_xml_init"]=a0=>(_pg_xml_init=Module["_pg_xml_init"]=wasmExports["pg_xml_init"])(a0);var _xmlInitParser=Module["_xmlInitParser"]=()=>(_xmlInitParser=Module["_xmlInitParser"]=wasmExports["xmlInitParser"])();var _xml_ereport=Module["_xml_ereport"]=(a0,a1,a2,a3)=>(_xml_ereport=Module["_xml_ereport"]=wasmExports["xml_ereport"])(a0,a1,a2,a3);var _pg_xml_done=Module["_pg_xml_done"]=(a0,a1)=>(_pg_xml_done=Module["_pg_xml_done"]=wasmExports["pg_xml_done"])(a0,a1);var _xmlXPathNewContext=Module["_xmlXPathNewContext"]=a0=>(_xmlXPathNewContext=Module["_xmlXPathNewContext"]=wasmExports["xmlXPathNewContext"])(a0);var _xmlXPathFreeContext=Module["_xmlXPathFreeContext"]=a0=>(_xmlXPathFreeContext=Module["_xmlXPathFreeContext"]=wasmExports["xmlXPathFreeContext"])(a0);var _xmlFreeDoc=Module["_xmlFreeDoc"]=a0=>(_xmlFreeDoc=Module["_xmlFreeDoc"]=wasmExports["xmlFreeDoc"])(a0);var _xmlXPathCtxtCompile=Module["_xmlXPathCtxtCompile"]=(a0,a1)=>(_xmlXPathCtxtCompile=Module["_xmlXPathCtxtCompile"]=wasmExports["xmlXPathCtxtCompile"])(a0,a1);var _xmlXPathCompiledEval=Module["_xmlXPathCompiledEval"]=(a0,a1)=>(_xmlXPathCompiledEval=Module["_xmlXPathCompiledEval"]=wasmExports["xmlXPathCompiledEval"])(a0,a1);var _xmlXPathFreeObject=Module["_xmlXPathFreeObject"]=a0=>(_xmlXPathFreeObject=Module["_xmlXPathFreeObject"]=wasmExports["xmlXPathFreeObject"])(a0);var _xmlXPathFreeCompExpr=Module["_xmlXPathFreeCompExpr"]=a0=>(_xmlXPathFreeCompExpr=Module["_xmlXPathFreeCompExpr"]=wasmExports["xmlXPathFreeCompExpr"])(a0);var _pg_do_encoding_conversion=Module["_pg_do_encoding_conversion"]=(a0,a1,a2,a3)=>(_pg_do_encoding_conversion=Module["_pg_do_encoding_conversion"]=wasmExports["pg_do_encoding_conversion"])(a0,a1,a2,a3);var _xmlStrdup=Module["_xmlStrdup"]=a0=>(_xmlStrdup=Module["_xmlStrdup"]=wasmExports["xmlStrdup"])(a0);var _xmlEncodeSpecialChars=Module["_xmlEncodeSpecialChars"]=(a0,a1)=>(_xmlEncodeSpecialChars=Module["_xmlEncodeSpecialChars"]=wasmExports["xmlEncodeSpecialChars"])(a0,a1);var _xmlStrlen=Module["_xmlStrlen"]=a0=>(_xmlStrlen=Module["_xmlStrlen"]=wasmExports["xmlStrlen"])(a0);var _xmlBufferCreate=Module["_xmlBufferCreate"]=()=>(_xmlBufferCreate=Module["_xmlBufferCreate"]=wasmExports["xmlBufferCreate"])();var _xmlBufferFree=Module["_xmlBufferFree"]=a0=>(_xmlBufferFree=Module["_xmlBufferFree"]=wasmExports["xmlBufferFree"])(a0);var _xmlXPathCastNodeToString=Module["_xmlXPathCastNodeToString"]=a0=>(_xmlXPathCastNodeToString=Module["_xmlXPathCastNodeToString"]=wasmExports["xmlXPathCastNodeToString"])(a0);var _xmlNodeDump=Module["_xmlNodeDump"]=(a0,a1,a2,a3,a4)=>(_xmlNodeDump=Module["_xmlNodeDump"]=wasmExports["xmlNodeDump"])(a0,a1,a2,a3,a4);var _get_typsubscript=Module["_get_typsubscript"]=(a0,a1)=>(_get_typsubscript=Module["_get_typsubscript"]=wasmExports["get_typsubscript"])(a0,a1);var _CachedPlanAllowsSimpleValidityCheck=Module["_CachedPlanAllowsSimpleValidityCheck"]=(a0,a1,a2)=>(_CachedPlanAllowsSimpleValidityCheck=Module["_CachedPlanAllowsSimpleValidityCheck"]=wasmExports["CachedPlanAllowsSimpleValidityCheck"])(a0,a1,a2);var _CachedPlanIsSimplyValid=Module["_CachedPlanIsSimplyValid"]=(a0,a1,a2)=>(_CachedPlanIsSimplyValid=Module["_CachedPlanIsSimplyValid"]=wasmExports["CachedPlanIsSimplyValid"])(a0,a1,a2);var _GetCachedExpression=Module["_GetCachedExpression"]=a0=>(_GetCachedExpression=Module["_GetCachedExpression"]=wasmExports["GetCachedExpression"])(a0);var _FreeCachedExpression=Module["_FreeCachedExpression"]=a0=>(_FreeCachedExpression=Module["_FreeCachedExpression"]=wasmExports["FreeCachedExpression"])(a0);var _ReleaseAllPlanCacheRefsInOwner=Module["_ReleaseAllPlanCacheRefsInOwner"]=a0=>(_ReleaseAllPlanCacheRefsInOwner=Module["_ReleaseAllPlanCacheRefsInOwner"]=wasmExports["ReleaseAllPlanCacheRefsInOwner"])(a0);var _in_error_recursion_trouble=Module["_in_error_recursion_trouble"]=()=>(_in_error_recursion_trouble=Module["_in_error_recursion_trouble"]=wasmExports["in_error_recursion_trouble"])();var _GetErrorContextStack=Module["_GetErrorContextStack"]=()=>(_GetErrorContextStack=Module["_GetErrorContextStack"]=wasmExports["GetErrorContextStack"])();var _find_rendezvous_variable=Module["_find_rendezvous_variable"]=a0=>(_find_rendezvous_variable=Module["_find_rendezvous_variable"]=wasmExports["find_rendezvous_variable"])(a0);var _CallerFInfoFunctionCall2=Module["_CallerFInfoFunctionCall2"]=(a0,a1,a2,a3,a4)=>(_CallerFInfoFunctionCall2=Module["_CallerFInfoFunctionCall2"]=wasmExports["CallerFInfoFunctionCall2"])(a0,a1,a2,a3,a4);var _FunctionCall0Coll=Module["_FunctionCall0Coll"]=(a0,a1)=>(_FunctionCall0Coll=Module["_FunctionCall0Coll"]=wasmExports["FunctionCall0Coll"])(a0,a1);var _resolve_polymorphic_argtypes=Module["_resolve_polymorphic_argtypes"]=(a0,a1,a2,a3)=>(_resolve_polymorphic_argtypes=Module["_resolve_polymorphic_argtypes"]=wasmExports["resolve_polymorphic_argtypes"])(a0,a1,a2,a3);var _pg_bindtextdomain=Module["_pg_bindtextdomain"]=a0=>(_pg_bindtextdomain=Module["_pg_bindtextdomain"]=wasmExports["pg_bindtextdomain"])(a0);var _DefineCustomBoolVariable=Module["_DefineCustomBoolVariable"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_DefineCustomBoolVariable=Module["_DefineCustomBoolVariable"]=wasmExports["DefineCustomBoolVariable"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _DefineCustomIntVariable=Module["_DefineCustomIntVariable"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_DefineCustomIntVariable=Module["_DefineCustomIntVariable"]=wasmExports["DefineCustomIntVariable"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _DefineCustomRealVariable=Module["_DefineCustomRealVariable"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_DefineCustomRealVariable=Module["_DefineCustomRealVariable"]=wasmExports["DefineCustomRealVariable"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _DefineCustomStringVariable=Module["_DefineCustomStringVariable"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_DefineCustomStringVariable=Module["_DefineCustomStringVariable"]=wasmExports["DefineCustomStringVariable"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _DefineCustomEnumVariable=Module["_DefineCustomEnumVariable"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_DefineCustomEnumVariable=Module["_DefineCustomEnumVariable"]=wasmExports["DefineCustomEnumVariable"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _MarkGUCPrefixReserved=Module["_MarkGUCPrefixReserved"]=a0=>(_MarkGUCPrefixReserved=Module["_MarkGUCPrefixReserved"]=wasmExports["MarkGUCPrefixReserved"])(a0);var _sampler_random_init_state=Module["_sampler_random_init_state"]=(a0,a1)=>(_sampler_random_init_state=Module["_sampler_random_init_state"]=wasmExports["sampler_random_init_state"])(a0,a1);var _pchomp=Module["_pchomp"]=a0=>(_pchomp=Module["_pchomp"]=wasmExports["pchomp"])(a0);var _PinPortal=Module["_PinPortal"]=a0=>(_PinPortal=Module["_PinPortal"]=wasmExports["PinPortal"])(a0);var _UnpinPortal=Module["_UnpinPortal"]=a0=>(_UnpinPortal=Module["_UnpinPortal"]=wasmExports["UnpinPortal"])(a0);var _xmlBufferWriteCHAR=Module["_xmlBufferWriteCHAR"]=(a0,a1)=>(_xmlBufferWriteCHAR=Module["_xmlBufferWriteCHAR"]=wasmExports["xmlBufferWriteCHAR"])(a0,a1);var _xmlBufferWriteChar=Module["_xmlBufferWriteChar"]=(a0,a1)=>(_xmlBufferWriteChar=Module["_xmlBufferWriteChar"]=wasmExports["xmlBufferWriteChar"])(a0,a1);var _xmlReadMemory=Module["_xmlReadMemory"]=(a0,a1,a2,a3,a4)=>(_xmlReadMemory=Module["_xmlReadMemory"]=wasmExports["xmlReadMemory"])(a0,a1,a2,a3,a4);var _xmlDocGetRootElement=Module["_xmlDocGetRootElement"]=a0=>(_xmlDocGetRootElement=Module["_xmlDocGetRootElement"]=wasmExports["xmlDocGetRootElement"])(a0);var _xmlXPathIsNaN=Module["_xmlXPathIsNaN"]=a0=>(_xmlXPathIsNaN=Module["_xmlXPathIsNaN"]=wasmExports["xmlXPathIsNaN"])(a0);var _xmlXPathCastToBoolean=Module["_xmlXPathCastToBoolean"]=a0=>(_xmlXPathCastToBoolean=Module["_xmlXPathCastToBoolean"]=wasmExports["xmlXPathCastToBoolean"])(a0);var _xmlXPathCastToNumber=Module["_xmlXPathCastToNumber"]=a0=>(_xmlXPathCastToNumber=Module["_xmlXPathCastToNumber"]=wasmExports["xmlXPathCastToNumber"])(a0);var ___dl_seterr=(a0,a1)=>(___dl_seterr=wasmExports["__dl_seterr"])(a0,a1);var _getgid=Module["_getgid"]=()=>(_getgid=Module["_getgid"]=wasmExports["getgid"])();var _getuid=Module["_getuid"]=()=>(_getuid=Module["_getuid"]=wasmExports["getuid"])();var _gmtime=Module["_gmtime"]=a0=>(_gmtime=Module["_gmtime"]=wasmExports["gmtime"])(a0);var _htonl=a0=>(_htonl=wasmExports["htonl"])(a0);var _htons=a0=>(_htons=wasmExports["htons"])(a0);var _ioctl=Module["_ioctl"]=(a0,a1,a2)=>(_ioctl=Module["_ioctl"]=wasmExports["ioctl"])(a0,a1,a2);var _emscripten_builtin_memalign=(a0,a1)=>(_emscripten_builtin_memalign=wasmExports["emscripten_builtin_memalign"])(a0,a1);var _ntohs=a0=>(_ntohs=wasmExports["ntohs"])(a0);var _perror=Module["_perror"]=a0=>(_perror=Module["_perror"]=wasmExports["perror"])(a0);var _qsort=Module["_qsort"]=(a0,a1,a2,a3)=>(_qsort=Module["_qsort"]=wasmExports["qsort"])(a0,a1,a2,a3);var _srand=Module["_srand"]=a0=>(_srand=Module["_srand"]=wasmExports["srand"])(a0);var _rand=Module["_rand"]=()=>(_rand=Module["_rand"]=wasmExports["rand"])();var __emscripten_timeout=(a0,a1)=>(__emscripten_timeout=wasmExports["_emscripten_timeout"])(a0,a1);var _strerror_r=Module["_strerror_r"]=(a0,a1,a2)=>(_strerror_r=Module["_strerror_r"]=wasmExports["strerror_r"])(a0,a1,a2);var _strncat=Module["_strncat"]=(a0,a1,a2)=>(_strncat=Module["_strncat"]=wasmExports["strncat"])(a0,a1,a2);var _setThrew=(a0,a1)=>(_setThrew=wasmExports["setThrew"])(a0,a1);var __emscripten_tempret_set=a0=>(__emscripten_tempret_set=wasmExports["_emscripten_tempret_set"])(a0);var __emscripten_tempret_get=()=>(__emscripten_tempret_get=wasmExports["_emscripten_tempret_get"])();var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["_emscripten_stack_restore"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["_emscripten_stack_alloc"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["emscripten_stack_get_current"])();var ___wasm_apply_data_relocs=()=>(___wasm_apply_data_relocs=wasmExports["__wasm_apply_data_relocs"])();var _stderr=Module["_stderr"]=2536848;var _InterruptPending=Module["_InterruptPending"]=2677872;var _MyLatch=Module["_MyLatch"]=2678060;var _CritSectionCount=Module["_CritSectionCount"]=2677924;var _MyProc=Module["_MyProc"]=2647676;var _pg_global_prng_state=Module["_pg_global_prng_state"]=2624256;var _error_context_stack=Module["_error_context_stack"]=2676168;var _GUC_check_errdetail_string=Module["_GUC_check_errdetail_string"]=2681820;var _IsUnderPostmaster=Module["_IsUnderPostmaster"]=2677953;var _CurrentMemoryContext=Module["_CurrentMemoryContext"]=2683248;var _stdout=Module["_stdout"]=2537152;var _debug_query_string=Module["_debug_query_string"]=2538700;var _MyProcPort=Module["_MyProcPort"]=2678048;var ___THREW__=Module["___THREW__"]=2698916;var ___threwValue=Module["___threwValue"]=2698920;var _MyDatabaseId=Module["_MyDatabaseId"]=2677932;var _TopMemoryContext=Module["_TopMemoryContext"]=2683252;var _PG_exception_stack=Module["_PG_exception_stack"]=2676172;var _MyProcPid=Module["_MyProcPid"]=2678024;var _stdin=Module["_stdin"]=2537e3;var _ScanKeywords=Module["_ScanKeywords"]=2374040;var _pg_number_of_ones=Module["_pg_number_of_ones"]=925120;var _LocalBufferBlockPointers=Module["_LocalBufferBlockPointers"]=2644252;var _BufferBlocks=Module["_BufferBlocks"]=2638988;var _wal_level=Module["_wal_level"]=2387920;var _SnapshotAnyData=Module["_SnapshotAnyData"]=2474096;var _maintenance_work_mem=Module["_maintenance_work_mem"]=2421576;var _ParallelWorkerNumber=Module["_ParallelWorkerNumber"]=2379480;var _MainLWLockArray=Module["_MainLWLockArray"]=2645860;var _CurrentResourceOwner=Module["_CurrentResourceOwner"]=2683296;var _work_mem=Module["_work_mem"]=2421560;var _NBuffers=Module["_NBuffers"]=2421584;var _bsysscan=Module["_bsysscan"]=2625492;var _CheckXidAlive=Module["_CheckXidAlive"]=2625488;var _RecentXmin=Module["_RecentXmin"]=2474188;var _XactIsoLevel=Module["_XactIsoLevel"]=2387784;var _pgWalUsage=Module["_pgWalUsage"]=2628960;var _pgBufferUsage=Module["_pgBufferUsage"]=2628832;var _TTSOpsVirtual=Module["_TTSOpsVirtual"]=2391608;var _TransamVariables=Module["_TransamVariables"]=2625480;var _TopTransactionContext=Module["_TopTransactionContext"]=2683272;var _RmgrTable=Module["_RmgrTable"]=2379504;var _process_shared_preload_libraries_in_progress=Module["_process_shared_preload_libraries_in_progress"]=2681216;var _wal_segment_size=Module["_wal_segment_size"]=2387940;var _TopTransactionResourceOwner=Module["_TopTransactionResourceOwner"]=2683304;var _arch_module_check_errdetail_string=Module["_arch_module_check_errdetail_string"]=2638372;var _object_access_hook=Module["_object_access_hook"]=2627600;var _InvalidObjectAddress=Module["_InvalidObjectAddress"]=1520620;var _check_function_bodies=Module["_check_function_bodies"]=2421750;var _post_parse_analyze_hook=Module["_post_parse_analyze_hook"]=2627640;var _ScanKeywordTokens=Module["_ScanKeywordTokens"]=1551648;var _SPI_processed=Module["_SPI_processed"]=2628984;var _SPI_tuptable=Module["_SPI_tuptable"]=2628992;var _TTSOpsMinimalTuple=Module["_TTSOpsMinimalTuple"]=2391712;var _check_password_hook=Module["_check_password_hook"]=2627908;var _ConfigReloadPending=Module["_ConfigReloadPending"]=2638360;var _max_parallel_maintenance_workers=Module["_max_parallel_maintenance_workers"]=2421580;var _DateStyle=Module["_DateStyle"]=2421548;var _ExecutorStart_hook=Module["_ExecutorStart_hook"]=2628808;var _ExecutorRun_hook=Module["_ExecutorRun_hook"]=2628812;var _ExecutorFinish_hook=Module["_ExecutorFinish_hook"]=2628816;var _ExecutorEnd_hook=Module["_ExecutorEnd_hook"]=2628820;var _SPI_result=Module["_SPI_result"]=2628996;var _ClientAuthentication_hook=Module["_ClientAuthentication_hook"]=2629168;var _cpu_tuple_cost=Module["_cpu_tuple_cost"]=2392168;var _cpu_operator_cost=Module["_cpu_operator_cost"]=2392184;var _seq_page_cost=Module["_seq_page_cost"]=2392152;var _planner_hook=Module["_planner_hook"]=2638056;var _ShutdownRequestPending=Module["_ShutdownRequestPending"]=2638364;var _MyStartTime=Module["_MyStartTime"]=2678032;var _cluster_name=Module["_cluster_name"]=2421800;var _application_name=Module["_application_name"]=2682044;var _BufferDescriptors=Module["_BufferDescriptors"]=2638984;var _shmem_startup_hook=Module["_shmem_startup_hook"]=2644932;var _ProcessUtility_hook=Module["_ProcessUtility_hook"]=2647764;var _IntervalStyle=Module["_IntervalStyle"]=2677956;var _extra_float_digits=Module["_extra_float_digits"]=2411976;var _pg_crc32_table=Module["_pg_crc32_table"]=2112288;var _xmlFree=Module["_xmlFree"]=2523400;var _shmem_request_hook=Module["_shmem_request_hook"]=2681220;function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_j(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vji(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_jii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_ji(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_jiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_jiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_iiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiijii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vijiji(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viji(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiji(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiij(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vj(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiji(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vij(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ij(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiji(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiij(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vid(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ijiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viijii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiji(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viijiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viij(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_jiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0);return 0n}}function invoke_viiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_di(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_id(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ijiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["wasmTable"]=wasmTable;Module["addFunction"]=addFunction;Module["removeFunction"]=removeFunction;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;Module["stringToNewUTF8"]=stringToNewUTF8;Module["stringToUTF8OnStack"]=stringToUTF8OnStack;Module["FS_createPreloadedFile"]=FS_createPreloadedFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS"]=FS;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;Module["MEMFS"]=MEMFS;Module["IDBFS"]=IDBFS;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=resolveGlobalSymbol("main").sym;if(!entryFunction)return;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv;args.forEach(arg=>{HEAPU32[argv_ptr>>2]=stringToUTF8OnStack(arg);argv_ptr+=4});HEAPU32[argv_ptr>>2]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run();moduleRtn=readyPromise; + + + return moduleRtn; +} +); +})(); +export default Module; diff --git a/JSTests/wasm/stress/resources/pglite/pglite.wasm b/JSTests/wasm/stress/resources/pglite/pglite.wasm new file mode 100644 index 000000000000..13f424329c1a Binary files /dev/null and b/JSTests/wasm/stress/resources/pglite/pglite.wasm differ diff --git a/JSTests/wasm/stress/resources/pglite/psql.js b/JSTests/wasm/stress/resources/pglite/psql.js new file mode 100644 index 000000000000..7ed0ca97c4ac --- /dev/null +++ b/JSTests/wasm/stress/resources/pglite/psql.js @@ -0,0 +1,69 @@ +// Tiny psql-like SQL REPL for verifying that PGlite (PostgreSQL on wasm) works +// in the jsc shell. Not a test — a manual sanity check / demo. +// +// Run from JSTests/wasm/stress/: +// DYLD_FRAMEWORK_PATH=$BUILD/Release $BUILD/Release/jsc resources/pglite/psql.js +// +// Then type SQL at the `pglite=#` prompt. End each statement with `;`. +// Type `\q` to quit, `\d` to list tables. + +load("./resources/pglite/jsc-harness.js"); + +function pad(s, w) { s = String(s ?? ""); return s.length >= w ? s : s + " ".repeat(w - s.length); } + +function printTable({ rows, fields, commandTags }) { + if (fields.length) { + const widths = fields.map((f, i) => Math.max(f.name.length, ...rows.map(r => String(r[i] ?? "").length))); + print(" " + fields.map((f, i) => pad(f.name, widths[i])).join(" | ")); + print("-" + widths.map(w => "-".repeat(w)).join("-+-") + "-"); + for (const row of rows) + print(" " + row.map((c, i) => pad(c, widths[i])).join(" | ")); + print(`(${rows.length} row${rows.length === 1 ? "" : "s"})`); + } + for (const tag of commandTags) + if (!fields.length || !/^SELECT/.test(tag)) print(tag); +} + +(async () => { + print("Booting PostgreSQL on WebAssembly in the jsc shell..."); + const t0 = performance.now(); + const db = await startPGlite("./resources/pglite"); + print(`Ready in ${(performance.now() - t0).toFixed(0)}ms.\n`); + print(db.query("SELECT version();").rows[0][0]); + print('\nType SQL terminated by ";" (or "\\d" for tables, "\\q" to quit).\n'); + + let buf = ""; + while (true) { + const prompt = buf ? "pglite-# " : "pglite=# "; + // jsc's readline() doesn't support a prompt arg; print it ourselves without newline. + // print() always appends \n, so the prompt sits on its own line — close enough. + print(prompt); + const line = readline(); + if (line === null || line === undefined) break; + const trimmed = line.trim(); + if (!buf) { + if (trimmed === "\\q" || trimmed === "exit" || trimmed === "quit") break; + if (trimmed === "\\d") { + printTable(db.query( + "SELECT table_name AS \"Table\", table_type AS \"Type\" FROM information_schema.tables " + + "WHERE table_schema = 'public' ORDER BY table_name;")); + continue; + } + if (trimmed === "") continue; + } + buf += (buf ? "\n" : "") + line; + if (!buf.trimEnd().endsWith(";")) continue; + const sql = buf; + buf = ""; + try { + const t = performance.now(); + const result = db.query(sql); + printTable(result); + print(`Time: ${(performance.now() - t).toFixed(2)}ms\n`); + } catch (e) { + print("ERROR: " + (e.message || e) + "\n"); + } + } + db.close(); + print("Bye."); +})().catch(e => print("FATAL: " + e + "\n" + (e.stack || ""))); diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations index b83e87b343b4..80c6a6eb0a5d 100644 --- a/LayoutTests/TestExpectations +++ b/LayoutTests/TestExpectations @@ -68,6 +68,7 @@ http/tests/swipe [ Skip ] http/tests/text-extraction [ Skip ] fast/zooming/ios [ Skip ] fast/forms/ios [ Skip ] +http/tests/site-isolation/open-panel-in-cross-origin-iframe.html [ Skip ] http/tests/site-isolation/select-in-cross-origin-iframe.html [ Skip ] fast/viewport/ios [ Skip ] fast/visual-viewport/ios/ [ Skip ] @@ -406,6 +407,10 @@ fast/events/do-not-drag-and-drop-data-detectors-link.html [ Skip ] # Testing against scroller style changes only makes sense on Mac scrollbars/custom-scrollbar-scroller-style-change.html [ Skip ] +# Only useful on macOS +compositing/geometry/frame-clipping-layer-with-bottom-right-inset.html [ Skip ] +compositing/geometry/frame-clipping-layer-with-top-left-inset.html [ Skip ] + # A rounding error may cause 90deg 3d-rotated elements to count as painted imported/w3c/web-platform-tests/paint-timing/fcp-only/fcp-invisible-3d-rotate-descendant.html @@ -608,6 +613,9 @@ webkit.org/b/290522 imported/w3c/web-platform-tests/html/canvas/offscreen/manual imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video [ ImageOnlyFailure ] # These are the WebVTT rendering WPT we are already passing. +imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/2_tracks.html [ Pass ] +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/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 ] @@ -620,6 +628,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/embedded_style_urls.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/evil/media_404_omit_subtitles.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/evil/media_height_19.html [ Pass ] +imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/evil/non-standard-pseudo-elements.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/decode_escaped_entities.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_cue_align_position_line_size_while_paused.html [ Pass ] @@ -634,17 +643,9 @@ 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/color_hex.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_hsla.html [ Pass ] imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Pass ] - -# These WebVTT rendering WPT are flaky. -imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/evil/non-standard-pseudo-elements.html [ ImageOnlyFailure Pass Failure ] -imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/audio_has_no_subtitles.html [ ImageOnlyFailure Pass Failure ] -imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_white-space_pre-line_wrapped.html [ Crash ImageOnlyFailure ] -imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html [ ImageOnlyFailure Pass Failure ] -imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_nowrap_wrapped.html [ ImageOnlyFailure Pass Failure ] - -# These WebVTT rendering WPT occasionally time out. -imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/2_tracks.html [ Skip ] -imported/w3c/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/3_tracks.html [ Skip ] +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/white-space_pre.html [ Pass ] ## -- Enhanced + + + diff --git a/LayoutTests/fast/forms/ios/form-control-refresh/button/identical-buttons-have-same-corner-radius.html b/LayoutTests/fast/forms/ios/form-control-refresh/button/identical-buttons-have-same-corner-radius.html new file mode 100644 index 000000000000..86a8aab4e41c --- /dev/null +++ b/LayoutTests/fast/forms/ios/form-control-refresh/button/identical-buttons-have-same-corner-radius.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/LayoutTests/fast/forms/ios/select-menulist-text-align-chevron-padding-expected.txt b/LayoutTests/fast/forms/ios/select-menulist-text-align-chevron-padding-expected.txt new file mode 100644 index 000000000000..afbb53ac0fbc --- /dev/null +++ b/LayoutTests/fast/forms/ios/select-menulist-text-align-chevron-padding-expected.txt @@ -0,0 +1,13 @@ +A select with text-align pointing toward the chevron should still have internal padding on the logical end, preventing text from overlapping with the chevron. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS ltrStyle.paddingRight is not "0px" +PASS ltrStyle.paddingLeft is "0px" +PASS rtlStyle.paddingLeft is not "0px" +PASS rtlStyle.paddingRight is "0px" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/forms/ios/select-menulist-text-align-chevron-padding.html b/LayoutTests/fast/forms/ios/select-menulist-text-align-chevron-padding.html new file mode 100644 index 000000000000..38a3898bbc2a --- /dev/null +++ b/LayoutTests/fast/forms/ios/select-menulist-text-align-chevron-padding.html @@ -0,0 +1,29 @@ + + + + + + + + + + diff --git a/LayoutTests/fast/forms/label/label-click-event-dispatch-untrusted-expected.txt b/LayoutTests/fast/forms/label/label-click-event-dispatch-untrusted-expected.txt new file mode 100644 index 000000000000..0f645adb4e78 --- /dev/null +++ b/LayoutTests/fast/forms/label/label-click-event-dispatch-untrusted-expected.txt @@ -0,0 +1,10 @@ +Tests that clicking a label dispatches an untrusted click event on the associated form control. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS event.isTrusted is false +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/forms/label/label-click-event-dispatch-untrusted.html b/LayoutTests/fast/forms/label/label-click-event-dispatch-untrusted.html new file mode 100644 index 000000000000..31cee64699b2 --- /dev/null +++ b/LayoutTests/fast/forms/label/label-click-event-dispatch-untrusted.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/LayoutTests/fast/grid/grid-item-block-content-size-suggestion-crash-expected.txt b/LayoutTests/fast/grid/grid-item-block-content-size-suggestion-crash-expected.txt new file mode 100644 index 000000000000..c2541f4f3dd7 --- /dev/null +++ b/LayoutTests/fast/grid/grid-item-block-content-size-suggestion-crash-expected.txt @@ -0,0 +1 @@ +PASS if no crash. diff --git a/LayoutTests/fast/grid/grid-item-block-content-size-suggestion-crash.html b/LayoutTests/fast/grid/grid-item-block-content-size-suggestion-crash.html new file mode 100644 index 000000000000..9c8cc9fa35bd --- /dev/null +++ b/LayoutTests/fast/grid/grid-item-block-content-size-suggestion-crash.html @@ -0,0 +1,16 @@ + + +
+
PASS if no crash.
+
+ diff --git a/LayoutTests/fast/hidpi/filters-drop-shadow.html b/LayoutTests/fast/hidpi/filters-drop-shadow.html index d8eda44f861b..068465ce2cf1 100644 --- a/LayoutTests/fast/hidpi/filters-drop-shadow.html +++ b/LayoutTests/fast/hidpi/filters-drop-shadow.html @@ -1,14 +1,14 @@ - + diff --git a/LayoutTests/fast/images/stopped-animation-deleted-image.html b/LayoutTests/fast/images/stopped-animation-deleted-image.html index 02a6dd40e6ae..306bd6794350 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,14 +25,15 @@ function imageRemove() { - setTimeout(function() { + image.addEventListener("webkitImageFrameReady", function listener() { + image.removeEventListener("webkitImageFrameReady", listener, true); frameIndex = internals.imageFrameIndex(image); image.remove(); setTimeout(function() { shouldBe("internals.imageFrameIndex(image)", "frameIndex"); finishJSTest(); }, 50); - }, 50); + }, true); } diff --git a/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-expected.html b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..4d4b64064a40 --- /dev/null +++ b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant-expected.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant.html b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant.html new file mode 100644 index 000000000000..b63a0ec35e01 --- /dev/null +++ b/LayoutTests/fast/overflow/intrinsic-width-container-with-scrollable-descendant.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/fast/overflow/min-intrinsic-width-container-with-scrollable-descendant-expected.html b/LayoutTests/fast/overflow/min-intrinsic-width-container-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..e4b70684e954 --- /dev/null +++ b/LayoutTests/fast/overflow/min-intrinsic-width-container-with-scrollable-descendant-expected.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/fast/overflow/min-intrinsic-width-container-with-scrollable-descendant.html b/LayoutTests/fast/overflow/min-intrinsic-width-container-with-scrollable-descendant.html new file mode 100644 index 000000000000..405165cccf45 --- /dev/null +++ b/LayoutTests/fast/overflow/min-intrinsic-width-container-with-scrollable-descendant.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/fast/repaint/blur-change-expected.txt b/LayoutTests/fast/repaint/blur-change-expected.txt new file mode 100644 index 000000000000..411b6c38bf04 --- /dev/null +++ b/LayoutTests/fast/repaint/blur-change-expected.txt @@ -0,0 +1,14 @@ +Test repaint rects when the drop-shadow filter property changes + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +(repaint rects + (rect 24 36 268 268) + (rect 24 256 268 268) +) + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/repaint/blur-change.html b/LayoutTests/fast/repaint/blur-change.html new file mode 100644 index 000000000000..8f2290271119 --- /dev/null +++ b/LayoutTests/fast/repaint/blur-change.html @@ -0,0 +1,58 @@ + + + + + + + + +
+
+ +
+ diff --git a/LayoutTests/fast/repaint/drop-shadow-box-change-expected.txt b/LayoutTests/fast/repaint/drop-shadow-box-change-expected.txt new file mode 100644 index 000000000000..9a3be5297ba0 --- /dev/null +++ b/LayoutTests/fast/repaint/drop-shadow-box-change-expected.txt @@ -0,0 +1,13 @@ +Test repaint rects when a box with drop-shadow changes size + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +(repaint rects + (rect 192 192 206 156) +) + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/repaint/drop-shadow-box-change.html b/LayoutTests/fast/repaint/drop-shadow-box-change.html new file mode 100644 index 000000000000..efcb4d0cc580 --- /dev/null +++ b/LayoutTests/fast/repaint/drop-shadow-box-change.html @@ -0,0 +1,45 @@ + + + + + + + + +
+
+ diff --git a/LayoutTests/fast/repaint/drop-shadow-change-expected.txt b/LayoutTests/fast/repaint/drop-shadow-change-expected.txt new file mode 100644 index 000000000000..2f1b736676db --- /dev/null +++ b/LayoutTests/fast/repaint/drop-shadow-change-expected.txt @@ -0,0 +1,14 @@ +Test repaint rects when the drop-shadow filter property changes + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +(repaint rects + (rect 108 100 100 100) + (rect 100 92 156 156) +) + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/repaint/drop-shadow-change.html b/LayoutTests/fast/repaint/drop-shadow-change.html new file mode 100644 index 000000000000..7b5cee029a9d --- /dev/null +++ b/LayoutTests/fast/repaint/drop-shadow-change.html @@ -0,0 +1,42 @@ + + + + + + + + +
+
+ diff --git a/LayoutTests/fast/repaint/drop-shadow-writing-modes-expected.txt b/LayoutTests/fast/repaint/drop-shadow-writing-modes-expected.txt new file mode 100644 index 000000000000..b1b1ce38c96e --- /dev/null +++ b/LayoutTests/fast/repaint/drop-shadow-writing-modes-expected.txt @@ -0,0 +1,14 @@ +Test repaint rects when the drop-shadow filter property changes + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +(repaint rects + (rect 108 100 100 100) + (rect 60 92 156 156) +) + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/repaint/drop-shadow-writing-modes.html b/LayoutTests/fast/repaint/drop-shadow-writing-modes.html new file mode 100644 index 000000000000..ec6db6240c71 --- /dev/null +++ b/LayoutTests/fast/repaint/drop-shadow-writing-modes.html @@ -0,0 +1,43 @@ + + + + + + + + +
+
+ diff --git a/LayoutTests/fast/repaint/select-option-background-color-tracked.html b/LayoutTests/fast/repaint/select-option-background-color-tracked.html new file mode 100644 index 000000000000..5a0762717526 --- /dev/null +++ b/LayoutTests/fast/repaint/select-option-background-color-tracked.html @@ -0,0 +1,30 @@ + +<select> repaints when <option> background-color changes + +

+
+
diff --git a/LayoutTests/fast/scrolling/ios/fixed-position-in-vertical-rl-expected.html b/LayoutTests/fast/scrolling/ios/fixed-position-in-vertical-rl-expected.html
new file mode 100644
index 000000000000..a0a7e6c24408
--- /dev/null
+++ b/LayoutTests/fast/scrolling/ios/fixed-position-in-vertical-rl-expected.html
@@ -0,0 +1,40 @@
+
+
+
+  
+  
+
+
+  
+
+
+
+ + diff --git a/LayoutTests/fast/scrolling/ios/fixed-position-in-vertical-rl.html b/LayoutTests/fast/scrolling/ios/fixed-position-in-vertical-rl.html new file mode 100644 index 000000000000..aebedca0b9c2 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/fixed-position-in-vertical-rl.html @@ -0,0 +1,54 @@ + + + + + + + + + +
+
+
+
+ + diff --git a/LayoutTests/fast/scrolling/ios/iframe-scroll-into-view.html b/LayoutTests/fast/scrolling/ios/iframe-scroll-into-view.html index 2f736f63daf4..761c02024843 100644 --- a/LayoutTests/fast/scrolling/ios/iframe-scroll-into-view.html +++ b/LayoutTests/fast/scrolling/ios/iframe-scroll-into-view.html @@ -12,23 +12,23 @@ width: 200px; } - - - -
- -
- - + + + + +
+ +
+ diff --git a/LayoutTests/fast/shadow-dom/style-invalidation-slotted-element-with-author-shadow-root-crash-expected.txt b/LayoutTests/fast/shadow-dom/style-invalidation-slotted-element-with-author-shadow-root-crash-expected.txt new file mode 100644 index 000000000000..02e87eaa2e92 --- /dev/null +++ b/LayoutTests/fast/shadow-dom/style-invalidation-slotted-element-with-author-shadow-root-crash-expected.txt @@ -0,0 +1,4 @@ +This tests that style invalidation does not crash when a slotted element has its own author shadow root. +WebKit should not hit any assertion or crash and you should see PASS below. + +PASS - WebKit did not crash diff --git a/LayoutTests/fast/shadow-dom/style-invalidation-slotted-element-with-author-shadow-root-crash.html b/LayoutTests/fast/shadow-dom/style-invalidation-slotted-element-with-author-shadow-root-crash.html new file mode 100644 index 000000000000..d52f81e54015 --- /dev/null +++ b/LayoutTests/fast/shadow-dom/style-invalidation-slotted-element-with-author-shadow-root-crash.html @@ -0,0 +1,38 @@ + + + +

This tests that style invalidation does not crash when a slotted element has its own author shadow root.
+WebKit should not hit any assertion or crash and you should see PASS below.

+
+ slotted +
+ + + diff --git a/LayoutTests/fast/text-extraction/contenteditable-text-extraction-expected.txt b/LayoutTests/fast/text-extraction/contenteditable-text-extraction-expected.txt new file mode 100644 index 000000000000..b5b75258c477 --- /dev/null +++ b/LayoutTests/fast/text-extraction/contenteditable-text-extraction-expected.txt @@ -0,0 +1,3 @@ + +(ROOT + (TEXT "Check out this link.\n" {editable label="Send a message" (focused)} { in [10,19]})) diff --git a/LayoutTests/fast/text-extraction/contenteditable-text-extraction.html b/LayoutTests/fast/text-extraction/contenteditable-text-extraction.html new file mode 100644 index 000000000000..fb9537f9774d --- /dev/null +++ b/LayoutTests/fast/text-extraction/contenteditable-text-extraction.html @@ -0,0 +1,28 @@ + + + + + + + + + +
Check out this link.
+ + diff --git a/LayoutTests/fast/text-extraction/max-recursion-depth-cap-expected.html b/LayoutTests/fast/text-extraction/max-recursion-depth-cap-expected.html new file mode 100644 index 000000000000..6e79f371cf8f --- /dev/null +++ b/LayoutTests/fast/text-extraction/max-recursion-depth-cap-expected.html @@ -0,0 +1,28 @@ + + + + + + + + +
+ + + diff --git a/LayoutTests/fast/text-extraction/max-recursion-depth-cap.html b/LayoutTests/fast/text-extraction/max-recursion-depth-cap.html new file mode 100644 index 000000000000..cb589afb1598 --- /dev/null +++ b/LayoutTests/fast/text-extraction/max-recursion-depth-cap.html @@ -0,0 +1,28 @@ + + + + + + + + +
+ + + diff --git a/LayoutTests/fast/text-extraction/text-extraction-scroll-fallback-to-large-container-expected.txt b/LayoutTests/fast/text-extraction/text-extraction-scroll-fallback-to-large-container-expected.txt new file mode 100644 index 000000000000..3f25e9498057 --- /dev/null +++ b/LayoutTests/fast/text-extraction/text-extraction-scroll-fallback-to-large-container-expected.txt @@ -0,0 +1,14 @@ +Tests that scroll interactions on a page with an unscrollable root fall back to a large scrollable container. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS rootScrollTop is 0 +PASS noArgScrollError is "" +PASS largeScrollerScrollTopAfterFallback is > 0 +PASS scrollByError is "" +PASS largeScrollerScrollTopAfterScrollBy is 150 +PASS successfullyParsed is true + +TEST COMPLETE +Top of large scroller diff --git a/LayoutTests/fast/text-extraction/text-extraction-scroll-fallback-to-large-container.html b/LayoutTests/fast/text-extraction/text-extraction-scroll-fallback-to-large-container.html new file mode 100644 index 000000000000..e0548c31aa13 --- /dev/null +++ b/LayoutTests/fast/text-extraction/text-extraction-scroll-fallback-to-large-container.html @@ -0,0 +1,71 @@ + + + + + + + + + + + +
+
Top of large scroller
+
+ + + diff --git a/LayoutTests/fast/text/font-face-family-expected.txt b/LayoutTests/fast/text/font-face-family-expected.txt index c84f580e0bb6..10d3be38415e 100644 --- a/LayoutTests/fast/text/font-face-family-expected.txt +++ b/LayoutTests/fast/text/font-face-family-expected.txt @@ -5,7 +5,7 @@ PASS (new FontFace('4\'a', 'url(garbage.otf)')).family is "\"4'a\"" PASS (new FontFace('4\'a"b', 'url(garbage.otf)')).family is "\"4'a\\\"b\"" PASS (new FontFace('ab', 'url(garbage.otf)')).family is "ab" PASS (new FontFace('"ab"', 'url(garbage.otf)')).family is "\"\\\"ab\\\"\"" -PASS (new FontFace('a b', 'url(garbage.otf)')).family is "\"a b\"" +PASS (new FontFace('a b', 'url(garbage.otf)')).family is "a b" PASS (new FontFace('a b, c', 'url(garbage.otf)')).family is "\"a b, c\"" PASS (new FontFace('ab,c', 'url(garbage.otf)')).family is "\"ab,c\"" PASS successfullyParsed is true diff --git a/LayoutTests/fast/text/font-face-family.html b/LayoutTests/fast/text/font-face-family.html index 7b2775526e34..2f212e6c1566 100644 --- a/LayoutTests/fast/text/font-face-family.html +++ b/LayoutTests/fast/text/font-face-family.html @@ -13,7 +13,7 @@ shouldBeEqualToString("(new FontFace('4\\'a\"b', 'url(garbage.otf)')).family", "\"4'a\\\"b\""); shouldBeEqualToString("(new FontFace('ab', 'url(garbage.otf)')).family", "ab"); shouldBeEqualToString("(new FontFace('\"ab\"', 'url(garbage.otf)')).family", "\"\\\"ab\\\"\""); -shouldBeEqualToString("(new FontFace('a b', 'url(garbage.otf)')).family", "\"a b\""); +shouldBeEqualToString("(new FontFace('a b', 'url(garbage.otf)')).family", "a b"); shouldBeEqualToString("(new FontFace('a b, c', 'url(garbage.otf)')).family", "\"a b, c\""); shouldBeEqualToString("(new FontFace('ab,c', 'url(garbage.otf)')).family", "\"ab,c\""); diff --git a/LayoutTests/fast/text/font-stretch-parse-expected.txt b/LayoutTests/fast/text/font-stretch-parse-expected.txt index 9e8540928473..bcd068fe5fde 100644 --- a/LayoutTests/fast/text/font-stretch-parse-expected.txt +++ b/LayoutTests/fast/text/font-stretch-parse-expected.txt @@ -34,18 +34,18 @@ PASS getComputedStyle(document.getElementById('test12')).font is "ultra-expanded PASS getComputedStyle(document.getElementById('test13')).font is "16px / 18px Times" PASS getComputedStyle(document.getElementById('test14')).font is "16px / 18px Times" PASS getComputedStyle(document.getElementById('test15')).font is "16px / 18px Times" -PASS getComputedStyle(document.getElementById('test16')).font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test17')).font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test18')).font is "100 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test19')).font is "100 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test20')).font is "italic small-caps 100 extra-expanded 48px / 49px \"Helvetica Neue\"" +PASS getComputedStyle(document.getElementById('test16')).font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test17')).font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test18')).font is "100 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test19')).font is "100 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test20')).font is "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue" PASS getComputedStyle(document.getElementById('test21')).font is "" PASS document.getElementById('test1').style.font is "" -PASS document.getElementById('test16').style.font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test17').style.font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test18').style.font is "100 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test19').style.font is "100 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test20').style.font is "italic small-caps 100 extra-expanded 48px / 49px \"Helvetica Neue\"" +PASS document.getElementById('test16').style.font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS document.getElementById('test17').style.font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS document.getElementById('test18').style.font is "100 48px / 49px Helvetica Neue" +PASS document.getElementById('test19').style.font is "100 48px / 49px Helvetica Neue" +PASS document.getElementById('test20').style.font is "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue" PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/fast/text/font-stretch-parse.html b/LayoutTests/fast/text/font-stretch-parse.html index a5365a4eedfa..c82d04b0ee36 100644 --- a/LayoutTests/fast/text/font-stretch-parse.html +++ b/LayoutTests/fast/text/font-stretch-parse.html @@ -65,19 +65,19 @@ shouldBeEqualToString("getComputedStyle(document.getElementById('test13')).font", "16px / 18px Times"); shouldBeEqualToString("getComputedStyle(document.getElementById('test14')).font", "16px / 18px Times"); shouldBeEqualToString("getComputedStyle(document.getElementById('test15')).font", "16px / 18px Times"); -shouldBeEqualToString("getComputedStyle(document.getElementById('test16')).font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test17')).font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test18')).font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test19')).font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test20')).font", `italic small-caps 100 extra-expanded 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("getComputedStyle(document.getElementById('test16')).font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test17')).font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test18')).font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test19')).font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test20')).font", "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue"); shouldBeEqualToString("getComputedStyle(document.getElementById('test21')).font", ""); shouldBeEqualToString("document.getElementById('test1').style.font", ""); -shouldBeEqualToString("document.getElementById('test16').style.font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test17').style.font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test18').style.font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test19').style.font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test20').style.font", `italic small-caps 100 extra-expanded 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("document.getElementById('test16').style.font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test17').style.font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test18').style.font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test19').style.font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test20').style.font", "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue"); diff --git a/LayoutTests/fast/text/font-style-parse-expected.txt b/LayoutTests/fast/text/font-style-parse-expected.txt index 03e07915aaa2..81fbbec81fa0 100644 --- a/LayoutTests/fast/text/font-style-parse-expected.txt +++ b/LayoutTests/fast/text/font-style-parse-expected.txt @@ -34,22 +34,22 @@ PASS getComputedStyle(document.getElementById('test11')).font is "16px / 18px Ti PASS getComputedStyle(document.getElementById('test12')).font is "16px / 18px Times" PASS getComputedStyle(document.getElementById('test13')).font is "16px / 18px Times" PASS getComputedStyle(document.getElementById('test14')).font is "" -PASS getComputedStyle(document.getElementById('test15')).font is "italic 100 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test16')).font is "italic 100 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test17')).font is "100 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test18')).font is "italic 48px / 49px \"Helvetica Neue\"" -PASS getComputedStyle(document.getElementById('test19')).font is "italic small-caps 100 extra-expanded 48px / 49px \"Helvetica Neue\"" +PASS getComputedStyle(document.getElementById('test15')).font is "italic 100 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test16')).font is "italic 100 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test17')).font is "100 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test18')).font is "italic 48px / 49px Helvetica Neue" +PASS getComputedStyle(document.getElementById('test19')).font is "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue" PASS getComputedStyle(document.getElementById('test20')).font is "16px / 18px Times" -PASS getComputedStyle(document.getElementById('test21')).font is "oblique small-caps 123 extra-expanded 48px / 49px \"Helvetica Neue\"" +PASS getComputedStyle(document.getElementById('test21')).font is "oblique small-caps 123 extra-expanded 48px / 49px Helvetica Neue" PASS getComputedStyle(document.getElementById('test22')).font is "" PASS document.getElementById('test1').style.font is "" -PASS document.getElementById('test15').style.font is "italic 100 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test16').style.font is "italic 100 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test17').style.font is "100 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test18').style.font is "italic 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test19').style.font is "italic small-caps 100 extra-expanded 48px / 49px \"Helvetica Neue\"" +PASS document.getElementById('test15').style.font is "italic 100 48px / 49px Helvetica Neue" +PASS document.getElementById('test16').style.font is "italic 100 48px / 49px Helvetica Neue" +PASS document.getElementById('test17').style.font is "100 48px / 49px Helvetica Neue" +PASS document.getElementById('test18').style.font is "italic 48px / 49px Helvetica Neue" +PASS document.getElementById('test19').style.font is "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue" PASS document.getElementById('test20').style.font is "" -PASS document.getElementById('test21').style.font is "oblique 14deg small-caps 123 extra-expanded 48px / 49px \"Helvetica Neue\"" +PASS document.getElementById('test21').style.font is "oblique 14deg small-caps 123 extra-expanded 48px / 49px Helvetica Neue" PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/fast/text/font-style-parse.html b/LayoutTests/fast/text/font-style-parse.html index 1868728df071..a8e010b6b027 100644 --- a/LayoutTests/fast/text/font-style-parse.html +++ b/LayoutTests/fast/text/font-style-parse.html @@ -66,23 +66,23 @@ shouldBeEqualToString("getComputedStyle(document.getElementById('test12')).font", "16px / 18px Times"); shouldBeEqualToString("getComputedStyle(document.getElementById('test13')).font", "16px / 18px Times"); shouldBeEqualToString("getComputedStyle(document.getElementById('test14')).font", ""); -shouldBeEqualToString("getComputedStyle(document.getElementById('test15')).font", `italic 100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test16')).font", `italic 100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test17')).font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test18')).font", `italic 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("getComputedStyle(document.getElementById('test19')).font", `italic small-caps 100 extra-expanded 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("getComputedStyle(document.getElementById('test15')).font", "italic 100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test16')).font", "italic 100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test17')).font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test18')).font", "italic 48px / 49px Helvetica Neue"); +shouldBeEqualToString("getComputedStyle(document.getElementById('test19')).font", "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue"); shouldBeEqualToString("getComputedStyle(document.getElementById('test20')).font", "16px / 18px Times"); -shouldBeEqualToString("getComputedStyle(document.getElementById('test21')).font", `oblique small-caps 123 extra-expanded 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("getComputedStyle(document.getElementById('test21')).font", "oblique small-caps 123 extra-expanded 48px / 49px Helvetica Neue"); shouldBeEqualToString("getComputedStyle(document.getElementById('test22')).font", ""); shouldBeEqualToString("document.getElementById('test1').style.font", ""); -shouldBeEqualToString("document.getElementById('test15').style.font", `italic 100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test16').style.font", `italic 100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test17').style.font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test18').style.font", `italic 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test19').style.font", `italic small-caps 100 extra-expanded 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("document.getElementById('test15').style.font", "italic 100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test16').style.font", "italic 100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test17').style.font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test18').style.font", "italic 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test19').style.font", "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue"); shouldBeEqualToString("document.getElementById('test20').style.font", ""); -shouldBeEqualToString("document.getElementById('test21').style.font", `oblique 14deg small-caps 123 extra-expanded 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("document.getElementById('test21').style.font", "oblique 14deg small-caps 123 extra-expanded 48px / 49px Helvetica Neue"); diff --git a/LayoutTests/fast/text/font-weight-parse-expected.txt b/LayoutTests/fast/text/font-weight-parse-expected.txt index 4b5592f58e64..8ced984985d9 100644 --- a/LayoutTests/fast/text/font-weight-parse-expected.txt +++ b/LayoutTests/fast/text/font-weight-parse-expected.txt @@ -45,24 +45,24 @@ PASS window.getComputedStyle(document.getElementById('test15')).font is "16px / PASS window.getComputedStyle(document.getElementById('test16')).font is "7 16px / 18px Times" PASS window.getComputedStyle(document.getElementById('test17')).font is "300 16px / 18px Times" PASS window.getComputedStyle(document.getElementById('test18')).font is "200 16px / 18px Times" -PASS window.getComputedStyle(document.getElementById('test19')).font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS window.getComputedStyle(document.getElementById('test20')).font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS window.getComputedStyle(document.getElementById('test21')).font is "extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS window.getComputedStyle(document.getElementById('test22')).font is "100 48px / 49px \"Helvetica Neue\"" -PASS window.getComputedStyle(document.getElementById('test23')).font is "italic small-caps 100 extra-expanded 48px / 49px \"Helvetica Neue\"" -FAIL window.getComputedStyle(document.getElementById('test24')).font should be 123 48px / 49px "Helvetica Neue". Was italic small-caps 123 extra-expanded 48px / 49px "Helvetica Neue". +PASS window.getComputedStyle(document.getElementById('test19')).font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS window.getComputedStyle(document.getElementById('test20')).font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS window.getComputedStyle(document.getElementById('test21')).font is "extra-condensed 48px / 49px Helvetica Neue" +PASS window.getComputedStyle(document.getElementById('test22')).font is "100 48px / 49px Helvetica Neue" +PASS window.getComputedStyle(document.getElementById('test23')).font is "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue" +FAIL window.getComputedStyle(document.getElementById('test24')).font should be 123 48px / 49px Helvetica Neue. Was italic small-caps 123 extra-expanded 48px / 49px Helvetica Neue. PASS window.getComputedStyle(document.getElementById('test25')).font is "16px / 18px Times" PASS window.getComputedStyle(document.getElementById('test26')).font is "16px / 18px Times" PASS window.getComputedStyle(document.getElementById('test27')).font is "16px / 18px Times" PASS window.getComputedStyle(document.getElementById('test28')).font is "1 16px / 18px Times" PASS window.getComputedStyle(document.getElementById('test29')).font is "1000 16px / 18px Times" PASS document.getElementById('test1').style.font is "" -PASS document.getElementById('test19').style.font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test20').style.font is "100 extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test21').style.font is "extra-condensed 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test22').style.font is "100 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test23').style.font is "italic small-caps 100 extra-expanded 48px / 49px \"Helvetica Neue\"" -PASS document.getElementById('test24').style.font is "italic small-caps 123 extra-expanded 48px / 49px \"Helvetica Neue\"" +PASS document.getElementById('test19').style.font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS document.getElementById('test20').style.font is "100 extra-condensed 48px / 49px Helvetica Neue" +PASS document.getElementById('test21').style.font is "extra-condensed 48px / 49px Helvetica Neue" +PASS document.getElementById('test22').style.font is "100 48px / 49px Helvetica Neue" +PASS document.getElementById('test23').style.font is "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue" +PASS document.getElementById('test24').style.font is "italic small-caps 123 extra-expanded 48px / 49px Helvetica Neue" PASS successfullyParsed is true Some tests failed. diff --git a/LayoutTests/fast/text/font-weight-parse.html b/LayoutTests/fast/text/font-weight-parse.html index 5478aa82338d..84ab6c7173c0 100644 --- a/LayoutTests/fast/text/font-weight-parse.html +++ b/LayoutTests/fast/text/font-weight-parse.html @@ -84,12 +84,12 @@ shouldBeEqualToString("window.getComputedStyle(document.getElementById('test16')).font", "7 16px / 18px Times"); shouldBeEqualToString("window.getComputedStyle(document.getElementById('test17')).font", "300 16px / 18px Times"); shouldBeEqualToString("window.getComputedStyle(document.getElementById('test18')).font", "200 16px / 18px Times"); -shouldBeEqualToString("window.getComputedStyle(document.getElementById('test19')).font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("window.getComputedStyle(document.getElementById('test20')).font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("window.getComputedStyle(document.getElementById('test21')).font", `extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("window.getComputedStyle(document.getElementById('test22')).font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("window.getComputedStyle(document.getElementById('test23')).font", `italic small-caps 100 extra-expanded 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("window.getComputedStyle(document.getElementById('test24')).font", `123 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("window.getComputedStyle(document.getElementById('test19')).font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("window.getComputedStyle(document.getElementById('test20')).font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("window.getComputedStyle(document.getElementById('test21')).font", "extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("window.getComputedStyle(document.getElementById('test22')).font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("window.getComputedStyle(document.getElementById('test23')).font", "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue"); +shouldBeEqualToString("window.getComputedStyle(document.getElementById('test24')).font", "123 48px / 49px Helvetica Neue"); shouldBeEqualToString("window.getComputedStyle(document.getElementById('test25')).font", "16px / 18px Times"); shouldBeEqualToString("window.getComputedStyle(document.getElementById('test26')).font", "16px / 18px Times"); shouldBeEqualToString("window.getComputedStyle(document.getElementById('test27')).font", "16px / 18px Times"); @@ -97,12 +97,12 @@ shouldBeEqualToString("window.getComputedStyle(document.getElementById('test29')).font", "1000 16px / 18px Times"); shouldBeEqualToString("document.getElementById('test1').style.font", ""); -shouldBeEqualToString("document.getElementById('test19').style.font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test20').style.font", `100 extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test21').style.font", `extra-condensed 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test22').style.font", `100 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test23').style.font", `italic small-caps 100 extra-expanded 48px / 49px "Helvetica Neue"`); -shouldBeEqualToString("document.getElementById('test24').style.font", `italic small-caps 123 extra-expanded 48px / 49px "Helvetica Neue"`); +shouldBeEqualToString("document.getElementById('test19').style.font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test20').style.font", "100 extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test21').style.font", "extra-condensed 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test22').style.font", "100 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test23').style.font", "italic small-caps 100 extra-expanded 48px / 49px Helvetica Neue"); +shouldBeEqualToString("document.getElementById('test24').style.font", "italic small-caps 123 extra-expanded 48px / 49px Helvetica Neue"); diff --git a/LayoutTests/http/tests/cache/partitioned-cache-iframe.html b/LayoutTests/http/tests/cache/partitioned-cache-iframe.html index 402e582775ce..e7394da263e6 100644 --- a/LayoutTests/http/tests/cache/partitioned-cache-iframe.html +++ b/LayoutTests/http/tests/cache/partitioned-cache-iframe.html @@ -1,10 +1,10 @@ + diff --git a/LayoutTests/http/tests/css/filters-on-iframes-transform.html b/LayoutTests/http/tests/css/filters-on-iframes-transform.html index bd0867be6af2..e20b1842133c 100644 --- a/LayoutTests/http/tests/css/filters-on-iframes-transform.html +++ b/LayoutTests/http/tests/css/filters-on-iframes-transform.html @@ -32,13 +32,13 @@

Cross origin with transform (must have http server running)

- +
- +
diff --git a/LayoutTests/http/tests/css/filters-on-iframes.html b/LayoutTests/http/tests/css/filters-on-iframes.html index 020f5acdb8ff..42b21e65a1c5 100644 --- a/LayoutTests/http/tests/css/filters-on-iframes.html +++ b/LayoutTests/http/tests/css/filters-on-iframes.html @@ -32,11 +32,11 @@

Cross origin (must have http server running)

- +
- +

diff --git a/LayoutTests/http/tests/css/resources/references-external-green.html b/LayoutTests/http/tests/css/resources/references-external-green.html index 926522d407af..6a0c4edb5831 100644 --- a/LayoutTests/http/tests/css/resources/references-external-green.html +++ b/LayoutTests/http/tests/css/resources/references-external-green.html @@ -8,4 +8,4 @@ border: none; } - + diff --git a/LayoutTests/http/tests/css/resources/references-external-red.html b/LayoutTests/http/tests/css/resources/references-external-red.html index dd6ec1219e6f..e1f6b5304c41 100644 --- a/LayoutTests/http/tests/css/resources/references-external-red.html +++ b/LayoutTests/http/tests/css/resources/references-external-red.html @@ -8,4 +8,4 @@ border: none; } - + diff --git a/LayoutTests/http/tests/navigation/page-cache-pending-image-load-cache-partition.html b/LayoutTests/http/tests/navigation/page-cache-pending-image-load-cache-partition.html index 8ab6b20dd03a..4e86f0cf380c 100644 --- a/LayoutTests/http/tests/navigation/page-cache-pending-image-load-cache-partition.html +++ b/LayoutTests/http/tests/navigation/page-cache-pending-image-load-cache-partition.html @@ -1,4 +1,4 @@ - + @@ -6,7 +6,6 @@ + + + + + + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed-expected.txt index 3bf829ab74cd..7ecd7ee4f04b 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed-expected.txt @@ -1,2 +1,2 @@ -ALERT: Pass +ALERT: manifest fetch success: true diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed.html b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed.html index ef5e10aedb80..4426e163d7de 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed.html +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-allowed.html @@ -4,9 +4,10 @@ if (window.testRunner) { testRunner.dumpAsText(); testRunner.waitUntilDone(); - testRunner.getApplicationManifestThen(function() { - alert("Pass"); + (async () => { + const success = await testRunner.getApplicationManifest(); + alert("manifest fetch success: " + success); testRunner.notifyDone(); - }); + })(); } diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked-expected.txt index 2f651c6d8ec7..97eae748afb2 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked-expected.txt @@ -1,3 +1,3 @@ CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy/manifest.test/manifest.json because it does not appear in the manifest-src directive of the Content Security Policy. -ALERT: Pass +ALERT: manifest fetch success: false diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked.html b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked.html index 2cd230236a41..33b4f65d955a 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked.html +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/manifest-src-blocked.html @@ -8,9 +8,10 @@ diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/path-traversal-bypass-with-percent-encoding-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/path-traversal-bypass-with-percent-encoding-expected.txt new file mode 100644 index 000000000000..e19cf81f3d67 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/path-traversal-bypass-with-percent-encoding-expected.txt @@ -0,0 +1,44 @@ +CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy/resources%2F..%2F..%2Fresources/script.js because it does not appear in the script-src directive of the Content Security Policy. +CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy%2F..%2Fresources/script.js because it does not appear in the script-src directive of the Content Security Policy. +CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy%2f..%2fresources/script.js because it does not appear in the script-src directive of the Content Security Policy. +CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy/resources%2f..%2F..%2Fresources/script.js because it does not appear in the script-src directive of the Content Security Policy. +CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy/resources%2F..%2F..%2F..%2F..%2Fresources/script.js because it does not appear in the script-src directive of the Content Security Policy. +CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security%2F..%2F..%2F..%2F..%2Fetc/script.js because it does not appear in the script-src directive of the Content Security Policy. +Percent-encoded path traversal sequences (%2F..%2F) should not bypass CSP path restrictions. + + + +-------- +Frame: '' +-------- +PASS + +-------- +Frame: '' +-------- +PASS + +-------- +Frame: '' +-------- +PASS + +-------- +Frame: '' +-------- +PASS + +-------- +Frame: '' +-------- +PASS + +-------- +Frame: '' +-------- +PASS + +-------- +Frame: '' +-------- +PASS diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/path-traversal-bypass-with-percent-encoding.html b/LayoutTests/http/tests/security/contentSecurityPolicy/path-traversal-bypass-with-percent-encoding.html new file mode 100644 index 000000000000..f5df984d9787 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/path-traversal-bypass-with-percent-encoding.html @@ -0,0 +1,35 @@ + + + + + + + +

+ Percent-encoded path traversal sequences (%2F..%2F) should not bypass CSP path restrictions. +

+ + diff --git a/LayoutTests/http/tests/security/credentials-iframes.html b/LayoutTests/http/tests/security/credentials-iframes.html index 6e881cba0c08..bc6fe9bb73ab 100644 --- a/LayoutTests/http/tests/security/credentials-iframes.html +++ b/LayoutTests/http/tests/security/credentials-iframes.html @@ -1,8 +1,8 @@ + diff --git a/LayoutTests/http/tests/security/cross-origin-blob-transfer-expected.txt b/LayoutTests/http/tests/security/cross-origin-blob-transfer-expected.txt index 364f2ed4458d..2c8c5f54fecc 100644 --- a/LayoutTests/http/tests/security/cross-origin-blob-transfer-expected.txt +++ b/LayoutTests/http/tests/security/cross-origin-blob-transfer-expected.txt @@ -1,17 +1,4 @@ -PASS successfullyParsed is true -TEST COMPLETE -Summary - -Harness status: OK - -Found 1 tests - -1 Pass -Details - -Result Test Name Message -Pass Test for creating blob in iframe and then transferring it cross-origin. -Asserts run +PASS Test for creating blob in iframe and then transferring it cross-origin. diff --git a/LayoutTests/http/tests/security/cross-origin-blob-transfer.html b/LayoutTests/http/tests/security/cross-origin-blob-transfer.html index 15f5feb3a280..ba32daf9ce82 100644 --- a/LayoutTests/http/tests/security/cross-origin-blob-transfer.html +++ b/LayoutTests/http/tests/security/cross-origin-blob-transfer.html @@ -1,29 +1,20 @@ - + - - + + - - diff --git a/LayoutTests/http/tests/security/cross-origin-iframe-fetch-after-crash-expected.txt b/LayoutTests/http/tests/security/cross-origin-iframe-fetch-after-crash-expected.txt new file mode 100644 index 000000000000..a6dce6f6efcf --- /dev/null +++ b/LayoutTests/http/tests/security/cross-origin-iframe-fetch-after-crash-expected.txt @@ -0,0 +1,5 @@ +Tests that a cross-origin iframe can still perform fetches after the network process crashes and restarts. + +Cross-origin iframe fetch succeeded before network process crash. +PASS: Cross-origin iframe fetch succeeded after network process crash. + diff --git a/LayoutTests/http/tests/security/cross-origin-iframe-fetch-after-crash.html b/LayoutTests/http/tests/security/cross-origin-iframe-fetch-after-crash.html new file mode 100644 index 000000000000..221052a94365 --- /dev/null +++ b/LayoutTests/http/tests/security/cross-origin-iframe-fetch-after-crash.html @@ -0,0 +1,49 @@ + + + +Cross-origin iframe works after network process crash + + + +

Tests that a cross-origin iframe can still perform fetches after the network process crashes and restarts.

+

+
+
+
diff --git a/LayoutTests/http/tests/security/cross-origin-indexeddb-expected.txt b/LayoutTests/http/tests/security/cross-origin-indexeddb-expected.txt
index cc4d1a34d715..ca3cdbcc0808 100644
--- a/LayoutTests/http/tests/security/cross-origin-indexeddb-expected.txt
+++ b/LayoutTests/http/tests/security/cross-origin-indexeddb-expected.txt
@@ -1,17 +1,5 @@
-Both frames can successfully open the database.
+Tests that when the storage blocking policy is BlockThirdParty, IndexedDB opened by a third-party iframe is transient.
 
-
-
---------
-Frame: ''
---------
-Successfully called window.indexedDB.deleteDatabase().
-Successfully called window.indexedDB.open().
-
-
---------
-Frame: ''
---------
-Successfully called window.indexedDB.deleteDatabase().
-Successfully called window.indexedDB.open().
+Third-party iframe stored data in IndexedDB; terminating network process.
+PASS: Third-party IndexedDB did not persist across network process restart.
 
diff --git a/LayoutTests/http/tests/security/cross-origin-indexeddb.html b/LayoutTests/http/tests/security/cross-origin-indexeddb.html
index d4aef0368e43..6c5a368253b5 100644
--- a/LayoutTests/http/tests/security/cross-origin-indexeddb.html
+++ b/LayoutTests/http/tests/security/cross-origin-indexeddb.html
@@ -1,24 +1,39 @@
+
 
 
 
-    
+function log(message) {
+    document.getElementById("output").textContent += message + "\n";
+}
+
+window.addEventListener("message", event => {
+    if (event.data === "stored") {
+        log("Third-party iframe stored data in IndexedDB; terminating network process.");
+        if (window.testRunner)
+            testRunner.terminateNetworkProcess();
+        return;
+    }
+    if (event.data === "TRANSIENT")
+        log("PASS: Third-party IndexedDB did not persist across network process restart.");
+    else if (event.data === "PERSISTENT")
+        log("FAIL: Third-party IndexedDB persisted across network process restart; BlockThirdParty was not enforced.");
+    else
+        log(event.data);
+    if (window.testRunner)
+        testRunner.notifyDone();
+});
+
 
 
-    

Both frames can successfully open the database.

- - +

Tests that when the storage blocking policy is BlockThirdParty, IndexedDB opened by a third-party iframe is transient.

+

+
 
 
diff --git a/LayoutTests/http/tests/security/cross-origin-local-storage-allowed.html b/LayoutTests/http/tests/security/cross-origin-local-storage-allowed.html
index d49a09939ed9..1b9b29e0705e 100644
--- a/LayoutTests/http/tests/security/cross-origin-local-storage-allowed.html
+++ b/LayoutTests/http/tests/security/cross-origin-local-storage-allowed.html
@@ -4,7 +4,6 @@
 if (window.testRunner) {
 	testRunner.dumpAsText();
 	testRunner.waitUntilDone();
-	internals.settings.setStorageBlockingPolicy('AllowAll');
 }
 
 function continueTest() {
diff --git a/LayoutTests/http/tests/security/cross-origin-local-storage.html b/LayoutTests/http/tests/security/cross-origin-local-storage.html
index 68b4496299b9..35f2a1bd2c18 100644
--- a/LayoutTests/http/tests/security/cross-origin-local-storage.html
+++ b/LayoutTests/http/tests/security/cross-origin-local-storage.html
@@ -1,10 +1,10 @@
+
 
 
 
 
 
 

This iframe should not return any errors:

- +

This iframe should not return any errors:

- + diff --git a/LayoutTests/http/tests/security/cross-origin-websql.html b/LayoutTests/http/tests/security/cross-origin-websql.html index b8957b91c688..ad524d17be0c 100644 --- a/LayoutTests/http/tests/security/cross-origin-websql.html +++ b/LayoutTests/http/tests/security/cross-origin-websql.html @@ -1,24 +1,17 @@ +

This iframe should return a security error:

- +

This iframe should not return any errors:

- + diff --git a/LayoutTests/http/tests/security/cross-origin-worker-indexeddb.html b/LayoutTests/http/tests/security/cross-origin-worker-indexeddb.html index abebbaa262b0..bb17e58a7c00 100644 --- a/LayoutTests/http/tests/security/cross-origin-worker-indexeddb.html +++ b/LayoutTests/http/tests/security/cross-origin-worker-indexeddb.html @@ -1,3 +1,4 @@ + @@ -8,7 +9,6 @@ testRunner.dumpAsText(); testRunner.dumpChildFramesAsText(); testRunner.waitUntilDone(); - internals.settings.setStorageBlockingPolicy('BlockThirdParty'); } document.location = "resources/document-for-cross-origin-worker-indexeddb.html" diff --git a/LayoutTests/http/tests/security/history-pushState-replaceState-from-sandboxed-iframe-expected.txt b/LayoutTests/http/tests/security/history-pushState-replaceState-from-sandboxed-iframe-expected.txt index 5fbc936bde75..104054ccbc40 100644 --- a/LayoutTests/http/tests/security/history-pushState-replaceState-from-sandboxed-iframe-expected.txt +++ b/LayoutTests/http/tests/security/history-pushState-replaceState-from-sandboxed-iframe-expected.txt @@ -10,12 +10,12 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE PASS window.history.replaceState(null, "New title", location.href) did not throw exception. PASS window.history.pushState(null, "New title", location.href) did not throw exception. -PASS window.history.replaceState(null, "New title", completeURL("")) did not throw exception. -PASS window.history.pushState(null, "New title", completeURL("")) did not throw exception. -PASS window.history.replaceState(null, "New title", completeURL("dummy")) did not throw exception. -PASS window.history.pushState(null, "New title", completeURL("dummy")) did not throw exception. -PASS window.history.replaceState(null, "New title", completeURL("", "dummy")) did not throw exception. -PASS window.history.pushState(null, "New title", completeURL("", "dummy")) did not throw exception. +PASS window.history.replaceState(null, "New title", completeURL("")) threw exception SecurityError: Blocked attempt to use history.replaceState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/. Paths and fragments must match for a sandboxed document.. +PASS window.history.pushState(null, "New title", completeURL("")) threw exception SecurityError: Blocked attempt to use history.pushState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/. Paths and fragments must match for a sandboxed document.. +PASS window.history.replaceState(null, "New title", completeURL("dummy")) threw exception SecurityError: Blocked attempt to use history.replaceState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/dummy. Paths and fragments must match for a sandboxed document.. +PASS window.history.pushState(null, "New title", completeURL("dummy")) threw exception SecurityError: Blocked attempt to use history.pushState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/dummy. Paths and fragments must match for a sandboxed document.. +PASS window.history.replaceState(null, "New title", completeURL("", "dummy")) threw exception SecurityError: Blocked attempt to use history.replaceState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/?dummy. Paths and fragments must match for a sandboxed document.. +PASS window.history.pushState(null, "New title", completeURL("", "dummy")) threw exception SecurityError: Blocked attempt to use history.pushState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/?dummy. Paths and fragments must match for a sandboxed document.. PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/http/tests/security/resources/cross-origin-iframe-fetch-after-crash-iframe.html b/LayoutTests/http/tests/security/resources/cross-origin-iframe-fetch-after-crash-iframe.html new file mode 100644 index 000000000000..98b49b5e4fd4 --- /dev/null +++ b/LayoutTests/http/tests/security/resources/cross-origin-iframe-fetch-after-crash-iframe.html @@ -0,0 +1,22 @@ + + diff --git a/LayoutTests/http/tests/security/resources/cross-origin-iframe-for-indexeddb-transience.html b/LayoutTests/http/tests/security/resources/cross-origin-iframe-for-indexeddb-transience.html new file mode 100644 index 000000000000..afe1660ade0f --- /dev/null +++ b/LayoutTests/http/tests/security/resources/cross-origin-iframe-for-indexeddb-transience.html @@ -0,0 +1,37 @@ + + diff --git a/LayoutTests/http/tests/security/resources/document-for-cross-origin-worker-indexeddb.html b/LayoutTests/http/tests/security/resources/document-for-cross-origin-worker-indexeddb.html index 6ae81d5a522e..db62a8a9ca81 100644 --- a/LayoutTests/http/tests/security/resources/document-for-cross-origin-worker-indexeddb.html +++ b/LayoutTests/http/tests/security/resources/document-for-cross-origin-worker-indexeddb.html @@ -6,10 +6,8 @@ function decrement() { --frames; - if (!frames && window.testRunner) { - internals.settings.setStorageBlockingPolicy('AllowAll'); + if (!frames && window.testRunner) testRunner.notifyDone(); - } } window.onmessage = decrement; diff --git a/LayoutTests/http/tests/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html b/LayoutTests/http/tests/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html index 1f6213335484..2b0d641915b0 100644 --- a/LayoutTests/http/tests/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html +++ b/LayoutTests/http/tests/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html @@ -18,17 +18,17 @@ shouldNotThrow('window.history.replaceState(null, "New title", location.href)'); shouldNotThrow('window.history.pushState(null, "New title", location.href)'); -shouldNotThrow('window.history.replaceState(null, "New title", completeURL(""))'); +shouldThrow('window.history.replaceState(null, "New title", completeURL(""))', "'SecurityError: Blocked attempt to use history.replaceState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/. Paths and fragments must match for a sandboxed document.'"); -shouldNotThrow('window.history.pushState(null, "New title", completeURL(""))'); +shouldThrow('window.history.pushState(null, "New title", completeURL(""))', "'SecurityError: Blocked attempt to use history.pushState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/. Paths and fragments must match for a sandboxed document.'"); -shouldNotThrow('window.history.replaceState(null, "New title", completeURL("dummy"))'); +shouldThrow('window.history.replaceState(null, "New title", completeURL("dummy"))', "'SecurityError: Blocked attempt to use history.replaceState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/dummy. Paths and fragments must match for a sandboxed document.'"); -shouldNotThrow('window.history.pushState(null, "New title", completeURL("dummy"))'); +shouldThrow('window.history.pushState(null, "New title", completeURL("dummy"))', "'SecurityError: Blocked attempt to use history.pushState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/dummy. Paths and fragments must match for a sandboxed document.'"); -shouldNotThrow('window.history.replaceState(null, "New title", completeURL("", "dummy"))'); +shouldThrow('window.history.replaceState(null, "New title", completeURL("", "dummy"))', "'SecurityError: Blocked attempt to use history.replaceState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/?dummy. Paths and fragments must match for a sandboxed document.'"); -shouldNotThrow('window.history.pushState(null, "New title", completeURL("", "dummy"))'); +shouldThrow('window.history.pushState(null, "New title", completeURL("", "dummy"))', "'SecurityError: Blocked attempt to use history.pushState() to change session history URL from http://127.0.0.1:8000/security/resources/history-pushState-replaceState-from-sandboxed-iframe.html to http://127.0.0.1:8000/?dummy. Paths and fragments must match for a sandboxed document.'"); diff --git a/LayoutTests/http/tests/security/resources/load-local-storage.html b/LayoutTests/http/tests/security/resources/load-local-storage.html index c08087f2e4bd..68ad6dac8081 100644 --- a/LayoutTests/http/tests/security/resources/load-local-storage.html +++ b/LayoutTests/http/tests/security/resources/load-local-storage.html @@ -15,7 +15,6 @@ } if (window.testRunner) { - internals.settings.setStorageBlockingPolicy('AllowAll'); testRunner.notifyDone(); } diff --git a/LayoutTests/http/tests/security/same-origin-document-domain-storage-allowed.html b/LayoutTests/http/tests/security/same-origin-document-domain-storage-allowed.html index 5ad83499e40f..44d99ab7cb56 100644 --- a/LayoutTests/http/tests/security/same-origin-document-domain-storage-allowed.html +++ b/LayoutTests/http/tests/security/same-origin-document-domain-storage-allowed.html @@ -1,24 +1,17 @@ +

This iframe should not return any errors:

- +

This iframe should not return any errors:

- + diff --git a/LayoutTests/http/tests/security/same-origin-storage-blocked.html b/LayoutTests/http/tests/security/same-origin-storage-blocked.html index 942a9a155d59..e71662a1e73d 100644 --- a/LayoutTests/http/tests/security/same-origin-storage-blocked.html +++ b/LayoutTests/http/tests/security/same-origin-storage-blocked.html @@ -1,24 +1,17 @@ +

This iframe should return a security error:

- +

This iframe should return a security error:

- + diff --git a/LayoutTests/http/tests/security/same-origin-websql-blocked.html b/LayoutTests/http/tests/security/same-origin-websql-blocked.html index 149085d271f6..47be8f2ecef4 100644 --- a/LayoutTests/http/tests/security/same-origin-websql-blocked.html +++ b/LayoutTests/http/tests/security/same-origin-websql-blocked.html @@ -1,22 +1,15 @@ +

This iframe should return a security error:

- + diff --git a/LayoutTests/http/tests/security/sync-xhr-partition.html b/LayoutTests/http/tests/security/sync-xhr-partition.html index 595fa3af7b18..2735f7c423e5 100644 --- a/LayoutTests/http/tests/security/sync-xhr-partition.html +++ b/LayoutTests/http/tests/security/sync-xhr-partition.html @@ -1,8 +1,8 @@ + + + + + +

Test that network request IDs from fetches in different cross-origin iframes are unique and do not collide.

+ diff --git a/LayoutTests/http/tests/site-isolation/open-panel-in-cross-origin-iframe-expected.txt b/LayoutTests/http/tests/site-isolation/open-panel-in-cross-origin-iframe-expected.txt new file mode 100644 index 000000000000..2f2ab8b9238d --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/open-panel-in-cross-origin-iframe-expected.txt @@ -0,0 +1,11 @@ +OPEN FILE PANEL +Tests that choosing a file in a cross-origin routes the open-panel reply to the iframe's WebContent process when site isolation is enabled. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS chosenFile is "foo.txt" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/site-isolation/open-panel-in-cross-origin-iframe.html b/LayoutTests/http/tests/site-isolation/open-panel-in-cross-origin-iframe.html new file mode 100644 index 000000000000..8418f1234d7d --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/open-panel-in-cross-origin-iframe.html @@ -0,0 +1,47 @@ + + + + + + + + + + + diff --git a/LayoutTests/http/tests/site-isolation/resources/file-input-iframe.html b/LayoutTests/http/tests/site-isolation/resources/file-input-iframe.html new file mode 100644 index 000000000000..000ca15ee79a --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/resources/file-input-iframe.html @@ -0,0 +1,27 @@ + + + + + + + diff --git a/LayoutTests/http/tests/site-isolation/resources/validation-message-iframe.html b/LayoutTests/http/tests/site-isolation/resources/validation-message-iframe.html new file mode 100644 index 000000000000..92053ea84055 --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/resources/validation-message-iframe.html @@ -0,0 +1,38 @@ + + + + + + +
+ + +
+ + + diff --git a/LayoutTests/http/tests/site-isolation/validation-message-cross-origin-iframe-expected.txt b/LayoutTests/http/tests/site-isolation/validation-message-cross-origin-iframe-expected.txt new file mode 100644 index 000000000000..c36f804da8f1 --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/validation-message-cross-origin-iframe-expected.txt @@ -0,0 +1,14 @@ +Test that validation bubble anchor rect is in main-frame coordinates for cross-origin iframes. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS bubbleMessage is "Fill out this field" +PASS anchorX is 150 +PASS anchorY is 130 +PASS anchorWidth is 200 +PASS anchorHeight is 30 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/site-isolation/validation-message-cross-origin-iframe.html b/LayoutTests/http/tests/site-isolation/validation-message-cross-origin-iframe.html new file mode 100644 index 000000000000..4178ab0ad49d --- /dev/null +++ b/LayoutTests/http/tests/site-isolation/validation-message-cross-origin-iframe.html @@ -0,0 +1,72 @@ + + + + + + + + + + + + + diff --git a/LayoutTests/http/tests/ssl/media-stream/resources/get-user-media-frame.html b/LayoutTests/http/tests/ssl/media-stream/resources/get-user-media-frame.html index 6d16c09ea8ba..113393c1f6c1 100644 --- a/LayoutTests/http/tests/ssl/media-stream/resources/get-user-media-frame.html +++ b/LayoutTests/http/tests/ssl/media-stream/resources/get-user-media-frame.html @@ -38,7 +38,7 @@ if (window.testRunner) testRunner.notifyDone(); if (stream) - stream.srcObject.getTracks().forEach(t => t.stop()); + stream.getTracks().forEach(t => t.stop()); } debug(`URL: ${window.location.href}`); diff --git a/LayoutTests/http/tests/webgpu/webgpu/shader/validation/expression/binary/short_circuiting_and_or-expected.txt b/LayoutTests/http/tests/webgpu/webgpu/shader/validation/expression/binary/short_circuiting_and_or-expected.txt index e3a9171eb5d3..b324ace5da7d 100644 --- a/LayoutTests/http/tests/webgpu/webgpu/shader/validation/expression/binary/short_circuiting_and_or-expected.txt +++ b/LayoutTests/http/tests/webgpu/webgpu/shader/validation/expression/binary/short_circuiting_and_or-expected.txt @@ -811,326 +811,70 @@ PASS :invalid_types:op="%7C%7C";type="sampler";control=true PASS :invalid_types:op="%7C%7C";type="sampler";control=false PASS :invalid_types:op="%7C%7C";type="struct";control=true PASS :invalid_types:op="%7C%7C";type="struct";control=false -FAIL :invalid_rhs_const:op="%26%26";rhs="overflow";short_circuit=true assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 8:22: error: value 2147483648 cannot be represented as 'i32' - - ---- shader ---- - - const thirty_one = 31u; - const zero_i32 = 0i; - const one_f32 = 1.0f; - - @compute @workgroup_size(1) - fn main() { - let foo = false && i32(1< binding_array : i32; - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 1:13: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :module_var_name:ident="binding_array" PASS :module_var_name:ident="bf16" PASS :module_var_name:ident="bitcast" PASS :module_var_name:ident="f32" @@ -197,32 +186,8 @@ PASS :module_var_name:ident="nil" PASS :module_var_name:ident="noexcept" PASS :module_var_name:ident="noinline" PASS :module_var_name:ident="nointerpolation" -FAIL :module_var_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - var non_coherent : i32; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :module_var_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - var noncoherent : i32; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :module_var_name:ident="non_coherent" +PASS :module_var_name:ident="noncoherent" PASS :module_var_name:ident="noperspective" PASS :module_var_name:ident="null" PASS :module_var_name:ident="nullptr" @@ -308,18 +273,7 @@ PASS :module_const_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :module_const_name:ident="array" PASS :module_const_name:ident="atomic" PASS :module_const_name:ident="bool" -FAIL :module_const_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 1:7: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - const binding_array : i32 = 0; - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 1:6: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :module_const_name:ident="binding_array" PASS :module_const_name:ident="bf16" PASS :module_const_name:ident="bitcast" PASS :module_const_name:ident="f32" @@ -486,32 +440,8 @@ PASS :module_const_name:ident="nil" PASS :module_const_name:ident="noexcept" PASS :module_const_name:ident="noinline" PASS :module_const_name:ident="nointerpolation" -FAIL :module_const_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - const non_coherent : i32 = 0; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :module_const_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - const noncoherent : i32 = 0; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :module_const_name:ident="non_coherent" +PASS :module_const_name:ident="noncoherent" PASS :module_const_name:ident="noperspective" PASS :module_const_name:ident="null" PASS :module_const_name:ident="nullptr" @@ -597,18 +527,7 @@ PASS :override_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :override_name:ident="array" PASS :override_name:ident="atomic" PASS :override_name:ident="bool" -FAIL :override_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 1:10: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - override binding_array : i32 = 0; - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 1:9: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :override_name:ident="binding_array" PASS :override_name:ident="bf16" PASS :override_name:ident="bitcast" PASS :override_name:ident="f32" @@ -775,32 +694,8 @@ PASS :override_name:ident="nil" PASS :override_name:ident="noexcept" PASS :override_name:ident="noinline" PASS :override_name:ident="nointerpolation" -FAIL :override_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - override non_coherent : i32 = 0; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :override_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - override noncoherent : i32 = 0; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :override_name:ident="non_coherent" +PASS :override_name:ident="noncoherent" PASS :override_name:ident="noperspective" PASS :override_name:ident="null" PASS :override_name:ident="nullptr" @@ -886,18 +781,7 @@ PASS :function_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :function_name:ident="array" PASS :function_name:ident="atomic" PASS :function_name:ident="bool" -FAIL :function_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 1:4: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - fn binding_array() {} - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 1:3: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :function_name:ident="binding_array" PASS :function_name:ident="bf16" PASS :function_name:ident="bitcast" PASS :function_name:ident="f32" @@ -1064,32 +948,8 @@ PASS :function_name:ident="nil" PASS :function_name:ident="noexcept" PASS :function_name:ident="noinline" PASS :function_name:ident="nointerpolation" -FAIL :function_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn non_coherent() {} - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :function_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn noncoherent() {} - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :function_name:ident="non_coherent" +PASS :function_name:ident="noncoherent" PASS :function_name:ident="noperspective" PASS :function_name:ident="null" PASS :function_name:ident="nullptr" @@ -1175,18 +1035,7 @@ PASS :struct_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :struct_name:ident="array" PASS :struct_name:ident="atomic" PASS :struct_name:ident="bool" -FAIL :struct_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 1:8: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - struct binding_array { i : i32 } - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 1:7: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :struct_name:ident="binding_array" PASS :struct_name:ident="bf16" PASS :struct_name:ident="bitcast" PASS :struct_name:ident="f32" @@ -1353,32 +1202,8 @@ PASS :struct_name:ident="nil" PASS :struct_name:ident="noexcept" PASS :struct_name:ident="noinline" PASS :struct_name:ident="nointerpolation" -FAIL :struct_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - struct non_coherent { i : i32 } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :struct_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - struct noncoherent { i : i32 } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :struct_name:ident="non_coherent" +PASS :struct_name:ident="noncoherent" PASS :struct_name:ident="noperspective" PASS :struct_name:ident="null" PASS :struct_name:ident="nullptr" @@ -1464,18 +1289,7 @@ PASS :alias_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :alias_name:ident="array" PASS :alias_name:ident="atomic" PASS :alias_name:ident="bool" -FAIL :alias_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 1:7: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - alias binding_array = i32; - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 1:6: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :alias_name:ident="binding_array" PASS :alias_name:ident="bf16" PASS :alias_name:ident="bitcast" PASS :alias_name:ident="f32" @@ -1642,32 +1456,8 @@ PASS :alias_name:ident="nil" PASS :alias_name:ident="noexcept" PASS :alias_name:ident="noinline" PASS :alias_name:ident="nointerpolation" -FAIL :alias_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - alias non_coherent = i32; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :alias_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - alias noncoherent = i32; - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :alias_name:ident="non_coherent" +PASS :alias_name:ident="noncoherent" PASS :alias_name:ident="noperspective" PASS :alias_name:ident="null" PASS :alias_name:ident="nullptr" @@ -1753,18 +1543,7 @@ PASS :function_param_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :function_param_name:ident="array" PASS :function_param_name:ident="atomic" PASS :function_param_name:ident="bool" -FAIL :function_param_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 1:6: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - fn F(binding_array : i32) {} - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 1:5: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :function_param_name:ident="binding_array" PASS :function_param_name:ident="bf16" PASS :function_param_name:ident="bitcast" PASS :function_param_name:ident="f32" @@ -1931,32 +1710,8 @@ PASS :function_param_name:ident="nil" PASS :function_param_name:ident="noexcept" PASS :function_param_name:ident="noinline" PASS :function_param_name:ident="nointerpolation" -FAIL :function_param_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F(non_coherent : i32) {} - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :function_param_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F(noncoherent : i32) {} - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :function_param_name:ident="non_coherent" +PASS :function_param_name:ident="noncoherent" PASS :function_param_name:ident="noperspective" PASS :function_param_name:ident="null" PASS :function_param_name:ident="nullptr" @@ -2042,20 +1797,7 @@ PASS :function_const_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :function_const_name:ident="array" PASS :function_const_name:ident="atomic" PASS :function_const_name:ident="bool" -FAIL :function_const_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 2:9: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - fn F() { - const binding_array = 1; - } - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 2:8: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :function_const_name:ident="binding_array" PASS :function_const_name:ident="bf16" PASS :function_const_name:ident="bitcast" PASS :function_const_name:ident="f32" @@ -2222,36 +1964,8 @@ PASS :function_const_name:ident="nil" PASS :function_const_name:ident="noexcept" PASS :function_const_name:ident="noinline" PASS :function_const_name:ident="nointerpolation" -FAIL :function_const_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F() { - const non_coherent = 1; - } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :function_const_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F() { - const noncoherent = 1; - } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :function_const_name:ident="non_coherent" +PASS :function_const_name:ident="noncoherent" PASS :function_const_name:ident="noperspective" PASS :function_const_name:ident="null" PASS :function_const_name:ident="nullptr" @@ -2337,20 +2051,7 @@ PASS :function_let_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :function_let_name:ident="array" PASS :function_let_name:ident="atomic" PASS :function_let_name:ident="bool" -FAIL :function_let_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 2:7: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - fn F() { - let binding_array = 1; - } - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 2:6: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :function_let_name:ident="binding_array" PASS :function_let_name:ident="bf16" PASS :function_let_name:ident="bitcast" PASS :function_let_name:ident="f32" @@ -2517,36 +2218,8 @@ PASS :function_let_name:ident="nil" PASS :function_let_name:ident="noexcept" PASS :function_let_name:ident="noinline" PASS :function_let_name:ident="nointerpolation" -FAIL :function_let_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F() { - let non_coherent = 1; - } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :function_let_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F() { - let noncoherent = 1; - } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :function_let_name:ident="non_coherent" +PASS :function_let_name:ident="noncoherent" PASS :function_let_name:ident="noperspective" PASS :function_let_name:ident="null" PASS :function_let_name:ident="nullptr" @@ -2632,20 +2305,7 @@ PASS :function_var_name:ident="%D6%83%D5%AB%D6%80%D5%B8%D6%82%D5%A6" PASS :function_var_name:ident="array" PASS :function_var_name:ident="atomic" PASS :function_var_name:ident="bool" -FAIL :function_var_name:ident="binding_array" assert_unreached: - - (in subcase: ) VALIDATION FAILED: Unexpected compilationInfo 'error' message. - 2:7: error: Expected a Identifier, but got a ReservedWord - - ---- shader ---- - fn F() { - var binding_array = 1; - } - at (elided: below max severity) - - (in subcase: ) INFO: subcase ran - - EXCEPTION: Error: Unexpected validation error occurred: 1 error generated while compiling the shader: - 2:6: Expected a Identifier, but got a ReservedWord - attemptEndTestScope@http://127.0.0.1:8000/webgpu/webgpu/util/device_pool.js:466:44 - Reached unreachable code +PASS :function_var_name:ident="binding_array" PASS :function_var_name:ident="bf16" PASS :function_var_name:ident="bitcast" PASS :function_var_name:ident="f32" @@ -2812,36 +2472,8 @@ PASS :function_var_name:ident="nil" PASS :function_var_name:ident="noexcept" PASS :function_var_name:ident="noinline" PASS :function_var_name:ident="nointerpolation" -FAIL :function_var_name:ident="non_coherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F() { - var non_coherent = 1; - } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code -FAIL :function_var_name:ident="noncoherent" assert_unreached: - - (in subcase: ) EXPECTATION FAILED: Expected validation error - at (elided: below max severity) - - (in subcase: ) VALIDATION FAILED: Missing expected compilationInfo 'error' message. - - - ---- shader ---- - fn F() { - var noncoherent = 1; - } - @http://127.0.0.1:8000/webgpu/webgpu/shader/validation/shader_validation_test.js:91:30 - async finalize@http://127.0.0.1:8000/webgpu/common/framework/fixture.js:128:16 - async runTest@http://127.0.0.1:8000/webgpu/common/internal/test_group.js:532:28 - - (in subcase: ) INFO: subcase ran - Reached unreachable code +PASS :function_var_name:ident="non_coherent" +PASS :function_var_name:ident="noncoherent" PASS :function_var_name:ident="noperspective" PASS :function_var_name:ident="null" PASS :function_var_name:ident="nullptr" diff --git a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub-expected.txt b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub-expected.txt index 765e578c8114..da7d3ddaba3c 100644 --- a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub-expected.txt +++ b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub-expected.txt @@ -1,3 +1 @@ -http://localhost:8800/WebKit/content-security-policy/sandbox-manifest-blocked-cross-origin.sub.html - didFinishLoading -http://not-web-platform.test:8800/WebKit/content-security-policy/manifest.json - didFailLoadingWithError: - +Fetched manifest: http://not-web-platform.test:8800/WebKit/content-security-policy/manifest.json, success: false diff --git a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub.html b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub.html index 0cea9f085abb..01aa6c159df9 100644 --- a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub.html +++ b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked-cross-origin.sub.html @@ -6,11 +6,12 @@ +
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 90868cb11166..9e272b81ac10 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,3 @@ 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 597d01c4e0ff..9a2d36bcd91c 100644 --- a/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked.html +++ b/LayoutTests/http/wpt/content-security-policy/sandbox-manifest-blocked.html @@ -5,9 +5,11 @@ testRunner?.dumpAsText(); testRunner?.dumpResourceLoadCallbacks(); testRunner?.waitUntilDone(); - testRunner?.getApplicationManifestThen(() => { + (async () => { + const success = await testRunner.getApplicationManifest(); const elem = document.querySelector("link"); - console.log(`Fetched manifest: ${elem.href}`); + outputdiv.innerHTML = `Fetched manifest: ${elem.href}, success: ${success}`; testRunner.notifyDone(); - }); + })(); +
diff --git a/LayoutTests/imported/w3c/resources/import-expectations.json b/LayoutTests/imported/w3c/resources/import-expectations.json index f13ce446e71c..a4d86e57e097 100644 --- a/LayoutTests/imported/w3c/resources/import-expectations.json +++ b/LayoutTests/imported/w3c/resources/import-expectations.json @@ -192,6 +192,7 @@ "web-platform-tests/generic-sensor": "skip", "web-platform-tests/geolocation": "import", "web-platform-tests/geolocation-sensor": "skip", + "web-platform-tests/gpc": "import", "web-platform-tests/graphics-aam": "skip", "web-platform-tests/graphics-aria": "import", "web-platform-tests/gyroscope": "skip", diff --git a/LayoutTests/imported/w3c/resources/resource-files.json b/LayoutTests/imported/w3c/resources/resource-files.json index e0cc312b7ed5..d05b30ee4482 100644 --- a/LayoutTests/imported/w3c/resources/resource-files.json +++ b/LayoutTests/imported/w3c/resources/resource-files.json @@ -9407,8 +9407,12 @@ "web-platform-tests/css/css-values/attr-in-slotted-ref.html", "web-platform-tests/css/css-values/attr-namespace-case-sensitivity-ref.xhtml", "web-platform-tests/css/css-values/attr-notype-fallback-ref.html", + "web-platform-tests/css/css-values/attr-pseudo-element-marker-ref.html", + "web-platform-tests/css/css-values/attr-pseudo-element-placeholder-ref.html", "web-platform-tests/css/css-values/attr-style-sharing-1-ref.html", "web-platform-tests/css/css-values/attr-style-sharing-2-ref.html", + "web-platform-tests/css/css-values/attr-style-sharing-4-ref.html", + "web-platform-tests/css/css-values/attr-style-sharing-5-ref.html", "web-platform-tests/css/css-values/calc-background-image-gradient-1-ref.html", "web-platform-tests/css/css-values/calc-background-linear-gradient-1-ref.html", "web-platform-tests/css/css-values/calc-background-position-1-ref.html", @@ -9441,6 +9445,7 @@ "web-platform-tests/css/css-values/calc-width-table-auto-1-ref.html", "web-platform-tests/css/css-values/calc-width-table-fixed-1-ref.html", "web-platform-tests/css/css-values/ex-calc-expression-001-ref.html", + "web-platform-tests/css/css-values/html-attr-case-insensitivity-ref.html", "web-platform-tests/css/css-values/inline-cache-base-uri-cssom-ref.html", "web-platform-tests/css/css-values/inline-cache-base-uri-ref.html", "web-platform-tests/css/css-values/inline-cache-base-uri/inner.html", @@ -9465,9 +9470,12 @@ "web-platform-tests/css/css-values/reference/ic-unit-012-ref.html", "web-platform-tests/css/css-values/reference/ic-unit-013-ref.html", "web-platform-tests/css/css-values/reference/ic-unit-014-ref.html", + "web-platform-tests/css/css-values/reference/ic-unit-016-ref.html", "web-platform-tests/css/css-values/reference/vh-support-atviewport-ref.htm", "web-platform-tests/css/css-values/reference/vh-update-and-transition-in-subframe-iframe-ref.html", "web-platform-tests/css/css-values/reference/vh-update-and-transition-in-subframe-ref.html", + "web-platform-tests/css/css-values/reference/viewport-page-print-no-ref.html", + "web-platform-tests/css/css-values/reference/viewport-page-print-ref.html", "web-platform-tests/css/css-values/reference/viewport-unit-011-ref.html", "web-platform-tests/css/css-values/rem-root-font-size-restyle-1-ref.html", "web-platform-tests/css/css-values/support/mixed-units-01.html", @@ -9484,8 +9492,8 @@ "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/urls/url-image-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", "web-platform-tests/css/css-values/viewport-units-001-print.html", "web-platform-tests/css/css-values/viewport-units-scrollbars-auto-ltr-001-ref.html", @@ -10347,6 +10355,7 @@ "web-platform-tests/css/cssom/CSSStyleSheet-constructable-concat-ref.html", "web-platform-tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri-ref.html", "web-platform-tests/css/cssom/HTMLLinkElement-disabled-alternate-ref.html", + "web-platform-tests/css/cssom/all-initial-csstext-ref.html", "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", diff --git a/LayoutTests/imported/w3c/web-platform-tests/beacon/beacon-url-encoding-euc-kr.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/beacon/beacon-url-encoding-euc-kr.https-expected.txt new file mode 100644 index 000000000000..e568328d4ad7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/beacon/beacon-url-encoding-euc-kr.https-expected.txt @@ -0,0 +1,3 @@ + +PASS beacon-url-encoding-euc-kr + diff --git a/LayoutTests/imported/w3c/web-platform-tests/beacon/beacon-url-encoding-euc-kr.https.html b/LayoutTests/imported/w3c/web-platform-tests/beacon/beacon-url-encoding-euc-kr.https.html new file mode 100644 index 000000000000..10ed72c41905 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/beacon/beacon-url-encoding-euc-kr.https.html @@ -0,0 +1,30 @@ + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/beacon/resources/url-echo.py b/LayoutTests/imported/w3c/web-platform-tests/beacon/resources/url-echo.py new file mode 100644 index 000000000000..363e84699a7f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/beacon/resources/url-echo.py @@ -0,0 +1,18 @@ +def main(request, response): + """Helper handler for testing the URL encoding used by sendBeacon(). + + The 'store' command stashes the request's raw (percent-encoded) query + string keyed by the 'id' UUID query parameter. The 'stat' command takes + that stashed string back out. + """ + cmd = request.GET.first(b"cmd") + id = request.GET.first(b"id") + + if cmd == b"store": + request.server.stash.put(id, request.url_parts.query) + elif cmd == b"stat": + stored = request.server.stash.take(id) + response.headers.set(b"Content-Type", b"text/plain") + response.content = stored.encode("ascii") if stored is not None else b"" + else: + response.status = 400 diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/META.yml b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/META.yml index 4534ab8abe24..f08fb7d1559e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/META.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/META.yml @@ -1,4 +1,3 @@ -spec: https://wicg.github.io/close-watcher/ +spec: https://html.spec.whatwg.org/multipage/#close-requests-and-close-watchers suggested_reviewers: - - domenic - natechapin diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/basic-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/basic-expected.txt index 39527e678c20..9250c57cb776 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/basic-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/basic-expected.txt @@ -1,8 +1,8 @@ -FAIL requestClose() with no user activation assert_array_equals: expected property 0 to be "cancel[cancelable=true]" but got "cancel[cancelable=false]" (expected array ["cancel[cancelable=true]", "close"] got ["cancel[cancelable=false]", "close"]) +PASS requestClose() with no user activation PASS destroy() then requestClose() PASS close() then requestClose() -FAIL requestClose() then destroy() assert_array_equals: expected property 0 to be "cancel[cancelable=true]" but got "cancel[cancelable=false]" (expected array ["cancel[cancelable=true]", "close"] got ["cancel[cancelable=false]", "close"]) +PASS requestClose() then destroy() PASS close() then destroy() PASS destroy() then close request PASS Close request then destroy() diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-nn.html b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-nn.html new file mode 100644 index 000000000000..b2da2d415a83 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-nn.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynn.html b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynn.html new file mode 100644 index 000000000000..3ab5b758684d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynn.html @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynyn.html b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynyn.html new file mode 100644 index 000000000000..e486fcb36828 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynyn.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/resources/dialog-prevents-close.html b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/resources/dialog-prevents-close.html new file mode 100644 index 000000000000..580e5220dae2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/resources/dialog-prevents-close.html @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/resources/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/resources/w3c-import.log new file mode 100644 index 000000000000..15f8dca2d507 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/resources/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/close-watcher/iframes/resources/dialog-prevents-close.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/w3c-import.log new file mode 100644 index 000000000000..d80bdad9efa4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/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/close-watcher/iframes/dialog-same-origin-nn.html +/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynn.html +/LayoutTests/imported/w3c/web-platform-tests/close-watcher/iframes/dialog-same-origin-ynyn.html 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 6c7d449c3629..a52199c44971 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,8 @@ PASS destroy() inside oncancel -FAIL destroy() inside onclose assert_array_equals: expected property 0 to be "cancel[cancelable=true]" but got "cancel[cancelable=false]" (expected array ["cancel[cancelable=true]", "close"] got ["cancel[cancelable=false]", "close"]) +PASS destroy() inside onclose PASS close() inside oncancel -FAIL close() inside onclose assert_array_equals: expected property 0 to be "cancel[cancelable=true]" but got "cancel[cancelable=false]" (expected array ["cancel[cancelable=true]", "close"] got ["cancel[cancelable=false]", "close"]) +PASS close() inside onclose PASS requestClose() inside oncancel -FAIL requestClose() inside onclose assert_array_equals: expected property 0 to be "cancel[cancelable=true]" but got "cancel[cancelable=false]" (expected array ["cancel[cancelable=true]", "close"] got ["cancel[cancelable=false]", "close"]) +PASS requestClose() inside onclose diff --git a/LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js b/LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js index 64fe9bfd7f54..34299e96d0a0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js +++ b/LayoutTests/imported/w3c/web-platform-tests/common/reftest-wait.js @@ -23,6 +23,7 @@ function takeScreenshotDelayed(timeout) { * Ensure that a precondition is met before waiting for a screenshot. * @param {bool} condition - Fail the test if this evaluates to false * @param {string} msg - Error message to write to the screenshot + * @returns {bool} True if the condition passed, false if it failed */ function failIfNot(condition, msg) { const fail = () => { @@ -35,5 +36,46 @@ function failIfNot(condition, msg) { } else { document.addEventListener("DOMContentLoaded", fail, false); } + return false; } + return true; } + +/** + * Once a text track cue becomes active, pause the video, wait + * for layout to update, then call takeScreenshot(). + */ +function waitForActiveCueAndTakeScreenshot() { + var videoElement = document.querySelector("video"); + var trackElement = document.querySelector("track"); + + if (!failIfNot(videoElement, "Video element not found")) + return; + + if (!failIfNot(trackElement, "Track element not found")) + return; + + var textTrack = trackElement.track; + + function pauseVideoAndTakeScreenshot() { + if (videoElement.paused) + requestAnimationFrame(() => takeScreenshot()); + else { + videoElement.addEventListener("pause", function() { + requestAnimationFrame(() => takeScreenshot()); + }); + videoElement.pause(); + } + } + + textTrack.oncuechange = function() { + if (textTrack.activeCues && textTrack.activeCues.length) { + textTrack.oncuechange = null; + pauseVideoAndTakeScreenshot(); + } + }; + + if (textTrack.activeCues && textTrack.activeCues.length) + pauseVideoAndTakeScreenshot(); +} + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent-expected.html new file mode 100644 index 000000000000..8840ec59cd36 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent-ref.html new file mode 100644 index 000000000000..8840ec59cd36 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent.html new file mode 100644 index 000000000000..8b30f1bc2e00 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-at-start-with-margin-top-collapses-with-parent.html @@ -0,0 +1,17 @@ + +CSS Test: block-in-inline at parent start with margin-top collapses with parent + + + + + + +

Two green squares separated by a 40px gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span-expected.html new file mode 100644 index 000000000000..d820e90f0c61 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (trailing empty span ignored).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span-ref.html new file mode 100644 index 000000000000..d820e90f0c61 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (trailing empty span ignored).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span.html new file mode 100644 index 000000000000..86fe02d66b67 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-empty-span.html @@ -0,0 +1,17 @@ + +CSS Test: block-in-inline followed by trailing empty inline does not inflate parent + + + + + + +

Two green squares separated by a 40px gap (trailing empty span ignored).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text-expected.html new file mode 100644 index 000000000000..5e32b12da213 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text-expected.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

Green square, 40px gap, an empty line, then 'XX' on the next line.

+
+

XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text-ref.html new file mode 100644 index 000000000000..5e32b12da213 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text-ref.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

Green square, 40px gap, an empty line, then 'XX' on the next line.

+
+

XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text.html new file mode 100644 index 000000000000..7418049592f7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-followed-by-line-break-and-text.html @@ -0,0 +1,15 @@ + +CSS Test: block-in-inline followed by line break and text starts text after the block's margin + + + + + + +

Green square, 40px gap, an empty line, then 'XX' on the next line.

+
+

XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom-expected.html new file mode 100644 index 000000000000..aad880cc757c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom-expected.html @@ -0,0 +1,12 @@ + +CSS Reference + +

Blue rectangle, 200px gap, then green rectangle.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom-ref.html new file mode 100644 index 000000000000..aad880cc757c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom-ref.html @@ -0,0 +1,12 @@ + +CSS Reference + +

Blue rectangle, 200px gap, then green rectangle.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom.html new file mode 100644 index 000000000000..236b5baacc37 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-large-margin-bottom.html @@ -0,0 +1,16 @@ + +CSS Test: block-in-inline with large margin-bottom propagates correctly to next sibling + + + + + +

Blue rectangle, 200px gap, then green rectangle.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block-expected.html new file mode 100644 index 000000000000..446f3c972c11 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap; no overlap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block-ref.html new file mode 100644 index 000000000000..446f3c972c11 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap; no overlap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block.html new file mode 100644 index 000000000000..05d94113e741 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-bottom-with-trailing-block.html @@ -0,0 +1,17 @@ + +CSS Test: block-in-inline margin-bottom propagates to next sibling block + + + + + + +

Two green squares separated by a 40px gap; no overlap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float-expected.html new file mode 100644 index 000000000000..e86cce1ef1c3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float-expected.html @@ -0,0 +1,14 @@ + +CSS Reference + +

Two blue rectangles separated by a 40px gap; a yellow float intersects the second.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float-ref.html new file mode 100644 index 000000000000..e86cce1ef1c3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float-ref.html @@ -0,0 +1,14 @@ + +CSS Reference + +

Two blue rectangles separated by a 40px gap; a yellow float intersects the second.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float.html new file mode 100644 index 000000000000..0902aa36a492 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-intervening-float.html @@ -0,0 +1,19 @@ + +CSS Test: block-in-inline margin collapses through an intervening float + + + + + + +

Two blue rectangles separated by a 40px gap; a yellow float intersects the second.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats-expected.html new file mode 100644 index 000000000000..97526f58829d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats-expected.html @@ -0,0 +1,16 @@ + +CSS Reference + +

Two blue rectangles 40px apart; yellow and orange floats sit between them.

+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats-ref.html new file mode 100644 index 000000000000..97526f58829d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats-ref.html @@ -0,0 +1,16 @@ + +CSS Reference + +

Two blue rectangles 40px apart; yellow and orange floats sit between them.

+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats.html new file mode 100644 index 000000000000..04625e2459fb --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-through-multiple-floats.html @@ -0,0 +1,21 @@ + +CSS Test: block-in-inline margin collapses through multiple intervening floats + + + + + + +

Two blue rectangles 40px apart; yellow and orange floats sit between them.

+
+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom-expected.html new file mode 100644 index 000000000000..127f791af9ec --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (margin propagates through parent).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom-ref.html new file mode 100644 index 000000000000..127f791af9ec --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (margin propagates through parent).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom.html new file mode 100644 index 000000000000..97c3826b83aa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-collapses-with-parent-bottom.html @@ -0,0 +1,17 @@ + +CSS Test: block-in-inline margin-bottom collapses out through parent + + + + + + +

Two green squares separated by a 40px gap (margin propagates through parent).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text-expected.html new file mode 100644 index 000000000000..f3b70e7ab4b3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text-expected.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

'AA' on a line, green square below, 40px gap, then 'BB' on a line.

+
+ AA
BB +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text-ref.html new file mode 100644 index 000000000000..f3b70e7ab4b3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text-ref.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

'AA' on a line, green square below, 40px gap, then 'BB' on a line.

+
+ AA
BB +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text.html new file mode 100644 index 000000000000..a016625768c2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-and-trailing-text.html @@ -0,0 +1,15 @@ + +CSS Test: block-in-inline sandwiched between text on both sides + + + + + + +

'AA' on a line, green square below, 40px gap, then 'BB' on a line.

+
+ AA
BB
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text-expected.html new file mode 100644 index 000000000000..28b21467d84d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

'XX' on a line, green square below, 40px gap, then a green square.

+
+ XX
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text-ref.html new file mode 100644 index 000000000000..28b21467d84d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

'XX' on a line, green square below, 40px gap, then a green square.

+
+ XX
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text.html new file mode 100644 index 000000000000..63c3ff5f2f2f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-leading-text.html @@ -0,0 +1,17 @@ + +CSS Test: text before block-in-inline sits on its own line above the block + + + + + + +

'XX' on a line, green square below, 40px gap, then a green square.

+
+ XX
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline-expected.html new file mode 100644 index 000000000000..6c8d18dfaeae --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Blue rectangle, an empty line of 20px, 40px gap, then green rectangle.

+
+

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline-ref.html new file mode 100644 index 000000000000..6c8d18dfaeae --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Blue rectangle, an empty line of 20px, 40px gap, then green rectangle.

+
+

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline.html new file mode 100644 index 000000000000..0762c3d3f2c4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-line-break-then-block-in-inline.html @@ -0,0 +1,17 @@ + +CSS Test: block-in-inline with line break and trailing block-in-inline collapses margin once + + + + + + +

Blue rectangle, an empty line of 20px, 40px gap, then green rectangle.

+
+

+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after-expected.html new file mode 100644 index 000000000000..f26aad58f639 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after-expected.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

Green square, 40px gap, then 'XX', then 'XX' on the next line.

+
+
XX XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after-ref.html new file mode 100644 index 000000000000..f26aad58f639 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after-ref.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

Green square, 40px gap, then 'XX', then 'XX' on the next line.

+
+
XX XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after.html new file mode 100644 index 000000000000..9b8fb7dfebd8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-after.html @@ -0,0 +1,15 @@ + +CSS Test: multi-line text after block-in-inline starts after the block's margin + + + + + + +

Green square, 40px gap, then 'XX', then 'XX' on the next line.

+
+
XX XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before-expected.html new file mode 100644 index 000000000000..77055a83290f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

'XX' on three lines, green square, 40px gap, then a green square.

+
+ XX XX XX
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before-ref.html new file mode 100644 index 000000000000..77055a83290f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

'XX' on three lines, green square, 40px gap, then a green square.

+
+ XX XX XX
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before.html new file mode 100644 index 000000000000..fa163c14a038 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-multi-line-text-before.html @@ -0,0 +1,17 @@ + +CSS Test: wrapped multi-line text before block-in-inline + + + + + + +

'XX' on three lines, green square, 40px gap, then a green square.

+
+ XX XX XX
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline-expected.html new file mode 100644 index 000000000000..099ccefc98fa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline-expected.html @@ -0,0 +1,12 @@ + +CSS Reference + + +

Blue rectangle, 30px gap, 'XX', then green rectangle.

+
+
XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline-ref.html new file mode 100644 index 000000000000..099ccefc98fa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline-ref.html @@ -0,0 +1,12 @@ + +CSS Reference + + +

Blue rectangle, 30px gap, 'XX', then green rectangle.

+
+
XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline.html new file mode 100644 index 000000000000..bd90da91a4f3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margin-with-text-then-block-in-inline.html @@ -0,0 +1,16 @@ + +CSS Test: block-in-inline followed by inline text then another block-in-inline + + + + + + +

Blue rectangle, 30px gap, 'XX', then green rectangle.

+
+
XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block-expected.html new file mode 100644 index 000000000000..98a3fe16a408 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (margins collapse, max wins).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block-ref.html new file mode 100644 index 000000000000..98a3fe16a408 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (margins collapse, max wins).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block.html new file mode 100644 index 000000000000..208e1570c027 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-margins-collapse-with-trailing-block.html @@ -0,0 +1,17 @@ + +CSS Test: block-in-inline margin-bottom collapses with following sibling's margin-top + + + + + + +

Two green squares separated by a 40px gap (margins collapse, max wins).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block-expected.html new file mode 100644 index 000000000000..4d58dfa6fb35 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block-expected.html @@ -0,0 +1,12 @@ + +CSS Reference + +

A blue rectangle and a green rectangle overlapping by 10px.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block-ref.html new file mode 100644 index 000000000000..4d58dfa6fb35 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block-ref.html @@ -0,0 +1,12 @@ + +CSS Reference + +

A blue rectangle and a green rectangle overlapping by 10px.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block.html new file mode 100644 index 000000000000..e5c411cf55a4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-bottom-with-trailing-block.html @@ -0,0 +1,16 @@ + +CSS Test: block-in-inline with negative margin-bottom overlaps following sibling + + + + + +

A blue rectangle and a green rectangle overlapping by 10px.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float-expected.html new file mode 100644 index 000000000000..983299c8e246 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float-expected.html @@ -0,0 +1,14 @@ + +CSS Reference + +

Blue and green rectangles overlapping by 10px; yellow float intersects them.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float-ref.html new file mode 100644 index 000000000000..983299c8e246 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float-ref.html @@ -0,0 +1,14 @@ + +CSS Reference + +

Blue and green rectangles overlapping by 10px; yellow float intersects them.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float.html new file mode 100644 index 000000000000..3c79529fecc0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-margin-with-intervening-float.html @@ -0,0 +1,19 @@ + +CSS Test: block-in-inline negative margin with intervening float + + + + + + +

Blue and green rectangles overlapping by 10px; yellow float intersects them.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt-expected.html new file mode 100644 index 000000000000..aea0206e411c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt-expected.html @@ -0,0 +1,12 @@ + +CSS Reference + +

Blue rectangle, 30px gap (50 - 20), green rectangle.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt-ref.html new file mode 100644 index 000000000000..aea0206e411c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt-ref.html @@ -0,0 +1,12 @@ + +CSS Reference + +

Blue rectangle, 30px gap (50 - 20), green rectangle.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt.html new file mode 100644 index 000000000000..a9210a7d1c42 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-negative-mb-collapses-with-positive-mt.html @@ -0,0 +1,16 @@ + +CSS Test: block-in-inline negative margin-bottom collapses with positive margin-top of following sibling + + + + + +

Blue rectangle, 30px gap (50 - 20), green rectangle.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child-expected.html new file mode 100644 index 000000000000..b03bd5fbce08 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child-expected.html @@ -0,0 +1,12 @@ + +CSS Reference + + +

Two green squares with a 40px gap; no red.

+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child-ref.html new file mode 100644 index 000000000000..b03bd5fbce08 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child-ref.html @@ -0,0 +1,12 @@ + +CSS Reference + + +

Two green squares with a 40px gap; no red.

+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child.html new file mode 100644 index 000000000000..83a4c7bb4ba4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-self-collapsing-only-child.html @@ -0,0 +1,19 @@ + +CSS Test: self-collapsing block-in-inline as only child of parent + + + + + + +

Two green squares with a 40px gap; no red.

+
+
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored-expected.html new file mode 100644 index 000000000000..9076072b0220 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two adjacent green squares with no gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored-ref.html new file mode 100644 index 000000000000..9076072b0220 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two adjacent green squares with no gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored.html new file mode 100644 index 000000000000..77e4f08dfb11 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-vertical-margins-on-span-ignored.html @@ -0,0 +1,18 @@ + +CSS Test: vertical margins on the span ancestor are ignored + + + + + + +

Two adjacent green squares with no gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent-expected.html new file mode 100644 index 000000000000..e68479c50e37 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Green square inside cyan parent with 40px gap below to padding edge, then 20px padding, then a green square.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent-ref.html new file mode 100644 index 000000000000..e68479c50e37 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Green square inside cyan parent with 40px gap below to padding edge, then 20px padding, then a green square.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent.html new file mode 100644 index 000000000000..87b27c8f5a66 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-with-padded-parent.html @@ -0,0 +1,17 @@ + +CSS Test: padding on parent prevents block-in-inline margin-bottom from collapsing out + + + + + + +

Green square inside cyan parent with 40px gap below to padding edge, then 20px padding, then a green square.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse-expected.html new file mode 100644 index 000000000000..751904b27361 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse-expected.html @@ -0,0 +1,15 @@ + +CSS Reference + + +

Two green squares with a 40px gap; no red.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse-ref.html new file mode 100644 index 000000000000..751904b27361 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse-ref.html @@ -0,0 +1,15 @@ + +CSS Reference + + +

Two green squares with a 40px gap; no red.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse.html new file mode 100644 index 000000000000..8defc92b680c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inline-zero-height-margin-collapse.html @@ -0,0 +1,19 @@ + +CSS Test: empty block-in-inline collapses through its own margins + + + + + + +

Two green squares with a 40px gap; no red.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse-expected.html new file mode 100644 index 000000000000..4e1d0cb94a43 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (margins collapse).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse-ref.html new file mode 100644 index 000000000000..4e1d0cb94a43 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap (margins collapse).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse.html new file mode 100644 index 000000000000..9858d15f4bca --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/block-in-inlines-in-different-spans-margin-collapse.html @@ -0,0 +1,17 @@ + +CSS Test: block-in-inlines in different spans collapse like flat blocks + + + + + + +

Two green squares separated by a 40px gap (margins collapse).

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float-expected.html new file mode 100644 index 000000000000..7ae16b257e20 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float-expected.html @@ -0,0 +1,14 @@ + +CSS Reference + +

A blue rectangle, a green floated rectangle below it, and an orange inline-block past the float.

+
+
+
+ +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float-ref.html new file mode 100644 index 000000000000..7ae16b257e20 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float-ref.html @@ -0,0 +1,14 @@ + +CSS Reference + +

A blue rectangle, a green floated rectangle below it, and an orange inline-block past the float.

+
+
+
+ +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float.html new file mode 100644 index 000000000000..9eb9109f4ea8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-block-after-block-in-inline-with-intervening-float.html @@ -0,0 +1,19 @@ + +CSS Test: Inline-block after a block-in-inline and an intervening float lands past the float + + + + + + +

A blue rectangle, a green floated rectangle below it, and an orange inline-block past the float.

+
+
+
+ +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin-expected.html new file mode 100644 index 000000000000..08750a90019a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin-expected.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

Green square, 40px gap, then 'XX' on its own line.

+
+
XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin-ref.html new file mode 100644 index 000000000000..08750a90019a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin-ref.html @@ -0,0 +1,11 @@ + +CSS Reference + + +

Green square, 40px gap, then 'XX' on its own line.

+
+
XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin.html new file mode 100644 index 000000000000..eac7495fa396 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-margin.html @@ -0,0 +1,15 @@ + +CSS Test: inline text after block-in-inline starts after the block's margin-bottom + + + + + + +

Green square, 40px gap, then 'XX' on its own line.

+
+
XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float-expected.html new file mode 100644 index 000000000000..1d45bb8589d9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float-expected.html @@ -0,0 +1,14 @@ + +CSS Reference + + +

Blue rectangle, 40px gap, then 'XX' alongside the yellow float.

+
+
+
+ XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float-ref.html new file mode 100644 index 000000000000..1d45bb8589d9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float-ref.html @@ -0,0 +1,14 @@ + +CSS Reference + + +

Blue rectangle, 40px gap, then 'XX' alongside the yellow float.

+
+
+
+ XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float.html new file mode 100644 index 000000000000..0a36a9835166 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/inline-text-after-block-in-inline-with-intervening-float.html @@ -0,0 +1,19 @@ + +CSS Test: inline text after block-in-inline with intervening float lands alongside the float + + + + + + + +

Blue rectangle, 40px gap, then 'XX' alongside the yellow float.

+
+
+
+ XX +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse-expected.html new file mode 100644 index 000000000000..9c78c22ebf72 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse-expected.html @@ -0,0 +1,15 @@ + +CSS Reference + + +

Three green squares: 40px gap, then 50px gap.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse-ref.html new file mode 100644 index 000000000000..9c78c22ebf72 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse-ref.html @@ -0,0 +1,15 @@ + +CSS Reference + + +

Three green squares: 40px gap, then 50px gap.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse.html new file mode 100644 index 000000000000..2b492289ea3b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/multiple-block-in-inlines-margins-collapse.html @@ -0,0 +1,17 @@ + +CSS Test: stacked block-in-inlines collapse adjacent margins + + + + + + +

Three green squares: 40px gap, then 50px gap.

+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin-expected.html new file mode 100644 index 000000000000..0729f9af4c4d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin-expected.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin-ref.html new file mode 100644 index 000000000000..0729f9af4c4d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin-ref.html @@ -0,0 +1,13 @@ + +CSS Reference + + +

Two green squares separated by a 40px gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin.html new file mode 100644 index 000000000000..a1541f400ef8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/nested-spans-with-block-in-inline-margin.html @@ -0,0 +1,17 @@ + +CSS Test: nested spans with block-in-inline preserve margin behavior + + + + + + +

Two green squares separated by a 40px gap.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins-expected.html new file mode 100644 index 000000000000..e2ab9353936b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins-expected.html @@ -0,0 +1,14 @@ + +CSS Reference + +

Three rectangles separated by 30px and 50px gaps respectively.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins-ref.html new file mode 100644 index 000000000000..e2ab9353936b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins-ref.html @@ -0,0 +1,14 @@ + +CSS Reference + +

Three rectangles separated by 30px and 50px gaps respectively.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins.html new file mode 100644 index 000000000000..c017c13f83a7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/three-block-in-inlines-cascading-margins.html @@ -0,0 +1,18 @@ + +CSS Test: three consecutive block-in-inlines with cascading margins + + + + + +

Three rectangles separated by 30px and 50px gaps respectively.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between-expected.html new file mode 100644 index 000000000000..c02f05d6a30e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between-expected.html @@ -0,0 +1,12 @@ + +CSS Reference + + +

Green square, 40px gap, 'XX' on a line, then a green square.

+
+
XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between-ref.html new file mode 100644 index 000000000000..c02f05d6a30e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between-ref.html @@ -0,0 +1,12 @@ + +CSS Reference + + +

Green square, 40px gap, 'XX' on a line, then a green square.

+
+
XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between.html new file mode 100644 index 000000000000..37b47d86290b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/box-display/two-block-in-inlines-with-text-between.html @@ -0,0 +1,16 @@ + +CSS Test: two block-in-inlines with text between them + + + + + + +

Green square, 40px gap, 'XX' on a line, then a green square.

+
+
XX
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse-expected.html new file mode 100644 index 000000000000..41d7dd007e61 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse-expected.html @@ -0,0 +1,25 @@ + +CSS Reference + +

Test passes if there are two green horizontal strips below, separated by a 50px gap, with no extra empty area.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse-ref.html new file mode 100644 index 000000000000..41d7dd007e61 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse-ref.html @@ -0,0 +1,25 @@ + +CSS Reference + +

Test passes if there are two green horizontal strips below, separated by a 50px gap, with no extra empty area.

+
+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse.html b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse.html new file mode 100644 index 000000000000..36e5296c0499 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/CSS2/normal-flow/block-in-inline-after-block-in-inline-with-margin-collapse.html @@ -0,0 +1,29 @@ + +CSS Test: A block-level box inside an inline box, following another block-in-inline with margin-bottom, should be positioned with margin-collapse applied + + + + +

Test passes if there are two green horizontal strips below, separated by a 50px gap, with no extra empty area.

+
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-expected.html index 836b4fc78de2..d3e84ff89e81 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-expected.html @@ -11,12 +11,12 @@ .clone { -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } .slice { -webkit-box-decoration-break: slice; - -webkit-box-decoration-break: slice; + box-decoration-break: slice; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-ref.html index 836b4fc78de2..d3e84ff89e81 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break-ref.html @@ -11,12 +11,12 @@ .clone { -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } .slice { -webkit-box-decoration-break: slice; - -webkit-box-decoration-break: slice; + box-decoration-break: slice; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break.html index d05c802dbc3f..254c942078f8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-clip/clip-border-area-box-decoration-break.html @@ -21,12 +21,12 @@ .clone { -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } .slice { -webkit-box-decoration-break: slice; - -webkit-box-decoration-break: slice; + box-decoration-break: slice; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-expected-mismatch.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-expected-mismatch.html index 6dc0b61c09ba..85c7162ff21b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-expected-mismatch.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-expected-mismatch.html @@ -17,7 +17,6 @@ -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; - -webkit-text-fill-color: transparent; width: fit-content; margin: 0; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-notref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-notref.html index 6dc0b61c09ba..85c7162ff21b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-notref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002-notref.html @@ -17,7 +17,6 @@ -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; - -webkit-text-fill-color: transparent; width: fit-content; margin: 0; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002.html index 44be62fb18dd..a8608700dd0b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-002.html @@ -34,7 +34,6 @@ -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; - -webkit-text-fill-color: transparent; width: fit-content; margin: 0; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-003.html index eba49a9aadbe..b44b8610e66e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-003.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-backgrounds/background-gradient-interpolation-003.html @@ -37,7 +37,6 @@ -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; - -webkit-text-fill-color: transparent; width: fit-content; margin: 0; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-break/border-image-000.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-break/border-image-000.html index fb852fff89ab..a588830310da 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-break/border-image-000.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-break/border-image-000.html @@ -10,7 +10,7 @@ color: transparent; border-image: radial-gradient(green 50%, transparent 50%) 27 fill / 27px; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; }

There should be two green circles below.

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 34ae440631aa..612566c4d2c3 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; - -webkit-box-decoration-break: clone; + 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 34ae440631aa..612566c4d2c3 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 @@ -11,7 +11,7 @@ } span { -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + 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 3bdf47f3e702..852ceac5d205 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; - -webkit-box-decoration-break: clone; + 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-flexbox/aspect-ratio-intrinsic-size-011-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-011-expected.html new file mode 100644 index 000000000000..fd56d93734e0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-011-expected.html @@ -0,0 +1,3 @@ + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-011.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-011.html new file mode 100644 index 000000000000..feb0fe451e3f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-011.html @@ -0,0 +1,14 @@ + + + + +

Test passes if there is a filled green square.

+
+
+
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012-expected.html new file mode 100644 index 000000000000..a0dfe6bdc1e8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012-expected.html @@ -0,0 +1,3 @@ + +

Test passes if there is a filled green 200x100 rectangle.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012-ref.html new file mode 100644 index 000000000000..a0dfe6bdc1e8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012-ref.html @@ -0,0 +1,3 @@ + +

Test passes if there is a filled green 200x100 rectangle.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012.html new file mode 100644 index 000000000000..e8531ec541e9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-012.html @@ -0,0 +1,14 @@ + + + + +

Test passes if there is a filled green 200x100 rectangle.

+
+
+
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013-expected.html new file mode 100644 index 000000000000..cddcb93a93cc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013-expected.html @@ -0,0 +1,3 @@ + +

Test passes if there is a filled green 130x100 rectangle.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013-ref.html new file mode 100644 index 000000000000..cddcb93a93cc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013-ref.html @@ -0,0 +1,3 @@ + +

Test passes if there is a filled green 130x100 rectangle.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013.html new file mode 100644 index 000000000000..7e21bbadf772 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-013.html @@ -0,0 +1,15 @@ + + + + +

Test passes if there is a filled green 130x100 rectangle.

+
+
+
+
+
+
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-014-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-014-expected.html new file mode 100644 index 000000000000..fd56d93734e0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-014-expected.html @@ -0,0 +1,3 @@ + +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-014.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-014.html new file mode 100644 index 000000000000..5671fe7a3031 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/aspect-ratio-intrinsic-size-014.html @@ -0,0 +1,14 @@ + + + + +

Test passes if there is a filled green square.

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

Test passes if the two images below are the same size.

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

Test passes if the two images below are the same size.

+
+ +
+
+ +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-001.html new file mode 100644 index 000000000000..cb52bb1de736 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-cross-size-001.html @@ -0,0 +1,22 @@ + +Flex container with aspect-ratio-derived height provides definite cross size to flex items + + + +

Test passes if the two images below are the same size.

+
+ +
+
+ +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017-expected.txt index 7f6280ce07f3..b0cec88568a4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017-expected.txt @@ -1,7 +1,5 @@ -FAIL img 1 assert_equals: - -height expected 150 but got 0 +PASS img 1 Specified size suggestion = 200px Content size suggestion = 150px [1] Automatic minimum height = min(150px, 200px) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017.html index b2b97f0a31cf..1c507f1daceb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-column-017.html @@ -11,6 +11,7 @@
+
 Specified size suggestion = 200px
 Content size suggestion = 150px [1]
@@ -28,7 +29,3 @@
 
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001-expected.html new file mode 100644 index 000000000000..95119f597019 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001-expected.html @@ -0,0 +1,4 @@ + +Reference +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001-ref.html new file mode 100644 index 000000000000..95119f597019 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001-ref.html @@ -0,0 +1,4 @@ + +Reference +

Test passes if there is a filled green square.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001.html new file mode 100644 index 000000000000..c048c317c988 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flex-svg-no-intrinsic-column-001.html @@ -0,0 +1,20 @@ + +SVG image flex item with no intrinsic dimensions falls back to 150px height in column flex container + + + + +

Test passes if there is a filled green square.

+
+ +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-expected.html deleted file mode 100644 index ff1ced0c0351..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-expected.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - CSS Reftest Reference - - - - -
-
-
-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-expected.txt new file mode 100644 index 000000000000..d2ea41cda3a9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-expected.txt @@ -0,0 +1,6 @@ + +PASS overflow-y:visible: min-height:auto holds; width has no scrollbar gutter +PASS overflow-y:hidden: min-height:auto resolves to 0; no scrollbar gutter +PASS overflow-y:scroll: min-height:auto resolves to 0; width includes scrollbar gutter +PASS overflow-y:auto: min-height:auto resolves to 0; width includes scrollbar gutter + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-ref.html deleted file mode 100644 index ff1ced0c0351..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003-ref.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - CSS Reftest Reference - - - - -
-
-
-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003.html index 15ef35d9cd7f..5177ed062b57 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-003.html @@ -9,7 +9,6 @@ CSS Test: Testing min-height:auto & 'overflow' interaction - + + - - -
-
-
-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004-expected.txt new file mode 100644 index 000000000000..3399a64a0411 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004-expected.txt @@ -0,0 +1,6 @@ + +PASS overflow-x:visible: overflow-y stays visible; min-height:auto holds; no scrollbar gutter +PASS overflow-x:hidden: forces overflow-y to auto; min-height:auto resolves to 0; width includes scrollbar gutter +PASS overflow-x:scroll: forces overflow-y to auto; min-height:auto resolves to 0; width includes scrollbar gutter +PASS overflow-x:auto: forces overflow-y to auto; min-height:auto resolves to 0; width includes scrollbar gutter + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004-ref.html deleted file mode 100644 index 768185d43194..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004-ref.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - CSS Reftest Reference - - - - -
-
-
-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004.html index a04b9b573e2b..bcc6adcbac25 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/flexbox-min-height-auto-004.html @@ -9,7 +9,6 @@ CSS Test: Testing min-height:auto & 'overflow' interaction - + + + + +
+
+

Top

+
+ +
+
+
+

Top

+
+ +
+
+
+

Top

+
+ +
+
+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/function-attr-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/function-attr-expected.txt index e400b91fa158..31d13c86ca24 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/function-attr-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-mixins/function-attr-expected.txt @@ -10,7 +10,7 @@ PASS Return attr(type(*)) from untyped function FAIL attr() in default parameter value assert_equals: expected "42px" but got "784px" PASS attr() in local variable FAIL Returned url() is attr-tainted assert_equals: expected "url(\"http://web-platform.test:8800/css/css-mixins/parent\")" but got "url(\"http://web-platform.test:8800/css/css-mixins/cat.png\")" -FAIL Returned url() is attr-tainted, typed attr() assert_equals: expected "url(\"http://web-platform.test:8800/css/css-mixins/parent\")" but got "url(\"http://web-platform.test:8800/css/css-mixins/cat.png\")" +PASS Returned url() is attr-tainted, typed attr() PASS Returned url() is attr-tainted, typed return PASS Returned url() is attr-tainted, local PASS Returned url() is attr-tainted, argument diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..1550d5594810 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant-expected.html @@ -0,0 +1,32 @@ + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..1550d5594810 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant-ref.html @@ -0,0 +1,32 @@ + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant.html new file mode 100644 index 000000000000..d737246b8113 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/abspos-shrink-to-fit-with-scrollable-descendant.html @@ -0,0 +1,34 @@ + + + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..f30dd83b61ae --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant-expected.html @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..f30dd83b61ae --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant-ref.html @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant.html new file mode 100644 index 000000000000..41fae214672e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/button-with-scrollable-descendant.html @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..319a35a5c560 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant-expected.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..319a35a5c560 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant-ref.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant.html new file mode 100644 index 000000000000..f5689996430d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/float-with-scrollable-descendant.html @@ -0,0 +1,28 @@ + + + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..4cad918f1bf3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant-expected.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..4cad918f1bf3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant-ref.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant.html new file mode 100644 index 000000000000..c2c667726a37 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inline-block-with-scrollable-descendant.html @@ -0,0 +1,28 @@ + + + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant-expected.html new file mode 100644 index 000000000000..98559763945d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant-expected.html @@ -0,0 +1,31 @@ + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant-ref.html new file mode 100644 index 000000000000..98559763945d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant-ref.html @@ -0,0 +1,31 @@ + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant.html new file mode 100644 index 000000000000..9809dea75400 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-float-scrollable-descendant.html @@ -0,0 +1,33 @@ + + + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants-expected.html new file mode 100644 index 000000000000..b9e2cda3b912 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants-expected.html @@ -0,0 +1,33 @@ + + + + + + +
+
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants-ref.html new file mode 100644 index 000000000000..b9e2cda3b912 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants-ref.html @@ -0,0 +1,33 @@ + + + + + + +
+
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants.html new file mode 100644 index 000000000000..3c6e6645ae18 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/max-content-with-multiple-scrollable-descendants.html @@ -0,0 +1,35 @@ + + + + + + + + +
+
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/orthogonal-writing-mode-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/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/orthogonal-writing-mode-with-scrollable-descendant-expected.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/orthogonal-writing-mode-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/orthogonal-writing-mode-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..319a35a5c560 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/orthogonal-writing-mode-with-scrollable-descendant-ref.html @@ -0,0 +1,26 @@ + + + + + + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/orthogonal-writing-mode-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/orthogonal-writing-mode-with-scrollable-descendant.html new file mode 100644 index 000000000000..ece679db78e8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/orthogonal-writing-mode-with-scrollable-descendant.html @@ -0,0 +1,33 @@ + + + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/shrink-to-fit-overflow-auto-scrollbar-width-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/shrink-to-fit-overflow-auto-scrollbar-width-expected.txt new file mode 100644 index 000000000000..d27a13897306 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/shrink-to-fit-overflow-auto-scrollbar-width-expected.txt @@ -0,0 +1,6 @@ + + +PASS Float with overflow-y:auto includes scrollbar in shrink-to-fit width +PASS Inline-block with overflow-y:auto includes scrollbar in shrink-to-fit width +PASS Abspos with overflow-y:auto includes scrollbar in shrink-to-fit width + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/shrink-to-fit-overflow-auto-scrollbar-width.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/shrink-to-fit-overflow-auto-scrollbar-width.html new file mode 100644 index 000000000000..1e9f7dd8a4b3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/shrink-to-fit-overflow-auto-scrollbar-width.html @@ -0,0 +1,59 @@ + +Shrink-to-fit blocks with overflow-y:auto should include scrollbar in width + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant-expected.html new file mode 100644 index 000000000000..22758d4e3fc8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant-expected.html @@ -0,0 +1,34 @@ + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant-ref.html new file mode 100644 index 000000000000..22758d4e3fc8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant-ref.html @@ -0,0 +1,34 @@ + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant.html new file mode 100644 index 000000000000..3b2cc489ecce --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/table-max-content-with-scrollable-descendant.html @@ -0,0 +1,36 @@ + + + + + + + + +
+
+
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-position/fixed-z-index-blend.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-position/fixed-z-index-blend.html index c532a5870f05..7b9789d36058 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-position/fixed-z-index-blend.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-position/fixed-z-index-blend.html @@ -52,9 +52,9 @@ + + + + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
x
+
+
+ + +
x
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-expected.html new file mode 100644 index 000000000000..d8930ec2a12e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-expected.html @@ -0,0 +1,26 @@ + + +Reference: no red rectangle visible + +

Test passes if there is no red rectangle visible.

+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-ref.html new file mode 100644 index 000000000000..d8930ec2a12e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb-ref.html @@ -0,0 +1,26 @@ + + +Reference: no red rectangle visible + +

Test passes if there is no red rectangle visible.

+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb.html new file mode 100644 index 000000000000..6e48d921b64a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-indefinite-cb.html @@ -0,0 +1,31 @@ + + +position:absolute with height:stretch falls back when abs-pos containing block is indefinite + + + + + +

Test passes if there is no red rectangle visible.

+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-expected.html new file mode 100644 index 000000000000..d05b2b2138d1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-expected.html @@ -0,0 +1,18 @@ + + +Reference: tall green rectangle on the left edge of the viewport + +

Test passes if there is a tall green rectangle on the left edge of the viewport.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-ref.html new file mode 100644 index 000000000000..d05b2b2138d1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child-ref.html @@ -0,0 +1,18 @@ + + +Reference: tall green rectangle on the left edge of the viewport + +

Test passes if there is a tall green rectangle on the left edge of the viewport.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child.html new file mode 100644 index 000000000000..4212885ee2ac --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/abspos-stretch-replaced-percentage-child.html @@ -0,0 +1,26 @@ + + +position:absolute with height:stretch resolves for replaced child with height:100% + + + + + +

Test passes if there is a tall green rectangle on the left edge of the viewport.

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-expected.html index 4faa2000afa5..49c3c13d22a0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-expected.html @@ -25,7 +25,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-ref.html index 4faa2000afa5..49c3c13d22a0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size-ref.html @@ -25,7 +25,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size.html index 943e6569955e..6bcca543d356 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-intrinsic-size.html @@ -28,7 +28,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-expected.html index 97dccc5912e8..a99a359b9f31 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-expected.html @@ -22,7 +22,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-ref.html index 97dccc5912e8..a99a359b9f31 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi-ref.html @@ -22,7 +22,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi.html index 0898d41481af..df3338ed3404 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-bidi.html @@ -29,7 +29,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-expected.html index 29592b5b330b..520cb4252457 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-expected.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-expected.html @@ -22,7 +22,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-ref.html index 29592b5b330b..520cb4252457 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-ref.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size-ref.html @@ -22,7 +22,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size.html index 33030ff6e13c..38099c6eb111 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/clone-nowrap-intrinsic-size.html @@ -29,7 +29,7 @@ margin: 0 4px 0 3px; background: yellow; -webkit-box-decoration-break: clone; - -webkit-box-decoration-break: clone; + box-decoration-break: clone; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-intrinsic-size.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-intrinsic-size.html index 8a140623361d..05ce6e46304a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-intrinsic-size.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-intrinsic-size.html @@ -29,7 +29,7 @@ background: yellow; /* for clarity: */ -webkit-box-decoration-break: slice; - -webkit-box-decoration-break: slice; + box-decoration-break: slice; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-nowrap-intrinsic-size.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-nowrap-intrinsic-size.html index 36f8b8f202f6..6ec41d099e6d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-nowrap-intrinsic-size.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/slice-nowrap-intrinsic-size.html @@ -30,7 +30,7 @@ background: yellow; /* for clarity: */ -webkit-box-decoration-break: slice; - -webkit-box-decoration-break: slice; + box-decoration-break: slice; } f { margin-right: 30px; float: left; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-expected.html new file mode 100644 index 000000000000..14423d71465d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-expected.html @@ -0,0 +1,22 @@ + + +CSS Reference Case + + +
+
+ +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-ref.html new file mode 100644 index 000000000000..14423d71465d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001-ref.html @@ -0,0 +1,22 @@ + + +CSS Reference Case + + +
+
+ +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001.html new file mode 100644 index 000000000000..0817d3f7e013 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-anonymous-block-001.html @@ -0,0 +1,28 @@ + + +CSS Test: 'stretch' heights resolve through an anonymous block wrapper + + + + + +
+ +
+ +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-expected.html new file mode 100644 index 000000000000..c05ce9379fd7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-expected.html @@ -0,0 +1,20 @@ + + +CSS Reference Case + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-ref.html new file mode 100644 index 000000000000..c05ce9379fd7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002-ref.html @@ -0,0 +1,20 @@ + + +CSS Reference Case + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002.html new file mode 100644 index 000000000000..e5f081e6d647 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/stretch/stretch-quirk-002.html @@ -0,0 +1,27 @@ + + +CSS Test: 'stretch' heights resolve through an anonymous block wrapper + + + + + + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-cjk-ideograph-extensions-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-cjk-ideograph-extensions-expected.txt new file mode 100644 index 000000000000..8a04fba40511 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-cjk-ideograph-extensions-expected.txt @@ -0,0 +1,10 @@ + +PASS CJK Unified Ideographs Extension B (U+20000) justifies like U+4E00 +PASS CJK Unified Ideographs Extension C (U+2A700) justifies like U+4E00 +PASS CJK Unified Ideographs Extension D (U+2B740) justifies like U+4E00 +PASS CJK Unified Ideographs Extension E (U+2B820) justifies like U+4E00 +PASS CJK Unified Ideographs Extension F (U+2CEB0) justifies like U+4E00 +PASS CJK Unified Ideographs Extension I (U+2EBF0) justifies like U+4E00 +PASS CJK Unified Ideographs Extension G (U+30000) justifies like U+4E00 +PASS CJK Unified Ideographs Extension H (U+31350) justifies like U+4E00 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-cjk-ideograph-extensions.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-cjk-ideograph-extensions.html new file mode 100644 index 000000000000..d02abc606ce8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/text-justify/text-justify-cjk-ideograph-extensions.html @@ -0,0 +1,92 @@ + + + + +CSS Text: justification expansion around CJK Unified Ideographs Extensions B–I + + + + + + + + + +
一一一一一一
+
一一一一一一
+ +
𠀀𠀀𠀀𠀀𠀀𠀀
+
𠀀𠀀𠀀𠀀𠀀𠀀
+ +
𪜀𪜀𪜀𪜀𪜀𪜀
+
𪜀𪜀𪜀𪜀𪜀𪜀
+ +
𫝀𫝀𫝀𫝀𫝀𫝀
+
𫝀𫝀𫝀𫝀𫝀𫝀
+ +
𫠠𫠠𫠠𫠠𫠠𫠠
+
𫠠𫠠𫠠𫠠𫠠𫠠
+ +
𬺰𬺰𬺰𬺰𬺰𬺰
+
𬺰𬺰𬺰𬺰𬺰𬺰
+ +
𮯰𮯰𮯰𮯰𮯰𮯰
+
𮯰𮯰𮯰𮯰𮯰𮯰
+ +
𰀀𰀀𰀀𰀀𰀀𰀀
+
𰀀𰀀𰀀𰀀𰀀𰀀
+ +
𱍐𱍐𱍐𱍐𱍐𱍐
+
𱍐𱍐𱍐𱍐𱍐𱍐
+ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-024-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-024-ref.html new file mode 100644 index 000000000000..f1112d4d1687 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-024-ref.html @@ -0,0 +1,13 @@ + + +test reference + + +

Test passes if the green outline tightly hugs the two X glyphs (no extra space on the right).

+
X
X
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-025-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-025-ref.html new file mode 100644 index 000000000000..f1112d4d1687 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/reference/white-space-intrinsic-size-025-ref.html @@ -0,0 +1,13 @@ + + +test reference + + +

Test passes if the green outline tightly hugs the two X glyphs (no extra space on the right).

+
X
X
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-024-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-024-expected.html new file mode 100644 index 000000000000..f1112d4d1687 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-024-expected.html @@ -0,0 +1,13 @@ + + +test reference + + +

Test passes if the green outline tightly hugs the two X glyphs (no extra space on the right).

+
X
X
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-024.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-024.html new file mode 100644 index 000000000000..c681ea96eedd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-024.html @@ -0,0 +1,20 @@ + + +CSS Text Test: max-content trims trailing whitespace before a forced line break + + + + + +

Test passes if the green outline tightly hugs the two X glyphs (no extra space on the right).

+
X +X
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-025-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-025-expected.html new file mode 100644 index 000000000000..f1112d4d1687 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-025-expected.html @@ -0,0 +1,13 @@ + + +test reference + + +

Test passes if the green outline tightly hugs the two X glyphs (no extra space on the right).

+
X
X
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-025.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-025.html new file mode 100644 index 000000000000..c6022127c222 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-text/white-space/white-space-intrinsic-size-025.html @@ -0,0 +1,20 @@ + + +CSS Text Test: max-content trims trailing whitespace before a forced line break in its own text node + + + + + +

Test passes if the green outline tightly hugs the two X glyphs (no extra space on the right).

+
X X
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/perspective-transforms-equivalence.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/perspective-transforms-equivalence.html index 8f59d51ada88..860b3c29da90 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/perspective-transforms-equivalence.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/perspective-transforms-equivalence.html @@ -9,7 +9,7 @@ Perspective with different transforms can have small anti-aliasing pixel differences, so the test should fuzzy patch to the ref. --> - + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-ui/user-select-none-on-input.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-ui/user-select-none-on-input.html index 3e05c38ffc35..42186dd62058 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-ui/user-select-none-on-input.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-ui/user-select-none-on-input.html @@ -8,7 +8,7 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/WEB_FEATURES.yml b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/WEB_FEATURES.yml index 40da5311d0e8..39b0d2e9b0ac 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/WEB_FEATURES.yml +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/WEB_FEATURES.yml @@ -91,6 +91,9 @@ features: files: - rem-unit-* - rem-root-* +- name: progress-function + files: + - progress-* - name: random-function files: - random-* diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types-expected.txt index b8a0dd74b4eb..6d4d3847ae68 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types-expected.txt @@ -171,4 +171,5 @@ PASS CSS Values and Units Test: attr 167 PASS CSS Values and Units Test: attr 168 PASS CSS Values and Units Test: attr 169 PASS CSS Values and Units Test: attr 170 +PASS CSS Values and Units Test: attr 171 diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types.html index aaad6457e058..77c9247445e9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-all-types.html @@ -28,7 +28,7 @@ } -
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content-expected.html new file mode 100644 index 000000000000..5d5b61a03ff7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content-expected.html @@ -0,0 +1,14 @@ + + + +
    +
  • Has icon attribute
  • +
  • Fallback icon
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content.html new file mode 100644 index 000000000000..ee5375418766 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content.html @@ -0,0 +1,19 @@ + + + + + +
    +
  • Has icon attribute
  • +
  • Fallback icon
  • +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation-2-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation-2-expected.txt new file mode 100644 index 000000000000..59e98c4d10e5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation-2-expected.txt @@ -0,0 +1,16 @@ +Some text +Item + +Some content + + +PASS CSS Values and Units Test: attr() invalidation of pseudo elements +PASS CSS Values and Units Test: attr() invalidation of pseudo elements 1 +PASS CSS Values and Units Test: attr() invalidation of pseudo elements 2 +PASS CSS Values and Units Test: attr() invalidation of pseudo elements 3 +PASS CSS Values and Units Test: attr() invalidation of pseudo elements 4 +FAIL CSS Values and Units Test: attr() invalidation of pseudo elements 5 assert_not_equals: Change of attribute value should lead to invalidation of ::placeholder element style. got disallowed value "11px" +FAIL CSS Values and Units Test: attr() invalidation of pseudo elements 6 assert_not_equals: Change of attribute value should lead to invalidation of ::file-selector-button element style. got disallowed value "11px" +FAIL CSS Values and Units Test: attr() invalidation of pseudo elements 7 assert_not_equals: Change of attribute value should lead to invalidation of ::details-content element style. got disallowed value "16px" +PASS CSS Values and Units Test: attr() invalidation of pseudo elements 8 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation-2.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation-2.html new file mode 100644 index 000000000000..77fe08616f12 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation-2.html @@ -0,0 +1,61 @@ + + +CSS Values and Units Test: attr() invalidation of pseudo elements + + + + + +
Some text
+Some text in modal +
  1. Item
+ + +

Some content

+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-expected.html new file mode 100644 index 000000000000..111967fb0fad --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-expected.html @@ -0,0 +1,6 @@ + +CSS Values and Units Test: attr() in ::marker pseudo element + +
  • Text
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-ref.html new file mode 100644 index 000000000000..111967fb0fad --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-ref.html @@ -0,0 +1,6 @@ + +CSS Values and Units Test: attr() in ::marker pseudo element + +
  • Text
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker.html new file mode 100644 index 000000000000..31dfd3f6d002 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker.html @@ -0,0 +1,15 @@ + + +CSS Values and Units Test: attr() in ::marker pseudo element + + + + +
  • Text
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-expected.html new file mode 100644 index 000000000000..2456eae1d0aa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-expected.html @@ -0,0 +1,4 @@ + +CSS Values and Units Test: attr() in ::placeholder pseudo element + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-ref.html new file mode 100644 index 000000000000..2456eae1d0aa --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-ref.html @@ -0,0 +1,4 @@ + +CSS Values and Units Test: attr() in ::placeholder pseudo element + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder.html new file mode 100644 index 000000000000..18185fda9f9a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder.html @@ -0,0 +1,15 @@ + + +CSS Values and Units Test: attr() in ::placeholder pseudo element + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-animation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-animation-expected.txt new file mode 100644 index 000000000000..a7c416d4108e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-animation-expected.txt @@ -0,0 +1,4 @@ +div + +PASS CSS Values and Units Test: attr() security limitations + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-animation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-animation.html new file mode 100644 index 000000000000..6390b05ae876 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-animation.html @@ -0,0 +1,51 @@ + +CSS Values and Units Test: attr() security limitations + + + + + + + + +
div
+ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-expected.txt index 789e94bd523a..49d5f31822df 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-expected.txt @@ -1,19 +1,20 @@ PASS '--x: image-set(attr(data-foo))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: image-set(attr(data-foo))' with data-foo="https://does-not-exist.test/404.png" +PASS 'background: image-set(attr(data-foo))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: image-set("https://does-not-exist.test/404.png")' with data-foo="https://does-not-exist.test/404.png" PASS '--x: src(attr(data-foo))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: src(attr(data-foo))' with data-foo="https://does-not-exist.test/404.png" -FAIL 'background-image: src("https://does-not-exist.test/404.png")' with data-foo="https://does-not-exist.test/404.png" assert_equals: expected "src(url(\"https://does-not-exist.test/404.png\"))" but got "none" +PASS 'background-image: src("https://does-not-exist.test/404.png")' with data-foo="https://does-not-exist.test/404.png" PASS '--x: src(string("https://does-not-exist.test" attr(data-foo)))' with data-foo="/404.png" PASS 'background-image: src(string("https://does-not-exist.test" attr(data-foo)))' with data-foo="/404.png" -FAIL 'background-image: src(string("https://does-not-exist.test/""404.png"))' with data-foo="/404.png" assert_equals: expected "src(url(\"https://does-not-exist.test/404.png\"))" but got "none" +PASS 'background-image: src(string("https://does-not-exist.test/""404.png"))' with data-foo="/404.png" PASS '--x: attr(data-foo type())' with data-foo="url(https://does-not-exist.test/404.png)" PASS 'background-image: attr(data-foo type())' with data-foo="url(https://does-not-exist.test/404.png)" PASS 'background-image: url("https://does-not-exist.test/404.png")' with data-foo="url(https://does-not-exist.test/404.png)" PASS '--x: image(attr(data-foo))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: image(attr(data-foo))' with data-foo="https://does-not-exist.test/404.png" -FAIL 'background-image: image("https://does-not-exist.test/404.png")' with data-foo="https://does-not-exist.test/404.png" assert_equals: expected "image(url(\"https://does-not-exist.test/404.png\"))" but got "none" +PASS 'background-image: image("https://does-not-exist.test/404.png")' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: url(https://does-not-exist.test/404.png), attr(data-foo type())' with data-foo="linear-gradient(#000000, #ffffff)" PASS '--x: image-set(var(--y, attr(data-foo)))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: image-set(var(--y, attr(data-foo)))' with data-foo="https://does-not-exist.test/404.png" @@ -21,41 +22,11 @@ PASS '--x: image-set(var(--some-string))' with data-foo="https://does-not-exist. PASS 'background-image: image-set(var(--some-string))' with data-foo="https://does-not-exist.test/404.png" PASS '--x: image-set(var(--some-string-list))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: image-set(var(--some-string-list))' with data-foo="https://does-not-exist.test/404.png" -PASS '--registered-url: attr(data-foo type())' with data-foo="https://does-not-exist.test/404.png" +PASS '--registered-url: attr(data-foo type())' with data-foo="${url}" PASS '--registered-color: attr(data-foo type())' with data-foo="blue" PASS '--x: image-set(var(--some-other-url))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: image-set(var(--some-other-url))' with data-foo="https://does-not-exist.test/404.png" PASS 'background-image: attr(data-foo type(*))' with data-foo="url(https://does-not-exist.test/404.png), linear-gradient(black, white)" PASS 'background-image: image-set(var(--image-set-valid))' with data-foo="image/jpeg" PASS 'background-image: image-set(var(--image-set-invalid))' with data-foo="https://does-not-exist.test/404.png" -FAIL '--x: image-set(if(style(--true): attr(data-foo);))' with data-foo="https://does-not-exist.test/404.png" assert_equals: expected "image-set(\"https://does-not-exist.test/404.png\")" but got "image-set(if(style(--true): \"https://does-not-exist.test/404.png\";))" -PASS 'background-image: image-set(if(style(--true): attr(data-foo);))' with data-foo="https://does-not-exist.test/404.png" -FAIL 'background-image: image-set( - if(style(--true): url(https://does-not-exist-2.test/404.png); - else: attr(data-foo);))' with data-foo="https://does-not-exist-2.test/404.png" assert_equals: expected "image-set(url(\"https://does-not-exist-2.test/404.png\") 1dppx)" but got "none" -PASS 'background-image: image-set( - if(style(--some-string): url(https://does-not-exist.test/404.png);))' with data-foo="https://does-not-exist.test/404.png" -PASS 'background-image: image-set( - if(style(--condition-val: attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" -PASS 'background-image: image-set( - if(style(--condition-val: attr(data-foo type(*))): url(https://does-not-exist.test/404.png); - style(--true): url(https://does-not-exist.test/404.png); - else: url(https://does-not-exist.test/404.png);))' with data-foo="1" -FAIL 'background-image: image-set(if(style(--true): url(https://does-not-exist.test/404.png); - style(--condition-val): url(https://does-not-exist.test/404.png); - else: url(https://does-not-exist.test/404.png);))' with data-foo="attr(data-foo type(*))" assert_equals: expected "image-set(url(\"https://does-not-exist.test/404.png\") 1dppx)" but got "none" -PASS 'background-image: image-set( - if(style(--condition-val: if(style(--true): attr(data-foo type(*));)): url(https://does-not-exist.test/404.png);))' with data-foo="3" -FAIL '--x: image-set(if(style(--condition-val: if(style(--true): attr(data-foo type(*));)): url(https://does-not-exist.test/404.png);))' with data-foo="3" assert_equals: expected "image-set(url(https://does-not-exist.test/404.png))" but got "image-set(if(style(--condition-val: if(style(--true): 3;)): url(https://does-not-exist.test/404.png);))" -FAIL '--x: image-set(if(style(--condition-val >= attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" assert_equals: expected "image-set(url(https://does-not-exist.test/404.png))" but got "image-set(if(style(--condition-val >= 3): url(https://does-not-exist.test/404.png);))" -PASS 'background-image: image-set( - if(style(--condition-val >= attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" -PASS 'background-image: image-set( - if(style(--condition-val < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" -PASS 'background-image: image-set( - if(style(--str < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" -PASS 'background-image: image-set( - if(style(--condition-val < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="text" -PASS Taint propagates through registered * syntax custom property into image-set() -PASS Taint propagates through simple var() reference with url() tokens into background-image diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if-expected.txt new file mode 100644 index 000000000000..7777dc029689 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if-expected.txt @@ -0,0 +1,30 @@ + +FAIL '--x: image-set(if(style(--true): attr(data-foo);))' with data-foo="https://does-not-exist.test/404.png" assert_equals: expected "image-set(\"https://does-not-exist.test/404.png\")" but got "image-set(if(style(--true): \"https://does-not-exist.test/404.png\";))" +PASS 'background-image: image-set(if(style(--true): attr(data-foo);))' with data-foo="https://does-not-exist.test/404.png" +PASS 'background-image: image-set( + if(style(--true): url(https://does-not-exist-2.test/404.png); + else: attr(data-foo);))' with data-foo="https://does-not-exist-2.test/404.png" +PASS 'background-image: image-set( + if(style(--some-string): url(https://does-not-exist.test/404.png);))' with data-foo="https://does-not-exist.test/404.png" +PASS 'background-image: image-set( + if(style(--condition-val: attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" +PASS 'background-image: image-set( + if(style(--condition-val: attr(data-foo type(*))): url(https://does-not-exist.test/404.png); + style(--true): url(https://does-not-exist.test/404.png); + else: url(https://does-not-exist.test/404.png);))' with data-foo="1" +PASS 'background-image: image-set(if(style(--true): url(https://does-not-exist.test/404.png); + style(--condition-val): url(https://does-not-exist.test/404.png); + else: url(https://does-not-exist.test/404.png);))' with data-foo="attr(data-foo type(*))" +PASS 'background-image: image-set( + if(style(--condition-val: if(style(--true): attr(data-foo type(*));)): url(https://does-not-exist.test/404.png);))' with data-foo="3" +FAIL '--x: image-set(if(style(--condition-val: if(style(--true): attr(data-foo type(*));)): url(https://does-not-exist.test/404.png);))' with data-foo="3" assert_equals: expected "image-set(url(https://does-not-exist.test/404.png))" but got "image-set(if(style(--condition-val: if(style(--true): 3;)): url(https://does-not-exist.test/404.png);))" +FAIL '--x: image-set(if(style(--condition-val >= attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" assert_equals: expected "image-set(url(https://does-not-exist.test/404.png))" but got "image-set(if(style(--condition-val >= 3): url(https://does-not-exist.test/404.png);))" +PASS 'background-image: image-set( + if(style(--condition-val >= attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" +PASS 'background-image: image-set( + if(style(--condition-val < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" +PASS 'background-image: image-set( + if(style(--str < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="3" +PASS 'background-image: image-set( + if(style(--condition-val < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))' with data-foo="text" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if.html new file mode 100644 index 000000000000..b27b585948ba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if.html @@ -0,0 +1,122 @@ + + +CSS Values and Units Test: attr() security limitations using if() + + + + + + + + +
+ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-transition-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-transition-expected.txt new file mode 100644 index 000000000000..29db3a8ba8a6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-transition-expected.txt @@ -0,0 +1,4 @@ +div + +PASS background-image value should be attr-tainted + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-transition.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-transition.html new file mode 100644 index 000000000000..ad15e5691d63 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-transition.html @@ -0,0 +1,34 @@ + +CSS Values and Units Test: attr() security limitations + + + + + + + + +
div
+ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security.html index 10a1e78c2f0d..697e9f4f01dc 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security.html @@ -16,11 +16,8 @@ initial-value: "empty"; } div { - --condition-val: 3; - --str: text; - --true: true; --some-string: attr(data-foo); - --some-string-list: "https://does-not-exist2.test/404.png" attr(data-foo); + --some-string-list: "https://does-not-exist-2.test/404.png" attr(data-foo); --some-other-url: attr(data-foo); --image-set-valid: url("https://does-not-exist.test/404.png") type(attr(data-foo)); --image-set-invalid: attr(data-foo type()) 1x; @@ -37,16 +34,35 @@ function test_attr(property, attrString, attrValue, expectedValue) { var elem = document.getElementById("attr"); elem.setAttribute("data-foo", attrValue); - elem.style.setProperty(property, attrString); + + elem.style.setProperty("--unregistered", attrString); + let value = window.getComputedStyle(elem).getPropertyValue("--unregistered"); test(() => { + // Skip tests that include unsupported functions, since they are not violation of attr() security. + if (value == "" || CSS.supports(`${property} : ${value}`)) { + elem.style.setProperty(property, attrString); assert_equals(window.getComputedStyle(elem).getPropertyValue(property), expectedValue); + } }, `'${property}: ${attrString}' with data-foo="${attrValue}"`); elem.style.setProperty(property, null); } + function test_attr_shorthand(shorthand, longhand, attrString, attrValue, expectedValue) { + var elem = document.getElementById("attr"); + elem.setAttribute("data-foo", attrValue); + elem.style.setProperty(shorthand, attrString); + + test(() => { + assert_equals(window.getComputedStyle(elem).getPropertyValue(longhand), + expectedValue); + }, `'${shorthand}: ${attrString}' with data-foo="${attrValue}"`); + + elem.style.setProperty(shorthand, null); + } + function test_registered_custom_property(customPropertyName, customPropertySyntax, customPropertyInitialValue, attrValue, expectedValue) { window.CSS.registerProperty({ @@ -66,38 +82,46 @@ elem.style.setProperty(customPropertyName, null); } + const url = "https://does-not-exist.test/404.png"; + const url2 = "https://does-not-exist-2.test/404.png"; + // Direct use. test_attr('--x', - 'image-set(attr(data-foo))', - 'https://does-not-exist.test/404.png', - 'image-set("https://does-not-exist.test/404.png")'); + `image-set(attr(data-foo))`, + url, + `image-set("${url}")`); test_attr('background-image', - 'image-set(attr(data-foo))', - 'https://does-not-exist.test/404.png', + `image-set(attr(data-foo))`, + url, 'none'); + test_attr_shorthand('background', + 'background-image', + `image-set(attr(data-foo))`, + url, + 'none'); test_attr('background-image', - 'image-set("https://does-not-exist.test/404.png")', - 'https://does-not-exist.test/404.png', - 'image-set(url("https://does-not-exist.test/404.png") 1dppx)'); + `image-set("${url}")`, + url, + `image-set(url("${url}") 1dppx)`); test_attr('--x', - 'src(attr(data-foo))', - 'https://does-not-exist.test/404.png', - 'src("https://does-not-exist.test/404.png")'); + `src(attr(data-foo))`, + url, + `src("${url}")`); test_attr('background-image', - 'src(attr(data-foo))', - 'https://does-not-exist.test/404.png', - 'none'); + `src(attr(data-foo))`, + url, + `none`); test_attr('background-image', - 'src("https://does-not-exist.test/404.png")', - 'https://does-not-exist.test/404.png', - 'src(url("https://does-not-exist.test/404.png"))'); + `src("${url}")`, + url, + `src(url("${url}"))`); // The following string() function is under discussion in the working group and does not exist yet. test_attr('--x', - 'src(string("https://does-not-exist.test" attr(data-foo)))', + `src(string("https://does-not-exist.test" attr(data-foo)))`, '/404.png', - 'src(string("https://does-not-exist.test" "/404.png"))'); + `src(string("https://does-not-exist.test" "/404.png"))`); test_attr('background-image', 'src(string("https://does-not-exist.test" attr(data-foo)))', '/404.png', @@ -105,197 +129,96 @@ test_attr('background-image', 'src(string("https://does-not-exist.test/""404.png"))', '/404.png', - 'src(url("https://does-not-exist.test/404.png"))'); + `src(url("${url}"))`); test_attr('--x', - 'attr(data-foo type())', - 'url(https://does-not-exist.test/404.png)', - 'url("https://does-not-exist.test/404.png")'); + `attr(data-foo type())`, + `url(${url})`, + ``); test_attr('background-image', - 'attr(data-foo type())', - 'url(https://does-not-exist.test/404.png)', - 'none'); + `attr(data-foo type())`, + `url(${url})`, + `none`); test_attr('background-image', - 'url("https://does-not-exist.test/404.png")', - 'url(https://does-not-exist.test/404.png)', - 'url("https://does-not-exist.test/404.png")'); + `url("${url}")`, + `url(${url})`, + `url("${url}")`); test_attr('--x', - 'image(attr(data-foo))', - 'https://does-not-exist.test/404.png', - 'image("https://does-not-exist.test/404.png")'); + `image(attr(data-foo))`, + url, + `image("${url}")`); test_attr('background-image', - 'image(attr(data-foo))', - 'https://does-not-exist.test/404.png', + `image(attr(data-foo))`, + url, 'none'); test_attr('background-image', - 'image("https://does-not-exist.test/404.png")', - 'https://does-not-exist.test/404.png', - 'image(url("https://does-not-exist.test/404.png"))'); + `image("${url}")`, + url, + `image(url("${url}"))`); test_attr('background-image', - 'url(https://does-not-exist.test/404.png), attr(data-foo type())', - 'linear-gradient(#000000, #ffffff)', - 'url("https://does-not-exist.test/404.png"), linear-gradient(rgb(0, 0, 0), rgb(255, 255, 255))'); + `url(${url}), attr(data-foo type())`, + `linear-gradient(#000000, #ffffff)`, + `url("${url}"), linear-gradient(rgb(0, 0, 0), rgb(255, 255, 255))`); // The remaining tests use image-set(), but should be equivalent for image() etc. // Test in a fallback. test_attr('--x', - 'image-set(var(--y, attr(data-foo)))', - 'https://does-not-exist.test/404.png', - 'image-set("https://does-not-exist.test/404.png")'); + `image-set(var(--y, attr(data-foo)))`, + url, + `image-set("${url}")`); test_attr('background-image', - 'image-set(var(--y, attr(data-foo)))', - 'https://does-not-exist.test/404.png', + `image-set(var(--y, attr(data-foo)))`, + url, 'none'); // Test via a registered custom property. test_attr('--x', - 'image-set(var(--some-string))', - 'https://does-not-exist.test/404.png', - 'image-set("https://does-not-exist.test/404.png")'); + `image-set(var(--some-string))`, + url, + `image-set("${url}")`); test_attr('background-image', - 'image-set(var(--some-string))', - 'https://does-not-exist.test/404.png', + `image-set(var(--some-string))`, + url, 'none'); // Test via a registered custom property (list). test_attr('--x', - 'image-set(var(--some-string-list))', - 'https://does-not-exist.test/404.png', - 'image-set("https://does-not-exist2.test/404.png" "https://does-not-exist.test/404.png")'); + `image-set(var(--some-string-list))`, + url, + `image-set("${url2}" "${url}")`); test_attr('background-image', - 'image-set(var(--some-string-list))', - 'https://does-not-exist.test/404.png', + `image-set(var(--some-string-list))`, + url, 'none'); - test_registered_custom_property('--registered-url', '', 'url("https://does-not-exist.test/empty-url")', 'https://does-not-exist.test/404.png', 'url("https://does-not-exist.test/empty-url")'); + test_registered_custom_property('--registered-url', '', `url("${url2}")`, '${url}', `url("${url2}")`); test_registered_custom_property('--registered-color', '', 'red', 'blue', 'rgb(0, 0, 255)'); // Test via a non-registered custom property. test_attr('--x', - 'image-set(var(--some-other-url))', - 'https://does-not-exist.test/404.png', - 'image-set("https://does-not-exist.test/404.png")'); + `image-set(var(--some-other-url))`, + url, + `image-set("${url}")`); test_attr('background-image', - 'image-set(var(--some-other-url))', - 'https://does-not-exist.test/404.png', + `image-set(var(--some-other-url))`, + url, 'none'); // Test multiple token substitution test_attr('background-image', - 'attr(data-foo type(*))', - 'url(https://does-not-exist.test/404.png), linear-gradient(black, white)', + `attr(data-foo type(*))`, + `url(${url}), linear-gradient(black, white)`, 'none'); // Test total attr()-tainting for substitution values test_attr('background-image', - 'image-set(var(--image-set-valid))', + `image-set(var(--image-set-valid))`, 'image/jpeg', 'none'); test_attr('background-image', - 'image-set(var(--image-set-invalid))', - 'https://does-not-exist.test/404.png', - 'none'); - - // Test attr-tainting carries through if() function. - test_attr('--x', - 'image-set(if(style(--true): attr(data-foo);))', - 'https://does-not-exist.test/404.png', - 'image-set("https://does-not-exist.test/404.png")'); - test_attr('background-image', - 'image-set(if(style(--true): attr(data-foo);))', - 'https://does-not-exist.test/404.png', - 'none'); - test_attr('background-image', - `image-set( - if(style(--true): url(https://does-not-exist-2.test/404.png); - else: attr(data-foo);))`, - 'https://does-not-exist-2.test/404.png', - 'image-set(url("https://does-not-exist-2.test/404.png") 1dppx)'); - test_attr('background-image', - `image-set( - if(style(--some-string): url(https://does-not-exist.test/404.png);))`, - 'https://does-not-exist.test/404.png', + `image-set(var(--image-set-invalid))`, + url, 'none'); - test_attr('background-image', - `image-set( - if(style(--condition-val: attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))`, - '3', - 'none'); - test_attr('background-image', - `image-set( - if(style(--condition-val: attr(data-foo type(*))): url(https://does-not-exist.test/404.png); - style(--true): url(https://does-not-exist.test/404.png); - else: url(https://does-not-exist.test/404.png);))`, - '1', - 'none'); - test_attr('background-image', - `image-set(if(style(--true): url(https://does-not-exist.test/404.png); - style(--condition-val): url(https://does-not-exist.test/404.png); - else: url(https://does-not-exist.test/404.png);))`, - 'attr(data-foo type(*))', - 'image-set(url("https://does-not-exist.test/404.png") 1dppx)'); - test_attr('background-image', - `image-set( - if(style(--condition-val: if(style(--true): attr(data-foo type(*));)): url(https://does-not-exist.test/404.png);))`, - '3', - 'none'); - test_attr('--x', - `image-set(if(style(--condition-val: if(style(--true): attr(data-foo type(*));)): url(https://does-not-exist.test/404.png);))`, - '3', - 'image-set(url(https://does-not-exist.test/404.png))'); - test_attr('--x', - `image-set(if(style(--condition-val >= attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))`, - '3', - 'image-set(url(https://does-not-exist.test/404.png))'); - test_attr('background-image', - `image-set( - if(style(--condition-val >= attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))`, - '3', - 'none'); - test_attr('background-image', - `image-set( - if(style(--condition-val < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))`, - '3', - 'none'); - test_attr('background-image', - `image-set( - if(style(--str < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))`, - '3', - 'none'); - test_attr('background-image', - `image-set( - if(style(--condition-val < attr(data-foo type(*))): url(https://does-not-exist.test/404.png);))`, - 'text', - 'none'); - - // Test taint propagation through registered custom property with universal syntax. - // A registered * property should still carry attr()-taint. - test(() => { - CSS.registerProperty({ - name: '--registered-universal', - syntax: '*', - inherits: false, - initialValue: '', - }); - var elem = document.getElementById("attr"); - elem.setAttribute("data-foo", "https://does-not-exist.test/404.png"); - elem.style.setProperty('--registered-universal', 'attr(data-foo)'); - elem.style.setProperty('background-image', 'image-set(var(--registered-universal))'); - assert_equals(window.getComputedStyle(elem).getPropertyValue('background-image'), 'none'); - elem.style.setProperty('--registered-universal', null); - elem.style.setProperty('background-image', null); - }, 'Taint propagates through registered * syntax custom property into image-set()'); - - // Test taint propagation through a simple var() reference into background-image with url() tokens. - test(() => { - var elem = document.getElementById("attr"); - elem.setAttribute("data-foo", "url(https://does-not-exist.test/404.png)"); - elem.style.setProperty('--tainted-url', 'attr(data-foo type(*))'); - elem.style.setProperty('background-image', 'var(--tainted-url)'); - assert_equals(window.getComputedStyle(elem).getPropertyValue('background-image'), 'none'); - elem.style.setProperty('--tainted-url', null); - elem.style.setProperty('background-image', null); - }, 'Taint propagates through simple var() reference with url() tokens into background-image'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-expected.html new file mode 100644 index 000000000000..6b53f386896d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-expected.html @@ -0,0 +1,3 @@ + +
x
+
y
\ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-ref.html new file mode 100644 index 000000000000..6b53f386896d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-ref.html @@ -0,0 +1,3 @@ + +
x
+
y
\ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4.html new file mode 100644 index 000000000000..26a656c8099d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4.html @@ -0,0 +1,12 @@ + + + + +
+
+
+
\ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-expected.html new file mode 100644 index 000000000000..5d5b61a03ff7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-expected.html @@ -0,0 +1,14 @@ + + + +
    +
  • Has icon attribute
  • +
  • Fallback icon
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-ref.html new file mode 100644 index 000000000000..5d5b61a03ff7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-ref.html @@ -0,0 +1,14 @@ + + + +
    +
  • Has icon attribute
  • +
  • Fallback icon
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5.html new file mode 100644 index 000000000000..ae66eca0a279 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5.html @@ -0,0 +1,13 @@ + + + + + +
    +
  • Has icon attribute
  • +
  • Fallback icon
  • +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002-expected.txt index 634f858673b5..c18376c5f301 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002-expected.txt @@ -10,4 +10,5 @@ PASS testing calc(calc(300px - (0% + 100px) * 1)) PASS testing calc(calc(300px - (0% + 100px) * -1)) PASS testing calc(calc(300px - -1 * (0% + 100px))) PASS testing calc(calc(300px - 1 * (0% - 100px))) +FAIL testing simplification with nested sum assert_equals: expected "calc(10px - min(20%, 20px))" but got "calc(0px - (1 * (-10px + min(20%, 20px))))" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002.html index 564d6067fb2c..950dbfa6b66e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-nesting-002.html @@ -66,6 +66,8 @@ verifySerialization("calc(calc(300px - 1 * (0% - 100px)))", "calc(0% + 400px)", "testing calc(calc(300px - 1 * (0% - 100px)))"); + verifySerialization("calc(0px - 1 * (min(20%, 20px) - 10px))", "calc(10px - min(20%, 20px))", "testing simplification with nested sum"); + /* " diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-rounding-003.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-rounding-003.html index 8c86dfa6fed7..bf609e1c1d4b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-rounding-003.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-rounding-003.html @@ -20,4 +20,6 @@ }
+ >
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-492735384.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-492735384.html new file mode 100644 index 000000000000..21f46c19c55c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-492735384.html @@ -0,0 +1,31 @@ + + + + + + + +
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-493952652.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-493952652.html new file mode 100644 index 000000000000..a9c96ec5cc99 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-493952652.html @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/w3c-import.log index 3c002cb78394..c8ab0bd3fc61 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/w3c-import.log @@ -16,4 +16,5 @@ None List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-405422528-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-492735384.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/chrome-bug-493952652.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/crashtests/viewport-unit-inline-style-crash.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-expected.html new file mode 100644 index 000000000000..b20171db1b98 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-expected.html @@ -0,0 +1,23 @@ + + + + +Reference: HTML attribute names are ASCII-case-insensitive + + + +
This should be green.
+
This should be green.
+
This should be green.
+ +
This should be green.
+
This should be green.
+
This should be green.
+ +
This should be green.
+
This should be green.
+
This should be green.
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-ref.html new file mode 100644 index 000000000000..b20171db1b98 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-ref.html @@ -0,0 +1,23 @@ + + + + +Reference: HTML attribute names are ASCII-case-insensitive + + + +
This should be green.
+
This should be green.
+
This should be green.
+ +
This should be green.
+
This should be green.
+
This should be green.
+ +
This should be green.
+
This should be green.
+
This should be green.
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity.html new file mode 100644 index 000000000000..39ba432a73d4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity.html @@ -0,0 +1,36 @@ + + + + +HTML attribute names are ASCII-case-insensitive + + + + + + + +
This should be green.
+
This should be green.
+
This should be green.
+ +
This should be green.
+
This should be green.
+
This should be green.
+ +
This should be green.
+
This should be green.
+
This should be green.
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed-expected.txt index 241c301563b0..882e7af5679c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed-expected.txt @@ -21,4 +21,5 @@ PASS calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2re PASS calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 4) should be used-value-equivalent to 4 PASS calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 2) should be used-value-equivalent to 2 PASS rotate3d(progress(21em, 1rem, 11em), progress(21em, 1rem, 11em), progress(21em, 1rem, 11em), calc(progress(11em, 1rem, 11em) * 2deg)) should be used-value-equivalent to rotate3d(2, 2, 2, 2deg) +FAIL calc(50% - 0px * clamp(0, progress(0cqw, 0px, 0px), 1)) should be used-value-equivalent to 50px assert_equals: calc(50% - 0px * clamp(0, progress(0cqw, 0px, 0px), 1)) and 50px serialize to the same thing in used values. expected "50px" but got "0px" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed.html index 06846103442d..6f3c0e2b8734 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/progress-computed.html @@ -8,11 +8,16 @@ :root { font-size: 10px; } +#wrapper { + width: 100px; +} #target { font-size: 10px; } -
+
+
+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative-expected.txt index 1fee596a3eae..2b9de93e9257 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative-expected.txt @@ -1,12 +1,12 @@ PASS Property scale value 'random(1, 11)' -PASS Property scale value 'random(--foo, 2, 12)' -PASS Property scale value 'random(--foo element-scoped, 3, 13)' -PASS Property scale value 'random(element-scoped --foo, 4, 14)' +PASS Property scale value 'random(--foo element-scoped, 2, 12)' +PASS Property scale value 'random(--foo, 3, 13)' +PASS Property scale value 'random(--foo, 4, 14)' PASS Property scale value 'random(0, 10, 5)' -PASS Property scale value 'random(--foo, 10, 20, 5)' -PASS Property scale value 'random(--foo element-scoped, 20, 30, 5)' -PASS Property scale value 'random(element-scoped --foo, 30, 40, 5)' +PASS Property scale value 'random(--foo element-scoped, 10, 20, 5)' +PASS Property scale value 'random(--foo, 20, 30, 5)' +PASS Property scale value 'random(--foo, 30, 40, 5)' PASS Property scale value 'random(100, 10)' PASS Property scale value 'random(-10, -100)' PASS Property scale value 'random(-100, -10)' @@ -55,14 +55,14 @@ FAIL Property scale value 'random(10, 100, infinity)' assert_true: Random values FAIL Property scale value 'calc(10 + random(10, 100, infinity))' assert_true: Random values should be equal expected true got false PASS Property scale value 'random(10, 100, -infinity)' PASS Property scale value 'calc(10 + random(10, 100, -infinity))' -PASS Property scale value on pseudo element '::before' 'random(7, 17)' -PASS Property scale value on pseudo element '::before' 'random(--bar, 8, 18)' -PASS Property scale value on pseudo element '::before' 'random(element-scoped, 9, 19)' -PASS Property scale value on pseudo element '::before' 'random(element-scoped --foo, 10, 20)' +PASS Property scale value on pseudo element '::before' 'random(1, 300000)' +PASS Property scale value on pseudo element '::before' 'random(--bar element-scoped, 1, 300000)' +FAIL Property scale value on pseudo element '::before' 'random(property-index-scoped, 1, 300000)' assert_greater_than_equal: random(property-index-scoped, 1, 300000) expected a number greater than or equal to 1 but got NaN +PASS Property scale value on pseudo element '::before' 'random(--foo, 1, 300000)' PASS Property translate value 'random(10%, 100%)' PASS Property translate value 'random(3 * 10% , 10 * 10%)' PASS Property translate value 'random(10%, 1%)' -PASS Property translate value 'random(--identifier element-scoped, 10%, 100%)' +PASS Property translate value 'random(--identifier, 10%, 100%)' PASS Property text-indent value 'random(10%, 30%)' PASS Property flex-basis value 'random(10%, 30%)' PASS Property offset-distance value 'random(10%, 30%)' @@ -112,43 +112,45 @@ PASS Property rotate value 'random(1, 0) random(1, 0) 1 90deg' PASS Property rotate value 'x random(90deg, 30deg)' PASS Property corner-shape value 'superellipse(random(3, 1))' PASS Property offset-path value 'ray(random(30deg, 10deg))' -FAIL Shared by property 'color' with values 'color-mix(in srgb, rgb(from blue random(10, 30) random(g, g + 30) random(b, b)), rgb(random(10, 90) 0 0))', 'color-mix(in srgb, rgb(from blue random(property-scoped, 10, 30) random(property-scoped, g, g + 30) random(property-scoped, b, b)), rgb(random(property-scoped, 10, 90) 0 0))' assert_true: color-mix(in srgb, rgb(from blue random(property-scoped, 10, 30) random(property-scoped, g, g + 30) random(property-scoped, b, b)), rgb(random(property-scoped, 10, 90) 0 0)) values on different elements should be equal expected true got false -FAIL Shared by property 'math-depth' with values 'add(random(1, 100))', 'add(random(property-scoped, 1, 100))' assert_true: add(random(property-scoped, 1, 100)) values on different elements should be equal expected true got false -FAIL Shared by property 'view-transition-name' with values 'ident("myident" random(1, 100))', 'ident("myident" random(property-scoped, 1, 100))' assert_false: ident("myident" random(1, 100)) values on different elements should not be equal expected false got true -FAIL Shared by property 'aspect-ratio' with values 'random(1, 3, 1) / random(3, 9, 1)', 'random(property-scoped, 1, 3, 1) / random(property-scoped, 3, 9, 1)' assert_true: random(property-scoped, 1, 3, 1) / random(property-scoped, 3, 9, 1) values on different elements should be equal expected true got false -FAIL Shared by property 'filter' with values 'drop-shadow(random(1px, 3px) random(1px, 6px) random(1px, 9px) black)', 'drop-shadow(random(property-scoped, 1px, 3px) random(property-scoped, 1px, 6px) random(property-scoped, 1px, 9px) black)' assert_true: drop-shadow(random(property-scoped, 1px, 3px) random(property-scoped, 1px, 6px) random(property-scoped, 1px, 9px) black) values on different elements should be equal expected true got false -FAIL Shared by property 'font-variation-settings' with values '"wght" random(100, 900)', '"wght" random(property-scoped, 100, 900)' assert_true: "wght" random(property-scoped, 100, 900) values on different elements should be equal expected true got false -FAIL Shared by property 'font-style' with values 'oblique random(10deg, 90deg)', 'oblique random(property-scoped, 10deg, 90deg)' assert_true: oblique random(property-scoped, 10deg, 90deg) values on different elements should be equal expected true got false -FAIL Shared by property 'font-palette' with values 'palette-mix(in lch, --blue calc(90% * random(0, 1)), --yellow)', 'palette-mix(in lch, --blue calc(90% * random(property-scoped, 0, 1)), --yellow)' assert_false: palette-mix(in lch, --blue calc(90% * random(0, 1)), --yellow) values on different elements should not be equal expected false got true -FAIL Shared by property 'font-palette' with values 'palette-mix(in lch, --blue random(10%, 90%, 10%), --yellow)', 'palette-mix(in lch, --blue random(property-scoped, 10%, 90%, 10%), --yellow)' assert_false: palette-mix(in lch, --blue random(10%, 90%, 10%), --yellow) values on different elements should not be equal expected false got true -FAIL Shared by property 'animation-timeline' with values 'view(random(10px, 30px) random(30px, 60px))', 'view(random(property-scoped, 10px, 30px) random(property-scoped, 30px, 60px))' assert_true: view(random(property-scoped, 10px, 30px) random(property-scoped, 30px, 60px)) values on different elements should be equal expected true got false -FAIL Shared by property 'color' with values 'light-dark(rgb(random(10, 30) random(10, 60) random(10, 90)), rgb(random(30, 10) random(60, 10) random(90, 10)))', 'light-dark(rgb(random(property-scoped, 10, 30) random(property-scoped, 10, 60) random(property-scoped, 10, 90)), - rgb(random(property-scoped, 30, 10) random(property-scoped, 60, 10) random(property-scoped, 90, 10)))' assert_true: light-dark(rgb(random(property-scoped, 10, 30) random(property-scoped, 10, 60) random(property-scoped, 10, 90)), - rgb(random(property-scoped, 30, 10) random(property-scoped, 60, 10) random(property-scoped, 90, 10))) values on different elements should be equal expected true got false +FAIL Shared by property 'color' with values 'color-mix(in srgb, rgb(from blue random(10, 30) random(g, g + 30) random(b, b)), rgb(random(10, 90) 0 0))', 'color-mix(in srgb, rgb(from blue random(property-index-scoped, 10, 30) random(property-index-scoped, g, g + 30) random(property-index-scoped, b, b)), rgb(random(property-index-scoped, 10, 90) 0 0))' assert_true: color-mix(in srgb, rgb(from blue random(property-index-scoped, 10, 30) random(property-index-scoped, g, g + 30) random(property-index-scoped, b, b)), rgb(random(property-index-scoped, 10, 90) 0 0)) values on different elements should be equal expected true got false +FAIL Shared by property 'math-depth' with values 'add(random(1, 30000))', 'add(random(property-index-scoped, 1, 30000))' assert_true: add(random(property-index-scoped, 1, 30000)) values on different elements should be equal expected true got false +FAIL Shared by property 'view-transition-name' with values 'ident("myident" random(1, 300000))', 'ident("myident" random(property-index-scoped, 1, 300000))' assert_false: ident("myident" random(1, 300000)) values on different elements should not be equal expected false got true +FAIL Shared by property 'aspect-ratio' with values 'random(1, 3000000, 1) / random(3000000, 9000000, 1)', 'random(property-index-scoped, 1, 3000000, 1) / random(property-index-scoped, 3000000, 9000000, 1)' assert_true: random(property-index-scoped, 1, 3000000, 1) / random(property-index-scoped, 3000000, 9000000, 1) values on different elements should be equal expected true got false +FAIL Shared by property 'filter' with values 'drop-shadow(random(1px, 300000px) random(1px, 600000px) random(1px, 900000px) black)', 'drop-shadow(random(property-index-scoped, 1px, 300000px) random(property-index-scoped, 1px, 600000px) random(property-index-scoped, 1px, 900000px) black)' assert_true: drop-shadow(random(property-index-scoped, 1px, 300000px) random(property-index-scoped, 1px, 600000px) random(property-index-scoped, 1px, 900000px) black) values on different elements should be equal expected true got false +FAIL Shared by property 'font-variation-settings' with values '"wght" random(100, 900)', '"wght" random(property-index-scoped, 100, 900)' assert_true: "wght" random(property-index-scoped, 100, 900) values on different elements should be equal expected true got false +FAIL Shared by property 'font-style' with values 'oblique random(10deg, 90deg)', 'oblique random(property-index-scoped, 10deg, 90deg)' assert_true: oblique random(property-index-scoped, 10deg, 90deg) values on different elements should be equal expected true got false +FAIL Shared by property 'font-palette' with values 'palette-mix(in lch, --blue calc(90% * random(0, 1)), --yellow)', 'palette-mix(in lch, --blue calc(90% * random(property-index-scoped, 0, 1)), --yellow)' assert_false: palette-mix(in lch, --blue calc(90% * random(0, 1)), --yellow) values on different elements should not be equal expected false got true +FAIL Shared by property 'font-palette' with values 'palette-mix(in lch, --blue random(10%, 90%), --yellow)', 'palette-mix(in lch, --blue random(property-index-scoped, 10%, 90%), --yellow)' assert_false: palette-mix(in lch, --blue random(10%, 90%), --yellow) values on different elements should not be equal expected false got true +FAIL Shared by property 'animation-timeline' with values 'view(random(1px, 300000px) random(300000px, 600000px))', 'view(random(property-index-scoped, 1px, 300000px) random(property-index-scoped, 300000px, 600000px))' assert_true: view(random(property-index-scoped, 1px, 300000px) random(property-index-scoped, 300000px, 600000px)) values on different elements should be equal expected true got false +FAIL Shared by property 'color' with values 'light-dark(rgb(random(10, 30) random(10, 60) random(10, 90)), rgb(random(30, 10) random(60, 10) random(90, 10)))', 'light-dark(rgb(random(property-index-scoped, 10, 30) random(property-index-scoped, 10, 60) random(property-index-scoped, 10, 90)), + rgb(random(property-index-scoped, 30, 10) random(property-index-scoped, 60, 10) random(property-index-scoped, 90, 10)))' assert_true: light-dark(rgb(random(property-index-scoped, 10, 30) random(property-index-scoped, 10, 60) random(property-index-scoped, 10, 90)), + rgb(random(property-index-scoped, 30, 10) random(property-index-scoped, 60, 10) random(property-index-scoped, 90, 10))) values on different elements should be equal expected true got false PASS Maximum random: 'random(a, b)' PASS Maximum random - shorthand: random(a, b) FAIL Shared by property name and value index: random(property-index-scoped, a, b) assert_true: Random values should be equal expected true got false -FAIL Shared by property name and value index - list: random(property-index-scoped, a, b) assert_false: expected false got true -FAIL Nested random inside custom property: 'random(a, b)' assert_false: Different custom properties on the same element should not have equal values expected false got true -FAIL Maximum random custom property: 'random(a, b)' assert_false: Different custom properties on the same element should not have equal values expected false got true -PASS Shared by name within an element: 'random(--identifier, a, b)' -PASS Shared by name within an element - shorthand: random(--identifier, a, b)) -PASS Shared between elements within a property: random(property-scoped, a, b) -PASS Maximum random inside color functions: random(a, b) -PASS Identifier shared with percentage values: random(--identifier, a, b) -PASS Shared within a property - shorthand: random(element-scoped, a, b) +PASS Shared by property and index in list value: random(a, b) +FAIL Nested in fixed value random() function used for custom property: 'random(a, b)' assert_false: Different custom properties on the same element should not have equal values expected false got true +FAIL random() in different custom properties on the same element should not be shared assert_false: Different custom properties on the same element should not have equal values expected false got true +PASS Shared by name within an element: 'random(--identifier element-scoped, a, b)' +PASS Shared by name within an element - shorthand: random(--identifier element-scoped, a, b)) +PASS Shared between elements within a property: random(property-index-scoped, a, b) +PASS Shared between elements within a property, random inside color functions: random(property-index-scoped, a, b) +PASS Shared between elements within a property, unresolved percentage values: random(property-index-scoped, a, b) +FAIL Shared between elements within a property - shorthand: random(property-index-scoped, a, b) assert_false: Random values should not be equal expected false got true PASS Shared globally: random(--identifier, a, b) -PASS Shared globally - shorthand: random(--identifier, a, b) -PASS Shorthand and longhand: random(a, b) -PASS Logical and physical property: random(a, b) -PASS Fixed: random(fixed , a, b) -FAIL Custom property with random() inside transform() should not have fixed assert_true: Random values should be equal expected true got false -FAIL random() with percentages inside multiple nested functions assert_true: expected true got false -PASS Different between elements with same identifier: random(--identifier element-scoped, a, b) +PASS Shared globally - shorthand: random(--other-identifier, a, b) +FAIL Shared by property - shorthand and longhand: random(property-index-scoped, a, b) assert_false: random() should not be shared between longhand and shorthand expected false got true +FAIL Shared by property - logical and physical property: random(property-index-scoped, a, b) assert_false: random() should not be shared between logical and physical properties expected false got true +FAIL Fixed: random(fixed , a, b) assert_true: Random value with fixed should be 150000px expected true got false +FAIL Custom property with random() inside transform() should not have 'fixed' assert_true: Random values should be equal expected true got false +FAIL random() with percentages inside multiple nested functions should have 'fixed' assert_true: expected true got false +PASS random(--identifier element-scoped, ...) should be different between elements PASS random() values should not be allowed as initial values in @property -PASS Unregistered properties in standard property: random(property-scoped) -FAIL Unregistered properties in registered properties: random(property-scoped) assert_false: expected false got true +PASS random() shared by property in var() +FAIL random() shared by custom property in var() assert_false: Random values should not be equal expected false got true PASS random() shared by shorthand property in var(), test random() value index -PASS random(property-scoped) via untyped attr() -PASS random(property-scoped) via typed attr() +PASS random() shared by property in attr() +PASS random() shared by property in typed attr() +PASS Test collision with property name and identifier +FAIL Test user specified assert_true: Random values should be equal expected true got false diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative.html index 6136179b2233..862c014ad988 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-computed.tentative.html @@ -1,7 +1,6 @@ - @@ -48,71 +47,52 @@ font-size: 30px; } .randomNoIdentifier { - width: random(0px, 100px); - height: random(0px, 100px); - left: random(0px, 100000px); - right: random(0px, 100000px); - margin: random(0px, 100000px) random(0px, 100000px); - --x: random(0, 100); - --y: random(0, 100); - --random-length-1: random(fixed random(0, 1), 10px, 100px); - --random-length-2: random(fixed random(0, 1), 10px, 100px); + width: random(0px, 300000px); + height: random(0px, 300000px); + left: random(0px, 300000px); + right: random(0px, 300000px); + margin: random(0px, 300000px) random(0px, 300000px); + --x: random(0, 300000); + --y: random(0, 300000); + --random-length-1: random(fixed random(0, 1), 0px, 100px); + --random-length-2: random(fixed random(0, 1), 0px, 100px); } - .randomElementScoped { - width: random(element-scoped, 0px, 100px); - height: random(element-scoped, 0px, 100px); - left: random(element-scoped, 0px, 100000px); - right: random(element-scoped, 0px, 100000px); - margin: random(element-scoped 0px, 100000px) random(element-scoped 0px, 100000px); - translate: random(element-scoped, 10%, 30%); - scale: random(element-scoped, 1, 3) random(element-scoped, 1, 3); - } - .randomPropertyScoped { - width: random(property-scoped, 0px, 100px); - height: random(property-scoped, 0px, 100px); - left: random(property-scoped, 0px, 100000px); - right: random(property-scoped, 0px, 100000px); - margin: random(property-scoped 0px, 100000px) random(property-scoped 0px, 100000px); - translate: random(property-scoped, 10%, 30%); - scale: random(property-scoped, 1, 3) random(property-scoped, 1, 3); - } - .randomPropertyIndexScoped { - width: random(property-index-scoped, 0px, 100px); - height: random(property-index-scoped, 0px, 100px); - left: random(property-index-scoped, 0px, 100000px); - right: random(property-index-scoped, 0px, 100000px); - margin: random(property-index-scoped 0px, 100000px) random(property-index-scoped 0px, 100000px); - translate: random(property-index-scoped, 10%, 30%); - scale: random(property-index-scoped, 1, 3) random(property-index-scoped, 1, 3); + .randomMatchElement { + width: random(property-index-scoped, 0px, 300000px); + height: random(property-index-scoped, 0px, 300000px); + left: random(property-index-scoped, 0px, 300000px); + right: random(property-index-scoped, 0px, 300000px); + margin: random(property-index-scoped, 0px, 300000px) random(property-index-scoped, 0px, 300000px); + translate: random(property-index-scoped, 0%, 300000%); + scale: random(property-index-scoped, 1, 300000) random(property-index-scoped, 1, 300000); } .randomIdentifier { - width: random(--identifier, 0px, 100px); - height: random(--identifier, 0px, 100px); - left: random(--identifier, 0px, 100000px); - right: random(--identifier, 0px, 100000px); - margin: random(--identifier 0px, 100000px) random(--identifier 0px, 100000px); - translate: random(--identifier, 10%, 30%); - scale: random(--identifier, 1, 3) random(--identifier, 1, 3); + width: random(--identifier element-scoped, 0px, 300000px); + height: random(--identifier element-scoped, 0px, 300000px); + left: random(--identifier element-scoped, 0px, 300000px); + right: random(--identifier element-scoped, 0px, 300000px); + margin: random(--identifier element-scoped, 0px, 300000px) random(--identifier element-scoped, 0px, 300000px); } - .randomElementScopedAndIdentifier { - width: random(element-scoped --other-identifier, 0px, 100px); - height: random(element-scoped --other-identifier, 0px, 100px); - left: random(element-scoped --other-identifier, 0px, 100000px); - right: random(element-scoped --other-identifier, 0px, 100000px); - margin: random(element-scoped --other-identifier 0px, 100000px) random(element-scoped --other-identifier 0px, 100000px); + .randomMatchElementAndIdentifier { + width: random(--other-identifier, 0px, 300000px); + height: random(--other-identifier, 0px, 300000px); + left: random(--other-identifier, 0px, 300000px); + right: random(--other-identifier, 0px, 300000px); + margin: random(--other-identifier, 0px, 300000px) random(--other-identifier, 0px, 300000px); } .randomFixed { - width: random(fixed 0.5, 10px, 100px); - height: random(fixed 0.5, 10px, 100px); - left: random(fixed 0.5, 0px, 100000px); - right: random(fixed 0.5, 0px, 100000px); - margin: random(fixed 0.5 0px, 100000px) random(fixed 0.5 0px, 100000px); + width: random(fixed 0.5, 1px, 300000px); + height: random(fixed 0.5, 1px, 300000px); + left: random(fixed 0.5, 1px, 300000px); + right: random(fixed 0.5, 1px, 300000px); + margin: random(fixed 0.5, 1px, 300000px) random(fixed 0.5, 1px, 300000px); } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-animations.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-animations.tentative.html new file mode 100644 index 000000000000..6af2da108896 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-animations.tentative.html @@ -0,0 +1,93 @@ + +CSS Values and Units Test: random() in animations + + + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative-expected.txt index 6e559c190a76..199df0dca662 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative-expected.txt @@ -1,5 +1,5 @@ -PASS Query condition should be valid but unknown: (width: random(element-shared, 10px, 30px)) +PASS Query condition should be valid but unknown: (width: random(--foo, 10px, 30px)) PASS Query condition should be valid but unknown: (height: random(10px, 30px)) PASS random() should be disallowed in @container style() query PASS random() in var() should be disallowed in @container style() query diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative.html index 7af86e41fa4d..0b466247aeba 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-container-query.tentative.html @@ -15,7 +15,7 @@ #container { container-type: size; --length: 30px; - --unregistered: random(element-shared, 30px, 10px); + --unregistered: random(--foo, 30px, 10px); } #target { --test1: true; @@ -26,25 +26,25 @@ --test6: true; --test7: true; } - @container style(--length: random(element-shared, 30px, 10px)) { + @container style(--length: random(--foo, 30px, 10px)) { #target { --test1: false; } } @container style(--length: var(--unregistered)) { #target { --test2: false; } } - @container style(--length = random(element-shared, 30px, 10px)) { + @container style(--length = random(--foo, 30px, 10px)) { #target { --test3: false; } } @container style(--unregistered = 30px) { #target { --test4: false; } } - @container style(random(element-shared, 30px, 10px) = random(element-shared, 30px, 10px)) { + @container style(random(--foo, 30px, 10px) = random(--foo, 30px, 10px)) { #target { --test5: false; } } - @container style(random(element-shared, 30px, 10px) <= random(element-shared, 30px, 10px) <= random(element-shared, 10px, 30px)) { + @container style(random(--foo, 30px, 10px) <= random(--foo, 30px, 10px) <= random(--foo, 10px, 30px)) { #target { --test6: false; } } - @container style(--length <= --length <= random(element-shared, 30px, 10px)) { + @container style(--length <= --length <= random(--foo, 30px, 10px)) { #target { --test7: false; } } @@ -55,7 +55,7 @@
+ + +
+
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-descriptors.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-descriptors.tentative-expected.txt index 29346bd09b41..24e29e53b3f0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-descriptors.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-descriptors.tentative-expected.txt @@ -1,6 +1,6 @@ -PASS random() should not be allowed in @font-face descriptors -PASS element-shared random() should not be allowed in @font-face descriptors -PASS random() -FAIL element-shared undefined is not an object (evaluating 'rules[3].swash.values') +PASS random() should not be allowed in @font-face font-weight descriptor +PASS element-scoped random() should not be allowed in @font-face font-stretch descriptor +PASS random() should not be allowed in @font-palette-values base-palette descriptor, check total +FAIL random() should not be allowed in @font-palette-values base-palette descriptor undefined is not an object (evaluating 'rules[3].swash.values') diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-descriptors.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-descriptors.tentative.html new file mode 100644 index 000000000000..99e0a37c9c0e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-descriptors.tentative.html @@ -0,0 +1,49 @@ + +CSS Values and Units Test: random() in at-rule descriptors + + + + + + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative-expected.txt index 9e79ee4367e7..c16dafbfbadd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative-expected.txt @@ -2,5 +2,5 @@ FAIL random() should not be allowed in if() style() condition assert_equals: expected "false" but got "if(style(random(1, 10) < random(11, 30)): true; else: false;)" FAIL random() in var() should not be allowed in if() style() condition assert_equals: expected "false" but got "if(style(random(1, 10) < random(11, 30)): true; else: false;)" FAIL random() with different property names should not be shared in if() declaration value assert_false: expected false got true -FAIL element-shared random() with same property name on different elements in if() declaration value should be equal assert_false: expected false got true +FAIL random() with same property name on different elements in if() declaration value should be equal assert_false: expected false got true diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative.html new file mode 100644 index 000000000000..afc68363b630 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-if.tentative.html @@ -0,0 +1,118 @@ + +CSS Values and Units Test: random() in if() + + + + + + + + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative-expected.txt index ebb5f529d4a0..f6f05e12dabb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative-expected.txt @@ -1,6 +1,6 @@ PASS Should be parseable: '(width > random(10px, 30px))' PASS Should be unknown: '(width > random(10px, 30px))' -PASS Should be parseable: '(width > random(element-shared, 10px, 30px))' -PASS Should be unknown: '(width > random(element-shared, 10px, 30px))' +PASS Should be parseable: '(width > random(--foo, 10px, 30px))' +PASS Should be unknown: '(width > random(--foo, 10px, 30px))' diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative.html index 8560ebe3d7ff..960698ef25f4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-in-media.tentative.html @@ -7,5 +7,5 @@ \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative-expected.txt index 5ce8a59d43f9..18204ee902bd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative-expected.txt @@ -22,4 +22,20 @@ PASS e.style['width'] = "random(fixed 0.5px, 1px, 2px)" should not set the prope PASS e.style['width'] = "random(fixed 0.5%, 1px, 2px)" should not set the property value PASS e.style['width'] = "random(fixed -1, 1px, 2px)" should not set the property value PASS e.style['width'] = "random(10deg, 20deg)" should not set the property value +PASS e.style['width'] = "random(element-scoped --foo --bar, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(element-scoped uawidth, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(foo element-scoped, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(element-scoped 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(--foo element-scoped element-scoped, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-scoped --foo ua-width, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-scoped ua-width-1, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(--foo element-scoped property-scoped element-scoped, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(foo property-scoped, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-scoped 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-scoped property-index-scoped, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-index-scoped --foo property-scoped, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-index-scoped ua-width-1, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(foo property-index-scoped, 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-index-scoped 1px, 2px)" should not set the property value +PASS e.style['width'] = "random(property-index-scoped property-scoped, 1px, 2px)" should not set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative.html index 81c33d88063a..cb574460174b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-invalid.tentative.html @@ -29,5 +29,21 @@ test_invalid_value('width', 'random(fixed 0.5%, 1px, 2px)'); test_invalid_value('width', 'random(fixed -1, 1px, 2px)'); test_invalid_value('width', 'random(10deg, 20deg)'); +test_invalid_value('width', 'random(element-scoped --foo --bar, 1px, 2px)'); +test_invalid_value('width', 'random(element-scoped uawidth, 1px, 2px)'); +test_invalid_value('width', 'random(foo element-scoped, 1px, 2px)'); +test_invalid_value('width', 'random(element-scoped 1px, 2px)'); +test_invalid_value('width', 'random(--foo element-scoped element-scoped, 1px, 2px)'); +test_invalid_value('width', 'random(property-scoped --foo ua-width, 1px, 2px)'); +test_invalid_value('width', 'random(property-scoped ua-width-1, 1px, 2px)'); +test_invalid_value('width', 'random(--foo element-scoped property-scoped element-scoped, 1px, 2px)'); +test_invalid_value('width', 'random(foo property-scoped, 1px, 2px)'); +test_invalid_value('width', 'random(property-scoped 1px, 2px)'); +test_invalid_value('width', 'random(property-scoped property-index-scoped, 1px, 2px)'); +test_invalid_value('width', 'random(property-index-scoped --foo property-scoped, 1px, 2px)'); +test_invalid_value('width', 'random(property-index-scoped ua-width-1, 1px, 2px)'); +test_invalid_value('width', 'random(foo property-index-scoped, 1px, 2px)'); +test_invalid_value('width', 'random(property-index-scoped 1px, 2px)'); +test_invalid_value('width', 'random(property-index-scoped property-scoped, 1px, 2px)'); - + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-serialize.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-serialize.tentative-expected.txt index e3b22573579b..842d404a43e8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-serialize.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-serialize.tentative-expected.txt @@ -1,38 +1,71 @@ -PASS e.style['width'] = "random(0px, 100px)" should set the property value -PASS e.style['width'] = "random(0px, 100px, 50px)" should set the property value +FAIL e.style['width'] = "random(0px, 100px)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped ua-width-1, 0px, 100px)" but got "random(0px, 100px)" +PASS e.style['width'] = "random(fixed 0.5, 0px, 100px)" should set the property value +FAIL e.style['height'] = "random(auto, 0px, 100px)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped ua-height-1, 0px, 100px)" but got "random(0px, 100px)" PASS e.style['width'] = "random(--foo, 0px, 100px)" should set the property value -PASS e.style['width'] = "random(auto, 0px, 100px)" should set the property value PASS e.style['width'] = "random(--foo element-scoped, 0px, 100px)" should set the property value -PASS e.style['width'] = "random(auto element-scoped, 0px, 100px)" should set the property value -PASS e.style['width'] = "random(element-scoped --foo, 0px, 100px)" should set the property value -PASS e.style['width'] = "random(element-scoped auto, 0px, 100px)" should set the property value -PASS e.style['width'] = "random(fixed 0.5, 0px, 100px)" should set the property value -PASS e.style['width'] = "random(--foo, 0px, 100px, 50px)" should set the property value -PASS e.style['width'] = "random(auto, 0px, 100px, 50px)" should set the property value -PASS e.style['width'] = "random(--foo element-scoped, 0px, 100px, 50px)" should set the property value -PASS e.style['width'] = "random(auto element-scoped, 0px, 100px, 50px)" should set the property value -PASS e.style['width'] = "random(element-scoped --foo, 0px, 100px, 50px)" should set the property value -PASS e.style['width'] = "random(element-scoped auto, 0px, 100px, 50px)" should set the property value -PASS e.style['width'] = "random(fixed 0.5, 0px, 100px, 50px)" should set the property value -FAIL e.style['width'] = "random(10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['width'] = "random(100px, 0px)" should set the property value -PASS e.style['width'] = "random(-100px, -10px)" should set the property value -PASS e.style['width'] = "random(-100px, -10px, -5px)" should set the property value -PASS e.style['width'] = "random(1em, 200rem)" should set the property value -PASS e.style['width'] = "random(10 * 100px, 200em / 2)" should set the property value +FAIL e.style['width'] = "random(element-scoped, 0px, 100px)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped, 0px, 100px)" but got "random( element-scoped, 0px, 100px)" +FAIL e.style['font-size'] = "random(property-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['font-size'] = "random(--foo property-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(property-index-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo property-index-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(element-scoped property-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo element-scoped property-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['height'] = "random(property-scoped element-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['height'] = "random(--foo property-scoped element-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(element-scoped property-index-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo element-scoped property-index-scoped, 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(property-index-scoped element-scoped , 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo property-index-scoped element-scoped , 0px, 100px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['height'] = "random(0px, 100px, 3px)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped ua-height-1, 0px, 100px, 3px)" but got "random(0px, 100px, 3px)" +PASS e.style['width'] = "random(fixed 0.5, 0px, 100px, 3px)" should set the property value +FAIL e.style['width'] = "random(auto, 0px, 100px, 3px)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped ua-width-1, 0px, 100px, 3px)" but got "random(0px, 100px, 3px)" +PASS e.style['width'] = "random(--foo, 0px, 100px, 3px)" should set the property value +FAIL e.style['width'] = "random(element-scoped, 0px, 100px, 3px)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped, 0px, 100px, 3px)" but got "random( element-scoped, 0px, 100px, 3px)" +PASS e.style['width'] = "random(--foo element-scoped, 0px, 100px, 3px)" should set the property value +FAIL e.style['width'] = "random(property-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo property-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(property-index-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo property-index-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(element-scoped property-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo element-scoped property-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(property-scoped element-scoped , 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo property-scoped element-scoped , 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(element-scoped property-index-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo element-scoped property-index-scoped, 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(property-index-scoped element-scoped , 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo property-index-scoped element-scoped , 0px, 100px, 3px)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +PASS e.style['width'] = "random(--foo, 100px, 0px)" should set the property value +PASS e.style['width'] = "random(--foo, -100px, -10px)" should set the property value +PASS e.style['width'] = "random(--foo, -100px, -10px, -5px)" should set the property value +PASS e.style['width'] = "random(--foo, 1em, 200rem)" should set the property value +FAIL e.style['width'] = "random(10 * 100px, 200em / 2)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped ua-width-1, 1000px, 100em)" but got "random(1000px, 100em)" +PASS e.style['width'] = "random(--foo, 10 * 100px, 200em / 2)" should set the property value PASS e.style['width'] = "random(fixed calc(2 / 4), 0px, 100px)" should set the property value -PASS e.style['width'] = "calc(2 * random(0px, 100px))" should set the property value -PASS e.style['math-depth'] = "add(random(0, 3))" should set the property value -PASS e.style['color'] = "rgb(random(0, 255) random(0, 255) random(0, 255))" should set the property value -FAIL e.style['color'] = "rgb(from blue r g random(b, (150 + b)))" should set the property value assert_equals: serialization should be canonical expected "rgb(from blue r g random(b, (150 + b)))" but got "rgb(from blue r g random(b, 150 + b))" -PASS e.style['color'] = "color-mix(in srgb, rgb(random(0, 255) 0 random(0, 255)), rgb(0 random(0, 255) 0))" should set the property value -PASS e.style['max-lines'] = "random(25, 50)" should set the property value -PASS e.style['max-lines'] = "random(25, 50, 5)" should set the property value -PASS e.style['scale'] = "random(0.5, 2.5)" should set the property value -PASS e.style['scale'] = "random(0.5, 2.5, 0.1)" should set the property value -PASS e.style['rotate'] = "random(25deg, 1turn)" should set the property value -PASS e.style['rotate'] = "random(25deg, 1turn, 5deg)" should set the property value -PASS e.style['transition-delay'] = "random(25ms, 50s)" should set the property value -PASS e.style['transition-delay'] = "random(25ms, 50s, 5s)" should set the property value +PASS e.style['width'] = "calc(2 * random(--foo, 0px, 100px))" should set the property value +PASS e.style['math-depth'] = "add(random(--foo, 0, 3))" should set the property value +PASS e.style['color'] = "rgb(random(--foo, 0, 255) random(--foo, 0, 255) random(--foo, 0, 255))" should set the property value +FAIL e.style['color'] = "rgb(from blue r g random(--foo, b, (150 + b)))" should set the property value assert_equals: serialization should be canonical expected "rgb(from blue r g random(--foo, b, (150 + b)))" but got "rgb(from blue r g random(--foo, b, 150 + b))" +PASS e.style['color'] = "color-mix(in srgb, rgb(random(--foo, 0, 255) 0 random(--foo, 0, 255)), rgb(0 random(--foo, 0, 255) 0))" should set the property value +PASS e.style['max-lines'] = "random(--foo, 25, 50)" should set the property value +PASS e.style['max-lines'] = "random(--foo, 25, 50, 5)" should set the property value +PASS e.style['scale'] = "random(--foo, 0.5, 2.5)" should set the property value +PASS e.style['scale'] = "random(--foo, 0.5, 2.5, 0.1)" should set the property value +FAIL e.style['rotate'] = "random(25deg, 1turn)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped ua-rotate-1, 25deg, 360deg)" but got "random(25deg, 360deg)" +PASS e.style['rotate'] = "random(--foo, 25deg, 1turn, 5deg)" should set the property value +FAIL e.style['transition-delay'] = "random(25ms, 50s)" should set the property value assert_equals: serialization should be canonical expected "random(element-scoped ua-transition-delay-1, 0.025s, 50s)" but got "random(0.025s, 50s)" +PASS e.style['transition-delay'] = "random(--foo, 25ms, 50s, 5s)" should set the property value +FAIL e.style['width'] = "random(ua-width, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo ua-width, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(ua-width-1, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo ua-width-1, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(element-scoped ua-height-1, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo element-scoped ua-height-1, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(ua-height-1 element-scoped, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo ua-height-1 element-scoped, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(ua-x, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo ua-x, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(ua-x element-scoped, 10px, 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['width'] = "random(--foo ua-x element-scoped, 10px, 20%)" 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-values/random-serialize.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-serialize.tentative.html index d1b8859b87e2..743b3a5620c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-serialize.tentative.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/random-serialize.tentative.html @@ -7,55 +7,125 @@
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-no-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-no-ref.html new file mode 100644 index 000000000000..8689eb0c5c16 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-no-ref.html @@ -0,0 +1,15 @@ + + +test reference + + + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-ref.html new file mode 100644 index 000000000000..e82d24064b72 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-ref.html @@ -0,0 +1,18 @@ + + +test reference + + + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/w3c-import.log index 082b8b64fda9..4b4ca022be01 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/w3c-import.log @@ -34,7 +34,10 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/ic-unit-012-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/ic-unit-013-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/ic-unit-014-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/ic-unit-016-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/vh-support-atviewport-ref.htm /LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/vh-update-and-transition-in-subframe-iframe-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/vh-update-and-transition-in-subframe-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-no-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-page-print-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/reference/viewport-unit-011-ref.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/w3c-import.log index d8df1db71c5c..c5263c25aa30 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/w3c-import.log @@ -36,3 +36,4 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/sibling-index-keyframe-value-dynamic.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/sibling-index-linear-gradient-gcs.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/tree-scoped-sibling-function.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/tree-counting/trig-functions-with-runtime-angle-arguments.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed-arithmetic-mixed-units-crash.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed-arithmetic-mixed-units-crash.html new file mode 100644 index 000000000000..957996fabd7e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed-arithmetic-mixed-units-crash.html @@ -0,0 +1,35 @@ + + +No crash for mixed-unit typed arithmetic in length-percentage values + +
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic-expected.txt index 59c8779deab7..fd2f696e56f3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic-expected.txt @@ -17,6 +17,8 @@ FAIL calc(10% * 10% / 1px * 10deg / 1deg / 10px) should be used-value-equivalent FAIL calc(10% * 10% / 1px * 1deg / 1deg) should be used-value-equivalent to 1px assert_equals: calc(10% * 10% / 1px * 1deg / 1deg) and 1px serialize to the same thing in used values. expected "1px" but got "10px" PASS calc(1px * 2deg / 1deg) should be used-value-equivalent to 2px PASS calc(1px * 3deg / 1deg / 1px) should be used-value-equivalent to 3 +PASS calc(1px * pow(50% / 1px, 1)) should be used-value-equivalent to 50px +FAIL e.style['width'] = "calc(1px * pow(tan(atan2(50%, 1px)), 1))" should not set the property value assert_equals: expected "" but got "calc(1px * pow(tan(atan2(50%, 1px)), 1))" PASS e.style['width'] = "calc((1% * 1deg) / 1px)" should not set the property value PASS e.style['width'] = "calc((1% * 1% * 1%) / 1px)" should not set the property value PASS Property width value 'calc(1px * 10em / 0em)' @@ -34,4 +36,6 @@ PASS clamp(-1, 1 / sign(exp(-1vh / 0px)), 1) should be used-value-equivalent to PASS calc(20cqw / 1rem) should be used-value-equivalent to 2 PASS Property animation-duration value 'calc(2s / (10s - 10s) * 1s)' PASS subtraction of angle unit: deg minus turn +PASS e.style['width'] = "calc(1px * 1px * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2)" should not set the property value +FAIL e.style['width'] = "calc(1px + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em + 1em)" should not set the property value assert_equals: expected "" but got "calc(201em + 1px)" diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic.html index 37f560d241ec..f988e40bd7a8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/typed_arithmetic.html @@ -59,6 +59,9 @@ // 1px * 3deg / 1deg / 1px -> 3. test_math_used("calc(1px * 3deg / 1deg / 1px)", "3", {"prop": "line-height"}); +test_math_used("calc(1px * pow(50% / 1px, 1))", "50px", {"prop": "width"}); +test_invalid_value("width", "calc(1px * pow(tan(atan2(50%, 1px)), 1))"); + test_invalid_value("width", "calc((1% * 1deg) / 1px)"); test_invalid_value("width", "calc((1% * 1% * 1%) / 1px)"); @@ -76,4 +79,6 @@ testComputedValueGreaterOrLowerThan("animation-duration", "calc(2s / (10s - 10s) * 1s)", REALLY_LARGE); testTransformValuesCloseTo("rotate(calc((40em - 40px) / 1px * 1deg - 0.5turn))", 0.0001, "rotate(180deg)", "subtraction of angle unit: deg minus turn"); +test_invalid_value("width", "calc(1px * 1px" + " * 2".repeat(200) + ")"); +test_invalid_value("width", "calc(1px + 1em" + " + 1em".repeat(200) + ")"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous-negative.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous-negative.sub-expected.txt new file mode 100644 index 000000000000..e34ddab0e81f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous-negative.sub-expected.txt @@ -0,0 +1,4 @@ +X + +FAIL cross-origin(anonymous) blocks cross-origin font loading without CORS headers assert_false: Cross-origin font without CORS headers should not load with cross-origin(anonymous) expected false got true + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous-negative.sub.html new file mode 100644 index 000000000000..e4e99dfe0472 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous-negative.sub.html @@ -0,0 +1,20 @@ + +Request URL Modifiers: cross-origin(anonymous) negative test for @font-face + + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous.sub-expected.txt new file mode 100644 index 000000000000..23aa9a8282e7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous.sub-expected.txt @@ -0,0 +1,4 @@ +X + +PASS cross-origin(anonymous) allows cross-origin font loading with CORS headers + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous.sub.html new file mode 100644 index 000000000000..fee9216649e5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous.sub.html @@ -0,0 +1,20 @@ + +Request URL Modifiers: cross-origin(anonymous) for @font-face + + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials-negative.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials-negative.sub-expected.txt new file mode 100644 index 000000000000..74ef639f68d9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials-negative.sub-expected.txt @@ -0,0 +1,4 @@ +X + +FAIL cross-origin(use-credentials) blocks cross-origin font loading without ACAC assert_false: Cross-origin font without ACAC should not load with cross-origin(use-credentials) expected false got true + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials-negative.sub.html new file mode 100644 index 000000000000..c77f515aa63c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials-negative.sub.html @@ -0,0 +1,20 @@ + +Request URL Modifiers: cross-origin(use-credentials) negative test for @font-face + + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials.sub-expected.txt new file mode 100644 index 000000000000..36a5ac59a5b7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials.sub-expected.txt @@ -0,0 +1,4 @@ +X + +PASS cross-origin(use-credentials) allows cross-origin font loading with ACAO+ACAC + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials.sub.html new file mode 100644 index 000000000000..508691cf176d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials.sub.html @@ -0,0 +1,20 @@ + +Request URL Modifiers: cross-origin(use-credentials) for @font-face + + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub.html index c0eb5d451488..849f3574d81a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub.html @@ -4,19 +4,19 @@ Request URL Modifiers: cross-origin(anonymous) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-image-cross-origin-anonymous.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub.html index 83ce64f57dd3..4cf8d6fd450d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub.html @@ -4,19 +4,19 @@ Request URL Modifiers: cross-origin(anonymous) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub.html index 73fc57dcbd4d..1883a588979e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub.html @@ -4,19 +4,19 @@ Request URL Modifiers: cross-origin(use-credentials) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub.html index a978de931fe3..af75cf4c4fad 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub.html @@ -4,19 +4,19 @@ Request URL Modifiers: cross-origin(use-credentials) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub.html new file mode 100644 index 000000000000..09fab9870113 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub.html @@ -0,0 +1,15 @@ + +Request URL Modifiers: cross-origin(anonymous) in image-set() negative test + + + + +

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

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub.html new file mode 100644 index 000000000000..b888ee601673 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub.html @@ -0,0 +1,15 @@ + +Request URL Modifiers: cross-origin(anonymous) in image-set() + + + + +

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

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub.html new file mode 100644 index 000000000000..65b8cdbd826b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub.html @@ -0,0 +1,26 @@ + + + +Request URL Modifiers: cross-origin(anonymous) negative test for @import + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-import-cross-origin-anonymous.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous.sub.html new file mode 100644 index 000000000000..c223229d8726 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous.sub.html @@ -0,0 +1,26 @@ + + + +Request URL Modifiers: cross-origin(anonymous) for @import + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub.html new file mode 100644 index 000000000000..d24b1e65c1e0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub.html @@ -0,0 +1,26 @@ + + + +Request URL Modifiers: cross-origin(use-credentials) negative test for @import + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub.html new file mode 100644 index 000000000000..d586984c1eab --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub.html @@ -0,0 +1,26 @@ + + + +Request URL Modifiers: cross-origin(use-credentials) for @import + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub-expected.html new file mode 100644 index 000000000000..f718ea6abfba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub-expected.html @@ -0,0 +1,2 @@ + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub.html new file mode 100644 index 000000000000..2f7964b1adc6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub.html @@ -0,0 +1,25 @@ + + + +Request URL Modifiers: cross-origin(anonymous) negative test for SVG filter + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub-expected.html new file mode 100644 index 000000000000..f718ea6abfba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub-expected.html @@ -0,0 +1,2 @@ + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub.html new file mode 100644 index 000000000000..9dd697b198bd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub.html @@ -0,0 +1,25 @@ + + + +Request URL Modifiers: cross-origin(anonymous) for SVG filter + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub-expected.html new file mode 100644 index 000000000000..f718ea6abfba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub-expected.html @@ -0,0 +1,2 @@ + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub.html new file mode 100644 index 000000000000..bad900e79832 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub.html @@ -0,0 +1,25 @@ + + + +Request URL Modifiers: cross-origin(use-credentials) negative test for SVG filter + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub-expected.html new file mode 100644 index 000000000000..f718ea6abfba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub-expected.html @@ -0,0 +1,2 @@ + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub.html new file mode 100644 index 000000000000..543c7f7f3351 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub.html @@ -0,0 +1,25 @@ + + + +Request URL Modifiers: cross-origin(use-credentials) for SVG filter + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/w3c-import.log index c5f69b42b937..3c1e5deffa8a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/w3c-import.log @@ -14,11 +14,35 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-anonymous.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-font-cross-origin-use-credentials.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous-negative.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-anonymous.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials-negative.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-cross-origin-use-credentials.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-image-set-cross-origin-anonymous.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-anonymous.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-import-cross-origin-use-credentials.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-anonymous.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/cross-origin/url-svg-filter-cross-origin-use-credentials.sub.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity-negative.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity-negative.sub-expected.txt new file mode 100644 index 000000000000..bbba75223b4a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity-negative.sub-expected.txt @@ -0,0 +1,4 @@ +X + +FAIL integrity() with wrong hash blocks font loading assert_false: Font with non-matching integrity should not load expected false got true + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity-negative.sub.html new file mode 100644 index 000000000000..6adb6f55d82e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity-negative.sub.html @@ -0,0 +1,20 @@ + +Request URL Modifiers: integrity() negative test for @font-face + + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity.sub-expected.txt new file mode 100644 index 000000000000..f62afb3858bd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity.sub-expected.txt @@ -0,0 +1,4 @@ +X + +PASS integrity() with correct hash allows font loading + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity.sub.html new file mode 100644 index 000000000000..47cd371ff413 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity.sub.html @@ -0,0 +1,20 @@ + +Request URL Modifiers: integrity() for @font-face + + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity-negative.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity-negative.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity-negative.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/integrity/url-image-integrity-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity-negative.sub.html new file mode 100644 index 000000000000..01a4de3ad30c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity-negative.sub.html @@ -0,0 +1,15 @@ + +Request URL Modifiers: integrity() negative test for background-image + + + + +

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

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/integrity/url-image-integrity.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity.sub.html new file mode 100644 index 000000000000..96afff25002a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity.sub.html @@ -0,0 +1,15 @@ + +Request URL Modifiers: integrity() for background-image + + + + +

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

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity-negative.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity-negative.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity-negative.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/integrity/url-import-integrity-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity-negative.sub.html new file mode 100644 index 000000000000..6bfdfa8ec4ce --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity-negative.sub.html @@ -0,0 +1,26 @@ + + + +Request URL Modifiers: integrity() negative test for @import + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/integrity/url-import-integrity.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity.sub.html new file mode 100644 index 000000000000..3f2ef5012df0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity.sub.html @@ -0,0 +1,26 @@ + + + +Request URL Modifiers: integrity() for @import + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub-expected.html new file mode 100644 index 000000000000..f718ea6abfba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub-expected.html @@ -0,0 +1,2 @@ + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub.html new file mode 100644 index 000000000000..6bbf12d1c73d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub.html @@ -0,0 +1,25 @@ + + + +Request URL Modifiers: integrity() negative test for SVG filter + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub-expected.html new file mode 100644 index 000000000000..f718ea6abfba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub-expected.html @@ -0,0 +1,2 @@ + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub.html new file mode 100644 index 000000000000..278c6b309224 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub.html @@ -0,0 +1,25 @@ + + + +Request URL Modifiers: integrity() for SVG filter + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/w3c-import.log new file mode 100644 index 000000000000..bacdf728b5d3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/w3c-import.log @@ -0,0 +1,30 @@ +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-values/urls/integrity/url-font-integrity-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-font-integrity.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity-negative.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-image-integrity.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity-negative.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-import-integrity.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity-negative.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/integrity/url-svg-filter-integrity.sub.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.html similarity index 82% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.html index e960d92fe70e..4cae0dda4247 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(no-referrer-when-downgrade) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.html similarity index 82% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.html index b374f7176297..8f08cc2118e5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(no-referrer-when-downgrade) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/w3c-import.log index af318b7587d0..de0a297c5980 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/w3c-import.log @@ -14,7 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer-when-downgrade/url-image-referrer-policy-same-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-font-referrer-policy.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-font-referrer-policy.sub-expected.txt new file mode 100644 index 000000000000..24b105d9ce8b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-font-referrer-policy.sub-expected.txt @@ -0,0 +1,4 @@ +X + +PASS referrer-policy(no-referrer) sends no referrer for @font-face + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-font-referrer-policy.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-font-referrer-policy.sub.html new file mode 100644 index 000000000000..9f6a279a5b17 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-font-referrer-policy.sub.html @@ -0,0 +1,20 @@ + +Request URL Modifiers: referrer-policy(no-referrer) for @font-face + + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.html index dbfd63b23e60..5ee17ace028a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(no-referrer) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet.html new file mode 100644 index 000000000000..c19eff91d556 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet.html @@ -0,0 +1,19 @@ + + + +Request URL Modifiers: referrer-policy(no-referrer) in external stylesheet + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.html index c25f059ded9b..77996fcbc82d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(no-referrer) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub.html new file mode 100644 index 000000000000..bfeac0938f36 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub.html @@ -0,0 +1,16 @@ + +Request URL Modifiers: referrer-policy(no-referrer) in image-set() + + + + +

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

+
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-import-referrer-policy-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-import-referrer-policy-expected.txt new file mode 100644 index 000000000000..967ab1379898 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-import-referrer-policy-expected.txt @@ -0,0 +1,4 @@ +X + +FAIL referrer-policy(no-referrer) sends no referrer for @import assert_equals: @import with referrer-policy(no-referrer) should apply green style expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-import-referrer-policy.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-import-referrer-policy.html new file mode 100644 index 000000000000..d2e8f82ed896 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-import-referrer-policy.html @@ -0,0 +1,22 @@ + +Request URL Modifiers: referrer-policy(no-referrer) for @import + + + +
X
+ diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub-expected.html new file mode 100644 index 000000000000..f718ea6abfba --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub-expected.html @@ -0,0 +1,2 @@ + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub.html new file mode 100644 index 000000000000..e1f2388f9ad4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub.html @@ -0,0 +1,25 @@ + + + +Request URL Modifiers: referrer-policy(no-referrer) for SVG filter + + + + + + +
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/w3c-import.log index b63a83882100..d4cbd35e5e45 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/w3c-import.log @@ -14,7 +14,15 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-font-referrer-policy.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-external-stylesheet.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-referrer-policy-same-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-image-set-referrer-policy.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-import-referrer-policy.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/no-referrer/url-svg-filter-referrer-policy.sub.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.html similarity index 82% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.html index 600f2b17c729..c9e6cc68b0dd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(origin-when-cross-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.html similarity index 82% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.html index 469bbdcdf43c..5c7bb1a515be 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(origin-when-cross-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/w3c-import.log index ada3a5d8e368..de611b849c6a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/w3c-import.log @@ -14,7 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin-when-cross-origin/url-image-referrer-policy-same-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.html index 5bf82ea74974..0e85e78ccf2a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet.html new file mode 100644 index 000000000000..5efbf1670af8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet.html @@ -0,0 +1,19 @@ + + + +Request URL Modifiers: referrer-policy(origin) in external stylesheet + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.html index 378c24c9e1d8..75da7564f06b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/w3c-import.log index f530b4a0ca01..7ffb3f911cef 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/w3c-import.log @@ -14,7 +14,9 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-external-stylesheet.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/origin/url-image-referrer-policy-same-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.html index 3c2280ef1f0c..fc4615bdded0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(same-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.html index 62ba453f92d2..b395d759a4f8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(same-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/w3c-import.log index 04c3bda21984..beeca16eb4ae 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/w3c-import.log @@ -14,7 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/same-origin/url-image-referrer-policy-same-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.html similarity index 82% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.html index c90b28fc01ef..9beb935c7c57 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(strict-origin-when-cross-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.html similarity index 82% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.html index 92a328959325..5ea5111f3ba8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(strict-origin-when-cross-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/w3c-import.log index 170441c3a055..35d23f4b4ed6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/w3c-import.log @@ -14,7 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin-when-cross-origin/url-image-referrer-policy-same-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.html index 8fbbc15cfe47..8a833ad82d8e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(strict-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.html index 678eb9a6d466..87f78dd75421 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(strict-origin) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/w3c-import.log index b20f0c7d35d4..431db84cc988 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/w3c-import.log @@ -14,7 +14,7 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/strict-origin/url-image-referrer-policy-same-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.html index cebe8759157a..187b8ecbe3f9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(unsafe-url) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet.html new file mode 100644 index 000000000000..73a91f386ef7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet.html @@ -0,0 +1,19 @@ + + + +Request URL Modifiers: referrer-policy(unsafe-url) in external stylesheet + + + + + + +

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

+
+ + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin-expected.xht b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin-expected.xht new file mode 100644 index 000000000000..05a13794482a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin-expected.xht @@ -0,0 +1,19 @@ + + + + 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-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.html similarity index 81% rename from LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub.html rename to LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.html index b7a8497df18e..a4d1db660994 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.html @@ -4,7 +4,7 @@ Request URL Modifiers: referrer-policy(unsafe-url) - + -

Test passes if there is a green square.

+

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

diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub-expected.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub-expected.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/w3c-import.log index 0058dc3c9ebb..36baa1356f2f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/w3c-import.log @@ -14,7 +14,9 @@ Property values requiring vendor prefixes: None ------------------------------------------------------------------------ List of files: -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.sub.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub-expected.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-cross-origin.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-external-stylesheet.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin-expected.xht +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrer-policy-same-origin.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-no-referrer.sub.css b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-no-referrer.sub.css new file mode 100644 index 000000000000..a82118d9e41c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-no-referrer.sub.css @@ -0,0 +1,6 @@ +.test { + width: 100px; + height: 100px; + background-color: blue; + background-image: url("{{location[server]}}/css/css-values/urls/support/image-referrer-policy.py?expected_referrer=none" referrer-policy(no-referrer)); +} diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-origin.sub.css b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-origin.sub.css new file mode 100644 index 000000000000..7bc434372f71 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-origin.sub.css @@ -0,0 +1,6 @@ +.test { + width: 100px; + height: 100px; + background-color: blue; + background-image: url("{{location[server]}}/css/css-values/urls/support/image-referrer-policy.py?expected_referrer=origin&origin={{location[server]}}/" referrer-policy(origin)); +} diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-unsafe-url.sub.css b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-unsafe-url.sub.css new file mode 100644 index 000000000000..666c6b891a6c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-unsafe-url.sub.css @@ -0,0 +1,6 @@ +.test { + width: 100px; + height: 100px; + background-color: blue; + background-image: url("{{location[server]}}/css/css-values/urls/support/image-referrer-policy.py?expected_referrer=url&url={{location[server]}}{{location[pathname]}}" referrer-policy(unsafe-url)); +} diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/font-referrer-policy.py b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/font-referrer-policy.py new file mode 100644 index 000000000000..0f0fe208474e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/font-referrer-policy.py @@ -0,0 +1,39 @@ +import os.path + +HERE = os.path.dirname(__file__) +WPT_ROOT = os.path.abspath(os.path.join(HERE, "../../../..")) + +def main(request, response): + expected_referrer = request.GET[b'expected_referrer'] + actual_referrer = request.headers.get(b'referer', b'') + + if expected_referrer == b'none': + match = actual_referrer == b'' + elif expected_referrer == b'origin': + origin = request.GET[b'origin'] + match = actual_referrer == origin + elif expected_referrer == b'url': + url = request.GET[b'url'] + match = actual_referrer == url + else: + match = False + + response.add_required_headers = False + response.writer.write_status(200) + response.writer.write_header(b"access-control-allow-origin", b"*") + response.writer.write_header(b"cache-control", b"no-cache; must-revalidate") + + if match: + # Return a valid font. + font_path = os.path.join(WPT_ROOT, u"fonts", u"Ahem.ttf") + with open(font_path, u"rb") as f: + body = f.read() + response.writer.write_header(b"content-type", b"font/truetype") + else: + # Return an empty body, so the font fails to load. + body = b"" + response.writer.write_header(b"content-type", b"text/plain") + + response.writer.write_header(b"content-length", len(body)) + response.writer.end_headers() + response.writer.write(body) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/green-style.css b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/green-style.css new file mode 100644 index 000000000000..2529418e750d --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/green-style.css @@ -0,0 +1 @@ +div { background-color: green !important; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.py b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.py index cff09165f104..27573b0df78d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.py +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.py @@ -3,8 +3,6 @@ from wptserve.utils import isomorphic_decode def main(request, response): - origin = request.GET[b'origin'] - url = request.GET[b'url'] expected_referrer = request.GET[b'expected_referrer'] actual_referrer = request.headers.get(b'referer', b'') @@ -14,11 +12,13 @@ def main(request, response): else: body = open(os.path.join(os.path.dirname(isomorphic_decode(__file__)), u"1x1-red.png"), u"rb").read() elif expected_referrer == b'origin': + origin = request.GET[b'origin'] if actual_referrer == origin: body = open(os.path.join(os.path.dirname(isomorphic_decode(__file__)), u"1x1-green.png"), u"rb").read() else: body = open(os.path.join(os.path.dirname(isomorphic_decode(__file__)), u"1x1-red.png"), u"rb").read() elif expected_referrer == b'url': + url = request.GET[b'url'] if actual_referrer == url: body = open(os.path.join(os.path.dirname(isomorphic_decode(__file__)), u"1x1-green.png"), u"rb").read() else: @@ -29,6 +29,7 @@ def main(request, response): response.add_required_headers = False response.writer.write_status(200) + response.writer.write_header(b"content-type", b"image/png") if b'corp' in request.GET: response.writer.write_header(b"cross-origin-resource-policy", request.GET[b'corp']) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.sub.js b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.sub.js index 52152278d86a..5089359e5502 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.sub.js +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.sub.js @@ -10,8 +10,8 @@ function test_image_referrer_policy(descriptor) { var style = document.createElement("style"); style.innerHTML = ` .test { - width: 200px; - height: 200px; + width: 100px; + height: 100px; background-color: blue; background-image: ${make_test_url(descriptor.load_type, descriptor.referrer_policy, descriptor.expected_referrer)}; };`; diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/red-style.css b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/red-style.css new file mode 100644 index 000000000000..44805bba28fe --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/red-style.css @@ -0,0 +1 @@ +div { background-color: red !important; } diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/stylesheet-referrer-policy.py b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/stylesheet-referrer-policy.py new file mode 100644 index 000000000000..56aff21f7868 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/stylesheet-referrer-policy.py @@ -0,0 +1,29 @@ +def main(request, response): + expected_referrer = request.GET[b'expected_referrer'] + actual_referrer = request.headers.get(b'referer', b'') + + if expected_referrer == b'none': + match = actual_referrer == b'' + elif expected_referrer == b'origin': + origin = request.GET[b'origin'] + match = actual_referrer == origin + elif expected_referrer == b'url': + url = request.GET[b'url'] + match = actual_referrer == url + else: + match = False + + response.add_required_headers = False + response.writer.write_status(200) + response.writer.write_header(b"access-control-allow-origin", b"*") + response.writer.write_header(b"content-type", b"text/css") + response.writer.write_header(b"cache-control", b"no-cache; must-revalidate") + + if match: + body = b"#test { color: green; }" + else: + body = b"#test { color: red; }" + + response.writer.write_header(b"content-length", len(body)) + response.writer.end_headers() + response.writer.write(body) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/svg-filter-referrer-policy.py b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/svg-filter-referrer-policy.py new file mode 100644 index 000000000000..f186a0003a6c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/svg-filter-referrer-policy.py @@ -0,0 +1,37 @@ +def main(request, response): + expected_referrer = request.GET[b'expected_referrer'] + actual_referrer = request.headers.get(b'referer', b'') + + if expected_referrer == b'none': + match = actual_referrer == b'' + elif expected_referrer == b'origin': + origin = request.GET[b'origin'] + match = actual_referrer == origin + elif expected_referrer == b'url': + url = request.GET[b'url'] + match = actual_referrer == url + else: + match = False + + response.add_required_headers = False + response.writer.write_status(200) + response.writer.write_header(b"access-control-allow-origin", b"*") + response.writer.write_header(b"content-type", b"image/svg+xml") + response.writer.write_header(b"cache-control", b"no-cache; must-revalidate") + + if match: + body = ( + b'' + b'' + b'' + b'' + b'' + b'' + b'' + ) + else: + body = b"" + + response.writer.write_header(b"content-length", len(body)) + response.writer.end_headers() + response.writer.write(body) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/w3c-import.log index 9cf2c2c179b0..99798c462bca 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/w3c-import.log @@ -18,7 +18,15 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/1x1-navy.png /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/1x1-red.png /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/empty-urls.css +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-no-referrer.sub.css +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-origin.sub.css +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/external-referrer-policy-unsafe-url.sub.css +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/font-referrer-policy.py /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/fragment-only-urls.css +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/green-style.css /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.py /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/image-referrer-policy.sub.js +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/red-style.css /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/relative-urls.css +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/stylesheet-referrer-policy.py +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/support/svg-filter-referrer-policy.py diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-image-ref.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-image-ref.html deleted file mode 100644 index a56c789f1474..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-image-ref.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -

Test passes if there is a green square.

-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-font-face-parsing-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-font-face-parsing-expected.txt new file mode 100644 index 000000000000..2b13987a9431 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-font-face-parsing-expected.txt @@ -0,0 +1,10 @@ + +FAIL cross-origin(anonymous) in @font-face src assert_not_equals: should be valid got disallowed value "" +FAIL referrer-policy(no-referrer) in @font-face src assert_not_equals: should be valid got disallowed value "" +FAIL integrity() in @font-face src assert_not_equals: should be valid got disallowed value "" +FAIL multiple modifiers in @font-face src assert_not_equals: should be valid got disallowed value "" +FAIL modifiers with format() in @font-face src assert_not_equals: should be valid got disallowed value "" +FAIL unknown modifier in @font-face src assert_not_equals: should be valid got disallowed value "" +PASS duplicate cross-origin in @font-face src +PASS duplicate unknown modifier in @font-face src + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-font-face-parsing.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-font-face-parsing.html new file mode 100644 index 000000000000..97547eab1b94 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-font-face-parsing.html @@ -0,0 +1,63 @@ + +Request URL Modifiers: @font-face src parsing + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-import-parsing.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-import-parsing.sub-expected.txt new file mode 100644 index 000000000000..fea97a5d2012 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-import-parsing.sub-expected.txt @@ -0,0 +1,12 @@ + +FAIL cross-origin(anonymous) in @import assert_equals: should have one rule expected 1 but got 0 +FAIL referrer-policy(no-referrer) in @import assert_equals: should have one rule expected 1 but got 0 +FAIL integrity() in @import assert_equals: should have one rule expected 1 but got 0 +FAIL multiple modifiers in @import assert_equals: should have one rule expected 1 but got 0 +FAIL all three modifiers in @import assert_equals: should have one rule expected 1 but got 0 +FAIL cross-origin(anonymous) serialized in @import cssText assert_equals: should have one rule expected 1 but got 0 +FAIL multiple modifiers serialized in canonical order in @import cssText assert_equals: should have one rule expected 1 but got 0 +PASS duplicate cross-origin in @import +PASS duplicate cross-origin in @import between referrer-policy +PASS unquoted url() with cross-origin in @import + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-import-parsing.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-import-parsing.sub.html new file mode 100644 index 000000000000..5c9b7b4ad1fd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-import-parsing.sub.html @@ -0,0 +1,76 @@ + +Request URL Modifiers: @import parsing + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub-expected.txt index 588d841abec6..0b59b2cafa73 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub-expected.txt @@ -28,6 +28,13 @@ PASS e.style['background-image'] = "url(\"http://web-platform.test:8800/css/supp PASS e.style['background-image'] = "url(\"http://web-platform.test:8800/css/support/1x1-green.png\" referrer-policy(no-referrer) referrer-policy(same-origin))" should not set the property value PASS e.style['background-image'] = "url(referrer-policy(no-referrer) \"http://web-platform.test:8800/css/support/1x1-green.png\")" should not set the property value PASS e.style['background-image'] = "\"http://web-platform.test:8800/css/support/1x1-green.png\" referrer-policy(no-referrer)" should not set the property value -PASS e.style['background-image'] = "url(\"http://web-platform.test:8800/css/support/1x1-green.png\" crossorigin(anonymous))" should not set the property value -PASS e.style['background-image'] = "url(\"http://web-platform.test:8800/css/support/1x1-green.png\" referrerpolicy(no-referrer))" should not set the property value +PASS e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar(baz) foobar(baz))" should not set the property value +PASS e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar(baz) foobar(qux))" should not set the property value +PASS e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar foobar)" should not set the property value +PASS e.style['background-image'] = "url(\"/css/support/1x1-green.png\" FooBar foobar)" should not set the property value +PASS e.style['background-image'] = "url(\"/css/support/1x1-green.png\" 42)" should not set the property value +PASS e.style['background-image'] = "url(\"/css/support/1x1-green.png\" \"foobar\")" should not set the property value +PASS e.style['background-image'] = "url(http://web-platform.test:8800/css/support/1x1-green.png cross-origin(anonymous))" should not set the property value +PASS e.style['background-image'] = "url(http://web-platform.test:8800/css/support/1x1-green.png integrity(\"sha384-foobar\"))" should not set the property value +PASS e.style['background-image'] = "url(http://web-platform.test:8800/css/support/1x1-green.png referrer-policy(no-referrer))" should not set the property value diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub.html index f0e1a59053f8..178417fca738 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub.html @@ -38,8 +38,22 @@ test_invalid_value('background-image', 'url(referrer-policy(no-referrer) "http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png")'); test_invalid_value('background-image', '"http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png" referrer-policy(no-referrer)'); -// Test outdated names. -test_invalid_value('background-image', 'url("http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png" crossorigin(anonymous))'); -test_invalid_value('background-image', 'url("http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png" referrerpolicy(no-referrer))'); +// Duplicates of unknown s are not allowed, even though +// individual unknown modifiers are silently ignored. +test_invalid_value('background-image', 'url("/css/support/1x1-green.png" foobar(baz) foobar(baz))'); +test_invalid_value('background-image', 'url("/css/support/1x1-green.png" foobar(baz) foobar(qux))'); +test_invalid_value('background-image', 'url("/css/support/1x1-green.png" foobar foobar)'); +test_invalid_value('background-image', 'url("/css/support/1x1-green.png" FooBar foobar)'); + +// Tokens that aren't an ident or function should be a parse error. +test_invalid_value('background-image', 'url("/css/support/1x1-green.png" 42)'); +test_invalid_value('background-image', 'url("/css/support/1x1-green.png" "foobar")'); + +// "A that is either unquoted or not wrapped in url() notation +// cannot accept any s." +// https://drafts.csswg.org/css-values-4/#url-modifiers +test_invalid_value('background-image', 'url(http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png cross-origin(anonymous))'); +test_invalid_value('background-image', 'url(http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png integrity("sha384-foobar"))'); +test_invalid_value('background-image', 'url(http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png referrer-policy(no-referrer))'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub-expected.txt index 8669df0d6466..2f25c2ccef5d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub-expected.txt @@ -22,4 +22,14 @@ FAIL e.style['background-image'] = "url(\"http://web-platform.test:8800/css/supp FAIL e.style['background-image'] = "url(\"http://web-platform.test:8800/css/support/1x1-green.png\" integrity(\"sha384-foobar\") referrer-policy(no-referrer) cross-origin(anonymous))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['background-image'] = "url(\"http://web-platform.test:8800/css/support/1x1-green.png\" referrer-policy(no-referrer) cross-origin(anonymous) integrity(\"sha384-foobar\"))" should set the property value assert_not_equals: property should be set got disallowed value "" FAIL e.style['background-image'] = "url(\"http://web-platform.test:8800/css/support/1x1-green.png\" referrer-policy(no-referrer) integrity(\"sha384-foobar\") cross-origin(anonymous))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar(baz))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar)" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar(baz) cross-origin(anonymous))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" cross-origin(anonymous) foobar(a b c))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar(nes(ted)) integrity(\"sha384-foobar\"))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar([brackets {braces}]) referrer-policy(no-referrer))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" crossorigin(anonymous))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" referrerpolicy(no-referrer))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar foobar(42))" should set the property value assert_not_equals: property should be set got disallowed value "" +FAIL e.style['background-image'] = "url(\"/css/support/1x1-green.png\" foobar(42) foobar)" 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-values/urls/url-request-modifiers-serialize.sub.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub.html index e60a0a268d43..5ea2b5c6b97e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub.html @@ -40,4 +40,45 @@ test_valid_value('background-image', 'url("http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png" referrer-policy(no-referrer) cross-origin(anonymous) integrity("sha384-foobar"))', 'url("http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png" cross-origin(anonymous) integrity("sha384-foobar") referrer-policy(no-referrer))'); test_valid_value('background-image', 'url("http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png" referrer-policy(no-referrer) integrity("sha384-foobar") cross-origin(anonymous))', 'url("http://{{hosts[][]}}:{{ports[http][0]}}/css/support/1x1-green.png" cross-origin(anonymous) integrity("sha384-foobar") referrer-policy(no-referrer))'); +// Unknown s are silently ignored, and so are dropped +// from the serialized form... +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" foobar(baz))', + 'url("/css/support/1x1-green.png")'); +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" foobar)', + 'url("/css/support/1x1-green.png")'); + +// ...but if there is a valid following an unknown +// modifier, it should still be recognized. +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" foobar(baz) cross-origin(anonymous))', + 'url("/css/support/1x1-green.png" cross-origin(anonymous))'); +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" cross-origin(anonymous) foobar(a b c))', + 'url("/css/support/1x1-green.png" cross-origin(anonymous))'); +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" foobar(nes(ted)) integrity("sha384-foobar"))', + 'url("/css/support/1x1-green.png" integrity("sha384-foobar"))'); +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" foobar([brackets {braces}]) referrer-policy(no-referrer))', + 'url("/css/support/1x1-green.png" referrer-policy(no-referrer))'); + +// Outdated modifier names (no dashes) are unknown and so are silently ignored. +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" crossorigin(anonymous))', + 'url("/css/support/1x1-green.png")'); +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" referrerpolicy(no-referrer))', + 'url("/css/support/1x1-green.png")'); + +// An ident-form unknown modifier and a function-form unknown modifier +// with the same name are not duplicates of each other, since they're +// syntactically distinct. +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" foobar foobar(42))', + 'url("/css/support/1x1-green.png")'); +test_valid_value('background-image', + 'url("/css/support/1x1-green.png" foobar(42) foobar)', + 'url("/css/support/1x1-green.png")'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/w3c-import.log index 9da10c4f90e2..1dedd50d669a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/w3c-import.log @@ -18,7 +18,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/fragment-only.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/resolve-relative-to-base.sub.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/resolve-relative-to-stylesheet.html -/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-image-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-computed.sub.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-font-face-parsing.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-import-parsing.sub.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-invalid.sub.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/urls/url-request-modifiers-serialize.sub.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-page-print.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-page-print.html new file mode 100644 index 000000000000..385434859ec8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-page-print.html @@ -0,0 +1,42 @@ + + +Viewport units respond to page margins + + + + + + + + +
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/w3c-import.log index 54c893dd1477..e7e22d68e96d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-values/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-values/w3c-import.log @@ -41,6 +41,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-container-style-query.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-crash.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-cycle.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-dynamic-marker-content.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-in-max-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-in-max.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-in-slotted-expected.html @@ -69,8 +71,18 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-notype-fallback-ref.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-notype-fallback.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-null-namespace.xhtml +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation-2.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-elem-invalidation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-marker.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-pseudo-element-placeholder.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-revert-rule.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-animation.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-if.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security-transition.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-security.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-serialization.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-1-expected.html @@ -81,6 +93,12 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-2.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-3-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-3.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-4.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-style-sharing-5.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/attr-universal-selector.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-angle-values.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/calc-background-image-gradient-1-expected.html @@ -296,6 +314,9 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/getComputedStyle-calc-mixed-units-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/getComputedStyle-calc-mixed-units-002.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/getComputedStyle-calc-mixed-units-003.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity-ref.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/html-attr-case-insensitivity.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-invalid.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-serialize.html @@ -323,6 +344,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/ic-unit-014.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/ic-unit-015-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/ic-unit-015.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/ic-unit-016-expected.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/ic-unit-016.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/ident-function-computed.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/ident-function-parsing.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/if-conditionals.html @@ -349,6 +372,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/integer_interpolation_round_half_towards_positive_infinity_order.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/integer_interpolation_round_half_towards_positive_infinity_z_index.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/lh-rlh-on-root-001.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/lh-rlh-percentage-line-height-with-zoom.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/lh-unit-001-expected.xht /LayoutTests/imported/w3c/web-platform-tests/css/css-values/lh-unit-001.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/lh-unit-002-expected.xht @@ -480,6 +504,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/css/css-values/vh-update-and-transition-in-subframe.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/vh-zero-support-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/vh-zero-support.html +/LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-page-print.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-relative-lengths-scaled-viewport.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-unit-011-expected.html /LayoutTests/imported/w3c/web-platform-tests/css/css-values/viewport-unit-011.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/w3c-import.log new file mode 100644 index 000000000000..8c0c9a21439a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/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-viewport/animations/zoom-interpolation.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/zoom-interpolation-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/zoom-interpolation-expected.txt new file mode 100644 index 000000000000..18c5b9a6baa4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/zoom-interpolation-expected.txt @@ -0,0 +1,204 @@ + +FAIL CSS Transitions: property from neutral to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions: property from neutral to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions: property from neutral to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions: property from neutral to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions: property from neutral to [2] at (1) should be [2] +FAIL CSS Transitions: property from neutral to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +FAIL CSS Transitions with transition: all: property from neutral to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions with transition: all: property from neutral to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions with transition: all: property from neutral to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions with transition: all: property from neutral to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions with transition: all: property from neutral to [2] at (1) should be [2] +FAIL CSS Transitions with transition: all: property from neutral to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +FAIL CSS Animations: property from neutral to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS CSS Animations: property from neutral to [2] at (0) should be [1] +FAIL CSS Animations: property from neutral to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL CSS Animations: property from neutral to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL CSS Animations: property from neutral to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Animations: property from neutral to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +FAIL Web Animations: property from neutral to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS Web Animations: property from neutral to [2] at (0) should be [1] +FAIL Web Animations: property from neutral to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL Web Animations: property from neutral to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL Web Animations: property from neutral to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from neutral to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +FAIL CSS Transitions: property from [initial] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions: property from [initial] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions: property from [initial] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions: property from [initial] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions: property from [initial] to [2] at (1) should be [2] +FAIL CSS Transitions: property from [initial] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +FAIL CSS Transitions with transition: all: property from [initial] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions with transition: all: property from [initial] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions with transition: all: property from [initial] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions with transition: all: property from [initial] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions with transition: all: property from [initial] to [2] at (1) should be [2] +FAIL CSS Transitions with transition: all: property from [initial] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +FAIL CSS Animations: property from [initial] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS CSS Animations: property from [initial] to [2] at (0) should be [1] +FAIL CSS Animations: property from [initial] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL CSS Animations: property from [initial] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL CSS Animations: property from [initial] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Animations: property from [initial] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +FAIL Web Animations: property from [initial] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS Web Animations: property from [initial] to [2] at (0) should be [1] +FAIL Web Animations: property from [initial] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL Web Animations: property from [initial] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL Web Animations: property from [initial] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from [initial] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +FAIL CSS Transitions: property from [inherit] to [2] at (-0.3) should be [3.3] assert_equals: expected "3.3 " but got "2 " +FAIL CSS Transitions: property from [inherit] to [2] at (0) should be [3] assert_equals: expected "3 " but got "2 " +FAIL CSS Transitions: property from [inherit] to [2] at (0.3) should be [2.7] assert_equals: expected "2.7 " but got "2 " +FAIL CSS Transitions: property from [inherit] to [2] at (0.6) should be [2.4] assert_equals: expected "2.4 " but got "2 " +PASS CSS Transitions: property from [inherit] to [2] at (1) should be [2] +FAIL CSS Transitions: property from [inherit] to [2] at (1.5) should be [1.5] assert_equals: expected "1.5 " but got "2 " +FAIL CSS Transitions with transition: all: property from [inherit] to [2] at (-0.3) should be [3.3] assert_equals: expected "3.3 " but got "2 " +FAIL CSS Transitions with transition: all: property from [inherit] to [2] at (0) should be [3] assert_equals: expected "3 " but got "2 " +FAIL CSS Transitions with transition: all: property from [inherit] to [2] at (0.3) should be [2.7] assert_equals: expected "2.7 " but got "2 " +FAIL CSS Transitions with transition: all: property from [inherit] to [2] at (0.6) should be [2.4] assert_equals: expected "2.4 " but got "2 " +PASS CSS Transitions with transition: all: property from [inherit] to [2] at (1) should be [2] +FAIL CSS Transitions with transition: all: property from [inherit] to [2] at (1.5) should be [1.5] assert_equals: expected "1.5 " but got "2 " +FAIL CSS Animations: property from [inherit] to [2] at (-0.3) should be [3.3] assert_equals: expected "3.3 " but got "1 " +FAIL CSS Animations: property from [inherit] to [2] at (0) should be [3] assert_equals: expected "3 " but got "1 " +FAIL CSS Animations: property from [inherit] to [2] at (0.3) should be [2.7] assert_equals: expected "2.7 " but got "1 " +FAIL CSS Animations: property from [inherit] to [2] at (0.6) should be [2.4] assert_equals: expected "2.4 " but got "1 " +FAIL CSS Animations: property from [inherit] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Animations: property from [inherit] to [2] at (1.5) should be [1.5] assert_equals: expected "1.5 " but got "1 " +FAIL Web Animations: property from [inherit] to [2] at (-0.3) should be [3.3] assert_equals: expected "3.3 " but got "1 " +FAIL Web Animations: property from [inherit] to [2] at (0) should be [3] assert_equals: expected "3 " but got "1 " +FAIL Web Animations: property from [inherit] to [2] at (0.3) should be [2.7] assert_equals: expected "2.7 " but got "1 " +FAIL Web Animations: property from [inherit] to [2] at (0.6) should be [2.4] assert_equals: expected "2.4 " but got "1 " +FAIL Web Animations: property from [inherit] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from [inherit] to [2] at (1.5) should be [1.5] assert_equals: expected "1.5 " but got "1 " +FAIL CSS Transitions: property from [unset] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions: property from [unset] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions: property from [unset] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions: property from [unset] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions: property from [unset] to [2] at (1) should be [2] +FAIL CSS Transitions: property from [unset] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +FAIL CSS Transitions with transition: all: property from [unset] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions with transition: all: property from [unset] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions with transition: all: property from [unset] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions with transition: all: property from [unset] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions with transition: all: property from [unset] to [2] at (1) should be [2] +FAIL CSS Transitions with transition: all: property from [unset] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +FAIL CSS Animations: property from [unset] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS CSS Animations: property from [unset] to [2] at (0) should be [1] +FAIL CSS Animations: property from [unset] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL CSS Animations: property from [unset] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL CSS Animations: property from [unset] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Animations: property from [unset] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +FAIL Web Animations: property from [unset] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS Web Animations: property from [unset] to [2] at (0) should be [1] +FAIL Web Animations: property from [unset] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL Web Animations: property from [unset] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL Web Animations: property from [unset] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from [unset] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +FAIL CSS Transitions: property from [1] to [2] at (-5) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions: property from [1] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions: property from [1] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions: property from [1] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions: property from [1] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions: property from [1] to [2] at (1) should be [2] +FAIL CSS Transitions: property from [1] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +FAIL CSS Transitions with transition: all: property from [1] to [2] at (-5) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions with transition: all: property from [1] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "2 " +FAIL CSS Transitions with transition: all: property from [1] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions with transition: all: property from [1] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "2 " +FAIL CSS Transitions with transition: all: property from [1] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "2 " +PASS CSS Transitions with transition: all: property from [1] to [2] at (1) should be [2] +FAIL CSS Transitions with transition: all: property from [1] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "2 " +PASS CSS Animations: property from [1] to [2] at (-5) should be [1] +FAIL CSS Animations: property from [1] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS CSS Animations: property from [1] to [2] at (0) should be [1] +FAIL CSS Animations: property from [1] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL CSS Animations: property from [1] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL CSS Animations: property from [1] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Animations: property from [1] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +PASS Web Animations: property from [1] to [2] at (-5) should be [1] +FAIL Web Animations: property from [1] to [2] at (-0.3) should be [0.7] assert_equals: expected "0.7 " but got "1 " +PASS Web Animations: property from [1] to [2] at (0) should be [1] +FAIL Web Animations: property from [1] to [2] at (0.3) should be [1.3] assert_equals: expected "1.3 " but got "1 " +FAIL Web Animations: property from [1] to [2] at (0.6) should be [1.6] assert_equals: expected "1.6 " but got "1 " +FAIL Web Animations: property from [1] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from [1] to [2] at (1.5) should be [2.5] assert_equals: expected "2.5 " but got "1 " +FAIL CSS Transitions: property from [0.5] to [1.5] at (-5) should be [1] assert_equals: expected "1 " but got "1.5 " +FAIL CSS Transitions: property from [0.5] to [1.5] at (-0.3) should be [0.2] assert_equals: expected "0.2 " but got "1.5 " +FAIL CSS Transitions: property from [0.5] to [1.5] at (0) should be [0.5] assert_equals: expected "0.5 " but got "1.5 " +FAIL CSS Transitions: property from [0.5] to [1.5] at (0.5) should be [1] assert_equals: expected "1 " but got "1.5 " +PASS CSS Transitions: property from [0.5] to [1.5] at (1) should be [1.5] +FAIL CSS Transitions: property from [0.5] to [1.5] at (1.5) should be [2] assert_equals: expected "2 " but got "1.5 " +FAIL CSS Transitions with transition: all: property from [0.5] to [1.5] at (-5) should be [1] assert_equals: expected "1 " but got "1.5 " +FAIL CSS Transitions with transition: all: property from [0.5] to [1.5] at (-0.3) should be [0.2] assert_equals: expected "0.2 " but got "1.5 " +FAIL CSS Transitions with transition: all: property from [0.5] to [1.5] at (0) should be [0.5] assert_equals: expected "0.5 " but got "1.5 " +FAIL CSS Transitions with transition: all: property from [0.5] to [1.5] at (0.5) should be [1] assert_equals: expected "1 " but got "1.5 " +PASS CSS Transitions with transition: all: property from [0.5] to [1.5] at (1) should be [1.5] +FAIL CSS Transitions with transition: all: property from [0.5] to [1.5] at (1.5) should be [2] assert_equals: expected "2 " but got "1.5 " +PASS CSS Animations: property from [0.5] to [1.5] at (-5) should be [1] +FAIL CSS Animations: property from [0.5] to [1.5] at (-0.3) should be [0.2] assert_equals: expected "0.2 " but got "1 " +FAIL CSS Animations: property from [0.5] to [1.5] at (0) should be [0.5] assert_equals: expected "0.5 " but got "1 " +PASS CSS Animations: property from [0.5] to [1.5] at (0.5) should be [1] +FAIL CSS Animations: property from [0.5] to [1.5] at (1) should be [1.5] assert_equals: expected "1.5 " but got "1 " +FAIL CSS Animations: property from [0.5] to [1.5] at (1.5) should be [2] assert_equals: expected "2 " but got "1 " +PASS Web Animations: property from [0.5] to [1.5] at (-5) should be [1] +FAIL Web Animations: property from [0.5] to [1.5] at (-0.3) should be [0.2] assert_equals: expected "0.2 " but got "1 " +FAIL Web Animations: property from [0.5] to [1.5] at (0) should be [0.5] assert_equals: expected "0.5 " but got "1 " +PASS Web Animations: property from [0.5] to [1.5] at (0.5) should be [1] +FAIL Web Animations: property from [0.5] to [1.5] at (1) should be [1.5] assert_equals: expected "1.5 " but got "1 " +FAIL Web Animations: property from [0.5] to [1.5] at (1.5) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Transitions: property from [normal] to [3] at (-0.5) should be [1] assert_equals: expected "1 " but got "3 " +FAIL CSS Transitions: property from [normal] to [3] at (0) should be [1] assert_equals: expected "1 " but got "3 " +FAIL CSS Transitions: property from [normal] to [3] at (0.5) should be [2] assert_equals: expected "2 " but got "3 " +PASS CSS Transitions: property from [normal] to [3] at (1) should be [3] +FAIL CSS Transitions with transition: all: property from [normal] to [3] at (-0.5) should be [1] assert_equals: expected "1 " but got "3 " +FAIL CSS Transitions with transition: all: property from [normal] to [3] at (0) should be [1] assert_equals: expected "1 " but got "3 " +FAIL CSS Transitions with transition: all: property from [normal] to [3] at (0.5) should be [2] assert_equals: expected "2 " but got "3 " +PASS CSS Transitions with transition: all: property from [normal] to [3] at (1) should be [3] +PASS CSS Animations: property from [normal] to [3] at (-0.5) should be [1] +PASS CSS Animations: property from [normal] to [3] at (0) should be [1] +FAIL CSS Animations: property from [normal] to [3] at (0.5) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Animations: property from [normal] to [3] at (1) should be [3] assert_equals: expected "3 " but got "1 " +PASS Web Animations: property from [normal] to [3] at (-0.5) should be [1] +PASS Web Animations: property from [normal] to [3] at (0) should be [1] +FAIL Web Animations: property from [normal] to [3] at (0.5) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from [normal] to [3] at (1) should be [3] assert_equals: expected "3 " but got "1 " +FAIL CSS Transitions: property from [100%] to [300%] at (0) should be [1] assert_equals: expected "1 " but got "3 " +FAIL CSS Transitions: property from [100%] to [300%] at (0.5) should be [2] assert_equals: expected "2 " but got "3 " +PASS CSS Transitions: property from [100%] to [300%] at (1) should be [3] +FAIL CSS Transitions with transition: all: property from [100%] to [300%] at (0) should be [1] assert_equals: expected "1 " but got "3 " +FAIL CSS Transitions with transition: all: property from [100%] to [300%] at (0.5) should be [2] assert_equals: expected "2 " but got "3 " +PASS CSS Transitions with transition: all: property from [100%] to [300%] at (1) should be [3] +PASS CSS Animations: property from [100%] to [300%] at (0) should be [1] +FAIL CSS Animations: property from [100%] to [300%] at (0.5) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Animations: property from [100%] to [300%] at (1) should be [3] assert_equals: expected "3 " but got "1 " +PASS Web Animations: property from [100%] to [300%] at (0) should be [1] +FAIL Web Animations: property from [100%] to [300%] at (0.5) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from [100%] to [300%] at (1) should be [3] assert_equals: expected "3 " but got "1 " +FAIL CSS Transitions: property from [50%] to [2] at (0) should be [0.5] assert_equals: expected "0.5 " but got "2 " +FAIL CSS Transitions: property from [50%] to [2] at (0.5) should be [1.25] assert_equals: expected "1.25 " but got "2 " +PASS CSS Transitions: property from [50%] to [2] at (1) should be [2] +FAIL CSS Transitions with transition: all: property from [50%] to [2] at (0) should be [0.5] assert_equals: expected "0.5 " but got "2 " +FAIL CSS Transitions with transition: all: property from [50%] to [2] at (0.5) should be [1.25] assert_equals: expected "1.25 " but got "2 " +PASS CSS Transitions with transition: all: property from [50%] to [2] at (1) should be [2] +FAIL CSS Animations: property from [50%] to [2] at (0) should be [0.5] assert_equals: expected "0.5 " but got "1 " +FAIL CSS Animations: property from [50%] to [2] at (0.5) should be [1.25] assert_equals: expected "1.25 " but got "1 " +FAIL CSS Animations: property from [50%] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Web Animations: property from [50%] to [2] at (0) should be [0.5] assert_equals: expected "0.5 " but got "1 " +FAIL Web Animations: property from [50%] to [2] at (0.5) should be [1.25] assert_equals: expected "1.25 " but got "1 " +FAIL Web Animations: property from [50%] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL CSS Transitions: property from [calc(sibling-index() * 100%)] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions: property from [calc(sibling-index() * 100%)] to [2] at (0.5) should be [1.5] assert_equals: expected "1.5 " but got "2 " +PASS CSS Transitions: property from [calc(sibling-index() * 100%)] to [2] at (1) should be [2] +FAIL CSS Transitions with transition: all: property from [calc(sibling-index() * 100%)] to [2] at (0) should be [1] assert_equals: expected "1 " but got "2 " +FAIL CSS Transitions with transition: all: property from [calc(sibling-index() * 100%)] to [2] at (0.5) should be [1.5] assert_equals: expected "1.5 " but got "2 " +PASS CSS Transitions with transition: all: property from [calc(sibling-index() * 100%)] to [2] at (1) should be [2] +PASS CSS Animations: property from [calc(sibling-index() * 100%)] to [2] at (0) should be [1] +FAIL CSS Animations: property from [calc(sibling-index() * 100%)] to [2] at (0.5) should be [1.5] assert_equals: expected "1.5 " but got "1 " +FAIL CSS Animations: property from [calc(sibling-index() * 100%)] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +PASS Web Animations: property from [calc(sibling-index() * 100%)] to [2] at (0) should be [1] +FAIL Web Animations: property from [calc(sibling-index() * 100%)] to [2] at (0.5) should be [1.5] assert_equals: expected "1.5 " but got "1 " +FAIL Web Animations: property from [calc(sibling-index() * 100%)] to [2] at (1) should be [2] assert_equals: expected "2 " but got "1 " +FAIL Animating zoom affects layout using the interpolated value assert_approx_equals: expected 1.5 +/- 0.01 but got 1 +FAIL transition: all animates zoom changes from :hover assert_approx_equals: expected 1.5 +/- 0.01 but got 2 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/zoom-interpolation.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/zoom-interpolation.html new file mode 100644 index 000000000000..58e5f7d929b0 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/animations/zoom-interpolation.html @@ -0,0 +1,206 @@ + + +zoom interpolation + + + + + + + + + + + + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/font-relative-units-with-zoom-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/font-relative-units-with-zoom-expected.txt new file mode 100644 index 000000000000..7eaa005eb941 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/font-relative-units-with-zoom-expected.txt @@ -0,0 +1,23 @@ +ic letter-spacing with zoom 1.5 +em letter-spacing with zoom 1.5 +ic letter-spacing with zoom 2 +em letter-spacing with zoom 2 +ic line-height with zoom 1.5 +em line-height with zoom 1.5 +cap font-size with zoom 1.5 +ex font-size with zoom 1.5 +ch font-size with zoom 1.5 +ic font-size with zoom 1.5 +cap font-size with zoom 2 +ex font-size with zoom 2 +ch font-size with zoom 2 +ic font-size with zoom 2 + +PASS ic equals em for letter-spacing under CSS zoom 1.5 +PASS ic equals em for letter-spacing under CSS zoom 2 +PASS ic equals em for line-height under CSS zoom 1.5 +PASS cap font-size resolves to identical unzoomed value across CSS zoom levels +PASS ex font-size resolves to identical unzoomed value across CSS zoom levels +PASS ch font-size resolves to identical unzoomed value across CSS zoom levels +PASS ic font-size resolves to identical unzoomed value across CSS zoom levels + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/font-relative-units-with-zoom.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/font-relative-units-with-zoom.html new file mode 100644 index 000000000000..825c38eb1b95 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/font-relative-units-with-zoom.html @@ -0,0 +1,93 @@ + + + + + + + + +
+
ic letter-spacing with zoom 1.5
+
em letter-spacing with zoom 1.5
+
+ +
+
ic letter-spacing with zoom 2
+
em letter-spacing with zoom 2
+
+ +
+
ic line-height with zoom 1.5
+
em line-height with zoom 1.5
+
+ +
+
cap font-size with zoom 1.5
+
ex font-size with zoom 1.5
+
ch font-size with zoom 1.5
+
ic font-size with zoom 1.5
+
+ +
+
cap font-size with zoom 2
+
ex font-size with zoom 2
+
ch font-size with zoom 2
+
ic font-size with zoom 2
+
+ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/ic-unit-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/ic-unit-expected.txt deleted file mode 100644 index c1d32243c526..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/ic-unit-expected.txt +++ /dev/null @@ -1,11 +0,0 @@ -ic letter-spacing with zoom 1.5 -em letter-spacing with zoom 1.5 -ic letter-spacing with zoom 2 -em letter-spacing with zoom 2 -ic line-height with zoom 1.5 -em line-height with zoom 1.5 - -PASS ic equals em for letter-spacing under CSS zoom 1.5 -PASS ic equals em for letter-spacing under CSS zoom 2 -PASS ic equals em for line-height under CSS zoom 1.5 - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/ic-unit.html b/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/ic-unit.html deleted file mode 100644 index 680129016dee..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/css/css-viewport/zoom/ic-unit.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - -
-
ic letter-spacing with zoom 1.5
-
em letter-spacing with zoom 1.5
-
- -
-
ic letter-spacing with zoom 2
-
em letter-spacing with zoom 2
-
- -
-
ic line-height with zoom 1.5
-
em line-height with zoom 1.5
-
- - diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleDeclaration-iterator-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleDeclaration-iterator-expected.txt new file mode 100644 index 000000000000..61518390f2b5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleDeclaration-iterator-expected.txt @@ -0,0 +1,3 @@ + +PASS CSSStyleDeclaration should expose Symbol.iterator + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleDeclaration-iterator.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleDeclaration-iterator.html new file mode 100644 index 000000000000..08175f1d2f6a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleDeclaration-iterator.html @@ -0,0 +1,12 @@ + + +CSSStyleDeclaration should expose Symbol.iterator + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-constructable-replace-thenable-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-constructable-replace-thenable-expected.txt new file mode 100644 index 000000000000..d438401db578 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-constructable-replace-thenable-expected.txt @@ -0,0 +1,3 @@ + +PASS CSSStyleSheet.replace/replaceSync() when stylesheet is a thenable + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-constructable-replace-thenable.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-constructable-replace-thenable.html new file mode 100644 index 000000000000..22c6a093a5e7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-constructable-replace-thenable.html @@ -0,0 +1,43 @@ + + +CSSStyleSheet.replace/replaceSync() when stylesheet is a thenable + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-template-adoption.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-template-adoption.html index e014627ed8be..1abd7a6aee01 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-template-adoption.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSStyleSheet-template-adoption.html @@ -19,6 +19,7 @@ let root = host.attachShadow({ mode: "open" }); root.innerHTML = `
`; root.adoptedStyleSheets = [sheet]; + let adoptedStyleSheets = root.adoptedStyleSheets; function assertAdoptedStyleSheet() { assert_equals(host.ownerDocument, root.firstChild.ownerDocument, "Shadow root was not adopted?"); @@ -27,6 +28,7 @@ if (root.ownerDocument == document) { assert_equals(getComputedStyle(root.firstChild).color, "rgb(0, 0, 255)", "Sheet should apply"); } + assert_equals(adoptedStyleSheets, root.adoptedStyleSheets, "adoptedStyleSheets should be the same array"); } assertAdoptedStyleSheet(); @@ -54,5 +56,6 @@ document.body.appendChild(iframe); iframe.contentDocument.body.appendChild(host); assert_equals(root.adoptedStyleSheets.length, 0); + assert_equals(adoptedStyleSheets, root.adoptedStyleSheets, "adoptedStyleSheets should be the same array"); }, "adoptedStyleSheets won'te be cleared when adopting into/from