diff --git a/.gitignore b/.gitignore index 8ecdbeb4b8cb..5da2c2d7a052 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ build/ autoinstall.cache.d project.xcworkspace xcuserdata +.mailmap # Ignore auto-generated files by VS & VSCode. *.vcproj.*.user diff --git a/CMakeLists.txt b/CMakeLists.txt index c59e0f6c0a2c..c65fe77f12ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,7 @@ endif () set(ALL_PORTS AppleWin Efl + FTW GTK Haiku JSCOnly @@ -62,8 +63,8 @@ if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQU endif () if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") - if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS "6.0.0") - message(FATAL_ERROR "GCC 6.0.0 is required to build WebKitGTK+, use a newer GCC version or clang") + if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS "7.3.0") + message(FATAL_ERROR "GCC 7.3 or newer is required to build WebKit. Use a newer GCC version or Clang.") endif () endif () diff --git a/ChangeLog b/ChangeLog index 42a2f75d7acd..0b70187b88b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,219 @@ +2019-08-06 Alan Coon + + Apply patch. rdar://problem/53992160 + + 2019-08-06 Per Arne Vollan + + [Win] Fix AppleWin build + https://bugs.webkit.org/show_bug.cgi?id=200414 + + Reviewed by Brent Fulgham. + + * CMakeLists.txt: + * Source/cmake/FindICU.cmake: Added. + * Source/cmake/OptionsAppleWin.cmake: + * Source/cmake/OptionsGTK.cmake: + * Source/cmake/OptionsPlayStation.cmake: + * Source/cmake/OptionsWPE.cmake: + * Source/cmake/OptionsWin.cmake: + * Source/cmake/OptionsWinCairo.cmake: + +2019-07-11 Pablo Saavedra + + [WPE][GTK] Build failure with ENABLE_ACCESSIBILITY=OFF + https://bugs.webkit.org/show_bug.cgi?id=199625 + + Added ENABLE(ACCESSIBILITY) and replaced HAVE(ACCESSIBILITY) + with ENABLE(ACCESSIBILITY) in the code. + + Additionally, the TestRunner code generator now honors the + Conditional IDL format. + + Reviewed by Konstantin Tokarev. + + * Source/cmake/OptionsWPE.cmake: + * Source/cmake/WebKitFeatures.cmake: + +2019-07-10 Carlos Alberto Lopez Perez + + [GTK][WPE] Enable support for CSS_COMPOSITING + https://bugs.webkit.org/show_bug.cgi?id=199513 + + Reviewed by Michael Catanzaro. + + This feature is needed to support the CSS properties "mix-blend-mode" and "isolation". + Enable it for all ports except for AppleWin (doesn't build). + + It has been tested that it builds on the EWS bots of all the ports enabled (for those that have an EWS). + Also, for the GTK and WPE ports it also has been tested that the feature works fine on most of the cases and that doesn't cause regressions. + + * Source/cmake/OptionsFTW.cmake: Enable the feature. + * Source/cmake/OptionsMac.cmake: Use the new default. + * Source/cmake/OptionsWin.cmake: Enable for WinCairo only. + * Source/cmake/WebKitFeatures.cmake: Enable it Globally + +2019-06-28 Brent Fulgham + + [FTW] Build WebCore + https://bugs.webkit.org/show_bug.cgi?id=199199 + + Reviewed by Don Olmstead. + + Establish a set of build options for the FTW port, based on the current WinCairo + feature set. I also note which features should be turned on, but aren't yet, as + well as which features are disabled due to lack of WebGL and Media support in + the current build. + + * Source/cmake/OptionsFTW.cmake: + +2019-06-28 Konstantin Tokarev + + Remove traces of ENABLE_ICONDATABASE remaining after its removal in 219733 + https://bugs.webkit.org/show_bug.cgi?id=199317 + + Reviewed by Michael Catanzaro. + + While IconDatabase and all code using it was removed, + ENABLE_ICONDATABASE still exists as build option and C++ macro. + + * Source/cmake/OptionsGTK.cmake: + * Source/cmake/OptionsPlayStation.cmake: + * Source/cmake/OptionsWin.cmake: + * Source/cmake/WebKitFeatures.cmake: + * Source/cmake/tools/vsprops/FeatureDefines.props: + * Source/cmake/tools/vsprops/FeatureDefinesCairo.props: + +2019-06-27 Don Olmstead + + [FTW] Build JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=199254 + + Reviewed by Brent Fulgham. + + Add the FTW [For the Win(dows)] port. FTW is OS(WINDOWS) + USE(DIRECT2D) + + USE(CURL). Its eventual goal is to be the one true Windows port but to avoid + breaking AppleWin and WinCairo its being split into its own port for the interim. + + * CMakeLists.txt: + * Source/cmake/OptionsFTW.cmake: Added. + +2019-06-27 Fujii Hironori + + [CMake] Bump cmake_minimum_required version to 3.10 + https://bugs.webkit.org/show_bug.cgi?id=199181 + + Reviewed by Don Olmstead. + + * CMakeLists.txt: + +2019-06-21 Konstantin Tokarev + + [cmake] Switch to built-in handling of C++ standard instead of hardcoding -std=c++17 + https://bugs.webkit.org/show_bug.cgi?id=199108 + + Reviewed by Don Olmstead. + + Rationale: + + 1. It provides an abstraction over exact flags of particular compilers - + we just specify required version of C++ standard + 2. External libraries (like Qt used in WPEQt) may require particular C++ + standard or even particular C++ features to be availabe (e.g. Qt + requires INTERFACE_COMPILE_FEATURES cxx_decltype, which causes cmake + to add -std=gnu++11 unless proper CXX_STANDARD is defined) + + * Source/cmake/OptionsCommon.cmake: + * Source/cmake/OptionsMSVC.cmake: + * Source/cmake/WebKitCompilerFlags.cmake: + +2019-06-25 Michael Catanzaro + + Fully rename WebKitGTK+ -> WebKitGTK everywhere + https://bugs.webkit.org/show_bug.cgi?id=199159 + + Reviewed by Carlos Garcia Campos. + + * Source/cmake/FindGLIB.cmake: + +2019-06-25 Michael Catanzaro + + Require GCC 7 + https://bugs.webkit.org/show_bug.cgi?id=198914 + + Reviewed by Darin Adler. + + * CMakeLists.txt: + +2019-06-21 Michael Catanzaro + + [WPE][GTK] Bump minimum versions of GLib, GTK, libsoup, ATK, GStreamer, and Cairo + https://bugs.webkit.org/show_bug.cgi?id=199094 + + Reviewed by Carlos Garcia Campos. + + We can remove a lot of preprocessor guards in our code if we bump the minimum required + versions of certain dependencies: + + GStreamer 1.8 -> 1.10 + GTK 3.6 -> 3.22 + ATK 2.16 + libsoup 2.42 -> 2.54 + glib 2.40 -> 2.44 + cairo 1.14 + + I'm being extremely conservative with all these dependency bumps. All of these versions are + already available in Debian Stretch, which we will soon no longer support building on anyway + due to the impending GCC 7 requirement. Dependencies are also bumped no further than we + actually have guards for. For example, ATK 2.22 is available in Stretch, but the highest + ATK_CHECK_VERSION guards we use below 2.22 are for 2.16, so I set the min version to 2.16. + + We still have a few preprocessor guards remaining for everything here except glib and cairo, + but this removes the vast majority of them. Deleting code is fun! + + * Source/cmake/FindGTK3.cmake: + * Source/cmake/GStreamerChecks.cmake: + * Source/cmake/OptionsGTK.cmake: + * Source/cmake/OptionsWPE.cmake: + +2019-06-20 Carlos Garcia Campos + + [GTK] Remove support for GTK2 plugins + https://bugs.webkit.org/show_bug.cgi?id=199065 + + Reviewed by Sergio Villar Senin. + + * Source/cmake/FindGDK2.cmake: Removed. + * Source/cmake/FindGTK2.cmake: Removed. + * Source/cmake/OptionsGTK.cmake: + +2019-06-18 Adrian Perez de Castro + + Unreviewed. Update OptionsWPE.cmake and NEWS for the 2.25.1 release + + * Source/cmake/OptionsWPE.cmake: Bump version numbers. + +2019-06-17 Carlos Garcia Campos + + Unreviewed. Update OptionsGTK.cmake and NEWS for 2.25.2 release + + * Source/cmake/OptionsGTK.cmake: Bump version numbers + +2019-06-17 Carlos Garcia Campos + + Unreviewed. [GTK] Bump WPEBackend-fdo requirement to 1.3.1 + + * Source/cmake/OptionsGTK.cmake: + +2019-06-13 Tim Horton + + Make it possible for validate-committer-lists to dump a mailmap file + https://bugs.webkit.org/show_bug.cgi?id=198517 + + Reviewed by Simon Fraser. + + * .gitignore: + Ignore .mailmap files. + 2019-06-11 Carlos Garcia Campos [GTK] Remove option REDIRECTED_XCOMPOSITE_WINDOW diff --git a/JSTests/ChangeLog b/JSTests/ChangeLog index 2ef7cb96d22a..ebb56edc68cc 100644 --- a/JSTests/ChangeLog +++ b/JSTests/ChangeLog @@ -1,3 +1,2571 @@ +2019-10-20 Babak Shafiei + + Cherry-pick r249538. rdar://problem/56426429 + + LazyClassStructure::setConstructor should not store the constructor to the global object + https://bugs.webkit.org/show_bug.cgi?id=201484 + + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/web-assembly-constructors-should-not-override-global-object-property.js: Added. + + Source/JavaScriptCore: + + LazyClassStructure::setConstructor sets the constructor as a property of the global object. + This became a problem when it started being used for WebAssembly constructors, such as Module + and Instance, since they are properties of the WebAssembly object, not the global object. That + resulted in properties of the global object replaced whenever a lazy WebAssembly constructor + was first accessed. e.g. + + globalThis.Module = x; + WebAssembly.Module; + globalThis.Module === WebAssembly.Module; + + * runtime/LazyClassStructure.cpp: + (JSC::LazyClassStructure::Initializer::setConstructor): + * runtime/LazyClassStructure.h: + * runtime/Lookup.h: + (JSC::reifyStaticProperty): + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249538 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-05 Tadeu Zagallo + + LazyClassStructure::setConstructor should not store the constructor to the global object + https://bugs.webkit.org/show_bug.cgi?id=201484 + + + Reviewed by Yusuke Suzuki. + + * stress/web-assembly-constructors-should-not-override-global-object-property.js: Added. + +2019-10-15 Kocsen Chung + + Cherry-pick r250585. rdar://problem/56280995 + + ObjectAllocationSinkingPhase shouldn't insert hints for allocations which are no longer valid + https://bugs.webkit.org/show_bug.cgi?id=199361 + + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/allocation-sinking-hints-are-valid-ssa-2.js: Added. + (main.fn): + (main.executor): + (main): + * stress/allocation-sinking-hints-are-valid-ssa.js: Added. + (main.fn): + (main.executor): + (main): + + Source/JavaScriptCore: + + In a prior fix to the object allocation sinking phase, I added code where we + made sure to insert PutHints over Phis for fields of an object at control flow + merge points. However, that code didn't consider that the base of the PutHint + may no longer be a valid heap location. This could cause us to emit invalid + SSA code by referring to a node which does not dominate the PutHint location. + This patch fixes the bug to only emit the PutHints when valid. + + This patch also makes it so that DFGValidate actually validates that the graph + is in valid SSA form. E.g, any use of a node N must be dominated by N. + + * dfg/DFGObjectAllocationSinkingPhase.cpp: + * dfg/DFGValidate.cpp: + + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250585 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-01 Saam Barati + + ObjectAllocationSinkingPhase shouldn't insert hints for allocations which are no longer valid + https://bugs.webkit.org/show_bug.cgi?id=199361 + + + Reviewed by Yusuke Suzuki. + + * stress/allocation-sinking-hints-are-valid-ssa-2.js: Added. + (main.fn): + (main.executor): + (main): + * stress/allocation-sinking-hints-are-valid-ssa.js: Added. + (main.fn): + (main.executor): + (main): + +2019-10-15 Kocsen Chung + + Cherry-pick r249959. rdar://problem/56280989 + + CheckArray on DirectArguments/ScopedArguments does not filter out slow put array storage + https://bugs.webkit.org/show_bug.cgi?id=201853 + + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/direct-arguments-check-array-filter-type.js: Added. + (foo): + + Source/JavaScriptCore: + + We were claiming CheckArray for ScopedArguments/DirectArguments was filtering + out SlowPutArrayStorage. It does no such thing. We just check that the object + is either ScopedArguments/DirectArguments. + + * dfg/DFGArrayMode.h: + (JSC::DFG::ArrayMode::arrayModesThatPassFiltering const): + (JSC::DFG::ArrayMode::arrayModesWithIndexingShapes const): + (JSC::DFG::ArrayMode::arrayModesWithIndexingShape const): Deleted. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249959 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-17 Saam Barati + + CheckArray on DirectArguments/ScopedArguments does not filter out slow put array storage + https://bugs.webkit.org/show_bug.cgi?id=201853 + + + Reviewed by Yusuke Suzuki. + + * stress/direct-arguments-check-array-filter-type.js: Added. + (foo): + +2019-09-30 Babak Shafiei + + Cherry-pick r250058. rdar://problem/55826329 + + Phantom insertion phase may disagree with arguments forwarding about live ranges + https://bugs.webkit.org/show_bug.cgi?id=200715 + + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/phantom-insertion-live-range-should-agree-with-arguments-forwarding.js: Added. + (main.v23): + (main.try.v43): + (main.): + (main): + + Source/JavaScriptCore: + + The issue is that Phantom insertion phase was disagreeing about live ranges + from the arguments forwarding phase. The effect is that Phantom insertion + would insert a Phantom creating a longer live range than what arguments + forwarding was analyzing. Arguments forwarding will look for the last DFG + use or the last bytecode use of a variable it wants to eliminate. It then + does an interference analysis to ensure that nothing clobbers other variables + it needs to recover the sunken allocation during OSR exit. + + Phantom insertion works by ordering the program into OSR exit epochs. If a value was used + in the current epoch, there is no need to insert a phantom for it. We + determine where we might need a Phantom by looking at bytecode kills. In this + analysis, we have a mapping from bytecode local to DFG node. However, we + sometimes forgot to remove the entry when a local is killed. So, if the first + kill of a variable is in the same OSR exit epoch, we won't insert a Phantom by design. + However, if the variable gets killed again, we might errantly insert a Phantom + for the prior variable which should've already been killed. The solution is to + clear the entry in our mapping when a variable is killed. + + The program in question was like this: + + 1: DirectArguments + ... + 2: MovHint(@1, loc1) // arguments forwarding treats this as the final kill for @1 + ... + clobber things needed for recovery + ... + + Arguments elimination would transform the program since between @1 and + @2, nothing clobbers values needed for exit and nothing escapes @1. The + program becomes: + + 1: PhantomDirectArguments + ... + 2: MovHint(@1, loc1) // arguments forwarding treats this as the final kill for @1 + ... + clobber things needed for recovery of @1 + ... + + + Phantom insertion would then transform the program into: + + 1: PhantomDirectArguments + ... + 2: MovHint(@1, loc1) // arguments forwarding treats this as the final kill for @1 + ... + clobber things needed for recovery of @1 + ... + 3: Phantom(@1) + ... + + This is wrong because Phantom insertion and arguments forwarding must agree on live + ranges, otherwise the interference analysis performed by arguments forwarding will + not correctly analyze up until where the value might be recovered. + + * dfg/DFGPhantomInsertionPhase.cpp: + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250058 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-18 Saam Barati + + Phantom insertion phase may disagree with arguments forwarding about live ranges + https://bugs.webkit.org/show_bug.cgi?id=200715 + + + Reviewed by Yusuke Suzuki. + + * stress/phantom-insertion-live-range-should-agree-with-arguments-forwarding.js: Added. + (main.v23): + (main.try.v43): + (main.): + (main): + +2019-09-30 Babak Shafiei + + Cherry-pick r249926. rdar://problem/55826870 + + [JSC] Perform check again when we found non-BMP characters + https://bugs.webkit.org/show_bug.cgi?id=201647 + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/regexp-unicode-surrogate-pair-increment-should-involve-length-check.js: Added. + * stress/regexp-unicode-within-string.js: Updated test to eliminate the bogus print(). + (testRegExpInbounds): + + Source/JavaScriptCore: + + We need to check for end of input for non-BMP characters when matching a character class that contains + both BMP and non-BMP characters. In advanceIndexAfterCharacterClassTermMatch() we were checking for + end of input for both BMP and non-BMP characters. For BMP characters, this check is redundant. + After moving the check to after the "is BMP check", we need to decrement index after reaching the failure + label to back out the index++ for the first surrogate of the non-BMP character. + + Added the same kind of check in generateCharacterClassOnce(). In that case, we have pre-checked the + first character (surrogate) for a non-BMP codepoint, so we just need to check for end of input before + we increment for the second surrogate. + + While writing tests, I found an off by one error in backtrackCharacterClassGreedy() and changed the + loop to check the count at loop top instead of loop bottom. + + * yarr/YarrJIT.cpp: + (JSC::Yarr::YarrGenerator::advanceIndexAfterCharacterClassTermMatch): + (JSC::Yarr::YarrGenerator::generateCharacterClassOnce): + (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy): + (JSC::Yarr::YarrGenerator::backtrackCharacterClassGreedy): + (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy): + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249926 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-16 Michael Saboff + + [JSC] Perform check again when we found non-BMP characters + https://bugs.webkit.org/show_bug.cgi?id=201647 + + Reviewed by Yusuke Suzuki. + + * stress/regexp-unicode-surrogate-pair-increment-should-involve-length-check.js: Added. + * stress/regexp-unicode-within-string.js: Updated test to eliminate the bogus print(). + (testRegExpInbounds): + +2019-09-30 Babak Shafiei + + Cherry-pick r249777. rdar://problem/55826876 + + JSC crashes due to stack overflow while building RegExp + https://bugs.webkit.org/show_bug.cgi?id=201649 + + Reviewed by Yusuke Suzuki. + + JSTests: + + New regression test. + + * stress/regexp-bol-optimize-out-of-stack.js: Added. + (test): + (catch): + + Source/JavaScriptCore: + + Check for running out of stack when we are optimizing RegExp containing BOL terms or + other deep copying of disjunctions. + + * yarr/YarrPattern.cpp: + (JSC::Yarr::YarrPatternConstructor::copyDisjunction): + (JSC::Yarr::YarrPatternConstructor::copyTerm): + (JSC::Yarr::YarrPatternConstructor::error): + (JSC::Yarr::YarrPattern::compile): + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249777 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-10 Michael Saboff + + JSC crashes due to stack overflow while building RegExp + https://bugs.webkit.org/show_bug.cgi?id=201649 + + Reviewed by Yusuke Suzuki. + + New regression test. + + * stress/regexp-bol-optimize-out-of-stack.js: Added. + (test): + (catch): + +2019-09-30 Babak Shafiei + + Cherry-pick r248951. rdar://problem/55826863 + + [JSC] incorrent JIT lead to StackOverflow + https://bugs.webkit.org/show_bug.cgi?id=197823 + + Reviewed by Tadeu Zagallo. + + JSTests: + + New test. + + * stress/bound-function-stack-overflow.js: Added. + (foo): + (catch): + + Source/JavaScriptCore: + + Added stack overflow check to the bound function thunk generator. Added a new C++ operation + throwStackOverflowErrorFromThunk() to throw the error. + + * jit/JITOperations.cpp: + * jit/JITOperations.h: + * jit/ThunkGenerators.cpp: + (JSC::boundThisNoArgsFunctionCallGenerator): + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248951 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-21 Michael Saboff + + [JSC] incorrent JIT lead to StackOverflow + https://bugs.webkit.org/show_bug.cgi?id=197823 + + Reviewed by Tadeu Zagallo. + + New test. + + * stress/bound-function-stack-overflow.js: Added. + (foo): + (catch): + +2019-09-30 Babak Shafiei + + Cherry-pick r248796. rdar://problem/55826874 + + [Re-land] ProxyObject should not be allow to access its target's private properties. + https://bugs.webkit.org/show_bug.cgi?id=200739 + + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/proxy-should-not-be-allowed-to-access-private-properties-of-target.js: Copied from JSTests/stress/proxy-should-not-be-allowed-to-access-private-properties-of-target.js. + * stress/proxy-with-private-symbols.js: + + Source/JavaScriptCore: + + Re-landing this after r200829 which resolves the test262 failure uncovered by this patch. + + * runtime/ProxyObject.cpp: + (JSC::performProxyGet): + (JSC::ProxyObject::performInternalMethodGetOwnProperty): + (JSC::ProxyObject::performHasProperty): + (JSC::ProxyObject::performPut): + (JSC::ProxyObject::performDelete): + (JSC::ProxyObject::performDefineOwnProperty): + + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248796 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-16 Mark Lam + + [Re-land] ProxyObject should not be allow to access its target's private properties. + https://bugs.webkit.org/show_bug.cgi?id=200739 + + + Reviewed by Yusuke Suzuki. + + * stress/proxy-should-not-be-allowed-to-access-private-properties-of-target.js: Copied from JSTests/stress/proxy-should-not-be-allowed-to-access-private-properties-of-target.js. + * stress/proxy-with-private-symbols.js: + +2019-09-23 Alan Coon + + Cherry-pick r250116. rdar://problem/55608003 + + [JSC] DFG op_call_varargs should not assume that one-previous-local of freeReg is usable + https://bugs.webkit.org/show_bug.cgi?id=202014 + + Reviewed by Saam Barati. + + JSTests: + + * stress/call-varargs-inlining-should-not-clobber-previous-to-free-register.js: Added. + (__v0): + + Source/JavaScriptCore: + + Let's look into the bytecode generated by the test. + + [ 0] enter + [ 1] get_scope loc4 + [ 3] mov loc5, loc4 + [ 6] check_traps + [ 7] mov loc6, callee + [ 10] create_direct_arguments loc7 + [ 12] to_this this + [ 15] mov loc8, loc7 + [ 18] mov loc9, loc6 + [ 21] mov loc12, Undefined(const0) + [ 24] get_by_id loc11, loc6, 0 + [ 29] jneq_ptr loc11, ApplyFunction, 18(->47) + [ 34] mov loc11, loc6 + [ 37] call_varargs loc11, loc11, this, loc8, loc13, 0 + [ 45] jmp 17(->62) + [ 47] mov loc16, loc6 + [ 50] mov loc15, this + [ 53] mov loc14, loc8 + [ 56] call loc11, loc11, 3, 22 + ... + + call_varargs uses loc13 as firstFreeReg (first usable bottom register in the current stack-frame to spread variadic arguments after this). + This is correct. And call_varargs uses |this| as this argument for the call_varargs. This |this| argument is not in a region starting from loc13. + And it is not in the previous place to loc13 (|this| is not loc12). + + On the other hand, DFG::ByteCodeParser's inlining path is always assuming that the previous to firstFreeReg is usable and part of arguments. + But this is wrong. loc12 in the above bytecode is used for `[ 56] call loc11, loc11, 3, 22`'s argument later, and this call assumes + that loc12 is not clobbered by call_varargs. But DFG and FTL clobbers it. + + The test is recursively calling the same function, and we inline the same function one-level. And stack-overflow error happens when inlined + CallForwardVarargs (from op_call_varargs) is called. FTL recovers the frames, and at this point, outer function's loc12 is recovered to garbage since + LoadVarargs clobbers it. And we eventually use it and crash. + + 60: LoadVarargs(Check:Untyped:Kill:@30, MustGen, start = loc13, count = loc15, machineStart = loc7, machineCount = loc9, offset = 0, mandatoryMinimum = 0, limit = 2, R:World, W:Stack(-16),Stack(-14),Stack(-13),Heap, Exits, ClobbersExit, bc#37, ExitValid) + + This LoadVarargs clobbers loc12, loc13, and loc15 while loc12 is used. + + In all the tiers, op_call_varargs first allocates enough region to hold varargs including |this|. And we store |this| value to a correct place. + DFG should not assume that the previous register to firstFreeReg is used for |this|. + + This patch fixes DFG::ByteCodeParser's stack region calculation for op_call_varargs inlining. And we rename maxNumArguments to maxArgumentCountIncludingThis to + represent that `maxArgumentCountIncludingThis` includes |this| count. + + * bytecode/CallLinkInfo.cpp: + (JSC::CallLinkInfo::setMaxArgumentCountIncludingThis): + (JSC::CallLinkInfo::setMaxNumArguments): Deleted. + * bytecode/CallLinkInfo.h: + (JSC::CallLinkInfo::addressOfMaxArgumentCountIncludingThis): + (JSC::CallLinkInfo::maxArgumentCountIncludingThis): + (JSC::CallLinkInfo::addressOfMaxNumArguments): Deleted. + (JSC::CallLinkInfo::maxNumArguments): Deleted. + * bytecode/CallLinkStatus.cpp: + (JSC::CallLinkStatus::computeFor): + (JSC::CallLinkStatus::dump const): + * bytecode/CallLinkStatus.h: + (JSC::CallLinkStatus::maxArgumentCountIncludingThis const): + (JSC::CallLinkStatus::maxNumArguments const): Deleted. + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleVarargsInlining): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::emitCall): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::emitCall): + * ftl/FTLLowerDFGToB3.cpp: + (JSC::FTL::DFG::LowerDFGToB3::compileDirectCallOrConstruct): + * jit/JITCall.cpp: + (JSC::JIT::compileSetupFrame): + * jit/JITCall32_64.cpp: + (JSC::JIT::compileSetupFrame): + * jit/JITOperations.cpp: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250116 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-19 Yusuke Suzuki + + [JSC] DFG op_call_varargs should not assume that one-previous-local of freeReg is usable + https://bugs.webkit.org/show_bug.cgi?id=202014 + + Reviewed by Saam Barati. + + * stress/call-varargs-inlining-should-not-clobber-previous-to-free-register.js: Added. + (__v0): + +2019-09-17 Alan Coon + + Cherry-pick r249911. rdar://problem/55461405 + + JSObject::putInlineSlow should not ignore "__proto__" for Proxy + https://bugs.webkit.org/show_bug.cgi?id=200386 + + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/proxy-__proto__-in-prototype-chain.js: Added. + * stress/proxy-property-replace-structure-transition.js: Added. + + Source/JavaScriptCore: + + We used to ignore '__proto__' in putInlineSlow when the object in question + was Proxy. There is no reason for this, and it goes against the spec. So + I've removed that condition. This also has the effect that it fixes an + assertion firing inside our inline caching code which dictates that for a + property replace that the base value's structure must be equal to the + structure when we grabbed the structure prior to the put operation. + The old code caused a weird edge case where we broke this invariant. + + * runtime/JSObject.cpp: + (JSC::JSObject::putInlineSlow): + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249911 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-16 Saam Barati + + JSObject::putInlineSlow should not ignore "__proto__" for Proxy + https://bugs.webkit.org/show_bug.cgi?id=200386 + + + Reviewed by Yusuke Suzuki. + + * stress/proxy-__proto__-in-prototype-chain.js: Added. + * stress/proxy-property-replace-structure-transition.js: Added. + +2019-09-03 Kocsen Chung + + Cherry-pick r248793. rdar://problem/55001191 + + [JSC] Promise.prototype.finally should accept non-promise objects + https://bugs.webkit.org/show_bug.cgi?id=200829 + + Reviewed by Mark Lam. + + JSTests: + + * stress/promise-finally-should-accept-non-promise-objects.js: Added. + (shouldBe): + (Thenable): + (Thenable.prototype.then): + + Source/JavaScriptCore: + + According to the Promise.prototype.finally spec step 2[1], we should check @isObject instead of @isPromise, + since Promise.prototype.finally should accept thenable objects that are defined by user libraries (like, bluebird for example). + This patch changes this check to the specified one. + + [1]: https://tc39.es/proposal-promise-finally/ + + * builtins/PromisePrototype.js: + (finally): + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248793 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-16 Yusuke Suzuki + + [JSC] Promise.prototype.finally should accept non-promise objects + https://bugs.webkit.org/show_bug.cgi?id=200829 + + Reviewed by Mark Lam. + + * stress/promise-finally-should-accept-non-promise-objects.js: Added. + (shouldBe): + (Thenable): + (Thenable.prototype.then): + +2019-08-18 Babak Shafiei + + Cherry-pick r248800. rdar://problem/54454996 + + CodeBlock destructor should clear all of its watchpoints. + https://bugs.webkit.org/show_bug.cgi?id=200792 + + + Reviewed by Yusuke Suzuki. + + JSTests: + + * stress/codeblock-should-clear-watchpoints-on-destruction.js: Added. + + Source/JavaScriptCore: + + We need to clear the watchpoints explicitly (just like we do in CodeBlock::jettison()) + because the JITCode may outlive the CodeBlock for a while. For example, the JITCode + is ref'd in Interpreter::execute(JSC::CallFrameClosure&) like so: + + JSValue result = closure.functionExecutable->generatedJITCodeForCall()->execute(&vm, closure.protoCallFrame); + + The call to generatedJITCodeForCall() returns a Ref with the underlying + JITCode ref'd. Hence, while the interpreter frame is still on the stack, the + executing JITCode instance will have a non-zero refCount, and be kept alive even + though its CodeBlock may have already been destructed. + + Note: the Interpreter execute() methods aren't the only ones who would ref the JITCode: + ExecutableBase also holds a RefPtr m_jitCodeForCall and RefPtr + m_jitCodeForConstruct. But a CodeBlock will be uninstalled before it gets destructed. + Hence, the uninstallation will deref the JITCode before we get to the CodeBlock + destructor. That said, we should be aware that a JITCode's refCount is not always + 1 after the JIT installs it into the CodeBlock, and it should not be assumed to be so. + + For this patch, I also audited all Watchpoint subclasses to ensure that we are + clearing all the relevant watchpoints in the CodeBlock destructor. Here is the + list of audited Watchpoints: + + CodeBlockJettisoningWatchpoint + AdaptiveStructureWatchpoint + AdaptiveInferredPropertyValueWatchpoint + - these are held in the DFG::CommonData, and is tied to JITCode's life cycle. + - they need to be cleared eagerly in CodeBlock's destructor. + + LLIntPrototypeLoadAdaptiveStructureWatchpoint + - stored in m_llintGetByIdWatchpointMap in the CodeBlock. + - this will be automatically cleared on CodeBlock destruction. + + The following does not reference CodeBlock: + + FunctionRareData::AllocationProfileClearingWatchpoint + - stored in FunctionRareData and will be cleared automatically on + FunctionRareData destruction. + - only references the owner FunctionRareData. + + ObjectToStringAdaptiveStructureWatchpoint + ObjectToStringAdaptiveInferredPropertyValueWatchpoint + - stored in StructureRareData and will be cleared automatically on + StructureRareData destruction. + + ObjectPropertyChangeAdaptiveWatchpoint + - stored in JSGlobalObject, and will be cleared automatically on + JSGlobalObject destruction. + - only references the owner JSGlobalObject. + + StructureStubClearingWatchpoint + - stored in WatchpointsOnStructureStubInfo and will be cleared automatically + on WatchpointsOnStructureStubInfo destruction. + + PropertyWatchpoint + StructureWatchpoint + - embedded in AdaptiveInferredPropertyValueWatchpointBase, which is extended + as AdaptiveInferredPropertyValueWatchpoint, ObjectPropertyChangeAdaptiveWatchpoint, + and ObjectToStringAdaptiveInferredPropertyValueWatchpoint. + - life cycle is handled by those 3 subclasses. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::~CodeBlock): + + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248800 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-16 Mark Lam + + CodeBlock destructor should clear all of its watchpoints. + https://bugs.webkit.org/show_bug.cgi?id=200792 + + + Reviewed by Yusuke Suzuki. + + * stress/codeblock-should-clear-watchpoints-on-destruction.js: Added. + +2019-08-13 Alan Coon + + Cherry-pick r248271. rdar://problem/54237771 + + JSC: assertion failure in SpeculativeJIT::compileGetByValOnIntTypedArray + https://bugs.webkit.org/show_bug.cgi?id=199997 + + Reviewed by Saam Barati. + + JSTests: + + New test. + + * stress/typedarray-no-alreadyChecked-assert.js: Added. + (checkIntArray): + (checkFloatArray): + + Source/JavaScriptCore: + + No need to ASSERT(node->arrayMode().alreadyChecked(...)) in SpeculativeJIT::compileGetByValOnIntTypedArray() + and compileGetByValOnFloatTypedArray() as the abstract interpreter is conservative and can insert a + CheckStructureOrEmpty which will fail the ASSERT as it checks for the SpecType of the array + and not for SpecEmpty. If we added a check for the SpecEmpty in the ASSERT, there are cases where + it won't be set. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): + (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248271 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-05 Michael Saboff + + JSC: assertion failure in SpeculativeJIT::compileGetByValOnIntTypedArray + https://bugs.webkit.org/show_bug.cgi?id=199997 + + Reviewed by Saam Barati. + + New test. + + * stress/typedarray-no-alreadyChecked-assert.js: Added. + (checkIntArray): + (checkFloatArray): + +2019-08-13 Alan Coon + + Cherry-pick r248149. rdar://problem/54237692 + + GetterSetter type confusion during DFG compilation + https://bugs.webkit.org/show_bug.cgi?id=199903 + + Reviewed by Mark Lam. + + JSTests: + + * stress/cse-propagated-constant-may-not-follow-structure-restrictions.js: Added. + + Source/JavaScriptCore: + + In AI, we are strongly assuming that GetGetter's child constant value should be GetterSetter if it exists. + However, this can be wrong since nobody ensures that. AI assumed so because the control-flow and preceding + CheckStructure ensures that. But this preceding check can be eliminated if the node becomes (at runtime) unreachable. + + Let's consider the following graph. + + 129: PutByOffset(KnownCell:@115, KnownCell:@115, Check:Untyped:@124, MustGen, id5{length}, 0, W:NamedProperties(5), ClobbersExit, bc#154, ExitValid) + 130: PutStructure(KnownCell:@115, MustGen, %C8:Object -> %C3:Object, ID:7726, R:JSObject_butterfly, W:JSCell_indexingType,JSCell_structureID,JSCell_typeInfoFlags,JSCell_typeInfoType, ClobbersExit, bc#154, ExitInvalid) + ... + 158: GetLocal(Check:Untyped:@197, JS|MustGen|UseAsOther, Final, loc7(R/FlushedCell), R:Stack(-8), bc#187, ExitValid) predicting Final + 210:< 1:-> DoubleRep(Check:NotCell:@158, Double|PureInt, BytecodeDouble, Exits, bc#187, ExitValid) + ... + 162: CheckStructure(Cell:@158, MustGen, [%Ad:Object], R:JSCell_structureID, Exits, bc#192, ExitValid) + 163:< 1:-> GetGetterSetterByOffset(KnownCell:@158, KnownCell:@158, JS|UseAsOther, OtherCell, id5{length}, 0, R:NamedProperties(5), Exits, bc#192, ExitValid) + 164:< 1:-> GetGetter(KnownCell:@163, JS|UseAsOther, Function, R:GetterSetter_getter, Exits, bc#192, ExitValid) + + At @163 and @164, AI proves that @158's AbstractValue is None because @210's edge filters out Cells @158 is a cell. But we do not invalidate graph status as "Invalid" even if edge filters out all possible value. + This is because the result of edge can be None in a valid program. For example, we can put a dependency edge between a consuming node and a producing node, where the producing node is just like a check and it + does not produce a value actually. So, @163 and @164 are not invalidated. This is totally fine in our compiler pipeline right now. + + But after that, global CSE phase found that @115 and @158 are same and @129 dominates @158. As a result, we can replace GetGetter child's @163 with @124. Since CheckStructure is already removed (and now, at runtime, + @163 and @164 are never executed), we do not have any structure guarantee on @158 and the result of @163. This means that @163's CSE result can be non-GetterSetter value. + + 124:< 2:-> JSConstant(JS|UseAsOther, Final, Weak:Object: 0x1199e82a0 with butterfly 0x0 (Structure %B4:Object), StructureID: 49116, bc#0, ExitValid) + ... + 126:< 2:-> GetGetter(KnownCell:Kill:@124, JS|UseAsOther, Function, R:GetterSetter_getter, Exits, bc#192, ExitValid) + + AI filters out @124's non-cell values. But @126 can get non-GetterSetter cell at AI phase. But our AI code is like the following. + + JSValue base = forNode(node->child1()).m_value; + if (base) { + GetterSetter* getterSetter = jsCast(base); + ... + + Then, jsCast casts the above object with GetterSetter accidentally. + + In general, DFG AI can get a proven constant value, which could not be shown at runtime. This happens if the processing node is unreachable at runtime while the graph is not invalid yet, because preceding edge + filters already filter out all the possible execution. DFG AI already considered about this possibility, and it attempts to fold a node into a constant only when the constant input matches against the expected one. + But several DFG nodes are not handling this correctly: GetGetter, GetSetter, and SkipScope. + + In this patch, we use `jsDynamicCast` to ensure that the constant input matches against the expected (foldable) one, and fold it only when the expectation is met. + We also remove DFG::Node::castConstant and its use. We should not rely on the constant folded value based on graph's control-flow. + + * dfg/DFGAbstractInterpreterInlines.h: + (JSC::DFG::AbstractInterpreter::executeEffects): + * dfg/DFGNode.h: + (JSC::DFG::Node::castConstant): Deleted. + * ftl/FTLLowerDFGToB3.cpp: + (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeCreateActivation): + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248149 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-01 Yusuke Suzuki + + GetterSetter type confusion during DFG compilation + https://bugs.webkit.org/show_bug.cgi?id=199903 + + Reviewed by Mark Lam. + + * stress/cse-propagated-constant-may-not-follow-structure-restrictions.js: Added. + +2019-07-17 Kocsen Chung + + Cherry-pick r247485. rdar://problem/53229615 + + Unreviewed, test262 gardening. + + * test262/expectations.yaml: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247485 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-07-16 Keith Miller + + Unreviewed, test262 gardening. + + * test262/expectations.yaml: + +2019-07-17 Kocsen Chung + + Cherry-pick r247469. rdar://problem/53229615 + + Update test262 + https://bugs.webkit.org/show_bug.cgi?id=199801 + + Rubber-stamped by Yusuke Suzuki. + + * test262/expectations.yaml: + * test262/latest-changes-summary.txt: + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/Symbol.toStringTag.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-job-not-active-throws.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-length.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-missing-internal-throws.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-name.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-not-object-throws.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-prop-desc.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/proto.js: Added. + (callback): + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/constructor.js: Added. + * test262/test/built-ins/FinalizationGroup/gc-has-one-chance-to-call-cleanupCallback.js: Added. + (cb): + (fg.new.FinalizationGroup): + (emptyCells): + (async.fn): + (fn.then.async): + * test262/test/built-ins/FinalizationGroup/instance-extensible.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/length.js: Added. + * test262/test/built-ins/FinalizationGroup/name.js: Added. + * test262/test/built-ins/FinalizationGroup/newtarget-prototype-is-not-object.js: Added. + (newTarget): + (fn): + * test262/test/built-ins/FinalizationGroup/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/proto-from-ctor-realm.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/proto.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-abrupt.js: Added. + (newTarget): + * test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-custom.js: Added. + (newTarget): + * test262/test/built-ins/FinalizationGroup/prototype-from-newtarget.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/Symbol.toStringTag.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-iterator-proto.js: Added. + (callback): + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-not-callable-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-reference.js: Added. + (cb): + (fg.new.FinalizationGroup): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-unregister.js: Added. + (fg.new.FinalizationGroup): + (fg.cleanupSome.cb): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanupcallback-iterator-proto.js: Added. + (callback): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/custom-this.js: Added. + (fn): + (cb): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/gc-cleanup-not-prevented-with-wr-deref.js: Added. + (cb): + (fg.new.FinalizationGroup): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-dynamic.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-holdings-multiple-values.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/length.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/name.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-callback-throws.js: Added. + (poisoned): + (fg.new.FinalizationGroup): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-cleanup-callback-throws.js: Added. + (poisoned): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined-with-gc.js: Added. + (fn): + (cb): + (emptyCells): + (prototype.assert.sameValue.fg.cleanupSome): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined.js: Added. + (fn): + (cb): + (poisoned): + (assert.sameValue.fg.cleanupSome): + (prototype.assert.sameValue.fg.cleanupSome): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-does-not-have-internal-cells-throws.js: Added. + (cb): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-not-object-throws.js: Added. + (cb): + * test262/test/built-ins/FinalizationGroup/prototype/constructor.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/proto.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/custom-this.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/holdings-any-value-type.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/holdings-same-as-target.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/length.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/name.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined-register-itself.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/target-not-object-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/this-does-not-have-internal-target-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/this-not-object-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-not-object-or-undefined-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings-and-target.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-target.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/unregister/custom-this.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/unregister/length.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/name.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/this-does-not-have-internal-cells-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/this-not-object-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/unregister.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/unregister/unregisterToken-not-object-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/returns-new-object-from-constructor.js: Added. + (cleanupCallback): + (let.key.of.Object.getOwnPropertyNames): + (set for): + * test262/test/built-ins/FinalizationGroup/target-not-callable-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/undefined-newtarget-throws.js: Added. + (FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/unnaffected-by-poisoned-cleanupCallback.js: Added. + (cleanupCallback): + (let.key.of.Object.getOwnPropertyNames): + (set for): + * test262/test/built-ins/Function/StrictFunction_restricted-properties.js: + * test262/test/built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js: + * test262/test/built-ins/Function/prototype/restricted-property-arguments.js: + * test262/test/built-ins/Function/prototype/restricted-property-caller.js: + * test262/test/built-ins/Object/prototype/toString/proxy-function-async.js: Added. + (asyncProxy.new.Proxy.async): + * test262/test/built-ins/Object/prototype/toString/proxy-function.js: + (asyncProxy.new.Proxy.async): + * test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js: Added. + (setIter.set Symbol): + (set defaultTag): + (gen): + (get return): + (set new): + * test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js: Added. + (generatorProxy.new.Proxy): + (asyncProxy.new.Proxy.async): + * test262/test/built-ins/Object/subclass-object-arg.js: + * test262/test/built-ins/Promise/all/invoke-resolve-get-error-close.js: + * test262/test/built-ins/Promise/all/resolve-element-function-name.js: + * test262/test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js: + * test262/test/built-ins/Promise/allSettled/reject-element-function-name.js: + * test262/test/built-ins/Promise/allSettled/resolve-element-function-name.js: + * test262/test/built-ins/Promise/executor-function-name.js: + * test262/test/built-ins/Promise/race/invoke-resolve-get-error-close.js: + * test262/test/built-ins/Promise/reject-function-name.js: + * test262/test/built-ins/Promise/resolve-function-name.js: + * test262/test/built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js: + * test262/test/built-ins/WeakRef/constructor.js: Added. + * test262/test/built-ins/WeakRef/instance-extensible.js: Added. + * test262/test/built-ins/WeakRef/length.js: Added. + * test262/test/built-ins/WeakRef/name.js: Added. + * test262/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js: Added. + (newTarget): + * test262/test/built-ins/WeakRef/prop-desc.js: Added. + * test262/test/built-ins/WeakRef/proto-from-ctor-realm.js: Added. + * test262/test/built-ins/WeakRef/proto.js: Added. + * test262/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js: Added. + (newTarget): + * test262/test/built-ins/WeakRef/prototype-from-newtarget-custom.js: Added. + (newTarget): + * test262/test/built-ins/WeakRef/prototype-from-newtarget.js: Added. + * test262/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js: Added. + * test262/test/built-ins/WeakRef/prototype/constructor.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/custom-this.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/gc-cleanup-not-prevented-with-wr-deref.js: Added. + (emptyCells): + * test262/test/built-ins/WeakRef/prototype/deref/length.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/name.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/prop-desc.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/return-target.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/this-does-not-have-internal-target-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/WeakRef/prototype/deref/this-not-object-throws.js: Added. + * test262/test/built-ins/WeakRef/prototype/prop-desc.js: Added. + * test262/test/built-ins/WeakRef/prototype/proto.js: Added. + * test262/test/built-ins/WeakRef/returns-new-object-from-constructor.js: Added. + (let.key.of.Object.getOwnPropertyNames): + (set for): + * test262/test/built-ins/WeakRef/target-not-object-throws.js: Added. + * test262/test/built-ins/WeakRef/undefined-newtarget-throws.js: Added. + * test262/test/intl402/BigInt/prototype/toLocaleString/builtin.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/length.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js: + * test262/test/intl402/DateTimeFormat/constructor-options-order-quarter.js: Removed. + * test262/test/intl402/DateTimeFormat/constructor-options-quarter-invalid.js: Removed. + * test262/test/intl402/DateTimeFormat/constructor-options-quarter-valid.js: Removed. + * test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-long-en.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-narrow-en.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/format/fractionalSecondDigits.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/builtin.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js: + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-long-en.js: Added. + (assertParts): + (assertPartsNumeric): + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-narrow-en.js: Added. + (assertParts): + (assertPartsNumeric): + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-short-en.js: Added. + (assertParts): + (assertPartsNumeric): + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/fractionalSecondDigits.js: Added. + (assertParts): + * test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-quarter.js: Removed. + * test262/test/intl402/DateTimeFormat/taint-Object-prototype-quarter.js: Removed. + * test262/test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js: + * test262/test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-numeric-auto.js: + * test262/test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js: + * test262/test/language/expressions/class/elements/private-field-access-on-inner-arrow-function.js: Added. + (C.prototype.method): + * test262/test/language/expressions/class/elements/private-field-access-on-inner-function.js: Added. + (C.prototype.method.innerFunction): + (C.prototype.method): + * test262/test/language/expressions/class/elements/private-getter-access-on-inner-arrow-function.js: Added. + (C): + (C.method): + * test262/test/language/expressions/class/elements/private-getter-access-on-inner-function.js: Added. + (C): + (C.method.innerFunction): + (C.method): + * test262/test/language/expressions/class/elements/private-getter-is-not-a-own-property.js: Added. + (C): + (C.checkPrivateGetter): + * test262/test/language/expressions/class/elements/private-method-access-on-inner-arrow-function.js: Added. + (C): + (C.method): + * test262/test/language/expressions/class/elements/private-method-access-on-inner-function.js: Added. + (C): + (C.method.innerFunction): + (C.method): + * test262/test/language/expressions/class/elements/private-method-is-not-a-own-property.js: Added. + (C): + (C.checkPrivateMethod): + * test262/test/language/expressions/class/elements/private-setter-access-on-inner-arrow-function.js: Added. + (C): + (C.method): + * test262/test/language/expressions/class/elements/private-setter-access-on-inner-function.js: Added. + (C): + (C.method.innerFunction): + (C.method): + * test262/test/language/expressions/class/elements/private-setter-is-not-a-own-property.js: Added. + (C): + (C.checkPrivateSetter): + * test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-field-initializer.js: + * test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-field-initializer.js: + * test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-field-initializer.js: + * test262/test/language/expressions/class/poisoned-underscore-proto.js: Added. + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval-indirect.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-factory.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (const.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval-indirect.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.prototype.m): + (let.classStringExpression.prototype.access): + (let.classStringExpression): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.prototype.m): + (let.classStringExpression.prototype.access): + (let.classStringExpression): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-factory.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (const.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.C.prototype.m): + (let.classStringExpression.return.C.prototype.access): + (let.classStringExpression.return.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.C.prototype.m): + (let.classStringExpression.return.C.prototype.access): + (let.classStringExpression.return.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval-indirect.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-factory.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (const.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/new.target/unary-expr.js: Added. + (new): + (async): + * test262/test/language/expressions/super/call-poisoned-underscore-proto.js: Added. + (A): + * test262/test/language/expressions/super/prop-poisoned-underscore-proto.js: Added. + * test262/test/language/identifiers/vals-cjk-escaped.js: Added. + * test262/test/language/identifiers/vals-cjk.js: Added. + * test262/test/language/statements/class/elements/private-class-field-on-frozen-objects.js: + * test262/test/language/statements/class/elements/private-field-access-on-inner-arrow-function.js: Added. + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-field-access-on-inner-function.js: Added. + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-field-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.checkPrivateField): + (C): + * test262/test/language/statements/class/elements/private-field-visible-to-direct-eval-on-initializer.js: Added. + (C): + * test262/test/language/statements/class/elements/private-field-visible-to-direct-eval.js: Added. + (C.prototype.getWithEval): + (C): + (D): + * test262/test/language/statements/class/elements/private-getter-access-on-inner-arrow-function.js: Added. + (C.prototype.get m): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-getter-access-on-inner-function.js: Added. + (C.prototype.get m): + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js: + (let.createAndInstantiateClass): + * test262/test/language/statements/class/elements/private-getter-is-not-a-own-property.js: Added. + (C.prototype.get m): + (C.prototype.checkPrivateGetter): + (C): + * test262/test/language/statements/class/elements/private-getter-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.get m): + (C.prototype.checkPrivateGetter): + (C): + * test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval-on-initializer.js: Added. + (C.prototype.get m): + (C): + * test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval.js: Added. + (C.prototype.get m): + (C.prototype.getWithEval): + (C): + (D.prototype.get m): + (D): + * test262/test/language/statements/class/elements/private-method-access-on-inner-arrow-function.js: Added. + (C.prototype.m): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-method-access-on-inner-function.js: Added. + (C.prototype.m): + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-method-is-not-a-own-property.js: Added. + (C.prototype.m): + (C.prototype.checkPrivateMethod): + (C): + * test262/test/language/statements/class/elements/private-method-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.m): + (C.prototype.checkPrivateMethod): + (C): + * test262/test/language/statements/class/elements/private-method-visible-to-direct-eval-on-initializer.js: Added. + (C.prototype.m): + (C): + * test262/test/language/statements/class/elements/private-method-visible-to-direct-eval.js: Added. + (C.prototype.m): + (C.prototype.getWithEval): + (C): + (D.prototype.m): + (D): + * test262/test/language/statements/class/elements/private-setter-access-on-inner-arrow-function.js: Added. + (C.prototype.set m): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-setter-access-on-inner-function.js: Added. + (C.prototype.set m): + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-setter-is-not-a-own-property.js: Added. + (C.prototype.set m): + (C.prototype.checkPrivateSetter): + (C): + * test262/test/language/statements/class/elements/private-setter-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.set m): + (C.prototype.checkPrivateSetter): + (C): + * test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval-on-initializer.js: Added. + (C.prototype.set m): + (C): + * test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval.js: Added. + (C.prototype.set m): + (C.prototype.setWithEval): + (C): + (D.prototype.set m): + (D): + * test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-field-initializer.js: + * test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-field-initializer.js: + * test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-field-initializer.js: + * test262/test/language/statements/class/elements/super-access-inside-a-private-getter.js: Added. + (A.prototype.method): + (A): + (C.prototype.get m): + (C.prototype.access): + (C): + * test262/test/language/statements/class/elements/super-access-inside-a-private-method.js: Added. + (A.prototype.method): + (A): + (C.prototype.m): + (C.prototype.access): + (C): + * test262/test/language/statements/class/elements/super-access-inside-a-private-setter.js: Added. + (A.prototype.method): + (A): + (C.prototype.set m): + (C.prototype.access): + (C): + * test262/test/language/statements/class/poisoned-underscore-proto.js: Added. + (A): + * test262/test/language/statements/function/13.2-30-s.js: + * test262/test262-Revision.txt: + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247469 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-07-15 Keith Miller + + Update test262 + https://bugs.webkit.org/show_bug.cgi?id=199801 + + Rubber-stamped by Yusuke Suzuki. + + * test262/expectations.yaml: + * test262/latest-changes-summary.txt: + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/Symbol.toStringTag.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-job-not-active-throws.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-length.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-missing-internal-throws.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-name.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-not-object-throws.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-prop-desc.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/proto.js: Added. + (callback): + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/constructor.js: Added. + * test262/test/built-ins/FinalizationGroup/gc-has-one-chance-to-call-cleanupCallback.js: Added. + (cb): + (fg.new.FinalizationGroup): + (emptyCells): + (async.fn): + (fn.then.async): + * test262/test/built-ins/FinalizationGroup/instance-extensible.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/length.js: Added. + * test262/test/built-ins/FinalizationGroup/name.js: Added. + * test262/test/built-ins/FinalizationGroup/newtarget-prototype-is-not-object.js: Added. + (newTarget): + (fn): + * test262/test/built-ins/FinalizationGroup/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/proto-from-ctor-realm.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/proto.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-abrupt.js: Added. + (newTarget): + * test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-custom.js: Added. + (newTarget): + * test262/test/built-ins/FinalizationGroup/prototype-from-newtarget.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/Symbol.toStringTag.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-iterator-proto.js: Added. + (callback): + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-not-callable-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-reference.js: Added. + (cb): + (fg.new.FinalizationGroup): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-unregister.js: Added. + (fg.new.FinalizationGroup): + (fg.cleanupSome.cb): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanupcallback-iterator-proto.js: Added. + (callback): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/custom-this.js: Added. + (fn): + (cb): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/gc-cleanup-not-prevented-with-wr-deref.js: Added. + (cb): + (fg.new.FinalizationGroup): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-dynamic.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-holdings-multiple-values.js: Added. + (fg.new.FinalizationGroup): + (callback): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/length.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/name.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-callback-throws.js: Added. + (poisoned): + (fg.new.FinalizationGroup): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-cleanup-callback-throws.js: Added. + (poisoned): + (emptyCells): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined-with-gc.js: Added. + (fn): + (cb): + (emptyCells): + (prototype.assert.sameValue.fg.cleanupSome): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined.js: Added. + (fn): + (cb): + (poisoned): + (assert.sameValue.fg.cleanupSome): + (prototype.assert.sameValue.fg.cleanupSome): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-does-not-have-internal-cells-throws.js: Added. + (cb): + * test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-not-object-throws.js: Added. + (cb): + * test262/test/built-ins/FinalizationGroup/prototype/constructor.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/proto.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/custom-this.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/holdings-any-value-type.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/holdings-same-as-target.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/length.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/name.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined-register-itself.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/register/target-not-object-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/this-does-not-have-internal-target-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/this-not-object-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-not-object-or-undefined-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings-and-target.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-target.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/prototype/unregister/custom-this.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/unregister/length.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/name.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/prop-desc.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/this-does-not-have-internal-cells-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/this-not-object-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/prototype/unregister/unregister.js: Added. + (fn): + * test262/test/built-ins/FinalizationGroup/prototype/unregister/unregisterToken-not-object-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/returns-new-object-from-constructor.js: Added. + (cleanupCallback): + (let.key.of.Object.getOwnPropertyNames): + (set for): + * test262/test/built-ins/FinalizationGroup/target-not-callable-throws.js: Added. + * test262/test/built-ins/FinalizationGroup/undefined-newtarget-throws.js: Added. + (FinalizationGroup): + * test262/test/built-ins/FinalizationGroup/unnaffected-by-poisoned-cleanupCallback.js: Added. + (cleanupCallback): + (let.key.of.Object.getOwnPropertyNames): + (set for): + * test262/test/built-ins/Function/StrictFunction_restricted-properties.js: + * test262/test/built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js: + * test262/test/built-ins/Function/prototype/restricted-property-arguments.js: + * test262/test/built-ins/Function/prototype/restricted-property-caller.js: + * test262/test/built-ins/Object/prototype/toString/proxy-function-async.js: Added. + (asyncProxy.new.Proxy.async): + * test262/test/built-ins/Object/prototype/toString/proxy-function.js: + (asyncProxy.new.Proxy.async): + * test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js: Added. + (setIter.set Symbol): + (set defaultTag): + (gen): + (get return): + (set new): + * test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js: Added. + (generatorProxy.new.Proxy): + (asyncProxy.new.Proxy.async): + * test262/test/built-ins/Object/subclass-object-arg.js: + * test262/test/built-ins/Promise/all/invoke-resolve-get-error-close.js: + * test262/test/built-ins/Promise/all/resolve-element-function-name.js: + * test262/test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js: + * test262/test/built-ins/Promise/allSettled/reject-element-function-name.js: + * test262/test/built-ins/Promise/allSettled/resolve-element-function-name.js: + * test262/test/built-ins/Promise/executor-function-name.js: + * test262/test/built-ins/Promise/race/invoke-resolve-get-error-close.js: + * test262/test/built-ins/Promise/reject-function-name.js: + * test262/test/built-ins/Promise/resolve-function-name.js: + * test262/test/built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js: + * test262/test/built-ins/WeakRef/constructor.js: Added. + * test262/test/built-ins/WeakRef/instance-extensible.js: Added. + * test262/test/built-ins/WeakRef/length.js: Added. + * test262/test/built-ins/WeakRef/name.js: Added. + * test262/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js: Added. + (newTarget): + * test262/test/built-ins/WeakRef/prop-desc.js: Added. + * test262/test/built-ins/WeakRef/proto-from-ctor-realm.js: Added. + * test262/test/built-ins/WeakRef/proto.js: Added. + * test262/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js: Added. + (newTarget): + * test262/test/built-ins/WeakRef/prototype-from-newtarget-custom.js: Added. + (newTarget): + * test262/test/built-ins/WeakRef/prototype-from-newtarget.js: Added. + * test262/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js: Added. + * test262/test/built-ins/WeakRef/prototype/constructor.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/custom-this.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/gc-cleanup-not-prevented-with-wr-deref.js: Added. + (emptyCells): + * test262/test/built-ins/WeakRef/prototype/deref/length.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/name.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/prop-desc.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/return-target.js: Added. + * test262/test/built-ins/WeakRef/prototype/deref/this-does-not-have-internal-target-throws.js: Added. + (fg.new.FinalizationGroup): + * test262/test/built-ins/WeakRef/prototype/deref/this-not-object-throws.js: Added. + * test262/test/built-ins/WeakRef/prototype/prop-desc.js: Added. + * test262/test/built-ins/WeakRef/prototype/proto.js: Added. + * test262/test/built-ins/WeakRef/returns-new-object-from-constructor.js: Added. + (let.key.of.Object.getOwnPropertyNames): + (set for): + * test262/test/built-ins/WeakRef/target-not-object-throws.js: Added. + * test262/test/built-ins/WeakRef/undefined-newtarget-throws.js: Added. + * test262/test/intl402/BigInt/prototype/toLocaleString/builtin.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/length.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js: + * test262/test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js: + * test262/test/intl402/DateTimeFormat/constructor-options-order-quarter.js: Removed. + * test262/test/intl402/DateTimeFormat/constructor-options-quarter-invalid.js: Removed. + * test262/test/intl402/DateTimeFormat/constructor-options-quarter-valid.js: Removed. + * test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-long-en.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-narrow-en.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/format/fractionalSecondDigits.js: Added. + * test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/builtin.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js: + * test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js: + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-long-en.js: Added. + (assertParts): + (assertPartsNumeric): + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-narrow-en.js: Added. + (assertParts): + (assertPartsNumeric): + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-short-en.js: Added. + (assertParts): + (assertPartsNumeric): + * test262/test/intl402/DateTimeFormat/prototype/formatToParts/fractionalSecondDigits.js: Added. + (assertParts): + * test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-quarter.js: Removed. + * test262/test/intl402/DateTimeFormat/taint-Object-prototype-quarter.js: Removed. + * test262/test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js: + * test262/test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-numeric-auto.js: + * test262/test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js: + * test262/test/language/expressions/class/elements/private-field-access-on-inner-arrow-function.js: Added. + (C.prototype.method): + * test262/test/language/expressions/class/elements/private-field-access-on-inner-function.js: Added. + (C.prototype.method.innerFunction): + (C.prototype.method): + * test262/test/language/expressions/class/elements/private-getter-access-on-inner-arrow-function.js: Added. + (C): + (C.method): + * test262/test/language/expressions/class/elements/private-getter-access-on-inner-function.js: Added. + (C): + (C.method.innerFunction): + (C.method): + * test262/test/language/expressions/class/elements/private-getter-is-not-a-own-property.js: Added. + (C): + (C.checkPrivateGetter): + * test262/test/language/expressions/class/elements/private-method-access-on-inner-arrow-function.js: Added. + (C): + (C.method): + * test262/test/language/expressions/class/elements/private-method-access-on-inner-function.js: Added. + (C): + (C.method.innerFunction): + (C.method): + * test262/test/language/expressions/class/elements/private-method-is-not-a-own-property.js: Added. + (C): + (C.checkPrivateMethod): + * test262/test/language/expressions/class/elements/private-setter-access-on-inner-arrow-function.js: Added. + (C): + (C.method): + * test262/test/language/expressions/class/elements/private-setter-access-on-inner-function.js: Added. + (C): + (C.method.innerFunction): + (C.method): + * test262/test/language/expressions/class/elements/private-setter-is-not-a-own-property.js: Added. + (C): + (C.checkPrivateSetter): + * test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-field-initializer.js: + * test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-field-initializer.js: + * test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-field-initializer.js: + * test262/test/language/expressions/class/poisoned-underscore-proto.js: Added. + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval-indirect.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-factory.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (const.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval-indirect.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.prototype.m): + (let.classStringExpression.prototype.access): + (let.classStringExpression): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.prototype.m): + (let.classStringExpression.prototype.access): + (let.classStringExpression): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-factory.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (const.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.C.prototype.m): + (let.classStringExpression.return.C.prototype.access): + (let.classStringExpression.return.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.C.prototype.m): + (let.classStringExpression.return.C.prototype.access): + (let.classStringExpression.return.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval-indirect.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-factory.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (const.C): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression.return.prototype.m): + (let.classStringExpression.return.prototype.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm.js: Copied from JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js. + (let.classStringExpression): + (let.classStringExpression.access): + (let.createAndInstantiateClass): + * test262/test/language/expressions/new.target/unary-expr.js: Added. + (new): + (async): + * test262/test/language/expressions/super/call-poisoned-underscore-proto.js: Added. + (A): + * test262/test/language/expressions/super/prop-poisoned-underscore-proto.js: Added. + * test262/test/language/identifiers/vals-cjk-escaped.js: Added. + * test262/test/language/identifiers/vals-cjk.js: Added. + * test262/test/language/statements/class/elements/private-class-field-on-frozen-objects.js: + * test262/test/language/statements/class/elements/private-field-access-on-inner-arrow-function.js: Added. + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-field-access-on-inner-function.js: Added. + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-field-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.checkPrivateField): + (C): + * test262/test/language/statements/class/elements/private-field-visible-to-direct-eval-on-initializer.js: Added. + (C): + * test262/test/language/statements/class/elements/private-field-visible-to-direct-eval.js: Added. + (C.prototype.getWithEval): + (C): + (D): + * test262/test/language/statements/class/elements/private-getter-access-on-inner-arrow-function.js: Added. + (C.prototype.get m): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-getter-access-on-inner-function.js: Added. + (C.prototype.get m): + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js: + (let.createAndInstantiateClass): + * test262/test/language/statements/class/elements/private-getter-is-not-a-own-property.js: Added. + (C.prototype.get m): + (C.prototype.checkPrivateGetter): + (C): + * test262/test/language/statements/class/elements/private-getter-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.get m): + (C.prototype.checkPrivateGetter): + (C): + * test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval-on-initializer.js: Added. + (C.prototype.get m): + (C): + * test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval.js: Added. + (C.prototype.get m): + (C.prototype.getWithEval): + (C): + (D.prototype.get m): + (D): + * test262/test/language/statements/class/elements/private-method-access-on-inner-arrow-function.js: Added. + (C.prototype.m): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-method-access-on-inner-function.js: Added. + (C.prototype.m): + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-method-is-not-a-own-property.js: Added. + (C.prototype.m): + (C.prototype.checkPrivateMethod): + (C): + * test262/test/language/statements/class/elements/private-method-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.m): + (C.prototype.checkPrivateMethod): + (C): + * test262/test/language/statements/class/elements/private-method-visible-to-direct-eval-on-initializer.js: Added. + (C.prototype.m): + (C): + * test262/test/language/statements/class/elements/private-method-visible-to-direct-eval.js: Added. + (C.prototype.m): + (C.prototype.getWithEval): + (C): + (D.prototype.m): + (D): + * test262/test/language/statements/class/elements/private-setter-access-on-inner-arrow-function.js: Added. + (C.prototype.set m): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-setter-access-on-inner-function.js: Added. + (C.prototype.set m): + (C.prototype.method.innerFunction): + (C.prototype.method): + (C): + * test262/test/language/statements/class/elements/private-setter-is-not-a-own-property.js: Added. + (C.prototype.set m): + (C.prototype.checkPrivateSetter): + (C): + * test262/test/language/statements/class/elements/private-setter-is-not-clobbered-by-computed-property.js: Added. + (C.prototype.set m): + (C.prototype.checkPrivateSetter): + (C): + * test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval-on-initializer.js: Added. + (C.prototype.set m): + (C): + * test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval.js: Added. + (C.prototype.set m): + (C.prototype.setWithEval): + (C): + (D.prototype.set m): + (D): + * test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-field-initializer.js: + * test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-field-initializer.js: + * test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-field-initializer.js: + * test262/test/language/statements/class/elements/super-access-inside-a-private-getter.js: Added. + (A.prototype.method): + (A): + (C.prototype.get m): + (C.prototype.access): + (C): + * test262/test/language/statements/class/elements/super-access-inside-a-private-method.js: Added. + (A.prototype.method): + (A): + (C.prototype.m): + (C.prototype.access): + (C): + * test262/test/language/statements/class/elements/super-access-inside-a-private-setter.js: Added. + (A.prototype.method): + (A): + (C.prototype.set m): + (C.prototype.access): + (C): + * test262/test/language/statements/class/poisoned-underscore-proto.js: Added. + (A): + * test262/test/language/statements/function/13.2-30-s.js: + * test262/test262-Revision.txt: + +2019-07-17 Kocsen Chung + + Cherry-pick r247532. rdar://problem/53228435 + + ArgumentsEliminationPhase should insert KillStack nodes before PutStack nodes that it adds. + https://bugs.webkit.org/show_bug.cgi?id=199821 + + + Reviewed by Filip Pizlo. + + JSTests: + + * stress/arguments-elimination-should-insert-KillStacks-before-added-PutStacks.js: Added. + + Source/JavaScriptCore: + + Excluding the ArgumentsEliminationPhase, PutStack nodes are converted from SetLocal + nodes in the SSAConversionPhase. SetLocal nodes are always preceded by MovHint nodes, + and the SSAConversionPhase always inserts a KillStack node before a MovHint node. + Hence, a PutStack node is always preceded by a KillStack node. + + However, the ArgumentsEliminationPhase can convert LoadVarargs nodes into a series + of one or more PutStacks nodes, and it prepends MovHint nodes before the PutStack + nodes. However, it neglects to prepend KillStack nodes as well. Since the + ArgumentsEliminationPhase runs after the SSAConversionPhase, the PutStack nodes + added during ArgumentsElimination will not be preceded by KillStack nodes. + + This patch fixes this by inserting a KillStack in the ArgumentsEliminationPhase + before it inserts a MovHint and a PutStack node. + + Consider this test case which can manifest the above issue as a crash: + + function inlinee(value) { + ... + let tmp = value + 1; + } + + function reflect() { + return inlinee.apply(undefined, arguments); + } + + function test(arr) { + let object = inlinee.apply(undefined, arr); // Uses a lot of SetArgumentMaybe nodes. + reflect(); // Calls with a LoadVararg, which gets converted into a PutStack of a constant. + } + + In this test case, we have a scenario where a SetArgumentMaybe's stack + slot is reused as the stack slot for a PutStack later. Here, the PutStack will + put a constant undefined value. Coincidentally, the SetArgumentMaybe may also + initialize that stack slot to a constant undefined value. Note that by the time + the PutStack executes, the SetArgumentMaybe's stack slot is dead. The liveness of + these 2 values are distinct. + + However, because we were missing a KillStack before the PutStack, OSR availability + analysis gets misled into thinking that the PutStack constant value is still in the + stack slot because the value left there by the SetArgumentMaybe hasn't been killed + off yet. As a result, OSR exit code will attempt to recover the PutStack's undefined + constant by loading from the stack slot instead of materializing it. Since + SetArgumentMaybe may not actually initialize the stack slot, we get a crash in OSR + exit when we try to recover the PutStack constant value from the stack slot, and + end up using what ever junk value we read from there. + + Fixing the ArgumentsEliminationPhase to insert KillStack before the PutStack + removes this conflation of the PutStack's constant value with the SetArgumentMaybe's + constant value in the same stack slot. And, OSR availability analysis will no + longer be misled to load the PutStack's constant value from the stack, but will + materialize the constant instead. + + * dfg/DFGArgumentsEliminationPhase.cpp: + + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247532 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-07-16 Mark Lam + + ArgumentsEliminationPhase should insert KillStack nodes before PutStack nodes that it adds. + https://bugs.webkit.org/show_bug.cgi?id=199821 + + + Reviewed by Filip Pizlo. + + * stress/arguments-elimination-should-insert-KillStacks-before-added-PutStacks.js: Added. + +2019-07-12 Justin Michaud + + B3 should reduce (integer) Sub(Neg(x), y) to Neg(Add(x, y)) + https://bugs.webkit.org/show_bug.cgi?id=196371 + + Reviewed by Keith Miller. + + * microbenchmarks/mul-immediate-sub.js: Added. + (doTest): + +2019-07-12 Caio Lima + + [BigInt] Add ValueBitLShift into DFG + https://bugs.webkit.org/show_bug.cgi?id=192664 + + Reviewed by Saam Barati. + + We are adding tests to cover ValueBitwise operations AI changes. + + * stress/big-int-left-shift-untyped.js: Added. + * stress/bit-op-with-object-returning-int32.js: + * stress/value-bit-and-ai-rule.js: Added. + * stress/value-bit-lshift-ai-rule.js: Added. + * stress/value-bit-or-ai-rule.js: Added. + * stress/value-bit-xor-ai-rule.js: Added. + +2019-07-11 Justin Michaud + + Add b3 macro lowering for CheckMul on arm64 + https://bugs.webkit.org/show_bug.cgi?id=199251 + + Reviewed by Robin Morisset. + + * microbenchmarks/check-mul-constant.js: Added. + (doTest): + * microbenchmarks/check-mul-no-constant.js: Added. + (doTest): + * microbenchmarks/check-mul-power-of-two.js: Added. + (doTest): + +2019-07-10 Tadeu Zagallo + + Optimize join of large empty arrays + https://bugs.webkit.org/show_bug.cgi?id=199636 + + Reviewed by Mark Lam. + + * microbenchmarks/large-empty-array-join.js: Added. + * microbenchmarks/large-empty-array-join-resolve-rope.js: Added. + +2019-07-06 Michael Saboff + + switch(String) needs to check for exceptions when resolving the string + https://bugs.webkit.org/show_bug.cgi?id=199541 + + Reviewed by Mark Lam. + + New tests. + + * stress/switch-string-oom.js: Added. + (test): + (testLowerTiers): + (testFTL): + +2019-07-05 Mark Lam + + ArgumentsEliminationPhase::eliminateCandidatesThatInterfere() should not decrement nodeIndex pass zero. + https://bugs.webkit.org/show_bug.cgi?id=199533 + + + Reviewed by Filip Pizlo. + + * stress/ArgumentsEliminationPhase-eliminateCandidatesThatEscape-should-not-decrement-nodeIndex-pass-zero.js: Added. + +2019-07-05 Alexey Shvayka + + [JSC] Clean up ArraySpeciesCreate + https://bugs.webkit.org/show_bug.cgi?id=182434 + + Reviewed by Yusuke Suzuki. + + Adjusts error message expectations in stress tests. + + * stress/array-flatmap.js: + * stress/array-flatten.js: + * stress/array-species-create-should-handle-masquerader.js: + * test262/expectations.yaml: Mark 4 test cases as passing. + +2019-07-02 Michael Saboff + + Exception from For..of loop assignment eliminates TDZ checks in subsequent code + https://bugs.webkit.org/show_bug.cgi?id=199395 + + Reviewed by Filip Pizlo. + + New regession test. + + * stress/for-of-tdz-with-try-catch.js: Added. + (test): + (i.catch): + +2019-07-02 Keith Miller + + Frozen Arrays length assignment should throw in strict mode + https://bugs.webkit.org/show_bug.cgi?id=199365 + + Reviewed by Yusuke Suzuki. + + * stress/frozen-array-length-should-throw-strict.js: Added. + (test): + +2019-07-01 Justin Michaud + + [Wasm-References] Disable references by default + https://bugs.webkit.org/show_bug.cgi?id=199390 + + Reviewed by Saam Barati. + + * wasm/references-spec-tests/ref_is_null.js: + * wasm/references-spec-tests/ref_null.js: + * wasm/references/anyref_globals.js: + * wasm/references/anyref_modules.js: + * wasm/references/anyref_table.js: + * wasm/references/anyref_table_import.js: + * wasm/references/element_parsing.js: + * wasm/references/func_ref.js: + * wasm/references/is_null.js: + * wasm/references/multitable.js: + * wasm/references/table_misc.js: + * wasm/references/validation.js: + +2019-07-01 Ryan Haddad + + Unreviewed, rolling out r246946. + + Caused JSC test crashes on arm64 + + Reverted changeset: + + "Add b3 macro lowering for CheckMul on arm64" + https://bugs.webkit.org/show_bug.cgi?id=199251 + https://trac.webkit.org/changeset/246946 + +2019-06-28 Justin Michaud + + Add b3 macro lowering for CheckMul on arm64 + https://bugs.webkit.org/show_bug.cgi?id=199251 + + Reviewed by Robin Morisset. + + * microbenchmarks/check-mul-constant.js: Added. + (doTest): + * microbenchmarks/check-mul-no-constant.js: Added. + (doTest): + * microbenchmarks/check-mul-power-of-two.js: Added. + (doTest): + +2019-06-26 Keith Miller + + speciesConstruct needs to throw if the result is a DataView + https://bugs.webkit.org/show_bug.cgi?id=199231 + + Reviewed by Mark Lam. + + * stress/typedarray-filter.js: + (subclasses.forEach): + * stress/typedarray-map.js: + (subclasses.forEach): + * stress/typedarray-slice.js: + (typedArrays.forEach): + * stress/typedarray-subarray.js: + (subclasses.forEach): + +2019-06-24 Commit Queue + + Unreviewed, rolling out r246714. + https://bugs.webkit.org/show_bug.cgi?id=199179 + + revert to do patch in a different way. (Requested by keith_mi_ + on #webkit). + + Reverted changeset: + + "All prototypes should call didBecomePrototype()" + https://bugs.webkit.org/show_bug.cgi?id=196315 + https://trac.webkit.org/changeset/246714 + +2019-06-24 Alexey Shvayka + + Add Array.prototype.{flat,flatMap} to unscopables + https://bugs.webkit.org/show_bug.cgi?id=194322 + + Reviewed by Keith Miller. + + * stress/unscopables.js: Fix test. + * test262/expectations.yaml: Mark 2 test cases as passing. + +2019-06-21 Mark Lam + + ArraySlice needs to keep the source array alive. + https://bugs.webkit.org/show_bug.cgi?id=197374 + + + Reviewed by Michael Saboff and Filip Pizlo. + + * stress/array-slice-must-keep-source-array-alive.js: Added. + +2019-06-22 Robin Morisset and Yusuke Suzuki + + All prototypes should call didBecomePrototype() + https://bugs.webkit.org/show_bug.cgi?id=196315 + + Reviewed by Saam Barati. + + * stress/function-prototype-indexed-accessor.js: Added. + +2019-06-22 Yusuke Suzuki + + [JSC] Strict, Sloppy and Arrow functions should have different classInfo + https://bugs.webkit.org/show_bug.cgi?id=197631 + + Reviewed by Saam Barati. + + * stress/has-own-property-arguments.js: Added. + (shouldBe): + (A): + +2019-06-22 Yusuke Suzuki + + [JSC] ClassExpr should not store result in the middle of evaluation + https://bugs.webkit.org/show_bug.cgi?id=199106 + + Reviewed by Tadeu Zagallo. + + * stress/class-expression-should-store-result-at-last.js: Added. + (shouldThrow): + (shouldThrow.let.a): + +2019-06-20 Justin Michaud + + [WASM-References] Add extra tests for Wasm references + fix element parsing and subtyping bugs + https://bugs.webkit.org/show_bug.cgi?id=199044 + + Reviewed by Saam Barati. + + Add wasm references spec tests as well as a worker test. + + * wasm.yaml: + * wasm/Builder_WebAssemblyBinary.js: + (const.emitters.Element): + * wasm/js-api/element.js: + (assert.throws.new.WebAssembly.Module.builder.WebAssembly): + * wasm/references-spec-tests/ref_is_null.js: Added. + (hostref): + (is_hostref): + (is_funcref): + (eq_ref): + (let.handler.get target): + (register): + (module): + (instance): + (call): + (get instance): + (exports): + (run): + (assert_malformed): + (assert_invalid): + (assert_unlinkable): + (assert_uninstantiable): + (assert_trap): + (try.f): + (catch): + (assert_exhaustion): + (assert_return): + (assert_return_canonical_nan): + (assert_return_arithmetic_nan): + (assert_return_ref): + (assert_return_func): + * wasm/references-spec-tests/ref_null.js: Added. + (hostref): + (is_hostref): + (is_funcref): + (eq_ref): + (let.handler.get target): + (register): + (module): + (instance): + (call): + (get instance): + (exports): + (run): + (assert_malformed): + (assert_invalid): + (assert_unlinkable): + (assert_uninstantiable): + (assert_trap): + (try.f): + (catch): + (assert_exhaustion): + (assert_return): + (assert_return_canonical_nan): + (assert_return_arithmetic_nan): + (assert_return_ref): + (assert_return_func): + * wasm/references/element_parsing.js: Added. + (module): + * wasm/references/func_ref.js: + * wasm/references/multitable.js: + * wasm/references/table_misc.js: + (TableSize.0.End.End.WebAssembly): + * wasm/references/validation.js: + (assert.throws): + +2019-06-19 Alexey Shvayka + + Optimize `resolve` method lookup in Promise static methods + https://bugs.webkit.org/show_bug.cgi?id=198864 + + Reviewed by Yusuke Suzuki. + + * test262/expectations.yaml: Mark 18 test cases as passing. + +2019-06-19 Justin Michaud + + [WASM-References] Rename anyfunc to funcref + https://bugs.webkit.org/show_bug.cgi?id=198983 + + Reviewed by Yusuke Suzuki. + + * wasm/function-tests/basic-element.js: + * wasm/function-tests/context-switch.js: + (import.Builder.from.string_appeared_here.import.as.assert.from.string_appeared_here.makeInstance): + (makeInstance): + (assert.eq.makeInstance): + * wasm/function-tests/exceptions.js: + (import.Builder.from.string_appeared_here.import.as.assert.from.string_appeared_here.makeInstance): + * wasm/function-tests/grow-memory-2.js: + (assert.eq.instance.exports.foo): + * wasm/function-tests/nameSection.js: + (const.compile): + * wasm/function-tests/stack-overflow.js: + (import.Builder.from.string_appeared_here.import.as.assert.from.string_appeared_here.makeInstance): + (assertOverflows.makeInstance): + * wasm/function-tests/table-basic-2.js: + (import.Builder.from.string_appeared_here.import.as.assert.from.string_appeared_here.makeInstance): + * wasm/function-tests/table-basic.js: + (import.Builder.from.string_appeared_here.import.as.assert.from.string_appeared_here.makeInstance): + * wasm/function-tests/trap-from-start-async.js: + * wasm/function-tests/trap-from-start.js: + * wasm/js-api/Module.exports.js: + (assert.truthy): + * wasm/js-api/Module.imports.js: + (assert.truthy): + * wasm/js-api/call-indirect.js: + (const.oneTable): + (const.multiTable): + (multiTable.const.makeTable): + (multiTable): + (multiTable.Polyphic2Import): + (multiTable.VirtualImport): + * wasm/js-api/element-data.js: + * wasm/js-api/element.js: + (assert.throws.new.WebAssembly.Module.builder.WebAssembly): + (assert.throws): + (badInstantiation.makeModule): + (badInstantiation.test): + (badInstantiation): + * wasm/js-api/extension-MemoryMode.js: + * wasm/js-api/table.js: + (new.WebAssembly.Module): + (assert.throws): + (assertBadTableImport): + (assert.throws.WebAssembly.Table.prototype.grow): + (new.WebAssembly.Table): + (assertBadTable): + (assert.truthy): + * wasm/js-api/test_basic_api.js: + (const.c.in.constructorProperties.switch): + * wasm/js-api/unique-signature.js: + (CallIndirectWithDuplicateSignatures): + * wasm/js-api/wrapper-function.js: + * wasm/modules/table.wat: + * wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat: + * wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat: + * wasm/modules/wasm-imports-wasm-exports/imports.wat: + * wasm/modules/wasm-imports-wasm-exports/sum.wat: + * wasm/references/anyref_table.js: + * wasm/references/anyref_table_import.js: + (doSet): + (assert.throws): + * wasm/references/func_ref.js: + (makeFuncrefIdent): + (assert.eq.instance.exports.fix): + (GetLocal.0.I32Const.0.TableSet.0.End.End.WebAssembly.assert.throws): + (GetLocal.0.I32Const.0.TableSet.0.End.End.WebAssembly): + (let.importedFun.of): + (makeAnyfuncIdent): Deleted. + (makeAnyfuncIdent.fun): Deleted. + * wasm/references/multitable.js: + (assert.eq): + (assert.throws): + * wasm/references/table_misc.js: + (GetLocal.0.TableFill.0.End.End.WebAssembly): + * wasm/references/validation.js: + (assert.throws.new.WebAssembly.Module.bin): + (assert.throws): + * wasm/spec-harness/index.js: + * wasm/spec-harness/wasm-constants.js: + * wasm/spec-harness/wasm-module-builder.js: + (WasmModuleBuilder.prototype.toArray): + * wasm/spec-harness/wast.js: + (elem_type): + (string_of_elem_type): + (string_of_table_type): + * wasm/spec-tests/jsapi.js: + * wasm/stress/wasm-table-grow-initialize.js: + * wasm/wasm.json: + +2019-06-18 Justin Michaud + + [WASM-References] Add support for Table.size, grow and fill instructions + https://bugs.webkit.org/show_bug.cgi?id=198761 + + Reviewed by Yusuke Suzuki. + + * wasm/Builder_WebAssemblyBinary.js: + (const.putOp): + * wasm/references/table_misc.js: Added. + (TableSize.End.End.WebAssembly): + (GetLocal.0.GetLocal.1.TableGrow.End.End.WebAssembly): + * wasm/wasm.json: + +2019-06-18 Justin Michaud + + [WASM-References] Add support for multiple tables + https://bugs.webkit.org/show_bug.cgi?id=198760 + + Reviewed by Saam Barati. + + * wasm/Builder.js: + * wasm/js-api/call-indirect.js: + (const.oneTable): + (const.multiTable): + (multiTable): + (multiTable.Polyphic2Import): + (multiTable.VirtualImport): + (const.wasmModuleWhichImportJS): Deleted. + (const.makeTable): Deleted. + (): Deleted. + (Polyphic2Import): Deleted. + (VirtualImport): Deleted. + * wasm/js-api/table.js: + (new.WebAssembly.Module): + (assert.throws): + (assertBadTableImport): + (assert.truthy): + (assert.throws.new.WebAssembly.Module.builder.WebAssembly): Deleted. + * wasm/references/anyref_table.js: + * wasm/references/anyref_table_import.js: + (makeImport): + (string_appeared_here.fullGC.assert.eq.1.exports.get_tbl.makeImport): + (string_appeared_here.fullGC.assert.eq.1.exports.get_tbl): + * wasm/references/multitable.js: Added. + (assert.throws.1.exports.set_tbl0): + (assert.throws): + (assert.eq): + * wasm/references/validation.js: + (assert.throws.new.WebAssembly.Module.bin): + (assert.throws): + * wasm/spec-tests/imports.wast.js: + * wasm/wasm.json: + + * wasm/Builder.js: + * wasm/js-api/call-indirect.js: + (const.oneTable): + (const.multiTable): + (multiTable): + (multiTable.Polyphic2Import): + (multiTable.VirtualImport): + (const.wasmModuleWhichImportJS): Deleted. + (const.makeTable): Deleted. + (): Deleted. + (Polyphic2Import): Deleted. + (VirtualImport): Deleted. + * wasm/js-api/table.js: + (new.WebAssembly.Module): + (assert.throws): + (assertBadTableImport): + (assert.truthy): + (assert.throws.new.WebAssembly.Module.builder.WebAssembly): Deleted. + * wasm/references/anyref_table.js: + * wasm/references/anyref_table_import.js: + (makeImport): + (string_appeared_here.fullGC.assert.eq.1.exports.get_tbl.makeImport): + (string_appeared_here.fullGC.assert.eq.1.exports.get_tbl): + * wasm/references/func_ref.js: + (GetLocal.0.I32Const.0.TableSet.End.End.WebAssembly.fun): Deleted. + (GetLocal.0.I32Const.0.TableSet.End.End.WebAssembly.assert.throws): Deleted. + (GetLocal.0.I32Const.0.TableSet.End.End.WebAssembly): Deleted. + * wasm/references/multitable.js: Added. + (assert.throws.1.exports.set_tbl0): + (assert.throws): + (assert.eq): + (string_appeared_here.tableInsanity): + (I32Const.0.GetLocal.0.TableSet.1.End.End.WebAssembly.): + (I32Const.0.GetLocal.0.TableSet.1.End.End.WebAssembly): + * wasm/references/validation.js: + (assert.throws.new.WebAssembly.Module.bin): + (assert.throws): + * wasm/spec-tests/imports.wast.js: + * wasm/wasm.json: + +2019-06-18 Alexey Shvayka + + [ESNExt] String.prototype.matchAll + https://bugs.webkit.org/show_bug.cgi?id=186694 + + Reviewed by Yusuke Suzuki. + + Implement String.prototype.matchAll. + (https://tc39.es/ecma262/#sec-string.prototype.matchall) + + * test262/config.yaml: + +2019-06-18 Tadeu Zagallo + + DFG code should not reify the names of builtin functions with private names + https://bugs.webkit.org/show_bug.cgi?id=198849 + + + Reviewed by Filip Pizlo. + + * stress/builtin-private-function-name.js: Added. + (then): + (PromiseLike): + +2019-06-18 Keith Miller + + MaybeParseAsGeneratorForScope sometimes loses track of its scope ref + https://bugs.webkit.org/show_bug.cgi?id=198969 + + + Reviewed by Tadeu Zagallo. + + * stress/nested-yield-in-arrow-function-should-be-a-syntax-error.js: Added. + (catch): + +2019-06-17 Justin Michaud + + Validate that table element type is funcref if using an element section + https://bugs.webkit.org/show_bug.cgi?id=198910 + + Reviewed by Yusuke Suzuki. + + * wasm/references/anyref_table.js: + +2019-06-17 Yusuke Suzuki + + [JSC] Introduce DisposableCallSiteIndex to enforce type-safety + https://bugs.webkit.org/show_bug.cgi?id=197378 + + Reviewed by Saam Barati. + + * stress/disposable-call-site-index-with-call-and-this.js: Added. + (foo): + (bar): + * stress/disposable-call-site-index.js: Added. + (foo): + (bar): + +2019-06-17 Justin Michaud + + [WASM-References] Add support for Funcref in parameters and return types + https://bugs.webkit.org/show_bug.cgi?id=198157 + + Reviewed by Yusuke Suzuki. + + * wasm/Builder.js: + (export.default.Builder.prototype._registerSectionBuilders.const.section.in.WASM.description.section.switch.section.case.string_appeared_here.this.section): + * wasm/references/anyref_globals.js: + * wasm/references/func_ref.js: Added. + (fullGC.gc.makeExportedFunction): + (makeExportedIdent): + (makeAnyfuncIdent): + (fun): + (assert.eq.instance.exports.fix.fun): + (assert.eq.instance.exports.fix): + (string_appeared_here.End.End.Function.End.Code.End.WebAssembly.imp.ref): + (string_appeared_here.End.End.Function.End.Code.End.WebAssembly): + (GetLocal.0.I32Const.0.TableSet.End.End.WebAssembly.fun): + (GetLocal.0.I32Const.0.TableSet.End.End.WebAssembly.assert.throws): + (GetLocal.0.I32Const.0.TableSet.End.End.WebAssembly): + (assert.throws): + (assert.throws.doTest): + (let.importedFun.of): + (makeAnyfuncIdent.fun): + * wasm/references/validation.js: + (assert.throws): + * wasm/wasm.json: + +2019-06-17 Ross Kirsling + + Update test262 tests (2019.06.13) + https://bugs.webkit.org/show_bug.cgi?id=198821 + + Reviewed by Konstantin Tokarev. + + * test262/expectations.yaml: + * test262/harness/: + * test262/latest-changes-summary.txt: + * test262/test/: + * test262/test262-Revision.txt: + +2019-06-16 Yusuke Suzuki + + [JSC] Grown region of WasmTable should be initialized with null + https://bugs.webkit.org/show_bug.cgi?id=198903 + + Reviewed by Saam Barati. + + * wasm/stress/wasm-table-grow-initialize.js: Added. + (shouldBe): + +2019-06-13 Yusuke Suzuki + + Yarr bytecode compilation failure should be gracefully handled + https://bugs.webkit.org/show_bug.cgi?id=198700 + + Reviewed by Michael Saboff. + + * stress/regexp-bytecode-compilation-fail.js: Added. + (shouldThrow): + +2019-06-12 Yusuke Suzuki + + [JSC] Polymorphic call stub's slow path should restore callee saves before performing tail call + https://bugs.webkit.org/show_bug.cgi?id=198770 + + Reviewed by Saam Barati. + + * stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call.js: Added. + (test): + 2019-06-11 Alexey Shvayka JSC should throw if proxy set returns falsish in strict mode context diff --git a/JSTests/microbenchmarks/check-mul-constant.js b/JSTests/microbenchmarks/check-mul-constant.js new file mode 100644 index 000000000000..e4452ea4053d --- /dev/null +++ b/JSTests/microbenchmarks/check-mul-constant.js @@ -0,0 +1,13 @@ +function doTest(max) { + let sum = 0 + for (let i=0; i arr) { + const fn = () => { + return fn; + }; + for (const _ of arr) { + function fn() {} + arr.toString(arr, arr, arr, arr, arr, arr); + throw new Error(); + } + } else { + for (const _ of [arr]) { + arr.toString(); + } + const fn = () => {}; + } + new Promise(executor, arr); + let some = {}; + with(arr) {} + return reject; + } + executor(); + + for (let i = 0; i < 100; i++) { + executor(); + } +} +main(); diff --git a/JSTests/stress/allocation-sinking-hints-are-valid-ssa.js b/JSTests/stress/allocation-sinking-hints-are-valid-ssa.js new file mode 100644 index 000000000000..8738443a141f --- /dev/null +++ b/JSTests/stress/allocation-sinking-hints-are-valid-ssa.js @@ -0,0 +1,31 @@ +function main() { + const arr = [0]; + function executor(resolve, ...reject) { + arr; + if (resolve > arr) { + const fn = () => { + return fn; + }; + for (const _ of arr) { + function fn() {} + arr.toString(arr, arr, arr, arr, arr, arr); + throw new Error(); + } + } else { + for (const _ of [arr]) { + arr.toString(); + } + const fn = () => {}; + } + new Promise(executor, arr); + let some = {}; + with(arr) {} + return reject; + } + executor(); + + for (let i = 0; i < 100; i++) { + executor(); + } +} +main(); diff --git a/JSTests/stress/arguments-elimination-should-insert-KillStacks-before-added-PutStacks.js b/JSTests/stress/arguments-elimination-should-insert-KillStacks-before-added-PutStacks.js new file mode 100644 index 000000000000..df85a7e5ff06 --- /dev/null +++ b/JSTests/stress/arguments-elimination-should-insert-KillStacks-before-added-PutStacks.js @@ -0,0 +1,25 @@ +//@ runDefault("--thresholdForJITAfterWarmUp=10", "--thresholdForFTLOptimizeAfterWarmUp=1000", "--useConcurrentJIT=false") + +'use strict'; + +function inlinee(value) { + for (let i = 0; i < arguments.length; i++) { + } + let tmp = value + 1; +} + +function reflect() { + return inlinee.apply(undefined, arguments); +} + +function test(arr) { + let object = inlinee.apply(undefined, arr); + reflect(); +} + +for (let i = 0; i < 10000; i++) { + let arr = []; + for (let j = 0; j < 1 + i % 100; j++) + arr.push(1); + test(arr); +} diff --git a/JSTests/stress/array-flatmap.js b/JSTests/stress/array-flatmap.js index 1d1e4d04c9a0..d476427aa9b2 100644 --- a/JSTests/stress/array-flatmap.js +++ b/JSTests/stress/array-flatmap.js @@ -66,7 +66,7 @@ array2.constructor = 0; shouldThrow(() => { flatMap.call(array2, () => {}); -}, `TypeError: 0 is not a constructor`); +}, `TypeError: Species construction did not get a valid constructor`); var array2 = new realm.Array; array2.constructor = undefined; diff --git a/JSTests/stress/array-flatten.js b/JSTests/stress/array-flatten.js index b1a7c085d64a..fa0d98d09652 100644 --- a/JSTests/stress/array-flatten.js +++ b/JSTests/stress/array-flatten.js @@ -77,7 +77,7 @@ array2.constructor = 0; shouldThrow(() => { flat.call(array2); -}, `TypeError: 0 is not a constructor`); +}, `TypeError: Species construction did not get a valid constructor`); var array2 = new realm.Array; array2.constructor = undefined; diff --git a/JSTests/stress/array-slice-must-keep-source-array-alive.js b/JSTests/stress/array-slice-must-keep-source-array-alive.js new file mode 100644 index 000000000000..27514dba295e --- /dev/null +++ b/JSTests/stress/array-slice-must-keep-source-array-alive.js @@ -0,0 +1,19 @@ +//@ runDefault("--useConcurrentGC=false", "--useConcurrentJIT=false", "--thresholdForFTLOptimizeAfterWarmUp=1000") + +var functions = []; + +function boo() { + functions.push(new Function("a", "return a")); + return functions.splice(0); +} + +function test() { + functions = boo().slice(); +} + +noDFG(boo); +noInline(boo); +noInline(test); + +for (var i = 0; i < 10000; i++) + test(); diff --git a/JSTests/stress/array-species-create-should-handle-masquerader.js b/JSTests/stress/array-species-create-should-handle-masquerader.js index 6caaccf9dcec..b95b3173775e 100644 --- a/JSTests/stress/array-species-create-should-handle-masquerader.js +++ b/JSTests/stress/array-species-create-should-handle-masquerader.js @@ -17,5 +17,5 @@ noInline(shouldThrow); for (var i = 0; i < 1e5; ++i) { shouldThrow(() => { new (class extends Array { static get [Symbol.species]() { return makeMasquerader(); } })(1, 2, 3).flat().constructor - }, `TypeError: Masquerader is not a constructor`); + }, `TypeError: Species construction did not get a valid constructor`); } diff --git a/JSTests/stress/big-int-left-shift-untyped.js b/JSTests/stress/big-int-left-shift-untyped.js new file mode 100644 index 000000000000..3d36bd377677 --- /dev/null +++ b/JSTests/stress/big-int-left-shift-untyped.js @@ -0,0 +1,22 @@ +//@ runBigIntEnabled + +function assert(a, e) { + if (a !== e) + throw new Error("Expected: " + e + " but got: " + a); +} + +function untypedLShift(a, b) { + return a << b; +} +noInline(untypedLShift); + +let o = { + valueOf: () => 0b11101n +} + +for (var i = 0; i < 10000; i++) { + assert(untypedLShift(0b11101n, 10n), 0b111010000000000n); + assert(untypedLShift(o, 10n), 0b111010000000000n); + assert(untypedLShift(0b11101, 10), 0b111010000000000); +} + diff --git a/JSTests/stress/bit-op-with-object-returning-int32.js b/JSTests/stress/bit-op-with-object-returning-int32.js index 1749afbc50a4..609d9f28b38a 100644 --- a/JSTests/stress/bit-op-with-object-returning-int32.js +++ b/JSTests/stress/bit-op-with-object-returning-int32.js @@ -46,3 +46,13 @@ for (var i = 0; i < 10000; i++) assert(numberOfDFGCompiles(bitNot) <= 1, true); +function bitLShift(a, b) { + return a << b; +} +noInline(bitLShift); + +for (var i = 0; i < 10000; i++) + assert(bitLShift(o, 3), 0b1101000); + +assert(numberOfDFGCompiles(bitLShift) <= 1, true); + diff --git a/JSTests/stress/bound-function-stack-overflow.js b/JSTests/stress/bound-function-stack-overflow.js new file mode 100644 index 000000000000..f1822e1ea69b --- /dev/null +++ b/JSTests/stress/bound-function-stack-overflow.js @@ -0,0 +1,34 @@ +// This test verifies that we check for out of stack errors from recursively bound functions. +// It should exit without any output. + +let expectedException = "RangeError: Maximum call stack size exceeded."; +let actualException = false; + +function foo() +{ +} + +for (var i = 0; i < 5000; ++i) { + foo = foo.bind(1); + Object.defineProperty(foo, "name", { value: "bar", writable: true, enumerable: true, writable: true }); +} + +try { + foo("x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", + "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x"); +} catch (e) { + actualException = e; +} + +if (!actualException) + throw "Expected \"" + expectedException + "\" exception, but no exceptoion was thrown"; +else if (actualException != expectedException) + throw "Expected \"" + expectedException + "\", but got \"" + actualException +"\""; diff --git a/JSTests/stress/builtin-private-function-name.js b/JSTests/stress/builtin-private-function-name.js new file mode 100644 index 000000000000..04087d640164 --- /dev/null +++ b/JSTests/stress/builtin-private-function-name.js @@ -0,0 +1,15 @@ +let resolve; +function then(resolveElement) { + resolve = resolveElement; +} + +function PromiseLike(executor) { + executor(()=>{}, ()=>{}); +} + +PromiseLike.resolve = x => x; + +for (let i = 0; i < 1e5; i++) { + Promise.all.call(PromiseLike, [{ then }]); + resolve.hasOwnProperty('name'); +} diff --git a/JSTests/stress/call-varargs-inlining-should-not-clobber-previous-to-free-register.js b/JSTests/stress/call-varargs-inlining-should-not-clobber-previous-to-free-register.js new file mode 100644 index 000000000000..02a52a3a71be --- /dev/null +++ b/JSTests/stress/call-varargs-inlining-should-not-clobber-previous-to-free-register.js @@ -0,0 +1,9 @@ +//@ runDefault("--useConcurrentJIT=0", "--watchdog=4000", "--watchdog-exception-ok") +(function __v0() { + try { + __v0(__v0.apply(this, arguments)); + } catch (e) { + for (let i = 0; i < 10000; i++) { + } + } +})(2); diff --git a/JSTests/stress/class-expression-should-store-result-at-last.js b/JSTests/stress/class-expression-should-store-result-at-last.js new file mode 100644 index 000000000000..3787ae391e66 --- /dev/null +++ b/JSTests/stress/class-expression-should-store-result-at-last.js @@ -0,0 +1,22 @@ +function shouldThrow(func, errorMessage) { + var errorThrown = false; + var error = null; + try { + func(); + } catch (e) { + errorThrown = true; + error = e; + } + if (!errorThrown) + throw new Error('not thrown'); + if (String(error) !== errorMessage) + throw new Error(`bad error: ${String(error)}`); +} + +shouldThrow(() => { + let a = class c { + static get[(a=0x12345678, b=0x42424242)]() + { + } + }; +}, `ReferenceError: Cannot access uninitialized variable.`); diff --git a/JSTests/stress/codeblock-should-clear-watchpoints-on-destruction.js b/JSTests/stress/codeblock-should-clear-watchpoints-on-destruction.js new file mode 100644 index 000000000000..215ab1532367 --- /dev/null +++ b/JSTests/stress/codeblock-should-clear-watchpoints-on-destruction.js @@ -0,0 +1,49 @@ +//@ runFTLNoCJIT("--thresholdForFTLOptimizeAfterWarmUp=1000") + +// This test should not crash. + +let source; +for (__v1 of 'gu') { + let __v3 = new RegExp(source, __v1); + let __v0 = 'Over many a quaint and curious volume of forgotten lore,'.replace(__v3, (...__v0) => { + try { + try { + try { + for (let __v0 = 27; __v0 < 1000; ++__v0) {} + } finally { + return __v4; + } + } finally { + gc(); + } + } catch (__v3) { + try { + } finally { + ({}).__proto__[__v0] = __v3; + for (__v1 of 'gu') { + let __v3 = new RegExp(source, __v1); + let __v0 = 'Over many a quaint and curious volume of forgotten lore,'.replace(__v3, (...__v0) => { + try { + try { + } finally {(((((((((((((((((((((((((((((((((((((('blahblahblahblah' + __v0) + __v0) + __v0) + __v0) + __v0 instanceof __v0) + __v0) + __v0 === __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0 != __v0) + __v1) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0 === __v0) + __v5) + __v0) + __v0) + __v0) + __v0) + __v0) + __v0) + __v2 + __v0; + } + } catch (__v3) { + try { + eval('tag`Hello\n${v}world`'); + } finally { + try { + } finally { + try { + eval('tag`Hello\n${v}world`'); + } finally { + return; + } + } + } + } + }); + } + } + } + }); +} \ No newline at end of file diff --git a/JSTests/stress/cse-propagated-constant-may-not-follow-structure-restrictions.js b/JSTests/stress/cse-propagated-constant-may-not-follow-structure-restrictions.js new file mode 100644 index 000000000000..4fe97e171833 --- /dev/null +++ b/JSTests/stress/cse-propagated-constant-may-not-follow-structure-restrictions.js @@ -0,0 +1,23 @@ +let notAGetterSetter = {whatever: 42}; + +function v2(v5) { + const v10 = Object(); + if (v5) { + const v12 = {set:Array}; + const v14 = Object.defineProperty(v10,"length",v12); + const v15 = (140899729)[140899729]; + } else { + v10.length = notAGetterSetter; + } + const v18 = new Uint8ClampedArray(49415); + v18[1] = v10; + const v19 = v10.length; + let v20 = 0; + while (v20 < 100000) { + v20++; + } +} +const v26 = v2(); +for (let v32 = 0; v32 < 1000; v32++) { + const v33 = v2(true); +} diff --git a/JSTests/stress/direct-arguments-check-array-filter-type.js b/JSTests/stress/direct-arguments-check-array-filter-type.js new file mode 100644 index 000000000000..d21b68e270ea --- /dev/null +++ b/JSTests/stress/direct-arguments-check-array-filter-type.js @@ -0,0 +1,12 @@ +//@ runDefault("--jitPolicyScale=0", "--useRandomizingFuzzerAgent=1", "--validateAbstractInterpreterState=1", "--validateAbstractInterpreterStateProbability=1.0", "--useConcurrentJIT=0") + +function foo(a0, a1) { + Function.__defineSetter__(0, ()=>{}); + Object.freeze(arguments); + for (let i = 0; i < 3; i++) {} + arguments[0]; + const x = 0; + const y = 0; +} + +foo(); diff --git a/JSTests/stress/disposable-call-site-index-with-call-and-this.js b/JSTests/stress/disposable-call-site-index-with-call-and-this.js new file mode 100644 index 000000000000..5eba6223c7b0 --- /dev/null +++ b/JSTests/stress/disposable-call-site-index-with-call-and-this.js @@ -0,0 +1,26 @@ +var ia = new Int8Array(1024); + +function foo(o) { + return o.f; +} + +function bar(o) { + + try { + o.f = 0x1; + Uint8Array.prototype.find.call(ia, function () { + o.f = 0x1; + }, this); + } catch (e) { + } + + foo(o); +} + +var o = new Object(); +o.__defineGetter__("f", function () { }); + +for (var i = 0; i < 1000; ++i) { + bar({}); + bar(o); +} diff --git a/JSTests/stress/disposable-call-site-index.js b/JSTests/stress/disposable-call-site-index.js new file mode 100644 index 000000000000..50f7dfff2176 --- /dev/null +++ b/JSTests/stress/disposable-call-site-index.js @@ -0,0 +1,28 @@ +//@ runDefault("--useConcurrentJIT=0", "--useConcurrentGC=0", "--thresholdForJITAfterWarmUp=10", "--thresholdForOptimizeAfterWarmUp=100", "--thresholdForOptimizeAfterLongWarmUp=100", "--thresholdForOptimizeAfterLongWarmUp=100") + +var ia = new Int8Array(1024); + +function foo(o) { + return o.f; +} + +function bar(o) { + + try { + o.f = 0x1; + Uint8Array.prototype.find.call(ia, function () { + o.f = 0x1; + }); + } catch (e) { + } + + foo(o); +} + +var o = new Object(); +o.__defineGetter__("f", function () { }); + +for (var i = 0; i < 1000; ++i) { + bar({}); + bar(o); +} diff --git a/JSTests/stress/for-of-tdz-with-try-catch.js b/JSTests/stress/for-of-tdz-with-try-catch.js new file mode 100644 index 000000000000..baa90de1b6c5 --- /dev/null +++ b/JSTests/stress/for-of-tdz-with-try-catch.js @@ -0,0 +1,22 @@ +// This regression test checks that a let in the TDZ state is handled properly +// with a for-of in a try as well as the ensuing catch block. + +function test() { + try { + for ({o} of [, 0]) + ; + } catch (e) { + o[0] = 1.5; + } + let o = { + }; +} + +for (i = 0; i < 1000; i++) { + try { + test(); + } catch(e) { + if (e != "ReferenceError: Cannot access uninitialized variable.") + throw "Expected \"ReferenceError: Cannot access uninitialized variable.\", but got \"" + e +"\""; + } +} diff --git a/JSTests/stress/frozen-array-length-should-throw-strict.js b/JSTests/stress/frozen-array-length-should-throw-strict.js new file mode 100644 index 000000000000..e6dfd326bb99 --- /dev/null +++ b/JSTests/stress/frozen-array-length-should-throw-strict.js @@ -0,0 +1,17 @@ +const a = Object.freeze(['a']); + +function test(a) { + "use strict"; + + try { + a.length = 2; + } catch (e) { + if (e instanceof TypeError) + return; + } + throw new Error("didn't throw the right exception"); +} +noInline(test); + +for (let i = 0; i < 10000; i++) + test(a); diff --git a/JSTests/stress/has-own-property-arguments.js b/JSTests/stress/has-own-property-arguments.js new file mode 100644 index 000000000000..0b4d1cdfcabb --- /dev/null +++ b/JSTests/stress/has-own-property-arguments.js @@ -0,0 +1,8 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual); +} + +class A extends Function {} +shouldBe(new A("'use strict';").hasOwnProperty('arguments'), false); +shouldBe(new A().hasOwnProperty('arguments'), true); diff --git a/JSTests/stress/inline-cache-arguments.js b/JSTests/stress/inline-cache-arguments.js new file mode 100644 index 000000000000..09091db6554e --- /dev/null +++ b/JSTests/stress/inline-cache-arguments.js @@ -0,0 +1,41 @@ +function shouldThrow(func, errorMessage) { + var errorThrown = false; + var error = null; + try { + func(); + } catch (e) { + errorThrown = true; + error = e; + } + if (!errorThrown) + throw new Error('not thrown'); + if (String(error) !== errorMessage) + throw new Error(`bad error: ${String(error)}`); +} + +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual); +} + +class A extends Function {} +let a = new A("'use strict';"); +let b = new A(); + +function test(object) { + return object.arguments; +} +noInline(test); + +for (var i = 0; i < 1e6; ++i) { + shouldBe(typeof test(b), "object"); + shouldBe(typeof test({ arguments: { } }), "object"); + shouldBe(typeof test({ arguments: { }, hello: 42 }), "object"); + shouldBe(typeof test({ arguments: { }, world: 42 }), "object"); + shouldBe(typeof test({ arguments: { }, cocoa: 42 }), "object"); + shouldBe(typeof test({ arguments: { }, cappuccino: 42 }), "object"); +} + +shouldThrow(() => { + test(a); +}, `TypeError: 'arguments', 'callee', and 'caller' cannot be accessed in this context.`); diff --git a/JSTests/stress/nested-yield-in-arrow-function-should-be-a-syntax-error.js b/JSTests/stress/nested-yield-in-arrow-function-should-be-a-syntax-error.js new file mode 100644 index 000000000000..61f79545f1dc --- /dev/null +++ b/JSTests/stress/nested-yield-in-arrow-function-should-be-a-syntax-error.js @@ -0,0 +1,10 @@ +let passed = false; +try { + new Function("\nfor (let a of (function*() { \n for (var b of (function*() { \n for (var c of (function*() { \n for (var d of (function*() {\n for (var e of (function*() { \n for (var f of (function*() {\n for (var g of (x = (yield * 2)) => (1)) {\n }\n })()) {\n }\n })()) {\n }\n })()) {\n }\n })()) {\n }\n })()) {\n }\n})()) {\n}\n"); +} catch (e) { + if (e instanceof SyntaxError) + passed = true; +} finally { + if (passed !== true) + throw new Error("Test did not throw a Syntax Error as expected"); +} diff --git a/JSTests/stress/phantom-insertion-live-range-should-agree-with-arguments-forwarding.js b/JSTests/stress/phantom-insertion-live-range-should-agree-with-arguments-forwarding.js new file mode 100644 index 000000000000..cfe3f7cbd900 --- /dev/null +++ b/JSTests/stress/phantom-insertion-live-range-should-agree-with-arguments-forwarding.js @@ -0,0 +1,43 @@ +function main() { + const v2 = [1337,1337]; + const v3 = [1337,v2,v2,0]; + Object.__proto__ = v3; + for (let v10 = 0; v10 < 1000; v10++) { + function v11(v12,v13) { + var ____repro____; + const v15 = v10 + 127; + const v16 = String(); + const v17 = String.fromCharCode(v10,v10,v15); + const v19 = Object.shift(); + function v23() { + let v28 = arguments; + } + const v29 = Object(); + const v30 = v23({},129); + const v31 = [-903931.176976766,v17,,,-903931.176976766]; + const v32 = v31.join(""); + + try { + const v34 = Function(v32); + const v35 = v34(); + for (let v39 = 0; v39 < 127; v39++) { + const v41 = isFinite(); + let v42 = isFinite; + function v43(v44,v45,v46) { + } + const v47 = v41[4]; + const v48 = v47[64]; + const v49 = v35(); + const v50 = v43(); + const v51 = v34(); + } + } catch(v52) { + } + + } + const v53 = v11(); + } +} +noDFG(main); +noFTL(main); +main(); diff --git a/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-apply.js b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-apply.js new file mode 100644 index 000000000000..87f09a57443c --- /dev/null +++ b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-apply.js @@ -0,0 +1,17 @@ +//@ runDefault("--useConcurrentJIT=0") + +noInline(Function.prototype.apply); + +function test() +{ + for (var i = 0; i < 1e4; ++i) { + try { + Function.prototype.apply.call(WeakMap.bind()); + } catch { } + try { + Function.prototype.apply.call(WeakMap); + } catch { } + } +} + +test(); diff --git a/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-no-builtin.js b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-no-builtin.js new file mode 100644 index 000000000000..41e5fc908ba0 --- /dev/null +++ b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-no-builtin.js @@ -0,0 +1,27 @@ +//@ runDefault("--useConcurrentJIT=0") + +function call(func) +{ + "use strict"; + return func(); +} +noInline(call); + +function test() +{ + for (var i = 0; i < 1e4; ++i) { + try { + call(WeakMap); + } catch { + } + try { + call(function () { }); + } catch { + } + call((function () { }).bind()); + call((function () { }).bind()); + call((function () { }).bind()); + } +} + +test(); diff --git a/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-non-cell.js b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-non-cell.js new file mode 100644 index 000000000000..dac2396957c7 --- /dev/null +++ b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call-non-cell.js @@ -0,0 +1,20 @@ +//@ runDefault("--useConcurrentJIT=0") + +noInline(Function.prototype.apply); + +function test() +{ + for (var i = 0; i < 1e4; ++i) { + try { + Function.prototype.apply.call(WeakMap.bind()); + } catch { } + try { + Function.prototype.apply.call(WeakMap); + } catch { } + } + try { + Function.prototype.apply.call(42); + } catch { } +} + +test(); diff --git a/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call.js b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call.js new file mode 100644 index 000000000000..3881f1c83f19 --- /dev/null +++ b/JSTests/stress/poly-call-stub-slow-path-should-restore-callee-saves-when-doing-tail-call.js @@ -0,0 +1,15 @@ +//@ runDefault("--useConcurrentJIT=0") +function test() +{ + for (var i = 0; i < 100; ++i) { + var a = WeakSet.bind(); + var b = new Proxy(a, a); + var c = new Promise(b); + var d = WeakSet.bind(); + var e = new Proxy(d, WeakSet); + var f = new Promise(e); + } +} + +for (var i = 0; i < 50; ++i) + test(); diff --git a/JSTests/stress/promise-finally-should-accept-non-promise-objects.js b/JSTests/stress/promise-finally-should-accept-non-promise-objects.js new file mode 100644 index 000000000000..39ce2efc0e32 --- /dev/null +++ b/JSTests/stress/promise-finally-should-accept-non-promise-objects.js @@ -0,0 +1,42 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual); +} + +function shouldThrow(func, errorMessage) { + var errorThrown = false; + var error = null; + try { + func(); + } catch (e) { + errorThrown = true; + error = e; + } + if (!errorThrown) + throw new Error('not thrown'); + if (String(error) !== errorMessage) + throw new Error(`bad error: ${String(error)}`); +} + +class Thenable { + constructor(promise) + { + this.promise = promise; + } + + then(fulfill, rejected) + { + return new Thenable(this.promise.then(fulfill, rejected)); + } +}; + +var fulfilled = new Thenable(Promise.reject(0)); +var rejected = new Thenable(Promise.resolve(42)); + +var counter = 0; +Promise.prototype.finally.call(fulfilled, function () { counter++; }); +Promise.prototype.finally.call(rejected, function () { counter++; }); +drainMicrotasks(); +shouldBe(counter, 2); + +shouldThrow(() => Promise.prototype.finally.call(32), `TypeError: |this| is not a object`); diff --git a/JSTests/stress/proxy-__proto__-in-prototype-chain.js b/JSTests/stress/proxy-__proto__-in-prototype-chain.js new file mode 100644 index 000000000000..ad1432b346ab --- /dev/null +++ b/JSTests/stress/proxy-__proto__-in-prototype-chain.js @@ -0,0 +1,16 @@ +let called = false; +let p = new Proxy({ }, { + set(obj, prop, value) { + called = prop === "__proto__"; + } +}); +let o = {__proto__: p}; +o.__proto__ = null; + +if (!called) + throw new Error; + +called = false; +Reflect.set(o, "__proto__", null, {}); +if (!called) + throw new Error; diff --git a/JSTests/stress/proxy-property-replace-structure-transition.js b/JSTests/stress/proxy-property-replace-structure-transition.js new file mode 100644 index 000000000000..a11ff983b3fa --- /dev/null +++ b/JSTests/stress/proxy-property-replace-structure-transition.js @@ -0,0 +1,23 @@ +let map = new Map(); +let count = 0; +function outer() { + ++count; + if (count >= 5) + return; + function inner() { + function getPrototypeOf() { + const result = outer(); + return null; + } + + const handler = { getPrototypeOf: getPrototypeOf }; + const p = new Proxy(map,handler); + + map.__proto__ = p; + const result = inner(); + } + try { + const result = inner(); + } catch { } +} +const result = outer(); diff --git a/JSTests/stress/proxy-should-not-be-allowed-to-access-private-properties-of-target.js b/JSTests/stress/proxy-should-not-be-allowed-to-access-private-properties-of-target.js new file mode 100644 index 000000000000..27e25d24ae01 --- /dev/null +++ b/JSTests/stress/proxy-should-not-be-allowed-to-access-private-properties-of-target.js @@ -0,0 +1,21 @@ +var foo = (function* bar() { + try { + yield* x; + } finally { + try { + y; + } finally { + return; + } + } +}) (); + +var x = new Proxy(foo, {}); +try { + x.next(); +} catch (e) { + exception = e; +} + +if (exception != 'TypeError: |this| should be a generator') + throw "FAILED"; diff --git a/JSTests/stress/proxy-with-private-symbols.js b/JSTests/stress/proxy-with-private-symbols.js index 0bf1cfb54acf..5b026b02a6a0 100644 --- a/JSTests/stress/proxy-with-private-symbols.js +++ b/JSTests/stress/proxy-with-private-symbols.js @@ -81,7 +81,7 @@ function assert(b) { assert(e.message === "%ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance"); threw = true; } - assert(!threw); + assert(threw); assert(!sawPrivateSymbolAsString); sawPrivateSymbolAsString = false; } diff --git a/JSTests/stress/regexp-bol-optimize-out-of-stack.js b/JSTests/stress/regexp-bol-optimize-out-of-stack.js new file mode 100644 index 000000000000..5fc2bb77ddb2 --- /dev/null +++ b/JSTests/stress/regexp-bol-optimize-out-of-stack.js @@ -0,0 +1,16 @@ +// This test that the beginning of line (bol) optimization throws when we run out of stack space. + +let expectedException = "SyntaxError: Invalid regular expression: regular expression too large"; + +function test() +{ + let source = Array(50000).join("(") + /(?:^|:|,)(?:\s*\[)+/g.toString() + Array(50000).join(")"); + RegExp(source); +} + +try { + test(); +} catch(e) { + if (e != expectedException) + throw "Expected \"" + expectedException + "\" exception, but got \"" + e + "\""; +} diff --git a/JSTests/stress/regexp-bytecode-compilation-fail.js b/JSTests/stress/regexp-bytecode-compilation-fail.js new file mode 100644 index 000000000000..c517f2504ad4 --- /dev/null +++ b/JSTests/stress/regexp-bytecode-compilation-fail.js @@ -0,0 +1,23 @@ +function shouldThrow(func, errorMessage) { + var errorThrown = false; + var error = null; + try { + func(); + } catch (e) { + errorThrown = true; + error = e; + } + if (!errorThrown) + throw new Error('not thrown'); + if (String(error) !== errorMessage) + throw new Error(`bad error: ${String(error)}`); +} + +function v2() { + const v8 = RegExp("(1{2147480000,}2{3648,})|(ab)"); + "(1{2147480000,}2{3648,})|(ab)"; + const v4 = RegExp(v2); + const v5 = v4.test(); + return v5; +} +shouldThrow(v2, `SyntaxError: Invalid regular expression: pattern exceeds string length limits`); diff --git a/JSTests/stress/regexp-unicode-surrogate-pair-increment-should-involve-length-check.js b/JSTests/stress/regexp-unicode-surrogate-pair-increment-should-involve-length-check.js new file mode 100644 index 000000000000..b5da423f649e --- /dev/null +++ b/JSTests/stress/regexp-unicode-surrogate-pair-increment-should-involve-length-check.js @@ -0,0 +1,27 @@ +// This test checks for proper incrementing around / over individual surrogates and surrogate pairs. +// This test should run without crashing. + +function testRegExpMatch(re, str) +{ + for (let i = 0; i < 100; ++i) { + let match = re.exec(str); + if (!match || match[0] != str) { + print(match); + throw "Expected " + re + " to match \"" + str + "\" but it didn't"; + } + } +} + +let testString = "\ud800\ud800\udc00"; +let greedyRegExp = /([^x]+)[^]*\1([^])/u; + +testRegExpMatch(greedyRegExp, testString); + +let nonGreedyRegExp = /(.*[^x]+?)[^]*([^])/u; + +testRegExpMatch(nonGreedyRegExp, testString); + +let testString2 = "\ud800\ud800\udc00Test\udc00123"; +let backtrackGreedyRegExp = /.*[\x20-\udffff].\w*.\d{3}/u; + +testRegExpMatch(backtrackGreedyRegExp, testString2); diff --git a/JSTests/stress/regexp-unicode-within-string.js b/JSTests/stress/regexp-unicode-within-string.js index f7d566f4a59c..ee1adbedef16 100644 --- a/JSTests/stress/regexp-unicode-within-string.js +++ b/JSTests/stress/regexp-unicode-within-string.js @@ -10,7 +10,6 @@ function testRegExpInbounds(re, str, substrEnd) if (match !== null && match[0] === str) throw "Error: Read past end of a Unicode substring processing a Unicode RegExp"; else if (match === null || match[0] !== subStr) { - print("Error: match[0].length = " + match[0].length + ", match[0] = \"" + match[0] + "\""); throw "Error: Didn't properly match a Unicode substring with a matching Unicode RegExp"; } } diff --git a/JSTests/stress/switch-string-oom.js b/JSTests/stress/switch-string-oom.js new file mode 100644 index 000000000000..a58122286852 --- /dev/null +++ b/JSTests/stress/switch-string-oom.js @@ -0,0 +1,52 @@ +//@ requireOptions("--jitPolicyScale=0", "--useConcurrentJIT=0") +// This tests that when a switch(String) converts the String argument, it properly handles OOM + +function test(createOOMString) +{ + var str = String.fromCharCode(365); + if (createOOMString) + str = str.padEnd(2147483644, '123'); + + switch (str) { + case "one": + throw "Case \"one\", dhouldn't get here"; + break; + case "two": + throw "Case \"two\", shouldn't get here"; + break; + case "three": + throw "Case \"three\", shouldn't get here"; + break; + default: + if (createOOMString) + throw "Default case, shouldn't get here"; + break; + } +} + +function testLowerTiers() +{ + for (let i = 0; i < 200; i++) { + try { + test(true); + } catch(e) { + if (e != "Error: Out of memory") + throw "Unexpecte error: \"" + e + "\""; + } + } +} + +function testFTL() +{ + for (let i = 0; i < 1000; i++) { + try { + test(i >= 50); + } catch(e) { + if (e != "Error: Out of memory") + throw "Unexpecte error: \"" + e + "\""; + } + } +} + +testLowerTiers(); +testFTL(); diff --git a/JSTests/stress/typedarray-filter.js b/JSTests/stress/typedarray-filter.js index 5e8592381708..7ce7bbf63679 100644 --- a/JSTests/stress/typedarray-filter.js +++ b/JSTests/stress/typedarray-filter.js @@ -91,6 +91,17 @@ shouldBeTrue("forEachTypedArray(subclasses, testSpeciesIsDefault)"); subclasses.forEach(function(constructor) { constructor[Symbol.species] = undefined; }); shouldBeTrue("forEachTypedArray(subclasses, testSpeciesIsDefault)"); +subclasses.forEach(function(constructor) { constructor[Symbol.species] = () => new DataView(new ArrayBuffer()); }); +function testSpeciesReturnsDataView(array, constructor) { + try { + array.filter(accept); + } catch (e) { + return e instanceof TypeError; + } + return false; +} +shouldBeTrue("forEachTypedArray(subclasses, testSpeciesReturnsDataView)"); + subclasses = typedArrays.map(function(constructor) { return class extends constructor { } } ); function testSpeciesRemoveConstructor(array, constructor) { array.constructor = undefined; @@ -100,4 +111,5 @@ function testSpeciesRemoveConstructor(array, constructor) { } shouldBeTrue("forEachTypedArray(subclasses, testSpeciesRemoveConstructor)"); + finishJSTest(); diff --git a/JSTests/stress/typedarray-map.js b/JSTests/stress/typedarray-map.js index 1d9a890d22c3..8dad222ccf50 100644 --- a/JSTests/stress/typedarray-map.js +++ b/JSTests/stress/typedarray-map.js @@ -90,6 +90,17 @@ shouldBeTrue("forEachTypedArray(subclasses, testSpeciesIsDefault)"); subclasses.forEach(function(constructor) { constructor[Symbol.species] = undefined; }); shouldBeTrue("forEachTypedArray(subclasses, testSpeciesIsDefault)"); +subclasses.forEach(function(constructor) { constructor[Symbol.species] = () => new DataView(new ArrayBuffer()); }); +function testSpeciesReturnsDataView(array, constructor) { + try { + array.map(id); + } catch (e) { + return e instanceof TypeError; + } + return false; +} +shouldBeTrue("forEachTypedArray(subclasses, testSpeciesReturnsDataView)"); + subclasses = typedArrays.map(function(constructor) { return class extends constructor { } } ); function testSpeciesRemoveConstructor(array, constructor) { array.constructor = undefined; diff --git a/JSTests/stress/typedarray-no-alreadyChecked-assert.js b/JSTests/stress/typedarray-no-alreadyChecked-assert.js new file mode 100644 index 000000000000..f7631e318f0e --- /dev/null +++ b/JSTests/stress/typedarray-no-alreadyChecked-assert.js @@ -0,0 +1,26 @@ +// This test should not cause an ASSERT in Debug builds. + +function checkIntArray(arr) { + let x = arr; + arr instanceof Uint32Array; + arr[65537]; + x[0]; +} + +function checkFloatArray(arr) { + let x = arr; + arr instanceof Float64Array; + arr[65537]; + x[0]; +} + + +var intArray = new Uint32Array(1024); +for (let i = 0; i < 10000; i++) + checkIntArray(intArray); + +var floatArray = new Float64Array(1024); +for (let i = 0; i < 10000; i++) + checkFloatArray(floatArray); + + diff --git a/JSTests/stress/typedarray-slice.js b/JSTests/stress/typedarray-slice.js index 99cbba6f6ab2..fbcb1f8b15d4 100644 --- a/JSTests/stress/typedarray-slice.js +++ b/JSTests/stress/typedarray-slice.js @@ -169,4 +169,15 @@ function testSpeciesWithTransferring(unused, constructor) { shouldBeTrue("forEachTypedArray(typedArrays, testSpeciesWithTransferring)"); +typedArrays.forEach(function(constructor) { constructor[Symbol.species] = () => new DataView(new ArrayBuffer()); }); +function testSpeciesReturnsDataView(array, constructor) { + try { + array.slice(0, 1); + } catch (e) { + return e instanceof TypeError; + } + return false; +} +shouldBeTrue("forEachTypedArray(typedArrays, testSpeciesReturnsDataView)"); + finishJSTest(); diff --git a/JSTests/stress/typedarray-subarray.js b/JSTests/stress/typedarray-subarray.js index eb730e4ba457..8f3295f01f52 100644 --- a/JSTests/stress/typedarray-subarray.js +++ b/JSTests/stress/typedarray-subarray.js @@ -48,6 +48,17 @@ shouldBeTrue("forEachTypedArray(subclasses, testSpeciesIsDefault)"); subclasses.forEach(function(constructor) { constructor[Symbol.species] = undefined; }); shouldBeTrue("forEachTypedArray(subclasses, testSpeciesIsDefault)"); +subclasses.forEach(function(constructor) { constructor[Symbol.species] = () => new DataView(new ArrayBuffer()); }); +function testSpeciesReturnsDataView(array, constructor) { + try { + array.subarray(0, 0); + } catch (e) { + return e instanceof TypeError; + } + return false; +} +shouldBeTrue("forEachTypedArray(subclasses, testSpeciesReturnsDataView)"); + subclasses = typedArrays.map(function(constructor) { return class extends constructor { } } ); function testSpeciesRemoveConstructor(array, constructor) { array.constructor = undefined; diff --git a/JSTests/stress/unscopables.js b/JSTests/stress/unscopables.js index a6efd36cfd02..f7d916f2ea8c 100644 --- a/JSTests/stress/unscopables.js +++ b/JSTests/stress/unscopables.js @@ -9,7 +9,7 @@ function test(actual, expected) { test(typeof unscopables, "object"); test(unscopables.__proto__, undefined); - test(String(Object.keys(unscopables).sort()), "copyWithin,entries,fill,find,findIndex,includes,keys,values"); + test(String(Object.keys(unscopables).sort()), "copyWithin,entries,fill,find,findIndex,flat,flatMap,includes,keys,values"); }()); (function () { diff --git a/JSTests/stress/value-bit-and-ai-rule.js b/JSTests/stress/value-bit-and-ai-rule.js new file mode 100644 index 000000000000..bb9ba9b98119 --- /dev/null +++ b/JSTests/stress/value-bit-and-ai-rule.js @@ -0,0 +1,22 @@ +//@ runBigIntEnabled + +function assert(a, e) { + if (a !== e) + throw new Error("Expected: " + e + " bug got: " + a); +} + +let predicate = true; +function foo(a) { + let v = a; + if (predicate) + v = 0b1010; + + let c = v & 0b11; + return c; +} +noInline(foo); + +for (let i = 0; i < 10000; i++) { + assert(foo(0b1010n), 0b10); +} + diff --git a/JSTests/stress/value-bit-lshift-ai-rule.js b/JSTests/stress/value-bit-lshift-ai-rule.js new file mode 100644 index 000000000000..4b15fb20944e --- /dev/null +++ b/JSTests/stress/value-bit-lshift-ai-rule.js @@ -0,0 +1,22 @@ +//@ runBigIntEnabled + +function assert(a, e) { + if (a !== e) + throw new Error("Expected: " + e + " bug got: " + a); +} + +let predicate = true; +function foo(a) { + let v = a; + if (predicate) + v = 1; + + let c = v << 4; + return c; +} +noInline(foo); + +for (let i = 0; i < 10000; i++) { + assert(foo(1n), 16); +} + diff --git a/JSTests/stress/value-bit-or-ai-rule.js b/JSTests/stress/value-bit-or-ai-rule.js new file mode 100644 index 000000000000..b12f554b1ba2 --- /dev/null +++ b/JSTests/stress/value-bit-or-ai-rule.js @@ -0,0 +1,22 @@ +//@ runBigIntEnabled + +function assert(a, e) { + if (a !== e) + throw new Error("Expected: " + e + " bug got: " + a); +} + +let predicate = true; +function foo(a) { + let v = a; + if (predicate) + v = 0b1000; + + let c = v | 0b11; + return c; +} +noInline(foo); + +for (let i = 0; i < 10000; i++) { + assert(foo(0b1000n), 0b1011); +} + diff --git a/JSTests/stress/value-bit-xor-ai-rule.js b/JSTests/stress/value-bit-xor-ai-rule.js new file mode 100644 index 000000000000..13c1fa3579d7 --- /dev/null +++ b/JSTests/stress/value-bit-xor-ai-rule.js @@ -0,0 +1,22 @@ +//@ runBigIntEnabled + +function assert(a, e) { + if (a !== e) + throw new Error("Expected: " + e + " bug got: " + a); +} + +let predicate = true; +function foo(a) { + let v = a; + if (predicate) + v = 0b1010; + + let c = v ^ 0b0101; + return c; +} +noInline(foo); + +for (let i = 0; i < 10000; i++) { + assert(foo(0b1010n), 0b1111); +} + diff --git a/JSTests/stress/web-assembly-constructors-should-not-override-global-object-property.js b/JSTests/stress/web-assembly-constructors-should-not-override-global-object-property.js new file mode 100644 index 000000000000..9aecf423eab7 --- /dev/null +++ b/JSTests/stress/web-assembly-constructors-should-not-override-global-object-property.js @@ -0,0 +1,4 @@ +var originalModule = this.Module = {}; +WebAssembly.Module; +if (Module !== originalModule) + throw new Error('Global property `Module` was overwritten!'); diff --git a/JSTests/test262/config.yaml b/JSTests/test262/config.yaml index df1bbc79f3dc..b44f43228096 100644 --- a/JSTests/test262/config.yaml +++ b/JSTests/test262/config.yaml @@ -12,9 +12,6 @@ skip: - BigInt # https://bugs.webkit.org/show_bug.cgi?id=166693 - async-iteration - # https://bugs.webkit.org/show_bug.cgi?id=186694 - - String.prototype.matchAll - - Symbol.matchAll # https://bugs.webkit.org/show_bug.cgi?id=174931 - regexp-lookbehind diff --git a/JSTests/test262/expectations.yaml b/JSTests/test262/expectations.yaml index 0d9d46f3236b..fe1cdc37c1ee 100644 --- a/JSTests/test262/expectations.yaml +++ b/JSTests/test262/expectations.yaml @@ -624,9 +624,6 @@ test/built-ins/Array/of/return-abrupt-from-data-property.js: test/built-ins/Array/proto-from-ctor-realm.js: default: 'Test262Error: Expected SameValue(«», «») to be true' strict mode: 'Test262Error: Expected SameValue(«», «») to be true' -test/built-ins/Array/prototype/Symbol.unscopables/value.js: - default: 'Test262Error: `flat` property value Expected SameValue(«undefined», «true») to be true' - strict mode: 'Test262Error: `flat` property value Expected SameValue(«undefined», «true») to be true' test/built-ins/Array/prototype/filter/target-array-with-non-writable-property.js: default: 'TypeError: Attempted to assign to readonly property.' strict mode: 'TypeError: Attempted to assign to readonly property.' @@ -663,9 +660,6 @@ test/built-ins/Array/prototype/push/throws-if-integer-limit-exceeded.js: test/built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-proxy.js: default: 'Test262Error: Expected a StopReverse but got a Test262Error' strict mode: 'Test262Error: Expected a StopReverse but got a Test262Error' -test/built-ins/Array/prototype/slice/create-proto-from-ctor-realm-non-array.js: - default: 'Test262Error: Expected SameValue(«», «[object Object]») to be true' - strict mode: 'Test262Error: Expected SameValue(«», «[object Object]») to be true' test/built-ins/Array/prototype/slice/length-exceeding-integer-limit-proxied-array.js: default: 'Test262Error: Expected [] and [9007199254740989, 9007199254740990] to have the same contents. slice(9007199254740989)' strict mode: 'Test262Error: Expected [] and [9007199254740989, 9007199254740990] to have the same contents. slice(9007199254740989)' @@ -681,9 +675,6 @@ test/built-ins/Array/prototype/splice/S15.4.4.12_A3_T1.js: test/built-ins/Array/prototype/splice/clamps-length-to-integer-limit.js: default: 'Test262Error: Length is 2**53 - 1 Expected SameValue(«4294967295», «9007199254740991») to be true' strict mode: 'Test262Error: Length is 2**53 - 1 Expected SameValue(«4294967295», «9007199254740991») to be true' -test/built-ins/Array/prototype/splice/create-proto-from-ctor-realm-non-array.js: - default: 'Test262Error: Expected SameValue(«», «[object Object]») to be true' - strict mode: 'Test262Error: Expected SameValue(«», «[object Object]») to be true' test/built-ins/Array/prototype/splice/create-proxy.js: default: 'TypeError: Attempted to assign to readonly property.' strict mode: 'TypeError: Attempted to assign to readonly property.' @@ -870,6 +861,18 @@ test/built-ins/Date/proto-from-ctor-realm-zero.js: test/built-ins/Date/prototype/toDateString/negative-year.js: default: 'Test262Error: Date.prototype.toDateString serializes year -1 to "-0001" Expected SameValue(«-001», «-0001») to be true' strict mode: 'Test262Error: Date.prototype.toDateString serializes year -1 to "-0001" Expected SameValue(«-001», «-0001») to be true' +test/built-ins/Date/prototype/toJSON/invoke-result.js: + default: 'TypeError: toISOString did not return a primitive value' + strict mode: 'TypeError: toISOString did not return a primitive value' +test/built-ins/Date/prototype/toJSON/to-object.js: + default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' +test/built-ins/Date/prototype/toJSON/to-primitive-symbol.js: + default: 'TypeError: toISOString did not return a primitive value' + strict mode: 'TypeError: toISOString did not return a primitive value' +test/built-ins/Date/prototype/toJSON/to-primitive-value-of.js: + default: 'TypeError: toISOString did not return a primitive value' + strict mode: 'TypeError: toISOString did not return a primitive value' test/built-ins/Date/prototype/toString/negative-year.js: default: 'Test262Error: Date.prototype.toString serializes year -1 to "-0001" Expected SameValue(«-001», «-0001») to be true' strict mode: 'Test262Error: Date.prototype.toString serializes year -1 to "-0001" Expected SameValue(«-001», «-0001») to be true' @@ -879,8 +882,201 @@ test/built-ins/Date/prototype/toUTCString/negative-year.js: test/built-ins/Error/proto-from-ctor-realm.js: default: 'Test262Error: Expected SameValue(«Error», «Error») to be true' strict mode: 'Test262Error: Expected SameValue(«Error», «Error») to be true' -test/built-ins/Function/StrictFunction_restricted-properties.js: - default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/Symbol.toStringTag.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-job-not-active-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-length.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-missing-internal-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-name.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-not-object-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-prop-desc.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/proto.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/constructor.js: + default: 'Test262Error: typeof FinalizationGroup is function Expected SameValue(«undefined», «function») to be true' + strict mode: 'Test262Error: typeof FinalizationGroup is function Expected SameValue(«undefined», «function») to be true' +test/built-ins/FinalizationGroup/gc-has-one-chance-to-call-cleanupCallback.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/instance-extensible.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/length.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/name.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/newtarget-prototype-is-not-object.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prop-desc.js: + default: 'Test262Error: obj should have an own property FinalizationGroup' + strict mode: 'Test262Error: obj should have an own property FinalizationGroup' +test/built-ins/FinalizationGroup/proto-from-ctor-realm.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/proto.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype-from-newtarget-abrupt.js: + default: 'Test262Error: Expected a Test262Error but got a ReferenceError' + strict mode: 'Test262Error: Expected a Test262Error but got a ReferenceError' +test/built-ins/FinalizationGroup/prototype-from-newtarget-custom.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype-from-newtarget.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/Symbol.toStringTag.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-iterator-proto.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-not-callable-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-reference.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-unregister.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanupcallback-iterator-proto.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/custom-this.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/gc-cleanup-not-prevented-with-wr-deref.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-dynamic.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-holdings-multiple-values.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/length.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/name.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/prop-desc.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/this-does-not-have-internal-cells-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/cleanupSome/this-not-object-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/constructor.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/prop-desc.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/proto.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/custom-this.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/holdings-any-value-type.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/holdings-same-as-target.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/length.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/name.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/prop-desc.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/return-undefined-register-itself.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/return-undefined.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/target-not-object-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/this-does-not-have-internal-target-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/this-not-object-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/unregisterToken-not-object-or-undefined-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings-and-target.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-target.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/custom-this.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/length.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/name.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/prop-desc.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/this-does-not-have-internal-cells-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/this-not-object-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/unregister.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/prototype/unregister/unregisterToken-not-object-throws.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/returns-new-object-from-constructor.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" +test/built-ins/FinalizationGroup/target-not-callable-throws.js: + default: 'Test262Error: typeof FinalizationGroup is function Expected SameValue(«undefined», «function») to be true' + strict mode: 'Test262Error: typeof FinalizationGroup is function Expected SameValue(«undefined», «function») to be true' +test/built-ins/FinalizationGroup/undefined-newtarget-throws.js: + default: 'Test262Error: typeof FinalizationGroup is function Expected SameValue(«undefined», «function») to be true' + strict mode: 'Test262Error: typeof FinalizationGroup is function Expected SameValue(«undefined», «function») to be true' +test/built-ins/FinalizationGroup/unnaffected-by-poisoned-cleanupCallback.js: + default: "ReferenceError: Can't find variable: FinalizationGroup" + strict mode: "ReferenceError: Can't find variable: FinalizationGroup" test/built-ins/Function/call-bind-this-realm-undef.js: default: 'Test262Error: implicit undefined Expected SameValue(«[object global]», «[object Undefined]») to be true' strict mode: 'Test262Error: implicit undefined Expected SameValue(«[object global]», «[object Undefined]») to be true' @@ -908,12 +1104,6 @@ test/built-ins/Function/prototype/bind/length-exceeds-int32.js: test/built-ins/Function/prototype/bind/proto-from-ctor-realm.js: default: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true' strict mode: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true' -test/built-ins/Function/prototype/restricted-property-arguments.js: - default: "ReferenceError: Can't find variable: verifyNotEnumerable" - strict mode: "ReferenceError: Can't find variable: verifyNotEnumerable" -test/built-ins/Function/prototype/restricted-property-caller.js: - default: "ReferenceError: Can't find variable: verifyNotEnumerable" - strict mode: "ReferenceError: Can't find variable: verifyNotEnumerable" test/built-ins/Function/prototype/toString/AsyncFunction.js: default: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration." strict mode: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration." @@ -1080,45 +1270,36 @@ test/built-ins/Object/proto-from-ctor.js: test/built-ins/Object/prototype/toString/proxy-function.js: default: 'Test262Error: function proxy Expected SameValue(«[object Object]», «[object Function]») to be true' strict mode: 'Test262Error: function proxy Expected SameValue(«[object Object]», «[object Function]») to be true' +test/built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js: + default: 'Test262Error: Expected SameValue(«[object Math]», «[object Object]») to be true' + strict mode: 'Test262Error: Expected SameValue(«[object Math]», «[object Object]») to be true' +test/built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js: + default: 'Test262Error: generator function proxy without Symbol.toStringTag Expected SameValue(«[object Object]», «[object Function]») to be true' + strict mode: 'Test262Error: generator function proxy without Symbol.toStringTag Expected SameValue(«[object Object]», «[object Function]») to be true' test/built-ins/Promise/all/invoke-resolve-get-error-close.js: - default: 'Test262Error: Expected SameValue(«1», «0») to be true' - strict mode: 'Test262Error: Expected SameValue(«1», «0») to be true' -test/built-ins/Promise/all/invoke-resolve-get-once-multiple-calls.js: - default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», «1») to be true' - strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», «1») to be true' -test/built-ins/Promise/all/invoke-resolve-get-once-no-calls.js: - default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», «1») to be true' - strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», «1») to be true' + default: 'Test262Error: Expected SameValue(«0», «1») to be true' + strict mode: 'Test262Error: Expected SameValue(«0», «1») to be true' test/built-ins/Promise/all/resolve-element-function-nonconstructor.js: default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js: - default: 'Test262Error: Expected SameValue(«1», «0») to be true' - strict mode: 'Test262Error: Expected SameValue(«1», «0») to be true' -test/built-ins/Promise/allSettled/invoke-resolve-get-once-multiple-calls.js: - default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», «1») to be true' - strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», «1») to be true' -test/built-ins/Promise/allSettled/invoke-resolve-get-once-no-calls.js: - default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», «1») to be true' - strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», «1») to be true' + default: 'Test262Error: Expected SameValue(«0», «1») to be true' + strict mode: 'Test262Error: Expected SameValue(«0», «1») to be true' test/built-ins/Promise/allSettled/reject-element-function-nonconstructor.js: default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' test/built-ins/Promise/allSettled/resolve-element-function-nonconstructor.js: default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' +test/built-ins/Promise/get-prototype-abrupt-executor-not-callable.js: + default: 'Test262Error: Expected a TypeError but got a Test262Error' + strict mode: 'Test262Error: Expected a TypeError but got a Test262Error' test/built-ins/Promise/proto-from-ctor-realm.js: default: 'Test262Error: Expected SameValue(«[object Promise]», «[object Promise]») to be true' strict mode: 'Test262Error: Expected SameValue(«[object Promise]», «[object Promise]») to be true' test/built-ins/Promise/race/invoke-resolve-get-error-close.js: - default: 'Test262Error: Expected SameValue(«1», «0») to be true' - strict mode: 'Test262Error: Expected SameValue(«1», «0») to be true' -test/built-ins/Promise/race/invoke-resolve-get-once-multiple-calls.js: - default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», «1») to be true' - strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«4», «1») to be true' -test/built-ins/Promise/race/invoke-resolve-get-once-no-calls.js: - default: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», «1») to be true' - strict mode: 'Test262Error: Got `resolve` only once for each iterated value Expected SameValue(«0», «1») to be true' + default: 'Test262Error: Expected SameValue(«0», «1») to be true' + strict mode: 'Test262Error: Expected SameValue(«0», «1») to be true' test/built-ins/Promise/reject-function-nonconstructor.js: default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' @@ -1128,18 +1309,39 @@ test/built-ins/Promise/resolve-function-nonconstructor.js: test/built-ins/Proxy/apply/arguments-realm.js: default: 'Test262Error: Expected SameValue(«function Array() {' strict mode: 'Test262Error: Expected SameValue(«function Array() {' +test/built-ins/Proxy/apply/null-handler-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' test/built-ins/Proxy/apply/trap-is-not-callable-realm.js: default: 'Test262Error: Expected a TypeError but got a TypeError' strict mode: 'Test262Error: Expected a TypeError but got a TypeError' test/built-ins/Proxy/construct/arguments-realm.js: default: 'Test262Error: Expected SameValue(«function Array() {' strict mode: 'Test262Error: Expected SameValue(«function Array() {' +test/built-ins/Proxy/construct/null-handler-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' +test/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' +test/built-ins/Proxy/construct/return-not-object-throws-null-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' +test/built-ins/Proxy/construct/return-not-object-throws-number-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' +test/built-ins/Proxy/construct/return-not-object-throws-string-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' +test/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' +test/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js: + default: 'Test262Error: Expected a TypeError but got a TypeError' + strict mode: 'Test262Error: Expected a TypeError but got a TypeError' test/built-ins/Proxy/construct/trap-is-not-callable-realm.js: default: 'Test262Error: Expected a TypeError but got a TypeError' strict mode: 'Test262Error: Expected a TypeError but got a TypeError' -test/built-ins/Proxy/construct/trap-is-undefined-proto-from-ctor-realm.js: - default: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true' - strict mode: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true' test/built-ins/Proxy/create-handler-is-revoked-proxy.js: default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' @@ -1386,6 +1588,9 @@ test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elymaic.js: test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Grantha.js: default: 'Test262Error: `\p{Script_Extensions=Grantha}` should match U+011FD3 (`𑿓`)' strict mode: 'Test262Error: `\p{Script_Extensions=Grantha}` should match U+011FD3 (`𑿓`)' +test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han.js: + default: 'Test262Error: `\p{Script_Extensions=Han}` should match U+0032FF (`㋿`)' + strict mode: 'Test262Error: `\p{Script_Extensions=Han}` should match U+0032FF (`㋿`)' test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana.js: default: 'Test262Error: `\p{Script_Extensions=Hiragana}` should match U+01B150 (`𛅐`)' strict mode: 'Test262Error: `\p{Script_Extensions=Hiragana}` should match U+01B150 (`𛅐`)' @@ -1781,6 +1986,84 @@ test/built-ins/TypedArrayConstructors/of/new-instance-using-custom-ctor.js: test/built-ins/WeakMap/proto-from-ctor-realm.js: default: 'Test262Error: Expected SameValue(«[object WeakMap]», «[object WeakMap]») to be true' strict mode: 'Test262Error: Expected SameValue(«[object WeakMap]», «[object WeakMap]») to be true' +test/built-ins/WeakRef/constructor.js: + default: 'Test262Error: typeof WeakRef is function Expected SameValue(«undefined», «function») to be true' + strict mode: 'Test262Error: typeof WeakRef is function Expected SameValue(«undefined», «function») to be true' +test/built-ins/WeakRef/instance-extensible.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/length.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/name.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/newtarget-prototype-is-not-object.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prop-desc.js: + default: 'Test262Error: obj should have an own property WeakRef' + strict mode: 'Test262Error: obj should have an own property WeakRef' +test/built-ins/WeakRef/proto-from-ctor-realm.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/proto.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js: + default: 'Test262Error: Expected a Test262Error but got a ReferenceError' + strict mode: 'Test262Error: Expected a Test262Error but got a ReferenceError' +test/built-ins/WeakRef/prototype-from-newtarget-custom.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype-from-newtarget.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/Symbol.toStringTag.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/constructor.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/custom-this.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/gc-cleanup-not-prevented-with-wr-deref.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/length.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/name.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/prop-desc.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/return-target.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/this-does-not-have-internal-target-throws.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/deref/this-not-object-throws.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/prop-desc.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/prototype/proto.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/returns-new-object-from-constructor.js: + default: "ReferenceError: Can't find variable: WeakRef" + strict mode: "ReferenceError: Can't find variable: WeakRef" +test/built-ins/WeakRef/target-not-object-throws.js: + default: 'Test262Error: typeof WeakRef is function Expected SameValue(«undefined», «function») to be true' + strict mode: 'Test262Error: typeof WeakRef is function Expected SameValue(«undefined», «function») to be true' +test/built-ins/WeakRef/undefined-newtarget-throws.js: + default: 'Test262Error: typeof WeakRef is function Expected SameValue(«undefined», «function») to be true' + strict mode: 'Test262Error: typeof WeakRef is function Expected SameValue(«undefined», «function») to be true' test/built-ins/WeakSet/proto-from-ctor-realm.js: default: 'Test262Error: Expected SameValue(«[object WeakSet]», «[object WeakSet]») to be true' strict mode: 'Test262Error: Expected SameValue(«[object WeakSet]», «[object WeakSet]») to be true' @@ -1793,9 +2076,69 @@ test/intl402/Collator/prototype/compare/compare-function-name.js: test/intl402/Collator/usage-de.js: default: 'Test262Error: Expected [Ä, AE] and [AE, Ä] to have the same contents. search' strict mode: 'Test262Error: Expected [Ä, AE] and [AE, Ä] to have the same contents. search' +test/intl402/DateTimeFormat/constructor-options-dayPeriod-invalid.js: + default: 'Test262Error: new Intl.DateTimeFormat("en", { dayPeriod: "" }) throws RangeError Expected a RangeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: new Intl.DateTimeFormat("en", { dayPeriod: "" }) throws RangeError Expected a RangeError to be thrown but no exception was thrown at all' +test/intl402/DateTimeFormat/constructor-options-dayPeriod-valid.js: + default: 'Test262Error: Expected SameValue(«undefined», «long») to be true' + strict mode: 'Test262Error: Expected SameValue(«undefined», «long») to be true' +test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-invalid.js: + default: 'Test262Error: new Intl.DateTimeFormat("en", { fractionalSecondDigits: "LONG" }) throws RangeError Expected a RangeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: new Intl.DateTimeFormat("en", { fractionalSecondDigits: "LONG" }) throws RangeError Expected a RangeError to be thrown but no exception was thrown at all' +test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-valid.js: + default: 'Test262Error: Expected SameValue(«undefined», «0») to be true' + strict mode: 'Test262Error: Expected SameValue(«undefined», «0») to be true' +test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js: + default: 'Test262Error: Expected [day, hour, day, hour] and [day, dayPeriod, hour, day, dayPeriod, hour] to have the same contents. undefined' + strict mode: 'Test262Error: Expected [day, hour, day, hour] and [day, dayPeriod, hour, day, dayPeriod, hour] to have the same contents. undefined' +test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js: + default: 'Test262Error: Expected [second, localeMatcher, second, timeZoneName, formatMatcher] and [second, fractionalSecondDigits, localeMatcher, second, timeZoneName, fractionalSecondDigits, formatMatcher] to have the same contents. undefined' + strict mode: 'Test262Error: Expected [second, localeMatcher, second, timeZoneName, formatMatcher] and [second, fractionalSecondDigits, localeMatcher, second, timeZoneName, fractionalSecondDigits, formatMatcher] to have the same contents. undefined' +test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js: + default: 'Test262Error: Exception from dayPeriod getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: Exception from dayPeriod getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' +test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js: + default: 'Test262Error: Exception from fractionalSecondDigits getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: Exception from fractionalSecondDigits getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' +test/intl402/DateTimeFormat/constructor-options-throwing-getters-quarter.js: + default: 'Test262Error: Exception from quarter getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: Exception from quarter getter should be propagated Expected a CustomError to be thrown but no exception was thrown at all' +test/intl402/DateTimeFormat/numbering-system-calendar-options.js: + default: "Test262Error: Options value for property numberingSystem doesn't override locale extension key nu. Expected SameValue(«arab», «latn») to be true" + strict mode: "Test262Error: Options value for property numberingSystem doesn't override locale extension key nu. Expected SameValue(«arab», «latn») to be true" +test/intl402/DateTimeFormat/prototype/format/dayPeriod-long-en.js: + default: 'Test262Error: 00:00, long format Expected SameValue(«12/12/2017», «at night») to be true' + strict mode: 'Test262Error: 00:00, long format Expected SameValue(«12/12/2017», «at night») to be true' +test/intl402/DateTimeFormat/prototype/format/dayPeriod-narrow-en.js: + default: 'Test262Error: 00:00, narrow format Expected SameValue(«12/12/2017», «at night») to be true' + strict mode: 'Test262Error: 00:00, narrow format Expected SameValue(«12/12/2017», «at night») to be true' +test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js: + default: 'Test262Error: 00:00, short format Expected SameValue(«12/12/2017», «at night») to be true' + strict mode: 'Test262Error: 00:00, short format Expected SameValue(«12/12/2017», «at night») to be true' test/intl402/DateTimeFormat/prototype/format/format-function-name.js: default: 'Test262Error: Expected SameValue(«true», «false») to be true' strict mode: 'Test262Error: Expected SameValue(«true», «false») to be true' +test/intl402/DateTimeFormat/prototype/format/fractionalSecondDigits.js: + default: 'Test262Error: 1 fractionalSecondDigits round down Expected SameValue(«02:03», «02:03.2») to be true' + strict mode: 'Test262Error: 1 fractionalSecondDigits round down Expected SameValue(«02:03», «02:03.2») to be true' +test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-long-en.js: + default: 'Test262Error: length should be 1, 00:00, long format Expected SameValue(«5», «1») to be true' + strict mode: 'Test262Error: length should be 1, 00:00, long format Expected SameValue(«5», «1») to be true' +test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-narrow-en.js: + default: 'Test262Error: length should be 1, 00:00, narrow format Expected SameValue(«5», «1») to be true' + strict mode: 'Test262Error: length should be 1, 00:00, narrow format Expected SameValue(«5», «1») to be true' +test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-short-en.js: + default: 'Test262Error: length should be 1, 00:00, short format Expected SameValue(«5», «1») to be true' + strict mode: 'Test262Error: length should be 1, 00:00, short format Expected SameValue(«5», «1») to be true' +test/intl402/DateTimeFormat/prototype/formatToParts/fractionalSecondDigits.js: + default: 'Test262Error: length should be 5, 1 fractionalSecondDigits round down Expected SameValue(«3», «5») to be true' + strict mode: 'Test262Error: length should be 5, 1 fractionalSecondDigits round down Expected SameValue(«3», «5») to be true' +test/intl402/DateTimeFormat/prototype/resolvedOptions/order-dayPeriod.js: + default: 'Test262Error: Expected [locale, calendar, numberingSystem, timeZone, hour, hourCycle, hour12, minute] and [locale, calendar, numberingSystem, timeZone, hourCycle, hour12, dayPeriod, hour, minute] to have the same contents. undefined' + strict mode: 'Test262Error: Expected [locale, calendar, numberingSystem, timeZone, hour, hourCycle, hour12, minute] and [locale, calendar, numberingSystem, timeZone, hourCycle, hour12, dayPeriod, hour, minute] to have the same contents. undefined' +test/intl402/DateTimeFormat/prototype/resolvedOptions/order-fractionalSecondDigits.js: + default: 'Test262Error: Expected [locale, calendar, numberingSystem, timeZone, minute, second] and [locale, calendar, numberingSystem, timeZone, minute, second, fractionalSecondDigits] to have the same contents. undefined' + strict mode: 'Test262Error: Expected [locale, calendar, numberingSystem, timeZone, minute, second] and [locale, calendar, numberingSystem, timeZone, minute, second, fractionalSecondDigits] to have the same contents. undefined' test/intl402/DateTimeFormat/prototype/resolvedOptions/order.js: default: 'Test262Error: Expected [locale, calendar, numberingSystem, timeZone, weekday, era, year, month, day, hour, hourCycle, hour12, minute, second, timeZoneName] and [locale, calendar, numberingSystem, timeZone, hourCycle, hour12, weekday, era, year, month, day, hour, minute, second, timeZoneName] to have the same contents. undefined' strict mode: 'Test262Error: Expected [locale, calendar, numberingSystem, timeZone, weekday, era, year, month, day, hour, hourCycle, hour12, minute, second, timeZoneName] and [locale, calendar, numberingSystem, timeZone, hourCycle, hour12, weekday, era, year, month, day, hour, minute, second, timeZoneName] to have the same contents. undefined' @@ -1805,12 +2148,21 @@ test/intl402/Intl/getCanonicalLocales/invalid-tags.js: test/intl402/Intl/getCanonicalLocales/non-iana-canon.js: default: 'Test262Error: The value of Intl.getCanonicalLocales(tag)[0] equals the value of `canonical` Expected SameValue(«aar-x-private», «aa-x-private») to be true' strict mode: 'Test262Error: The value of Intl.getCanonicalLocales(tag)[0] equals the value of `canonical` Expected SameValue(«aar-x-private», «aa-x-private») to be true' +test/intl402/NumberFormat/numbering-system-options.js: + default: "Test262Error: Options value for property numberingSystem doesn't override locale extension key nu. Expected SameValue(«arab», «latn») to be true" + strict mode: "Test262Error: Options value for property numberingSystem doesn't override locale extension key nu. Expected SameValue(«arab», «latn») to be true" test/intl402/NumberFormat/prototype/format/format-function-name.js: default: 'Test262Error: Expected SameValue(«true», «false») to be true' strict mode: 'Test262Error: Expected SameValue(«true», «false») to be true' test/intl402/NumberFormat/prototype/format/format-negative-numbers.js: default: 'Test262Error: Intl.NumberFormat is formatting 0 and -0 the same way. Expected SameValue(«0», «0») to be false' strict mode: 'Test262Error: Intl.NumberFormat is formatting 0 and -0 the same way. Expected SameValue(«0», «0») to be false' +test/intl402/NumberFormat/prototype/resolvedOptions/order.js: + default: 'Test262Error: Expected [locale, numberingSystem, style, currency, currencyDisplay, minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, minimumSignificantDigits, maximumSignificantDigits, useGrouping] and [locale, numberingSystem, style, currency, currencyDisplay, minimumIntegerDigits, minimumSignificantDigits, maximumSignificantDigits, useGrouping] to have the same contents. undefined' + strict mode: 'Test262Error: Expected [locale, numberingSystem, style, currency, currencyDisplay, minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, minimumSignificantDigits, maximumSignificantDigits, useGrouping] and [locale, numberingSystem, style, currency, currencyDisplay, minimumIntegerDigits, minimumSignificantDigits, maximumSignificantDigits, useGrouping] to have the same contents. undefined' +test/intl402/fallback-locales-are-supported.js: + default: "Test262Error: Locale zh-Hans-CN is supported, but fallback zh-Hans isn't. Expected SameValue(«-1», «-1») to be false (Testing with Collator.)" + strict mode: "Test262Error: Locale zh-Hans-CN is supported, but fallback zh-Hans isn't. Expected SameValue(«-1», «-1») to be false (Testing with Collator.)" test/intl402/supportedLocalesOf-returned-array-elements-are-not-frozen.js: default: 'Test262Error: Property 0 of object returned by SupportedLocales is not writable. Expected SameValue(«false», «true») to be true (Testing with Collator.)' strict mode: 'Test262Error: Property 0 of object returned by SupportedLocales is not writable. Expected SameValue(«false», «true») to be true (Testing with Collator.)' @@ -1824,9 +2176,6 @@ test/language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-se default: 'Test262Error: Expected obj[0] to have configurable:false.' test/language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-param.js: default: 'Test262Error: Expected obj[0] to have configurable:false.' -test/language/asi/S7.9_A5.7_T1.js: - default: 'SyntaxError: The prefix-increment operator requires a reference expression.' - strict mode: 'SyntaxError: The prefix-increment operator requires a reference expression.' test/language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js: default: 'Test262: This statement should not be evaluated.' test/language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-class.js: @@ -2077,42 +2426,12 @@ test/language/expressions/assignment/fn-name-lhs-cover.js: test/language/expressions/assignment/fn-name-lhs-member.js: default: 'Test262Error: Expected SameValue(«true», «false») to be true' strict mode: 'Test262Error: Expected SameValue(«true», «false») to be true' -test/language/expressions/assignment/non-simple-target.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/assignment/target-boolean.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/assignment/target-cover-newtarget.js: - default: "SyntaxError: new.target can't be the left hand side of an assignment expression." - strict mode: "SyntaxError: new.target can't be the left hand side of an assignment expression." -test/language/expressions/assignment/target-cover-yieldexpr.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/assignment/target-newtarget.js: - default: "SyntaxError: new.target can't be the left hand side of an assignment expression." - strict mode: "SyntaxError: new.target can't be the left hand side of an assignment expression." -test/language/expressions/assignment/target-null.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/assignment/target-number.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/assignment/target-string.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' test/language/expressions/async-arrow-function/await-as-param-ident-nested-arrow-parameter-position.js: default: 'Test262: This statement should not be evaluated.' strict mode: 'Test262: This statement should not be evaluated.' test/language/expressions/async-arrow-function/await-as-param-nested-arrow-body-position.js: default: 'Test262: This statement should not be evaluated.' strict mode: 'Test262: This statement should not be evaluated.' -test/language/expressions/async-function/early-errors-expression-not-simple-assignment-target.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/await/early-errors-await-not-simple-assignment-target.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' test/language/expressions/call/eval-realm-indirect.js: default: 'Test262Error: Expected SameValue(«inside», «outside») to be true' test/language/expressions/call/eval-spread-empty-leading.js: @@ -2163,6 +2482,9 @@ test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-gen-me test/language/expressions/class/name.js: default: 'Test262Error: Expected SameValue(«true», «false») to be true' strict mode: 'Test262Error: Expected SameValue(«true», «false») to be true' +test/language/expressions/class/poisoned-underscore-proto.js: + default: 'Test262Error: should not be called' + strict mode: 'Test262Error: should not be called' test/language/expressions/compound-assignment/S11.13.2_A5.10_T1.js: default: "ReferenceError: Can't find variable: x" test/language/expressions/compound-assignment/S11.13.2_A5.10_T2.js: @@ -2317,93 +2639,9 @@ test/language/expressions/compound-assignment/S11.13.2_A7.8_T4.js: test/language/expressions/compound-assignment/S11.13.2_A7.9_T4.js: default: 'Test262Error: Expected true but got false' strict mode: 'Test262Error: Expected true but got false' -test/language/expressions/compound-assignment/add-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/btws-and-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/btws-or-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/btws-xor-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/div-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/left-shift-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/mod-div-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/mult-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/right-shift-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/subtract-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/compound-assignment/u-right-shift-non-simple.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' test/language/expressions/conditional/in-branch-1.js: default: "SyntaxError: Unexpected keyword 'in'. Expected ':' in ternary operator." strict mode: "SyntaxError: Unexpected keyword 'in'. Expected ':' in ternary operator." -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-1-update-expression.js: - default: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-10-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-11-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-12-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-13-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-14-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-15-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-16-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-17-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-2-update-expression.js: - default: 'SyntaxError: Postfix -- operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Postfix -- operator applied to value that is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-3-update-expression.js: - default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-4-update-expression.js: - default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-5-lhs-equals-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-6-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-7-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-8-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-9-lhs-assignment-operator-assignment-expression.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' test/language/expressions/function/name.js: default: 'Test262Error: Expected SameValue(«true», «false») to be true' strict mode: 'Test262Error: Expected SameValue(«true», «false») to be true' @@ -2431,14 +2669,10 @@ test/language/expressions/generators/scope-param-rest-elem-var-close.js: default: 'Test262Error: Expected SameValue(«inside», «outside») to be true' test/language/expressions/import.meta/import-meta-is-an-ordinary-object.js: module: 'SyntaxError: Cannot use new with import.' -test/language/expressions/import.meta/syntax/invalid-assignment-target-assignment-expr.js: - module: "SyntaxError: import.meta can't be the left hand side of an assignment expression." test/language/expressions/import.meta/syntax/invalid-assignment-target-for-in-loop.js: module: 'Test262: This statement should not be evaluated.' test/language/expressions/import.meta/syntax/invalid-assignment-target-for-of-loop.js: module: 'Test262: This statement should not be evaluated.' -test/language/expressions/import.meta/syntax/invalid-assignment-target-update-expr.js: - module: "SyntaxError: import.meta can't come before a postfix operator." test/language/expressions/instanceof/prototype-getter-with-primitive.js: default: "Test262Error: getter for 'prototype' called" strict mode: "Test262Error: getter for 'prototype' called" @@ -2491,15 +2725,6 @@ test/language/expressions/postfix-decrement/S11.3.2_A5_T5.js: test/language/expressions/postfix-decrement/S11.3.2_A6_T3.js: default: 'Test262Error: Expected true but got false' strict mode: 'Test262Error: Expected true but got false' -test/language/expressions/postfix-decrement/target-cover-newtarget.js: - default: "SyntaxError: new.target can't come before a postfix operator." - strict mode: "SyntaxError: new.target can't come before a postfix operator." -test/language/expressions/postfix-decrement/target-cover-yieldexpr.js: - default: 'SyntaxError: Postfix -- operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Postfix -- operator applied to value that is not a reference.' -test/language/expressions/postfix-decrement/target-newtarget.js: - default: "SyntaxError: new.target can't come before a postfix operator." - strict mode: "SyntaxError: new.target can't come before a postfix operator." test/language/expressions/postfix-increment/S11.3.1_A5_T1.js: default: "ReferenceError: Can't find variable: x" test/language/expressions/postfix-increment/S11.3.1_A5_T2.js: @@ -2514,15 +2739,6 @@ test/language/expressions/postfix-increment/S11.3.1_A5_T5.js: test/language/expressions/postfix-increment/S11.3.1_A6_T3.js: default: 'Test262Error: Expected true but got false' strict mode: 'Test262Error: Expected true but got false' -test/language/expressions/postfix-increment/target-cover-newtarget.js: - default: "SyntaxError: new.target can't come before a postfix operator." - strict mode: "SyntaxError: new.target can't come before a postfix operator." -test/language/expressions/postfix-increment/target-cover-yieldexpr.js: - default: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' -test/language/expressions/postfix-increment/target-newtarget.js: - default: "SyntaxError: new.target can't come before a postfix operator." - strict mode: "SyntaxError: new.target can't come before a postfix operator." test/language/expressions/prefix-decrement/S11.4.5_A5_T1.js: default: "ReferenceError: Can't find variable: x" test/language/expressions/prefix-decrement/S11.4.5_A5_T2.js: @@ -2537,15 +2753,6 @@ test/language/expressions/prefix-decrement/S11.4.5_A5_T5.js: test/language/expressions/prefix-decrement/S11.4.5_A6_T3.js: default: 'Test262Error: Expected true but got false' strict mode: 'Test262Error: Expected true but got false' -test/language/expressions/prefix-decrement/target-cover-newtarget.js: - default: "SyntaxError: new.target can't come after a prefix operator." - strict mode: "SyntaxError: new.target can't come after a prefix operator." -test/language/expressions/prefix-decrement/target-cover-yieldexpr.js: - default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' -test/language/expressions/prefix-decrement/target-newtarget.js: - default: "SyntaxError: new.target can't come after a prefix operator." - strict mode: "SyntaxError: new.target can't come after a prefix operator." test/language/expressions/prefix-increment/S11.4.4_A5_T1.js: default: "ReferenceError: Can't find variable: x" test/language/expressions/prefix-increment/S11.4.4_A5_T2.js: @@ -2560,21 +2767,15 @@ test/language/expressions/prefix-increment/S11.4.4_A5_T5.js: test/language/expressions/prefix-increment/S11.4.4_A6_T3.js: default: 'Test262Error: Expected true but got false' strict mode: 'Test262Error: Expected true but got false' -test/language/expressions/prefix-increment/target-cover-newtarget.js: - default: "SyntaxError: new.target can't come after a prefix operator." - strict mode: "SyntaxError: new.target can't come after a prefix operator." -test/language/expressions/prefix-increment/target-cover-yieldexpr.js: - default: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' - strict mode: 'SyntaxError: Prefix -- operator applied to value that is not a reference.' -test/language/expressions/prefix-increment/target-newtarget.js: - default: "SyntaxError: new.target can't come after a prefix operator." - strict mode: "SyntaxError: new.target can't come after a prefix operator." +test/language/expressions/super/call-poisoned-underscore-proto.js: + default: 'Test262Error: should not be called' + strict mode: 'Test262Error: should not be called' test/language/expressions/super/call-proto-not-ctor.js: default: 'Test262Error: did not perform ArgumentsListEvaluation Expected SameValue(«true», «false») to be true' strict mode: 'Test262Error: did not perform ArgumentsListEvaluation Expected SameValue(«true», «false») to be true' -test/language/expressions/this/S11.1.1_A1.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' +test/language/expressions/super/prop-poisoned-underscore-proto.js: + default: 'Test262Error: should not be called' + strict mode: 'Test262Error: should not be called' test/language/expressions/yield/star-iterable.js: default: 'Test262Error: First result `done` flag Expected SameValue(«false», «undefined») to be true' strict mode: 'Test262Error: First result `done` flag Expected SameValue(«false», «undefined») to be true' @@ -2705,16 +2906,6 @@ test/language/module-code/eval-self-once.js: module: "SyntaxError: Unexpected identifier 'as'. Expected 'from' before exported module name." test/language/module-code/instn-once.js: module: "SyntaxError: Unexpected identifier 'as'. Expected 'from' before exported module name." -test/language/module-code/instn-resolve-empty-export.js: - module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' -test/language/module-code/instn-resolve-empty-import.js: - module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' -test/language/module-code/instn-resolve-err-reference.js: - module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' -test/language/module-code/instn-resolve-order-depth.js: - module: "SyntaxError: 'break' is only valid inside a switch or loop statement." -test/language/module-code/instn-resolve-order-src.js: - module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' test/language/module-code/instn-star-as-props-dflt-skip.js: module: "SyntaxError: Unexpected identifier 'as'. Expected 'from' before exported module name." test/language/module-code/instn-star-props-nrml.js: @@ -2733,8 +2924,6 @@ test/language/module-code/parse-err-hoist-lex-fun.js: module: 'Test262: This statement should not be evaluated.' test/language/module-code/parse-err-hoist-lex-gen.js: module: 'Test262: This statement should not be evaluated.' -test/language/module-code/parse-err-reference.js: - module: 'SyntaxError: Postfix ++ operator applied to value that is not a reference.' test/language/statements/class/class-name-ident-await-escaped.js: default: "SyntaxError: Unexpected escaped characters in keyword token: 'aw\\u0061it'" strict mode: "SyntaxError: Unexpected escaped characters in keyword token: 'aw\\u0061it'" @@ -2751,6 +2940,9 @@ test/language/statements/class/elements/syntax/valid/grammar-static-ctor-async-m test/language/statements/class/elements/syntax/valid/grammar-static-ctor-gen-meth-valid.js: default: "SyntaxError: Cannot declare a generator function named 'constructor'." strict mode: "SyntaxError: Cannot declare a generator function named 'constructor'." +test/language/statements/class/poisoned-underscore-proto.js: + default: 'Test262Error: should not be called' + strict mode: 'Test262Error: should not be called' test/language/statements/class/subclass/bound-function.js: default: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true' strict mode: 'Test262Error: Expected SameValue(«[object Object]», «[object Object]») to be true' @@ -3107,18 +3299,6 @@ test/language/statements/while/let-array-with-newline.js: default: 'Test262: This statement should not be evaluated.' test/language/statements/with/let-array-with-newline.js: default: 'Test262: This statement should not be evaluated.' -test/language/types/boolean/S8.3_A2.1.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/types/boolean/S8.3_A2.2.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/types/reference/S8.7.2_A1_T1.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' -test/language/types/reference/S8.7.2_A1_T2.js: - default: 'SyntaxError: Left side of assignment is not a reference.' - strict mode: 'SyntaxError: Left side of assignment is not a reference.' test/language/types/reference/put-value-prop-base-primitive-realm.js: default: 'Test262Error: number Expected SameValue(«0», «1») to be true' strict mode: 'Test262Error: number Expected SameValue(«0», «1») to be true' diff --git a/JSTests/test262/harness/propertyHelper.js b/JSTests/test262/harness/propertyHelper.js index edf86e94900d..a3a57a1bebe5 100644 --- a/JSTests/test262/harness/propertyHelper.js +++ b/JSTests/test262/harness/propertyHelper.js @@ -47,7 +47,7 @@ function verifyProperty(obj, name, desc, options) { var failures = []; if (Object.prototype.hasOwnProperty.call(desc, 'value')) { - if (desc.value !== originalDesc.value) { + if (!isSameValue(desc.value, originalDesc.value)) { failures.push("descriptor value should be " + desc.value); } } @@ -113,10 +113,11 @@ function isEnumerable(obj, name) { Object.prototype.propertyIsEnumerable.call(obj, name); } -function isEqualTo(obj, name, expectedValue) { - var actualValue = obj[name]; +function isSameValue(a, b) { + if (a === 0 && b === 0) return 1 / a === 1 / b; + if (a !== a && b !== b) return true; - return assert._isSameValue(actualValue, expectedValue); + return a === b; } function isWritable(obj, name, verifyProp, value) { @@ -133,7 +134,7 @@ function isWritable(obj, name, verifyProp, value) { } } - writeSucceeded = isEqualTo(obj, verifyProp || name, newValue); + writeSucceeded = isSameValue(obj[verifyProp || name], newValue); // Revert the change only if it was successful (in other cases, reverting // is unnecessary and may trigger exceptions for certain property @@ -150,7 +151,7 @@ function isWritable(obj, name, verifyProp, value) { } function verifyEqualTo(obj, name, value) { - if (!isEqualTo(obj, name, value)) { + if (!isSameValue(obj[name], value)) { $ERROR("Expected obj[" + String(name) + "] to equal " + value + ", actually " + obj[name]); } diff --git a/JSTests/test262/latest-changes-summary.txt b/JSTests/test262/latest-changes-summary.txt index f99f520c6e50..bc04322d189d 100644 --- a/JSTests/test262/latest-changes-summary.txt +++ b/JSTests/test262/latest-changes-summary.txt @@ -1,1808 +1,218 @@ -M harness/promiseHelper.js -M test/annexB/built-ins/Function/createdynfn-html-close-comment-body.js -M test/annexB/built-ins/Function/createdynfn-html-close-comment-params.js -A test/annexB/built-ins/Function/createdynfn-no-line-terminator-html-close-comment-body.js -A test/annexB/built-ins/Function/createdynfn-no-line-terminator-html-close-comment-params.js -M test/built-ins/BigInt/asIntN/bigint-tobigint-errors.js -M test/built-ins/BigInt/asUintN/bigint-tobigint-errors.js -A test/built-ins/Date/prototype/toDateString/negative-year.js -A test/built-ins/Date/prototype/toString/negative-year.js -A test/built-ins/Date/prototype/toUTCString/negative-year.js -A test/built-ins/JSON/stringify/bigint-tojson-receiver.js -M test/built-ins/Promise/all/capability-executor-called-twice.js -M test/built-ins/Promise/all/capability-executor-not-callable.js -M test/built-ins/Promise/all/capability-resolve-throws-no-close.js -M test/built-ins/Promise/all/capability-resolve-throws-reject.js -M test/built-ins/Promise/all/invoke-resolve-error-close.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/Symbol.toStringTag.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-job-not-active-throws.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-length.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-missing-internal-throws.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-name.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-not-object-throws.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-prop-desc.js +A test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/proto.js +A test/built-ins/FinalizationGroup/constructor.js +A test/built-ins/FinalizationGroup/gc-has-one-chance-to-call-cleanupCallback.js +A test/built-ins/FinalizationGroup/instance-extensible.js +A test/built-ins/FinalizationGroup/length.js +A test/built-ins/FinalizationGroup/name.js +A test/built-ins/FinalizationGroup/newtarget-prototype-is-not-object.js +A test/built-ins/FinalizationGroup/prop-desc.js +A test/built-ins/FinalizationGroup/proto-from-ctor-realm.js +A test/built-ins/FinalizationGroup/proto.js +A test/built-ins/FinalizationGroup/prototype/Symbol.toStringTag.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-iterator-proto.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-not-callable-throws.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-reference.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-unregister.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanupcallback-iterator-proto.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/custom-this.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/gc-cleanup-not-prevented-with-wr-deref.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-dynamic.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-holdings-multiple-values.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/length.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/name.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-callback-throws.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-cleanup-callback-throws.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/prop-desc.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined-with-gc.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/this-does-not-have-internal-cells-throws.js +A test/built-ins/FinalizationGroup/prototype/cleanupSome/this-not-object-throws.js +A test/built-ins/FinalizationGroup/prototype/constructor.js +A test/built-ins/FinalizationGroup/prototype/prop-desc.js +A test/built-ins/FinalizationGroup/prototype/proto.js +A test/built-ins/FinalizationGroup/prototype/register/custom-this.js +A test/built-ins/FinalizationGroup/prototype/register/holdings-any-value-type.js +A test/built-ins/FinalizationGroup/prototype/register/holdings-same-as-target.js +A test/built-ins/FinalizationGroup/prototype/register/length.js +A test/built-ins/FinalizationGroup/prototype/register/name.js +A test/built-ins/FinalizationGroup/prototype/register/prop-desc.js +A test/built-ins/FinalizationGroup/prototype/register/return-undefined-register-itself.js +A test/built-ins/FinalizationGroup/prototype/register/return-undefined.js +A test/built-ins/FinalizationGroup/prototype/register/target-not-object-throws.js +A test/built-ins/FinalizationGroup/prototype/register/this-does-not-have-internal-target-throws.js +A test/built-ins/FinalizationGroup/prototype/register/this-not-object-throws.js +A test/built-ins/FinalizationGroup/prototype/register/unregisterToken-not-object-or-undefined-throws.js +A test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings-and-target.js +A test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings.js +A test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-target.js +A test/built-ins/FinalizationGroup/prototype/unregister/custom-this.js +A test/built-ins/FinalizationGroup/prototype/unregister/length.js +A test/built-ins/FinalizationGroup/prototype/unregister/name.js +A test/built-ins/FinalizationGroup/prototype/unregister/prop-desc.js +A test/built-ins/FinalizationGroup/prototype/unregister/this-does-not-have-internal-cells-throws.js +A test/built-ins/FinalizationGroup/prototype/unregister/this-not-object-throws.js +A test/built-ins/FinalizationGroup/prototype/unregister/unregister.js +A test/built-ins/FinalizationGroup/prototype/unregister/unregisterToken-not-object-throws.js +A test/built-ins/FinalizationGroup/prototype-from-newtarget-abrupt.js +A test/built-ins/FinalizationGroup/prototype-from-newtarget-custom.js +A test/built-ins/FinalizationGroup/prototype-from-newtarget.js +A test/built-ins/FinalizationGroup/returns-new-object-from-constructor.js +A test/built-ins/FinalizationGroup/target-not-callable-throws.js +A test/built-ins/FinalizationGroup/undefined-newtarget-throws.js +A test/built-ins/FinalizationGroup/unnaffected-by-poisoned-cleanupCallback.js +M test/built-ins/Function/StrictFunction_restricted-properties.js +M test/built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js +M test/built-ins/Function/prototype/restricted-property-arguments.js +M test/built-ins/Function/prototype/restricted-property-caller.js +A test/built-ins/Object/prototype/toString/proxy-function-async.js +M test/built-ins/Object/prototype/toString/proxy-function.js +A test/built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js +A test/built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js +M test/built-ins/Object/subclass-object-arg.js M test/built-ins/Promise/all/invoke-resolve-get-error-close.js -M test/built-ins/Promise/all/invoke-resolve-get-error-reject.js -A test/built-ins/Promise/all/invoke-resolve-get-once-multiple-calls.js -A test/built-ins/Promise/all/invoke-resolve-get-once-no-calls.js -M test/built-ins/Promise/all/species-get-error.js -A test/built-ins/Promise/allSettled/call-resolve-element-after-return.js -A test/built-ins/Promise/allSettled/call-resolve-element-items.js -A test/built-ins/Promise/allSettled/call-resolve-element.js -A test/built-ins/Promise/allSettled/capability-executor-called-twice.js -A test/built-ins/Promise/allSettled/capability-executor-not-callable.js -A test/built-ins/Promise/allSettled/capability-resolve-throws-no-close.js -A test/built-ins/Promise/allSettled/capability-resolve-throws-reject.js -A test/built-ins/Promise/allSettled/ctx-ctor-throws.js -A test/built-ins/Promise/allSettled/ctx-ctor.js -A test/built-ins/Promise/allSettled/ctx-non-ctor.js -A test/built-ins/Promise/allSettled/ctx-non-object.js -A test/built-ins/Promise/allSettled/does-not-invoke-array-setters.js -A test/built-ins/Promise/allSettled/invoke-resolve-error-close.js -A test/built-ins/Promise/allSettled/invoke-resolve-error-reject.js -A test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js -A test/built-ins/Promise/allSettled/invoke-resolve-get-error-reject.js -A test/built-ins/Promise/allSettled/invoke-resolve-get-once-multiple-calls.js -A test/built-ins/Promise/allSettled/invoke-resolve-get-once-no-calls.js -A test/built-ins/Promise/allSettled/invoke-resolve-return.js -A test/built-ins/Promise/allSettled/invoke-resolve.js -A test/built-ins/Promise/allSettled/invoke-then-error-close.js -A test/built-ins/Promise/allSettled/invoke-then-error-reject.js -A test/built-ins/Promise/allSettled/invoke-then-get-error-close.js -A test/built-ins/Promise/allSettled/invoke-then-get-error-reject.js -A test/built-ins/Promise/allSettled/invoke-then.js -A test/built-ins/Promise/allSettled/is-function.js -A test/built-ins/Promise/allSettled/iter-arg-is-false-reject.js -A test/built-ins/Promise/allSettled/iter-arg-is-null-reject.js -A test/built-ins/Promise/allSettled/iter-arg-is-number-reject.js -A test/built-ins/Promise/allSettled/iter-arg-is-poisoned.js -A test/built-ins/Promise/allSettled/iter-arg-is-string-resolve.js -A test/built-ins/Promise/allSettled/iter-arg-is-symbol-reject.js -A test/built-ins/Promise/allSettled/iter-arg-is-true-reject.js -A test/built-ins/Promise/allSettled/iter-arg-is-undefined-reject.js -A test/built-ins/Promise/allSettled/iter-assigned-false-reject.js -A test/built-ins/Promise/allSettled/iter-assigned-null-reject.js -A test/built-ins/Promise/allSettled/iter-assigned-number-reject.js -A test/built-ins/Promise/allSettled/iter-assigned-string-reject.js -A test/built-ins/Promise/allSettled/iter-assigned-symbol-reject.js -A test/built-ins/Promise/allSettled/iter-assigned-true-reject.js -A test/built-ins/Promise/allSettled/iter-assigned-undefined-reject.js -A test/built-ins/Promise/allSettled/iter-next-err-reject.js -A test/built-ins/Promise/allSettled/iter-next-val-err-no-close.js -A test/built-ins/Promise/allSettled/iter-next-val-err-reject.js -A test/built-ins/Promise/allSettled/iter-returns-false-reject.js -A test/built-ins/Promise/allSettled/iter-returns-null-reject.js -A test/built-ins/Promise/allSettled/iter-returns-number-reject.js -A test/built-ins/Promise/allSettled/iter-returns-string-reject.js -A test/built-ins/Promise/allSettled/iter-returns-symbol-reject.js -A test/built-ins/Promise/allSettled/iter-returns-true-reject.js -A test/built-ins/Promise/allSettled/iter-returns-undefined-reject.js -A test/built-ins/Promise/allSettled/iter-step-err-no-close.js -A test/built-ins/Promise/allSettled/iter-step-err-reject.js -A test/built-ins/Promise/allSettled/length.js -A test/built-ins/Promise/allSettled/name.js -A test/built-ins/Promise/allSettled/new-reject-function.js -A test/built-ins/Promise/allSettled/new-resolve-function.js -A test/built-ins/Promise/allSettled/prop-desc.js -A test/built-ins/Promise/allSettled/reject-deferred.js -A test/built-ins/Promise/allSettled/reject-element-function-extensible.js -A test/built-ins/Promise/allSettled/reject-element-function-length.js -A test/built-ins/Promise/allSettled/reject-element-function-name.js -A test/built-ins/Promise/allSettled/reject-element-function-nonconstructor.js -A test/built-ins/Promise/allSettled/reject-element-function-prototype.js -A test/built-ins/Promise/allSettled/reject-ignored-deferred.js -A test/built-ins/Promise/allSettled/reject-ignored-immed.js -A test/built-ins/Promise/allSettled/reject-immed.js -A test/built-ins/Promise/allSettled/resolve-before-loop-exit-from-same.js -A test/built-ins/Promise/allSettled/resolve-before-loop-exit.js -A test/built-ins/Promise/allSettled/resolve-element-function-extensible.js -A test/built-ins/Promise/allSettled/resolve-element-function-length.js -A test/built-ins/Promise/allSettled/resolve-element-function-name.js -A test/built-ins/Promise/allSettled/resolve-element-function-nonconstructor.js -A test/built-ins/Promise/allSettled/resolve-element-function-prototype.js -A test/built-ins/Promise/allSettled/resolve-from-same-thenable.js -A test/built-ins/Promise/allSettled/resolve-non-thenable.js -A test/built-ins/Promise/allSettled/resolve-poisoned-then.js -A test/built-ins/Promise/allSettled/resolve-thenable.js -A test/built-ins/Promise/allSettled/resolved-all-fulfilled.js -A test/built-ins/Promise/allSettled/resolved-all-mixed.js -A test/built-ins/Promise/allSettled/resolved-all-rejected.js -A test/built-ins/Promise/allSettled/resolved-immed.js -A test/built-ins/Promise/allSettled/resolved-sequence-extra-ticks.js -A test/built-ins/Promise/allSettled/resolved-sequence-mixed.js -A test/built-ins/Promise/allSettled/resolved-sequence-with-rejections.js -A test/built-ins/Promise/allSettled/resolved-sequence.js -A test/built-ins/Promise/allSettled/resolved-then-catch-finally.js -A test/built-ins/Promise/allSettled/resolves-empty-array.js -A test/built-ins/Promise/allSettled/resolves-to-array.js -A test/built-ins/Promise/allSettled/returns-promise.js -A test/built-ins/Promise/allSettled/species-get-error.js -M test/built-ins/Promise/race/capability-executor-called-twice.js +M test/built-ins/Promise/all/resolve-element-function-name.js +M test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js +M test/built-ins/Promise/allSettled/reject-element-function-name.js +M test/built-ins/Promise/allSettled/resolve-element-function-name.js +M test/built-ins/Promise/executor-function-name.js M test/built-ins/Promise/race/invoke-resolve-get-error-close.js -A test/built-ins/Promise/race/invoke-resolve-get-once-multiple-calls.js -A test/built-ins/Promise/race/invoke-resolve-get-once-no-calls.js -M test/built-ins/Promise/race/species-get-error.js -A test/built-ins/Proxy/defineProperty/targetdesc-not-configurable-writable-desc-not-writable.js -A test/built-ins/Proxy/deleteProperty/targetdesc-is-configurable-target-is-not-extensible.js -A test/built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-is-not-configurable-not-writable-targetdesc-is-writable.js -A test/built-ins/Proxy/getPrototypeOf/instanceof-custom-return-accepted.js -A test/built-ins/Proxy/getPrototypeOf/instanceof-target-not-extensible-not-same-proto-throws.js -M test/built-ins/Reflect/ownKeys/return-empty-array.js -M test/built-ins/RegExp/property-escapes/generated/ASCII.js -M test/built-ins/RegExp/property-escapes/generated/ASCII_Hex_Digit.js -M test/built-ins/RegExp/property-escapes/generated/Alphabetic.js -M test/built-ins/RegExp/property-escapes/generated/Any.js -M test/built-ins/RegExp/property-escapes/generated/Assigned.js -M test/built-ins/RegExp/property-escapes/generated/Bidi_Control.js -M test/built-ins/RegExp/property-escapes/generated/Bidi_Mirrored.js -M test/built-ins/RegExp/property-escapes/generated/Case_Ignorable.js -M test/built-ins/RegExp/property-escapes/generated/Cased.js -M test/built-ins/RegExp/property-escapes/generated/Changes_When_Casefolded.js -M test/built-ins/RegExp/property-escapes/generated/Changes_When_Casemapped.js -M test/built-ins/RegExp/property-escapes/generated/Changes_When_Lowercased.js -M test/built-ins/RegExp/property-escapes/generated/Changes_When_NFKC_Casefolded.js -M test/built-ins/RegExp/property-escapes/generated/Changes_When_Titlecased.js -M test/built-ins/RegExp/property-escapes/generated/Changes_When_Uppercased.js -M test/built-ins/RegExp/property-escapes/generated/Dash.js -M test/built-ins/RegExp/property-escapes/generated/Default_Ignorable_Code_Point.js -M test/built-ins/RegExp/property-escapes/generated/Deprecated.js -M test/built-ins/RegExp/property-escapes/generated/Diacritic.js -M test/built-ins/RegExp/property-escapes/generated/Emoji.js -M test/built-ins/RegExp/property-escapes/generated/Emoji_Component.js -M test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier.js -M test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier_Base.js -M test/built-ins/RegExp/property-escapes/generated/Emoji_Presentation.js -M test/built-ins/RegExp/property-escapes/generated/Extended_Pictographic.js -M test/built-ins/RegExp/property-escapes/generated/Extender.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Close_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Connector_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Control.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Currency_Symbol.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Dash_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Enclosing_Mark.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Final_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Format.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Initial_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter_Number.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Line_Separator.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Mark.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Math_Symbol.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Symbol.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Number.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Open_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Paragraph_Separator.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Private_Use.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Separator.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Space_Separator.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Surrogate.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Titlecase_Letter.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Unassigned.js -M test/built-ins/RegExp/property-escapes/generated/General_Category_-_Uppercase_Letter.js -M test/built-ins/RegExp/property-escapes/generated/Grapheme_Base.js -M test/built-ins/RegExp/property-escapes/generated/Grapheme_Extend.js -M test/built-ins/RegExp/property-escapes/generated/Hex_Digit.js -M test/built-ins/RegExp/property-escapes/generated/IDS_Binary_Operator.js -M test/built-ins/RegExp/property-escapes/generated/IDS_Trinary_Operator.js -M test/built-ins/RegExp/property-escapes/generated/ID_Continue.js -M test/built-ins/RegExp/property-escapes/generated/ID_Start.js -M test/built-ins/RegExp/property-escapes/generated/Ideographic.js -M test/built-ins/RegExp/property-escapes/generated/Join_Control.js -M test/built-ins/RegExp/property-escapes/generated/Logical_Order_Exception.js -M test/built-ins/RegExp/property-escapes/generated/Lowercase.js -M test/built-ins/RegExp/property-escapes/generated/Math.js -M test/built-ins/RegExp/property-escapes/generated/Noncharacter_Code_Point.js -M test/built-ins/RegExp/property-escapes/generated/Pattern_Syntax.js -M test/built-ins/RegExp/property-escapes/generated/Pattern_White_Space.js -M test/built-ins/RegExp/property-escapes/generated/Quotation_Mark.js -M test/built-ins/RegExp/property-escapes/generated/Radical.js -M test/built-ins/RegExp/property-escapes/generated/Regional_Indicator.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Adlam.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Ahom.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Anatolian_Hieroglyphs.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Armenian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Avestan.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Balinese.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Bamum.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Bassa_Vah.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Batak.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Bengali.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Bhaiksuki.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Bopomofo.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Brahmi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Braille.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Buginese.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Buhid.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Canadian_Aboriginal.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Carian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Caucasian_Albanian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Chakma.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Cham.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Cherokee.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Common.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Coptic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Cuneiform.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Cypriot.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Cyrillic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Deseret.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Devanagari.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Dogra.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Duployan.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Egyptian_Hieroglyphs.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Elbasan.js -A test/built-ins/RegExp/property-escapes/generated/Script_-_Elymaic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Ethiopic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Georgian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Gothic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Grantha.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Greek.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Gujarati.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Gunjala_Gondi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Gurmukhi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Han.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Hangul.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Hanifi_Rohingya.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Hanunoo.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Hatran.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Hebrew.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Hiragana.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Imperial_Aramaic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Inherited.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Pahlavi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Parthian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Javanese.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Kaithi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Kannada.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Katakana.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Kayah_Li.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Kharoshthi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Khmer.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Khojki.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Khudawadi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Lao.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Latin.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Lepcha.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Limbu.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_A.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_B.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Lisu.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Lycian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Lydian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Mahajani.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Makasar.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Malayalam.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Mandaic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Manichaean.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Marchen.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Masaram_Gondi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Medefaidrin.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Meetei_Mayek.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Mende_Kikakui.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Cursive.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Hieroglyphs.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Miao.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Modi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Mongolian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Mro.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Multani.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Myanmar.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Nabataean.js -A test/built-ins/RegExp/property-escapes/generated/Script_-_Nandinagari.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_New_Tai_Lue.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Newa.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Nko.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Nushu.js -A test/built-ins/RegExp/property-escapes/generated/Script_-_Nyiakeng_Puachue_Hmong.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Ogham.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Ol_Chiki.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Hungarian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Italic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_North_Arabian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Permic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Persian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Sogdian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_South_Arabian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Turkic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Oriya.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Osage.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Osmanya.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Pahawh_Hmong.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Palmyrene.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Pau_Cin_Hau.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Phags_Pa.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Phoenician.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Psalter_Pahlavi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Rejang.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Runic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Samaritan.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Saurashtra.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Sharada.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Shavian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Siddham.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_SignWriting.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Sinhala.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Sogdian.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Sora_Sompeng.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Soyombo.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Sundanese.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Syloti_Nagri.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Syriac.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tagalog.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tagbanwa.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Le.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Tham.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Viet.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Takri.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tamil.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tangut.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Telugu.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Thaana.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Thai.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tibetan.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tifinagh.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Tirhuta.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Ugaritic.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Vai.js -A test/built-ins/RegExp/property-escapes/generated/Script_-_Wancho.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Warang_Citi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Yi.js -M test/built-ins/RegExp/property-escapes/generated/Script_-_Zanabazar_Square.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Adlam.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ahom.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Anatolian_Hieroglyphs.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Arabic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Armenian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Avestan.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Balinese.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bamum.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bassa_Vah.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Batak.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bengali.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bhaiksuki.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bopomofo.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Brahmi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Braille.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buginese.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buhid.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Canadian_Aboriginal.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Carian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Caucasian_Albanian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Chakma.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cham.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cherokee.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Common.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Coptic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cuneiform.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cypriot.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cyrillic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Deseret.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Devanagari.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Dogra.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Duployan.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Egyptian_Hieroglyphs.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elbasan.js -A test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elymaic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ethiopic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Georgian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Glagolitic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gothic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Grantha.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Greek.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gujarati.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gunjala_Gondi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gurmukhi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hangul.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanifi_Rohingya.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanunoo.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hatran.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hebrew.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Imperial_Aramaic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inherited.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Pahlavi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Parthian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Javanese.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kaithi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kannada.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Katakana.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kayah_Li.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kharoshthi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khmer.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khojki.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khudawadi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lao.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Latin.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lepcha.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Limbu.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_A.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_B.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lisu.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lycian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lydian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mahajani.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Makasar.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Malayalam.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mandaic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Manichaean.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Marchen.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Masaram_Gondi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Medefaidrin.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meetei_Mayek.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mende_Kikakui.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Cursive.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Hieroglyphs.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Miao.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Modi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mongolian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mro.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Multani.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Myanmar.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nabataean.js -A test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nandinagari.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_New_Tai_Lue.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Newa.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nko.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nushu.js -A test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nyiakeng_Puachue_Hmong.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ogham.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ol_Chiki.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Hungarian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Italic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_North_Arabian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Permic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Persian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Sogdian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_South_Arabian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Turkic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Oriya.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osage.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osmanya.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pahawh_Hmong.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Palmyrene.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pau_Cin_Hau.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phags_Pa.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phoenician.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Psalter_Pahlavi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Rejang.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Runic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Samaritan.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Saurashtra.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sharada.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Shavian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Siddham.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_SignWriting.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sinhala.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sogdian.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sora_Sompeng.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Soyombo.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sundanese.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syloti_Nagri.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syriac.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagalog.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagbanwa.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Le.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Tham.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Viet.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Takri.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tamil.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tangut.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Telugu.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thaana.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thai.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tibetan.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tifinagh.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tirhuta.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ugaritic.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Vai.js -A test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Wancho.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Warang_Citi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Yi.js -M test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Zanabazar_Square.js -M test/built-ins/RegExp/property-escapes/generated/Sentence_Terminal.js -M test/built-ins/RegExp/property-escapes/generated/Soft_Dotted.js -M test/built-ins/RegExp/property-escapes/generated/Terminal_Punctuation.js -M test/built-ins/RegExp/property-escapes/generated/Unified_Ideograph.js -M test/built-ins/RegExp/property-escapes/generated/Uppercase.js -M test/built-ins/RegExp/property-escapes/generated/Variation_Selector.js -M test/built-ins/RegExp/property-escapes/generated/White_Space.js -M test/built-ins/RegExp/property-escapes/generated/XID_Continue.js -M test/built-ins/RegExp/property-escapes/generated/XID_Start.js -A test/built-ins/RegExp/regexp-class-chars.js -A test/built-ins/TypedArray/stability.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dd-dot-dd-ep-sign-minus-dd-nsl-dd.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dd-dot-dd-ep-sign-minus-dds-nsl-dd.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dd-dot-dd-ep-sign-plus-dd-nsl-dd.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dd-dot-dd-ep-sign-plus-dds-nsl-dd.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dd-nsl-dd-one-of.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dds-dot-dd-nsl-dd-ep-dd.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dds-nsl-dd.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dot-dd-nsl-dd-ep.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dot-dd-nsl-dds-ep.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dot-dds-nsl-dd-ep.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-dot-dds-nsl-dds-ep.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-nzd-nsl-dd-one-of.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-nzd-nsl-dd.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-nzd-nsl-dds.js -M test/built-ins/parseFloat/tonumber-numeric-separator-literal-sign-plus-dds-nsl-dd.js -A test/intl402/BigInt/prototype/toLocaleString/builtin.js -A test/intl402/BigInt/prototype/toLocaleString/de-DE.js -A test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js -A test/intl402/BigInt/prototype/toLocaleString/en-US.js -A test/intl402/BigInt/prototype/toLocaleString/length.js -A test/intl402/BigInt/prototype/toLocaleString/name.js -A test/intl402/BigInt/prototype/toLocaleString/prop-desc.js -A test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js -A test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js -A test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js -A test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js -A test/intl402/DateTimeFormat/constructor-options-dateStyle-invalid.js -A test/intl402/DateTimeFormat/constructor-options-dateStyle-valid.js -A test/intl402/DateTimeFormat/constructor-options-order-timedate-style.js -A test/intl402/DateTimeFormat/constructor-options-throwing-getters-timedate-style.js -A test/intl402/DateTimeFormat/constructor-options-timeStyle-invalid.js -A test/intl402/DateTimeFormat/constructor-options-timeStyle-valid.js -A test/intl402/DateTimeFormat/prototype/format/timedatestyle-en.js -A test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js -A test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js -A test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js -A test/intl402/DateTimeFormat/prototype/formatRange/argument-tonumber-throws.js -A test/intl402/DateTimeFormat/prototype/formatRange/builtin.js -A test/intl402/DateTimeFormat/prototype/formatRange/date-is-infinity-throws.js -A test/intl402/DateTimeFormat/prototype/formatRange/date-is-nan-throws.js -A test/intl402/DateTimeFormat/prototype/formatRange/date-undefined-throws.js -A test/intl402/DateTimeFormat/prototype/formatRange/date-x-greater-than-y-throws.js -A test/intl402/DateTimeFormat/prototype/formatRange/en-US.js -A test/intl402/DateTimeFormat/prototype/formatRange/length.js -A test/intl402/DateTimeFormat/prototype/formatRange/name.js -A test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js -A test/intl402/DateTimeFormat/prototype/formatRange/this-bad-object.js -A test/intl402/DateTimeFormat/prototype/formatRange/this-is-not-object-throws.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-tonumber-throws.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-infinity-throws.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-nan-throws.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-undefined-throws.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-x-greater-than-y-throws.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/en-US.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/length.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/name.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/this-bad-object.js -A test/intl402/DateTimeFormat/prototype/formatRangeToParts/this-is-not-object-throws.js -M test/intl402/DateTimeFormat/prototype/formatToParts/length.js -M test/intl402/DateTimeFormat/prototype/formatToParts/name.js -A test/intl402/DateTimeFormat/prototype/resolvedOptions/order-style.js -A test/intl402/Intl/getCanonicalLocales/grandfathered.js -A test/intl402/Intl/getCanonicalLocales/non-iana-canon.js -D test/intl402/ListFormat/constructor/constructor/options-bad-combinations.js -M test/intl402/ListFormat/constructor/constructor/options-style-valid.js -M test/intl402/ListFormat/prototype/format/en-us-short.js -M test/intl402/ListFormat/prototype/formatToParts/en-us-short.js -M test/intl402/Locale/constructor-non-iana-canon.js -M test/intl402/Locale/likely-subtags-grandfathered.js -M test/intl402/Segmenter/constructor/constructor/options-granularity-valid.js -A test/language/comments/hashbang/escaped-bang-041.js -A test/language/comments/hashbang/escaped-bang-u0021.js -A test/language/comments/hashbang/escaped-bang-u21.js -A test/language/comments/hashbang/escaped-bang-x21.js -A test/language/comments/hashbang/escaped-hash-043.js -A test/language/comments/hashbang/escaped-hash-u0023.js -A test/language/comments/hashbang/escaped-hash-u23.js -A test/language/comments/hashbang/escaped-hash-x23.js -A test/language/comments/hashbang/escaped-hashbang.js -A test/language/comments/hashbang/eval-indirect.js -A test/language/comments/hashbang/eval.js -A test/language/comments/hashbang/function-body.js -A test/language/comments/hashbang/function-constructor.js -A test/language/comments/hashbang/line-terminator-carriage-return.js -A test/language/comments/hashbang/line-terminator-line-separator.js -A test/language/comments/hashbang/line-terminator-paragraph-separator.js -A test/language/comments/hashbang/module.js -A test/language/comments/hashbang/multi-line-comment.js -A test/language/comments/hashbang/no-line-separator.js -A test/language/comments/hashbang/not-empty.js -A test/language/comments/hashbang/preceding-directive-prologue-sc.js -A test/language/comments/hashbang/preceding-directive-prologue.js -A test/language/comments/hashbang/preceding-empty-statement.js -A test/language/comments/hashbang/preceding-hashbang.js -A test/language/comments/hashbang/preceding-line-comment.js -A test/language/comments/hashbang/preceding-multi-line-comment.js -A test/language/comments/hashbang/preceding-whitespace.js -A test/language/comments/hashbang/statement-block.js -A test/language/comments/hashbang/use-strict.js -M test/language/directive-prologue/10.1.1-2gs.js -M test/language/directive-prologue/10.1.1-5gs.js -M test/language/directive-prologue/10.1.1-8gs.js -M test/language/directive-prologue/14.1-4gs.js -M test/language/directive-prologue/14.1-5gs.js -M test/language/directive-prologue/func-decl-inside-func-decl-parse.js -M test/language/directive-prologue/func-decl-no-semi-parse.js -M test/language/directive-prologue/func-decl-parse.js -M test/language/directive-prologue/func-expr-inside-func-decl-parse.js -M test/language/directive-prologue/func-expr-no-semi-parse.js -M test/language/directive-prologue/func-expr-parse.js -M test/language/expressions/class/elements/after-same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/after-same-line-gen-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-gen-rs-field-identifier.js -M test/language/expressions/class/elements/after-same-line-gen-rs-private-getter-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-private-getter.js -M test/language/expressions/class/elements/after-same-line-gen-rs-private-method-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-private-method.js -M test/language/expressions/class/elements/after-same-line-gen-rs-private-setter-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-private-setter.js -M test/language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-gen-rs-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-gen-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/after-same-line-method-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-method-rs-field-identifier.js -M test/language/expressions/class/elements/after-same-line-method-rs-private-getter-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-private-getter.js -M test/language/expressions/class/elements/after-same-line-method-rs-private-method-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-private-method.js -M test/language/expressions/class/elements/after-same-line-method-rs-private-setter-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-private-setter.js -M test/language/expressions/class/elements/after-same-line-method-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-method-rs-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-method-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-field-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-private-getter-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-private-getter.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-private-method-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-private-method.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-private-setter-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-private-setter.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-field-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-private-getter-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-private-getter.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-private-method-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-private-method.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-private-setter-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-private-setter.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-field-identifier.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-private-getter-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-private-getter.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-private-method-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-private-method.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-private-setter-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-private-setter.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-gen-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-field-identifier.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-private-getter-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-private-getter.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-private-method-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-private-method.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-private-setter-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-private-setter.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/after-same-line-static-method-rs-static-privatename-identifier.js -A test/language/expressions/class/elements/fields-asi-same-line-1.js -A test/language/expressions/class/elements/fields-asi-same-line-2.js -M test/language/expressions/class/elements/multiple-definitions-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/multiple-definitions-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/multiple-definitions-rs-field-identifier.js -M test/language/expressions/class/elements/multiple-definitions-rs-private-getter-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-private-getter.js -M test/language/expressions/class/elements/multiple-definitions-rs-private-method-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-private-method.js -M test/language/expressions/class/elements/multiple-definitions-rs-private-setter-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-private-setter.js -M test/language/expressions/class/elements/multiple-definitions-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/multiple-definitions-rs-privatename-identifier.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/multiple-definitions-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/multiple-stacked-definitions-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-field-identifier.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-private-getter-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-private-getter.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-private-method-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-private-method.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-private-setter-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-private-setter.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-privatename-identifier.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/new-no-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-field-identifier.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-private-getter-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-private-getter.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-private-method-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-private-method.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-private-setter-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-private-setter.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-privatename-identifier.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/new-no-sc-line-method-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-field-identifier.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-private-getter-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-private-getter.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-private-method-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-private-method.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-private-setter-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-private-setter.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/new-sc-line-gen-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/new-sc-line-method-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/new-sc-line-method-rs-field-identifier.js -M test/language/expressions/class/elements/new-sc-line-method-rs-private-getter-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-private-getter.js -M test/language/expressions/class/elements/new-sc-line-method-rs-private-method-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-private-method.js -M test/language/expressions/class/elements/new-sc-line-method-rs-private-setter-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-private-setter.js -M test/language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/new-sc-line-method-rs-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/new-sc-line-method-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-supercall-1.js -M test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-supercall-2.js -M test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-supercall.js -M test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-supercall-1.js -M test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-supercall-2.js -M test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-supercall.js -A test/language/expressions/class/elements/private-field-as-arrow-function.js -A test/language/expressions/class/elements/private-field-as-async-arrow-function.js -A test/language/expressions/class/elements/private-field-as-async-function.js -A test/language/expressions/class/elements/private-field-as-function.js -M test/language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js -M test/language/expressions/class/elements/regular-definitions-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/regular-definitions-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/regular-definitions-rs-field-identifier.js -M test/language/expressions/class/elements/regular-definitions-rs-private-getter-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-private-getter.js -M test/language/expressions/class/elements/regular-definitions-rs-private-method-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-private-method.js -M test/language/expressions/class/elements/regular-definitions-rs-private-setter-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-private-setter.js -M test/language/expressions/class/elements/regular-definitions-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/regular-definitions-rs-privatename-identifier.js -M test/language/expressions/class/elements/regular-definitions-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/regular-definitions-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/regular-definitions-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/regular-definitions-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/regular-definitions-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/regular-definitions-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/regular-definitions-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/regular-definitions-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/regular-definitions-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/regular-definitions-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/same-line-async-gen-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/same-line-async-gen-rs-field-identifier.js -M test/language/expressions/class/elements/same-line-async-gen-rs-private-getter-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-private-getter.js -M test/language/expressions/class/elements/same-line-async-gen-rs-private-method-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-private-method.js -M test/language/expressions/class/elements/same-line-async-gen-rs-private-setter-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-private-setter.js -M test/language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-async-gen-rs-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-async-gen-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/same-line-async-method-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/same-line-async-method-rs-field-identifier.js -M test/language/expressions/class/elements/same-line-async-method-rs-private-getter-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-private-getter.js -M test/language/expressions/class/elements/same-line-async-method-rs-private-method-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-private-method.js -M test/language/expressions/class/elements/same-line-async-method-rs-private-setter-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-private-setter.js -M test/language/expressions/class/elements/same-line-async-method-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-async-method-rs-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-async-method-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/same-line-gen-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/same-line-gen-rs-field-identifier.js -M test/language/expressions/class/elements/same-line-gen-rs-private-getter-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-private-getter.js -M test/language/expressions/class/elements/same-line-gen-rs-private-method-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-private-method.js -M test/language/expressions/class/elements/same-line-gen-rs-private-setter-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-private-setter.js -M test/language/expressions/class/elements/same-line-gen-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-gen-rs-privatename-identifier.js -M test/language/expressions/class/elements/same-line-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-gen-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/same-line-gen-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/same-line-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/same-line-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-gen-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-gen-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/same-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/same-line-method-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/same-line-method-rs-field-identifier.js -M test/language/expressions/class/elements/same-line-method-rs-private-getter-alt.js -M test/language/expressions/class/elements/same-line-method-rs-private-getter.js -M test/language/expressions/class/elements/same-line-method-rs-private-method-alt.js -M test/language/expressions/class/elements/same-line-method-rs-private-method.js -M test/language/expressions/class/elements/same-line-method-rs-private-setter-alt.js -M test/language/expressions/class/elements/same-line-method-rs-private-setter.js -M test/language/expressions/class/elements/same-line-method-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-method-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-method-rs-privatename-identifier.js -M test/language/expressions/class/elements/same-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-method-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-method-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/same-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/same-line-method-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/same-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/same-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/same-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/same-line-method-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/same-line-method-rs-static-privatename-identifier.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-field-identifier-invalid-ues-error.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwj-error.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwnj-error.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-fields-same-line-error.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-array-literal.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-function-expression.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-obj-literal.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js -A test/language/expressions/class/elements/syntax/early-errors/grammar-private-field-super-access.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-privatename-error.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-ues.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwj-error.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwnj-error.js -M test/language/expressions/class/elements/syntax/early-errors/grammar-privatenames-same-line-error.js -M test/language/expressions/class/elements/syntax/valid/grammar-field-classelementname-initializer-alt.js -M test/language/expressions/class/elements/syntax/valid/grammar-field-classelementname-initializer.js -M test/language/expressions/class/elements/syntax/valid/grammar-field-identifier-alt.js -M test/language/expressions/class/elements/syntax/valid/grammar-field-identifier.js -M test/language/expressions/class/elements/syntax/valid/grammar-fields-multi-line.js -M test/language/expressions/class/elements/syntax/valid/grammar-privatename-classelementname-initializer-alt.js -M test/language/expressions/class/elements/syntax/valid/grammar-privatename-classelementname-initializer.js -M test/language/expressions/class/elements/syntax/valid/grammar-privatename-identifier.js -M test/language/expressions/class/elements/syntax/valid/grammar-privatename-no-initializer-with-method.js -M test/language/expressions/class/elements/syntax/valid/grammar-privatenames-multi-line.js -M test/language/expressions/class/elements/wrapped-in-sc-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-field-identifier-initializer.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-field-identifier.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-private-getter-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-private-getter.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-private-method-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-private-method.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-private-setter-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-private-setter.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-privatename-identifier.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-async-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-async-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-async-method-privatename-identifier.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-generator-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-generator-method-privatename-identifier.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-method-privatename-identifier-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-method-privatename-identifier.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-privatename-identifier-alt-by-classname.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-privatename-identifier-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-privatename-identifier-by-classname.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-privatename-identifier-initializer-alt.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-privatename-identifier-initializer.js -M test/language/expressions/class/elements/wrapped-in-sc-rs-static-privatename-identifier.js -M test/language/expressions/delete/white-space-line-terminator-between-delete-unaryexpression-allowed.js -M test/language/expressions/import.meta/syntax/goal-script.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-array-destructuring-expr.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-array-rest-destructuring-expr.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-assignment-expr.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-for-await-of-loop.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-for-in-loop.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-for-of-loop.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-object-destructuring-expr.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-object-rest-destructuring-expr.js -M test/language/expressions/import.meta/syntax/invalid-assignment-target-update-expr.js -A test/language/expressions/object/prop-def-invalid-star-prefix.js -M test/language/expressions/postfix-decrement/arguments-nostrict.js -M test/language/expressions/postfix-decrement/arguments.js -M test/language/expressions/postfix-decrement/bigint.js -M test/language/expressions/postfix-decrement/eval-nostrict.js -M test/language/expressions/postfix-decrement/eval.js -M test/language/expressions/postfix-increment/arguments-nostrict.js -M test/language/expressions/postfix-increment/arguments.js -M test/language/expressions/postfix-increment/bigint.js -M test/language/expressions/postfix-increment/eval-nostrict.js -M test/language/expressions/postfix-increment/eval.js -M test/language/expressions/prefix-decrement/arguments-nostrict.js -M test/language/expressions/prefix-decrement/arguments.js -M test/language/expressions/prefix-decrement/bigint.js -M test/language/expressions/prefix-decrement/eval-nostrict.js -M test/language/expressions/prefix-decrement/eval.js -M test/language/expressions/prefix-increment/arguments-nostrict.js -M test/language/expressions/prefix-increment/arguments.js -M test/language/expressions/prefix-increment/bigint.js -M test/language/expressions/prefix-increment/eval-nostrict.js -M test/language/expressions/prefix-increment/eval.js -M test/language/expressions/subtraction/S11.6.2_A4_T8.js -M test/language/expressions/tagged-template/template-object-template-map.js -D test/language/literals/numeric/7.8.3-2-s.js -R061 test/language/literals/numeric/7.8.3-6-s.js test/language/literals/numeric/legacy-octal-integery-000-strict -R061 test/language/literals/numeric/7.8.3-7-s.js test/language/literals/numeric/legacy-octal-integery-005-strict -R061 test/language/literals/numeric/7.8.3-3-s.js test/language/literals/numeric/legacy-octal-integery-01-strict -R061 test/language/literals/numeric/7.8.3-1-s.js test/language/literals/numeric/legacy-octal-integery-010-strict -R061 test/language/literals/numeric/7.8.3-4-s.js test/language/literals/numeric/legacy-octal-integery-06-strict -R061 test/language/literals/numeric/7.8.3-5-s.js test/language/literals/numeric/legacy-octal-integery-07-strict -D test/language/literals/regexp/S7.8.5_A3.1_T7.js -D test/language/literals/regexp/S7.8.5_A3.1_T8.js -D test/language/literals/regexp/S7.8.5_A3.1_T9.js -M test/language/module-code/instn-iee-bndng-cls.js -M test/language/module-code/instn-iee-bndng-cls_FIXTURE.js -M test/language/module-code/instn-iee-bndng-const.js -M test/language/module-code/instn-iee-bndng-const_FIXTURE.js -M test/language/module-code/instn-iee-bndng-fun.js -M test/language/module-code/instn-iee-bndng-fun_FIXTURE.js -M test/language/module-code/instn-iee-bndng-gen.js -M test/language/module-code/instn-iee-bndng-gen_FIXTURE.js -M test/language/module-code/instn-iee-bndng-let.js -M test/language/module-code/instn-iee-bndng-let_FIXTURE.js -M test/language/module-code/instn-iee-bndng-var.js -M test/language/module-code/instn-iee-bndng-var_FIXTURE.js -A test/language/statements/async-generator/return-undefined-implicit-and-explicit.js -A test/language/statements/async-generator/yield-return-then-getter-ticks.js -A test/language/statements/async-generator/yield-star-async-from-sync-iterator-inaccessible.js -A test/language/statements/async-generator/yield-star-normal-notdone-iter-value-throws.js -A test/language/statements/async-generator/yield-star-return-notdone-iter-value-throws.js -A test/language/statements/async-generator/yield-star-return-then-getter-ticks.js -A test/language/statements/async-generator/yield-star-throw-notdone-iter-value-throws.js -M test/language/statements/block/12.1-1.js -M test/language/statements/block/12.1-2.js -M test/language/statements/block/12.1-3.js -M test/language/statements/block/12.1-4.js -M test/language/statements/block/12.1-5.js -M test/language/statements/block/12.1-6.js -M test/language/statements/block/12.1-7.js -D test/language/statements/break/S12.8_A2.js -A test/language/statements/break/line-terminators.js -M test/language/statements/class/elements/after-same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/after-same-line-gen-rs-field-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-gen-rs-field-identifier.js -M test/language/statements/class/elements/after-same-line-gen-rs-private-getter-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-private-getter.js -M test/language/statements/class/elements/after-same-line-gen-rs-private-method-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-private-method.js -M test/language/statements/class/elements/after-same-line-gen-rs-private-setter-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-private-setter.js -M test/language/statements/class/elements/after-same-line-gen-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-gen-rs-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-gen-rs-static-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/after-same-line-method-rs-field-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-method-rs-field-identifier.js -M test/language/statements/class/elements/after-same-line-method-rs-private-getter-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-private-getter.js -M test/language/statements/class/elements/after-same-line-method-rs-private-method-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-private-method.js -M test/language/statements/class/elements/after-same-line-method-rs-private-setter-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-private-setter.js -M test/language/statements/class/elements/after-same-line-method-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-method-rs-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-method-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/after-same-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-method-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-method-rs-static-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-field-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-field-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-private-getter-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-private-getter.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-private-method-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-private-method.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-private-setter-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-private-setter.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-async-gen-rs-static-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-field-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-field-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-private-getter-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-private-getter.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-private-method-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-private-method.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-private-setter-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-private-setter.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-async-method-rs-static-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-field-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-field-identifier.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-private-getter-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-private-getter.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-private-method-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-private-method.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-private-setter-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-private-setter.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-gen-rs-static-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/after-same-line-static-method-rs-field-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-method-rs-field-identifier.js -M test/language/statements/class/elements/after-same-line-static-method-rs-private-getter-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-private-getter.js -M test/language/statements/class/elements/after-same-line-static-method-rs-private-method-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-private-method.js -M test/language/statements/class/elements/after-same-line-static-method-rs-private-setter-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-private-setter.js -M test/language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-method-rs-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/after-same-line-static-method-rs-static-privatename-identifier.js -A test/language/statements/class/elements/fields-asi-same-line-1.js -A test/language/statements/class/elements/fields-asi-same-line-2.js -M test/language/statements/class/elements/multiple-definitions-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/multiple-definitions-rs-field-identifier-initializer.js -M test/language/statements/class/elements/multiple-definitions-rs-field-identifier.js -M test/language/statements/class/elements/multiple-definitions-rs-private-getter-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-private-getter.js -M test/language/statements/class/elements/multiple-definitions-rs-private-method-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-private-method.js -M test/language/statements/class/elements/multiple-definitions-rs-private-setter-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-private-setter.js -M test/language/statements/class/elements/multiple-definitions-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/multiple-definitions-rs-privatename-identifier.js -M test/language/statements/class/elements/multiple-definitions-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-definitions-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-definitions-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-definitions-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-definitions-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/multiple-definitions-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/multiple-definitions-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/multiple-definitions-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/multiple-definitions-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/multiple-definitions-rs-static-privatename-identifier.js -M test/language/statements/class/elements/multiple-stacked-definitions-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-field-identifier-initializer.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-field-identifier.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-private-getter-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-private-getter.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-private-method-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-private-method.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-private-setter-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-private-setter.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-privatename-identifier.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/multiple-stacked-definitions-rs-static-privatename-identifier.js -M test/language/statements/class/elements/new-no-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-field-identifier-initializer.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-field-identifier.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-private-getter-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-private-getter.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-private-method-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-private-method.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-private-setter-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-private-setter.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-privatename-identifier.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/new-no-sc-line-method-rs-static-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/new-sc-line-gen-rs-field-identifier-initializer.js -M test/language/statements/class/elements/new-sc-line-gen-rs-field-identifier.js -M test/language/statements/class/elements/new-sc-line-gen-rs-private-getter-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-private-getter.js -M test/language/statements/class/elements/new-sc-line-gen-rs-private-method-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-private-method.js -M test/language/statements/class/elements/new-sc-line-gen-rs-private-setter-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-private-setter.js -M test/language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/new-sc-line-gen-rs-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/new-sc-line-gen-rs-static-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/new-sc-line-method-rs-field-identifier-initializer.js -M test/language/statements/class/elements/new-sc-line-method-rs-field-identifier.js -M test/language/statements/class/elements/new-sc-line-method-rs-private-getter-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-private-getter.js -M test/language/statements/class/elements/new-sc-line-method-rs-private-method-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-private-method.js -M test/language/statements/class/elements/new-sc-line-method-rs-private-setter-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-private-setter.js -M test/language/statements/class/elements/new-sc-line-method-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/new-sc-line-method-rs-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/new-sc-line-method-rs-static-privatename-identifier.js -M test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-supercall-1.js -M test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-supercall-2.js -M test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-supercall.js -M test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-supercall-1.js -M test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-supercall-2.js -M test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-supercall.js -A test/language/statements/class/elements/private-field-as-arrow-function.js -A test/language/statements/class/elements/private-field-as-async-arrow-function.js -A test/language/statements/class/elements/private-field-as-async-function.js -A test/language/statements/class/elements/private-field-as-function.js -A test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js -A test/language/statements/class/elements/private-getter-brand-check-super-class.js -A test/language/statements/class/elements/private-getter-brand-check.js -A test/language/statements/class/elements/private-method-brand-check-multiple-evaluations-of-class.js -A test/language/statements/class/elements/private-method-brand-check-super-class.js -A test/language/statements/class/elements/private-method-brand-check.js -M test/language/statements/class/elements/private-methods/prod-private-method-initialize-order.js -A test/language/statements/class/elements/private-setter-brand-check-multiple-evaluations-of-class.js -A test/language/statements/class/elements/private-setter-brand-check-super-class.js -A test/language/statements/class/elements/private-setter-brand-check.js -A test/language/statements/class/elements/privatefield-on-proxy.js -A test/language/statements/class/elements/privategetter-on-proxy.js -A test/language/statements/class/elements/privatemethods-on-proxy.js -M test/language/statements/class/elements/regular-definitions-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/regular-definitions-rs-field-identifier-initializer.js -M test/language/statements/class/elements/regular-definitions-rs-field-identifier.js -M test/language/statements/class/elements/regular-definitions-rs-private-getter-alt.js -M test/language/statements/class/elements/regular-definitions-rs-private-getter.js -M test/language/statements/class/elements/regular-definitions-rs-private-method-alt.js -M test/language/statements/class/elements/regular-definitions-rs-private-method.js -M test/language/statements/class/elements/regular-definitions-rs-private-setter-alt.js -M test/language/statements/class/elements/regular-definitions-rs-private-setter.js -M test/language/statements/class/elements/regular-definitions-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/regular-definitions-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/regular-definitions-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/regular-definitions-rs-privatename-identifier.js -M test/language/statements/class/elements/regular-definitions-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/regular-definitions-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/regular-definitions-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/regular-definitions-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/regular-definitions-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/regular-definitions-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/regular-definitions-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/regular-definitions-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/regular-definitions-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/regular-definitions-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/regular-definitions-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/regular-definitions-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/regular-definitions-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/regular-definitions-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/regular-definitions-rs-static-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/same-line-async-gen-rs-field-identifier-initializer.js -M test/language/statements/class/elements/same-line-async-gen-rs-field-identifier.js -M test/language/statements/class/elements/same-line-async-gen-rs-private-getter-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-private-getter.js -M test/language/statements/class/elements/same-line-async-gen-rs-private-method-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-private-method.js -M test/language/statements/class/elements/same-line-async-gen-rs-private-setter-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-private-setter.js -M test/language/statements/class/elements/same-line-async-gen-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-async-gen-rs-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-async-gen-rs-static-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/same-line-async-method-rs-field-identifier-initializer.js -M test/language/statements/class/elements/same-line-async-method-rs-field-identifier.js -M test/language/statements/class/elements/same-line-async-method-rs-private-getter-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-private-getter.js -M test/language/statements/class/elements/same-line-async-method-rs-private-method-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-private-method.js -M test/language/statements/class/elements/same-line-async-method-rs-private-setter-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-private-setter.js -M test/language/statements/class/elements/same-line-async-method-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-async-method-rs-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-method-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-async-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/same-line-async-method-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/same-line-async-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/same-line-async-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-async-method-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-async-method-rs-static-privatename-identifier.js -M test/language/statements/class/elements/same-line-gen-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/same-line-gen-rs-field-identifier-initializer.js -M test/language/statements/class/elements/same-line-gen-rs-field-identifier.js -M test/language/statements/class/elements/same-line-gen-rs-private-getter-alt.js -M test/language/statements/class/elements/same-line-gen-rs-private-getter.js -M test/language/statements/class/elements/same-line-gen-rs-private-method-alt.js -M test/language/statements/class/elements/same-line-gen-rs-private-method.js -M test/language/statements/class/elements/same-line-gen-rs-private-setter-alt.js -M test/language/statements/class/elements/same-line-gen-rs-private-setter.js -M test/language/statements/class/elements/same-line-gen-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-gen-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-gen-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-gen-rs-privatename-identifier.js -M test/language/statements/class/elements/same-line-gen-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-gen-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-gen-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-gen-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-gen-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-gen-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-gen-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-gen-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-gen-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/same-line-gen-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-gen-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/same-line-gen-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/same-line-gen-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-gen-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-gen-rs-static-privatename-identifier.js -M test/language/statements/class/elements/same-line-method-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/same-line-method-rs-field-identifier-initializer.js -M test/language/statements/class/elements/same-line-method-rs-field-identifier.js -M test/language/statements/class/elements/same-line-method-rs-private-getter-alt.js -M test/language/statements/class/elements/same-line-method-rs-private-getter.js -M test/language/statements/class/elements/same-line-method-rs-private-method-alt.js -M test/language/statements/class/elements/same-line-method-rs-private-method.js -M test/language/statements/class/elements/same-line-method-rs-private-setter-alt.js -M test/language/statements/class/elements/same-line-method-rs-private-setter.js -M test/language/statements/class/elements/same-line-method-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-method-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-method-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-method-rs-privatename-identifier.js -M test/language/statements/class/elements/same-line-method-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-method-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-method-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-method-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-method-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-method-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-method-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-method-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/same-line-method-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/same-line-method-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/same-line-method-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/same-line-method-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/same-line-method-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/same-line-method-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/same-line-method-rs-static-privatename-identifier.js -M test/language/statements/class/elements/syntax/early-errors/grammar-field-identifier-invalid-ues-error.js -M test/language/statements/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwj-error.js -M test/language/statements/class/elements/syntax/early-errors/grammar-field-identifier-invalid-zwnj-error.js -M test/language/statements/class/elements/syntax/early-errors/grammar-fields-same-line-error.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-array-literal.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-function-expression.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-obj-literal.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js -A test/language/statements/class/elements/syntax/early-errors/grammar-private-field-super-access.js -M test/language/statements/class/elements/syntax/early-errors/grammar-privatename-error.js -M test/language/statements/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-ues.js -M test/language/statements/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwj-error.js -M test/language/statements/class/elements/syntax/early-errors/grammar-privatename-identifier-invalid-zwnj-error.js -M test/language/statements/class/elements/syntax/early-errors/grammar-privatenames-same-line-error.js -M test/language/statements/class/elements/syntax/valid/grammar-field-classelementname-initializer-alt.js -M test/language/statements/class/elements/syntax/valid/grammar-field-classelementname-initializer.js -M test/language/statements/class/elements/syntax/valid/grammar-field-identifier-alt.js -M test/language/statements/class/elements/syntax/valid/grammar-field-identifier.js -M test/language/statements/class/elements/syntax/valid/grammar-fields-multi-line.js -M test/language/statements/class/elements/syntax/valid/grammar-privatename-classelementname-initializer-alt.js -M test/language/statements/class/elements/syntax/valid/grammar-privatename-classelementname-initializer.js -M test/language/statements/class/elements/syntax/valid/grammar-privatename-identifier.js -M test/language/statements/class/elements/syntax/valid/grammar-privatename-no-initializer-with-method.js -M test/language/statements/class/elements/syntax/valid/grammar-privatenames-multi-line.js -M test/language/statements/class/elements/wrapped-in-sc-grammar-privatename-identifier-semantics-stringvalue.js -M test/language/statements/class/elements/wrapped-in-sc-rs-field-identifier-initializer.js -M test/language/statements/class/elements/wrapped-in-sc-rs-field-identifier.js -M test/language/statements/class/elements/wrapped-in-sc-rs-private-getter-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-private-getter.js -M test/language/statements/class/elements/wrapped-in-sc-rs-private-method-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-private-method.js -M test/language/statements/class/elements/wrapped-in-sc-rs-private-setter-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-private-setter.js -M test/language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier-initializer.js -M test/language/statements/class/elements/wrapped-in-sc-rs-privatename-identifier.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-async-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-async-generator-method-privatename-identifier.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-async-method-privatename-identifier-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-async-method-privatename-identifier.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-generator-method-privatename-identifier-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-generator-method-privatename-identifier.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-method-privatename-identifier-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-method-privatename-identifier.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-privatename-identifier-alt-by-classname.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-privatename-identifier-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-privatename-identifier-by-classname.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-privatename-identifier-initializer-alt-by-classname.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-privatename-identifier-initializer-alt.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-privatename-identifier-initializer.js -M test/language/statements/class/elements/wrapped-in-sc-rs-static-privatename-identifier.js -D test/language/statements/continue/S12.7_A2.js -A test/language/statements/continue/line-terminators.js -M test/language/statements/do-while/S12.6.1_A4_T5.js -D test/language/statements/for/S12.6.3_A9.1.js -D test/language/statements/for/S12.6.3_A9.js -A test/language/statements/for/head-init-expr-check-empty-inc-empty-completion.js -A test/language/statements/for/head-init-expr-check-empty-inc-empty-syntax.js -A test/language/statements/for/head-init-var-check-empty-inc-empty-completion.js -A test/language/statements/for/head-init-var-check-empty-inc-empty-syntax.js -A test/language/statements/for-await-of/async-from-sync-iterator-continuation-abrupt-completion-get-constructor.js -A test/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup-two.js -A test/language/statements/for-await-of/ticks-with-async-iter-resolved-promise-and-constructor-lookup.js -A test/language/statements/for-await-of/ticks-with-sync-iter-resolved-promise-and-constructor-lookup.js -D test/language/statements/if/S12.5_A7.js -A test/language/statements/if/cptn-empty-statement.js -A test/language/statements/if/empty-statement.js -D test/language/statements/return/S12.9_A2.js -A test/language/statements/return/line-terminators.js -M test/language/statements/while/S12.6.2_A4_T5.js -D test/language/statements/with/12.10.1-1-s.js -D test/language/statements/with/12.10.1-15-s.js -D test/language/statements/with/12.10.1-16-s.js -D test/language/statements/with/12.10.1-2-s.js -D test/language/statements/with/12.10.1-3-s.js -D test/language/statements/with/12.10.1-7-s.js -D test/language/statements/with/12.10.1-9-s.js -R052 test/language/statements/with/12.10.1-11-s.js test/language/statements/with/stict-script.js -A test/language/statements/with/strict-fn-decl-nested-1.js -A test/language/statements/with/strict-fn-decl-nested-2.js -A test/language/statements/with/strict-fn-decl.js -A test/language/statements/with/strict-fn-expr.js -R050 test/language/statements/with/12.10.1-14-s.js test/language/statements/with/strict-fn-method.js -D test/language/white-space/S7.2_A1.1_T1.js -D test/language/white-space/S7.2_A1.2_T1.js -D test/language/white-space/S7.2_A1.3_T1.js -D test/language/white-space/S7.2_A1.4_T1.js -D test/language/white-space/S7.2_A1.5_T1.js -R061 test/language/white-space/S7.2_A1.3_T2.js test/language/white-space/between-form-feed.js -R056 test/language/white-space/S7.2_A1.1_T2.js test/language/white-space/between-horizontal-tab.js -R052 test/language/white-space/S7.2_A1.5_T2.js test/language/white-space/between-nbsp.js -R051 test/language/white-space/S7.2_A1.4_T2.js test/language/white-space/between-space.js -R061 test/language/white-space/S7.2_A1.2_T2.js test/language/white-space/between-vertical-tab.js -R100 test/language/white-space/S7.2_A4.3_T1.js test/language/white-space/comment-multi-form-feed.js -R100 test/language/white-space/S7.2_A4.1_T1.js test/language/white-space/comment-multi-horizontal-tab.js -R100 test/language/white-space/S7.2_A4.5_T1.js test/language/white-space/comment-multi-nbsp.js -R100 test/language/white-space/S7.2_A4.4_T1.js test/language/white-space/comment-multi-space.js -R100 test/language/white-space/S7.2_A4.2_T1.js test/language/white-space/comment-multi-vertical-tab.js -R100 test/language/white-space/S7.2_A3.3_T1.js test/language/white-space/comment-single-form-feed.js -R100 test/language/white-space/S7.2_A3.1_T1.js test/language/white-space/comment-single-horizontal-tab.js -R100 test/language/white-space/S7.2_A3.5_T1.js test/language/white-space/comment-single-nbsp.js -R100 test/language/white-space/S7.2_A3.4_T1.js test/language/white-space/comment-single-space.js -R100 test/language/white-space/S7.2_A3.2_T1.js test/language/white-space/comment-single-vertical-tab.js -R100 test/language/white-space/S7.2_A2.3_T1.js test/language/white-space/string-form-feed.js -R100 test/language/white-space/S7.2_A2.1_T1.js test/language/white-space/string-horizontal-tab.js -R100 test/language/white-space/S7.2_A2.5_T1.js test/language/white-space/string-nbsp.js -R100 test/language/white-space/S7.2_A2.4_T1.js test/language/white-space/string-space.js -R100 test/language/white-space/S7.2_A2.2_T1.js test/language/white-space/string-vertical-tab.js \ No newline at end of file +M test/built-ins/Promise/reject-function-name.js +M test/built-ins/Promise/resolve-function-name.js +M test/built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js +A test/built-ins/WeakRef/constructor.js +A test/built-ins/WeakRef/instance-extensible.js +A test/built-ins/WeakRef/length.js +A test/built-ins/WeakRef/name.js +A test/built-ins/WeakRef/newtarget-prototype-is-not-object.js +A test/built-ins/WeakRef/prop-desc.js +A test/built-ins/WeakRef/proto-from-ctor-realm.js +A test/built-ins/WeakRef/proto.js +A test/built-ins/WeakRef/prototype/Symbol.toStringTag.js +A test/built-ins/WeakRef/prototype/constructor.js +A test/built-ins/WeakRef/prototype/deref/custom-this.js +A test/built-ins/WeakRef/prototype/deref/gc-cleanup-not-prevented-with-wr-deref.js +A test/built-ins/WeakRef/prototype/deref/length.js +A test/built-ins/WeakRef/prototype/deref/name.js +A test/built-ins/WeakRef/prototype/deref/prop-desc.js +A test/built-ins/WeakRef/prototype/deref/return-target.js +A test/built-ins/WeakRef/prototype/deref/this-does-not-have-internal-target-throws.js +A test/built-ins/WeakRef/prototype/deref/this-not-object-throws.js +A test/built-ins/WeakRef/prototype/prop-desc.js +A test/built-ins/WeakRef/prototype/proto.js +A test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js +A test/built-ins/WeakRef/prototype-from-newtarget-custom.js +A test/built-ins/WeakRef/prototype-from-newtarget.js +A test/built-ins/WeakRef/returns-new-object-from-constructor.js +A test/built-ins/WeakRef/target-not-object-throws.js +A test/built-ins/WeakRef/undefined-newtarget-throws.js +M test/intl402/BigInt/prototype/toLocaleString/builtin.js +M test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js +M test/intl402/BigInt/prototype/toLocaleString/length.js +M test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js +M test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js +M test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js +M test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js +D test/intl402/DateTimeFormat/constructor-options-order-quarter.js +D test/intl402/DateTimeFormat/constructor-options-quarter-invalid.js +D test/intl402/DateTimeFormat/constructor-options-quarter-valid.js +A test/intl402/DateTimeFormat/prototype/format/dayPeriod-long-en.js +A test/intl402/DateTimeFormat/prototype/format/dayPeriod-narrow-en.js +A test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js +A test/intl402/DateTimeFormat/prototype/format/fractionalSecondDigits.js +M test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js +M test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js +M test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js +M test/intl402/DateTimeFormat/prototype/formatRange/builtin.js +M test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js +M test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js +M test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js +M test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js +M test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js +M test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js +A test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-long-en.js +A test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-narrow-en.js +A test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-short-en.js +A test/intl402/DateTimeFormat/prototype/formatToParts/fractionalSecondDigits.js +D test/intl402/DateTimeFormat/prototype/resolvedOptions/order-quarter.js +D test/intl402/DateTimeFormat/taint-Object-prototype-quarter.js +M test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js +M test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-numeric-auto.js +M test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js +A test/language/expressions/class/elements/private-field-access-on-inner-arrow-function.js +A test/language/expressions/class/elements/private-field-access-on-inner-function.js +A test/language/expressions/class/elements/private-getter-access-on-inner-arrow-function.js +A test/language/expressions/class/elements/private-getter-access-on-inner-function.js +A test/language/expressions/class/elements/private-getter-is-not-a-own-property.js +A test/language/expressions/class/elements/private-method-access-on-inner-arrow-function.js +A test/language/expressions/class/elements/private-method-access-on-inner-function.js +A test/language/expressions/class/elements/private-method-is-not-a-own-property.js +A test/language/expressions/class/elements/private-setter-access-on-inner-arrow-function.js +A test/language/expressions/class/elements/private-setter-access-on-inner-function.js +A test/language/expressions/class/elements/private-setter-is-not-a-own-property.js +M test/language/expressions/class/elements/prod-private-getter-before-super-return-in-field-initializer.js +M test/language/expressions/class/elements/prod-private-method-before-super-return-in-field-initializer.js +M test/language/expressions/class/elements/prod-private-setter-before-super-return-in-field-initializer.js +A test/language/expressions/class/poisoned-underscore-proto.js +A test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval-indirect.js +A test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval.js +A test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-factory.js +A test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-function-ctor.js +A test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js +A test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm.js +A test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval-indirect.js +A test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval.js +A test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-factory.js +A test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-function-ctor.js +A test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm-function-ctor.js +A test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm.js +A test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval-indirect.js +A test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval.js +A test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-factory.js +A test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-function-ctor.js +A test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js +A test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm.js +A test/language/expressions/new.target/unary-expr.js +A test/language/expressions/super/call-poisoned-underscore-proto.js +A test/language/expressions/super/prop-poisoned-underscore-proto.js +A test/language/identifiers/vals-cjk-escaped.js +A test/language/identifiers/vals-cjk.js +M test/language/statements/class/elements/private-class-field-on-frozen-objects.js +A test/language/statements/class/elements/private-field-access-on-inner-arrow-function.js +A test/language/statements/class/elements/private-field-access-on-inner-function.js +A test/language/statements/class/elements/private-field-is-not-clobbered-by-computed-property.js +A test/language/statements/class/elements/private-field-visible-to-direct-eval-on-initializer.js +A test/language/statements/class/elements/private-field-visible-to-direct-eval.js +A test/language/statements/class/elements/private-getter-access-on-inner-arrow-function.js +A test/language/statements/class/elements/private-getter-access-on-inner-function.js +M test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js +A test/language/statements/class/elements/private-getter-is-not-a-own-property.js +A test/language/statements/class/elements/private-getter-is-not-clobbered-by-computed-property.js +A test/language/statements/class/elements/private-getter-visible-to-direct-eval-on-initializer.js +A test/language/statements/class/elements/private-getter-visible-to-direct-eval.js +A test/language/statements/class/elements/private-method-access-on-inner-arrow-function.js +A test/language/statements/class/elements/private-method-access-on-inner-function.js +A test/language/statements/class/elements/private-method-is-not-a-own-property.js +A test/language/statements/class/elements/private-method-is-not-clobbered-by-computed-property.js +A test/language/statements/class/elements/private-method-visible-to-direct-eval-on-initializer.js +A test/language/statements/class/elements/private-method-visible-to-direct-eval.js +A test/language/statements/class/elements/private-setter-access-on-inner-arrow-function.js +A test/language/statements/class/elements/private-setter-access-on-inner-function.js +A test/language/statements/class/elements/private-setter-is-not-a-own-property.js +A test/language/statements/class/elements/private-setter-is-not-clobbered-by-computed-property.js +A test/language/statements/class/elements/private-setter-visible-to-direct-eval-on-initializer.js +A test/language/statements/class/elements/private-setter-visible-to-direct-eval.js +M test/language/statements/class/elements/prod-private-getter-before-super-return-in-field-initializer.js +M test/language/statements/class/elements/prod-private-method-before-super-return-in-field-initializer.js +M test/language/statements/class/elements/prod-private-setter-before-super-return-in-field-initializer.js +A test/language/statements/class/elements/super-access-inside-a-private-getter.js +A test/language/statements/class/elements/super-access-inside-a-private-method.js +A test/language/statements/class/elements/super-access-inside-a-private-setter.js +A test/language/statements/class/poisoned-underscore-proto.js +M test/language/statements/function/13.2-30-s.js \ No newline at end of file diff --git a/JSTests/test262/test/built-ins/Array/prop-desc.js b/JSTests/test262/test/built-ins/Array/prop-desc.js new file mode 100644 index 000000000000..3aaf93dfab96 --- /dev/null +++ b/JSTests/test262/test/built-ins/Array/prop-desc.js @@ -0,0 +1,25 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-array-constructor +description: > + Property descriptor of Array +info: | + 22.1.1 The Array Constructor + + * is the initial value of the Array property of the global object. + + 17 ECMAScript Standard Built-in Objects + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +---*/ + +verifyProperty(this, 'Array', { + value: Array, + writable: true, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/15.9.5.44-0-1.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/15.9.5.44-0-1.js deleted file mode 100644 index baafe4540a19..000000000000 --- a/JSTests/test262/test/built-ins/Date/prototype/toJSON/15.9.5.44-0-1.js +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2012 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-date.prototype.tojson -es5id: 15.9.5.44-0-1 -description: Date.prototype.toJSON must exist as a function ----*/ - -var f = Date.prototype.toJSON; - -assert.sameValue(typeof(f), "function", 'typeof(f)'); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/15.9.5.44-0-2.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/15.9.5.44-0-2.js deleted file mode 100644 index ae9ed85df14f..000000000000 --- a/JSTests/test262/test/built-ins/Date/prototype/toJSON/15.9.5.44-0-2.js +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2012 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-date.prototype.tojson -es5id: 15.9.5.44-0-2 -description: Date.prototype.toJSON must exist as a function taking 1 parameter ----*/ - -assert.sameValue(Date.prototype.toJSON.length, 1, 'Date.prototype.toJSON.length'); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/builtin.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/builtin.js new file mode 100644 index 000000000000..7c7f38c15452 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/builtin.js @@ -0,0 +1,21 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + Tests that Date.prototype.toJSON meets the requirements + for built-in objects defined by the introduction of chapter 17 of + the ECMAScript Language Specification. +includes: [isConstructor.js] +features: [Reflect.construct] +---*/ + +var toJSON = Date.prototype.toJSON; + +assert(Object.isExtensible(toJSON)); +assert.sameValue(typeof toJSON, 'function'); +assert.sameValue(Object.prototype.toString.call(toJSON), '[object Function]'); +assert.sameValue(Object.getPrototypeOf(toJSON), Function.prototype); + +assert.sameValue(toJSON.hasOwnProperty('prototype'), false); +assert.sameValue(isConstructor(toJSON), false); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-abrupt.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-abrupt.js new file mode 100644 index 000000000000..e44e655c747c --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-abrupt.js @@ -0,0 +1,38 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + Abrupt completion from GetV or Call. +info: | + Date.prototype.toJSON ( key ) + + [...] + 4. Return ? Invoke(O, "toISOString"). + + Invoke ( V, P [ , argumentsList ] ) + + [...] + 3. Let func be ? GetV(V, P). + 4. Return ? Call(func, V, argumentsList). +---*/ + +var abruptGet = { + get toISOString() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + Date.prototype.toJSON.call(abruptGet); +}); + +var abruptCall = { + toISOString() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + Date.prototype.toJSON.call(abruptCall); +}); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-arguments.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-arguments.js new file mode 100644 index 000000000000..865e9d6519d3 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-arguments.js @@ -0,0 +1,42 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + toISOString is called with correct context and without arguments. +info: | + Date.prototype.toJSON ( key ) + + [...] + 4. Return ? Invoke(O, "toISOString"). + + Invoke ( V, P [ , argumentsList ] ) + + [...] + 3. Let func be ? GetV(V, P). + 4. Return ? Call(func, V, argumentsList). +---*/ + +var getCount = 0, getContext; +var callCount = 0, callContext, callArguments; +var obj = { + get toISOString() { + getCount += 1; + getContext = this; + + return function() { + callCount += 1; + callContext = this; + callArguments = arguments; + }; + }, +}; + +Date.prototype.toJSON.call(obj); + +assert.sameValue(getCount, 1); +assert.sameValue(getContext, obj); + +assert.sameValue(callCount, 1); +assert.sameValue(callContext, obj); +assert.sameValue(callArguments.length, 0); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-result.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-result.js new file mode 100644 index 000000000000..0977bda24bb3 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/invoke-result.js @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + Result of toISOString call is returned. +info: | + Date.prototype.toJSON ( key ) + + [...] + 4. Return ? Invoke(O, "toISOString"). + + Invoke ( V, P [ , argumentsList ] ) + + [...] + 3. Let func be ? GetV(V, P). + 4. Return ? Call(func, V, argumentsList). +---*/ + +var date = new Date(); +assert.sameValue(date.toJSON(), date.toISOString()); + +var result = {}; +assert.sameValue( + Date.prototype.toJSON.call({ + toISOString: function() { return result; }, + }), + result +); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/length.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/length.js new file mode 100644 index 000000000000..812b0cf511c0 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/length.js @@ -0,0 +1,23 @@ +// Copyright (C) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + Date.prototype.toJSON.length is 1. +info: | + Date.prototype.toJSON ( key ) + + ECMAScript Standard Built-in Objects + + Unless otherwise specified, the length property of a built-in Function + object has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: true }. +includes: [propertyHelper.js] +---*/ + +verifyProperty(Date.prototype.toJSON, 'length', { + value: 1, + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/name.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/name.js index 9010ae0ad3af..52278e81ff59 100644 --- a/JSTests/test262/test/built-ins/Date/prototype/toJSON/name.js +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/name.js @@ -20,8 +20,9 @@ info: | includes: [propertyHelper.js] ---*/ -assert.sameValue(Date.prototype.toJSON.name, "toJSON"); - -verifyNotEnumerable(Date.prototype.toJSON, "name"); -verifyNotWritable(Date.prototype.toJSON, "name"); -verifyConfigurable(Date.prototype.toJSON, "name"); +verifyProperty(Date.prototype.toJSON, 'name', { + value: 'toJSON', + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/non-finite.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/non-finite.js new file mode 100644 index 000000000000..7117fc42c924 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/non-finite.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + If this value coerces to non-finite number, null is returned. +info: | + Date.prototype.toJSON ( key ) + + [...] + 2. Let tv be ? ToPrimitive(O, hint Number). + 3. If Type(tv) is Number and tv is not finite, return null. +---*/ + +var toJSON = Date.prototype.toJSON; + +assert.sameValue( + toJSON.call({ + get toISOString() { throw new Test262Error(); }, + valueOf: function() { return NaN; }, + }), + null +); + +var num = new Number(-Infinity); +num.toISOString = function() { throw new Test262Error(); }; +assert.sameValue(toJSON.call(num), null); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-object.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-object.js new file mode 100644 index 000000000000..63d5f28c8668 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-object.js @@ -0,0 +1,29 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + This value is coerced to an object. +info: | + Date.prototype.toJSON ( key ) + + 1. Let O be ? ToObject(this value). +features: [Symbol] +---*/ + +var toJSON = Date.prototype.toJSON; +this.toISOString = function() { return 'global'; }; + +assert.throws(TypeError, function() { + toJSON.call(undefined); +}); + +assert.throws(TypeError, function() { + toJSON.call(null); +}); + +Number.prototype.toISOString = function() { return 'str'; }; +assert.sameValue(toJSON.call(10), 'str'); + +Symbol.prototype.toISOString = function() { return 10; }; +assert.sameValue(toJSON.call(Symbol()), 10); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-abrupt.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-abrupt.js new file mode 100644 index 000000000000..c610c159d7db --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-abrupt.js @@ -0,0 +1,56 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + Abrupt completion from ToPrimitive. +info: | + Date.prototype.toJSON ( key ) + + [...] + 2. Let tv be ? ToPrimitive(O, hint Number). + + ToPrimitive ( input [ , PreferredType ] ) + + 1. Assert: input is an ECMAScript language value. + 2. If Type(input) is Object, then + [...] + g. Return ? OrdinaryToPrimitive(input, hint). + + OrdinaryToPrimitive ( O, hint ) + + [...] + 5. For each name in methodNames in List order, do + a. Let method be ? Get(O, name). + b. If IsCallable(method) is true, then + i. Let result be ? Call(method, O). + ii. If Type(result) is not Object, return result. + 6. Throw a TypeError exception. +---*/ + +var toJSON = Date.prototype.toJSON; +var getAbrupt = { + get valueOf() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + toJSON.call(getAbrupt); +}); + +var callAbrupt = { + toString: function() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + toJSON.call(callAbrupt); +}); + +var notCoercible = Object.create(null); + +assert.throws(TypeError, function() { + toJSON.call(notCoercible); +}); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-symbol.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-symbol.js new file mode 100644 index 000000000000..b1e712aaa8e6 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-symbol.js @@ -0,0 +1,45 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + This value is coerced to primitive with Number hint (exotic @@toPrimitive). +info: | + Date.prototype.toJSON ( key ) + + [...] + 2. Let tv be ? ToPrimitive(O, hint Number). + + ToPrimitive ( input [ , PreferredType ] ) + + 1. Assert: input is an ECMAScript language value. + 2. If Type(input) is Object, then + [...] + d. Let exoticToPrim be ? GetMethod(input, @@toPrimitive). + e. If exoticToPrim is not undefined, then + i. Let result be ? Call(exoticToPrim, input, « hint »). + ii. If Type(result) is not Object, return result. +features: [Symbol, Symbol.toPrimitive] +---*/ + +var callCount = 0, _this, _arguments; +var result = new Boolean(false); + +var obj = { + toISOString: function() { return result; }, + toString: function() { throw new Test262Error('should not be called'); }, + valueOf: function() { throw new Test262Error('should not be called'); }, +}; + +obj[Symbol.toPrimitive] = function() { + callCount += 1; + _this = this; + _arguments = arguments; + return 3.14; +}; + +assert.sameValue(Date.prototype.toJSON.call(obj), result); +assert.sameValue(callCount, 1); +assert.sameValue(_this, obj); +assert.sameValue(_arguments[0], 'number'); +assert.sameValue(_arguments.length, 1); diff --git a/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-value-of.js b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-value-of.js new file mode 100644 index 000000000000..2d48b1150573 --- /dev/null +++ b/JSTests/test262/test/built-ins/Date/prototype/toJSON/to-primitive-value-of.js @@ -0,0 +1,46 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-date.prototype.tojson +description: > + This value is coerced to primitive with Number hint (OrdinaryToPrimitive). +info: | + Date.prototype.toJSON ( key ) + + [...] + 2. Let tv be ? ToPrimitive(O, hint Number). + + ToPrimitive ( input [ , PreferredType ] ) + + 1. Assert: input is an ECMAScript language value. + 2. If Type(input) is Object, then + [...] + g. Return ? OrdinaryToPrimitive(input, hint). + + OrdinaryToPrimitive ( O, hint ) + + [...] + 5. For each name in methodNames in List order, do + a. Let method be ? Get(O, name). + b. If IsCallable(method) is true, then + i. Let result be ? Call(method, O). + ii. If Type(result) is not Object, return result. +---*/ + +var callCount = 0, _this, _arguments; +var result = []; +var obj = { + toISOString: function() { return result; }, + toString: function() { throw new Test262Error('should not be called'); }, + valueOf: function() { + callCount += 1; + _this = this; + _arguments = arguments; + return 'NaN'; + }, +}; + +assert.sameValue(Date.prototype.toJSON.call(obj), result); +assert.sameValue(callCount, 1); +assert.sameValue(_this, obj); +assert.sameValue(_arguments.length, 0); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/Symbol.toStringTag.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/Symbol.toStringTag.js new file mode 100644 index 000000000000..c3f687ca20a2 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/Symbol.toStringTag.js @@ -0,0 +1,58 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + FinalizationGroupCleanupIteratorPrototype @@toStringTag +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + %FinalizationGroupCleanupIteratorPrototype% [ @@toStringTag ] + + The initial value of the @@toStringTag property is the String value "FinalizationGroup Cleanup Iterator". + + This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup, host-gc-required, Symbol, Symbol.toStringTag] +---*/ + +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +assert.sameValue(called, 1, 'cleanup successful'); + +verifyProperty(FinalizationGroupCleanupIteratorPrototype, Symbol.toStringTag, { + value: 'FinalizationGroup Cleanup Iterator', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-job-not-active-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-job-not-active-throws.js new file mode 100644 index 000000000000..a482b838489b --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-job-not-active-throws.js @@ -0,0 +1,62 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + Throws a TypeError if [[IsFinalizationGroupCleanupJobActive]] is false +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 5. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to true. + 6. Let result be Call(callback, undefined, « iterator »). + 7. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to false. + ... + + %FinalizationGroupCleanupIteratorPrototype%.next ( ) + + 1. Let iterator be the this value. + 2. If Type(iterator) is not Object, throw a TypeError exception. + 3. If iterator does not have a [[FinalizationGroup]] internal slot, throw a TypeError exception. +features: [FinalizationGroup, WeakRef, host-gc-required, Symbol] +---*/ + +var iter; +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + iter = iterator; + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +// Make sure everything is set +assert.sameValue(called, 1, 'cleanup successful'); +assert.sameValue(typeof iter, 'object'); +assert.sameValue(Object.getPrototypeOf(iter), FinalizationGroupCleanupIteratorPrototype); + +// To the actual assertion +assert.throws(TypeError, function() { + iter.next(); +}, 'Iter should fail if not called during the cleanupSome call'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-length.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-length.js new file mode 100644 index 000000000000..d8c9df972234 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-length.js @@ -0,0 +1,70 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + FinalizationGroupCleanupIteratorPrototype.next.length property descriptor +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this + value is equal to the largest number of named arguments shown in the + subclause headings for the function description. Optional parameters + (which are indicated with brackets: [ ]) or rest parameters (which + are shown using the form «...name») are not included in the default + argument count. + + Unless otherwise specified, the length property of a built-in + function object has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup, host-gc-required, Symbol] +---*/ + +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +assert.sameValue(called, 1, 'cleanup successful'); + +assert.sameValue(typeof FinalizationGroupCleanupIteratorPrototype.next, 'function'); + +var next = FinalizationGroupCleanupIteratorPrototype.next; + +verifyProperty(next, 'length', { + value: 0, + enumerable: false, + writable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-missing-internal-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-missing-internal-throws.js new file mode 100644 index 000000000000..184a38b41a84 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-missing-internal-throws.js @@ -0,0 +1,83 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + If iterator does not have a [[FinalizationGroup]] internal slot, throw a TypeError exception. +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + %FinalizationGroupCleanupIteratorPrototype%.next ( ) + + 1. Let iterator be the this value. + 2. If Type(iterator) is not Object, throw a TypeError exception. + 3. If iterator does not have a [[FinalizationGroup]] internal slot, throw a TypeError exception. +features: [FinalizationGroup, WeakRef, host-gc-required, Symbol] +---*/ + +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var endOfCall = 0; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + // Only the iterator itself will have a [[FinalizationGroup]] internal + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); + + // It's sensitive the assertions remain inside this function in order to secure + // [[IsFinalizationGroupCleanupJobActive]] is true + assert.sameValue(typeof FinalizationGroupCleanupIteratorPrototype.next, 'function'); + + var next = FinalizationGroupCleanupIteratorPrototype.next; + + assert.throws(TypeError, function() { + next.call({}); + }, '{}'); + + assert.throws(TypeError, function() { + next.call(FinalizationGroup); + }, 'FinalizationGroup'); + + assert.throws(TypeError, function() { + next.call(FinalizationGroupCleanupIteratorPrototype); + }, 'FinalizationGroupCleanupIteratorPrototype'); + + assert.throws(TypeError, function() { + next.call(fg); + }, 'FinalizationGroup instance'); + + var wr = new WeakRef({}); + assert.throws(TypeError, function() { + next.call(wr); + }, 'WeakRef instance'); + + // Abrupt completions are not directly returned. + endOfCall += 1; +} + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +assert.sameValue(called, 1, 'cleanup successful'); +assert.sameValue(endOfCall, 1, 'Abrupt completions are not directly returned.'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-name.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-name.js new file mode 100644 index 000000000000..0522715b750a --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-name.js @@ -0,0 +1,69 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + FinalizationGroupCleanupIteratorPrototype.next.name property descriptor +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, that is not + identified as an anonymous function has a name property whose value + is a String. Unless otherwise specified, this value is the name that + is given to the function in this specification. For functions that + are specified as properties of objects, the name value is the + property name string used to access the function. [...] + + Unless otherwise specified, the name property of a built-in function + object, if it exists, has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup, host-gc-required, Symbol] +---*/ + +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +assert.sameValue(called, 1, 'cleanup successful'); + +assert.sameValue(typeof FinalizationGroupCleanupIteratorPrototype.next, 'function'); + +var next = FinalizationGroupCleanupIteratorPrototype.next; + +verifyProperty(next, 'name', { + value: 'next', + enumerable: false, + writable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-not-object-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-not-object-throws.js new file mode 100644 index 000000000000..169d02834c4d --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-not-object-throws.js @@ -0,0 +1,82 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + FinalizationGroupCleanupIteratorPrototype.next() throws if this is not Object +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + %FinalizationGroupCleanupIteratorPrototype%.next ( ) + + 1. Let iterator be the this value. + 2. If Type(iterator) is not Object, throw a TypeError exception. +features: [FinalizationGroup, host-gc-required, Symbol] +---*/ + +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +assert.sameValue(called, 1, 'cleanup successful'); + +assert.sameValue(typeof FinalizationGroupCleanupIteratorPrototype.next, 'function'); + +var next = FinalizationGroupCleanupIteratorPrototype.next; + +assert.throws(TypeError, function() { + next.call(undefined); +}, 'undefined'); + +assert.throws(TypeError, function() { + next.call(null); +}, 'null'); + +assert.throws(TypeError, function() { + next.call(true); +}, 'true'); + +assert.throws(TypeError, function() { + next.call(false); +}, 'false'); + +assert.throws(TypeError, function() { + next.call(1); +}, '1'); + +assert.throws(TypeError, function() { + next.call('string'); +}, 'string'); + +var symbol = Symbol(); +assert.throws(TypeError, function() { + next.call(symbol); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-prop-desc.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-prop-desc.js new file mode 100644 index 000000000000..e8663aaec66e --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/next-prop-desc.js @@ -0,0 +1,61 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + Prop descriptor for FinalizationGroupCleanupIteratorPrototype.next +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + 17 ECMAScript Standard Built-in Objects: + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +features: [FinalizationGroup, host-gc-required, Symbol] +---*/ + +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +assert.sameValue(called, 1, 'cleanup successful'); + +assert.sameValue(typeof FinalizationGroupCleanupIteratorPrototype.next, 'function'); + +var next = FinalizationGroupCleanupIteratorPrototype.next; + +verifyProperty(FinalizationGroupCleanupIteratorPrototype, 'next', { + enumerable: false, + writable: true, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/proto.js b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/proto.js new file mode 100644 index 000000000000..5b48918f914d --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/FinalizationGroupCleanupIteratorPrototype/proto.js @@ -0,0 +1,84 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + FinalizationGroupCleanupIterator has a [[Prototype]] internal slot whose value is the intrinsic + object %IteratorPrototype%. +info: | + The %FinalizationGroupCleanupIteratorPrototype% Object + + - has properties that are inherited by all FinalizationGroup Cleanup Iterator Objects. + - is an ordinary object. + - has a [[Prototype]] internal slot whose value is the intrinsic object %IteratorPrototype%. + ... + + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 2. If CheckForEmptyCells(finalizationGroup) is false, return. + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + 4. If callback is undefined, set callback to finalizationGroup.[[CleanupCallback]]. + 5. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to true. + 6. Let result be Call(callback, undefined, « iterator »). + ... + + CheckForEmptyCells ( finalizationGroup ) + + ... + 2. For each cell in finalizationGroup.[[Cells]], do + a. If cell.[[Target]] is empty, then + i. Return true. + 3. Return false. + + CreateFinalizationGroupCleanupIterator ( finalizationGroup ) + + ... + 4. Let prototype be finalizationGroup.[[Realm]].[[Intrinsics]].[[%FinalizationGroupCleanupIteratorPrototype%]]. + 5. Let iterator be ObjectCreate(prototype, « [[FinalizationGroup]] »). + 6. Set iterator.[[FinalizationGroup]] to finalizationGroup. + 7. Return iterator. +features: [FinalizationGroup, host-gc-required] +---*/ + +var IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var cleanupCallbackCalled = 0; + +function callback(iterator) { + called += 1; + + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +var fg = new FinalizationGroup(function() {}); + +(function() { + var o = {}; + fg.register(o); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +assert.sameValue(called, 1, 'cleanup successful'); + +var proto = Object.getPrototypeOf(FinalizationGroupCleanupIteratorPrototype); +assert.sameValue( + proto, IteratorPrototype, + '[[Prototype]] internal slot whose value is the intrinsic object %IteratorPrototype%' +); + +assert.sameValue(cleanupCallbackCalled, 0, 'if a callback is given, do not call cleanupCallback'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/constructor.js b/JSTests/test262/test/built-ins/FinalizationGroup/constructor.js new file mode 100644 index 000000000000..651ae8918eb5 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/constructor.js @@ -0,0 +1,15 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-constructor +description: > + The FinalizationGroup constructor is the %FinalizationGroup% intrinsic object and the initial + value of the FinalizationGroup property of the global object. +features: [FinalizationGroup] +---*/ + +assert.sameValue( + typeof FinalizationGroup, 'function', + 'typeof FinalizationGroup is function' +); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/gc-has-one-chance-to-call-cleanupCallback.js b/JSTests/test262/test/built-ins/FinalizationGroup/gc-has-one-chance-to-call-cleanupCallback.js new file mode 100644 index 000000000000..796bc6c3ccb5 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/gc-has-one-chance-to-call-cleanupCallback.js @@ -0,0 +1,135 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + cleanupCallback has only one optional chance to be called for a GC that cleans up + a registered target. +info: | + FinalizationGroup ( cleanupCallback ) + + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + ... + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + Execution + + At any time, if an object obj is not live, an ECMAScript implementation may perform the following steps atomically: + + 1. For each WeakRef ref such that ref.[[Target]] is obj, + a. Set ref.[[Target]] to empty. + 2. For each FinalizationGroup fg such that fg.[[Cells]] contains cell, such that cell.[[Target]] is obj, + a. Set cell.[[Target]] to empty. + b. Optionally, perform ! HostCleanupFinalizationGroup(fg). +features: [FinalizationGroup, async-functions, host-gc-required] +flags: [async] +---*/ + +var cleanupCallback = 0; +var called = 0; + +// both this cb and the fg callback are not exhausting the iterator to prevent +// the target cell from being removed from the finalizationGroup.[[Cells]]. +// More info at %FinalizationGroupCleanupIteratorPrototype%.next ( ) +function cb() { + called += 1; +} + +var fg = new FinalizationGroup(function() { + cleanupCallback += 1; +}); + +function emptyCells() { + (function() { + var a = {}; + fg.register(a, 'a'); + })(); + + // GC is called here + $262.gc(); +} + +emptyCells(); + +// Let's add some async ticks, as the cleanupCallback is not meant to interrupt +// synchronous operations. +async function fn() { + await Promise.resolve(1); + + fg.cleanupSome(cb); + // This asserts the registered object was emptied in the previous GC. + assert.sameValue(called, 1, 'cleanupSome callback for the first time'); + + // At this point, we can't assert if cleanupCallback was called, because it's + // optional. Although, we can finally assert it's not gonna be called anymore + // for the other executions of the Garbage Collector. + // The chance of having it called only happens right after the + // cell.[[Target]] is set to empty. + assert(cleanupCallback >= 0, 'cleanupCallback might be 0'); + assert(cleanupCallback <= 1, 'cleanupCallback might be 1'); + + // Restoring the cleanupCallback variable to 0 will help us asserting the fg + // callback is not called again. + cleanupCallback = 0; + + $262.gc(); + await Promise.resolve(2); // tick + + fg.cleanupSome(cb); + + // This cb is called again because fg still holds an emptied cell, but it's + // not yet removed from the + assert.sameValue(called, 2, 'cleanupSome callback for the second time'); + assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #1'); + + $262.gc(); + await Promise.resolve(3); // tick + + fg.cleanupSome(cb); + + assert.sameValue(called, 3, 'cleanupSome callback for the third time'); + assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #2'); + + $262.gc(); +} + +fn() + .then(async function() { // tick + await Promise.resolve(4); // tick + + assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #3'); + + fg.cleanupSome(cb); + + assert.sameValue(called, 4, 'cleanupSome callback for the fourth time'); + assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #4'); + + $262.gc(); + + // Now we are exhausting the iterator, so cleanupSome callback will also not be called. + fg.cleanupSome(iterator => { + var exhausted = [...iterator]; + assert.sameValue(exhausted.length, 1); + assert.sameValue(exhausted[0], 'a'); + called += 1; + }); + + assert.sameValue(called, 5, 'cleanupSome callback for the fifth time'); + assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #4'); + + $262.gc(); + + await Promise.resolve(5); // tick + await await Promise.resolve(6); // more ticks + await await await Promise.resolve(7); // even more ticks + + fg.cleanupSome(cb); + + assert.sameValue(called, 5, 'cleanupSome callback is not called anymore, no empty cells'); + assert.sameValue(cleanupCallback, 0, 'cleanupCallback is not called again #5'); + }) + .then($DONE, $DONE); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/instance-extensible.js b/JSTests/test262/test/built-ins/FinalizationGroup/instance-extensible.js new file mode 100644 index 000000000000..cf1187d61c6e --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/instance-extensible.js @@ -0,0 +1,30 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: Instances of FinalizationGroup are extensible +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + ObjectCreate ( proto [ , internalSlotsList ] ) + + 4. Set obj.[[Prototype]] to proto. + 5. Set obj.[[Extensible]] to true. + 6. Return obj. +features: [FinalizationGroup] +---*/ + +var fg = new FinalizationGroup(function() {}); +assert.sameValue(Object.isExtensible(fg), true); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/length.js b/JSTests/test262/test/built-ins/FinalizationGroup/length.js new file mode 100644 index 000000000000..88e0d59ce829 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/length.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: FinalizationGroup.length property descriptor +info: | + FinalizationGroup ( cleanupCallback ) + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this + value is equal to the largest number of named arguments shown in the + subclause headings for the function description. Optional parameters + (which are indicated with brackets: [ ]) or rest parameters (which + are shown using the form «...name») are not included in the default + argument count. + + Unless otherwise specified, the length property of a built-in + function object has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup, 'length', { + value: 1, + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/name.js b/JSTests/test262/test/built-ins/FinalizationGroup/name.js new file mode 100644 index 000000000000..517a3442fe89 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/name.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: FinalizationGroup.name property descriptor +info: | + FinalizationGroup ( value ) + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, that is not + identified as an anonymous function has a name property whose value + is a String. Unless otherwise specified, this value is the name that + is given to the function in this specification. For functions that + are specified as properties of objects, the name value is the + property name string used to access the function. [...] + + Unless otherwise specified, the name property of a built-in function + object, if it exists, has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup, 'name', { + value: 'FinalizationGroup', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/newtarget-prototype-is-not-object.js b/JSTests/test262/test/built-ins/FinalizationGroup/newtarget-prototype-is-not-object.js new file mode 100644 index 000000000000..9c2d7f7e90de --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/newtarget-prototype-is-not-object.js @@ -0,0 +1,58 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + [[Prototype]] defaults to %FinalizationGroupPrototype% if NewTarget.prototype is not an object. +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [FinalizationGroup, Reflect.construct, Symbol] +---*/ + +var fg; +function newTarget() {} +function fn() {} + +newTarget.prototype = undefined; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype, 'newTarget.prototype is undefined'); + +newTarget.prototype = null; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype, 'newTarget.prototype is null'); + +newTarget.prototype = true; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype, 'newTarget.prototype is a Boolean'); + +newTarget.prototype = ''; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype, 'newTarget.prototype is a String'); + +newTarget.prototype = Symbol(); +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype, 'newTarget.prototype is a Symbol'); + +newTarget.prototype = 1; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype, 'newTarget.prototype is a Number'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prop-desc.js b/JSTests/test262/test/built-ins/FinalizationGroup/prop-desc.js new file mode 100644 index 000000000000..e5bd1adfd81d --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prop-desc.js @@ -0,0 +1,22 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-constructor +description: > + Property descriptor of FinalizationGroup +info: | + 17 ECMAScript Standard Built-in Objects: + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(this, 'FinalizationGroup', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/proto-from-ctor-realm.js b/JSTests/test262/test/built-ins/FinalizationGroup/proto-from-ctor-realm.js new file mode 100644 index 000000000000..836351fa4162 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/proto-from-ctor-realm.js @@ -0,0 +1,59 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: Default [[Prototype]] value derived from realm of the newTarget +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [FinalizationGroup, cross-realm, Reflect] +---*/ + +var other = $262.createRealm().global; +var newTarget = new other.Function(); +function fn() {} +var fg; + +newTarget.prototype = undefined; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), other.FinalizationGroup.prototype, 'newTarget.prototype is undefined'); + +newTarget.prototype = null; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), other.FinalizationGroup.prototype, 'newTarget.prototype is null'); + +newTarget.prototype = true; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), other.FinalizationGroup.prototype, 'newTarget.prototype is a Boolean'); + +newTarget.prototype = ''; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), other.FinalizationGroup.prototype, 'newTarget.prototype is a String'); + +newTarget.prototype = Symbol(); +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), other.FinalizationGroup.prototype, 'newTarget.prototype is a Symbol'); + +newTarget.prototype = 1; +fg = Reflect.construct(FinalizationGroup, [fn], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), other.FinalizationGroup.prototype, 'newTarget.prototype is a Number'); + diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/proto.js b/JSTests/test262/test/built-ins/FinalizationGroup/proto.js new file mode 100644 index 000000000000..05cab8f7625c --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/proto.js @@ -0,0 +1,18 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + The prototype of FinalizationGroup is Object.prototype +info: | + The value of the [[Prototype]] internal slot of the FinalizationGroup object is the + intrinsic object %FunctionPrototype%. +features: [FinalizationGroup] +---*/ + +assert.sameValue( + Object.getPrototypeOf(FinalizationGroup), + Function.prototype, + 'Object.getPrototypeOf(FinalizationGroup) returns the value of `Function.prototype`' +); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-abrupt.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-abrupt.js new file mode 100644 index 000000000000..31aff1aafce1 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-abrupt.js @@ -0,0 +1,41 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + Return abrupt from getting the NewTarget prototype +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). +features: [FinalizationGroup, Reflect.construct] +---*/ + +var calls = 0; +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + calls += 1; + throw new Test262Error(); + } +}); + +assert.throws(Test262Error, function() { + Reflect.construct(FinalizationGroup, [function() {}], newTarget); +}); + +assert.sameValue(calls, 1); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-custom.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-custom.js new file mode 100644 index 000000000000..ef5be6067db8 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget-custom.js @@ -0,0 +1,44 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [FinalizationGroup, Reflect.construct] +---*/ + +var fg; + +fg = Reflect.construct(FinalizationGroup, [function() {}], Object); +assert.sameValue(Object.getPrototypeOf(fg), Object.prototype, 'NewTarget is built-in Object constructor'); + +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + return Array.prototype; + } +}); +fg = Reflect.construct(FinalizationGroup, [function() {}], newTarget); +assert.sameValue(Object.getPrototypeOf(fg), Array.prototype, 'NewTarget is BoundFunction with accessor'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget.js new file mode 100644 index 000000000000..dd376b71f899 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype-from-newtarget.js @@ -0,0 +1,33 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [FinalizationGroup] +---*/ + +var fg = new FinalizationGroup(function() {}); +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/Symbol.toStringTag.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/Symbol.toStringTag.js new file mode 100644 index 000000000000..d505aa46792c --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/Symbol.toStringTag.js @@ -0,0 +1,23 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-@@tostringtag +description: > + `Symbol.toStringTag` property descriptor +info: | + The initial value of the @@toStringTag property is the String value + 'FinalizationGroup'. + + This property has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup, Symbol, Symbol.toStringTag] +---*/ + +verifyProperty(FinalizationGroup.prototype, Symbol.toStringTag, { + value: 'FinalizationGroup', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-iterator-proto.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-iterator-proto.js new file mode 100644 index 000000000000..cd593cb6cf27 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-iterator-proto.js @@ -0,0 +1,87 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + The callback function is called with a FinalizationGroupCleanupIterator +info: | + The %FinalizationGroupCleanupIteratorPrototype% Object + + - has properties that are inherited by all FinalizationGroup Cleanup Iterator Objects. + - is an ordinary object. + - has a [[Prototype]] internal slot whose value is the intrinsic object %IteratorPrototype%. + ... + + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 2. If CheckForEmptyCells(finalizationGroup) is false, return. + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + 4. If callback is undefined, set callback to finalizationGroup.[[CleanupCallback]]. + 5. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to true. + 6. Let result be Call(callback, undefined, « iterator »). + ... + + CheckForEmptyCells ( finalizationGroup ) + + ... + 2. For each cell in finalizationGroup.[[Cells]], do + a. If cell.[[Target]] is empty, then + i. Return true. + 3. Return false. + + CreateFinalizationGroupCleanupIterator ( finalizationGroup ) + + ... + 4. Let prototype be finalizationGroup.[[Realm]].[[Intrinsics]].[[%FinalizationGroupCleanupIteratorPrototype%]]. + 5. Let iterator be ObjectCreate(prototype, « [[FinalizationGroup]] »). + 6. Set iterator.[[FinalizationGroup]] to finalizationGroup. + 7. Return iterator. +features: [FinalizationGroup, host-gc-required] +---*/ + +var IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; +var cleanupCallbackCalled = 0; + +function callback(iterator) { + called += 1; + + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +var fg = new FinalizationGroup(function() { + cleanupCallbackCalled += 1; +}); + +(function() { + let o = {}; + fg.register(o); +})(); + +assert.sameValue(called, 0); + +$262.gc(); +fg.cleanupSome(callback); + +assert.sameValue(called, 1); + +var proto = Object.getPrototypeOf(FinalizationGroupCleanupIteratorPrototype); +assert.sameValue( + proto, IteratorPrototype, + '[[Prototype]] internal slot whose value is the intrinsic object %IteratorPrototype%' +); + + +assert.sameValue(cleanupCallbackCalled, 0, 'if a callback is given, do not call cleanupCallback'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-not-callable-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-not-callable-throws.js new file mode 100644 index 000000000000..e963368d26c3 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/callback-not-callable-throws.js @@ -0,0 +1,53 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Throws a TypeError if callback is not callable +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.cleanupSome, 'function'); + +var fg = new FinalizationGroup(function() {}); + +assert.throws(TypeError, function() { + fg.cleanupSome(null); +}, 'null'); + +assert.throws(TypeError, function() { + fg.cleanupSome(true); +}, 'true'); + +assert.throws(TypeError, function() { + fg.cleanupSome(false); +}, 'false'); + +assert.throws(TypeError, function() { + fg.cleanupSome(1); +}, 'number'); + +assert.throws(TypeError, function() { + fg.cleanupSome('object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + fg.cleanupSome(s); +}, 'symbol'); + +assert.throws(TypeError, function() { + fg.cleanupSome({}); +}, 'object'); + +assert.throws(TypeError, function() { + fg.cleanupSome(FinalizationGroup.prototype); +}, 'FinalizationGroup.prototype'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-reference.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-reference.js new file mode 100644 index 000000000000..c5dd59bc87da --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-reference.js @@ -0,0 +1,48 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Cleanup might be prevented with a reference usage; +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. +features: [FinalizationGroup, host-gc-required] +---*/ + +var holdingsList; +function cb(iterator) { + holdingsList = [...iterator]; +}; +var fg = new FinalizationGroup(function() {}); + +function emptyCells() { + var x; + (function() { + var a = {}; + b = {}; + x = {}; + var y = {}; + fg.register(x, 'x'); + fg.register(a, 'a'); + fg.register(y, y); + fg.register(b, 'b'); + var b; + })(); + $262.gc(); + x; // This is an intentional reference to x, please leave it here, after the GC +} + +emptyCells(); +fg.cleanupSome(cb); + +// The order is per implementation so we can't use compareArray without sorting +assert.sameValue(holdingsList.length, 2); +assert(holdingsList.includes('a')); +assert(holdingsList.includes('b')); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-unregister.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-unregister.js new file mode 100644 index 000000000000..4c0250610508 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanup-prevented-with-unregister.js @@ -0,0 +1,88 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Cleanup might be prevented with an unregister usage +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + FinalizationGroup.prototype.unregister ( unregisterToken ) + + 1. Let removed be false. + 2. For each Record { [[Target]], [[Holdings]], [[UnregisterToken]] } cell that is an element of finalizationGroup.[[Cells]], do + a. If SameValue(cell.[[UnregisterToken]], unregisterToken) is true, then + i. Remove cell from finalizationGroup.[[Cells]]. + ii. Set removed to true. + 3. Return removed. +features: [FinalizationGroup, host-gc-required] +---*/ + +var holdingsList; +var fg = new FinalizationGroup(function() {}); + +var unregA = {}; +var unregB = {}; +var unregC = {}; +var unregDE = {}; // Use the same unregister token for D and E + +function emptyCells() { + (function() { + var a = {}; + var b = {}; + var c = {}; + var d = {}; + var e = {}; + fg.register(a, 'a', unregA); + fg.register(b, 'b', unregB); + fg.register(c, 'c', unregC); + fg.register(d, 'd', unregDE); + fg.register(e, 'e', unregDE); + })(); + + var res = fg.unregister(unregC); // unregister 'c' before GC + assert.sameValue(res, true, 'unregister c before GC'); + + $262.gc(); +} + +emptyCells(); + +var res = fg.unregister(unregDE); +assert.sameValue(res, true, 'unregister d and e after GC'); + +fg.cleanupSome(function cb(iterator) { + var res = fb.unregister(unregA); + assert.sameValue(res, true, 'unregister a before the iterator is consumed.'); + + holdingsList = [...iterator]; + + // It's not possible to verify an unregister during the iterator consumption + // as it's .next() does not have any specific order to follow for each item. +}); + +assert.sameValue(holdingsList[0], 'b'); +assert.sameValue(holdingsList.length, 1); + +// Second run +res = fg.unregister(unregB); // let's empty the cells +assert.sameValue(res, true, 'unregister B for cleanup'); +holdingsList = undefined; +emptyCells(); + +fg.cleanupSome(function cb(iterator) { + var res = fb.unregister(unregDE); + assert.sameValue(res, true, 'unregister d and e before the iterator is consumed.'); + holdingsList = [...iterator]; +}); + +assert(holdingsList.includes('b')); +assert(holdingsList.includes('a'), 'just like the first run, now without removing a'); +assert.sameValue(holdingsList.length, 2); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanupcallback-iterator-proto.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanupcallback-iterator-proto.js new file mode 100644 index 000000000000..5adc6e47000c --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/cleanupcallback-iterator-proto.js @@ -0,0 +1,82 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + The cleanup callback function is called with a FinalizationGroupCleanupIterator +info: | + The %FinalizationGroupCleanupIteratorPrototype% Object + + - has properties that are inherited by all FinalizationGroup Cleanup Iterator Objects. + - is an ordinary object. + - has a [[Prototype]] internal slot whose value is the intrinsic object %IteratorPrototype%. + ... + + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 2. If CheckForEmptyCells(finalizationGroup) is false, return. + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + 4. If callback is undefined, set callback to finalizationGroup.[[CleanupCallback]]. + 5. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to true. + 6. Let result be Call(callback, undefined, « iterator »). + ... + + CheckForEmptyCells ( finalizationGroup ) + + ... + 2. For each cell in finalizationGroup.[[Cells]], do + a. If cell.[[Target]] is empty, then + i. Return true. + 3. Return false. + + CreateFinalizationGroupCleanupIterator ( finalizationGroup ) + + ... + 4. Let prototype be finalizationGroup.[[Realm]].[[Intrinsics]].[[%FinalizationGroupCleanupIteratorPrototype%]]. + 5. Let iterator be ObjectCreate(prototype, « [[FinalizationGroup]] »). + 6. Set iterator.[[FinalizationGroup]] to finalizationGroup. + 7. Return iterator. +features: [FinalizationGroup, host-gc-required] +---*/ + +var IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); +var FinalizationGroupCleanupIteratorPrototype; +var called = 0; + +function callback(iterator) { + called += 1; + + FinalizationGroupCleanupIteratorPrototype = Object.getPrototypeOf(iterator); +} + +var fg = new FinalizationGroup(callback); + +(function() { + let o = {}; + fg.register(o); +})(); + +assert.sameValue(called, 0); + +$262.gc(); +fg.cleanupSome(); + +assert.sameValue(called, 1); + +var proto = Object.getPrototypeOf(FinalizationGroupCleanupIteratorPrototype); +assert.sameValue( + proto, IteratorPrototype, + '[[Prototype]] internal slot whose value is the intrinsic object %IteratorPrototype%' +); + diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/custom-this.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/custom-this.js new file mode 100644 index 000000000000..d9de47abffa8 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/custom-this.js @@ -0,0 +1,26 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Return values applying custom this +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. +features: [FinalizationGroup] +---*/ + +var fn = function() {}; +var cleanupSome = FinalizationGroup.prototype.cleanupSome; +var fg = new FinalizationGroup(fn); + +var cb = function() {}; + +assert.sameValue(cleanupSome.call(fg, cb), undefined); +assert.sameValue(cleanupSome.call(fg, fn), undefined), 'reuse the same cleanup callback fn'; diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/gc-cleanup-not-prevented-with-wr-deref.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/gc-cleanup-not-prevented-with-wr-deref.js new file mode 100644 index 000000000000..1ed2f079d6b5 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/gc-cleanup-not-prevented-with-wr-deref.js @@ -0,0 +1,51 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: WeakRef deref should not prevent a GC event +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + ... + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + WeakRef.prototype.deref ( ) + + ... + 4. Let target be the value of weakRef.[[Target]]. + 5. If target is not empty, + a. Perform ! KeepDuringJob(target). + b. Return target. + 6. Return undefined. +features: [FinalizationGroup, WeakRef, host-gc-required] +---*/ + +var holdingsList; +function cb(iterator) { + holdingsList = [...iterator]; +} +var fg = new FinalizationGroup(function() {}); + +var deref = false; + +function emptyCells() { + var wr; + (function() { + var a = {}; + wr = new WeakRef(a); + fg.register(a, 'a'); + })(); + $262.gc(); + deref = wr.deref(); +} + +emptyCells(); +fg.cleanupSome(cb); + +assert.sameValue(holdingsList.length, 1); +assert.sameValue(holdingsList[0], 'a'); + +assert.sameValue(deref, undefined, 'deref handles an empty wearRef.[[Target]] returning undefined'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-dynamic.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-dynamic.js new file mode 100644 index 000000000000..f930c7aed92d --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-dynamic.js @@ -0,0 +1,98 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + The callback iterator is dynamic. Therefore, it can be emptied before iteration +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + %FinalizationGroupCleanupIteratorPrototype%.next ( ) + + 8. If finalizationGroup.[[Cells]] contains a Record cell such that cell.[[Target]] is empty, + a. Choose any such cell. + b. Remove cell from finalizationGroup.[[Cells]]. + c. Return CreateIterResultObject(cell.[[Holdings]], false). + 9. Otherwise, return CreateIterResultObject(undefined, true). +features: [FinalizationGroup, host-gc-required, Symbol] +---*/ + +var called = 0; +var endOfCall = 0; +var first, second, third; +var firstIter, secondIter, thirdIter; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + called += 1; + + if (called === 1) { + + // Inception! + fg.cleanupSome(callback); + + first = iterator.next(); + firstIter = iterator; + } else if (called === 2) { + + // Double Inception! + fg.cleanupSome(callback); + + second = iterator.next(); + secondIter = iterator; + } else if (called === 3) { + + // Triple Inception! + // But this time we won't try to consume iterator anymore, leave it alone there. + fg.cleanupSome(callback); + + third = iterator.next(); + thirdIter = iterator; + } + + endOfCall += 1; +} + +(function() { + var o1 = {}; + var o2 = {}; + fg.register(o1, 'holdings 1'); + fg.register(o2, 'holdings 2'); +})(); + +$262.gc(); + +fg.cleanupSome(callback); + +// Make sure everything is set +assert.sameValue(called, 4, 'cleanup successfully'); +assert.sameValue(endOfCall, 4, 'cleanup ended successfully'); + +assert.notSameValue(firstIter, secondIter, 'callback is not called with the same iterator #1'); +assert.notSameValue(firstIter, thirdIter, 'callback is not called with the same iterator #2'); +assert.notSameValue(secondIter, thirdIter, 'callback is not called with the same iterator #3'); + +assert.sameValue(first.value, undefined, 'iterator is already consumed'); +assert.sameValue(first.done, true, 'first callback will find no empty Targets'); +assert.sameValue(second.done, false, 'second callback will find an empty Target'); +assert.sameValue(third.done, false, 'third callback will find an empty Target'); + +// 8.a. Choose any such cell. +var holdings = [second.value, third.value]; + +assert(holdings.includes('holdings 1'), 'iterators consume emptied cells #1'); +assert(holdings.includes('holdings 2'), 'iterators consume emptied cells #2'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-holdings-multiple-values.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-holdings-multiple-values.js new file mode 100644 index 000000000000..db2ac9e5c506 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/iterator-holdings-multiple-values.js @@ -0,0 +1,116 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-finalization-group-constructor +description: > + Iterates over different type values in holdings +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + ... + 5. Perform ! CleanupFinalizationGroup(finalizationGroup, callback). + ... + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + ... + 3. Let iterator be ! CreateFinalizationGroupCleanupIterator(finalizationGroup). + ... + 6. Let result be Call(callback, undefined, « iterator »). + ... + + %FinalizationGroupCleanupIteratorPrototype%.next ( ) + + 8. If finalizationGroup.[[Cells]] contains a Record cell such that cell.[[Target]] is empty, + a. Choose any such cell. + b. Remove cell from finalizationGroup.[[Cells]]. + c. Return CreateIterResultObject(cell.[[Holdings]], false). + 9. Otherwise, return CreateIterResultObject(undefined, true). +features: [FinalizationGroup, Symbol, host-gc-required] +includes: [compareArray.js] +---*/ + +var holdings; +var fg = new FinalizationGroup(function() {}); + +function callback(iterator) { + holdings = [...iterator]; +} + +(function() { + var o = {}; + fg.register(o); + fg.register(o, undefined); +})(); + +$262.gc(); +fg.cleanupSome(callback); + +assert.compareArray(holdings, [undefined, undefined], 'undefined'); + +(function() { + var o = {}; + fg.register(o, null); +})(); + +$262.gc(); +fg.cleanupSome(callback); +assert.compareArray(holdings, [null], 'null'); + +(function() { + var o = {}; + fg.register(o, ''); +})(); + +$262.gc(); +fg.cleanupSome(callback); +assert.compareArray(holdings, [''], 'the empty string'); + +var other = {}; +(function() { + var o = {}; + fg.register(o, other); +})(); + +$262.gc(); +fg.cleanupSome(callback); +assert.compareArray(holdings, [other], '{}'); + +(function() { + var o = {}; + fg.register(o, 42); +})(); + +$262.gc(); +fg.cleanupSome(callback); +assert.compareArray(holdings, [42], '42'); + +(function() { + var o = {}; + fg.register(o, true); +})(); + +$262.gc(); +fg.cleanupSome(callback); +assert.compareArray(holdings, [true], 'true'); + +(function() { + var o = {}; + fg.register(o, false); +})(); + +$262.gc(); +fg.cleanupSome(callback); +assert.compareArray(holdings, [false], 'false'); + +var s = Symbol(); +(function() { + var o = {}; + fg.register(o, s); +})(); + +$262.gc(); +fg.cleanupSome(callback); +assert.compareArray(holdings, [s], 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/length.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/length.js new file mode 100644 index 000000000000..47748346bda9 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/length.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: FinalizationGroup.prototype.cleanupSome.length property descriptor +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this + value is equal to the largest number of named arguments shown in the + subclause headings for the function description. Optional parameters + (which are indicated with brackets: [ ]) or rest parameters (which + are shown using the form «...name») are not included in the default + argument count. + + Unless otherwise specified, the length property of a built-in + function object has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup.prototype.cleanupSome, 'length', { + value: 0, + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/name.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/name.js new file mode 100644 index 000000000000..370a34f70f5c --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/name.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: FinalizationGroup.prototype.cleanupSome.name property descriptor +info: | + FinalizationGroup.prototype.cleanupSome.name value and property descriptor + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, that is not + identified as an anonymous function has a name property whose value + is a String. Unless otherwise specified, this value is the name that + is given to the function in this specification. For functions that + are specified as properties of objects, the name value is the + property name string used to access the function. [...] + + Unless otherwise specified, the name property of a built-in function + object, if it exists, has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup.prototype.cleanupSome, 'name', { + value: 'cleanupSome', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-callback-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-callback-throws.js new file mode 100644 index 000000000000..bc176e29bc28 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-callback-throws.js @@ -0,0 +1,58 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Return abrupt completion from CleanupFinalizationGroup +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + 4. If callback is undefined, set callback to finalizationGroup.[[CleanupCallback]]. + 5. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to true. + 6. Let result be Call(callback, undefined, « iterator »). + 7. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to false. + 8. If result is an abrupt completion, return result. +features: [FinalizationGroup, arrow-function, async-functions, async-iteration, class, host-gc-required] +---*/ + +var called = 0; +var iterator; + +function poisoned(iter) { + iterator = iter; + iter.next(); // Won't throw + throw new Test262Error(); +} +var fg = new FinalizationGroup(function() { + called += 1; +}); + +function emptyCells() { + (function() { + var o = {}; + fg.register(o); + })(); + $262.gc(); +} + +emptyCells(); + +assert.throws(Test262Error, function() { + fg.cleanupSome(poisoned); +}); + +assert.sameValue(called, 0); + +assert.sameValue(typeof iteraror.next, 'function'); +assert.throws(TypeError, function() { + iterator.next(); +}, 'iterator.next throws a TypeError if IsFinalizationGroupCleanupJobActive is false'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-cleanup-callback-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-cleanup-callback-throws.js new file mode 100644 index 000000000000..b716127c1091 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/poisoned-cleanup-callback-throws.js @@ -0,0 +1,52 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Return abrupt completion from CleanupFinalizationGroup (using CleanupCallback) +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. + + CleanupFinalizationGroup ( finalizationGroup [ , callback ] ) + + 4. If callback is undefined, set callback to finalizationGroup.[[CleanupCallback]]. + 5. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to true. + 6. Let result be Call(callback, undefined, « iterator »). + 7. Set finalizationGroup.[[IsFinalizationGroupCleanupJobActive]] to false. + 8. If result is an abrupt completion, return result. +features: [FinalizationGroup, arrow-function, async-functions, async-iteration, class, host-gc-required] +---*/ + +var iterator; +function poisoned(iter) { + iterator = iter; + iter.next(); // Won't throw + throw new Test262Error(); +} +var fg = new FinalizationGroup(poisoned); + +function emptyCells() { + (function() { + var o = {}; + fg.register(o); + })(); + $262.gc(); +} + +emptyCells(); + +assert.throws(Test262Error, function() { + fg.cleanupSome(); +}); + +assert.sameValue(typeof iteraror.next, 'function'); +assert.throws(TypeError, function() { + iterator.next(); +}, 'iterator.next throws a TypeError if IsFinalizationGroupCleanupJobActive is false'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/prop-desc.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/prop-desc.js new file mode 100644 index 000000000000..f2b269c998f9 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/prop-desc.js @@ -0,0 +1,24 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: > + Property descriptor of FinalizationGroup.prototype.cleanupSome +info: | + 17 ECMAScript Standard Built-in Objects: + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.cleanupSome, 'function'); + +verifyProperty(FinalizationGroup.prototype, 'cleanupSome', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined-with-gc.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined-with-gc.js new file mode 100644 index 000000000000..5d6874c03264 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined-with-gc.js @@ -0,0 +1,69 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Return undefined regardless the result of CleanupFinalizationGroup +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. +features: [FinalizationGroup, arrow-function, async-functions, async-iteration, class, host-gc-required] +---*/ + +var called; +var fn = function() { + called += 1; + return 39; +}; +var cb = function() { + called += 1; + return 42; +}; +var fg = new FinalizationGroup(fn); + +function emptyCells() { + called = 0; + (function() { + var o = {}; + fg.register(o); + })(); + $262.gc(); +} + +emptyCells(); +assert.sameValue(fg.cleanupSome(cb), undefined, 'regular callback'); +assert.sameValue(called, 1); + +emptyCells(); +assert.sameValue(fg.cleanupSome(fn), undefined, 'regular callback, same FG cleanup function'); +assert.sameValue(called, 1); + +emptyCells(); +assert.sameValue(fg.cleanupSome(() => 1), undefined, 'arrow function'); + +emptyCells(); +assert.sameValue(fg.cleanupSome(fg.cleanupSome), undefined, 'cleanupSome itself'); + +emptyCells(); +assert.sameValue(fg.cleanupSome(class {}), undefined, 'class expression'); + +emptyCells(); +assert.sameValue(fg.cleanupSome(async function() {}), undefined, 'async function'); + +emptyCells(); +assert.sameValue(fg.cleanupSome(function *() {}), undefined, 'generator'); + +emptyCells(); +assert.sameValue(fg.cleanupSome(async function *() {}), undefined, 'async generator'); + +emptyCells(); +assert.sameValue(fg.cleanupSome(), undefined, 'undefined, implicit'); + +emptyCells(); +assert.sameValue(fg.cleanupSome(undefined), undefined, 'undefined, explicit'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined.js new file mode 100644 index 000000000000..7edbd51934b2 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/return-undefined.js @@ -0,0 +1,41 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Return undefined regardless the result of CleanupFinalizationGroup +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + 5. Perform ? CleanupFinalizationGroup(finalizationGroup, callback). + 6. Return undefined. +features: [FinalizationGroup, arrow-function, async-functions, async-iteration, class] +---*/ + +var fn = function() {}; +var cb = function() {}; +var poisoned = function() { throw new Test262Error(); }; +var fg = new FinalizationGroup(fn); + +assert.sameValue(fg.cleanupSome(cb), undefined, 'regular callback'); +assert.sameValue(fg.cleanupSome(fn), undefined, 'regular callback, same FG cleanup function'); + +assert.sameValue(fg.cleanupSome(() => {}), undefined, 'arrow function'); +assert.sameValue(fg.cleanupSome(fg.cleanupSome), undefined, 'cleanupSome itself'); +assert.sameValue(fg.cleanupSome(poisoned), undefined, 'poisoned'); +assert.sameValue(fg.cleanupSome(class {}), undefined, 'class expression'); +assert.sameValue(fg.cleanupSome(async function() {}), undefined, 'async function'); +assert.sameValue(fg.cleanupSome(function *() {}), undefined, 'generator'); +assert.sameValue(fg.cleanupSome(async function *() {}), undefined, 'async generator'); + +assert.sameValue(fg.cleanupSome(), undefined, 'undefined, implicit'); +assert.sameValue(fg.cleanupSome(undefined), undefined, 'undefined, explicit'); + +var poisonedFg = new FinalizationGroup(poisoned); + +assert.sameValue(poisonedFg.cleanupSome(cb), undefined, 'regular callback on poisoned FG cleanup callback'); +assert.sameValue(poisonedFg.cleanupSome(poisoned), undefined, 'poisoned callback on poisoned FG cleanup callback'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-does-not-have-internal-cells-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-does-not-have-internal-cells-throws.js new file mode 100644 index 000000000000..954fdf06ad85 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-does-not-have-internal-cells-throws.js @@ -0,0 +1,48 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Throws a TypeError if this does not have a [[Cells]] internal slot +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + ... +features: [FinalizationGroup, WeakRef] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.cleanupSome, 'function'); + +var cleanupSome = FinalizationGroup.prototype.cleanupSome; +var cb = function() {}; + +assert.throws(TypeError, function() { + cleanupSome.call({ ['[[Cells]]']: {} }, cb); +}, 'Ordinary object without [[Cells]]'); + +assert.throws(TypeError, function() { + cleanupSome.call(WeakRef.prototype, cb); +}, 'WeakRef.prototype does not have a [[Cells]] internal slot'); + +assert.throws(TypeError, function() { + cleanupSome.call(WeakRef, cb); +}, 'WeakRef does not have a [[Cells]] internal slot'); + +var wr = new WeakRef({}); +assert.throws(TypeError, function() { + cleanupSome.call(wr, cb); +}, 'WeakRef instance'); + +var wm = new WeakMap(); +assert.throws(TypeError, function() { + cleanupSome.call(wm, cb); +}, 'WeakMap instance'); + +var ws = new WeakSet(); +assert.throws(TypeError, function() { + cleanupSome.call(ws, cb); +}, 'WeakSet instance'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-not-object-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-not-object-throws.js new file mode 100644 index 000000000000..2de7e87e53ec --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/cleanupSome/this-not-object-throws.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.cleanupSome +description: Throws a TypeError if this is not an Object +info: | + FinalizationGroup.prototype.cleanupSome ( [ callback ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If callback is not undefined and IsCallable(callback) is false, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.cleanupSome, 'function'); + +var cleanupSome = FinalizationGroup.prototype.cleanupSome; +var cb = function() {}; + +assert.throws(TypeError, function() { + cleanupSome.call(undefined, cb); +}, 'undefined'); + +assert.throws(TypeError, function() { + cleanupSome.call(null, cb); +}, 'null'); + +assert.throws(TypeError, function() { + cleanupSome.call(true, cb); +}, 'true'); + +assert.throws(TypeError, function() { + cleanupSome.call(false, cb); +}, 'false'); + +assert.throws(TypeError, function() { + cleanupSome.call(1, cb); +}, 'number'); + +assert.throws(TypeError, function() { + cleanupSome.call('object', cb); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + cleanupSome.call(s, cb); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/constructor.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/constructor.js new file mode 100644 index 000000000000..e1c94daee186 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/constructor.js @@ -0,0 +1,23 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.constructor +description: FinalizationGroup.prototype.constructor property descriptor +info: | + FinalizationGroup.prototype.constructor + + The initial value of FinalizationGroup.prototype.constructor is the intrinsic + object %FinalizationGroup%. + + 17 ECMAScript Standard Built-in Objects +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup.prototype, 'constructor', { + value: FinalizationGroup, + writable: true, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/prop-desc.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/prop-desc.js new file mode 100644 index 000000000000..dfe39b4548e3 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/prop-desc.js @@ -0,0 +1,18 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: The property descriptor FinalizationGroup.prototype +esid: sec-finalization-group.prototype +info: | + This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: false }. +features: [FinalizationGroup] +includes: [propertyHelper.js] +---*/ + +verifyProperty(FinalizationGroup, 'prototype', { + writable: false, + enumerable: false, + configurable: false +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/proto.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/proto.js new file mode 100644 index 000000000000..7a2f4aea181d --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/proto.js @@ -0,0 +1,14 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: The prototype of FinalizationGroup.prototype is Object.prototype +esid: sec-properties-of-the-finalization-group-prototype-object +info: | + The value of the [[Prototype]] internal slot of the FinalizationGroup prototype object + is the intrinsic object %ObjectPrototype%. +features: [FinalizationGroup] +---*/ + +var proto = Object.getPrototypeOf(FinalizationGroup.prototype); +assert.sameValue(proto, Object.prototype); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/custom-this.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/custom-this.js new file mode 100644 index 000000000000..f9d86ec4f844 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/custom-this.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: Return undefined (applying custom this) +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fn = function() {}; +var register = FinalizationGroup.prototype.register; +var fg = new FinalizationGroup(fn); + +var target = {}; +assert.sameValue(register.call(fg, target), undefined); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/holdings-any-value-type.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/holdings-any-value-type.js new file mode 100644 index 000000000000..1048a07b8196 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/holdings-any-value-type.js @@ -0,0 +1,35 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: No restriction for the value or type of holdings +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fn = function() {}; +var fg = new FinalizationGroup(fn); + +var target = {}; +assert.sameValue(fg.register(target, undefined), undefined, 'undefined'); +assert.sameValue(fg.register(target, null), undefined, 'null'); +assert.sameValue(fg.register(target, false), undefined, 'false'); +assert.sameValue(fg.register(target, true), undefined, 'true'); +assert.sameValue(fg.register(target, Symbol()), undefined, 'symbol'); +assert.sameValue(fg.register(target, {}), undefined, 'object'); +assert.sameValue(fg.register(target, fg), undefined, 'same as fg instance'); +assert.sameValue(fg.register(target, 1), undefined, 'number'); +assert.sameValue(fg.register(target, 'holdings'), undefined, 'string'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/holdings-same-as-target.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/holdings-same-as-target.js new file mode 100644 index 000000000000..d38d8884b9e1 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/holdings-same-as-target.js @@ -0,0 +1,26 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: holdings may be the same as target +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fg = new FinalizationGroup(function() {}); + +var target = {}; +assert.sameValue(fg.register(target, target), undefined); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/length.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/length.js new file mode 100644 index 000000000000..5c18110acef5 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/length.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: FinalizationGroup.prototype.register.length property descriptor +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this + value is equal to the largest number of named arguments shown in the + subclause headings for the function description. Optional parameters + (which are indicated with brackets: [ ]) or rest parameters (which + are shown using the form «...name») are not included in the default + argument count. + + Unless otherwise specified, the length property of a built-in + function object has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup.prototype.register, 'length', { + value: 2, + enumerable: false, + writable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/name.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/name.js new file mode 100644 index 000000000000..d70988d2923e --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/name.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: FinalizationGroup.prototype.register.name property descriptor +info: | + FinalizationGroup.prototype.register.name value and property descriptor + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, that is not + identified as an anonymous function has a name property whose value + is a String. Unless otherwise specified, this value is the name that + is given to the function in this specification. For functions that + are specified as properties of objects, the name value is the + property name string used to access the function. [...] + + Unless otherwise specified, the name property of a built-in function + object, if it exists, has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup.prototype.register, 'name', { + value: 'register', + enumerable: false, + writable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/prop-desc.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/prop-desc.js new file mode 100644 index 000000000000..4814634d2ace --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/prop-desc.js @@ -0,0 +1,24 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: > + Property descriptor of FinalizationGroup.prototype.register +info: | + 17 ECMAScript Standard Built-in Objects: + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.register, 'function'); + +verifyProperty(FinalizationGroup.prototype, 'register', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined-register-itself.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined-register-itself.js new file mode 100644 index 000000000000..a507f6eb17c3 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined-register-itself.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: Return undefined after registering itself +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fn = function() {}; +var fg = new FinalizationGroup(fn); + +assert.sameValue(fg.register(fg), undefined, 'Register itself'); +assert.sameValue(fg.register(fg, fg), undefined, 'Register itself with holdings'); +assert.sameValue(fg.register(fg, fg, fg), undefined, 'Register itself with holdings and unregisterToken'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined.js new file mode 100644 index 000000000000..bedf933e000d --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/return-undefined.js @@ -0,0 +1,42 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: Return undefined after registering +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fn = function() {}; +var fg = new FinalizationGroup(fn); + +var target = {}; +assert.sameValue(fg.register(target), undefined, 'Register a targer'); +assert.sameValue(fg.register(target), undefined, 'Register the same target again'); +assert.sameValue(fg.register(target), undefined, 'Register the same target again and again'); + +assert.sameValue(fg.register({}), undefined, 'Register other targets'); + +assert.sameValue(fg.register(target, undefined, {}), undefined, 'Register target with unregisterToken'); +assert.sameValue( + fg.register(target, undefined, target), + undefined, + 'Register target with unregisterToken being the registered target' +); + +assert.sameValue(fg.register(target, undefined, undefined), undefined, 'Register target with explicit undefined unregisterToken'); + +assert.sameValue(fg.register(fn), undefined, 'register the cleanup callback fn'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/target-not-object-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/target-not-object-throws.js new file mode 100644 index 000000000000..f128d11531cd --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/target-not-object-throws.js @@ -0,0 +1,52 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: Throws a TypeError if target is not an Object +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.register, 'function'); + +var fg = new FinalizationGroup(function() {}); + +assert.throws(TypeError, function() { + fg.register(undefined); +}, 'undefined'); + +assert.throws(TypeError, function() { + fg.register(null); +}, 'null'); + +assert.throws(TypeError, function() { + fg.register(true); +}, 'true'); + +assert.throws(TypeError, function() { + fg.register(false); +}, 'false'); + +assert.throws(TypeError, function() { + fg.register(1); +}, 'number'); + +assert.throws(TypeError, function() { + fg.register('object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + fg.register(s); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/this-does-not-have-internal-target-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/this-does-not-have-internal-target-throws.js new file mode 100644 index 000000000000..c1b509a159b0 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/this-does-not-have-internal-target-throws.js @@ -0,0 +1,48 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: Throws a TypeError if this does not have a [[Cells]] internal slot +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + ... +features: [FinalizationGroup, WeakRef] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.register, 'function'); + +var register = FinalizationGroup.prototype.register; +var target = {}; + +assert.throws(TypeError, function() { + register.call({ ['[[Cells]]']: {} }, target); +}, 'Ordinary object without [[Cells]]'); + +assert.throws(TypeError, function() { + register.call(WeakRef.prototype, target); +}, 'WeakRef.prototype does not have a [[Cells]] internal slot'); + +assert.throws(TypeError, function() { + register.call(WeakRef, target); +}, 'WeakRef does not have a [[Cells]] internal slot'); + +var wr = new WeakRef({}); +assert.throws(TypeError, function() { + register.call(wr, target); +}, 'WeakRef instance'); + +var wm = new WeakMap(); +assert.throws(TypeError, function() { + register.call(wm, target); +}, 'WeakMap instance'); + +var ws = new WeakSet(); +assert.throws(TypeError, function() { + register.call(ws, target); +}, 'WeakSet instance'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/this-not-object-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/this-not-object-throws.js new file mode 100644 index 000000000000..7635230b1b8d --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/this-not-object-throws.js @@ -0,0 +1,51 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: Throws a TypeError if this is not an Object +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.register, 'function'); + +var register = FinalizationGroup.prototype.register; + +assert.throws(TypeError, function() { + register.call(undefined, {}); +}, 'undefined'); + +assert.throws(TypeError, function() { + register.call(null, {}); +}, 'null'); + +assert.throws(TypeError, function() { + register.call(true, {}); +}, 'true'); + +assert.throws(TypeError, function() { + register.call(false, {}); +}, 'false'); + +assert.throws(TypeError, function() { + register.call(1, {}); +}, 'number'); + +assert.throws(TypeError, function() { + register.call('object', {}); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + register.call(s, {}); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-not-object-or-undefined-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-not-object-or-undefined-throws.js new file mode 100644 index 000000000000..b0b942ead4d5 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-not-object-or-undefined-throws.js @@ -0,0 +1,48 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: Throws a TypeError if unregisterToken is not an Object or undefined +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.register, 'function'); + +var fg = new FinalizationGroup(function() {}); +var target = {}; + +assert.throws(TypeError, function() { + fg.register(target, undefined, null); +}, 'null'); + +assert.throws(TypeError, function() { + fg.register(target, undefined, true); +}, 'true'); + +assert.throws(TypeError, function() { + fg.register(target, undefined, false); +}, 'false'); + +assert.throws(TypeError, function() { + fg.register(target, undefined, 1); +}, 'number'); + +assert.throws(TypeError, function() { + fg.register(target, undefined, 'object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + fg.register(target, undefined, s); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings-and-target.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings-and-target.js new file mode 100644 index 000000000000..f1dc302f4d7a --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings-and-target.js @@ -0,0 +1,26 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: unregisterToken may be the same as holdings and target +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fg = new FinalizationGroup(function() {}); + +var target = {}; +assert.sameValue(fg.register(target, target, target), undefined); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings.js new file mode 100644 index 000000000000..7c498bc04f03 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-holdings.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: unregisterToken may be the same as holdings +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fg = new FinalizationGroup(function() {}); + +var target = {}; +var holdings = {}; +assert.sameValue(fg.register(target, holdings, holdings), undefined); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-target.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-target.js new file mode 100644 index 000000000000..20fe2e05631c --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/register/unregisterToken-same-as-target.js @@ -0,0 +1,26 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.register +description: unregisterToken may be the same as target +info: | + FinalizationGroup.prototype.register ( target , holdings [, unregisterToken ] ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If Type(target) is not Object, throw a TypeError exception. + 4. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 5. If Type(unregisterToken) is not Object, + a. If unregisterToken is not undefined, throw a TypeError exception. + b. Set unregisterToken to empty. + 6. Let cell be the Record { [[Target]] : target, [[Holdings]]: holdings, [[UnregisterToken]]: unregisterToken }. + 7. Append cell to finalizationGroup.[[Cells]]. + 8. Return undefined. +features: [FinalizationGroup] +---*/ + +var fg = new FinalizationGroup(function() {}); + +var target = {}; +assert.sameValue(fg.register(target, '1', target), undefined); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/custom-this.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/custom-this.js new file mode 100644 index 000000000000..1534707a0246 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/custom-this.js @@ -0,0 +1,47 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: Return values applying custom this +info: | + FinalizationGroup.prototype.unregister ( unregisterToken ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If Type(unregisterToken) is not Object, throw a TypeError exception. + 5. Let removed be false. + 6. For each Record { [[Target]], [[Holdings]], [[UnregisterToken]] } cell that is an element of finalizationGroup.[[Cells]], do + a. If SameValue(cell.[[UnregisterToken]], unregisterToken) is true, then + i. Remove cell from finalizationGroup.[[Cells]]. + ii. Set removed to true. + 7. Return removed. +features: [FinalizationGroup] +---*/ + +var fn = function() {}; +var unregister = FinalizationGroup.prototype.unregister; +var fg = new FinalizationGroup(fn); + +var target1 = {}; +var target2 = {}; +var target3 = {}; +var token1 = {}; +var token2 = {}; + +assert.sameValue(unregister.call(fg, token1), false, 'unregistering token1 from empty fg'); +assert.sameValue(unregister.call(fg, token2), false, 'unregistering token2 from empty fg'); + +fg.register(target1, undefined, token1); +fg.register(target2, undefined, token2); +fg.register(target3, undefined, token2); + +assert.sameValue(unregister.call(fg, target1), false, 'own target does not work on unregister, #1'); +assert.sameValue(unregister.call(fg, target2), false, 'own target does not work on unregister, #2'); +assert.sameValue(unregister.call(fg, target3), false, 'own target does not work on unregister, #3'); + +assert.sameValue(unregister.call(fg, token1), true, 'unregistering token1 from fg'); +assert.sameValue(unregister.call(fg, token1), false, 'unregistering token1 again from fg'); +assert.sameValue(unregister.call(fg, token2), true, 'unregistering token2 to remove target2 and target3'); +assert.sameValue(unregister.call(fg, token2), false, 'unregistering token2 from empty fg'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/length.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/length.js new file mode 100644 index 000000000000..b3a1df3d88b3 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/length.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: FinalizationGroup.prototype.unregister.length property descriptor +info: | + FinalizationGroup.prototype.unregister ( unregisterToken ) + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this + value is equal to the largest number of named arguments shown in the + subclause headings for the function description. Optional parameters + (which are indicated with brackets: [ ]) or rest parameters (which + are shown using the form «...name») are not included in the default + argument count. + + Unless otherwise specified, the length property of a built-in + function object has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup.prototype.unregister, 'length', { + value: 1, + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/name.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/name.js new file mode 100644 index 000000000000..94db099a2387 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/name.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: FinalizationGroup.prototype.unregister.name property descriptor +info: | + FinalizationGroup.prototype.unregister.name value and property descriptor + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, that is not + identified as an anonymous function has a name property whose value + is a String. Unless otherwise specified, this value is the name that + is given to the function in this specification. For functions that + are specified as properties of objects, the name value is the + property name string used to access the function. [...] + + Unless otherwise specified, the name property of a built-in function + object, if it exists, has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +verifyProperty(FinalizationGroup.prototype.unregister, 'name', { + value: 'unregister', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/prop-desc.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/prop-desc.js new file mode 100644 index 000000000000..fa2e487a077c --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/prop-desc.js @@ -0,0 +1,24 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: > + Property descriptor of FinalizationGroup.prototype.unregister +info: | + 17 ECMAScript Standard Built-in Objects: + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.unregister, 'function'); + +verifyProperty(FinalizationGroup.prototype, 'unregister', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/this-does-not-have-internal-cells-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/this-does-not-have-internal-cells-throws.js new file mode 100644 index 000000000000..eff37a272c9b --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/this-does-not-have-internal-cells-throws.js @@ -0,0 +1,48 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: Throws a TypeError if this does not have a [[Cells]] internal slot +info: | + FinalizationGroup.prototype.unregister ( unregisterToken ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If Type(unregisterToken) is not Object, throw a TypeError exception. + ... +features: [FinalizationGroup, WeakRef] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.unregister, 'function'); + +var unregister = FinalizationGroup.prototype.unregister; +var token = {}; + +assert.throws(TypeError, function() { + unregister.call({ ['[[Cells]]']: {} }, token); +}, 'Ordinary object without [[Cells]]'); + +assert.throws(TypeError, function() { + unregister.call(WeakRef.prototype, token); +}, 'WeakRef.prototype does not have a [[Cells]] internal slot'); + +assert.throws(TypeError, function() { + unregister.call(WeakRef, token); +}, 'WeakRef does not have a [[Cells]] internal slot'); + +var wr = new WeakRef({}); +assert.throws(TypeError, function() { + unregister.call(wr, token); +}, 'WeakRef instance'); + +var wm = new WeakMap(); +assert.throws(TypeError, function() { + unregister.call(wm, token); +}, 'WeakMap instance'); + +var ws = new WeakSet(); +assert.throws(TypeError, function() { + unregister.call(ws, token); +}, 'WeakSet instance'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/this-not-object-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/this-not-object-throws.js new file mode 100644 index 000000000000..63da68aac682 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/this-not-object-throws.js @@ -0,0 +1,49 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: Throws a TypeError if this is not an Object +info: | + FinalizationGroup.prototype.unregister ( unregisterToken ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If Type(unregisterToken) is not Object, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.unregister, 'function'); + +var unregister = FinalizationGroup.prototype.unregister; + +assert.throws(TypeError, function() { + unregister.call(undefined, {}); +}, 'undefined'); + +assert.throws(TypeError, function() { + unregister.call(null, {}); +}, 'null'); + +assert.throws(TypeError, function() { + unregister.call(true, {}); +}, 'true'); + +assert.throws(TypeError, function() { + unregister.call(false, {}); +}, 'false'); + +assert.throws(TypeError, function() { + unregister.call(1, {}); +}, 'number'); + +assert.throws(TypeError, function() { + unregister.call('object', {}); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + unregister.call(s, {}); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/unregister.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/unregister.js new file mode 100644 index 000000000000..703415c36190 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/unregister.js @@ -0,0 +1,56 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: Return boolean values indicating unregistering of values from given token +info: | + FinalizationGroup.prototype.unregister ( unregisterToken ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If Type(unregisterToken) is not Object, throw a TypeError exception. + 5. Let removed be false. + 6. For each Record { [[Target]], [[Holdings]], [[UnregisterToken]] } cell that is an element of finalizationGroup.[[Cells]], do + a. If SameValue(cell.[[UnregisterToken]], unregisterToken) is true, then + i. Remove cell from finalizationGroup.[[Cells]]. + ii. Set removed to true. + 7. Return removed. +features: [FinalizationGroup] +---*/ + +var fn = function() {}; +var fg = new FinalizationGroup(fn); + +var target1 = {}; +var target2 = {}; +var target3 = {}; +var token1 = {}; +var token2 = {}; + +assert.sameValue(fg.unregister(token1), false, 'unregistering token1 from empty fg'); +assert.sameValue(fg.unregister(token2), false, 'unregistering token2 from empty fg'); + +fg.register(target1, undefined, token1); +fg.register(target1, undefined, token1); // Repeat registering un purpose +fg.register(target2, undefined, token2); +fg.register(target3, undefined, token2); + +assert.sameValue(fg.unregister(target1), false, 'own target does not work on unregister, #1'); +assert.sameValue(fg.unregister(target2), false, 'own target does not work on unregister, #2'); +assert.sameValue(fg.unregister(target3), false, 'own target does not work on unregister, #3'); + +assert.sameValue(fg.unregister(token1), true, 'unregistering token1 from fg'); +assert.sameValue(fg.unregister(token1), false, 'unregistering token1 again from fg'); +assert.sameValue(fg.unregister(token2), true, 'unregistering token2 to remove target2 and target3'); +assert.sameValue(fg.unregister(token2), false, 'unregistering token2 from empty fg'); + +// Notice these assertions take advantage of adding targets previously added with a token, +// but now they got no token so it won't be used to remove them. +fg.register(target1, token1); // holdings, not unregisterToken +fg.register(target2, token2); // holdings, not unregisterToken +fg.register(target3); + +assert.sameValue(fg.unregister(token1), false, 'nothing to remove without a set unregisterToken #1'); +assert.sameValue(fg.unregister(token2), false, 'nothing to remove without a set unregisterToken #2'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/unregisterToken-not-object-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/unregisterToken-not-object-throws.js new file mode 100644 index 000000000000..de3b8ef59818 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/prototype/unregister/unregisterToken-not-object-throws.js @@ -0,0 +1,49 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group.prototype.unregister +description: Throws a TypeError if unregisterToken is not an Object +info: | + FinalizationGroup.prototype.unregister ( unregisterToken ) + + 1. Let finalizationGroup be the this value. + 2. If Type(finalizationGroup) is not Object, throw a TypeError exception. + 3. If finalizationGroup does not have a [[Cells]] internal slot, throw a TypeError exception. + 4. If Type(unregisterToken) is not Object, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue(typeof FinalizationGroup.prototype.unregister, 'function'); + +var fg = new FinalizationGroup(function() {}); + +assert.throws(TypeError, function() { + fg.unregister(undefined); +}, 'undefined'); + +assert.throws(TypeError, function() { + fg.unregister(null); +}, 'null'); + +assert.throws(TypeError, function() { + fg.unregister(true); +}, 'true'); + +assert.throws(TypeError, function() { + fg.unregister(false); +}, 'false'); + +assert.throws(TypeError, function() { + fg.unregister(1); +}, 'number'); + +assert.throws(TypeError, function() { + fg.unregister('object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + fg.unregister(s); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/returns-new-object-from-constructor.js b/JSTests/test262/test/built-ins/FinalizationGroup/returns-new-object-from-constructor.js new file mode 100644 index 000000000000..c63f6c5ebf88 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/returns-new-object-from-constructor.js @@ -0,0 +1,39 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + Returns a new ordinary object from the FinalizationGroup constructor +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). +features: [FinalizationGroup, for-of] +---*/ + +var cleanupCallback = function() {}; +var fg = new FinalizationGroup(cleanupCallback); + +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype); +assert.notSameValue(fg, cleanupCallback, 'does not return the same function'); +assert.sameValue(fg instanceof FinalizationGroup, true, 'instanceof'); + +for (let key of Object.getOwnPropertyNames(fg)) { + assert(false, `should not set any own named properties: ${key}`); +} + +for (let key of Object.getOwnPropertySymbols(fg)) { + assert(false, `should not set any own symbol properties: ${String(key)}`); +} + +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/target-not-callable-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/target-not-callable-throws.js new file mode 100644 index 000000000000..d71fbe558256 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/target-not-callable-throws.js @@ -0,0 +1,69 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + Throws a TypeError if target is not callable +info: | + FinalizationGroup ( cleanupCallback ) + + 1. If NewTarget is undefined, throw a TypeError exception. + 2. If IsCallable(cleanupCallback) is false, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue( + typeof FinalizationGroup, 'function', + 'typeof FinalizationGroup is function' +); + +assert.throws(TypeError, function() { + new FinalizationGroup({}); +}, 'ordinary object'); + +assert.throws(TypeError, function() { + new FinalizationGroup(WeakRef.prototype); +}, 'WeakRef.prototype'); + +assert.throws(TypeError, function() { + new FinalizationGroup(FinalizationGroup.prototype); +}, 'FinalizationGroup.prototype'); + +assert.throws(TypeError, function() { + new FinalizationGroup([]); +}, 'Array'); + +assert.throws(TypeError, function() { + new FinalizationGroup(); +}, 'implicit undefined'); + +assert.throws(TypeError, function() { + new FinalizationGroup(undefined); +}, 'explicit undefined'); + +assert.throws(TypeError, function() { + new FinalizationGroup(null); +}, 'null'); + +assert.throws(TypeError, function() { + new FinalizationGroup(1); +}, 'number'); + +assert.throws(TypeError, function() { + new FinalizationGroup('Object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + new FinalizationGroup(s); +}, 'symbol'); + +assert.throws(TypeError, function() { + new FinalizationGroup(true); +}, 'Boolean, true'); + +assert.throws(TypeError, function() { + new FinalizationGroup(false); +}, 'Boolean, false'); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/undefined-newtarget-throws.js b/JSTests/test262/test/built-ins/FinalizationGroup/undefined-newtarget-throws.js new file mode 100644 index 000000000000..6f402734864a --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/undefined-newtarget-throws.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + Throws a TypeError if NewTarget is undefined. +info: | + FinalizationGroup ( cleanupCallback ) + + 1. If NewTarget is undefined, throw a TypeError exception. + 2. If IsCallable(cleanupCallback) is false, throw a TypeError exception. + ... +features: [FinalizationGroup] +---*/ + +assert.sameValue( + typeof FinalizationGroup, 'function', + 'typeof FinalizationGroup is function' +); + +assert.throws(TypeError, function() { + FinalizationGroup(); +}); + +assert.throws(TypeError, function() { + FinalizationGroup(function() {}); +}); diff --git a/JSTests/test262/test/built-ins/FinalizationGroup/unnaffected-by-poisoned-cleanupCallback.js b/JSTests/test262/test/built-ins/FinalizationGroup/unnaffected-by-poisoned-cleanupCallback.js new file mode 100644 index 000000000000..5b1d1cf91116 --- /dev/null +++ b/JSTests/test262/test/built-ins/FinalizationGroup/unnaffected-by-poisoned-cleanupCallback.js @@ -0,0 +1,33 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-finalization-group-target +description: > + Normal completion even if the cleanupCallback fn is poisoned +info: | + FinalizationGroup ( cleanupCallback ) + + ... + 3. Let finalizationGroup be ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationGroupPrototype%", « [[Realm]], [[CleanupCallback]], [[Cells]], [[IsFinalizationGroupCleanupJobActive]] »). + ... + 9. Return finalizationGroup. +features: [FinalizationGroup] +---*/ + +var cleanupCallback = function() { throw new Test262Error('should not throw yet'); }; +var fg = new FinalizationGroup(cleanupCallback); + +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype); +assert.notSameValue(fg, cleanupCallback, 'does not return the same function'); +assert.sameValue(fg instanceof FinalizationGroup, true, 'instanceof'); + +for (let key of Object.getOwnPropertyNames(fg)) { + assert(false, `should not set any own named properties: ${key}`); +} + +for (let key of Object.getOwnPropertySymbols(fg)) { + assert(false, `should not set any own symbol properties: ${String(key)}`); +} + +assert.sameValue(Object.getPrototypeOf(fg), FinalizationGroup.prototype); diff --git a/JSTests/test262/test/built-ins/Function/StrictFunction_restricted-properties.js b/JSTests/test262/test/built-ins/Function/StrictFunction_restricted-properties.js index 37f7945d4aca..cd7e1d3c604a 100644 --- a/JSTests/test262/test/built-ins/Function/StrictFunction_restricted-properties.js +++ b/JSTests/test262/test/built-ins/Function/StrictFunction_restricted-properties.js @@ -1,7 +1,7 @@ // Copyright (C) 2015 Caitlin Potter. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. -/*--- +/*--- description: > ECMAScript Function objects defined using syntactic constructors in strict mode code do not have own properties "caller" or diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A10.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A10.js deleted file mode 100644 index 244c35acd777..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A10.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: The Function.prototype.apply.length property has the attribute ReadOnly -es5id: 15.3.4.3_A10 -description: > - Checking if varying the Function.prototype.apply.length property - fails -includes: [propertyHelper.js] ----*/ - -//CHECK#1 -if (!(Function.prototype.apply.hasOwnProperty('length'))) { - $ERROR('#1: the Function.prototype.apply has length property.'); -} - -var obj = Function.prototype.apply.length; - -verifyNotWritable(Function.prototype.apply, "length", null, function() { - return "shifted"; -}); - -//CHECK#2 -if (Function.prototype.apply.length !== obj) { - $ERROR('#2: the Function.prototype.apply length property has the attributes ReadOnly.'); -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A11.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A11.js deleted file mode 100644 index dcab5610c10f..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A11.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: The Function.prototype.apply.length property has the attribute DontEnum -es5id: 15.3.4.3_A11 -description: > - TChecking if enumerating the Function.prototype.apply.length - property fails ----*/ - -//CHECK#0 -if (!(Function.prototype.apply.hasOwnProperty('length'))) { - $ERROR('#0: the Function.prototype.apply has length property.'); -} - - -// CHECK#1 -if (Function.prototype.apply.propertyIsEnumerable('length')) { - $ERROR('#1: the Function.prototype.apply.length property has the attributes DontEnum'); -} - -// CHECK#2 -for (var p in Function.prototype.apply) { - if (p === "length") - $ERROR('#2: the Function.prototype.apply.length property has the attributes DontEnum'); -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A13.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A13.js deleted file mode 100644 index 348c650fda6f..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A13.js +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2011 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -es5id: 15.3.4.3_A13 -description: If IsCallable(func) is false, then throw a TypeError exception. ----*/ - -assert.throws(TypeError, function() { - Function.prototype.apply.call(undefined, {}, []); -}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A14.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A14.js deleted file mode 100644 index dc8bb33ff50d..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A14.js +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2011 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -es5id: 15.3.4.3_A14 -description: If IsCallable(func) is false, then throw a TypeError exception. ----*/ - -assert.throws(TypeError, function() { - Function.prototype.apply.call(null, {}, []); -}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A15.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A15.js deleted file mode 100644 index c2ff028f75be..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A15.js +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2011 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -es5id: 15.3.4.3_A15 -description: If IsCallable(func) is false, then throw a TypeError exception. ----*/ - -assert.throws(TypeError, function() { - Function.prototype.apply.call({}, {}, []); -}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A16.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A16.js deleted file mode 100644 index bf25dfed354d..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A16.js +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2011 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: If IsCallable(func) is false, then throw a TypeError exception. -es5id: 15.3.4.3_A16 -description: > - A RegExp is not a function, but it may be callable. Iff it is, - it's typeof should be 'function', in which case apply should - accept it as a valid this value. ----*/ - -var re = (/x/); -if (typeof re === 'function') { - Function.prototype.apply.call(re, undefined, ['x']); -} else { - try { - Function.prototype.bind.call(re, undefined); - $ERROR('#1: If IsCallable(func) is false, ' + - 'then (bind should) throw a TypeError exception'); - } catch (e) { - if (!(e instanceof TypeError)) { - $ERROR('#1: TypeError expected. Actual: ' + e); - } - } -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A2_T1.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A2_T1.js deleted file mode 100644 index 7a5bb8ac94a5..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A2_T1.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: The length property of the apply method is 2 -es5id: 15.3.4.3_A2_T1 -description: Checking Function.prototype.apply.length ----*/ - -//CHECK#1 -if (typeof Function.prototype.apply !== "function") { - $ERROR('#1: apply method defined'); -} - -//CHECK#2 -if (typeof Function.prototype.apply.length === "undefined") { - $ERROR('#2: length property of apply method defined'); -} - -//CHECK#3 -if (Function.prototype.apply.length !== 2) { - $ERROR('#3: The length property of the apply method is 2'); -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A2_T2.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A2_T2.js deleted file mode 100644 index 872e46597558..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A2_T2.js +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: The length property of the apply method is 2 -es5id: 15.3.4.3_A2_T2 -description: Checking f.apply.length, where f is new Function ----*/ - -var f = new Function; - -//CHECK#1 -if (typeof f.apply !== "function") { - $ERROR('#1: apply method accessed'); -} - -//CHECK#2 -if (typeof f.apply.length === "undefined") { - $ERROR('#2: length property of apply method defined'); -} - -//CHECK#3 -if (f.apply.length !== 2) { - $ERROR('#3: The length property of the apply method is 2'); -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A6_T2.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A6_T2.js deleted file mode 100644 index a21265dd3243..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A6_T2.js +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - if argArray is neither an array nor an arguments object (see 10.1.8), a - TypeError exception is thrown -es5id: 15.3.4.3_A6_T2 -description: argArray is (null,1) ----*/ - -//CHECK#1 -try { - Function().apply(null, 1); - $ERROR('#1: if argArray is neither an array nor an arguments object (see 10.1.8), a TypeError exception is thrown'); -} catch (e) { - if (!(e instanceof TypeError)) { - $ERROR('#1.1: if argArray is neither an array nor an arguments object (see 10.1.8), a TypeError exception is thrown'); - } -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A6_T3.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A6_T3.js deleted file mode 100644 index 313e89d794ed..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A6_T3.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - if argArray is neither an array nor an arguments object (see 10.1.8), a - TypeError exception is thrown -es5id: 15.3.4.3_A6_T3 -description: argArray is (object,"1,3,4") ----*/ - -var obj = {}; - -//CHECK#1 -try { - Function().apply(obj, "1,3,4"); - $ERROR('#1: if argArray is neither an array nor an arguments object (see 10.1.8), a TypeError exception is thrown'); -} catch (e) { - if (!(e instanceof TypeError)) { - $ERROR('#1.1: if argArray is neither an array nor an arguments object (see 10.1.8), a TypeError exception is thrown'); - } -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A9.js b/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A9.js deleted file mode 100644 index 5e8f438f28c8..000000000000 --- a/JSTests/test262/test/built-ins/Function/prototype/apply/S15.3.4.3_A9.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - The Function.prototype.apply.length property does not have the attribute - DontDelete -es5id: 15.3.4.3_A9 -description: > - Checking if deleting the Function.prototype.apply.length property - fails ----*/ - -//CHECK#0 -if (!(Function.prototype.apply.hasOwnProperty('length'))) { - $ERROR('#0: the Function.prototype.apply has length property'); -} - -//CHECK#1 -if (!delete Function.prototype.apply.length) { - $ERROR('#1: The Function.prototype.apply.length property does not have the attributes DontDelete'); -} - -//CHECK#2 -if (Function.prototype.apply.hasOwnProperty('length')) { - $ERROR('#2: The Function.prototype.apply.length property does not have the attributes DontDelete'); -} diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/argarray-not-object-realm.js b/JSTests/test262/test/built-ins/Function/prototype/apply/argarray-not-object-realm.js new file mode 100644 index 000000000000..9e24578eee28 --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/apply/argarray-not-object-realm.js @@ -0,0 +1,38 @@ +// Copyright 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-function.prototype.apply +description: > + Throws a TypeError exception if argArray is not an object + (honoring the Realm of the current execution context) +info: | + Function.prototype.apply ( thisArg, argArray ) + + [...] + 4. Let argList be ? CreateListFromArrayLike(argArray). + + CreateListFromArrayLike ( obj [ , elementTypes ] ) + + [...] + 2. If Type(obj) is not Object, throw a TypeError exception. +features: [cross-realm] +---*/ + +var other = $262.createRealm().global; +var fn = new other.Function(); + +assert.throws(other.TypeError, function() { + fn.apply(null, false); +}); + +assert.throws(other.TypeError, function() { + fn.apply(null, 1234.5678); +}); + +assert.throws(other.TypeError, function() { + fn.apply(null, ''); +}); + +assert.throws(other.TypeError, function() { + fn.apply(null, Symbol('desc')); +}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/argarray-not-object.js b/JSTests/test262/test/built-ins/Function/prototype/apply/argarray-not-object.js new file mode 100644 index 000000000000..6b17b747b656 --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/apply/argarray-not-object.js @@ -0,0 +1,35 @@ +// Copyright 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-function.prototype.apply +description: > + Throws a TypeError exception if argArray is not an object +info: | + Function.prototype.apply ( thisArg, argArray ) + + [...] + 4. Let argList be ? CreateListFromArrayLike(argArray). + + CreateListFromArrayLike ( obj [ , elementTypes ] ) + + [...] + 2. If Type(obj) is not Object, throw a TypeError exception. +---*/ + +function fn() {} + +assert.throws(TypeError, function() { + fn.apply(null, true); +}); + +assert.throws(TypeError, function() { + fn.apply(null, NaN); +}); + +assert.throws(TypeError, function() { + fn.apply(null, '1,2,3'); +}); + +assert.throws(TypeError, function() { + fn.apply(null, Symbol()); +}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/get-index-abrupt.js b/JSTests/test262/test/built-ins/Function/prototype/apply/get-index-abrupt.js new file mode 100644 index 000000000000..9c493d174221 --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/apply/get-index-abrupt.js @@ -0,0 +1,31 @@ +// Copyright 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-function.prototype.apply +description: > + Return abrupt completion from Get(obj, indexName) +info: | + Function.prototype.apply ( thisArg, argArray ) + + [...] + 4. Let argList be ? CreateListFromArrayLike(argArray). + + CreateListFromArrayLike ( obj [ , elementTypes ] ) + + [...] + 6. Repeat, while index < len + a. Let indexName be ! ToString(index). + b. Let next be ? Get(obj, indexName). +---*/ + +var arrayLike = { + length: 2, + 0: 0, + get 1() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + (function() {}).apply(null, arrayLike); +}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/get-length-abrupt.js b/JSTests/test262/test/built-ins/Function/prototype/apply/get-length-abrupt.js new file mode 100644 index 000000000000..956f58a27665 --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/apply/get-length-abrupt.js @@ -0,0 +1,27 @@ +// Copyright 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-function.prototype.apply +description: > + Return abrupt completion from Get(obj, "length") +info: | + Function.prototype.apply ( thisArg, argArray ) + + [...] + 4. Let argList be ? CreateListFromArrayLike(argArray). + + CreateListFromArrayLike ( obj [ , elementTypes ] ) + + [...] + 3. Let len be ? ToLength(? Get(obj, "length")). +---*/ + +var arrayLike = { + get length() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + (function() {}).apply(null, arrayLike); +}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/length.js b/JSTests/test262/test/built-ins/Function/prototype/apply/length.js new file mode 100644 index 000000000000..1e264405dff8 --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/apply/length.js @@ -0,0 +1,26 @@ +// Copyright 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-function.prototype.apply +description: > + Function.prototype.apply.length is 2. +info: | + ECMAScript Standard Built-in Objects + ... + Every built-in Function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this value + is equal to the largest number of named arguments shown in the subclause + headings for the function description, including optional parameters. + ... + Unless otherwise specified, the length property of a built-in Function + object has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: true }. +includes: [propertyHelper.js] +---*/ + +verifyProperty(Function.prototype.apply, 'length', { + value: 2, + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/this-not-callable-realm.js b/JSTests/test262/test/built-ins/Function/prototype/apply/this-not-callable-realm.js new file mode 100644 index 000000000000..0d951bce242d --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/apply/this-not-callable-realm.js @@ -0,0 +1,33 @@ +// Copyright 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-function.prototype.apply +description: > + Throws a TypeError exception if this value is not callable + (honoring the Realm of the current execution context) +info: | + Function.prototype.apply ( thisArg, argArray ) + + 1. Let func be the this value. + 2. If IsCallable(func) is false, throw a TypeError exception. +features: [cross-realm] +---*/ + +var other = $262.createRealm().global; +var otherApply = other.Function.prototype.apply; + +assert.throws(other.TypeError, function() { + otherApply.call(undefined, {}, []); +}); + +assert.throws(other.TypeError, function() { + otherApply.call(null, {}, []); +}); + +assert.throws(other.TypeError, function() { + otherApply.call({}, {}, []); +}); + +assert.throws(other.TypeError, function() { + otherApply.call(/re/, {}, []); +}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/apply/this-not-callable.js b/JSTests/test262/test/built-ins/Function/prototype/apply/this-not-callable.js new file mode 100644 index 000000000000..2f0a32a69cd3 --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/apply/this-not-callable.js @@ -0,0 +1,28 @@ +// Copyright 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-function.prototype.apply +description: > + Throws a TypeError exception if this value is not callable +info: | + Function.prototype.apply ( thisArg, argArray ) + + 1. Let func be the this value. + 2. If IsCallable(func) is false, throw a TypeError exception. +---*/ + +assert.throws(TypeError, function() { + Function.prototype.apply.call(undefined, {}, []); +}); + +assert.throws(TypeError, function() { + Function.prototype.apply.call(null, {}, []); +}); + +assert.throws(TypeError, function() { + Function.prototype.apply.call({}, {}, []); +}); + +assert.throws(TypeError, function() { + Function.prototype.apply.call(/re/, {}, []); +}); diff --git a/JSTests/test262/test/built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js b/JSTests/test262/test/built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js index 0db2015cb3ee..770022302489 100644 --- a/JSTests/test262/test/built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js +++ b/JSTests/test262/test/built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js @@ -1,7 +1,7 @@ // Copyright (C) 2015 Caitlin Potter. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. -/*--- +/*--- description: > Functions created using Function.prototype.bind() do not have own properties "caller" or "arguments", but inherit them from diff --git a/JSTests/test262/test/built-ins/Function/prototype/bind/get-fn-realm-recursive.js b/JSTests/test262/test/built-ins/Function/prototype/bind/get-fn-realm-recursive.js new file mode 100644 index 000000000000..7e91dbdf494f --- /dev/null +++ b/JSTests/test262/test/built-ins/Function/prototype/bind/get-fn-realm-recursive.js @@ -0,0 +1,25 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-getfunctionrealm +description: > + The realm of a bound function exotic object is the realm of its target + function. GetFunctionRealm is called recursively. +info: | + 7.3.22 GetFunctionRealm ( obj ) + + [...] + 2. If obj has a [[Realm]] internal slot, then + a. Return obj.[[Realm]]. + 3. If obj is a Bound Function exotic object, then + a. Let target be obj.[[BoundTargetFunction]]. + b. Return ? GetFunctionRealm(target). +features: [cross-realm] +---*/ + +var other = $262.createRealm().global; +var C = new other.Function(); +C.prototype = null; +var B = C.bind().bind(); + +assert.sameValue(Object.getPrototypeOf(new B()), other.Object.prototype); diff --git a/JSTests/test262/test/built-ins/Function/prototype/bind/get-fn-realm.js b/JSTests/test262/test/built-ins/Function/prototype/bind/get-fn-realm.js index 104aac2eabf4..4bdaa88faaba 100644 --- a/JSTests/test262/test/built-ins/Function/prototype/bind/get-fn-realm.js +++ b/JSTests/test262/test/built-ins/Function/prototype/bind/get-fn-realm.js @@ -7,17 +7,20 @@ description: > The realm of a bound function exotic object is the realm of its target function info: | + 7.3.22 GetFunctionRealm ( obj ) + [...] 2. If obj has a [[Realm]] internal slot, then - a, Return obj's [[Realm]] internal slot. + a. Return obj.[[Realm]]. 3. If obj is a Bound Function exotic object, then - a. Let target be obj's [[BoundTargetFunction]] internal slot. + a. Let target be obj.[[BoundTargetFunction]]. b. Return ? GetFunctionRealm(target). features: [cross-realm] ---*/ var other = $262.createRealm().global; var C = new other.Function(); -var B = Function.prototype.bind.call(C); +C.prototype = null; +var B = C.bind(); -assert.sameValue(Object.getPrototypeOf(new B()), C.prototype); +assert.sameValue(Object.getPrototypeOf(new B()), other.Object.prototype); diff --git a/JSTests/test262/test/built-ins/Function/prototype/restricted-property-arguments.js b/JSTests/test262/test/built-ins/Function/prototype/restricted-property-arguments.js index 1faf047bafe0..9e114df208ef 100644 --- a/JSTests/test262/test/built-ins/Function/prototype/restricted-property-arguments.js +++ b/JSTests/test262/test/built-ins/Function/prototype/restricted-property-arguments.js @@ -1,7 +1,7 @@ // Copyright (C) 2015 Caitlin Potter. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. -/*--- +/*--- description: Intrinsic %FunctionPrototype% has poisoned own property "arguments" includes: - propertyHelper.js diff --git a/JSTests/test262/test/built-ins/Function/prototype/restricted-property-caller.js b/JSTests/test262/test/built-ins/Function/prototype/restricted-property-caller.js index e069ee7c9fab..414aad6d9915 100644 --- a/JSTests/test262/test/built-ins/Function/prototype/restricted-property-caller.js +++ b/JSTests/test262/test/built-ins/Function/prototype/restricted-property-caller.js @@ -1,7 +1,7 @@ // Copyright (C) 2015 Caitlin Potter. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. -/*--- +/*--- description: Intrinsic %FunctionPrototype% has poisoned own property "caller" includes: - propertyHelper.js diff --git a/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-1.js b/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-1.js deleted file mode 100644 index 2bb777949219..000000000000 --- a/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-1.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2012 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - This test should be run without any built-ins being added/augmented. - The name JSON must be bound to an object. - Section 15 says that every built-in Function object described in this - section � whether as a constructor, an ordinary function, or both � has - a length property whose value is an integer. Unless otherwise specified, - this value is equal to the largest number of named arguments shown in - the section headings for the function description, including optional - parameters. - This default applies to JSON.parse, and it must exist as a function - taking 2 parameters. -es5id: 15.12.2-0-1 -description: JSON.parse must exist as a function ----*/ - -var f = JSON.parse; - -assert.sameValue(typeof(f), "function", 'typeof(f)'); diff --git a/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-2.js b/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-2.js deleted file mode 100644 index fe9569381de2..000000000000 --- a/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-2.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2012 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - This test should be run without any built-ins being added/augmented. - The name JSON must be bound to an object. - Section 15 says that every built-in Function object described in this - section � whether as a constructor, an ordinary function, or both � has - a length property whose value is an integer. Unless otherwise specified, - this value is equal to the largest number of named arguments shown in - the section headings for the function description, including optional - parameters. - This default applies to JSON.parse, and it must exist as a function - taking 2 parameters. -es5id: 15.12.2-0-2 -description: JSON.parse must exist as a function taking 2 parameters ----*/ - -var f = JSON.parse; - -assert.sameValue(typeof(f), "function", 'typeof(f)'); -assert.sameValue(f.length, 2, 'f.length'); diff --git a/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-3.js b/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-3.js deleted file mode 100644 index de7d3f825ef4..000000000000 --- a/JSTests/test262/test/built-ins/JSON/parse/15.12.2-0-3.js +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2012 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - This test should be run without any built-ins being added/augmented. - The initial value of [[Configurable]] on JSON is true. This means we - should be able to delete (8.6.2.5) the stringify and parse properties. -es5id: 15.12.2-0-3 -description: JSON.parse must be deletable (configurable) ----*/ - -var o = JSON; -var desc = Object.getOwnPropertyDescriptor(o, "parse"); - -assert.sameValue(desc.configurable, true, 'desc.configurable'); diff --git a/JSTests/test262/test/built-ins/JSON/parse/builtin.js b/JSTests/test262/test/built-ins/JSON/parse/builtin.js new file mode 100644 index 000000000000..70adc232c615 --- /dev/null +++ b/JSTests/test262/test/built-ins/JSON/parse/builtin.js @@ -0,0 +1,19 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-json.parse +description: > + Requirements for built-in functions, defined in introduction of chapter 17, + are satisfied. +includes: [isConstructor.js] +features: [Reflect.construct] +---*/ + +var parse = JSON.parse; +assert(Object.isExtensible(parse)); +assert.sameValue(typeof parse, 'function'); +assert.sameValue(Object.prototype.toString.call(parse), '[object Function]'); +assert.sameValue(Object.getPrototypeOf(parse), Function.prototype); + +assert.sameValue(parse.hasOwnProperty('prototype'), false); +assert.sameValue(isConstructor(parse), false); diff --git a/JSTests/test262/test/built-ins/JSON/parse/length.js b/JSTests/test262/test/built-ins/JSON/parse/length.js new file mode 100644 index 000000000000..92efc36fb476 --- /dev/null +++ b/JSTests/test262/test/built-ins/JSON/parse/length.js @@ -0,0 +1,25 @@ +// Copyright (C) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-json.parse +description: > + JSON.parse.length is 2. +info: | + JSON.parse ( text [ , reviver ] ) + + The "length" property of the parse function is 2. + + ECMAScript Standard Built-in Objects + + Unless otherwise specified, the length property of a built-in Function + object has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: true }. +includes: [propertyHelper.js] +---*/ + +verifyProperty(JSON.parse, 'length', { + value: 2, + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/JSON/parse/name.js b/JSTests/test262/test/built-ins/JSON/parse/name.js index 9ce452ef3c54..46fb88ec9358 100644 --- a/JSTests/test262/test/built-ins/JSON/parse/name.js +++ b/JSTests/test262/test/built-ins/JSON/parse/name.js @@ -2,6 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-json.parse es6id: 24.3.1 description: > JSON.parse.name is "parse". @@ -19,8 +20,9 @@ info: | includes: [propertyHelper.js] ---*/ -assert.sameValue(JSON.parse.name, "parse"); - -verifyNotEnumerable(JSON.parse, "name"); -verifyNotWritable(JSON.parse, "name"); -verifyConfigurable(JSON.parse, "name"); +verifyProperty(JSON.parse, 'name', { + value: 'parse', + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/JSON/parse/prop-desc.js b/JSTests/test262/test/built-ins/JSON/parse/prop-desc.js new file mode 100644 index 000000000000..ce67eb8dab5a --- /dev/null +++ b/JSTests/test262/test/built-ins/JSON/parse/prop-desc.js @@ -0,0 +1,20 @@ +// Copyright (C) 2012 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-json.parse +description: > + Property descriptor of JSON.parse. +info: | + ECMAScript Standard Built-in Objects + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +---*/ + +verifyProperty(JSON, 'parse', { + writable: true, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/JSON/parse/text-negative-zero.js b/JSTests/test262/test/built-ins/JSON/parse/text-negative-zero.js new file mode 100644 index 000000000000..f9289a916bf5 --- /dev/null +++ b/JSTests/test262/test/built-ins/JSON/parse/text-negative-zero.js @@ -0,0 +1,21 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-json.parse +description: > + Top-level negative zero surrounded by whitespace is parsed correctly. +info: | + JSON.parse ( text [ , reviver ] ) + + 1. Let JText be ? ToString(text). + 2. Parse JText interpreted as UTF-16 encoded Unicode points (6.1.4) as a JSON + text as specified in ECMA-404. Throw a SyntaxError exception if JText is not + a valid JSON text as defined in that specification. +---*/ + +assert.sameValue(JSON.parse('-0'), -0); +assert.sameValue(JSON.parse(' \n-0'), -0); +assert.sameValue(JSON.parse('-0 \t'), -0); +assert.sameValue(JSON.parse('\n\t -0\n '), -0); + +assert.sameValue(JSON.parse(-0), 0); diff --git a/JSTests/test262/test/built-ins/JSON/parse/text-non-string-primitive.js b/JSTests/test262/test/built-ins/JSON/parse/text-non-string-primitive.js new file mode 100644 index 000000000000..d0ce960e3403 --- /dev/null +++ b/JSTests/test262/test/built-ins/JSON/parse/text-non-string-primitive.js @@ -0,0 +1,34 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-json.parse +description: > + Primitive values are coerced to strings and parsed. +info: | + JSON.parse ( text [ , reviver ] ) + + 1. Let JText be ? ToString(text). + 2. Parse JText interpreted as UTF-16 encoded Unicode points (6.1.4) as a JSON + text as specified in ECMA-404. Throw a SyntaxError exception if JText is not + a valid JSON text as defined in that specification. +features: [Symbol] +---*/ + +assert.throws(SyntaxError, function() { + JSON.parse(); +}); + +assert.throws(SyntaxError, function() { + JSON.parse(undefined); +}); + +assert.sameValue(JSON.parse(null), null); +assert.sameValue(JSON.parse(false), false); +assert.sameValue(JSON.parse(true), true); +assert.sameValue(JSON.parse(0), 0); +assert.sameValue(JSON.parse(3.14), 3.14); + +var sym = Symbol('desc'); +assert.throws(TypeError, function() { + JSON.parse(sym); +}); diff --git a/JSTests/test262/test/built-ins/JSON/parse/text-object-abrupt.js b/JSTests/test262/test/built-ins/JSON/parse/text-object-abrupt.js new file mode 100644 index 000000000000..8ede14f514b0 --- /dev/null +++ b/JSTests/test262/test/built-ins/JSON/parse/text-object-abrupt.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-json.parse +description: > + Abrupt completion from Get and Call in ToPrimitive. +info: | + JSON.parse ( text [ , reviver ] ) + + 1. Let JText be ? ToString(text). +---*/ + +assert.throws(Test262Error, function() { + JSON.parse({ + toString: null, + get valueOf() { + throw new Test262Error(); + }, + }); +}); + +assert.throws(Test262Error, function() { + JSON.parse({ + toString: function() { + throw new Test262Error(); + }, + }); +}); diff --git a/JSTests/test262/test/built-ins/JSON/parse/text-object.js b/JSTests/test262/test/built-ins/JSON/parse/text-object.js new file mode 100644 index 000000000000..d1dd305220de --- /dev/null +++ b/JSTests/test262/test/built-ins/JSON/parse/text-object.js @@ -0,0 +1,25 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-json.parse +description: > + Objects are coerced to strings using ToString. +info: | + JSON.parse ( text [ , reviver ] ) + + 1. Let JText be ? ToString(text). + 2. Parse JText interpreted as UTF-16 encoded Unicode points (6.1.4) as a JSON + text as specified in ECMA-404. Throw a SyntaxError exception if JText is not + a valid JSON text as defined in that specification. +---*/ + +var hint = JSON.parse({ + toString: function() { + return '"string"'; + }, + valueOf: function() { + return '"default_or_number"'; + }, +}); + +assert.sameValue(hint, 'string'); diff --git a/JSTests/test262/test/built-ins/Object/prototype/toString/proxy-function-async.js b/JSTests/test262/test/built-ins/Object/prototype/toString/proxy-function-async.js new file mode 100644 index 000000000000..07322015b32b --- /dev/null +++ b/JSTests/test262/test/built-ins/Object/prototype/toString/proxy-function-async.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-object.prototype.tostring +description: Proxy of async function is treated as a function. +info: | + ProxyCreate ( target, handler ) + + [...] + 7. If IsCallable(target) is true, then + a. Set P.[[Call]] as specified in 9.5.12. + + Object.prototype.toString ( ) + + [...] + 7. Else if O has a [[Call]] internal method, let builtinTag be "Function". +features: [async-functions, Proxy, Symbol.toStringTag] +---*/ + +var asyncProxy = new Proxy(async function() {}, {}); +var asyncProxyProxy = new Proxy(asyncProxy, {}); + +assert.sameValue( + Object.prototype.toString.call(asyncProxy), + '[object AsyncFunction]', + 'async function proxy' +); +assert.sameValue( + Object.prototype.toString.call(asyncProxyProxy), + '[object AsyncFunction]', + 'proxy for async function proxy' +); diff --git a/JSTests/test262/test/built-ins/Object/prototype/toString/proxy-function.js b/JSTests/test262/test/built-ins/Object/prototype/toString/proxy-function.js index 965aeba623bc..3b221a155760 100644 --- a/JSTests/test262/test/built-ins/Object/prototype/toString/proxy-function.js +++ b/JSTests/test262/test/built-ins/Object/prototype/toString/proxy-function.js @@ -14,7 +14,7 @@ info: | a. Set the [[Call]] internal method of P as specified in 9.5.12. [...] -features: [generators, Proxy, Symbol.toStringTag] +features: [generators, async-functions, Proxy, Symbol.toStringTag] ---*/ var functionProxy = new Proxy(function() {}, {}); @@ -53,13 +53,14 @@ assert.sameValue( 'proxy for generator function proxy' ); -delete generatorProxy.constructor.prototype[Symbol.toStringTag]; +var asyncProxy = new Proxy(async function() {}, {}); +var asyncProxyProxy = new Proxy(asyncProxy, {}); assert.sameValue( - Object.prototype.toString.call(generatorProxy), '[object Function]', 'generator function proxy without Symbol.toStringTag' + Object.prototype.toString.call(asyncProxy), '[object AsyncFunction]', 'async function proxy' ); assert.sameValue( - Object.prototype.toString.call(generatorProxyProxy), - '[object Function]', - 'proxy for generator function proxy without Symbol.toStringTag' + Object.prototype.toString.call(asyncProxyProxy), + '[object AsyncFunction]', + 'proxy for async function proxy' ); diff --git a/JSTests/test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js b/JSTests/test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js new file mode 100644 index 000000000000..a19e84069935 --- /dev/null +++ b/JSTests/test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js @@ -0,0 +1,76 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-object.prototype.tostring +description: > + Non-string values of `Symbol.toStringTag` property are ignored. +info: | + Object.prototype.toString ( ) + + [...] + 15. Let tag be ? Get(O, @@toStringTag). + 16. If Type(tag) is not String, set tag to builtinTag. + 17. Return the string-concatenation of "[object ", tag, and "]". +features: [Symbol.toStringTag, Symbol.iterator, generators] +---*/ + +var toString = Object.prototype.toString; +var defaultTag = '[object Object]'; + +delete Symbol.prototype[Symbol.toStringTag]; +assert.sameValue(toString.call(Symbol('desc')), defaultTag); + +Object.defineProperty(Math, Symbol.toStringTag, {value: Symbol()}); +assert.sameValue(toString.call(Math), defaultTag); + +var strIter = ''[Symbol.iterator](); +var strIterProto = Object.getPrototypeOf(strIter); +delete strIterProto[Symbol.toStringTag]; +assert.sameValue(toString.call(strIter), defaultTag); + +var arrIter = [][Symbol.iterator](); +var arrIterProto = Object.getPrototypeOf(arrIter) +Object.defineProperty(arrIterProto, Symbol.toStringTag, {value: null}); +assert.sameValue(toString.call(arrIter), defaultTag); + +var map = new Map(); +delete Map.prototype[Symbol.toStringTag]; +assert.sameValue(toString.call(map), defaultTag); + +var mapIter = map[Symbol.iterator](); +var mapIterProto = Object.getPrototypeOf(mapIter); +Object.defineProperty(mapIterProto, Symbol.toStringTag, { + get: function() { return new String('ShouldNotBeUnwrapped'); }, +}); +assert.sameValue(toString.call(mapIter), defaultTag); + +var set = new Set(); +delete Set.prototype[Symbol.toStringTag]; +assert.sameValue(toString.call(set), defaultTag); + +var setIter = set[Symbol.iterator](); +var setIterProto = Object.getPrototypeOf(setIter); +Object.defineProperty(setIterProto, Symbol.toStringTag, {value: false}); +assert.sameValue(toString.call(setIter), defaultTag); + +var wm = new WeakMap(); +delete WeakMap.prototype[Symbol.toStringTag]; +assert.sameValue(toString.call(wm), defaultTag); + +var ws = new WeakSet(); +Object.defineProperty(WeakSet.prototype, Symbol.toStringTag, {value: 0}); +assert.sameValue(toString.call(ws), defaultTag); + +delete JSON[Symbol.toStringTag]; +assert.sameValue(toString.call(JSON), defaultTag); + +var gen = (function* () {})(); +var genProto = Object.getPrototypeOf(gen); +Object.defineProperty(genProto, Symbol.toStringTag, { + get: function() { return {}; }, +}); +assert.sameValue(toString.call(gen), defaultTag); + +var promise = new Promise(function() {}); +delete Promise.prototype[Symbol.toStringTag]; +assert.sameValue(toString.call(promise), defaultTag); diff --git a/JSTests/test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js b/JSTests/test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js new file mode 100644 index 000000000000..fcc5bee12c36 --- /dev/null +++ b/JSTests/test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js @@ -0,0 +1,55 @@ +// Copyright (C) 2016 the Apple Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-object.prototype.tostring +description: > + Non-string values of `Symbol.toStringTag` property are ignored. +info: | + ProxyCreate ( target, handler ) + + [...] + 7. If IsCallable(target) is true, then + a. Set P.[[Call]] as specified in 9.5.12. + + Object.prototype.toString ( ) + + [...] + 7. Else if O has a [[Call]] internal method, let builtinTag be "Function". + [...] + 15. Let tag be ? Get(O, @@toStringTag). + 16. If Type(tag) is not String, set tag to builtinTag. + 17. Return the string-concatenation of "[object ", tag, and "]". +features: [generators, async-functions, Proxy, Symbol.toStringTag] +---*/ + +var generatorProxy = new Proxy(function* () {}, {}); +var generatorProxyProxy = new Proxy(generatorProxy, {}); +delete generatorProxy.constructor.prototype[Symbol.toStringTag]; + +assert.sameValue( + Object.prototype.toString.call(generatorProxy), + '[object Function]', + 'generator function proxy without Symbol.toStringTag' +); +assert.sameValue( + Object.prototype.toString.call(generatorProxyProxy), + '[object Function]', + 'proxy for generator function proxy without Symbol.toStringTag' +); + +var asyncProxy = new Proxy(async function() {}, {}); +var asyncProxyProxy = new Proxy(asyncProxy, {}); +Object.defineProperty(asyncProxy.constructor.prototype, Symbol.toStringTag, { + value: undefined, +}); + +assert.sameValue( + Object.prototype.toString.call(asyncProxy), + '[object Function]', + 'async function proxy without Symbol.toStringTag' +); +assert.sameValue( + Object.prototype.toString.call(asyncProxyProxy), + '[object Function]', + 'proxy for async function proxy without Symbol.toStringTag' +); diff --git a/JSTests/test262/test/built-ins/Object/subclass-object-arg.js b/JSTests/test262/test/built-ins/Object/subclass-object-arg.js new file mode 100644 index 000000000000..9500340e2f3d --- /dev/null +++ b/JSTests/test262/test/built-ins/Object/subclass-object-arg.js @@ -0,0 +1,26 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-object-value +author: Matthew Phillips +description: > + NewTarget is active function and subclass of Object +info: | + Object ( [ value ] ) + + 1. If NewTarget is neither undefined nor the active function, then + a. Return ? OrdinaryCreateFromConstructor(NewTarget, "%ObjectPrototype%"). + [...] +features: [class, Reflect, Reflect.construct] +---*/ + +class O extends Object {} + +var o1 = new O({a: 1}); +var o2 = Reflect.construct(Object, [{b: 2}], O); + +assert.sameValue(o1.a, undefined); +assert.sameValue(o2.b, undefined); + +assert.sameValue(Object.getPrototypeOf(o1), O.prototype); +assert.sameValue(Object.getPrototypeOf(o2), O.prototype); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A1.1_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A1.1_T1.js deleted file mode 100644 index 06f9f6fb6084..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A1.1_T1.js +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise is the Promise property of the global object -es6id: S25.4.3.1_A1.1_T1 -author: Sam Mikes -description: Promise === global.Promise ----*/ - -var global = this; - -if (Promise !== global.Promise) { - $ERROR("Expected Promise === global.Promise."); -} diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.1_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.1_T1.js deleted file mode 100644 index afbef52eee90..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.1_T1.js +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise throws TypeError when 'this' is not Object -es6id: S25.4.3.1_A2.1_T1 -author: Sam Mikes -description: Promise.call("non-object") throws TypeError ----*/ - -assert.throws(TypeError, function() { - Promise.call("non-object", function() {}); -}); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.2_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.2_T1.js deleted file mode 100644 index 855595e76b61..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.2_T1.js +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise throws TypeError when 'this' is constructed but unsettled promise -es6id: S25.4.3.1_A2.2_T1 -author: Sam Mikes -description: Promise.call(new Promise()) throws TypeError ----*/ - -var p = new Promise(function() {}); - -assert.throws(TypeError, function() { - Promise.call(p, function() {}); -}); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.3_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.3_T1.js deleted file mode 100644 index 424b1a7f18ff..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.3_T1.js +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise throws TypeError when 'this' is resolved promise -es6id: S25.4.3.1_A2.3_T1 -author: Sam Mikes -description: Promise.call(resolved Promise) throws TypeError -flags: [async] ----*/ - -var p = new Promise(function(resolve) { - resolve(1); -}); - -p.then(function() { - Promise.call(p, function() {}); -}).then(function() { - $ERROR("Unexpected resolution - expected TypeError"); -}, function(err) { - if (!(err instanceof TypeError)) { - $ERROR("Expected TypeError, got " + err); - } -}).then($DONE, $DONE); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.4_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.4_T1.js deleted file mode 100644 index e852b0274554..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A2.4_T1.js +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise throws TypeError when 'this' is rejected promise -es6id: S25.4.3.1_A2.4_T1 -author: Sam Mikes -description: Promise.call(rejected Promise) throws TypeError -flags: [async] ----*/ - -var p = new Promise(function(resolve, reject) { - reject(1) -}); - -p.catch(function() { - Promise.call(p, function() {}); -}).then(function() { - $ERROR("Unexpected resolution - expected TypeError"); -}, function(err) { - if (!(err instanceof TypeError)) { - $ERROR("Expected TypeError, got " + err); - } -}).then($DONE, $DONE); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A3.1_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A3.1_T1.js deleted file mode 100644 index 8bf60f0e6eb9..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A3.1_T1.js +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise throws TypeError when executor is not callable -es6id: S25.4.3.1_A3.1_T1 -author: Sam Mikes -description: new Promise("not callable") throws TypeError ----*/ - -assert.throws(TypeError, function() { - new Promise("not callable"); -}); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A4.1_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A4.1_T1.js deleted file mode 100644 index 26d1cb0ce25f..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A4.1_T1.js +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise catches exceptions thrown from executor and turns - them into reject -es6id: S25.4.3.1_A4.1_T1 -author: Sam Mikes -description: new Promise(function () { throw }) should reject -flags: [async] ----*/ - -var errorObject = {}, - p = new Promise(function() { - throw errorObject; - }); - -p.then(function() { - $ERROR("Unexpected fulfill -- promise should reject."); -}, function(err) { - if (err !== errorObject) { - $ERROR("Expected promise rejection reason to be thrown errorObject, actually " + err); - } -}).then($DONE, $DONE); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A5.1_T1.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A5.1_T1.js deleted file mode 100644 index da4221c47f2c..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A5.1_T1.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise executor has predictable environment - 'this' should be global object in sloppy mode, - undefined in strict mode -es6id: S25.4.3.1_A5.1_T1 -author: Sam Mikes -description: Promise executor gets default handling for 'this' -flags: [async, noStrict] ----*/ - -var expectedThis = this; - -var p = new Promise(function(resolve) { - if (this !== expectedThis) { - $ERROR("'this' must be global object, got " + this); - } - - resolve(); -}).then($DONE, $DONE); diff --git a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A5.1_T2.js b/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A5.1_T2.js deleted file mode 100644 index 58cdb04d16f7..000000000000 --- a/JSTests/test262/test/built-ins/Promise/S25.4.3.1_A5.1_T2.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2014 Cubane Canada, Inc. All rights reserved. -// See LICENSE for details. - -/*--- -info: | - Promise executor has predictable environment - 'this' should be global object in sloppy mode, - undefined in strict mode -es6id: S25.4.3.1_A5.1_T2 -author: Sam Mikes -description: Promise executor gets default handling for 'this' -flags: [async, onlyStrict] ----*/ - -var expectedThis = undefined; - -var p = new Promise(function(resolve) { - if (this !== expectedThis) { - $ERROR("'this' must be undefined, got " + this); - } - - resolve(); -}).then($DONE, $DONE); diff --git a/JSTests/test262/test/built-ins/Promise/all/invoke-resolve-get-error-close.js b/JSTests/test262/test/built-ins/Promise/all/invoke-resolve-get-error-close.js index ac1bb2966bea..a2be82922c09 100644 --- a/JSTests/test262/test/built-ins/Promise/all/invoke-resolve-get-error-close.js +++ b/JSTests/test262/test/built-ins/Promise/all/invoke-resolve-get-error-close.js @@ -54,4 +54,4 @@ Object.defineProperty(Promise, 'resolve', { Promise.all(iter); assert.sameValue(nextCount, 0); -assert.sameValue(returnCount, 0); +assert.sameValue(returnCount, 1); diff --git a/JSTests/test262/test/built-ins/Promise/all/resolve-element-function-name.js b/JSTests/test262/test/built-ins/Promise/all/resolve-element-function-name.js index 2af12b808f39..e743dba347eb 100644 --- a/JSTests/test262/test/built-ins/Promise/all/resolve-element-function-name.js +++ b/JSTests/test262/test/built-ins/Promise/all/resolve-element-function-name.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -es6id: 25.4.4.1.2 +esid: sec-promise.all-resolve-element-functions description: The `name` property of Promise.all Resolve Element functions info: | A promise resolve function is an anonymous built-in function. @@ -29,3 +29,4 @@ NotPromise.resolve = function(v) { Promise.all.call(NotPromise, [thenable]); assert.sameValue(Object.prototype.hasOwnProperty.call(resolveElementFunction, "name"), false); +assert.sameValue(resolveElementFunction.name, ""); diff --git a/JSTests/test262/test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js b/JSTests/test262/test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js index f04144a97c90..ccab8601a8b5 100644 --- a/JSTests/test262/test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js +++ b/JSTests/test262/test/built-ins/Promise/allSettled/invoke-resolve-get-error-close.js @@ -45,4 +45,4 @@ Object.defineProperty(Promise, 'resolve', { Promise.allSettled(iter); assert.sameValue(nextCount, 0); -assert.sameValue(returnCount, 0); +assert.sameValue(returnCount, 1); diff --git a/JSTests/test262/test/built-ins/Promise/allSettled/reject-element-function-name.js b/JSTests/test262/test/built-ins/Promise/allSettled/reject-element-function-name.js index 79944bb09fdb..5f8827aacf3f 100644 --- a/JSTests/test262/test/built-ins/Promise/allSettled/reject-element-function-name.js +++ b/JSTests/test262/test/built-ins/Promise/allSettled/reject-element-function-name.js @@ -30,3 +30,4 @@ NotPromise.resolve = function(v) { Promise.allSettled.call(NotPromise, [thenable]); assert.sameValue(Object.prototype.hasOwnProperty.call(rejectElementFunction, 'name'), false); +assert.sameValue(rejectElementFunction.name, ''); diff --git a/JSTests/test262/test/built-ins/Promise/allSettled/resolve-element-function-name.js b/JSTests/test262/test/built-ins/Promise/allSettled/resolve-element-function-name.js index 76ff9fb83cee..2df8fb8093de 100644 --- a/JSTests/test262/test/built-ins/Promise/allSettled/resolve-element-function-name.js +++ b/JSTests/test262/test/built-ins/Promise/allSettled/resolve-element-function-name.js @@ -33,3 +33,4 @@ assert.sameValue( Object.prototype.hasOwnProperty.call(resolveElementFunction, 'name'), false ); +assert.sameValue(resolveElementFunction.name, ''); diff --git a/JSTests/test262/test/built-ins/Promise/constructor.js b/JSTests/test262/test/built-ins/Promise/constructor.js new file mode 100644 index 000000000000..edf98ebc914d --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/constructor.js @@ -0,0 +1,9 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-executor +description: > + The Promise constructor is a built-in function +---*/ + +assert.sameValue(typeof Promise, 'function'); diff --git a/JSTests/test262/test/built-ins/Promise/executor-call-context-sloppy.js b/JSTests/test262/test/built-ins/Promise/executor-call-context-sloppy.js new file mode 100644 index 000000000000..6867abd8ad23 --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/executor-call-context-sloppy.js @@ -0,0 +1,22 @@ +// Copyright 2014 Cubane Canada, Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-executor +author: Sam Mikes +description: > + Promise executor is called in global object context in sloppy mode. +info: | + 25.6.3.1 Promise ( executor ) + + [...] + 9. Let completion be Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »). +flags: [noStrict] +---*/ + +var _this; + +new Promise(function() { + _this = this; +}); + +assert.sameValue(_this, this); diff --git a/JSTests/test262/test/built-ins/Promise/executor-call-context-strict.js b/JSTests/test262/test/built-ins/Promise/executor-call-context-strict.js new file mode 100644 index 000000000000..6be6e0a21fae --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/executor-call-context-strict.js @@ -0,0 +1,22 @@ +// Copyright 2014 Cubane Canada, Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-executor +author: Sam Mikes +description: > + Promise executor is called in `undefined` context in strict mode. +info: | + 25.6.3.1 Promise ( executor ) + + [...] + 9. Let completion be Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »). +flags: [onlyStrict] +---*/ + +var _this; + +new Promise(function() { + _this = this; +}); + +assert.sameValue(_this, undefined); diff --git a/JSTests/test262/test/built-ins/Promise/executor-function-name.js b/JSTests/test262/test/built-ins/Promise/executor-function-name.js index f571504fc98e..cf412cc6ce7b 100644 --- a/JSTests/test262/test/built-ins/Promise/executor-function-name.js +++ b/JSTests/test262/test/built-ins/Promise/executor-function-name.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -es6id: 25.4.1.5.1 +esid: sec-getcapabilitiesexecutor-functions description: The `name` property of GetCapabilitiesExecutor functions info: | A GetCapabilitiesExecutor function is an anonymous built-in function. @@ -22,3 +22,4 @@ function NotPromise(executor) { Promise.resolve.call(NotPromise); assert.sameValue(Object.prototype.hasOwnProperty.call(executorFunction, "name"), false); +assert.sameValue(executorFunction.name, ""); diff --git a/JSTests/test262/test/built-ins/Promise/executor-not-callable.js b/JSTests/test262/test/built-ins/Promise/executor-not-callable.js new file mode 100644 index 000000000000..b95724629c9c --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/executor-not-callable.js @@ -0,0 +1,29 @@ +// Copyright 2014 Cubane Canada, Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-executor +author: Sam Mikes +description: > + Promise constructor throws TypeError if executor is not callable. +info: | + 25.6.3.1 Promise ( executor ) + + [...] + 2. If IsCallable(executor) is false, throw a TypeError exception. +---*/ + +assert.throws(TypeError, function() { + new Promise('not callable'); +}); + +assert.throws(TypeError, function() { + new Promise(1); +}); + +assert.throws(TypeError, function() { + new Promise(null); +}); + +assert.throws(TypeError, function() { + new Promise({}); +}); diff --git a/JSTests/test262/test/built-ins/Promise/get-prototype-abrupt-executor-not-callable.js b/JSTests/test262/test/built-ins/Promise/get-prototype-abrupt-executor-not-callable.js new file mode 100644 index 000000000000..a55072594ecf --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/get-prototype-abrupt-executor-not-callable.js @@ -0,0 +1,35 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-executor +description: > + Promise constructor gets prototype after checking that executor is callable. +info: | + 25.6.3.1 Promise ( executor ) + + [...] + 2. If IsCallable(executor) is false, throw a TypeError exception. + 3. Let promise be ? OrdinaryCreateFromConstructor(NewTarget, "%PromisePrototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] »). + + 9.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + [...] + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + + 9.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + [...] + 3. Let proto be ? Get(constructor, "prototype"). +features: [Reflect, Reflect.construct] +---*/ + +var bound = (function() {}).bind(); +Object.defineProperty(bound, 'prototype', { + get: function() { + throw new Test262Error(); + }, +}); + +assert.throws(TypeError, function() { + Reflect.construct(Promise, [], bound); +}); diff --git a/JSTests/test262/test/built-ins/Promise/get-prototype-abrupt.js b/JSTests/test262/test/built-ins/Promise/get-prototype-abrupt.js new file mode 100644 index 000000000000..6ac05a1bf79a --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/get-prototype-abrupt.js @@ -0,0 +1,34 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-executor +description: > + Abrupt completion from "prototype" property access +info: | + 25.6.3.1 Promise ( executor ) + + [...] + 3. Let promise be ? OrdinaryCreateFromConstructor(NewTarget, "%PromisePrototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] »). + + 9.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + [...] + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + + 9.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + [...] + 3. Let proto be ? Get(constructor, "prototype"). +features: [Reflect, Reflect.construct] +---*/ + +var bound = (function() {}).bind(); +Object.defineProperty(bound, 'prototype', { + get: function() { + throw new Test262Error(); + }, +}); + +assert.throws(Test262Error, function() { + Reflect.construct(Promise, [function() {}], bound); +}); diff --git a/JSTests/test262/test/built-ins/Promise/promise.js b/JSTests/test262/test/built-ins/Promise/promise.js new file mode 100644 index 000000000000..e4f7ba64f8d0 --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/promise.js @@ -0,0 +1,25 @@ +// Copyright 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-constructor +description: > + Property descriptor of Promise +info: | + 25.6.3 The Promise Constructor + + * is the initial value of the Promise property of the global object. + + 17 ECMAScript Standard Built-in Objects + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +---*/ + +verifyProperty(this, 'Promise', { + value: Promise, + writable: true, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/Promise/race/invoke-resolve-get-error-close.js b/JSTests/test262/test/built-ins/Promise/race/invoke-resolve-get-error-close.js index 951b509e42f4..cf7f2bd44c02 100644 --- a/JSTests/test262/test/built-ins/Promise/race/invoke-resolve-get-error-close.js +++ b/JSTests/test262/test/built-ins/Promise/race/invoke-resolve-get-error-close.js @@ -52,4 +52,4 @@ Object.defineProperty(Promise, 'resolve', { Promise.race(iter); assert.sameValue(nextCount, 0); -assert.sameValue(returnCount, 0); +assert.sameValue(returnCount, 1); diff --git a/JSTests/test262/test/built-ins/Promise/reject-function-name.js b/JSTests/test262/test/built-ins/Promise/reject-function-name.js index edf684bc3560..af6424468408 100644 --- a/JSTests/test262/test/built-ins/Promise/reject-function-name.js +++ b/JSTests/test262/test/built-ins/Promise/reject-function-name.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -es6id: 25.4.1.3.1 +esid: sec-promise-reject-functions description: The `name` property of Promise Reject functions info: | A promise reject function is an anonymous built-in function. @@ -19,3 +19,4 @@ new Promise(function(resolve, reject) { }); assert.sameValue(Object.prototype.hasOwnProperty.call(rejectFunction, "name"), false); +assert.sameValue(rejectFunction.name, ""); diff --git a/JSTests/test262/test/built-ins/Promise/resolve-function-name.js b/JSTests/test262/test/built-ins/Promise/resolve-function-name.js index 7f179721c51f..afaec3aaf658 100644 --- a/JSTests/test262/test/built-ins/Promise/resolve-function-name.js +++ b/JSTests/test262/test/built-ins/Promise/resolve-function-name.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -es6id: 25.4.1.3.2 +esid: sec-promise-resolve-functions description: The `name` property of Promise Resolve functions info: | A promise resolve function is an anonymous built-in function. @@ -19,3 +19,4 @@ new Promise(function(resolve, reject) { }); assert.sameValue(Object.prototype.hasOwnProperty.call(resolveFunction, "name"), false); +assert.sameValue(resolveFunction.name, ""); diff --git a/JSTests/test262/test/built-ins/Promise/undefined-newtarget.js b/JSTests/test262/test/built-ins/Promise/undefined-newtarget.js new file mode 100644 index 000000000000..2e52b229e9d4 --- /dev/null +++ b/JSTests/test262/test/built-ins/Promise/undefined-newtarget.js @@ -0,0 +1,24 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise-executor +description: > + Throws a TypeError if Promise is called without a NewTarget. +info: | + 25.6.3.1 Promise ( executor ) + + 1. If NewTarget is undefined, throw a TypeError exception. +---*/ + +assert.throws(TypeError, function() { + Promise(function() {}); +}); + +assert.throws(TypeError, function() { + Promise.call(null, function() {}); +}); + +var p = new Promise(function() {}); +assert.throws(TypeError, function() { + Promise.call(p, function() {}); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/apply/call-parameters.js b/JSTests/test262/test/built-ins/Proxy/apply/call-parameters.js index f45af9cdff4f..38802c2c1f3d 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/call-parameters.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/call-parameters.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-call-thisargument-argumentslist es6id: 9.5.13 description: > trap is called with handler object as its context, and parameters are: @@ -13,8 +14,8 @@ features: [Proxy] ---*/ var _target, _args, _handler, _context; -var target = function(a, b) { - return a + b; +var target = function() { + throw new Test262Error('target should not be called'); }; var handler = { apply: function(t, c, args) { diff --git a/JSTests/test262/test/built-ins/Proxy/apply/call-result.js b/JSTests/test262/test/built-ins/Proxy/apply/call-result.js index 451d3c18cd95..ffb84408a9c7 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/call-result.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/call-result.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-call-thisargument-argumentslist es6id: 9.5.13 description: > Return the result from the trap method. @@ -11,15 +12,13 @@ info: | features: [Proxy] ---*/ -var target = function(a, b) { - return a + b; -}; var result = {}; -var handler = { +var p = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { apply: function(t, c, args) { return result; - } -}; -var p = new Proxy(target, handler); + }, +}); assert.sameValue(p.call(), result); diff --git a/JSTests/test262/test/built-ins/Proxy/apply/null-handler-realm.js b/JSTests/test262/test/built-ins/Proxy/apply/null-handler-realm.js new file mode 100644 index 000000000000..45d4ec01876f --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/apply/null-handler-realm.js @@ -0,0 +1,23 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-call-thisargument-argumentslist +description: > + Throws a TypeError exception if handler is null (honoring the realm of the + current execution context). +info: | + [[Call]] (thisArgument, argumentsList) + + 1. Let handler be O.[[ProxyHandler]]. + 2. If handler is null, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var p = OProxy.revocable(function() {}, {}); + +p.revoke(); + +assert.throws(TypeError, function() { + p.proxy(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/apply/null-handler.js b/JSTests/test262/test/built-ins/Proxy/apply/null-handler.js index 6e0016ec8b0b..34ae5e25f7ca 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/null-handler.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/null-handler.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-call-thisargument-argumentslist es6id: 9.5.13 description: > [[Call]] (thisArgument, argumentsList) diff --git a/JSTests/test262/test/built-ins/Proxy/apply/return-abrupt.js b/JSTests/test262/test/built-ins/Proxy/apply/return-abrupt.js index 494973defb14..4ff83d40afed 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/return-abrupt.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/return-abrupt.js @@ -1,16 +1,16 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-call-thisargument-argumentslist es6id: 9.5.13 description: > Return is an abrupt completion features: [Proxy] ---*/ -var target = function(a, b) { - return a + b; -}; -var p = new Proxy(target, { +var p = new Proxy(function() { + throw 'not the Test262Error you are looking for'; +}, { apply: function(t, c, args) { throw new Test262Error(); } diff --git a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-not-callable.js b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-not-callable.js index 14e84966b25c..39393a5c3dbc 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-not-callable.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-not-callable.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-call-thisargument-argumentslist es6id: 9.5.13 description: > Throws if trap is not callable. diff --git a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-null.js b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-null.js index 0584a3ddb6a6..1001355aabb9 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-null.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-null.js @@ -24,17 +24,23 @@ features: [Proxy] ---*/ var calls = 0; +var _context; -function target(a, b) { - assert.sameValue(this, ctx); - calls += 1; - return a + b; -} +var target = new Proxy(function() {}, { + apply: function(_target, context, args) { + calls++; + _context = context; + return args[0] + args[1]; + } +}) -var ctx = {}; var p = new Proxy(target, { apply: null }); -var res = p.call(ctx, 1, 2); -assert.sameValue(res, 3, "`apply` trap is `null`"); -assert.sameValue(calls, 1, "target is called once"); + +var context = {}; +var res = p.call(context, 1, 2); + +assert.sameValue(calls, 1, "apply is null: [[Call]] is invoked once"); +assert.sameValue(_context, context, "apply is null: context is passed to [[Call]]"); +assert.sameValue(res, 3, "apply is null: result of [[Call]] is returned"); diff --git a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined-no-property.js b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined-no-property.js index 45e2ef5f773b..71277f85b9e8 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined-no-property.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined-no-property.js @@ -24,15 +24,20 @@ features: [Proxy] ---*/ var calls = 0; +var _context; -function target(a, b) { - assert.sameValue(this, ctx); - calls += 1; - return a + b; -} +var target = new Proxy(function() {}, { + apply: function(_target, context, args) { + calls++; + _context = context; + return args[0] + args[1]; + } +}) -var ctx = {}; var p = new Proxy(target, {}); -var res = p.call(ctx, 1, 2); -assert.sameValue(res, 3, "`apply` trap is missing"); -assert.sameValue(calls, 1, "target is called once"); +var context = {}; +var res = p.call(context, 1, 2); + +assert.sameValue(calls, 1, "apply is missing: [[Call]] is invoked once"); +assert.sameValue(_context, context, "apply is missing: context is passed to [[Call]]"); +assert.sameValue(res, 3, "apply is missing: result of [[Call]] is returned"); diff --git a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined.js b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined.js index 5a2b9e5e77d1..9d9e5edfbf17 100644 --- a/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined.js +++ b/JSTests/test262/test/built-ins/Proxy/apply/trap-is-undefined.js @@ -24,17 +24,23 @@ features: [Proxy] ---*/ var calls = 0; +var _context; -function target(a, b) { - assert.sameValue(this, ctx); - calls += 1; - return a + b; -} +var target = new Proxy(function() {}, { + apply: function(_target, context, args) { + calls++; + _context = context; + return args[0] + args[1]; + } +}) -var ctx = {}; var p = new Proxy(target, { apply: undefined }); -var res = p.call(ctx, 1, 2); -assert.sameValue(res, 3, "`apply` trap is `null`"); -assert.sameValue(calls, 1, "target is called once"); + +var context = {}; +var res = p.call(context, 1, 2); + +assert.sameValue(calls, 1, "apply is undefined: [[Call]] is invoked once"); +assert.sameValue(_context, context, "apply is undefined: context is passed to [[Call]]"); +assert.sameValue(res, 3, "apply is undefined: result of [[Call]] is returned"); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/call-parameters.js b/JSTests/test262/test/built-ins/Proxy/construct/call-parameters.js index ad36717b5253..2c991048dfbf 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/call-parameters.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/call-parameters.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > trap is called with handler object as its context, and parameters are: diff --git a/JSTests/test262/test/built-ins/Proxy/construct/call-result.js b/JSTests/test262/test/built-ins/Proxy/construct/call-result.js index 0a6585846839..2613af252598 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/call-result.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/call-result.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Return the result from the trap method. @@ -11,16 +12,14 @@ info: | features: [Proxy] ---*/ -function Target(a, b) { - this.sum = a + b; -}; -var handler = { +var P = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { construct: function(t, c, args) { return { sum: 42 }; } -}; -var P = new Proxy(Target, handler); +}); assert.sameValue((new P(1, 2)).sum, 42); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/null-handler-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/null-handler-realm.js new file mode 100644 index 000000000000..a6f29bfba3bc --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/null-handler-realm.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + [[Construct]] (argumentsList, newTarget) + + 1. Let handler be O.[[ProxyHandler]]. + 2. If handler is null, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var p = OProxy.revocable(function() {}, {}); + +p.revoke(); + +assert.throws(TypeError, function() { + new p.proxy(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/null-handler.js b/JSTests/test262/test/built-ins/Proxy/construct/null-handler.js index d94f02e70c4d..7dc774f63d29 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/null-handler.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/null-handler.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > [[Construct]] ( argumentsList, newTarget) diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-is-abrupt.js b/JSTests/test262/test/built-ins/Proxy/construct/return-is-abrupt.js index 272fd06489ce..71fee2e9494d 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/return-is-abrupt.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-is-abrupt.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Return abrupt from constructor call. diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js new file mode 100644 index 000000000000..8e63b12fb78b --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-boolean-realm.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + Throws a TypeError if trap result is not an Object: Boolean + (honoring the Realm of the current execution context) +info: | + [[Construct]] (argumentsList, newTarget) + + [...] + 11. If Type(newObj) is not Object, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var P = new OProxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() { + return true; + }, +}); + +assert.throws(TypeError, function() { + new P(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-boolean.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-boolean.js index 6b00f4635ef3..91638c8b6861 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-boolean.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-boolean.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Throws a TypeError if trap result is not an Object: Boolean @@ -11,10 +12,9 @@ info: | features: [Proxy] ---*/ -function Target() { - this.attr = "done"; -}; -var P = new Proxy(Target, { +var P = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { construct: function() { return true; } diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-null-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-null-realm.js new file mode 100644 index 000000000000..727b69905dbe --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-null-realm.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + Throws a TypeError if trap result is not an Object: null + (honoring the Realm of the current execution context) +info: | + [[Construct]] (argumentsList, newTarget) + + [...] + 11. If Type(newObj) is not Object, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var P = new OProxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() { + return null; + }, +}); + +assert.throws(TypeError, function() { + new P(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-null.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-null.js new file mode 100644 index 000000000000..332f12506795 --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-null.js @@ -0,0 +1,25 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + Throws a TypeError if trap result is not an Object: null +info: | + [[Construct]] (argumentsList, newTarget) + + [...] + 11. If Type(newObj) is not Object, throw a TypeError exception. +features: [Proxy] +---*/ + +var P = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() { + return null; + }, +}); + +assert.throws(TypeError, function() { + new P(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-number-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-number-realm.js new file mode 100644 index 000000000000..549e38909177 --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-number-realm.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + Throws a TypeError if trap result is not an Object: Number + (honoring the Realm of the current execution context) +info: | + [[Construct]] (argumentsList, newTarget) + + [...] + 11. If Type(newObj) is not Object, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var P = new OProxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() { + return 1; + }, +}); + +assert.throws(TypeError, function() { + new P(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-number.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-number.js index 3861877640a4..a5f4bd665d72 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-number.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-number.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Throws a TypeError if trap result is not an Object: Number @@ -11,10 +12,11 @@ info: | features: [Proxy] ---*/ -function Target() { - this.attr = "done"; -}; -var P = new Proxy(Target, { +function Target() {} + +var P = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { construct: function() { return 0; } diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-string-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-string-realm.js new file mode 100644 index 000000000000..3856d474e752 --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-string-realm.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + Throws a TypeError if trap result is not an Object: String + (honoring the Realm of the current execution context) +info: | + [[Construct]] (argumentsList, newTarget) + + [...] + 11. If Type(newObj) is not Object, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var P = new OProxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() { + return ''; + }, +}); + +assert.throws(TypeError, function() { + new P(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-string.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-string.js index 4917cb36b283..50340bd0053c 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-string.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-string.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Throws a TypeError if trap result is not an Object: String @@ -11,10 +12,11 @@ info: | features: [Proxy] ---*/ -function Target() { - this.attr = "done"; -}; -var P = new Proxy(Target, { +function Target() {} + +var P = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { construct: function() { return ""; } diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js new file mode 100644 index 000000000000..7765dc0d84a9 --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-symbol-realm.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + Throws a TypeError if trap result is not an Object: Symbol + (honoring the Realm of the current execution context) +info: | + [[Construct]] (argumentsList, newTarget) + + [...] + 11. If Type(newObj) is not Object, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var P = new OProxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() { + return Symbol(); + }, +}); + +assert.throws(TypeError, function() { + new P(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-symbol.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-symbol.js index fbf42ad1132c..973fc9f6813c 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-symbol.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-symbol.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Throws a TypeError if trap result is not an Object: Symbol @@ -11,10 +12,11 @@ info: | features: [Proxy, Symbol] ---*/ -function Target() { - this.attr = "done"; -}; -var P = new Proxy(Target, { +function Target() {} + +var P = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { construct: function() { return Symbol(); } diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js new file mode 100644 index 000000000000..8b5c5ff7bdda --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-undefined-realm.js @@ -0,0 +1,25 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + Throws a TypeError if trap result is not an Object: undefined + (honoring the Realm of the current execution context) +info: | + [[Construct]] (argumentsList, newTarget) + + [...] + 11. If Type(newObj) is not Object, throw a TypeError exception. +features: [cross-realm, Proxy] +---*/ + +var OProxy = $262.createRealm().global.Proxy; +var P = new OProxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() {}, +}); + +assert.throws(TypeError, function() { + new P(); +}); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-undefined.js b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-undefined.js index 026c6e19b4c7..7d979e85ae69 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-undefined.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/return-not-object-throws-undefined.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Throws a TypeError if trap result is not an Object: undefined @@ -11,13 +12,10 @@ info: | features: [Proxy] ---*/ -function Target() { - this.attr = "done"; -}; -var P = new Proxy(Target, { - construct: function() { - return undefined; - } +var P = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function() {} }); assert.throws(TypeError, function() { diff --git a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-not-callable.js b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-not-callable.js index f5f7996e8ef2..9ecd40308770 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-not-callable.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-not-callable.js @@ -1,6 +1,7 @@ // Copyright (C) 2015 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget es6id: 9.5.14 description: > Throws if trap is not callable. diff --git a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-null.js b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-null.js index a5a63f071211..ee830bc69ca8 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-null.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-null.js @@ -21,24 +21,31 @@ info: | ... 3. If func is either undefined or null, return undefined. ... -features: [new.target, Proxy, Reflect, Reflect.construct] +features: [Proxy, Reflect, Reflect.construct] ---*/ var calls = 0; - -function NewTarget() {} - -function Target(a, b) { - assert.sameValue(new.target, NewTarget); - calls += 1; - return { - sum: a + b - }; -} +var _NewTarget; + +var Target = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function(_Target, args, NewTarget) { + calls += 1; + _NewTarget = NewTarget; + return { + sum: args[0] + args[1] + }; + } +}) var P = new Proxy(Target, { construct: null }); + +var NewTarget = function() {}; var obj = Reflect.construct(P, [3, 4], NewTarget); -assert.sameValue(obj.sum, 7, "`construct` trap is `null`"); -assert.sameValue(calls, 1, "target is called once"); + +assert.sameValue(calls, 1, "construct is null: [[Construct]] is invoked once"); +assert.sameValue(_NewTarget, NewTarget, "construct is null: NewTarget is passed to [[Construct]]"); +assert.sameValue(obj.sum, 7, "construct is null: result of [[Construct]] is returned"); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js index 557bd7133a81..6edcd7e240ff 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-no-property.js @@ -8,24 +8,40 @@ description: > info: | [[Construct]] (argumentsList, newTarget) - 7. If trap is undefined, then - b. Return Construct(target, argumentsList, newTarget). -features: [new.target, Proxy, Reflect, Reflect.construct] + ... + 5. Let trap be ? GetMethod(handler, "construct"). + 6. If trap is undefined, then + a. Assert: target has a [[Construct]] internal method. + b. Return ? Construct(target, argumentsList, newTarget). + ... + + GetMethod ( V, P ) + + ... + 3. If func is either undefined or null, return undefined. + ... +features: [Proxy, Reflect, Reflect.construct] ---*/ var calls = 0; +var _NewTarget; -function NewTarget() {} - -function Target(a, b) { - assert.sameValue(new.target, NewTarget); - calls += 1; - return { - sum: a + b - }; -} +var Target = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function(_Target, args, NewTarget) { + calls += 1; + _NewTarget = NewTarget; + return { + sum: args[0] + args[1] + }; + } +}) var P = new Proxy(Target, {}); -var obj = Reflect.construct(P, [1, 2], NewTarget); -assert.sameValue(obj.sum, 3, "`construct` trap is missing"); -assert.sameValue(calls, 1, "target is called once"); +var NewTarget = function() {}; +var obj = Reflect.construct(P, [3, 4], NewTarget); + +assert.sameValue(calls, 1, "construct is missing: [[Construct]] is invoked once"); +assert.sameValue(_NewTarget, NewTarget, "construct is missing: NewTarget is passed to [[Construct]]"); +assert.sameValue(obj.sum, 7, "construct is missing: result of [[Construct]] is returned"); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-cross-realm-newtarget.js b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-cross-realm-newtarget.js new file mode 100644 index 000000000000..d482995f9f03 --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-cross-realm-newtarget.js @@ -0,0 +1,47 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + If trap is undefined, propagate [[Construct]] to target, + passing correct newTarget parameter +info: | + [[Construct]] ( argumentsList, newTarget ) + + [...] + 7. If trap is undefined, then + b. Return ? Construct(target, argumentsList, newTarget). + + Construct ( F [ , argumentsList [ , newTarget ] ] ) + + [...] + 5. Return ? F.[[Construct]](argumentsList, newTarget). + + [[Construct]] ( argumentsList, newTarget ) + + [...] + 5. If kind is "base", then + a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget, "%ObjectPrototype%"). + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + [...] + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + [...] + 3. Let proto be ? Get(constructor, "prototype"). + [...] + 5. Return proto. +features: [cross-realm, Proxy, Reflect, Reflect.construct] +---*/ + +var other = $262.createRealm().global; +var C = new other.Function(); + +var P = new Proxy(function() {}, {}); +var p = Reflect.construct(P, [], C); + +assert.sameValue(Object.getPrototypeOf(p), C.prototype); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-ctor-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-ctor-realm.js deleted file mode 100644 index 67930e35c32a..000000000000 --- a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-ctor-realm.js +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2016 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget -es6id: 9.5.14 -description: > - If trap is undefined, propagate the construct to the target object, - honoring the Realm of the newTarget value -info: | - [[Construct]] ( argumentsList, newTarget) - - 7. If trap is undefined, then - b. Return Construct(target, argumentsList, newTarget). - - 9.1.14 GetPrototypeFromConstructor - - [...] - 3. Let proto be ? Get(constructor, "prototype"). - 4. If Type(proto) is not Object, then - a. Let realm be ? GetFunctionRealm(constructor). - b. Let proto be realm's intrinsic object named intrinsicDefaultProto. - [...] -features: [cross-realm, Proxy, Reflect, Reflect.construct] ----*/ - -var other = $262.createRealm().global; -var C = new other.Function(); - -var P = new Proxy(function() {}, {}); - -var p = Reflect.construct(P, [], C); - -assert.sameValue(Object.getPrototypeOf(Object.getPrototypeOf(p)), other.Object.prototype); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-newtarget-realm.js b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-newtarget-realm.js new file mode 100644 index 000000000000..5c4aa463f4d5 --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined-proto-from-newtarget-realm.js @@ -0,0 +1,56 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget +description: > + If trap is undefined, propagate [[Construct]] to target, + passing correct newTarget parameter +info: | + [[Construct]] ( argumentsList, newTarget ) + + [...] + 7. If trap is undefined, then + b. Return ? Construct(target, argumentsList, newTarget). + + Construct ( F [ , argumentsList [ , newTarget ] ] ) + + [...] + 5. Return ? F.[[Construct]](argumentsList, newTarget). + + [[Construct]] ( argumentsList, newTarget ) + + [...] + 5. If kind is "base", then + a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget, "%ObjectPrototype%"). + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + [...] + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + [...] + 3. Let proto be ? Get(constructor, "prototype"). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. + + GetFunctionRealm ( obj ) + + [...] + 2. If obj has a [[Realm]] internal slot, then + a. Return obj.[[Realm]]. +features: [cross-realm, Proxy, Reflect, Reflect.construct] +---*/ + +var other = $262.createRealm().global; +var C = new other.Function(); +C.prototype = null; + +var P = new Proxy(function() {}, {}); +var p = Reflect.construct(P, [], C); + +assert.sameValue(Object.getPrototypeOf(p), other.Object.prototype); diff --git a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined.js b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined.js index 82b400abc891..8017bc512000 100644 --- a/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined.js +++ b/JSTests/test262/test/built-ins/Proxy/construct/trap-is-undefined.js @@ -21,24 +21,31 @@ info: | ... 3. If func is either undefined or null, return undefined. ... -features: [new.target, Proxy, Reflect, Reflect.construct] +features: [Proxy, Reflect, Reflect.construct] ---*/ var calls = 0; - -function NewTarget() {} - -function Target(a, b) { - assert.sameValue(new.target, NewTarget); - calls += 1; - return { - sum: a + b - }; -} +var _NewTarget; + +var Target = new Proxy(function() { + throw new Test262Error('target should not be called'); +}, { + construct: function(_Target, args, NewTarget) { + calls += 1; + _NewTarget = NewTarget; + return { + sum: args[0] + args[1] + }; + }, +}); var P = new Proxy(Target, { construct: undefined }); + +var NewTarget = function() {}; var obj = Reflect.construct(P, [3, 4], NewTarget); -assert.sameValue(obj.sum, 7, "`construct` trap is `undefined`"); -assert.sameValue(calls, 1, "target is called once"); + +assert.sameValue(calls, 1, "construct is undefined: [[Construct]] is invoked once"); +assert.sameValue(_NewTarget, NewTarget, "construct is undefined: NewTarget is passed to [[Construct]]"); +assert.sameValue(obj.sum, 7, "construct is undefined: result of [[Construct]] is returned"); diff --git a/JSTests/test262/test/built-ins/Proxy/defineProperty/targetdesc-not-configurable-writable-desc-not-writable.js b/JSTests/test262/test/built-ins/Proxy/defineProperty/targetdesc-not-configurable-writable-desc-not-writable.js index 9650a9350c43..23e2a0e96a50 100644 --- a/JSTests/test262/test/built-ins/Proxy/defineProperty/targetdesc-not-configurable-writable-desc-not-writable.js +++ b/JSTests/test262/test/built-ins/Proxy/defineProperty/targetdesc-not-configurable-writable-desc-not-writable.js @@ -16,7 +16,7 @@ info: | i. If Desc has a [[Writable]] field and Desc.[[Writable]] is false, throw a TypeError exception. ... -features: [Proxy, Reflect] +features: [Proxy, Reflect, proxy-missing-checks] ---*/ var trapCalls = 0; diff --git a/JSTests/test262/test/built-ins/Proxy/deleteProperty/targetdesc-is-configurable-target-is-not-extensible.js b/JSTests/test262/test/built-ins/Proxy/deleteProperty/targetdesc-is-configurable-target-is-not-extensible.js index fd496139d5eb..e30133d33b18 100644 --- a/JSTests/test262/test/built-ins/Proxy/deleteProperty/targetdesc-is-configurable-target-is-not-extensible.js +++ b/JSTests/test262/test/built-ins/Proxy/deleteProperty/targetdesc-is-configurable-target-is-not-extensible.js @@ -12,7 +12,7 @@ info: | 13. Let extensibleTarget be ? IsExtensible(target). 14. If extensibleTarget is false, throw a TypeError exception. ... -features: [Proxy, Reflect] +features: [Proxy, Reflect, proxy-missing-checks] ---*/ var trapCalls = 0; diff --git a/JSTests/test262/test/built-ins/Proxy/get-fn-realm-recursive.js b/JSTests/test262/test/built-ins/Proxy/get-fn-realm-recursive.js new file mode 100644 index 000000000000..488e13a936e7 --- /dev/null +++ b/JSTests/test262/test/built-ins/Proxy/get-fn-realm-recursive.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-getfunctionrealm +description: > + The realm of a proxy exotic object is the realm of its target function. + GetFunctionRealm is called recursively. +info: | + 7.3.22 GetFunctionRealm ( obj ) + + [...] + 2. If obj has a [[Realm]] internal slot, then + a. Return obj.[[Realm]]. + [...] + 4. If obj is a Proxy exotic object, then + a. If obj.[[ProxyHandler]] is null, throw a TypeError exception. + b. Let proxyTarget be obj.[[ProxyTarget]]. + c. Return ? GetFunctionRealm(proxyTarget). +features: [cross-realm, Proxy] +---*/ + +var other = $262.createRealm().global; +var C = new other.Function(); +C.prototype = null; +var P = new Proxy(new Proxy(C, {}), {}); + +assert.sameValue(Object.getPrototypeOf(new P()), other.Object.prototype); diff --git a/JSTests/test262/test/built-ins/Proxy/get-fn-realm.js b/JSTests/test262/test/built-ins/Proxy/get-fn-realm.js index 4dc7a9b3f7bf..b93ee9718a3e 100644 --- a/JSTests/test262/test/built-ins/Proxy/get-fn-realm.js +++ b/JSTests/test262/test/built-ins/Proxy/get-fn-realm.js @@ -6,24 +6,22 @@ es6id: 7.3.22 description: > The realm of a proxy exotic object is the realm of its target function info: | + 7.3.22 GetFunctionRealm ( obj ) + [...] 2. If obj has a [[Realm]] internal slot, then - a, Return obj's [[Realm]] internal slot. - 3. If obj is a Bound Function exotic object, then - [...] + a. Return obj.[[Realm]]. + [...] 4. If obj is a Proxy exotic object, then - a. If the value of the [[ProxyHandler]] internal slot of obj is null, - throw a TypeError exception. - b. Let proxyTarget be the value of obj's [[ProxyTarget]] internal slot. + a. If obj.[[ProxyHandler]] is null, throw a TypeError exception. + b. Let proxyTarget be obj.[[ProxyTarget]]. c. Return ? GetFunctionRealm(proxyTarget). features: [cross-realm, Proxy] ---*/ var other = $262.createRealm().global; var C = new other.Function(); -// Ensure that the proxy does not report a `prototype` property -var P = new Proxy(C, { - get: function() {} -}); +C.prototype = null; +var P = new Proxy(C, {}); assert.sameValue(Object.getPrototypeOf(new P()), other.Object.prototype); diff --git a/JSTests/test262/test/built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-is-not-configurable-not-writable-targetdesc-is-writable.js b/JSTests/test262/test/built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-is-not-configurable-not-writable-targetdesc-is-writable.js index d2337d8d026b..89bd982485ea 100644 --- a/JSTests/test262/test/built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-is-not-configurable-not-writable-targetdesc-is-writable.js +++ b/JSTests/test262/test/built-ins/Proxy/getOwnPropertyDescriptor/resultdesc-is-not-configurable-not-writable-targetdesc-is-writable.js @@ -15,7 +15,7 @@ info: | false, then i. If targetDesc.[[Writable]] is true, throw a TypeError exception. ... -features: [Proxy] +features: [Proxy, proxy-missing-checks] ---*/ var trapCalls = 0; diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII.js index d8c46b79b477..bf4c7c8bb224 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `ASCII` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII_Hex_Digit.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII_Hex_Digit.js index d26ad173c930..ff36572e5663 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII_Hex_Digit.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ASCII_Hex_Digit.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `ASCII_Hex_Digit` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Alphabetic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Alphabetic.js index 26773f7d14f8..137823a4c0f1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Alphabetic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Alphabetic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Alphabetic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Any.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Any.js index 8dfd3309e4c0..a1d4c3c85d53 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Any.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Any.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Any` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Assigned.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Assigned.js index f0d66e90d47d..50f7ab09367d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Assigned.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Assigned.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Assigned` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -337,8 +337,7 @@ const matchSymbols = buildString({ [0x003190, 0x0031BA], [0x0031C0, 0x0031E3], [0x0031F0, 0x00321E], - [0x003220, 0x0032FE], - [0x003300, 0x004DB5], + [0x003220, 0x004DB5], [0x004DC0, 0x009FEF], [0x00A000, 0x00A48C], [0x00A490, 0x00A4C6], @@ -815,7 +814,6 @@ const nonMatchSymbols = buildString({ 0x003130, 0x00318F, 0x00321F, - 0x0032FF, 0x00A9CE, 0x00A9FF, 0x00AB27, diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Control.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Control.js index d7423dfd0034..a3ce20c7244b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Control.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Control.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Bidi_Control` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Mirrored.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Mirrored.js index 159467100edf..8b3632766e5e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Mirrored.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Bidi_Mirrored.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Bidi_Mirrored` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Case_Ignorable.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Case_Ignorable.js index 05ff5fbc0537..2a98749fa614 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Case_Ignorable.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Case_Ignorable.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Case_Ignorable` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Cased.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Cased.js index 4fc54c75787e..bf8797209d22 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Cased.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Cased.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Cased` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casefolded.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casefolded.js index 5c1acb1ab1e4..5f3a6ce20a1b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casefolded.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casefolded.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Changes_When_Casefolded` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casemapped.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casemapped.js index 87496eb70c9e..be8cef359356 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casemapped.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Casemapped.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Changes_When_Casemapped` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Lowercased.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Lowercased.js index a68718c1f7e6..d33eff675828 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Lowercased.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Lowercased.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Changes_When_Lowercased` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_NFKC_Casefolded.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_NFKC_Casefolded.js index fdb0ab124dd3..8167be45ca44 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_NFKC_Casefolded.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_NFKC_Casefolded.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Changes_When_NFKC_Casefolded` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -745,8 +745,7 @@ const matchSymbols = buildString({ [0x003200, 0x00321E], [0x003220, 0x003247], [0x003250, 0x00327E], - [0x003280, 0x0032FE], - [0x003300, 0x0033FF], + [0x003280, 0x0033FF], [0x00A69C, 0x00A69D], [0x00A77D, 0x00A77E], [0x00A7AA, 0x00A7AE], @@ -1318,7 +1317,6 @@ const nonMatchSymbols = buildString({ 0x003037, 0x00321F, 0x00327F, - 0x0032FF, 0x00A641, 0x00A643, 0x00A645, diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Titlecased.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Titlecased.js index 3791983a7ac9..e83c06c7e1ea 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Titlecased.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Titlecased.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Changes_When_Titlecased` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Uppercased.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Uppercased.js index 9765985884b5..10aa57333863 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Uppercased.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Changes_When_Uppercased.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Changes_When_Uppercased` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Dash.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Dash.js index 29c36f8a480e..01d3183c832b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Dash.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Dash.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Dash` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Default_Ignorable_Code_Point.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Default_Ignorable_Code_Point.js index 7d0dd5faca3a..5ebc28a8cfde 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Default_Ignorable_Code_Point.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Default_Ignorable_Code_Point.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Default_Ignorable_Code_Point` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Deprecated.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Deprecated.js index 5f3ea0708160..8fb56164d226 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Deprecated.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Deprecated.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Deprecated` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Diacritic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Diacritic.js index aa72f8628d6d..555135c98e96 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Diacritic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Diacritic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Diacritic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji.js index aa03746c1229..c467f1998d81 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Emoji` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Component.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Component.js index 0f5b90498b22..64dbcc1e2403 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Component.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Component.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Emoji_Component` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier.js index eb82e2cf43db..4556de587d31 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Emoji_Modifier` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier_Base.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier_Base.js index 06c12e4c8f6d..fa8c9a27a988 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier_Base.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Modifier_Base.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Emoji_Modifier_Base` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Presentation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Presentation.js index d561333979ca..b83881e5099c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Presentation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Emoji_Presentation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Emoji_Presentation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extended_Pictographic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extended_Pictographic.js index 42a108b42ed1..7223cb9d72fc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extended_Pictographic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extended_Pictographic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Extended_Pictographic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extender.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extender.js index fa5effa12ac5..fd0da156ff3a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extender.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Extender.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Extender` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter.js index bf981be409a1..956f0e43a8c6 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Cased_Letter.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Cased_Letter` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Close_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Close_Punctuation.js index 0242e700755b..b421bba091ce 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Close_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Close_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Close_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Connector_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Connector_Punctuation.js index ec19604fc99a..f3600a96622b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Connector_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Connector_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Connector_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Control.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Control.js index be635c9e43d9..044be34afd74 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Control.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Control.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Control` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Currency_Symbol.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Currency_Symbol.js index 1c24820c831c..ba1ea0362868 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Currency_Symbol.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Currency_Symbol.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Currency_Symbol` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Dash_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Dash_Punctuation.js index 2766ae7a2e28..3175a70551b8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Dash_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Dash_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Dash_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number.js index 9c8e36ad0862..38815a579445 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Decimal_Number.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Decimal_Number` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Enclosing_Mark.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Enclosing_Mark.js index 2fa3b6601f0b..f3d4ebbea9b4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Enclosing_Mark.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Enclosing_Mark.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Enclosing_Mark` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Final_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Final_Punctuation.js index cadda752c496..b68f3e932a82 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Final_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Final_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Final_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Format.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Format.js index 144b02e807ea..b4fb5df1bbba 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Format.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Format.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Format` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Initial_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Initial_Punctuation.js index cbc94f678708..3a3d8e199403 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Initial_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Initial_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Initial_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter.js index 7504c77fcabf..b57ba9bf7f5e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Letter` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter_Number.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter_Number.js index d7f80b795e8c..9a647d59e011 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter_Number.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Letter_Number.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Letter_Number` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Line_Separator.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Line_Separator.js index 9c2a60f30389..e7f8e75e073a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Line_Separator.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Line_Separator.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Line_Separator` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter.js index 374249c83f21..502935cd3023 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Lowercase_Letter.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Lowercase_Letter` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Mark.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Mark.js index 518e4b0625ce..ff6efed25223 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Mark.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Mark.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Mark` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Math_Symbol.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Math_Symbol.js index f6a368ae2cf3..7e1fa8a49129 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Math_Symbol.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Math_Symbol.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Math_Symbol` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter.js index 23a506a08e56..c62210d66f33 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Letter.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Modifier_Letter` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Symbol.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Symbol.js index 8a022695b957..2827ad10acfd 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Symbol.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Modifier_Symbol.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Modifier_Symbol` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark.js index 2c6149e34bf9..6c1fc160d3c4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Nonspacing_Mark.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Nonspacing_Mark` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Number.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Number.js index 3f0b1c8e33f6..c74a81383d83 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Number.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Number.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Number` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Open_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Open_Punctuation.js index faaa924dc413..4bac4b5c87f1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Open_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Open_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Open_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other.js index f36020adf894..9c2fee5e8c90 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Other` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -133,7 +133,6 @@ const matchSymbols = buildString({ 0x003130, 0x00318F, 0x00321F, - 0x0032FF, 0x00A9CE, 0x00A9FF, 0x00AB27, @@ -1047,8 +1046,7 @@ const nonMatchSymbols = buildString({ [0x003190, 0x0031BA], [0x0031C0, 0x0031E3], [0x0031F0, 0x00321E], - [0x003220, 0x0032FE], - [0x003300, 0x004DB5], + [0x003220, 0x004DB5], [0x004DC0, 0x009FEF], [0x00A000, 0x00A48C], [0x00A490, 0x00A4C6], diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter.js index f737b532c609..18c234e88b5d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Letter.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Other_Letter` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number.js index 8d853183e8e2..aa23095df561 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Number.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Other_Number` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation.js index 87fa3a32982e..5ce4bdd35297 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Other_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol.js index 4ed811370ab8..67cc3936ac4b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Other_Symbol.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Other_Symbol` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -129,8 +129,7 @@ const matchSymbols = buildString({ [0x00322A, 0x003247], [0x003260, 0x00327F], [0x00328A, 0x0032B0], - [0x0032C0, 0x0032FE], - [0x003300, 0x0033FF], + [0x0032C0, 0x0033FF], [0x004DC0, 0x004DFF], [0x00A490, 0x00A4C6], [0x00A828, 0x00A82B], @@ -259,7 +258,6 @@ const nonMatchSymbols = buildString({ 0x0025C1, 0x00266F, 0x002E9A, - 0x0032FF, 0x00A838, 0x01018F, 0x01DA75, diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Paragraph_Separator.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Paragraph_Separator.js index 0013bcb0fd97..4ced91c20963 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Paragraph_Separator.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Paragraph_Separator.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Paragraph_Separator` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Private_Use.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Private_Use.js index 21995989d1e9..97d92c85ec1f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Private_Use.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Private_Use.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Private_Use` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation.js index f083315eb1b3..f42b45b53155 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Separator.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Separator.js index ff5e429ccf45..05e8363de5d9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Separator.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Separator.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Separator` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Space_Separator.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Space_Separator.js index 0acefa123de9..9491ea2ceda5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Space_Separator.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Space_Separator.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Space_Separator` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark.js index b6ee10540992..5fc0db305feb 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Spacing_Mark.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Spacing_Mark` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Surrogate.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Surrogate.js index 134b3d111dd2..5de0be3ca4ae 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Surrogate.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Surrogate.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Surrogate` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol.js index 3026eb5150cb..a1a400ffcb9a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Symbol.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Symbol` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -168,8 +168,7 @@ const matchSymbols = buildString({ [0x00322A, 0x003247], [0x003260, 0x00327F], [0x00328A, 0x0032B0], - [0x0032C0, 0x0032FE], - [0x003300, 0x0033FF], + [0x0032C0, 0x0033FF], [0x004DC0, 0x004DFF], [0x00A490, 0x00A4C6], [0x00A700, 0x00A716], @@ -299,7 +298,6 @@ const nonMatchSymbols = buildString({ 0x002128, 0x00214E, 0x002E9A, - 0x0032FF, 0x00FE63, 0x00FF3F, 0x00FF5D, diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Titlecase_Letter.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Titlecase_Letter.js index 8b7a20f77dd8..03535e069ce9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Titlecase_Letter.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Titlecase_Letter.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Titlecase_Letter` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Unassigned.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Unassigned.js index 401ba92d730f..f702dc6f25cf 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Unassigned.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Unassigned.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Unassigned` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -134,7 +134,6 @@ const matchSymbols = buildString({ 0x003130, 0x00318F, 0x00321F, - 0x0032FF, 0x00A9CE, 0x00A9FF, 0x00AB27, @@ -1041,8 +1040,7 @@ const nonMatchSymbols = buildString({ [0x003190, 0x0031BA], [0x0031C0, 0x0031E3], [0x0031F0, 0x00321E], - [0x003220, 0x0032FE], - [0x003300, 0x004DB5], + [0x003220, 0x004DB5], [0x004DC0, 0x009FEF], [0x00A000, 0x00A48C], [0x00A490, 0x00A4C6], diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Uppercase_Letter.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Uppercase_Letter.js index f5ccd072bfa4..e7c3596e95f5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Uppercase_Letter.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/General_Category_-_Uppercase_Letter.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `General_Category=Uppercase_Letter` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Base.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Base.js index c87f2295e271..045ca0ce5421 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Base.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Base.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Grapheme_Base` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -453,8 +453,7 @@ const matchSymbols = buildString({ [0x003190, 0x0031BA], [0x0031C0, 0x0031E3], [0x0031F0, 0x00321E], - [0x003220, 0x0032FE], - [0x003300, 0x004DB5], + [0x003220, 0x004DB5], [0x004DC0, 0x009FEF], [0x00A000, 0x00A48C], [0x00A490, 0x00A4C6], @@ -987,7 +986,6 @@ const nonMatchSymbols = buildString({ 0x003130, 0x00318F, 0x00321F, - 0x0032FF, 0x00A802, 0x00A806, 0x00A80B, diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Extend.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Extend.js index 6ade84ae0728..59847695b386 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Extend.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Grapheme_Extend.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Grapheme_Extend` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Hex_Digit.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Hex_Digit.js index ac1e40cd0315..9baf7efd4a9e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Hex_Digit.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Hex_Digit.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Hex_Digit` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Binary_Operator.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Binary_Operator.js index e218cbea6fcf..9fe944e288c3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Binary_Operator.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Binary_Operator.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `IDS_Binary_Operator` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Trinary_Operator.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Trinary_Operator.js index 0989ee6524a3..d9d87e44d04b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Trinary_Operator.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/IDS_Trinary_Operator.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `IDS_Trinary_Operator` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Continue.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Continue.js index 1abf75ef3391..f85b80e55f55 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Continue.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Continue.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `ID_Continue` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Start.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Start.js index 9c9fd40ae744..f02f0e75a8c0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Start.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/ID_Start.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `ID_Start` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Ideographic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Ideographic.js index 5c68cb42413a..d5ab4733a33c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Ideographic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Ideographic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Ideographic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Join_Control.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Join_Control.js index 04cb0f7e1fcc..d6dca62456a4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Join_Control.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Join_Control.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Join_Control` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Logical_Order_Exception.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Logical_Order_Exception.js index 04d99005fc61..b609481d2b0f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Logical_Order_Exception.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Logical_Order_Exception.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Logical_Order_Exception` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Lowercase.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Lowercase.js index 52ce4069b92c..79a64addd178 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Lowercase.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Lowercase.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Lowercase` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Math.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Math.js index 96e96caa9cb0..9de4b272d0f8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Math.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Math.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Math` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Noncharacter_Code_Point.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Noncharacter_Code_Point.js index cd3440aa3978..291895810a49 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Noncharacter_Code_Point.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Noncharacter_Code_Point.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Noncharacter_Code_Point` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_Syntax.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_Syntax.js index 03befaaa8aff..0c2374fb6ba6 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_Syntax.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_Syntax.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Pattern_Syntax` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_White_Space.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_White_Space.js index 59d411337da5..243f0e5fff96 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_White_Space.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Pattern_White_Space.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Pattern_White_Space` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Quotation_Mark.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Quotation_Mark.js index 916b09fd800d..6f7d23607c2b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Quotation_Mark.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Quotation_Mark.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Quotation_Mark` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Radical.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Radical.js index 244734d698d1..a86387a4cf40 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Radical.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Radical.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Radical` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Regional_Indicator.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Regional_Indicator.js index d00ea7d9cf64..126663454acc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Regional_Indicator.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Regional_Indicator.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Regional_Indicator` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Adlam.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Adlam.js index 3470ce3d0a30..8ab40927b618 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Adlam.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Adlam.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Adlam` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ahom.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ahom.js index 6a3152045a81..d7080f2e1ccf 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ahom.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ahom.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Ahom` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Anatolian_Hieroglyphs.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Anatolian_Hieroglyphs.js index effd2413f88d..71475872c06d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Anatolian_Hieroglyphs.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Anatolian_Hieroglyphs.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Anatolian_Hieroglyphs` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.js index ea3c072d153c..796c3ff9c20c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Arabic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Arabic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Armenian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Armenian.js index c78df1121710..57dcc2071818 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Armenian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Armenian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Armenian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Avestan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Avestan.js index f327be5da21d..09a1fc8c207a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Avestan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Avestan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Avestan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Balinese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Balinese.js index 3ae8278aaf36..3ee2b4051057 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Balinese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Balinese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Balinese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bamum.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bamum.js index 434b5aa07aec..f1134f9572e3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bamum.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bamum.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Bamum` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bassa_Vah.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bassa_Vah.js index e17ebcc88bad..38cdd51b4b58 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bassa_Vah.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bassa_Vah.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Bassa_Vah` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Batak.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Batak.js index 0217765eae9b..b4efb83e8a7c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Batak.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Batak.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Batak` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bengali.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bengali.js index 6881d2347dde..cf8536015c76 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bengali.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bengali.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Bengali` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bhaiksuki.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bhaiksuki.js index 582bfaa7286b..dbeb3c1516dc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bhaiksuki.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bhaiksuki.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Bhaiksuki` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bopomofo.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bopomofo.js index 8c9001f713cb..cf1af5777b77 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bopomofo.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Bopomofo.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Bopomofo` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Brahmi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Brahmi.js index d9365868b176..de51a0364b4b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Brahmi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Brahmi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Brahmi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Braille.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Braille.js index 37d317fc0b27..83f58de58ff1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Braille.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Braille.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Braille` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buginese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buginese.js index a4c23da82e06..ed350de96a9b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buginese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buginese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Buginese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buhid.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buhid.js index 4268fc663346..e7da61f6f76e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buhid.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Buhid.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Buhid` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Canadian_Aboriginal.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Canadian_Aboriginal.js index 59b4535e00ca..472d4e8a4299 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Canadian_Aboriginal.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Canadian_Aboriginal.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Canadian_Aboriginal` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Carian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Carian.js index 4740392e67e5..8a0c8541c926 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Carian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Carian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Carian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Caucasian_Albanian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Caucasian_Albanian.js index d94e8fbe9447..4f722fdbd283 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Caucasian_Albanian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Caucasian_Albanian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Caucasian_Albanian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Chakma.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Chakma.js index 004475931906..6ccff134c4a2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Chakma.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Chakma.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Chakma` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cham.js index 42d0c2adf942..1a86d72933dd 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Cham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cherokee.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cherokee.js index 7ff27e4bdb24..1c273076ce49 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cherokee.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cherokee.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Cherokee` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Common.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Common.js index 33e06ec11d5d..f34a83519eb1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Common.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Common.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Common` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -37,6 +37,7 @@ const matchSymbols = buildString({ 0x001CFA, 0x003006, 0x0030A0, + 0x0032FF, 0x00A92E, 0x00A9CF, 0x00AB5B, @@ -305,7 +306,8 @@ const nonMatchSymbols = buildString({ [0x0031A0, 0x0031BF], [0x0031E4, 0x00321F], [0x003260, 0x00327E], - [0x0032D0, 0x003357], + [0x0032D0, 0x0032FE], + [0x003300, 0x003357], [0x003400, 0x004DBF], [0x004E00, 0x00A6FF], [0x00A722, 0x00A787], diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Coptic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Coptic.js index a154c4c698a4..a06d37185315 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Coptic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Coptic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Coptic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cuneiform.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cuneiform.js index 5e287e3170a9..9f5bdaed1892 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cuneiform.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cuneiform.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Cuneiform` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cypriot.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cypriot.js index bcc808d3eefa..42549f5b0003 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cypriot.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cypriot.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Cypriot` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cyrillic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cyrillic.js index 9d3e76906bb0..dc42fd63d886 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cyrillic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Cyrillic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Cyrillic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Deseret.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Deseret.js index f69c995517f6..fdaa402dde5f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Deseret.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Deseret.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Deseret` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Devanagari.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Devanagari.js index 90ab95e8afa9..a6da95deb8a2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Devanagari.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Devanagari.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Devanagari` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Dogra.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Dogra.js index 288d81d8f585..9563ff20051e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Dogra.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Dogra.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Dogra` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Duployan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Duployan.js index 5134b6a6fb51..ea09cf8c1ed2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Duployan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Duployan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Duployan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Egyptian_Hieroglyphs.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Egyptian_Hieroglyphs.js index d90cae91de91..5721c6405f1d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Egyptian_Hieroglyphs.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Egyptian_Hieroglyphs.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Egyptian_Hieroglyphs` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elbasan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elbasan.js index e2955d78eab0..c2303cc05cd8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elbasan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elbasan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Elbasan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elymaic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elymaic.js index d871c4253209..c91ca1dfab04 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elymaic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Elymaic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Elymaic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ethiopic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ethiopic.js index d85ef46f7fd7..f6983d963472 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ethiopic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ethiopic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Ethiopic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Georgian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Georgian.js index 5b5775c52416..998cc6cc71c8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Georgian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Georgian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Georgian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js index 87859a463822..3e3d036e5409 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Glagolitic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Glagolitic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gothic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gothic.js index c39a8b0cca11..c554ff332449 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gothic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gothic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Gothic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Grantha.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Grantha.js index 8bb986afbd07..519a05a543ac 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Grantha.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Grantha.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Grantha` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Greek.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Greek.js index 73dbd1c746f2..418a1755aee2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Greek.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Greek.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Greek` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gujarati.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gujarati.js index 1eff8bd41831..7c5adda25bbd 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gujarati.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gujarati.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Gujarati` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gunjala_Gondi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gunjala_Gondi.js index 82dee68aa1f0..c1d2a4a0834d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gunjala_Gondi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gunjala_Gondi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Gunjala_Gondi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gurmukhi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gurmukhi.js index f0f613ac7a20..cfb202f14fa3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gurmukhi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Gurmukhi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Gurmukhi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Han.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Han.js index 4d544a29e9cb..7c64136dc97e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Han.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Han.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Han` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hangul.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hangul.js index 5ae8530022f5..75a7417af823 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hangul.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hangul.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Hangul` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanifi_Rohingya.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanifi_Rohingya.js index 9cfd33b2c61f..63806c7231cf 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanifi_Rohingya.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanifi_Rohingya.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Hanifi_Rohingya` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanunoo.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanunoo.js index 134a1ef1a27a..9b35f348bc34 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanunoo.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hanunoo.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Hanunoo` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hatran.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hatran.js index b1daeced7c79..74b0edc7a6eb 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hatran.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hatran.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Hatran` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hebrew.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hebrew.js index a763f7c6983b..ed0341f27458 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hebrew.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hebrew.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Hebrew` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hiragana.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hiragana.js index bc8ebc9cab56..20c521f0a733 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hiragana.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Hiragana.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Hiragana` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Imperial_Aramaic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Imperial_Aramaic.js index 17c5952798bb..77b26af48627 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Imperial_Aramaic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Imperial_Aramaic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Imperial_Aramaic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inherited.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inherited.js index 9c58dcb40b45..e15bd27d2e74 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inherited.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inherited.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Inherited` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Pahlavi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Pahlavi.js index acb3b6c67da3..94a62432191d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Pahlavi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Pahlavi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Inscriptional_Pahlavi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Parthian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Parthian.js index 7b711111bcf0..d2810ec139e7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Parthian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Inscriptional_Parthian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Inscriptional_Parthian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Javanese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Javanese.js index 182f28fd351b..95b1fa20f555 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Javanese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Javanese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Javanese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kaithi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kaithi.js index 0e50042e65e3..9e8cb8d65fce 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kaithi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kaithi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Kaithi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kannada.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kannada.js index bfeebeb19692..c1984ceb24f1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kannada.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kannada.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Kannada` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Katakana.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Katakana.js index cdc17d54c2de..9472e2f1edc5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Katakana.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Katakana.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Katakana` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kayah_Li.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kayah_Li.js index dfdf2a95e838..73cbc75bd41e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kayah_Li.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kayah_Li.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Kayah_Li` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kharoshthi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kharoshthi.js index 4c1b0f1b307f..71eb43a7f426 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kharoshthi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Kharoshthi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Kharoshthi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khmer.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khmer.js index 6730a5d27373..385ea653ae06 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khmer.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khmer.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Khmer` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khojki.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khojki.js index 19a0bfbdf401..aee47f7068eb 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khojki.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khojki.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Khojki` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khudawadi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khudawadi.js index 20c7c2faca2d..6ac157f1bea8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khudawadi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Khudawadi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Khudawadi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lao.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lao.js index ca0dfd3c8e08..1b77bcde2644 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lao.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lao.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Lao` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Latin.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Latin.js index b6888251a8f0..ae2e6137f112 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Latin.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Latin.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Latin` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lepcha.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lepcha.js index ddd1386e4f24..fea200061a60 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lepcha.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lepcha.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Lepcha` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Limbu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Limbu.js index 595d0d6fa83a..a2500c2fc732 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Limbu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Limbu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Limbu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_A.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_A.js index 1a568fe610a4..7776ac4c07e5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_A.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_A.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Linear_A` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_B.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_B.js index da6ba4ce7e19..b5348d896f45 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_B.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Linear_B.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Linear_B` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lisu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lisu.js index a3d0f4e9acec..cc40b4a9cb1c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lisu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lisu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Lisu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lycian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lycian.js index 3fdd5e90603c..07e095be2dbc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lycian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lycian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Lycian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lydian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lydian.js index b389c2467171..ad43428bccad 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lydian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Lydian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Lydian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mahajani.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mahajani.js index 7ee63ff641fb..3b6ab3859ece 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mahajani.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mahajani.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Mahajani` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Makasar.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Makasar.js index fe7942c04a15..f7607434dac0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Makasar.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Makasar.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Makasar` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Malayalam.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Malayalam.js index 6af427b07c1f..c8003ab4be11 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Malayalam.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Malayalam.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Malayalam` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mandaic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mandaic.js index 3c5734e33a85..d75efff08af8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mandaic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mandaic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Mandaic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Manichaean.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Manichaean.js index 681752944863..110c7fd285d5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Manichaean.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Manichaean.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Manichaean` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Marchen.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Marchen.js index 34d9320200a6..5c2c32520f29 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Marchen.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Marchen.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Marchen` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Masaram_Gondi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Masaram_Gondi.js index 58a4d37e84eb..f9b9570c63d3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Masaram_Gondi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Masaram_Gondi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Masaram_Gondi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Medefaidrin.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Medefaidrin.js index 2cef82eea3c2..49dae5e45ae7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Medefaidrin.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Medefaidrin.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Medefaidrin` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meetei_Mayek.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meetei_Mayek.js index 43fb1874fa00..a150b95d35e0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meetei_Mayek.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meetei_Mayek.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Meetei_Mayek` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mende_Kikakui.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mende_Kikakui.js index e8cabda72919..4d54ae35bcc9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mende_Kikakui.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mende_Kikakui.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Mende_Kikakui` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Cursive.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Cursive.js index ac842e219e26..86418a6a5c4f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Cursive.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Cursive.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Meroitic_Cursive` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Hieroglyphs.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Hieroglyphs.js index bd8bec54a200..5b136711efc6 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Hieroglyphs.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Meroitic_Hieroglyphs.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Meroitic_Hieroglyphs` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Miao.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Miao.js index b9727ac3109c..4d6306f2c78a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Miao.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Miao.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Miao` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Modi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Modi.js index b031523db51a..97c325264dd0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Modi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Modi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Modi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mongolian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mongolian.js index 7273a2096af7..4a2bdd98c010 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mongolian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mongolian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Mongolian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mro.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mro.js index 2d901873df64..814bccd54083 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mro.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Mro.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Mro` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Multani.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Multani.js index a4792ffcc829..a712aed16d9e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Multani.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Multani.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Multani` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Myanmar.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Myanmar.js index c4ffd73bb40f..b93dbbc7db73 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Myanmar.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Myanmar.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Myanmar` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nabataean.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nabataean.js index 4717014f9d93..2b6df78f1aa7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nabataean.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nabataean.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Nabataean` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nandinagari.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nandinagari.js index cf5201c1d4a9..20ead60b7a43 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nandinagari.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nandinagari.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Nandinagari` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_New_Tai_Lue.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_New_Tai_Lue.js index f4faa8b8ead2..54e3a1048043 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_New_Tai_Lue.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_New_Tai_Lue.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=New_Tai_Lue` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Newa.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Newa.js index 7a46528ebc0c..a59a2b1808f2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Newa.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Newa.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Newa` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nko.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nko.js index fea1170659c3..680c6a9198bc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nko.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nko.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Nko` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nushu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nushu.js index ba6c0527b2d6..b8198518c591 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nushu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nushu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Nushu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nyiakeng_Puachue_Hmong.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nyiakeng_Puachue_Hmong.js index 8da82d260692..a321f05d4cf5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nyiakeng_Puachue_Hmong.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Nyiakeng_Puachue_Hmong.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Nyiakeng_Puachue_Hmong` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ogham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ogham.js index 48585d2e095c..b7dd17d43e39 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ogham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ogham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Ogham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ol_Chiki.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ol_Chiki.js index f813bc50961d..a8d731eb5c52 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ol_Chiki.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ol_Chiki.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Ol_Chiki` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Hungarian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Hungarian.js index 9b81864da4c1..7fcb51d58e66 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Hungarian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Hungarian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_Hungarian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Italic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Italic.js index f342a8dbf4d8..80eabcae2720 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Italic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Italic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_Italic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_North_Arabian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_North_Arabian.js index 64d7d4c90e32..ae944e22c48d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_North_Arabian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_North_Arabian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_North_Arabian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Permic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Permic.js index 8a76cfdbb0e1..2c7df79be6a7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Permic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Permic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_Permic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Persian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Persian.js index 028c73b2cd62..277f626a9b8f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Persian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Persian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_Persian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Sogdian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Sogdian.js index 9920644c670c..7c32a75a66d3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Sogdian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Sogdian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_Sogdian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_South_Arabian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_South_Arabian.js index 50e612e84dd0..92d03e671cd9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_South_Arabian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_South_Arabian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_South_Arabian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Turkic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Turkic.js index e6fbe126d5fa..544176b1fd0a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Turkic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Old_Turkic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Old_Turkic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Oriya.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Oriya.js index 74283639cc58..6639f743a98b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Oriya.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Oriya.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Oriya` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osage.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osage.js index 9d41a252764a..6a437a8f1ad4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osage.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osage.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Osage` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osmanya.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osmanya.js index 902b35613bb8..3e059ce2a87c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osmanya.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Osmanya.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Osmanya` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pahawh_Hmong.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pahawh_Hmong.js index e69b9d206fd3..7b37136a876c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pahawh_Hmong.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pahawh_Hmong.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Pahawh_Hmong` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Palmyrene.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Palmyrene.js index f09595578dfc..ef362bbf8fe4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Palmyrene.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Palmyrene.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Palmyrene` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pau_Cin_Hau.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pau_Cin_Hau.js index 570a841c9296..68a17b594daf 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pau_Cin_Hau.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Pau_Cin_Hau.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Pau_Cin_Hau` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phags_Pa.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phags_Pa.js index 4cbbec7a8e15..ab7ffdad710d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phags_Pa.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phags_Pa.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Phags_Pa` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phoenician.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phoenician.js index 32152be9822a..681bf724c63f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phoenician.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Phoenician.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Phoenician` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Psalter_Pahlavi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Psalter_Pahlavi.js index cd3494a99e24..be0a7c38f0ed 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Psalter_Pahlavi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Psalter_Pahlavi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Psalter_Pahlavi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Rejang.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Rejang.js index a4f440ca575e..86b521c8ad0a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Rejang.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Rejang.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Rejang` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Runic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Runic.js index 04ca08fb673a..5580a1b2c32a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Runic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Runic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Runic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Samaritan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Samaritan.js index 474093535e5b..68aa4874dbc7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Samaritan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Samaritan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Samaritan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Saurashtra.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Saurashtra.js index 069a5fe81448..50142a3e74c7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Saurashtra.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Saurashtra.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Saurashtra` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sharada.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sharada.js index 5fdccb3237ee..472a485486b8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sharada.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sharada.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Sharada` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Shavian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Shavian.js index 5549a3728c50..ad7fb6a9b08e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Shavian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Shavian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Shavian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Siddham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Siddham.js index 797b29f42547..c473ce453adb 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Siddham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Siddham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Siddham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_SignWriting.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_SignWriting.js index df095522e66c..52c7ca9b0bff 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_SignWriting.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_SignWriting.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=SignWriting` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sinhala.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sinhala.js index f307aef408f1..8f6ed8d1fe7d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sinhala.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sinhala.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Sinhala` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sogdian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sogdian.js index 0ef4c8c6e0e3..6c257f53066b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sogdian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sogdian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Sogdian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sora_Sompeng.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sora_Sompeng.js index 39428d7594f1..36d136699673 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sora_Sompeng.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sora_Sompeng.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Sora_Sompeng` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Soyombo.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Soyombo.js index 845800c5c92a..b3700189b119 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Soyombo.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Soyombo.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Soyombo` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sundanese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sundanese.js index 83521de1a3c7..dfa086daddf7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sundanese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Sundanese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Sundanese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syloti_Nagri.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syloti_Nagri.js index 84b4ada9eda4..d59cbbaa68fc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syloti_Nagri.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syloti_Nagri.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Syloti_Nagri` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syriac.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syriac.js index 6a9ccf984193..56284ad13a3c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syriac.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Syriac.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Syriac` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagalog.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagalog.js index d78ea9548453..d1db07442e38 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagalog.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagalog.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tagalog` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagbanwa.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagbanwa.js index 2fd2508b80f7..038bda72e813 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagbanwa.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tagbanwa.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tagbanwa` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Le.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Le.js index 1e193a650140..4ec9b294e633 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Le.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Le.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tai_Le` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Tham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Tham.js index 325e37290859..e9160fd37fcd 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Tham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Tham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tai_Tham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Viet.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Viet.js index 54748a223c56..b225ede99e6a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Viet.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Viet.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tai_Viet` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Takri.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Takri.js index a5cef2a5e5d8..08bac02f06f5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Takri.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Takri.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Takri` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tamil.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tamil.js index 998f173a7783..c3e07d7534ee 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tamil.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tamil.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tamil` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tangut.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tangut.js index 12855af156f5..2627579e6b5b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tangut.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tangut.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tangut` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Telugu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Telugu.js index e50d4de71e0c..cf49c597f561 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Telugu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Telugu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Telugu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thaana.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thaana.js index eeb59d76f9db..7a2603890c88 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thaana.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thaana.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Thaana` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thai.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thai.js index 5f1c22808982..f93cd9a7efc1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thai.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Thai.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Thai` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tibetan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tibetan.js index 4b7703163626..faa65ed24d6f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tibetan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tibetan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tibetan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tifinagh.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tifinagh.js index 23c7753116c7..ee20a616a16b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tifinagh.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tifinagh.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tifinagh` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tirhuta.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tirhuta.js index a273718e0ac8..55be615ddd77 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tirhuta.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Tirhuta.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Tirhuta` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ugaritic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ugaritic.js index c142e8bb2ed8..b0752b87e7e0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ugaritic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Ugaritic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Ugaritic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Vai.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Vai.js index 57f896ed9dfd..c80bb95f2bd7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Vai.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Vai.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Vai` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Wancho.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Wancho.js index 2dde1ec087bd..5142a5b7d95d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Wancho.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Wancho.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Wancho` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Warang_Citi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Warang_Citi.js index ae8646abb837..98b2e9c8108f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Warang_Citi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Warang_Citi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Warang_Citi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Yi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Yi.js index 01506e9d228b..567698535ac2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Yi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Yi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Yi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Zanabazar_Square.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Zanabazar_Square.js index 645afa73b214..586ad7c6ec68 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Zanabazar_Square.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_-_Zanabazar_Square.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script=Zanabazar_Square` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Adlam.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Adlam.js index aa411899b678..9091970e3aff 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Adlam.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Adlam.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Adlam` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ahom.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ahom.js index de21228f2909..c44337635d52 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ahom.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ahom.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Ahom` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Anatolian_Hieroglyphs.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Anatolian_Hieroglyphs.js index 2c7c27929ef6..c3a16fc8c732 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Anatolian_Hieroglyphs.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Anatolian_Hieroglyphs.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Anatolian_Hieroglyphs` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Arabic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Arabic.js index 84fb95adb9ac..e44793f1eb42 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Arabic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Arabic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Arabic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Armenian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Armenian.js index 147a0bff7a0f..2bd9351faf26 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Armenian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Armenian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Armenian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Avestan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Avestan.js index 2a43d222889a..6c60bd14a3dd 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Avestan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Avestan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Avestan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Balinese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Balinese.js index d263a675e6dd..fdb80f745e98 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Balinese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Balinese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Balinese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bamum.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bamum.js index f2fbb1a248e1..9cc88dd90ef8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bamum.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bamum.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Bamum` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bassa_Vah.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bassa_Vah.js index fe48060007c4..8da20c4883a8 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bassa_Vah.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bassa_Vah.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Bassa_Vah` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Batak.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Batak.js index fe4ce2d5f856..c6a769bec87d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Batak.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Batak.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Batak` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bengali.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bengali.js index ec32e67af625..9bab775dee2d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bengali.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bengali.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Bengali` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bhaiksuki.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bhaiksuki.js index 316e22e8857a..82ca8f7e718b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bhaiksuki.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bhaiksuki.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Bhaiksuki` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bopomofo.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bopomofo.js index e0851b558ebb..ff44e4df576c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bopomofo.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Bopomofo.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Bopomofo` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Brahmi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Brahmi.js index 1fb7cd47b473..411967065f32 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Brahmi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Brahmi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Brahmi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Braille.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Braille.js index 430e9e0709d6..c8d1947bdfa4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Braille.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Braille.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Braille` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buginese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buginese.js index 34532c6ddcd3..30a4eceff95b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buginese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buginese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Buginese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buhid.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buhid.js index 7dc760a42d7a..666983cc6faa 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buhid.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Buhid.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Buhid` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Canadian_Aboriginal.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Canadian_Aboriginal.js index d7db1534f1a1..ea7525da0e8d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Canadian_Aboriginal.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Canadian_Aboriginal.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Canadian_Aboriginal` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Carian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Carian.js index 7933d346f7c3..ab8fa68aaa4f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Carian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Carian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Carian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Caucasian_Albanian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Caucasian_Albanian.js index 577df257b25a..6c3f9674d1c2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Caucasian_Albanian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Caucasian_Albanian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Caucasian_Albanian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Chakma.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Chakma.js index 6922a0b6f80f..61867e834439 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Chakma.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Chakma.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Chakma` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cham.js index 19b4c5266f71..e1b6f2636f39 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Cham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cherokee.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cherokee.js index 11864db83408..520cb297c1b4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cherokee.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cherokee.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Cherokee` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Common.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Common.js index 81d7d95c775b..55c08adc3546 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Common.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Common.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Common` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Coptic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Coptic.js index 163aeb9c66c3..98ab5f7dff73 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Coptic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Coptic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Coptic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cuneiform.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cuneiform.js index a929667efa88..b3245ee8504b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cuneiform.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cuneiform.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Cuneiform` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cypriot.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cypriot.js index 69b8c8887021..607bcf5e14d3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cypriot.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cypriot.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Cypriot` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cyrillic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cyrillic.js index e5699083e69d..f1dd069e2c49 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cyrillic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Cyrillic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Cyrillic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Deseret.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Deseret.js index bfc58053173a..1045f20896fc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Deseret.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Deseret.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Deseret` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Devanagari.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Devanagari.js index 33f2e9d3a2b9..1e9f3cbc5001 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Devanagari.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Devanagari.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Devanagari` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Dogra.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Dogra.js index ee5b90791377..d0345d71bcff 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Dogra.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Dogra.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Dogra` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Duployan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Duployan.js index 822f858037bb..8300d3076a7b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Duployan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Duployan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Duployan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Egyptian_Hieroglyphs.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Egyptian_Hieroglyphs.js index 4a9aba139e66..0976c0c87372 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Egyptian_Hieroglyphs.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Egyptian_Hieroglyphs.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Egyptian_Hieroglyphs` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elbasan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elbasan.js index b0010ba372a8..af8ec90e74f9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elbasan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elbasan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Elbasan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elymaic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elymaic.js index 4b8556671f8d..76ef2ecd6cdf 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elymaic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Elymaic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Elymaic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ethiopic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ethiopic.js index b2620a4edd54..9ef1ce973158 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ethiopic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ethiopic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Ethiopic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Georgian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Georgian.js index 19c4cf8182b1..ff248b01b90b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Georgian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Georgian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Georgian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Glagolitic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Glagolitic.js index 01d148bf3893..33f81c9ee4fe 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Glagolitic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Glagolitic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Glagolitic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gothic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gothic.js index 20addd852953..0f46e16df6a1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gothic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gothic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Gothic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Grantha.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Grantha.js index c11d762655de..111331b2fe1e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Grantha.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Grantha.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Grantha` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Greek.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Greek.js index 61622a5dc432..f7aeca319019 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Greek.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Greek.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Greek` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gujarati.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gujarati.js index baa27886402d..351ac5c617d0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gujarati.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gujarati.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Gujarati` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gunjala_Gondi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gunjala_Gondi.js index d44b452f0e39..29e1fdf6363f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gunjala_Gondi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gunjala_Gondi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Gunjala_Gondi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gurmukhi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gurmukhi.js index d468fbf1ec18..5ec707e1eeff 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gurmukhi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gurmukhi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Gurmukhi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han.js index b28fff6ff199..bb610a662594 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Han.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Han` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] @@ -16,7 +16,8 @@ includes: [regExpUtils.js] const matchSymbols = buildString({ loneCodePoints: [ 0x003030, - 0x0030FB + 0x0030FB, + 0x0032FF ], ranges: [ [0x002E80, 0x002E99], @@ -93,7 +94,8 @@ const nonMatchSymbols = buildString({ [0x0031E4, 0x00321F], [0x003248, 0x00327F], [0x0032B1, 0x0032BF], - [0x0032CC, 0x003357], + [0x0032CC, 0x0032FE], + [0x003300, 0x003357], [0x003371, 0x00337A], [0x003380, 0x0033DF], [0x004DB6, 0x004DFF], diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hangul.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hangul.js index 1834dd27d9b4..9aeb5b97aa83 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hangul.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hangul.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Hangul` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanifi_Rohingya.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanifi_Rohingya.js index f962fafa699c..e00488ea07ad 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanifi_Rohingya.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanifi_Rohingya.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Hanifi_Rohingya` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanunoo.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanunoo.js index da0b3d18b99a..645b37ff281f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanunoo.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hanunoo.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Hanunoo` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hatran.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hatran.js index 349f7784690a..bde74a7dbb4e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hatran.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hatran.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Hatran` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hebrew.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hebrew.js index 571c822c9f47..d132f3b5348e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hebrew.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hebrew.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Hebrew` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana.js index 9a1c3e0f1de9..e9250baa655e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Hiragana.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Hiragana` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Imperial_Aramaic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Imperial_Aramaic.js index bf751f9f55f2..128ae4d50b0b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Imperial_Aramaic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Imperial_Aramaic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Imperial_Aramaic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inherited.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inherited.js index 37af0dc23787..7d17565a6e9b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inherited.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inherited.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Inherited` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Pahlavi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Pahlavi.js index 00ce6762236d..db80b7f73626 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Pahlavi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Pahlavi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Inscriptional_Pahlavi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Parthian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Parthian.js index 2d54d62d58f6..0167dc081794 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Parthian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Inscriptional_Parthian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Inscriptional_Parthian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Javanese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Javanese.js index 3fb01730c616..a0eecb9759ad 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Javanese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Javanese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Javanese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kaithi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kaithi.js index 74ecee4501d4..f794e6ec6fef 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kaithi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kaithi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Kaithi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kannada.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kannada.js index c9c03b357291..1f89e1d2d08f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kannada.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kannada.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Kannada` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Katakana.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Katakana.js index 2ea17fe3e5ac..95a1934c2cd2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Katakana.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Katakana.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Katakana` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kayah_Li.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kayah_Li.js index 22b7f75d8c73..d2ab1af2e2a3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kayah_Li.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kayah_Li.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Kayah_Li` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kharoshthi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kharoshthi.js index 749a7f7945ef..eb1a657c2b7c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kharoshthi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kharoshthi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Kharoshthi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khmer.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khmer.js index a9809fcc0cde..bc77c0522875 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khmer.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khmer.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Khmer` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khojki.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khojki.js index b76613453281..3d1478dfc9a4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khojki.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khojki.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Khojki` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khudawadi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khudawadi.js index 47dcd851db57..09d6158c5adf 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khudawadi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Khudawadi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Khudawadi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lao.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lao.js index e4fcaf413e6e..e81b33c54f5b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lao.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lao.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Lao` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Latin.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Latin.js index d0b7389497d0..70c22387804d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Latin.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Latin.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Latin` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lepcha.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lepcha.js index 62fec4a32aa3..fc59245cd4a9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lepcha.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lepcha.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Lepcha` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Limbu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Limbu.js index a7853351e1a7..1e52a2a10a39 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Limbu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Limbu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Limbu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_A.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_A.js index 16f2d5a8363f..4fbf9d72e342 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_A.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_A.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Linear_A` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_B.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_B.js index 8046e16e59b0..f75811e7dadf 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_B.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Linear_B.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Linear_B` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lisu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lisu.js index 033090c0fcb4..6bdef43f38f2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lisu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lisu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Lisu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lycian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lycian.js index 8f748e9b777d..68209dcda0f6 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lycian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lycian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Lycian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lydian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lydian.js index 1bed789822b5..871584cacda5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lydian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Lydian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Lydian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mahajani.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mahajani.js index 44169efc1337..a2d5adb5475f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mahajani.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mahajani.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Mahajani` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Makasar.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Makasar.js index f701b92b4698..b242ed3ea7ec 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Makasar.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Makasar.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Makasar` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Malayalam.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Malayalam.js index 8257df9d640a..c1ca6770c624 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Malayalam.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Malayalam.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Malayalam` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mandaic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mandaic.js index 5bcc185cb257..8a2b582047b2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mandaic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mandaic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Mandaic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Manichaean.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Manichaean.js index 7af56d02f360..3ac5914ee333 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Manichaean.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Manichaean.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Manichaean` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Marchen.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Marchen.js index 57c0db054b08..4dc470a310f2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Marchen.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Marchen.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Marchen` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Masaram_Gondi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Masaram_Gondi.js index 44fc368e985e..a2bda674a06e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Masaram_Gondi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Masaram_Gondi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Masaram_Gondi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Medefaidrin.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Medefaidrin.js index a16d4e558197..25128229a453 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Medefaidrin.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Medefaidrin.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Medefaidrin` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meetei_Mayek.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meetei_Mayek.js index b44f5335b6cd..7033beb61576 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meetei_Mayek.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meetei_Mayek.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Meetei_Mayek` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mende_Kikakui.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mende_Kikakui.js index 84b3d3e2f61b..2f43e5994f07 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mende_Kikakui.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mende_Kikakui.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Mende_Kikakui` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Cursive.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Cursive.js index f61510a414cc..70144dac8035 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Cursive.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Cursive.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Meroitic_Cursive` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Hieroglyphs.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Hieroglyphs.js index 960fabd5fe0a..0fa4d7f602a2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Hieroglyphs.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Meroitic_Hieroglyphs.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Meroitic_Hieroglyphs` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Miao.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Miao.js index 151c0ae14906..a6a1da24ddd1 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Miao.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Miao.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Miao` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Modi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Modi.js index e4756cea704d..90373ebdd8fd 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Modi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Modi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Modi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mongolian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mongolian.js index e1e0d75b988b..3b2787d58cfa 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mongolian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mongolian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Mongolian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mro.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mro.js index fbbb51f2acc7..6fe20880aa90 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mro.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Mro.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Mro` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Multani.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Multani.js index b4430c8fe5e0..a46297f3517f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Multani.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Multani.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Multani` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Myanmar.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Myanmar.js index 5e71ace29607..614ea2f0708b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Myanmar.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Myanmar.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Myanmar` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nabataean.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nabataean.js index 282ca725f8c1..2134a8ba9f4b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nabataean.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nabataean.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Nabataean` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nandinagari.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nandinagari.js index 2683df364cc8..bc34933fc40a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nandinagari.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nandinagari.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Nandinagari` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_New_Tai_Lue.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_New_Tai_Lue.js index e707311c7212..c2c8f14cc33a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_New_Tai_Lue.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_New_Tai_Lue.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=New_Tai_Lue` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Newa.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Newa.js index 60572894ceb4..b90445837b92 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Newa.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Newa.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Newa` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nko.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nko.js index 2cb757f9e8e7..11980633423f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nko.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nko.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Nko` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nushu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nushu.js index fc8079e71170..669f68fbf2d5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nushu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nushu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Nushu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nyiakeng_Puachue_Hmong.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nyiakeng_Puachue_Hmong.js index 4656a2340ed4..5e213ab15ae3 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nyiakeng_Puachue_Hmong.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Nyiakeng_Puachue_Hmong.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Nyiakeng_Puachue_Hmong` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ogham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ogham.js index 045e9180b750..397323f82364 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ogham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ogham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Ogham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ol_Chiki.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ol_Chiki.js index a3fd900162df..859b0c51ed02 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ol_Chiki.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ol_Chiki.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Ol_Chiki` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Hungarian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Hungarian.js index d9759d55084a..de3668b289d6 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Hungarian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Hungarian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_Hungarian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Italic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Italic.js index 6433ef2760a3..3544313b2a6a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Italic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Italic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_Italic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_North_Arabian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_North_Arabian.js index b762de4f6573..c09e734d3461 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_North_Arabian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_North_Arabian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_North_Arabian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Permic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Permic.js index 865f3a4581a4..a961e07e27a4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Permic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Permic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_Permic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Persian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Persian.js index ed02943119ab..50da8502f274 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Persian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Persian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_Persian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Sogdian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Sogdian.js index d0188f8fee41..3e8756d0b7d0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Sogdian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Sogdian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_Sogdian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_South_Arabian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_South_Arabian.js index 942f66ba94d8..7addf75489a7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_South_Arabian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_South_Arabian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_South_Arabian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Turkic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Turkic.js index c3df41865637..3bce3f545e26 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Turkic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Old_Turkic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Old_Turkic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Oriya.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Oriya.js index 9baebb1c03ee..2f3a7ba34dc6 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Oriya.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Oriya.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Oriya` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osage.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osage.js index 9856d8065a83..1fa281493e12 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osage.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osage.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Osage` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osmanya.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osmanya.js index 04560207c98b..d9c40fd6f127 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osmanya.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Osmanya.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Osmanya` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pahawh_Hmong.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pahawh_Hmong.js index 6589f19aa72c..01473840ca76 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pahawh_Hmong.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pahawh_Hmong.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Pahawh_Hmong` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Palmyrene.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Palmyrene.js index e49ecba22cc4..c1c987c42597 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Palmyrene.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Palmyrene.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Palmyrene` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pau_Cin_Hau.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pau_Cin_Hau.js index e5b070baf418..925b611ef7a9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pau_Cin_Hau.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Pau_Cin_Hau.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Pau_Cin_Hau` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phags_Pa.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phags_Pa.js index cafd59824a2a..8549aaf5301b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phags_Pa.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phags_Pa.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Phags_Pa` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phoenician.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phoenician.js index 1727310b1447..72d4baa42e55 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phoenician.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Phoenician.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Phoenician` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Psalter_Pahlavi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Psalter_Pahlavi.js index b58a312021ee..ae25ee0b2dd4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Psalter_Pahlavi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Psalter_Pahlavi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Psalter_Pahlavi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Rejang.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Rejang.js index da77784d1552..8498b9132cba 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Rejang.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Rejang.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Rejang` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Runic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Runic.js index 515083fd4c30..db12d26e8309 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Runic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Runic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Runic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Samaritan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Samaritan.js index b27d983d864b..399ad2ae8567 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Samaritan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Samaritan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Samaritan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Saurashtra.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Saurashtra.js index cc9eb1f0f4c1..ce759e262092 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Saurashtra.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Saurashtra.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Saurashtra` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sharada.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sharada.js index 80d3ce5c2635..b1b5d5ba2624 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sharada.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sharada.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Sharada` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Shavian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Shavian.js index 9c57148770de..ecc6ba627612 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Shavian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Shavian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Shavian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Siddham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Siddham.js index 48ccfb189daa..259ecf7432e6 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Siddham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Siddham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Siddham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_SignWriting.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_SignWriting.js index 8637a22bdbc2..1be4722fd199 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_SignWriting.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_SignWriting.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=SignWriting` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sinhala.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sinhala.js index 84556620f00f..3533f584943b 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sinhala.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sinhala.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Sinhala` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sogdian.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sogdian.js index 5fc90452b123..8f888a944ed2 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sogdian.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sogdian.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Sogdian` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sora_Sompeng.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sora_Sompeng.js index def2633e67a7..07e44320a54a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sora_Sompeng.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sora_Sompeng.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Sora_Sompeng` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Soyombo.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Soyombo.js index b1e5f177b46d..390fbd24325f 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Soyombo.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Soyombo.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Soyombo` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sundanese.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sundanese.js index 39b961e4ed36..116b6d053012 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sundanese.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sundanese.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Sundanese` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syloti_Nagri.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syloti_Nagri.js index 35a1bba44621..9cccc76cefc4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syloti_Nagri.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syloti_Nagri.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Syloti_Nagri` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syriac.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syriac.js index 7c5f6fe1dd8c..a29da1370c15 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syriac.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Syriac.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Syriac` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagalog.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagalog.js index 62615f893fb4..aed3be5c0892 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagalog.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagalog.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tagalog` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagbanwa.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagbanwa.js index 816bed3f48b9..caa9f154f4ac 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagbanwa.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tagbanwa.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tagbanwa` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Le.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Le.js index 79b27953166a..1897cd96c072 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Le.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Le.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tai_Le` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Tham.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Tham.js index 1c511a56d435..1edc4e237479 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Tham.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Tham.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tai_Tham` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Viet.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Viet.js index b9bcee15de32..280f0676d3aa 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Viet.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Viet.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tai_Viet` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Takri.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Takri.js index 0a176377e622..ae3f50731eee 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Takri.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Takri.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Takri` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tamil.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tamil.js index 581eeabfc14c..529336f53438 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tamil.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tamil.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tamil` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tangut.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tangut.js index 7e70252657c1..037f4a54e7eb 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tangut.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tangut.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tangut` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Telugu.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Telugu.js index a42b43c89e46..48cc85f17790 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Telugu.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Telugu.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Telugu` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thaana.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thaana.js index 59328adad206..a7a4e9a96d65 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thaana.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thaana.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Thaana` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thai.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thai.js index ce5db1b22451..9569fd8a6d1d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thai.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Thai.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Thai` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tibetan.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tibetan.js index bfc1d4b55a36..e7ab3ad09680 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tibetan.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tibetan.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tibetan` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tifinagh.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tifinagh.js index 2facfefaa0ce..c8efe92d79c5 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tifinagh.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tifinagh.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tifinagh` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tirhuta.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tirhuta.js index 2ca9db1f91ff..b41938e3ebcc 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tirhuta.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tirhuta.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Tirhuta` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ugaritic.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ugaritic.js index 672f5e883e72..f04a720758ba 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ugaritic.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ugaritic.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Ugaritic` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Vai.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Vai.js index 4e9f6a042a30..2be3a38f8a40 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Vai.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Vai.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Vai` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Wancho.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Wancho.js index 5aa30f62a3ba..182cbe3eb8f4 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Wancho.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Wancho.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Wancho` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Warang_Citi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Warang_Citi.js index 6314ee09b257..5f34a2ca92ad 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Warang_Citi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Warang_Citi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Warang_Citi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Yi.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Yi.js index 43270a8d9df4..1d95dab79de0 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Yi.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Yi.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Yi` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Zanabazar_Square.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Zanabazar_Square.js index d94c5cbf3d80..dc9593c0df3c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Zanabazar_Square.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Zanabazar_Square.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Script_Extensions=Zanabazar_Square` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Sentence_Terminal.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Sentence_Terminal.js index 50a011de6f15..cd362b291557 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Sentence_Terminal.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Sentence_Terminal.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Sentence_Terminal` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Soft_Dotted.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Soft_Dotted.js index 22de4ab3082e..4fff2fc26db9 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Soft_Dotted.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Soft_Dotted.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Soft_Dotted` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Terminal_Punctuation.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Terminal_Punctuation.js index b160ea4ab9c9..25a3988dda9d 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Terminal_Punctuation.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Terminal_Punctuation.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Terminal_Punctuation` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Unified_Ideograph.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Unified_Ideograph.js index b08ee4170c6a..983df5120e4e 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Unified_Ideograph.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Unified_Ideograph.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Unified_Ideograph` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Uppercase.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Uppercase.js index 32ac04ae408a..c0cdf09d1820 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Uppercase.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Uppercase.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Uppercase` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Variation_Selector.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Variation_Selector.js index 950ac2f0cfb3..05cea30f14b7 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Variation_Selector.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/Variation_Selector.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `Variation_Selector` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/White_Space.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/White_Space.js index f3c0f48a1458..3480ba1ee17a 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/White_Space.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/White_Space.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `White_Space` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Continue.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Continue.js index cb83f31a7e08..0835e543f796 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Continue.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Continue.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `XID_Continue` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Start.js b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Start.js index 8f6f1ac7629a..a0185415d47c 100644 --- a/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Start.js +++ b/JSTests/test262/test/built-ins/RegExp/property-escapes/generated/XID_Start.js @@ -7,7 +7,7 @@ description: > Unicode property escapes for `XID_Start` info: | Generated by https://github.com/mathiasbynens/unicode-property-escapes-tests - Unicode v12.0.0 + Unicode v12.1.0 esid: sec-static-semantics-unicodematchproperty-p features: [regexp-unicode-property-escapes] includes: [regExpUtils.js] diff --git a/JSTests/test262/test/built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js b/JSTests/test262/test/built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js index 6a521b5ee275..bb23765cad79 100644 --- a/JSTests/test262/test/built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js +++ b/JSTests/test262/test/built-ins/Set/prototype/values/does-not-have-setdata-internal-slot-weakset.js @@ -18,10 +18,10 @@ features: [WeakSet] ---*/ assert.throws(TypeError, function() { - Set.prototype.values.call(new WeakMap()); + Set.prototype.values.call(new WeakSet()); }); assert.throws(TypeError, function() { var s = new Set(); - s.values.call(new WeakMap()); + s.values.call(new WeakSet()); }); diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T1.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T1.js deleted file mode 100644 index 4431e99a9b31..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T1.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.toString() returns this string value -es5id: 15.5.4.2_A1_T1 -description: Create new String(number) and check its method toString() ----*/ - -var __string__obj = new String(1); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.toString() !== "" + 1) { - $ERROR('#1: __string__obj = new String(1); __string__obj.toString() === ""+1. Actual: __string__obj.toString() ===' + __string__obj.toString()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T2.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T2.js deleted file mode 100644 index 2d2ec7ffec86..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T2.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.toString() returns this string value -es5id: 15.5.4.2_A1_T2 -description: Create new String(boolean) and check its method toString() ----*/ - -var __string__obj = new String(true); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.toString() !== "" + true) { - $ERROR('#1: __string__obj = new String(true); __string__obj.toString() === ""+true. Actual: __string__obj.toString() ===' + __string__obj.toString()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T3.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T3.js deleted file mode 100644 index 1c4b556be4ad..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T3.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.toString() returns this string value -es5id: 15.5.4.2_A1_T3 -description: Create new String(string) and check its method toString() ----*/ - -var __string__obj = new String("metal"); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.toString() !== "metal") { - $ERROR('#1: __string__obj = new String("metal"); __string__obj.toString() === "metal". Actual: __string__obj.toString() ===' + __string__obj.toString()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T4.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T4.js deleted file mode 100644 index 432eb75bbdc7..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A1_T4.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.toString() returns this string value -es5id: 15.5.4.2_A1_T4 -description: Create new String(function(){}()) and check its method toString() ----*/ - -var __string__obj = new String(function() {}()); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.toString() !== "undefined") { - $ERROR('#1: __string__obj = new String(function(){}()); __string__obj.toString() === "undefined". Actual: __string__obj.toString() ===' + __string__obj.toString()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A2_T1.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A2_T1.js deleted file mode 100644 index ba121d02575c..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A2_T1.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - The toString function is not generic; it throws a TypeError exception if - its this value is not a String object. Therefore, it cannot be - transferred to other kinds of objects for use as a method -es5id: 15.5.4.2_A2_T1 -description: Checking if creating variable String.prototype.toString fails ----*/ - -var __toString = String.prototype.toString; - -////////////////////////////////////////////////////////////////////////////// -//CHECK#1 -if (typeof __toString !== "function") { - $ERROR('#1: __toString = String.prototype.toString; typeof __toString === "function". Actual: typeof __toString ===' + typeof __toString); -} - -// -////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////// -//CHECK#2 -try { - var x = __toString(); - $ERROR('#2: "__toString = String.prototype.toString; var x = __toString();" lead to throwing exception'); -} catch (e) { - if (!(e instanceof TypeError)) { - $ERROR('#2.1: "__toString = String.prototype.toString; var x = __toString();" lead to throwing exception. Exception is instance of TypeError. Actual: exception is ' + e); - } -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A2_T2.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A2_T2.js deleted file mode 100644 index 8862f4fe8ab4..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A2_T2.js +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - The toString function is not generic; it throws a TypeError exception if - its this value is not a String object. Therefore, it cannot be - transferred to other kinds of objects for use as a method -es5id: 15.5.4.2_A2_T2 -description: Checking if creating the object String.prototype.toString fails ----*/ - -var __obj = { - toString: String.prototype.toString -}; - -////////////////////////////////////////////////////////////////////////////// -//CHECK#1 -if (typeof __obj["toString"] !== "function") { - $ERROR('#1: var __obj={toString : String.prototype.toString}; typeof __obj["toString"] === "function". Actual: typeof __obj["toString"] ===' + typeof __obj["toString"]); -} - -// -////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////// -//CHECK#2 -try { - var x = (__obj == 1); - $ERROR('#2: "var x = (__obj == 1)" lead to throwing exception'); -} catch (e) { - if (!(e instanceof TypeError)) { - $ERROR('#2.1: Exception is instance of TypeError. Actual: exception is ' + e); - } -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A3_T1.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A3_T1.js deleted file mode 100644 index dfa848162597..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A3_T1.js +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.toString() is equal String.prototype.valueOf() -es5id: 15.5.4.2_A3_T1 -description: > - Create new String() with various arguments and compare returned - results of toString() and valueOf() ----*/ - -//CHECK#1 -var str = new String(); -if (!(str.valueOf() == str.toString())) - $ERROR('#1: str = new String(),str.valueOf() == str.toString()'); - -//CHECK#2 -str = new String(true); -if (!(str.valueOf() == str.toString())) - $ERROR('#2: str = new String(true),str.valueOf() == str.toString()'); - -//CHECK#3 -str = new String(false); -if (!(str.valueOf() == str.toString())) - $ERROR('#3: str = new String(false),str.valueOf() == str.toString()'); - -//CHECK#4 -str = new String(Math.PI); -if (!(str.valueOf() == str.toString())) - $ERROR('#4: str = new String(Math.PI),str.valueOf() == str.toString()'); diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A4_T1.js b/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A4_T1.js deleted file mode 100644 index 01356cb51ef3..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/toString/S15.5.4.2_A4_T1.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.toString have length property and it is equal 0 -es5id: 15.5.4.2_A4_T1 -description: Checking String.prototype.toString.length property ----*/ - -//CHECK#1 -if (String.prototype.toString.hasOwnProperty('length') !== true) { - $ERROR('#1: String.prototype.toString.hasOwnProperty(\'length\')===true. Actual: ' + String.prototype.toString.hasOwnProperty('length')); -} -else { - //CHECK#2 - if (String.prototype.toString.length !== 0) - $ERROR('#2: String.prototype.toString.length===0. Actual: String.prototype.toString.length===' + String.prototype.toString.length); -} diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/length.js b/JSTests/test262/test/built-ins/String/prototype/toString/length.js new file mode 100644 index 000000000000..1877f9bedc07 --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/toString/length.js @@ -0,0 +1,27 @@ +// Copyright (C) 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.tostring +description: > + String.prototype.toString.length is 0. +info: | + ECMAScript Standard Built-in Objects + ... + Every built-in Function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this value + is equal to the largest number of named arguments shown in the subclause + headings for the function description, including optional parameters. + ... + Unless otherwise specified, the length property of a built-in Function + object has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: true }. +includes: [propertyHelper.js] +---*/ + +verifyProperty(String.prototype.toString, 'length', { + value: 0, + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/name.js b/JSTests/test262/test/built-ins/String/prototype/toString/name.js index 994b587fc04e..15146e3ac06a 100644 --- a/JSTests/test262/test/built-ins/String/prototype/toString/name.js +++ b/JSTests/test262/test/built-ins/String/prototype/toString/name.js @@ -2,6 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-string.prototype.tostring es6id: 21.1.3.23 description: > String.prototype.toString.name is "toString". @@ -19,8 +20,9 @@ info: | includes: [propertyHelper.js] ---*/ -assert.sameValue(String.prototype.toString.name, "toString"); - -verifyNotEnumerable(String.prototype.toString, "name"); -verifyNotWritable(String.prototype.toString, "name"); -verifyConfigurable(String.prototype.toString, "name"); +verifyProperty(String.prototype.toString, 'name', { + value: 'toString', + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/non-generic-realm.js b/JSTests/test262/test/built-ins/String/prototype/toString/non-generic-realm.js new file mode 100644 index 000000000000..8e8da2213e55 --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/toString/non-generic-realm.js @@ -0,0 +1,58 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.tostring +description: > + Throws a TypeError if called on neither String primitive nor String object + (honoring the Realm of the current execution context) +info: | + String.prototype.toString ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + [...] + 3. Throw a TypeError exception. +features: [cross-realm] +---*/ + +var other = $262.createRealm().global; +var otherToString = other.String.prototype.toString; + +assert.throws(other.TypeError, function() { + otherToString.call(true); +}); + +assert.throws(other.TypeError, function() { + otherToString.call(0); +}); + +assert.throws(other.TypeError, function() { + otherToString.call(null); +}); + +assert.throws(other.TypeError, function() { + otherToString.call(); +}); + +assert.throws(other.TypeError, function() { + otherToString.call(Symbol('desc')); +}); + +assert.throws(other.TypeError, function() { + otherToString.call({ + valueOf: function() { + return 'str'; + }, + }); +}); + +assert.throws(other.TypeError, function() { + otherToString.call([1]); +}); + +assert.throws(other.TypeError, function() { + 'str'.concat({toString: otherToString}); +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/non-generic.js b/JSTests/test262/test/built-ins/String/prototype/toString/non-generic.js new file mode 100644 index 000000000000..6cf86862941b --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/toString/non-generic.js @@ -0,0 +1,55 @@ +// Copyright (C) 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.tostring +description: > + Throws a TypeError if called on neither String primitive nor String object +info: | + String.prototype.toString ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + [...] + 3. Throw a TypeError exception. +---*/ + +var toString = String.prototype.toString; + +assert.throws(TypeError, function() { + toString.call(false); +}); + +assert.throws(TypeError, function() { + toString.call(1); +}); + +assert.throws(TypeError, function() { + toString.call(null); +}); + +assert.throws(TypeError, function() { + toString.call(); +}); + +assert.throws(TypeError, function() { + toString.call(Symbol('desc')); +}); + +assert.throws(TypeError, function() { + toString.call({ + toString: function() { + return 'str'; + }, + }); +}); + +assert.throws(TypeError, function() { + toString.call(['s', 't', 'r']); +}); + +assert.throws(TypeError, function() { + ''.concat({toString: toString}); +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/string-object.js b/JSTests/test262/test/built-ins/String/prototype/toString/string-object.js new file mode 100644 index 000000000000..585d0fc2702e --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/toString/string-object.js @@ -0,0 +1,26 @@ +// Copyright (C) 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.tostring +description: > + If called on a String object, returns [[StringData]] slot +info: | + String.prototype.toString ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + [...] + 2. If Type(value) is Object and value has a [[StringData]] internal slot, then + a. Let s be value.[[StringData]]. + b. Assert: Type(s) is String. + c. Return s. +---*/ + +var toString = String.prototype.toString; + +assert.sameValue(Object('str').toString(), 'str'); +assert.sameValue(toString.call(new String('')), ''); +assert.sameValue('a'.concat(Object('b')), 'ab'); diff --git a/JSTests/test262/test/built-ins/String/prototype/toString/string-primitive.js b/JSTests/test262/test/built-ins/String/prototype/toString/string-primitive.js new file mode 100644 index 000000000000..6f6623167c6c --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/toString/string-primitive.js @@ -0,0 +1,21 @@ +// Copyright (C) 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.tostring +description: > + If called on String primitive, returns it +info: | + String.prototype.toString ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + 1. If Type(value) is String, return value. +---*/ + +var toString = String.prototype.toString; + +assert.sameValue(''.toString(), ''); +assert.sameValue(toString.call('str'), 'str'); diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T1.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T1.js deleted file mode 100644 index c472425105bc..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T1.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.valueOf() returns this string value -es5id: 15.5.4.3_A1_T1 -description: Create String object as new String(1) and check its valueOf() ----*/ - -var __string__obj = new String(1); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.valueOf() !== "" + 1) { - $ERROR('#1: __string__obj = new String(1); __string__obj.valueOf() === ""+1. Actual: __string__obj.valueOf() ===' + __string__obj.valueOf()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T2.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T2.js deleted file mode 100644 index 368291de9ac9..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T2.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.valueOf() returns this string value -es5id: 15.5.4.3_A1_T2 -description: Create String object as new String(true) and check its valueOf() ----*/ - -var __string__obj = new String(true); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.valueOf() !== "" + true) { - $ERROR('#1: __string__obj = new String(true); __string__obj.valueOf() === ""+true. Actual: __string__obj.valueOf() ===' + __string__obj.valueOf()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T3.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T3.js deleted file mode 100644 index 702e72647d6f..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T3.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.valueOf() returns this string value -es5id: 15.5.4.3_A1_T3 -description: Create String object as new String(string) and check its valueOf() ----*/ - -var __string__obj = new String("metal"); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.valueOf() !== "metal") { - $ERROR('#1: __string__obj = new String("metal"); __string__obj.valueOf() === "metal". Actual: __string__obj.valueOf() ===' + __string__obj.valueOf()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T4.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T4.js deleted file mode 100644 index 09ca441b7be3..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A1_T4.js +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: String.prototype.valueOf() returns this string value -es5id: 15.5.4.3_A1_T4 -description: > - Create String object as new String(function(){}()) and check its - valueOf() ----*/ - -var __string__obj = new String(function() {}()); - -////////////////////////////////////////////////////////////////////////////// -//CHECK# -if (__string__obj.valueOf() !== "undefined") { - $ERROR('#1: __string__obj = new String(function(){}()); __string__obj.valueOf() === "undefined". Actual: __string__obj.valueOf() ===' + __string__obj.valueOf()); -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A2_T1.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A2_T1.js deleted file mode 100644 index 4c8cf826958b..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A2_T1.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - The valueOf function is not generic; it throws a TypeError exception if its this value is not a String object. - Therefore, it cannot be transferred to other kinds of objects for use as a method -es5id: 15.5.4.3_A2_T1 -description: Checking if creating variable String.prototype.valueOf fails ----*/ - -var __valueOf = String.prototype.valueOf; - -////////////////////////////////////////////////////////////////////////////// -//CHECK#1 -if (typeof __valueOf !== "function") { - $ERROR('#1: __valueOf = String.prototype.valueOf; typeof __valueOf === "function". Actual: typeof __valueOf ===' + typeof __valueOf); -} - -// -////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////// -//CHECK#2 -try { - var x = __valueOf(); - $ERROR('#2: "__valueOf = String.prototype.valueOf; var x = __valueOf()" lead to throwing exception'); -} catch (e) { - if (!(e instanceof TypeError)) { - $ERROR('#2.1: Exception is instance of TypeError. Actual: exception is ' + e); - } -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A2_T2.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A2_T2.js deleted file mode 100644 index ec48d9f96ace..000000000000 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/S15.5.4.3_A2_T2.js +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2009 the Sputnik authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -info: | - The valueOf function is not generic; it throws a TypeError exception if its this value is not a String object. - Therefore, it cannot be transferred to other kinds of objects for use as a method -es5id: 15.5.4.3_A2_T2 -description: Checking if creating the object String.prototype.valueOf fails ----*/ - -var __obj = { - valueOf: String.prototype.valueOf -}; - -////////////////////////////////////////////////////////////////////////////// -//CHECK#1 -if (typeof __obj["valueOf"] !== "function") { - $ERROR('#1: var __obj={valueOf : String.prototype.valueOf}; typeof __obj["valueOf"] === "function". Actual: typeof __obj["valueOf"] ===' + typeof __obj["valueOf"]); -} - -// -////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////// -//CHECK#2 -try { - var x = (__obj == 1); - $ERROR('#2: "var __obj={valueOf : String.prototype.valueOf}; var x = (__obj == 1)" lead to throwing exception'); -} catch (e) { - if (!(e instanceof TypeError)) { - $ERROR('#2.1: Exception is instance of TypeError. Actual: exception is ' + e); - } -} -// -////////////////////////////////////////////////////////////////////////////// diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/length.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/length.js index 2d3dea6db5a8..40332fcde8d1 100644 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/length.js +++ b/JSTests/test262/test/built-ins/String/prototype/valueOf/length.js @@ -2,6 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-string.prototype.valueof es6id: 21.1.3.26 description: > String.prototype.valueOf.length is 0. @@ -22,8 +23,9 @@ info: | includes: [propertyHelper.js] ---*/ -assert.sameValue(String.prototype.valueOf.length, 0); - -verifyNotEnumerable(String.prototype.valueOf, "length"); -verifyNotWritable(String.prototype.valueOf, "length"); -verifyConfigurable(String.prototype.valueOf, "length"); +verifyProperty(String.prototype.valueOf, 'length', { + value: 0, + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/name.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/name.js index 761ba22002b9..d5b71ed63926 100644 --- a/JSTests/test262/test/built-ins/String/prototype/valueOf/name.js +++ b/JSTests/test262/test/built-ins/String/prototype/valueOf/name.js @@ -2,6 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-string.prototype.valueof es6id: 21.1.3.26 description: > String.prototype.valueOf.name is "valueOf". @@ -19,8 +20,9 @@ info: | includes: [propertyHelper.js] ---*/ -assert.sameValue(String.prototype.valueOf.name, "valueOf"); - -verifyNotEnumerable(String.prototype.valueOf, "name"); -verifyNotWritable(String.prototype.valueOf, "name"); -verifyConfigurable(String.prototype.valueOf, "name"); +verifyProperty(String.prototype.valueOf, 'name', { + value: 'valueOf', + writable: false, + enumerable: false, + configurable: true, +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/non-generic-realm.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/non-generic-realm.js new file mode 100644 index 000000000000..a717eeafabcd --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/valueOf/non-generic-realm.js @@ -0,0 +1,58 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.valueof +description: > + Throws a TypeError if called on neither String primitive nor String object + (honoring the Realm of the current execution context) +info: | + String.prototype.valueOf ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + [...] + 3. Throw a TypeError exception. +features: [cross-realm] +---*/ + +var other = $262.createRealm().global; +var otherValueOf = other.String.prototype.valueOf; + +assert.throws(other.TypeError, function() { + otherValueOf.call(false); +}); + +assert.throws(other.TypeError, function() { + otherValueOf.call(-1); +}); + +assert.throws(other.TypeError, function() { + otherValueOf.call(null); +}); + +assert.throws(other.TypeError, function() { + otherValueOf.call(); +}); + +assert.throws(other.TypeError, function() { + otherValueOf.call(Symbol('desc')); +}); + +assert.throws(other.TypeError, function() { + otherValueOf.call({ + valueOf: function() { + return ''; + }, + }); +}); + +assert.throws(other.TypeError, function() { + otherValueOf.call([3]); +}); + +assert.throws(other.TypeError, function() { + '' + {valueOf: otherValueOf}; +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/non-generic.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/non-generic.js new file mode 100644 index 000000000000..92d569adf576 --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/valueOf/non-generic.js @@ -0,0 +1,55 @@ +// Copyright (C) 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.valueof +description: > + Throws a TypeError if called on neither String primitive nor String object +info: | + String.prototype.valueOf ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + [...] + 3. Throw a TypeError exception. +---*/ + +var valueOf = String.prototype.valueOf; + +assert.throws(TypeError, function() { + valueOf.call(true); +}); + +assert.throws(TypeError, function() { + valueOf.call(-0); +}); + +assert.throws(TypeError, function() { + valueOf.call(null); +}); + +assert.throws(TypeError, function() { + valueOf.call(); +}); + +assert.throws(TypeError, function() { + valueOf.call(Symbol('desc')); +}); + +assert.throws(TypeError, function() { + valueOf.call({ + toString: function() { + return 'str'; + }, + }); +}); + +assert.throws(TypeError, function() { + valueOf.call(['s', 't', 'r']); +}); + +assert.throws(TypeError, function() { + 'str' + {valueOf: valueOf}; +}); diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/string-object.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/string-object.js new file mode 100644 index 000000000000..226f05512ebc --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/valueOf/string-object.js @@ -0,0 +1,26 @@ +// Copyright (C) 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.valueof +description: > + If called on a String object, returns [[StringData]] slot +info: | + String.prototype.valueOf ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + [...] + 2. If Type(value) is Object and value has a [[StringData]] internal slot, then + a. Let s be value.[[StringData]]. + b. Assert: Type(s) is String. + c. Return s. +---*/ + +var valueOf = String.prototype.valueOf; + +assert.sameValue(Object('').valueOf(), ''); +assert.sameValue(valueOf.call(new String('str')), 'str'); +assert.sameValue('a' + new String('b'), 'ab'); diff --git a/JSTests/test262/test/built-ins/String/prototype/valueOf/string-primitive.js b/JSTests/test262/test/built-ins/String/prototype/valueOf/string-primitive.js new file mode 100644 index 000000000000..42bcda5f32a1 --- /dev/null +++ b/JSTests/test262/test/built-ins/String/prototype/valueOf/string-primitive.js @@ -0,0 +1,21 @@ +// Copyright (C) 2009 the Sputnik authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-string.prototype.valueof +description: > + If called on String primitive, returns it +info: | + String.prototype.valueOf ( ) + + 1. Return ? thisStringValue(this value). + + thisStringValue ( value ) + + 1. If Type(value) is String, return value. +---*/ + +var valueOf = String.prototype.valueOf; + +assert.sameValue('str'.valueOf(), 'str'); +assert.sameValue(valueOf.call(''), ''); diff --git a/JSTests/test262/test/built-ins/Symbol/not-callable.js b/JSTests/test262/test/built-ins/Symbol/not-callable.js new file mode 100644 index 000000000000..d6d8e66555c3 --- /dev/null +++ b/JSTests/test262/test/built-ins/Symbol/not-callable.js @@ -0,0 +1,34 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-properties-of-symbol-instances +description: > + Symbol primitives and objects are not callable. +info: | + Properties of Symbol Instances + + Symbol instances are ordinary objects that inherit properties from the + Symbol prototype object. Symbol instances have a [[SymbolData]] internal slot. + The [[SymbolData]] internal slot is the Symbol value represented by this + Symbol object. +features: [Symbol] +---*/ + +var sym = Symbol('desc'); +var symObj = Object(Symbol()); + +assert.throws(TypeError, function() { + sym(); +}); + +assert.throws(TypeError, function() { + new sym(); +}); + +assert.throws(TypeError, function() { + symObj(); +}); + +assert.throws(TypeError, function() { + new symObj(); +}); diff --git a/JSTests/test262/test/built-ins/TypedArray/stability.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/stability.js similarity index 100% rename from JSTests/test262/test/built-ins/TypedArray/stability.js rename to JSTests/test262/test/built-ins/TypedArray/prototype/sort/stability.js diff --git a/JSTests/test262/test/built-ins/WeakRef/constructor.js b/JSTests/test262/test/built-ins/WeakRef/constructor.js new file mode 100644 index 000000000000..15159a77db13 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/constructor.js @@ -0,0 +1,15 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-constructor +description: > + The WeakRef constructor is the %WeakRef% intrinsic object and the initial + value of the WeakRef property of the global object. +features: [WeakRef] +---*/ + +assert.sameValue( + typeof WeakRef, 'function', + 'typeof WeakRef is function' +); diff --git a/JSTests/test262/test/built-ins/WeakRef/instance-extensible.js b/JSTests/test262/test/built-ins/WeakRef/instance-extensible.js new file mode 100644 index 000000000000..d6249e22ee98 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/instance-extensible.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: Instances of WeakRef are extensible +info: | + WeakRef( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + ObjectCreate ( proto [ , internalSlotsList ] ) + + 4. Set obj.[[Prototype]] to proto. + 5. Set obj.[[Extensible]] to true. + 6. Return obj. +features: [WeakRef, Reflect] +---*/ + +var wr = new WeakRef({}); +assert.sameValue(Object.isExtensible(wr), true); diff --git a/JSTests/test262/test/built-ins/WeakRef/length.js b/JSTests/test262/test/built-ins/WeakRef/length.js new file mode 100644 index 000000000000..9ced86beb435 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/length.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: WeakRef.length property descriptor +info: | + WeakRef ( target ) + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this + value is equal to the largest number of named arguments shown in the + subclause headings for the function description. Optional parameters + (which are indicated with brackets: [ ]) or rest parameters (which + are shown using the form «...name») are not included in the default + argument count. + + Unless otherwise specified, the length property of a built-in + function object has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [WeakRef] +---*/ + +verifyProperty(WeakRef, 'length', { + value: 1, + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/name.js b/JSTests/test262/test/built-ins/WeakRef/name.js new file mode 100644 index 000000000000..d47b73b5df04 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/name.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: WeakRef.name property descriptor +info: | + WeakRef ( value ) + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, that is not + identified as an anonymous function has a name property whose value + is a String. Unless otherwise specified, this value is the name that + is given to the function in this specification. For functions that + are specified as properties of objects, the name value is the + property name string used to access the function. [...] + + Unless otherwise specified, the name property of a built-in function + object, if it exists, has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [WeakRef] +---*/ + +verifyProperty(WeakRef, 'name', { + value: 'WeakRef', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js b/JSTests/test262/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js new file mode 100644 index 000000000000..0313813aca18 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js @@ -0,0 +1,58 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + [[Prototype]] defaults to %WeakRefPrototype% if NewTarget.prototype is not an object. +info: | + WeakRef( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef, Reflect.construct, Symbol] +---*/ + +var wr; +function newTarget() {} + +newTarget.prototype = undefined; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype, 'newTarget.prototype is undefined'); + +newTarget.prototype = null; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype, 'newTarget.prototype is null'); + +newTarget.prototype = true; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype, 'newTarget.prototype is a Boolean'); + +newTarget.prototype = ''; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype, 'newTarget.prototype is a String'); + +newTarget.prototype = Symbol(); +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype, 'newTarget.prototype is a Symbol'); + +newTarget.prototype = 1; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype, 'newTarget.prototype is a Number'); diff --git a/JSTests/test262/test/built-ins/WeakRef/prop-desc.js b/JSTests/test262/test/built-ins/WeakRef/prop-desc.js new file mode 100644 index 000000000000..26a9b2933ef1 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prop-desc.js @@ -0,0 +1,22 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-constructor +description: > + Property descriptor of WeakRef +info: | + 17 ECMAScript Standard Built-in Objects: + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +features: [WeakRef] +---*/ + +verifyProperty(this, 'WeakRef', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/proto-from-ctor-realm.js b/JSTests/test262/test/built-ins/WeakRef/proto-from-ctor-realm.js new file mode 100644 index 000000000000..4345e095d147 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/proto-from-ctor-realm.js @@ -0,0 +1,59 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: Default [[Prototype]] value derived from realm of the newTarget +info: | + WeakRef( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, '%WeakRefPrototype%', « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef, cross-realm, Reflect] +---*/ + +var other = $262.createRealm().global; +var newTarget = new other.Function(); +var wr; + +newTarget.prototype = undefined; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is undefined'); + +newTarget.prototype = null; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is null'); + +newTarget.prototype = true; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a Boolean'); + +newTarget.prototype = ''; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a String'); + +newTarget.prototype = Symbol(); +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a Symbol'); + +newTarget.prototype = 1; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a Number'); + diff --git a/JSTests/test262/test/built-ins/WeakRef/proto.js b/JSTests/test262/test/built-ins/WeakRef/proto.js new file mode 100644 index 000000000000..aee0662d8ebb --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/proto.js @@ -0,0 +1,18 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-weak-ref-constructor +description: > + The prototype of WeakRef is Object.prototype +info: | + The value of the [[Prototype]] internal slot of the WeakRef object is the + intrinsic object %FunctionPrototype%. +features: [WeakRef] +---*/ + +assert.sameValue( + Object.getPrototypeOf(WeakRef), + Function.prototype, + 'Object.getPrototypeOf(WeakRef) returns the value of `Function.prototype`' +); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js b/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js new file mode 100644 index 000000000000..952b2afb8cbb --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js @@ -0,0 +1,42 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + Return abrupt from getting the NewTarget prototype +info: | + WeakRef ( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). +features: [WeakRef, Reflect.construct] +---*/ + +var calls = 0; +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + calls += 1; + throw new Test262Error(); + } +}); + +assert.throws(Test262Error, function() { + Reflect.construct(WeakRef, [{}], newTarget); +}); + +assert.sameValue(calls, 1); \ No newline at end of file diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget-custom.js b/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget-custom.js new file mode 100644 index 000000000000..104781f50742 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget-custom.js @@ -0,0 +1,45 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + WeakRef ( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef, Reflect.construct] +---*/ + +var wr; + +wr = Reflect.construct(WeakRef, [{}], Object); +assert.sameValue(Object.getPrototypeOf(wr), Object.prototype, 'NewTarget is built-in Object constructor'); + +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + return Array.prototype; + } +}); +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), Array.prototype, 'NewTarget is BoundFunction with accessor'); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget.js b/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget.js new file mode 100644 index 000000000000..e7aa89dba194 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype-from-newtarget.js @@ -0,0 +1,34 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + WeakRef ( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef] +---*/ + +var wr = new WeakRef({}); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js b/JSTests/test262/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js new file mode 100644 index 000000000000..a6d4e11d8657 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js @@ -0,0 +1,23 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-@@tostringtag +description: > + `Symbol.toStringTag` property descriptor +info: | + The initial value of the @@toStringTag property is the String value + 'WeakRef'. + + This property has the attributes { [[Writable]]: false, [[Enumerable]]: + false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [WeakRef, Symbol, Symbol.toStringTag] +---*/ + +verifyProperty(WeakRef.prototype, Symbol.toStringTag, { + value: 'WeakRef', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/constructor.js b/JSTests/test262/test/built-ins/WeakRef/prototype/constructor.js new file mode 100644 index 000000000000..d9c1e5c55b69 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/constructor.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-properties-of-the-weak-ref-prototype-object +description: WeakRef.prototype.constructor +info: | + WeakRef.prototype.constructor + + Normative Optional + + The initial value of WeakRef.prototype.constructor is the intrinsic object %WeakRef%. + + This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. + + This section is to be treated identically to the "Annex B" of ECMA-262, but to be written in-line with the main specification. +includes: [propertyHelper.js] +features: [WeakRef] +---*/ + +var actual = WeakRef.prototype.hasOwnProperty('constructor'); + +// If implemented, it should conform to the spec text +if (actual) { + verifyProperty(WeakRef.prototype, 'constructor', { + value: WeakRef, + writable: true, + enumerable: false, + configurable: true + }); +} diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/custom-this.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/custom-this.js new file mode 100644 index 000000000000..44d571d171f3 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/custom-this.js @@ -0,0 +1,27 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: Return target if weakRef.[[Target]] is not empty (applying custom this) +info: | + WeakRef.prototype.deref () + + 1. Let weakRef be the this value. + ... + 4. Let target be the value of weakRef.[[Target]]. + 5. If target is not empty, + a. Perform ! KeepDuringJob(target). + b. Return target. + 6. Return undefined. +features: [WeakRef] +---*/ + +var target = {}; +var deref = WeakRef.prototype.deref; +var wref = new WeakRef(target); + +assert.sameValue(deref.call(wref), target, 'returns target'); +assert.sameValue(deref.call(wref), target, '[[Target]] is not emptied #1'); +assert.sameValue(deref.call(wref), target, '[[Target]] is not emptied #2'); +assert.sameValue(deref.call(wref), target, '[[Target]] is not emptied #3'); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/gc-cleanup-not-prevented-with-wr-deref.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/gc-cleanup-not-prevented-with-wr-deref.js new file mode 100644 index 000000000000..33d67b3c7ca0 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/gc-cleanup-not-prevented-with-wr-deref.js @@ -0,0 +1,33 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: WeakRef deref should not prevent a GC event +info: | + WeakRef.prototype.deref ( ) + + ... + 4. Let target be the value of weakRef.[[Target]]. + 5. If target is not empty, + a. Perform ! KeepDuringJob(target). + b. Return target. + 6. Return undefined. +features: [WeakRef, host-gc-required] +---*/ + +var deref = false; + +function emptyCells() { + var wr; + (function() { + var a = {}; + wr = new WeakRef(a); + })(); + $262.gc(); + deref = wr.deref(); +} + +emptyCells(); + +assert.sameValue(deref, undefined); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/length.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/length.js new file mode 100644 index 000000000000..f9103c0cf5c4 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/length.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: WeakRef.prototype.deref.length property descriptor +info: | + WeakRef.prototype.deref () + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, has a length + property whose value is an integer. Unless otherwise specified, this + value is equal to the largest number of named arguments shown in the + subclause headings for the function description. Optional parameters + (which are indicated with brackets: [ ]) or rest parameters (which + are shown using the form «...name») are not included in the default + argument count. + + Unless otherwise specified, the length property of a built-in + function object has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [WeakRef] +---*/ + +verifyProperty(WeakRef.prototype.deref, 'length', { + value: 0, + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/name.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/name.js new file mode 100644 index 000000000000..5d512bb03dba --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/name.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: WeakRef.prototype.deref.name property descriptor +info: | + WeakRef.prototype.deref.name value and property descriptor + + 17 ECMAScript Standard Built-in Objects + + Every built-in function object, including constructors, that is not + identified as an anonymous function has a name property whose value + is a String. Unless otherwise specified, this value is the name that + is given to the function in this specification. For functions that + are specified as properties of objects, the name value is the + property name string used to access the function. [...] + + Unless otherwise specified, the name property of a built-in function + object, if it exists, has the attributes { [[Writable]]: false, + [[Enumerable]]: false, [[Configurable]]: true }. +includes: [propertyHelper.js] +features: [WeakRef] +---*/ + +verifyProperty(WeakRef.prototype.deref, 'name', { + value: 'deref', + writable: false, + enumerable: false, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/prop-desc.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/prop-desc.js new file mode 100644 index 000000000000..e8d03591498b --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/prop-desc.js @@ -0,0 +1,24 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: > + Property descriptor of WeakRef.prototype.deref +info: | + 17 ECMAScript Standard Built-in Objects: + + Every other data property described in clauses 18 through 26 and in Annex B.2 + has the attributes { [[Writable]]: true, [[Enumerable]]: false, + [[Configurable]]: true } unless otherwise specified. +includes: [propertyHelper.js] +features: [WeakRef] +---*/ + +assert.sameValue(typeof WeakRef.prototype.deref, 'function'); + +verifyProperty(WeakRef.prototype, 'deref', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/return-target.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/return-target.js new file mode 100644 index 000000000000..19bb5e6204b6 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/return-target.js @@ -0,0 +1,25 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: Return target if weakRef.[[Target]] is not empty +info: | + WeakRef.prototype.deref () + + ... + 4. Let target be the value of weakRef.[[Target]]. + 5. If target is not empty, + a. Perform ! KeepDuringJob(target). + b. Return target. + 6. Return undefined. +features: [WeakRef] +---*/ + +var target = {}; +var wref = new WeakRef(target); + +assert.sameValue(wref.deref(), target, 'returns target'); +assert.sameValue(wref.deref(), target, '[[Target]] is not emptied #1'); +assert.sameValue(wref.deref(), target, '[[Target]] is not emptied #2'); +assert.sameValue(wref.deref(), target, '[[Target]] is not emptied #3'); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/this-does-not-have-internal-target-throws.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/this-does-not-have-internal-target-throws.js new file mode 100644 index 000000000000..c21d04851231 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/this-does-not-have-internal-target-throws.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: Throws a TypeError if this does not have a [[Target]] internal slot +info: | + WeakRef.prototype.deref () + + 1. Let weakRef be the this value. + 2. If Type(weakRef) is not Object, throw a TypeError exception. + 3. If weakRef does not have a [[Target]] internal slot, throw a TypeError exception. + 4. Let target be the value of weakRef.[[Target]]. + 5. If target is not empty, + a. Perform ! KeepDuringJob(target). + b. Return target. + 6. Return undefined. +features: [WeakRef, FinalizationGroup] +---*/ + +assert.sameValue(typeof WeakRef.prototype.deref, 'function'); + +var deref = WeakRef.prototype.deref; + +assert.throws(TypeError, function() { + deref.call({ ['[[Target]]']: {} }); +}, 'Ordinary object without [[Target]]'); + +assert.throws(TypeError, function() { + deref.call(WeakRef.prototype); +}, 'WeakRef.prototype does not have a [[Target]] internal slot'); + +assert.throws(TypeError, function() { + deref.call(WeakRef); +}, 'WeakRef does not have a [[Target]] internal slot'); + +var fg = new FinalizationGroup(function() {}); +assert.throws(TypeError, function() { + deref.call(fg); +}, 'FinalizationGroup instance'); + +var wm = new WeakMap(); +assert.throws(TypeError, function() { + deref.call(wm); +}, 'WeakMap instance'); + +var ws = new WeakSet(); +assert.throws(TypeError, function() { + deref.call(ws); +}, 'WeakSet instance'); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/deref/this-not-object-throws.js b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/this-not-object-throws.js new file mode 100644 index 000000000000..05adca195a08 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/deref/this-not-object-throws.js @@ -0,0 +1,52 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref.prototype.deref +description: Throws a TypeError if this is not an Object +info: | + WeakRef.prototype.deref () + + 1. Let weakRef be the this value. + 2. If Type(weakRef) is not Object, throw a TypeError exception. + 3. If weakRef does not have a [[Target]] internal slot, throw a TypeError exception. + 4. Let target be the value of weakRef.[[Target]]. + 5. If target is not empty, + a. Perform ! KeepDuringJob(target). + b. Return target. + 6. Return undefined. +features: [WeakRef] +---*/ + +assert.sameValue(typeof WeakRef.prototype.deref, 'function'); + +var deref = WeakRef.prototype.deref; + +assert.throws(TypeError, function() { + deref.call(undefined); +}, 'undefined'); + +assert.throws(TypeError, function() { + deref.call(null); +}, 'null'); + +assert.throws(TypeError, function() { + deref.call(true); +}, 'true'); + +assert.throws(TypeError, function() { + deref.call(false); +}, 'false'); + +assert.throws(TypeError, function() { + deref.call(1); +}, 'number'); + +assert.throws(TypeError, function() { + deref.call('object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + deref.call(s); +}, 'symbol'); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/prop-desc.js b/JSTests/test262/test/built-ins/WeakRef/prototype/prop-desc.js new file mode 100644 index 000000000000..8f4bacc735ac --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/prop-desc.js @@ -0,0 +1,18 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: The property descriptor WeakRef.prototype +esid: sec-weak-ref.prototype +info: | + This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, + [[Configurable]]: false }. +features: [WeakRef] +includes: [propertyHelper.js] +---*/ + +verifyProperty(WeakRef, 'prototype', { + writable: false, + enumerable: false, + configurable: false +}); diff --git a/JSTests/test262/test/built-ins/WeakRef/prototype/proto.js b/JSTests/test262/test/built-ins/WeakRef/prototype/proto.js new file mode 100644 index 000000000000..8df09824be5d --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/prototype/proto.js @@ -0,0 +1,14 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: The prototype of WeakRef.prototype is Object.prototype +esid: sec-properties-of-the-weak-ref-prototype-object +info: | + The value of the [[Prototype]] internal slot of the WeakRef prototype object + is the intrinsic object %ObjectPrototype%. +features: [WeakRef] +---*/ + +var proto = Object.getPrototypeOf(WeakRef.prototype); +assert.sameValue(proto, Object.prototype); diff --git a/JSTests/test262/test/built-ins/WeakRef/returns-new-object-from-constructor.js b/JSTests/test262/test/built-ins/WeakRef/returns-new-object-from-constructor.js new file mode 100644 index 000000000000..9e52f88d6bb2 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/returns-new-object-from-constructor.js @@ -0,0 +1,49 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + Returns a new ordinary object from the WeakRef constructor +info: | + WeakRef ( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef] +---*/ + +var target = {}; +var wr = new WeakRef(target); + +assert.notSameValue(wr, target, 'does not return the same object'); +assert.sameValue(wr instanceof WeakRef, true, 'instanceof'); + +for (let key of Object.getOwnPropertyNames(wr)) { + assert(false, `should not set any own named properties: ${key}`); +} + +for (let key of Object.getOwnPropertySymbols(wr)) { + assert(false, `should not set any own symbol properties: ${String(key)}`); +} + +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype); + + diff --git a/JSTests/test262/test/built-ins/WeakRef/target-not-object-throws.js b/JSTests/test262/test/built-ins/WeakRef/target-not-object-throws.js new file mode 100644 index 000000000000..532277044949 --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/target-not-object-throws.js @@ -0,0 +1,53 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + Throws a TypeError if target is not Object +info: | + WeakRef ( target ) + + 1. If NewTarget is undefined, throw a TypeError exception. + 2. If Type(target) is not Object, throw a TypeError exception. + ... +features: [WeakRef] +---*/ + +assert.sameValue( + typeof WeakRef, 'function', + 'typeof WeakRef is function' +); + +assert.throws(TypeError, function() { + new WeakRef(); +}, 'implicit undefined'); + +assert.throws(TypeError, function() { + new WeakRef(undefined); +}, 'explicit undefined'); + +assert.throws(TypeError, function() { + new WeakRef(null); +}, 'null'); + +assert.throws(TypeError, function() { + new WeakRef(1); +}, 'number'); + +assert.throws(TypeError, function() { + new WeakRef('Object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + new WeakRef(s); +}, 'symbol'); + +assert.throws(TypeError, function() { + new WeakRef(true); +}, 'Boolean, true'); + +assert.throws(TypeError, function() { + new WeakRef(false); +}, 'Boolean, false'); diff --git a/JSTests/test262/test/built-ins/WeakRef/undefined-newtarget-throws.js b/JSTests/test262/test/built-ins/WeakRef/undefined-newtarget-throws.js new file mode 100644 index 000000000000..942a0706939e --- /dev/null +++ b/JSTests/test262/test/built-ins/WeakRef/undefined-newtarget-throws.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + Throws a TypeError if NewTarget is undefined. +info: | + WeakRef ( target ) + + 1. If NewTarget is undefined, throw a TypeError exception. + 2. If Type(target) is not Object, throw a TypeError exception. + ... +features: [WeakRef] +---*/ + +assert.sameValue( + typeof WeakRef, 'function', + 'typeof WeakRef is function' +); + +assert.throws(TypeError, function() { + WeakRef(); +}); + +assert.throws(TypeError, function() { + WeakRef({}); +}); diff --git a/JSTests/test262/test/harness/verifyProperty-same-value.js b/JSTests/test262/test/harness/verifyProperty-same-value.js new file mode 100644 index 000000000000..f8714615229f --- /dev/null +++ b/JSTests/test262/test/harness/verifyProperty-same-value.js @@ -0,0 +1,19 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + verifyProperty uses SameValue for value comparison. +includes: [propertyHelper.js] +---*/ + +var obj = { + a: NaN, + b: -0, +}; + +assert(verifyProperty(obj, 'a', { value: NaN })); +assert(verifyProperty(obj, 'b', { value: -0 })); + +assert.throws(Test262Error, function() { + verifyProperty(obj, 'b', { value: 0 }); +}); diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/builtin.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/builtin.js index ea19689674b4..2ade8aa6555e 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/builtin.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/builtin.js @@ -1,4 +1,5 @@ -// Copyright 2012-2019 Mozilla Corporation; Igalia, S.L. All rights reserved. +// Copyright 2012 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js index af40a8971181..c46d4b0b89f4 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js @@ -1,4 +1,5 @@ -// Copyright (C) 2017-2019 Daniel Ehrenberg; Igalia, S.L. All rights reserved. +// Copyright (C) 2017 Daniel Ehrenberg. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/length.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/length.js index 0a0d78c12141..7a22c2913e9b 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/length.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/length.js @@ -1,4 +1,5 @@ -// Copyright (C) 2017-2019 André Bargull; Igalia, S.L. All rights reserved. +// Copyright (C) 2017 André Bargull. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js index 36a5ee4d76a1..2ee4f8dcbf19 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/returns-same-results-as-NumberFormat.js @@ -1,4 +1,5 @@ -// Copyright 2012-2019 Mozilla Corporation; Igalia, S.L. All rights reserved. +// Copyright 2012 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js index b1aeef361774..be336fdab1a9 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/taint-Intl-NumberFormat.js @@ -1,4 +1,5 @@ -// Copyright 2013-2019 Mozilla Corporation; Igalia, S.L. All rights reserved. +// Copyright 2013 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js index d80719a91457..9506feb09b61 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/this-value-invalid.js @@ -1,4 +1,5 @@ -// Copyright 2012-2019 Mozilla Corporation; Igalia, S.L. All rights reserved. +// Copyright 2012 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js index cf8a3913b993..14deccab138c 100644 --- a/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js +++ b/JSTests/test262/test/intl402/BigInt/prototype/toLocaleString/throws-same-exceptions-as-NumberFormat.js @@ -1,4 +1,5 @@ -// Copyright 2012-2019 Mozilla Corporation; Igalia, S.L. All rights reserved. +// Copyright 2012 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-dayPeriod-invalid.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-dayPeriod-invalid.js new file mode 100644 index 000000000000..da685403a858 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-dayPeriod-invalid.js @@ -0,0 +1,28 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: > + Checks error cases for the options argument to the DateTimeFormat constructor. +info: | + [[DayPeriod]] `"dayPeriod"` `"narrow"`, `"short"`, `"long"` + InitializeDateTimeFormat ( dateTimeFormat, locales, options ) + + ... +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +const invalidOptions = [ + "", + "LONG", + " long", + "short ", + "full", + "numeric", +]; +for (const dayPeriod of invalidOptions) { + assert.throws(RangeError, function() { + new Intl.DateTimeFormat("en", { dayPeriod }); + }, `new Intl.DateTimeFormat("en", { dayPeriod: "${dayPeriod}" }) throws RangeError`); +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-dayPeriod-valid.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-dayPeriod-valid.js new file mode 100644 index 000000000000..7e48dafaf1e9 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-dayPeriod-valid.js @@ -0,0 +1,34 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: > + Checks handling of the options argument to the DateTimeFormat constructor. +info: | + [[DayPeriod]] `"dayPeriod"` `"narrow"`, `"short"`, `"long"` + InitializeDateTimeFormat ( dateTimeFormat, locales, options ) + + ... +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +const validOptions = [ + [undefined, undefined], + ["long", "long"], + ["short", "short"], + ["narrow", "narrow"], + [{ toString() { return "narrow"; } }, "narrow"], + [{ valueOf() { return "long"; }, toString: undefined }, "long"], +]; +for (const [dayPeriod, expected] of validOptions) { + const dtf = new Intl.DateTimeFormat("en", { dayPeriod }); + const options = dtf.resolvedOptions(); + assert.sameValue(options.dayPeriod, expected); + const propdesc = Object.getOwnPropertyDescriptor(options, "dayPeriod"); + if (expected === undefined) { + assert.sameValue(propdesc, undefined); + } else { + assert.sameValue(propdesc.value, expected); + } +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-invalid.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-invalid.js new file mode 100644 index 000000000000..efb944668289 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-invalid.js @@ -0,0 +1,35 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: > + Checks error cases for the options argument to the DateTimeFormat constructor. +info: | + InitializeDateTimeFormat ( dateTimeFormat, locales, options ) + 23. Let _opt_.[[FractionalSecondDigits]] be ? GetNumberOption(_options_, `"fractionalSecondDigits"`, 0, 3, 0). + + ... +features: [Intl.DateTimeFormat-fractionalSecondDigits] +---*/ + + +const invalidOptions = [ + "LONG", + " long", + "short ", + "full", + "numeric", + -1, + 4, + "4", + "-1", + -0.00001, + 3.000001, +]; +for (const fractionalSecondDigits of invalidOptions) { + assert.throws(RangeError, function() { + new Intl.DateTimeFormat("en", { fractionalSecondDigits }); + }, + `new Intl.DateTimeFormat("en", { fractionalSecondDigits: "${fractionalSecondDigits}" }) throws RangeError`); +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-valid.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-valid.js new file mode 100644 index 000000000000..3f9fa0d3c693 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-fractionalSecondDigits-valid.js @@ -0,0 +1,42 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: > + Checks handling of the options argument to the DateTimeFormat constructor. +info: | + InitializeDateTimeFormat ( dateTimeFormat, locales, options ) + 23. Let _opt_.[[FractionalSecondDigits]] be ? GetNumberOption(_options_, `"fractionalSecondDigits"`, 0, 3, 0). +features: [Intl.DateTimeFormat-fractionalSecondDigits] +---*/ + + +const validOptions = [ + [undefined, 0], + [-0, 0], + [0, 0], + ["0", 0], + [1, 1], + ["1", 1], + [2, 2], + ["2", 2], + [3, 3], + ["3", 3], + [2.9, 2], + ["2.9", 2], + [0.00001, 0], + [{ toString() { return "3"; } }, 3], + [{ valueOf() { return -0; }, toString: undefined }, 0], +]; +for (const [fractionalSecondDigits, expected] of validOptions) { + const dtf = new Intl.DateTimeFormat("en", { fractionalSecondDigits }); + const options = dtf.resolvedOptions(); + assert.sameValue(options.fractionalSecondDigits, expected); + const propdesc = Object.getOwnPropertyDescriptor(options, "fractionalSecondDigits"); + if (expected === undefined) { + assert.sameValue(propdesc, undefined); + } else { + assert.sameValue(propdesc.value, expected); + } +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js new file mode 100644 index 000000000000..446cb08381d9 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-dayPeriod.js @@ -0,0 +1,48 @@ +// Copyright 2019 Googe Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks the order of getting options of 'dayPeriod' for the DateTimeFormat constructor. +info: | + ToDateTimeOptions ( options, required, defaults ) + 4. If required is "date" or "any", then + a. For each of the property names "weekday", "year", "month", "day", "dayPeriod" do + 5. If required is "time" or "any", then + a. For each of the property names "hour", "minute", "second", do +includes: [compareArray.js] +features: [Intl.DateTimeFormat-dayPeriod] + +---*/ + +// Just need to ensure dayPeriod are get between day and hour. +const expected = [ + // ToDateTimeOptions step 4. + "day", "dayPeriod", + // ToDateTimeOptions step 5. + "hour", + // InitializeDateTimeFormat step 22. + "day", + "dayPeriod", + "hour" +]; + +const actual = []; + +const options = { + get day() { + actual.push("day"); + return "numeric"; + }, + get dayPeriod() { + actual.push("dayPeriod"); + return "long"; + }, + get hour() { + actual.push("hour"); + return "numeric"; + }, +}; + +new Intl.DateTimeFormat("en", options); +assert.compareArray(actual, expected); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js new file mode 100644 index 000000000000..d33456e14a29 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-order-fractionalSecondDigits.js @@ -0,0 +1,67 @@ +// Copyright 2019 Googe Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks the order of getting options of 'fractionalSecondDigits' for the DateTimeFormat constructor. +info: | + ToDateTimeOptions ( options, required, defaults ) + 5. If required is "time" or "any", then + a. For each of the property names "hour", "minute", "second", "fractionalSecondDigits", do + + InitializeDateTimeFormat ( dateTimeFormat, locales, options ) + 2. Let options be ? ToDateTimeOptions(options, "any", "date"). + 4. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). + 22. For each row of Table 5, except the header row, do + a. Let value be ? GetOption(options, prop, "string", « the strings given in the Values column of the row », undefined). + 23. Let _opt_.[[FractionalSecondDigits]] be ? GetNumberOption(_options_, `"fractionalSecondDigits"`, 0, 3, 0). + 26. Let matcher be ? GetOption(options, "formatMatcher", "string", « "basic", "best fit" », "best fit"). +includes: [compareArray.js] +features: [Intl.DateTimeFormat-fractionalSecondDigits] +---*/ + +// Just need to ensure fractionalSecondDigits are get +// between second and localeMatcher the first time and +// between timeZoneName and formatMatcher the second time. +const expected = [ + // InitializeDateTimeFormat step 2. + // ToDateTimeOptions step 5. + "second", "fractionalSecondDigits", + // InitializeDateTimeFormat step 4. + "localeMatcher", + // InitializeDateTimeFormat step 22. + "second", + "timeZoneName", + // InitializeDateTimeFormat step 23. + "fractionalSecondDigits", + // InitializeDateTimeFormat step 26. + "formatMatcher", +]; + +const actual = []; + +const options = { + get second() { + actual.push("second"); + return "numeric"; + }, + get fractionalSecondDigits() { + actual.push("fractionalSecondDigits"); + return undefined; + }, + get localeMatcher() { + actual.push("localeMatcher"); + return undefined; + }, + get timeZoneName() { + actual.push("timeZoneName"); + return undefined; + }, + get formatMatcher() { + actual.push("formatMatcher"); + return undefined; + }, +}; + +new Intl.DateTimeFormat("en", options); +assert.compareArray(actual, expected); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js new file mode 100644 index 000000000000..0c84cfe0fa66 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-dayPeriod.js @@ -0,0 +1,24 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks the propagation of exceptions from the options for the DateTimeFormat constructor. +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +function CustomError() {} + +const options = [ + "dayPeriod", +]; + +for (const option of options) { + assert.throws(CustomError, () => { + new Intl.DateTimeFormat("en", { + get [option]() { + throw new CustomError(); + } + }); + }, `Exception from ${option} getter should be propagated`); +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js new file mode 100644 index 000000000000..40f7d74ac776 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-fractionalSecondDigits.js @@ -0,0 +1,24 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks the propagation of exceptions from the options for the DateTimeFormat constructor. +features: [Intl.DateTimeFormat-fractionalSecondDigits] +---*/ + +function CustomError() {} + +const options = [ + "fractionalSecondDigits", +]; + +for (const option of options) { + assert.throws(CustomError, () => { + new Intl.DateTimeFormat("en", { + get [option]() { + throw new CustomError(); + } + }); + }, `Exception from ${option} getter should be propagated`); +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-quarter.js b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-quarter.js new file mode 100644 index 000000000000..e6ee7be9cc93 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/constructor-options-throwing-getters-quarter.js @@ -0,0 +1,24 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks the propagation of exceptions from the options for the DateTimeFormat constructor. +features: [Intl.DateTimeFormat-quarter] +---*/ + +function CustomError() {} + +const options = [ + "quarter", +]; + +for (const option of options) { + assert.throws(CustomError, () => { + new Intl.DateTimeFormat("en", { + get [option]() { + throw new CustomError(); + } + }); + }, `Exception from ${option} getter should be propagated`); +} diff --git a/JSTests/test262/test/intl402/DateTimeFormat/numbering-system-calendar-options.js b/JSTests/test262/test/intl402/DateTimeFormat/numbering-system-calendar-options.js new file mode 100644 index 000000000000..ac309110957a --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/numbering-system-calendar-options.js @@ -0,0 +1,68 @@ +// Copyright 2012 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: > + Tests that the options numberingSystem and calendar can be set through + either the locale or the options. +author: Norbert Lindenberg, Daniel Ehrenberg +includes: [testIntl.js] +---*/ + +let defaultLocale = new Intl.DateTimeFormat().resolvedOptions().locale; + +let supportedNumberingSystems = ["latn", "arab"].filter(nu => + new Intl.DateTimeFormat(defaultLocale + "-u-nu-" + nu) + .resolvedOptions().numberingSystem === nu +); + +let supportedCalendars = ["gregory", "chinese"].filter(ca => + new Intl.DateTimeFormat(defaultLocale + "-u-ca-" + ca) + .resolvedOptions().calendar === ca +); + +let options = [ + {key: "nu", property: "numberingSystem", type: "string", values: supportedNumberingSystems}, + {key: "ca", property: "calendar", type: "string", values: supportedCalendars} +]; + +options.forEach(function (option) { + let dateTimeFormat, opt, result; + + // find out which values are supported for a property in the default locale + let supportedValues = []; + option.values.forEach(function (value) { + opt = {}; + opt[option.property] = value; + dateTimeFormat = new Intl.DateTimeFormat([defaultLocale], opt); + result = dateTimeFormat.resolvedOptions()[option.property]; + if (result !== undefined && supportedValues.indexOf(result) === -1) { + supportedValues.push(result); + } + }); + + // verify that the supported values can also be set through the locale + supportedValues.forEach(function (value) { + dateTimeFormat = new Intl.DateTimeFormat([defaultLocale + "-u-" + option.key + "-" + value]); + result = dateTimeFormat.resolvedOptions()[option.property]; + assert.sameValue(result, value, "Property " + option.property + " couldn't be set through locale extension key " + option.key + "."); + }); + + // verify that the options setting overrides the locale setting + supportedValues.forEach(function (value) { + let otherValue; + option.values.forEach(function (possibleValue) { + if (possibleValue !== value) { + otherValue = possibleValue; + } + }); + if (otherValue !== undefined) { + opt = {}; + opt[option.property] = value; + dateTimeFormat = new Intl.DateTimeFormat([defaultLocale + "-u-" + option.key + "-" + otherValue], opt); + result = dateTimeFormat.resolvedOptions()[option.property]; + assert.sameValue(result, value, "Options value for property " + option.property + " doesn't override locale extension key " + option.key + "."); + } + }); +}); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-long-en.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-long-en.js new file mode 100644 index 000000000000..69440b0aeae7 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-long-en.js @@ -0,0 +1,93 @@ +// Copyright 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of dayPeriod, long format. +features: [Intl.DateTimeFormat-dayPeriod] +locale: [en-US] +---*/ + +const d0000 = new Date(2017, 11, 12, 0, 0, 0, 0); +const d0100 = new Date(2017, 11, 12, 1, 0, 0, 0); +const d0200 = new Date(2017, 11, 12, 2, 0, 0, 0); +const d0300 = new Date(2017, 11, 12, 3, 0, 0, 0); +const d0400 = new Date(2017, 11, 12, 4, 0, 0, 0); +const d0500 = new Date(2017, 11, 12, 5, 0, 0, 0); +const d0600 = new Date(2017, 11, 12, 6, 0, 0, 0); +const d0700 = new Date(2017, 11, 12, 7, 0, 0, 0); +const d0800 = new Date(2017, 11, 12, 8, 0, 0, 0); +const d0900 = new Date(2017, 11, 12, 9, 0, 0, 0); +const d1000 = new Date(2017, 11, 12, 10, 0, 0, 0); +const d1100 = new Date(2017, 11, 12, 11, 0, 0, 0); +const d1200 = new Date(2017, 11, 12, 12, 0, 0, 0); +const d1300 = new Date(2017, 11, 12, 13, 0, 0, 0); +const d1400 = new Date(2017, 11, 12, 14, 0, 0, 0); +const d1500 = new Date(2017, 11, 12, 15, 0, 0, 0); +const d1600 = new Date(2017, 11, 12, 16, 0, 0, 0); +const d1700 = new Date(2017, 11, 12, 17, 0, 0, 0); +const d1800 = new Date(2017, 11, 12, 18, 0, 0, 0); +const d1900 = new Date(2017, 11, 12, 19, 0, 0, 0); +const d2000 = new Date(2017, 11, 12, 20, 0, 0, 0); +const d2100 = new Date(2017, 11, 12, 21, 0, 0, 0); +const d2200 = new Date(2017, 11, 12, 22, 0, 0, 0); +const d2300 = new Date(2017, 11, 12, 23, 0, 0, 0); + +const long = new Intl.DateTimeFormat('en', { + dayPeriod: 'long' +}); + +assert.sameValue(long.format(d0000), 'at night', '00:00, long format'); +assert.sameValue(long.format(d0100), 'at night', '01:00, long format'); +assert.sameValue(long.format(d0200), 'at night', '02:00, long format'); +assert.sameValue(long.format(d0300), 'at night', '03:00, long format'); +assert.sameValue(long.format(d0400), 'at night', '04:00, long format'); +assert.sameValue(long.format(d0500), 'at night', '05:00, long format'); +assert.sameValue(long.format(d0600), 'in the morning', '06:00, long format'); +assert.sameValue(long.format(d0700), 'in the morning', '07:00, long format'); +assert.sameValue(long.format(d0800), 'in the morning', '08:00, long format'); +assert.sameValue(long.format(d0900), 'in the morning', '09:00, long format'); +assert.sameValue(long.format(d1000), 'in the morning', '10:00, long format'); +assert.sameValue(long.format(d1100), 'in the morning', '11:00, long format'); +assert.sameValue(long.format(d1200), 'noon', '12:00, long format'); +assert.sameValue(long.format(d1300), 'in the afternoon', '13:00, long format'); +assert.sameValue(long.format(d1400), 'in the afternoon', '14:00, long format'); +assert.sameValue(long.format(d1500), 'in the afternoon', '15:00, long format'); +assert.sameValue(long.format(d1600), 'in the afternoon', '16:00, long format'); +assert.sameValue(long.format(d1700), 'in the afternoon', '17:00, long format'); +assert.sameValue(long.format(d1800), 'in the evening', '18:00, long format'); +assert.sameValue(long.format(d1900), 'in the evening', '19:00, long format'); +assert.sameValue(long.format(d2000), 'in the evening', '20:00, long format'); +assert.sameValue(long.format(d2100), 'at night', '21:00, long format'); +assert.sameValue(long.format(d2200), 'at night', '22:00, long format'); +assert.sameValue(long.format(d2300), 'at night', '23:00, long format'); + +const longNumeric = new Intl.DateTimeFormat('en', { + dayPeriod: 'long', + hour: 'numeric' +}); + +assert.sameValue(longNumeric.format(d0000), '12 at night', '00:00, long-numeric'); +assert.sameValue(longNumeric.format(d0100), '1 at night', '01:00, long-numeric'); +assert.sameValue(longNumeric.format(d0200), '2 at night', '02:00, long-numeric'); +assert.sameValue(longNumeric.format(d0300), '3 at night', '03:00, long-numeric'); +assert.sameValue(longNumeric.format(d0400), '4 at night', '04:00, long-numeric'); +assert.sameValue(longNumeric.format(d0500), '5 at night', '05:00, long-numeric'); +assert.sameValue(longNumeric.format(d0600), '6 in the morning', '06:00, long-numeric'); +assert.sameValue(longNumeric.format(d0700), '7 in the morning', '07:00, long-numeric'); +assert.sameValue(longNumeric.format(d0800), '8 in the morning', '08:00, long-numeric'); +assert.sameValue(longNumeric.format(d0900), '9 in the morning', '09:00, long-numeric'); +assert.sameValue(longNumeric.format(d1000), '10 in the morning', '10:00, long-numeric'); +assert.sameValue(longNumeric.format(d1100), '11 in the morning', '11:00, long-numeric'); +assert.sameValue(longNumeric.format(d1200), '12 noon', '12:00, long-numeric'); +assert.sameValue(longNumeric.format(d1300), '1 in the afternoon', '13:00, long-numeric'); +assert.sameValue(longNumeric.format(d1400), '2 in the afternoon', '14:00, long-numeric'); +assert.sameValue(longNumeric.format(d1500), '3 in the afternoon', '15:00, long-numeric'); +assert.sameValue(longNumeric.format(d1600), '4 in the afternoon', '16:00, long-numeric'); +assert.sameValue(longNumeric.format(d1700), '5 in the afternoon', '17:00, long-numeric'); +assert.sameValue(longNumeric.format(d1800), '6 in the evening', '18:00, long-numeric'); +assert.sameValue(longNumeric.format(d1900), '7 in the evening', '19:00, long-numeric'); +assert.sameValue(longNumeric.format(d2000), '8 in the evening', '20:00, long-numeric'); +assert.sameValue(longNumeric.format(d2100), '9 at night', '21:00, long-numeric'); +assert.sameValue(longNumeric.format(d2200), '10 at night', '22:00, long-numeric'); +assert.sameValue(longNumeric.format(d2300), '11 at night', '23:00, long-numeric'); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-narrow-en.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-narrow-en.js new file mode 100644 index 000000000000..01c541804549 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-narrow-en.js @@ -0,0 +1,93 @@ +// Copyright 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of dayPeriod, narrow format. +features: [Intl.DateTimeFormat-dayPeriod] +locale: [en-US] +---*/ + +const d0000 = new Date(2017, 11, 12, 0, 0, 0, 0); +const d0100 = new Date(2017, 11, 12, 1, 0, 0, 0); +const d0200 = new Date(2017, 11, 12, 2, 0, 0, 0); +const d0300 = new Date(2017, 11, 12, 3, 0, 0, 0); +const d0400 = new Date(2017, 11, 12, 4, 0, 0, 0); +const d0500 = new Date(2017, 11, 12, 5, 0, 0, 0); +const d0600 = new Date(2017, 11, 12, 6, 0, 0, 0); +const d0700 = new Date(2017, 11, 12, 7, 0, 0, 0); +const d0800 = new Date(2017, 11, 12, 8, 0, 0, 0); +const d0900 = new Date(2017, 11, 12, 9, 0, 0, 0); +const d1000 = new Date(2017, 11, 12, 10, 0, 0, 0); +const d1100 = new Date(2017, 11, 12, 11, 0, 0, 0); +const d1200 = new Date(2017, 11, 12, 12, 0, 0, 0); +const d1300 = new Date(2017, 11, 12, 13, 0, 0, 0); +const d1400 = new Date(2017, 11, 12, 14, 0, 0, 0); +const d1500 = new Date(2017, 11, 12, 15, 0, 0, 0); +const d1600 = new Date(2017, 11, 12, 16, 0, 0, 0); +const d1700 = new Date(2017, 11, 12, 17, 0, 0, 0); +const d1800 = new Date(2017, 11, 12, 18, 0, 0, 0); +const d1900 = new Date(2017, 11, 12, 19, 0, 0, 0); +const d2000 = new Date(2017, 11, 12, 20, 0, 0, 0); +const d2100 = new Date(2017, 11, 12, 21, 0, 0, 0); +const d2200 = new Date(2017, 11, 12, 22, 0, 0, 0); +const d2300 = new Date(2017, 11, 12, 23, 0, 0, 0); + +const narrow = new Intl.DateTimeFormat('en', { + dayPeriod: 'narrow' +}); + +assert.sameValue(narrow.format(d0000), 'at night', '00:00, narrow format'); +assert.sameValue(narrow.format(d0100), 'at night', '01:00, narrow format'); +assert.sameValue(narrow.format(d0200), 'at night', '02:00, narrow format'); +assert.sameValue(narrow.format(d0300), 'at night', '03:00, narrow format'); +assert.sameValue(narrow.format(d0400), 'at night', '04:00, narrow format'); +assert.sameValue(narrow.format(d0500), 'at night', '05:00, narrow format'); +assert.sameValue(narrow.format(d0600), 'in the morning', '06:00, narrow format'); +assert.sameValue(narrow.format(d0700), 'in the morning', '07:00, narrow format'); +assert.sameValue(narrow.format(d0800), 'in the morning', '08:00, narrow format'); +assert.sameValue(narrow.format(d0900), 'in the morning', '09:00, narrow format'); +assert.sameValue(narrow.format(d1000), 'in the morning', '10:00, narrow format'); +assert.sameValue(narrow.format(d1100), 'in the morning', '11:00, narrow format'); +assert.sameValue(narrow.format(d1200), 'n', '12:00, narrow format'); +assert.sameValue(narrow.format(d1300), 'in the afternoon', '13:00, narrow format'); +assert.sameValue(narrow.format(d1400), 'in the afternoon', '14:00, narrow format'); +assert.sameValue(narrow.format(d1500), 'in the afternoon', '15:00, narrow format'); +assert.sameValue(narrow.format(d1600), 'in the afternoon', '16:00, narrow format'); +assert.sameValue(narrow.format(d1700), 'in the afternoon', '17:00, narrow format'); +assert.sameValue(narrow.format(d1800), 'in the evening', '18:00, narrow format'); +assert.sameValue(narrow.format(d1900), 'in the evening', '19:00, narrow format'); +assert.sameValue(narrow.format(d2000), 'in the evening', '20:00, narrow format'); +assert.sameValue(narrow.format(d2100), 'at night', '21:00, narrow format'); +assert.sameValue(narrow.format(d2200), 'at night', '22:00, narrow format'); +assert.sameValue(narrow.format(d2300), 'at night', '23:00, narrow format'); + +const narrowNumeric = new Intl.DateTimeFormat('en', { + dayPeriod: 'narrow', + hour: 'numeric' +}); + +assert.sameValue(narrowNumeric.format(d0000), '12 at night', '00:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0100), '1 at night', '01:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0200), '2 at night', '02:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0300), '3 at night', '03:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0400), '4 at night', '04:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0500), '5 at night', '05:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0600), '6 in the morning', '06:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0700), '7 in the morning', '07:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0800), '8 in the morning', '08:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d0900), '9 in the morning', '09:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1000), '10 in the morning', '10:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1100), '11 in the morning', '11:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1200), '12 n', '12:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1300), '1 in the afternoon', '13:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1400), '2 in the afternoon', '14:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1500), '3 in the afternoon', '15:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1600), '4 in the afternoon', '16:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1700), '5 in the afternoon', '17:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1800), '6 in the evening', '18:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d1900), '7 in the evening', '19:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d2000), '8 in the evening', '20:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d2100), '9 at night', '21:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d2200), '10 at night', '22:00, narrow-numeric'); +assert.sameValue(narrowNumeric.format(d2300), '11 at night', '23:00, narrow-numeric'); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js new file mode 100644 index 000000000000..3a450c518113 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/dayPeriod-short-en.js @@ -0,0 +1,93 @@ +// Copyright 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of dayPeriod, short format. +features: [Intl.DateTimeFormat-dayPeriod] +locale: [en-US] +---*/ + +const d0000 = new Date(2017, 11, 12, 0, 0, 0, 0); +const d0100 = new Date(2017, 11, 12, 1, 0, 0, 0); +const d0200 = new Date(2017, 11, 12, 2, 0, 0, 0); +const d0300 = new Date(2017, 11, 12, 3, 0, 0, 0); +const d0400 = new Date(2017, 11, 12, 4, 0, 0, 0); +const d0500 = new Date(2017, 11, 12, 5, 0, 0, 0); +const d0600 = new Date(2017, 11, 12, 6, 0, 0, 0); +const d0700 = new Date(2017, 11, 12, 7, 0, 0, 0); +const d0800 = new Date(2017, 11, 12, 8, 0, 0, 0); +const d0900 = new Date(2017, 11, 12, 9, 0, 0, 0); +const d1000 = new Date(2017, 11, 12, 10, 0, 0, 0); +const d1100 = new Date(2017, 11, 12, 11, 0, 0, 0); +const d1200 = new Date(2017, 11, 12, 12, 0, 0, 0); +const d1300 = new Date(2017, 11, 12, 13, 0, 0, 0); +const d1400 = new Date(2017, 11, 12, 14, 0, 0, 0); +const d1500 = new Date(2017, 11, 12, 15, 0, 0, 0); +const d1600 = new Date(2017, 11, 12, 16, 0, 0, 0); +const d1700 = new Date(2017, 11, 12, 17, 0, 0, 0); +const d1800 = new Date(2017, 11, 12, 18, 0, 0, 0); +const d1900 = new Date(2017, 11, 12, 19, 0, 0, 0); +const d2000 = new Date(2017, 11, 12, 20, 0, 0, 0); +const d2100 = new Date(2017, 11, 12, 21, 0, 0, 0); +const d2200 = new Date(2017, 11, 12, 22, 0, 0, 0); +const d2300 = new Date(2017, 11, 12, 23, 0, 0, 0); + +const short = new Intl.DateTimeFormat('en', { + dayPeriod: 'short' +}); + +assert.sameValue(short.format(d0000), 'at night', '00:00, short format'); +assert.sameValue(short.format(d0100), 'at night', '01:00, short format'); +assert.sameValue(short.format(d0200), 'at night', '02:00, short format'); +assert.sameValue(short.format(d0300), 'at night', '03:00, short format'); +assert.sameValue(short.format(d0400), 'at night', '04:00, short format'); +assert.sameValue(short.format(d0500), 'at night', '05:00, short format'); +assert.sameValue(short.format(d0600), 'in the morning', '06:00, short format'); +assert.sameValue(short.format(d0700), 'in the morning', '07:00, short format'); +assert.sameValue(short.format(d0800), 'in the morning', '08:00, short format'); +assert.sameValue(short.format(d0900), 'in the morning', '09:00, short format'); +assert.sameValue(short.format(d1000), 'in the morning', '10:00, short format'); +assert.sameValue(short.format(d1100), 'in the morning', '11:00, short format'); +assert.sameValue(short.format(d1200), 'noon', '12:00, short format'); +assert.sameValue(short.format(d1300), 'in the afternoon', '13:00, short format'); +assert.sameValue(short.format(d1400), 'in the afternoon', '14:00, short format'); +assert.sameValue(short.format(d1500), 'in the afternoon', '15:00, short format'); +assert.sameValue(short.format(d1600), 'in the afternoon', '16:00, short format'); +assert.sameValue(short.format(d1700), 'in the afternoon', '17:00, short format'); +assert.sameValue(short.format(d1800), 'in the evening', '18:00, short format'); +assert.sameValue(short.format(d1900), 'in the evening', '19:00, short format'); +assert.sameValue(short.format(d2000), 'in the evening', '20:00, short format'); +assert.sameValue(short.format(d2100), 'at night', '21:00, short format'); +assert.sameValue(short.format(d2200), 'at night', '22:00, short format'); +assert.sameValue(short.format(d2300), 'at night', '23:00, short format'); + +const shortNumeric = new Intl.DateTimeFormat('en', { + dayPeriod: 'short', + hour: 'numeric' +}); + +assert.sameValue(shortNumeric.format(d0000), '12 at night', '00:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0100), '1 at night', '01:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0200), '2 at night', '02:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0300), '3 at night', '03:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0400), '4 at night', '04:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0500), '5 at night', '05:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0600), '6 in the morning', '06:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0700), '7 in the morning', '07:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0800), '8 in the morning', '08:00, short-numeric'); +assert.sameValue(shortNumeric.format(d0900), '9 in the morning', '09:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1000), '10 in the morning', '10:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1100), '11 in the morning', '11:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1200), '12 noon', '12:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1300), '1 in the afternoon', '13:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1400), '2 in the afternoon', '14:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1500), '3 in the afternoon', '15:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1600), '4 in the afternoon', '16:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1700), '5 in the afternoon', '17:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1800), '6 in the evening', '18:00, short-numeric'); +assert.sameValue(shortNumeric.format(d1900), '7 in the evening', '19:00, short-numeric'); +assert.sameValue(shortNumeric.format(d2000), '8 in the evening', '20:00, short-numeric'); +assert.sameValue(shortNumeric.format(d2100), '9 at night', '21:00, short-numeric'); +assert.sameValue(shortNumeric.format(d2200), '10 at night', '22:00, short-numeric'); +assert.sameValue(shortNumeric.format(d2300), '11 at night', '23:00, short-numeric'); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/fractionalSecondDigits.js new file mode 100644 index 000000000000..ee2bfc4bf808 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/format/fractionalSecondDigits.js @@ -0,0 +1,32 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of fractionalSecondDigits. +features: [Intl.DateTimeFormat-fractionalSecondDigits] +locale: [en-US] +---*/ + +const d1 = new Date(2019, 7, 10, 1, 2, 3, 234); +const d2 = new Date(2019, 7, 10, 1, 2, 3, 567); + +let dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 0}); +assert.sameValue(dtf.format(d1), "02:03", "no fractionalSecondDigits"); +assert.sameValue(dtf.format(d2), "02:03", "no fractionalSecondDigits"); + +dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 1}); +assert.sameValue(dtf.format(d1), "02:03.2", "1 fractionalSecondDigits round down"); +assert.sameValue(dtf.format(d2), "02:03.5", "1 fractionalSecondDigits round down"); + +dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 2}); +assert.sameValue(dtf.format(d1), "02:03.23", "2 fractionalSecondDigits round down"); +assert.sameValue(dtf.format(d2), "02:03.56", "2 fractionalSecondDigits round down"); + +dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 3}); +assert.sameValue(dtf.format(d1), "02:03.234", "3 fractionalSecondDigits round down"); +assert.sameValue(dtf.format(d2), "02:03.567", "3 fractionalSecondDigits round down"); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js index 8860e29ed17b..05596255cd71 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-date-string.js @@ -1,11 +1,12 @@ -// Copyright (C) 2017-2019 André Bargull, Igalia S.L. All rights reserved. +// Copyright (C) 2017 André Bargull. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-partitiondatetimerangepattern -description: | +description: > The Date constructor is not called to convert the input value. -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 5. Let x be ? ToNumber(startDate). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js index fab475c083d0..257c5ba0184f 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-near-time-boundaries.js @@ -1,11 +1,12 @@ -// Copyright (C) 2017-2019 André Bargull, Igalia S.L. All rights reserved. +// Copyright (C) 2017 André Bargull. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-partitiondatetimerangepattern -description: | +description: > TimeClip is applied when calling Intl.DateTimeFormat.prototype.formatRange. -info: > +info: | PartitionDateTimeRangePattern ( dateTimeFormat, x, y ) 1. Let x be TimeClip(x). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js index 931e160f0a69..93e1a28af1a6 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/argument-to-integer.js @@ -1,11 +1,12 @@ -// Copyright (C) 2017-2019 André Bargull, Igalia S.L. All rights reserved. +// Copyright (C) 2017 André Bargull. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-partitiondatetimerangepattern -description: | +description: > TimeClip applies ToInteger on its input value. -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 5. Let x be ? ToNumber(startDate). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/builtin.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/builtin.js index 7a378af8c550..7883d0d7af90 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/builtin.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/builtin.js @@ -1,4 +1,5 @@ -// Copyright (C) 2012-2019 Mozilla Corporation, Igalia S.L. All rights reserved. +// Copyright 2012 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-infinity-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-infinity-throws.js index 18671ab0cd7f..13c355e37fd4 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-infinity-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-infinity-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if date arg is cast to an Infinity value -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-nan-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-nan-throws.js index 4055adce3d96..9a91f375f031 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-nan-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-is-nan-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if date arg is cast to NaN -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-undefined-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-undefined-throws.js index e00c6aa66e61..c7c453f23d80 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-undefined-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-undefined-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if startDate or endDate is undefined. -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-x-greater-than-y-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-x-greater-than-y-throws.js index b3e842fbaf0a..587c967a3ec0 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-x-greater-than-y-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/date-x-greater-than-y-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if date x is greater than y. -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/en-US.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/en-US.js index 4d9c1ca1e5e3..a5560417cd2c 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/en-US.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/en-US.js @@ -4,7 +4,7 @@ /*--- esid: sec-partitiondatetimerangepattern description: Basic tests for the en-US output of formatRange() -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 8. Return ? FormatDateTimeRange(dtf, x, y). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js index c0130ef0c1ed..f37e3df0f3fa 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/prop-desc.js @@ -1,4 +1,5 @@ -// Copyright 2016-2019 Mozilla Corporation, Igalia S.L. All rights reserved. +// Copyright 2016 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/this-is-not-object-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/this-is-not-object-throws.js index 3ad96d84dcf2..af692c3207aa 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/this-is-not-object-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRange/this-is-not-object-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a TypeError if this is not Object. -info: > +info: | Intl.DateTimeFormat.prototype.formatRange ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js index daec70504819..1621c2649f11 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-date-string.js @@ -1,11 +1,12 @@ -// Copyright (C) 2017-2019 André Bargull, Igalia S.L. All rights reserved. +// Copyright (C) 2017 André Bargull. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-partitiondatetimerangepattern -description: | +description: > The Date constructor is not called to convert the input value. -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 5. Let x be ? ToNumber(startDate). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js index 2e33c406d179..c2e4f5627e65 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-near-time-boundaries.js @@ -1,11 +1,12 @@ -// Copyright (C) 2017-2019 André Bargull, Igalia S.L. All rights reserved. +// Copyright (C) 2017 André Bargull. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-partitiondatetimerangepattern -description: | +description: > TimeClip is applied when calling Intl.DateTimeFormat.prototype.formatRangeToParts. -info: > +info: | PartitionDateTimeRangePattern ( dateTimeFormat, x, y ) 1. Let x be TimeClip(x). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js index 2f64a83e3399..50854ca381b0 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/argument-to-integer.js @@ -1,11 +1,12 @@ -// Copyright (C) 2017-2019 André Bargull, Igalia S.L. All rights reserved. +// Copyright (C) 2017 André Bargull. All rights reserved. +// Copyright (C) 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-partitiondatetimerangepattern -description: | +description: > TimeClip applies ToInteger on its input value. -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 5. Let x be ? ToNumber(startDate). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js index c624b333cdc9..f20d96954117 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/builtin.js @@ -1,4 +1,5 @@ -// Copyright (C) 2012-2019 Mozilla Corporation, Igalia S.L. All rights reserved. +// Copyright 2012 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-infinity-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-infinity-throws.js index 4c4d5490c9e0..f5e436627a25 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-infinity-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-infinity-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if date arg is cast to an Infinity value -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-nan-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-nan-throws.js index ee38b8ff1360..4ac521d728de 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-nan-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-is-nan-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if date arg is cast to Nan -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-undefined-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-undefined-throws.js index b0c710858ddd..ec46ade73b03 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-undefined-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-undefined-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if startDate or endDate are undefined. -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-x-greater-than-y-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-x-greater-than-y-throws.js index d7cfa22568ad..11b47ee399c5 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-x-greater-than-y-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/date-x-greater-than-y-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a RangeError if date x is greater than y. -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/en-US.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/en-US.js index 569f4543bfa3..2a45d4ddfc82 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/en-US.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/en-US.js @@ -4,7 +4,7 @@ /*--- esid: sec-partitiondatetimerangepattern description: Basic tests for the en-US output of formatRangeToParts() -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 8. Return ? FormatDateTimeRange(dtf, x, y). diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js index 1f2622dc7591..436ac1ad96f4 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/prop-desc.js @@ -1,4 +1,5 @@ -// Copyright 2016-2019 Mozilla Corporation, Igalia S.L. All rights reserved. +// Copyright 2016 Mozilla Corporation. All rights reserved. +// Copyright 2019 Igalia S.L. All rights reserved. // This code is governed by the license found in the LICENSE file. /*--- diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/this-is-not-object-throws.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/this-is-not-object-throws.js index 694965e57c38..48260f44adb1 100644 --- a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/this-is-not-object-throws.js +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatRangeToParts/this-is-not-object-throws.js @@ -2,9 +2,9 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- -description: | +description: > Throws a TypeError if this is not Object. -info: > +info: | Intl.DateTimeFormat.prototype.formatRangeToParts ( startDate , endDate ) 1. Let dtf be this value. diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-long-en.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-long-en.js new file mode 100644 index 000000000000..3fe08f03e2f8 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-long-en.js @@ -0,0 +1,106 @@ +// Copyright 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of dayPeriod, long format. +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +const d0000 = new Date(2017, 11, 12, 0, 0, 0, 0); +const d0100 = new Date(2017, 11, 12, 1, 0, 0, 0); +const d0200 = new Date(2017, 11, 12, 2, 0, 0, 0); +const d0300 = new Date(2017, 11, 12, 3, 0, 0, 0); +const d0400 = new Date(2017, 11, 12, 4, 0, 0, 0); +const d0500 = new Date(2017, 11, 12, 5, 0, 0, 0); +const d0600 = new Date(2017, 11, 12, 6, 0, 0, 0); +const d0700 = new Date(2017, 11, 12, 7, 0, 0, 0); +const d0800 = new Date(2017, 11, 12, 8, 0, 0, 0); +const d0900 = new Date(2017, 11, 12, 9, 0, 0, 0); +const d1000 = new Date(2017, 11, 12, 10, 0, 0, 0); +const d1100 = new Date(2017, 11, 12, 11, 0, 0, 0); +const d1200 = new Date(2017, 11, 12, 12, 0, 0, 0); +const d1300 = new Date(2017, 11, 12, 13, 0, 0, 0); +const d1400 = new Date(2017, 11, 12, 14, 0, 0, 0); +const d1500 = new Date(2017, 11, 12, 15, 0, 0, 0); +const d1600 = new Date(2017, 11, 12, 16, 0, 0, 0); +const d1700 = new Date(2017, 11, 12, 17, 0, 0, 0); +const d1800 = new Date(2017, 11, 12, 18, 0, 0, 0); +const d1900 = new Date(2017, 11, 12, 19, 0, 0, 0); +const d2000 = new Date(2017, 11, 12, 20, 0, 0, 0); +const d2100 = new Date(2017, 11, 12, 21, 0, 0, 0); +const d2200 = new Date(2017, 11, 12, 22, 0, 0, 0); +const d2300 = new Date(2017, 11, 12, 23, 0, 0, 0); + +const long = new Intl.DateTimeFormat('en', { dayPeriod: 'long' }); + +function assertParts(parts, expected, message) { + assert.sameValue(parts.length, 1, `length should be 1, ${message}`); + assert.sameValue(parts[0].value, expected, `expected part value. ${message}`); + assert.sameValue(parts[0].type, 'dayPeriod', `part type is dayPeriod. ${message}`); +} + +assertParts(long.formatToParts(d0000), 'at night', '00:00, long format'); +assertParts(long.formatToParts(d0100), 'at night', '01:00, long format'); +assertParts(long.formatToParts(d0200), 'at night', '02:00, long format'); +assertParts(long.formatToParts(d0300), 'at night', '03:00, long format'); +assertParts(long.formatToParts(d0400), 'at night', '04:00, long format'); +assertParts(long.formatToParts(d0500), 'at night', '05:00, long format'); +assertParts(long.formatToParts(d0600), 'in the morning', '06:00, long format'); +assertParts(long.formatToParts(d0700), 'in the morning', '07:00, long format'); +assertParts(long.formatToParts(d0800), 'in the morning', '08:00, long format'); +assertParts(long.formatToParts(d0900), 'in the morning', '09:00, long format'); +assertParts(long.formatToParts(d1000), 'in the morning', '10:00, long format'); +assertParts(long.formatToParts(d1100), 'in the morning', '11:00, long format'); +assertParts(long.formatToParts(d1200), 'noon', '12:00, long format'); +assertParts(long.formatToParts(d1300), 'in the afternoon', '13:00, long format'); +assertParts(long.formatToParts(d1400), 'in the afternoon', '14:00, long format'); +assertParts(long.formatToParts(d1500), 'in the afternoon', '15:00, long format'); +assertParts(long.formatToParts(d1600), 'in the afternoon', '16:00, long format'); +assertParts(long.formatToParts(d1700), 'in the afternoon', '17:00, long format'); +assertParts(long.formatToParts(d1800), 'in the evening', '18:00, long format'); +assertParts(long.formatToParts(d1900), 'in the evening', '19:00, long format'); +assertParts(long.formatToParts(d2000), 'in the evening', '20:00, long format'); +assertParts(long.formatToParts(d2100), 'at night', '21:00, long format'); +assertParts(long.formatToParts(d2200), 'at night', '22:00, long format'); +assertParts(long.formatToParts(d2300), 'at night', '23:00, long format'); + +const longNumeric = new Intl.DateTimeFormat('en', { + dayPeriod: 'long', + hour: 'numeric' +}); + +function assertPartsNumeric(parts, hour, expected, message) { + assert.sameValue(parts.length, 3, `length should be 3, ${message}`); + assert.sameValue(parts[0].value, hour, `hour part value. ${message}`); + assert.sameValue(parts[0].type, 'hour', `hour part type. ${message}`); + assert.sameValue(parts[1].value, ' ', `literal part value. ${message}`); + assert.sameValue(parts[1].type, 'literal', `literal part type. ${message}`); + assert.sameValue(parts[2].value, expected, `expected part value. ${message}`); + assert.sameValue(parts[2].type, 'dayPeriod', `expected part type. ${message}`); +} + +assertPartsNumeric(longNumeric.formatToParts(d0000), '12', 'at night', '00:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0100), '1', 'at night', '01:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0200), '2', 'at night', '02:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0300), '3', 'at night', '03:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0400), '4', 'at night', '04:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0500), '5', 'at night', '05:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0600), '6', 'in the morning', '06:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0700), '7', 'in the morning', '07:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0800), '8', 'in the morning', '08:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d0900), '9', 'in the morning', '09:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1000), '10', 'in the morning', '10:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1100), '11', 'in the morning', '11:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1200), '12', 'noon', '12:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1300), '1', 'in the afternoon', '13:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1400), '2', 'in the afternoon', '14:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1500), '3', 'in the afternoon', '15:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1600), '4', 'in the afternoon', '16:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1700), '5', 'in the afternoon', '17:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1800), '6', 'in the evening', '18:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d1900), '7', 'in the evening', '19:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d2000), '8', 'in the evening', '20:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d2100), '9', 'at night', '21:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d2200), '10', 'at night', '22:00, long-numeric'); +assertPartsNumeric(longNumeric.formatToParts(d2300), '11', 'at night', '23:00, long-numeric'); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-narrow-en.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-narrow-en.js new file mode 100644 index 000000000000..605e8e2d1225 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-narrow-en.js @@ -0,0 +1,106 @@ +// Copyright 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of dayPeriod, narrow format. +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +const d0000 = new Date(2017, 11, 12, 0, 0, 0, 0); +const d0100 = new Date(2017, 11, 12, 1, 0, 0, 0); +const d0200 = new Date(2017, 11, 12, 2, 0, 0, 0); +const d0300 = new Date(2017, 11, 12, 3, 0, 0, 0); +const d0400 = new Date(2017, 11, 12, 4, 0, 0, 0); +const d0500 = new Date(2017, 11, 12, 5, 0, 0, 0); +const d0600 = new Date(2017, 11, 12, 6, 0, 0, 0); +const d0700 = new Date(2017, 11, 12, 7, 0, 0, 0); +const d0800 = new Date(2017, 11, 12, 8, 0, 0, 0); +const d0900 = new Date(2017, 11, 12, 9, 0, 0, 0); +const d1000 = new Date(2017, 11, 12, 10, 0, 0, 0); +const d1100 = new Date(2017, 11, 12, 11, 0, 0, 0); +const d1200 = new Date(2017, 11, 12, 12, 0, 0, 0); +const d1300 = new Date(2017, 11, 12, 13, 0, 0, 0); +const d1400 = new Date(2017, 11, 12, 14, 0, 0, 0); +const d1500 = new Date(2017, 11, 12, 15, 0, 0, 0); +const d1600 = new Date(2017, 11, 12, 16, 0, 0, 0); +const d1700 = new Date(2017, 11, 12, 17, 0, 0, 0); +const d1800 = new Date(2017, 11, 12, 18, 0, 0, 0); +const d1900 = new Date(2017, 11, 12, 19, 0, 0, 0); +const d2000 = new Date(2017, 11, 12, 20, 0, 0, 0); +const d2100 = new Date(2017, 11, 12, 21, 0, 0, 0); +const d2200 = new Date(2017, 11, 12, 22, 0, 0, 0); +const d2300 = new Date(2017, 11, 12, 23, 0, 0, 0); + +const narrow = new Intl.DateTimeFormat('en', { dayPeriod: 'narrow' }); + +function assertParts(parts, expected, message) { + assert.sameValue(parts.length, 1, `length should be 1, ${message}`); + assert.sameValue(parts[0].value, expected, `expected part value. ${message}`); + assert.sameValue(parts[0].type, 'dayPeriod', `part type is dayPeriod. ${message}`); +} + +assertParts(narrow.formatToParts(d0000), 'at night', '00:00, narrow format'); +assertParts(narrow.formatToParts(d0100), 'at night', '01:00, narrow format'); +assertParts(narrow.formatToParts(d0200), 'at night', '02:00, narrow format'); +assertParts(narrow.formatToParts(d0300), 'at night', '03:00, narrow format'); +assertParts(narrow.formatToParts(d0400), 'at night', '04:00, narrow format'); +assertParts(narrow.formatToParts(d0500), 'at night', '05:00, narrow format'); +assertParts(narrow.formatToParts(d0600), 'in the morning', '06:00, narrow format'); +assertParts(narrow.formatToParts(d0700), 'in the morning', '07:00, narrow format'); +assertParts(narrow.formatToParts(d0800), 'in the morning', '08:00, narrow format'); +assertParts(narrow.formatToParts(d0900), 'in the morning', '09:00, narrow format'); +assertParts(narrow.formatToParts(d1000), 'in the morning', '10:00, narrow format'); +assertParts(narrow.formatToParts(d1100), 'in the morning', '11:00, narrow format'); +assertParts(narrow.formatToParts(d1200), 'n', '12:00, narrow format'); +assertParts(narrow.formatToParts(d1300), 'in the afternoon', '13:00, narrow format'); +assertParts(narrow.formatToParts(d1400), 'in the afternoon', '14:00, narrow format'); +assertParts(narrow.formatToParts(d1500), 'in the afternoon', '15:00, narrow format'); +assertParts(narrow.formatToParts(d1600), 'in the afternoon', '16:00, narrow format'); +assertParts(narrow.formatToParts(d1700), 'in the afternoon', '17:00, narrow format'); +assertParts(narrow.formatToParts(d1800), 'in the evening', '18:00, narrow format'); +assertParts(narrow.formatToParts(d1900), 'in the evening', '19:00, narrow format'); +assertParts(narrow.formatToParts(d2000), 'in the evening', '20:00, narrow format'); +assertParts(narrow.formatToParts(d2100), 'at night', '21:00, narrow format'); +assertParts(narrow.formatToParts(d2200), 'at night', '22:00, narrow format'); +assertParts(narrow.formatToParts(d2300), 'at night', '23:00, narrow format'); + +const narrowNumeric = new Intl.DateTimeFormat('en', { + dayPeriod: 'narrow', + hour: 'numeric' +}); + +function assertPartsNumeric(parts, hour, expected, message) { + assert.sameValue(parts.length, 3, `length should be 3, ${message}`); + assert.sameValue(parts[0].value, hour, `hour part value. ${message}`); + assert.sameValue(parts[0].type, 'hour', `hour part type. ${message}`); + assert.sameValue(parts[1].value, ' ', `literal part value. ${message}`); + assert.sameValue(parts[1].type, 'literal', `literal part type. ${message}`); + assert.sameValue(parts[2].value, expected, `expected part value. ${message}`); + assert.sameValue(parts[2].type, 'dayPeriod', `expected part type. ${message}`); +} + +assertPartsNumeric(narrowNumeric.formatToParts(d0000), '12', 'at night', '00:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0100), '1', 'at night', '01:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0200), '2', 'at night', '02:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0300), '3', 'at night', '03:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0400), '4', 'at night', '04:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0500), '5', 'at night', '05:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0600), '6', 'in the morning', '06:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0700), '7', 'in the morning', '07:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0800), '8', 'in the morning', '08:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d0900), '9', 'in the morning', '09:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1000), '10', 'in the morning', '10:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1100), '11', 'in the morning', '11:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1200), '12', 'n', '12:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1300), '1', 'in the afternoon', '13:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1400), '2', 'in the afternoon', '14:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1500), '3', 'in the afternoon', '15:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1600), '4', 'in the afternoon', '16:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1700), '5', 'in the afternoon', '17:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1800), '6', 'in the evening', '18:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d1900), '7', 'in the evening', '19:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d2000), '8', 'in the evening', '20:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d2100), '9', 'at night', '21:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d2200), '10', 'at night', '22:00, narrow-numeric'); +assertPartsNumeric(narrowNumeric.formatToParts(d2300), '11', 'at night', '23:00, narrow-numeric'); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-short-en.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-short-en.js new file mode 100644 index 000000000000..6c11833a0b1f --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/dayPeriod-short-en.js @@ -0,0 +1,106 @@ +// Copyright 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of dayPeriod, short format. +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +const d0000 = new Date(2017, 11, 12, 0, 0, 0, 0); +const d0100 = new Date(2017, 11, 12, 1, 0, 0, 0); +const d0200 = new Date(2017, 11, 12, 2, 0, 0, 0); +const d0300 = new Date(2017, 11, 12, 3, 0, 0, 0); +const d0400 = new Date(2017, 11, 12, 4, 0, 0, 0); +const d0500 = new Date(2017, 11, 12, 5, 0, 0, 0); +const d0600 = new Date(2017, 11, 12, 6, 0, 0, 0); +const d0700 = new Date(2017, 11, 12, 7, 0, 0, 0); +const d0800 = new Date(2017, 11, 12, 8, 0, 0, 0); +const d0900 = new Date(2017, 11, 12, 9, 0, 0, 0); +const d1000 = new Date(2017, 11, 12, 10, 0, 0, 0); +const d1100 = new Date(2017, 11, 12, 11, 0, 0, 0); +const d1200 = new Date(2017, 11, 12, 12, 0, 0, 0); +const d1300 = new Date(2017, 11, 12, 13, 0, 0, 0); +const d1400 = new Date(2017, 11, 12, 14, 0, 0, 0); +const d1500 = new Date(2017, 11, 12, 15, 0, 0, 0); +const d1600 = new Date(2017, 11, 12, 16, 0, 0, 0); +const d1700 = new Date(2017, 11, 12, 17, 0, 0, 0); +const d1800 = new Date(2017, 11, 12, 18, 0, 0, 0); +const d1900 = new Date(2017, 11, 12, 19, 0, 0, 0); +const d2000 = new Date(2017, 11, 12, 20, 0, 0, 0); +const d2100 = new Date(2017, 11, 12, 21, 0, 0, 0); +const d2200 = new Date(2017, 11, 12, 22, 0, 0, 0); +const d2300 = new Date(2017, 11, 12, 23, 0, 0, 0); + +const short = new Intl.DateTimeFormat('en', { dayPeriod: 'short' }); + +function assertParts(parts, expected, message) { + assert.sameValue(parts.length, 1, `length should be 1, ${message}`); + assert.sameValue(parts[0].value, expected, `expected part value. ${message}`); + assert.sameValue(parts[0].type, 'dayPeriod', `part type is dayPeriod. ${message}`); +} + +assertParts(short.formatToParts(d0000), 'at night', '00:00, short format'); +assertParts(short.formatToParts(d0100), 'at night', '01:00, short format'); +assertParts(short.formatToParts(d0200), 'at night', '02:00, short format'); +assertParts(short.formatToParts(d0300), 'at night', '03:00, short format'); +assertParts(short.formatToParts(d0400), 'at night', '04:00, short format'); +assertParts(short.formatToParts(d0500), 'at night', '05:00, short format'); +assertParts(short.formatToParts(d0600), 'in the morning', '06:00, short format'); +assertParts(short.formatToParts(d0700), 'in the morning', '07:00, short format'); +assertParts(short.formatToParts(d0800), 'in the morning', '08:00, short format'); +assertParts(short.formatToParts(d0900), 'in the morning', '09:00, short format'); +assertParts(short.formatToParts(d1000), 'in the morning', '10:00, short format'); +assertParts(short.formatToParts(d1100), 'in the morning', '11:00, short format'); +assertParts(short.formatToParts(d1200), 'noon', '12:00, short format'); +assertParts(short.formatToParts(d1300), 'in the afternoon', '13:00, short format'); +assertParts(short.formatToParts(d1400), 'in the afternoon', '14:00, short format'); +assertParts(short.formatToParts(d1500), 'in the afternoon', '15:00, short format'); +assertParts(short.formatToParts(d1600), 'in the afternoon', '16:00, short format'); +assertParts(short.formatToParts(d1700), 'in the afternoon', '17:00, short format'); +assertParts(short.formatToParts(d1800), 'in the evening', '18:00, short format'); +assertParts(short.formatToParts(d1900), 'in the evening', '19:00, short format'); +assertParts(short.formatToParts(d2000), 'in the evening', '20:00, short format'); +assertParts(short.formatToParts(d2100), 'at night', '21:00, short format'); +assertParts(short.formatToParts(d2200), 'at night', '22:00, short format'); +assertParts(short.formatToParts(d2300), 'at night', '23:00, short format'); + +const shortNumeric = new Intl.DateTimeFormat('en', { + dayPeriod: 'short', + hour: 'numeric' +}); + +function assertPartsNumeric(parts, hour, expected, message) { + assert.sameValue(parts.length, 3, `length should be 3, ${message}`); + assert.sameValue(parts[0].value, hour, `hour part value. ${message}`); + assert.sameValue(parts[0].type, 'hour', `hour part type. ${message}`); + assert.sameValue(parts[1].value, ' ', `literal part value. ${message}`); + assert.sameValue(parts[1].type, 'literal', `literal part type. ${message}`); + assert.sameValue(parts[2].value, expected, `expected part value. ${message}`); + assert.sameValue(parts[2].type, 'dayPeriod', `expected part type. ${message}`); +} + +assertPartsNumeric(shortNumeric.formatToParts(d0000), '12', 'at night', '00:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0100), '1', 'at night', '01:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0200), '2', 'at night', '02:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0300), '3', 'at night', '03:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0400), '4', 'at night', '04:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0500), '5', 'at night', '05:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0600), '6', 'in the morning', '06:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0700), '7', 'in the morning', '07:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0800), '8', 'in the morning', '08:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d0900), '9', 'in the morning', '09:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1000), '10', 'in the morning', '10:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1100), '11', 'in the morning', '11:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1200), '12', 'noon', '12:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1300), '1', 'in the afternoon', '13:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1400), '2', 'in the afternoon', '14:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1500), '3', 'in the afternoon', '15:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1600), '4', 'in the afternoon', '16:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1700), '5', 'in the afternoon', '17:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1800), '6', 'in the evening', '18:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d1900), '7', 'in the evening', '19:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d2000), '8', 'in the evening', '20:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d2100), '9', 'at night', '21:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d2200), '10', 'at night', '22:00, short-numeric'); +assertPartsNumeric(shortNumeric.formatToParts(d2300), '11', 'at night', '23:00, short-numeric'); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/fractionalSecondDigits.js new file mode 100644 index 000000000000..854ee4aba161 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/formatToParts/fractionalSecondDigits.js @@ -0,0 +1,52 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: Checks basic handling of fractionalSecondDigits. +features: [Intl.DateTimeFormat-fractionalSecondDigits] +locale: [en-US] +---*/ + +const d1 = new Date(2019, 7, 10, 1, 2, 3, 234); +const d2 = new Date(2019, 7, 10, 1, 2, 3, 567); + +function assertParts(parts, minute, second, fractionalSecond, message) { + if (fractionalSecond === null) { + assert.sameValue(parts.length, 3, `length should be 3, ${message}`); + } else { + assert.sameValue(parts.length, 5, `length should be 5, ${message}`); + } + assert.sameValue(parts[0].value, minute, `minute part value. ${message}`); + assert.sameValue(parts[0].type, 'minute', `minute part type. ${message}`); + assert.sameValue(parts[1].value, ':', `literal part value. ${message}`); + assert.sameValue(parts[1].type, 'literal', `literal part type. ${message}`); + assert.sameValue(parts[2].value, second, `second part value. ${message}`); + assert.sameValue(parts[2].type, 'second', `second part type. ${message}`); + if (fractionalSecond !== null) { + assert.sameValue(parts[3].value, '.', `literal part value. ${message}`); + assert.sameValue(parts[3].type, 'literal', `literal part type. ${message}`); + assert.sameValue(parts[4].value, fractionalSecond, `fractionalSecond part value. ${message}`); + assert.sameValue(parts[4].type, 'fractionalSecond', `fractionalSecond part type. ${message}`); + } +} + +let dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 0}); +assertParts(dtf.formatToParts(d1), "02", "03", null, "no fractionalSecondDigits round down"); +assertParts(dtf.formatToParts(d2), "02", "03", null, "no fractionalSecondDigits round down"); + +dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 1}); +assertParts(dtf.formatToParts(d1), "02", "03", "2", "1 fractionalSecondDigits round down"); +assertParts(dtf.formatToParts(d2), "02", "03", "5", "1 fractionalSecondDigits round down"); + +dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 2}); +assertParts(dtf.formatToParts(d1), "02", "03", "23", "2 fractionalSecondDigits round down"); +assertParts(dtf.formatToParts(d2), "02", "03", "56", "2 fractionalSecondDigits round down"); + +dtf = new Intl.DateTimeFormat( + 'en', { minute: "numeric", second: "numeric", fractionalSecondDigits: 3}); +assertParts(dtf.formatToParts(d1), "02", "03", "234", "3 fractionalSecondDigits round down"); +assertParts(dtf.formatToParts(d2), "02", "03", "567", "3 fractionalSecondDigits round down"); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-dayPeriod.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-dayPeriod.js new file mode 100644 index 000000000000..a6fdd246fb42 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-dayPeriod.js @@ -0,0 +1,29 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-intl.datetimeformat.prototype.resolvedoptions +description: Verifies the property order for the object returned by resolvedOptions(). +includes: [compareArray.js] +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +const options = new Intl.DateTimeFormat([], { + "dayPeriod": "short", + "hour": "numeric", + "minute": "numeric", +}).resolvedOptions(); + +const expected = [ + "locale", + "calendar", + "numberingSystem", + "timeZone", + "hourCycle", + "hour12", + "dayPeriod", + "hour", + "minute", +]; + +assert.compareArray(Object.getOwnPropertyNames(options), expected); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-fractionalSecondDigits.js new file mode 100644 index 000000000000..c6b41fd5d100 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/prototype/resolvedOptions/order-fractionalSecondDigits.js @@ -0,0 +1,27 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-intl.datetimeformat.prototype.resolvedoptions +description: Verifies the property order for the object returned by resolvedOptions(). +includes: [compareArray.js] +features: [Intl.DateTimeFormat-fractionalSecondDigits] +---*/ + +const options = new Intl.DateTimeFormat([], { + "fractionalSecondDigits": 3, + "minute": "numeric", + "second": "numeric", +}).resolvedOptions(); + +const expected = [ + "locale", + "calendar", + "numberingSystem", + "timeZone", + "minute", + "second", + "fractionalSecondDigits", +]; + +assert.compareArray(Object.getOwnPropertyNames(options), expected); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/taint-Object-prototype-dayPeriod.js b/JSTests/test262/test/intl402/DateTimeFormat/taint-Object-prototype-dayPeriod.js new file mode 100644 index 000000000000..27daf00864a0 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/taint-Object-prototype-dayPeriod.js @@ -0,0 +1,16 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: > + Tests that the behavior of a Record is not affected by + adversarial changes to Object.prototype. +includes: [testIntl.js] +features: [Intl.DateTimeFormat-dayPeriod] +---*/ + +taintProperties(["dayPeriod"]); + +var locale = new Intl.DateTimeFormat(undefined, {localeMatcher: "lookup"}).resolvedOptions().locale; +assert(isCanonicalizedStructurallyValidLanguageTag(locale), "DateTimeFormat returns invalid locale " + locale + "."); diff --git a/JSTests/test262/test/intl402/DateTimeFormat/taint-Object-prototype-fractionalSecondDigits.js b/JSTests/test262/test/intl402/DateTimeFormat/taint-Object-prototype-fractionalSecondDigits.js new file mode 100644 index 000000000000..6b59bce73937 --- /dev/null +++ b/JSTests/test262/test/intl402/DateTimeFormat/taint-Object-prototype-fractionalSecondDigits.js @@ -0,0 +1,16 @@ +// Copyright 2019 Google Inc. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializedatetimeformat +description: > + Tests that the behavior of a Record is not affected by + adversarial changes to Object.prototype. +includes: [testIntl.js] +features: [Intl.DateTimeFormat-fractionalSecondDigits] +---*/ + +taintProperties(["fractionalSecondDigits"]); + +var locale = new Intl.DateTimeFormat(undefined, {localeMatcher: "lookup"}).resolvedOptions().locale; +assert(isCanonicalizedStructurallyValidLanguageTag(locale), "DateTimeFormat returns invalid locale " + locale + "."); diff --git a/JSTests/test262/test/intl402/NumberFormat/numbering-system-options.js b/JSTests/test262/test/intl402/NumberFormat/numbering-system-options.js new file mode 100644 index 000000000000..40af32deed50 --- /dev/null +++ b/JSTests/test262/test/intl402/NumberFormat/numbering-system-options.js @@ -0,0 +1,63 @@ +// Copyright 2012 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializenumberformat +description: > + Tests that the options numberingSystem and calendar can be set through + either the locale or the options. +author: Norbert Lindenberg, Daniel Ehrenberg +includes: [testIntl.js] +---*/ + +let defaultLocale = new Intl.NumberFormat().resolvedOptions().locale; + +let supportedNumberingSystems = ["latn", "arab"].filter(nu => + new Intl.NumberFormat(defaultLocale + "-u-nu-" + nu) + .resolvedOptions().numberingSystem === nu +); + +let options = [ + {key: "nu", property: "numberingSystem", type: "string", values: supportedNumberingSystems}, +]; + +options.forEach(function (option) { + let numberFormat, opt, result; + + // find out which values are supported for a property in the default locale + let supportedValues = []; + option.values.forEach(function (value) { + opt = {}; + opt[option.property] = value; + numberFormat = new Intl.NumberFormat([defaultLocale], opt); + result = numberFormat.resolvedOptions()[option.property]; + if (result !== undefined && supportedValues.indexOf(result) === -1) { + supportedValues.push(result); + } + }); + + // verify that the supported values can also be set through the locale + supportedValues.forEach(function (value) { + numberFormat = new Intl.NumberFormat([defaultLocale + "-u-" + option.key + "-" + value]); + result = numberFormat.resolvedOptions()[option.property]; + assert.sameValue(result, value, "Property " + option.property + " couldn't be set through locale extension key " + option.key + "."); + }); + + // verify that the options setting overrides the locale setting + supportedValues.forEach(function (value) { + let otherValue; + option.values.forEach(function (possibleValue) { + if (possibleValue !== value) { + otherValue = possibleValue; + } + }); + if (otherValue !== undefined) { + opt = {}; + opt[option.property] = value; + numberFormat = new Intl.NumberFormat([defaultLocale + "-u-" + option.key + "-" + otherValue], opt); + result = numberFormat.resolvedOptions()[option.property]; + assert.sameValue(result, value, "Options value for property " + option.property + " doesn't override locale extension key " + option.key + "."); + } + }); +}); + diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/resolvedOptions/order.js b/JSTests/test262/test/intl402/NumberFormat/prototype/resolvedOptions/order.js index 7e0e325e56b4..c6eb5ab2c29e 100644 --- a/JSTests/test262/test/intl402/NumberFormat/prototype/resolvedOptions/order.js +++ b/JSTests/test262/test/intl402/NumberFormat/prototype/resolvedOptions/order.js @@ -22,8 +22,6 @@ const expected = [ "currency", "currencyDisplay", "minimumIntegerDigits", - "minimumFractionDigits", - "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits", "useGrouping", diff --git a/JSTests/test262/test/intl402/NumberFormat/style-unit.js b/JSTests/test262/test/intl402/NumberFormat/style-unit.js index d50d55b1bdb6..7eae448c506f 100644 --- a/JSTests/test262/test/intl402/NumberFormat/style-unit.js +++ b/JSTests/test262/test/intl402/NumberFormat/style-unit.js @@ -20,7 +20,7 @@ const validOptions = [ ]; for (const [validOption, expected] of validOptions) { - const nf = new Intl.NumberFormat([], {"style": validOption, "unit": "generic"}); + const nf = new Intl.NumberFormat([], {"style": validOption, "unit": "gigabit"}); const resolvedOptions = nf.resolvedOptions(); assert.sameValue(resolvedOptions.style, expected); } diff --git a/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js b/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js index 19a4b8aea728..7402150d7aee 100644 --- a/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js +++ b/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js @@ -50,6 +50,16 @@ const exceptions = { "0": "today", "1": "tomorrow", }, + "hour": { + "-1": "1 hour ago", + '0': 'this hour', + "1": "in 1 hour", + }, + "minute": { + "-1": "1 minute ago", + '0': 'this minute', + "1": "in 1 minute", + }, "second": { "-1": "1 second ago", "0": "now", diff --git a/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-numeric-auto.js b/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-numeric-auto.js index 00f319bb8631..bb6fb347b325 100644 --- a/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-numeric-auto.js +++ b/JSTests/test262/test/intl402/RelativeTimeFormat/prototype/formatToParts/en-us-numeric-auto.js @@ -46,6 +46,12 @@ function expected(key, unit, default_) { "0": "today", "1": "tomorrow", }, + "hour": { + "0": "this hour", + }, + "minute": { + "0": "this minute", + }, "second": { "0": "now", }, diff --git a/JSTests/test262/test/language/asi/S7.9_A5.7_T1.js b/JSTests/test262/test/language/asi/S7.9_A5.7_T1.js index 45e52b9527ad..7d774126883a 100644 --- a/JSTests/test262/test/language/asi/S7.9_A5.7_T1.js +++ b/JSTests/test262/test/language/asi/S7.9_A5.7_T1.js @@ -7,13 +7,12 @@ info: | Operator(I/DO) and operand is not allowed, two IO(just as two DO and their combination) between two references separated by [LT] after automatic semicolon insertion lead to syntax error - ES6 specifies this as `ReferenceError` es5id: 7.9_A5.7_T1 description: Try use Variable1 \n ++ \n ++ \n Variable2 construction negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js b/JSTests/test262/test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js index 14daf5814a4f..1a581a09e9c8 100644 --- a/JSTests/test262/test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js +++ b/JSTests/test262/test/language/expressions/arrow-function/ArrowFunction_restricted-properties.js @@ -1,7 +1,7 @@ // Copyright (C) 2015 Caitlin Potter. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. -/*--- +/*--- description: > Functions created using ArrowFunction syntactic form do not have own properties "caller" or "arguments", but inherit them from diff --git a/JSTests/test262/test/language/expressions/assignment/non-simple-target.js b/JSTests/test262/test/language/expressions/assignment/non-simple-target.js index 15ff25709743..a0da0c613a3f 100644 --- a/JSTests/test262/test/language/expressions/assignment/non-simple-target.js +++ b/JSTests/test262/test/language/expressions/assignment/non-simple-target.js @@ -2,15 +2,15 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/assignment/target-boolean.js b/JSTests/test262/test/language/expressions/assignment/target-boolean.js index aeff77631bee..c39c7b71c860 100644 --- a/JSTests/test262/test/language/expressions/assignment/target-boolean.js +++ b/JSTests/test262/test/language/expressions/assignment/target-boolean.js @@ -3,19 +3,18 @@ /*--- esid: sec-assignment-operators-static-semantics-early-errors -es5id: 11.13.1-1-3 description: > - simple assignment throws ReferenceError if LeftHandSide is not a + simple assignment throws SyntaxError if LeftHandSide is not a reference (boolean) info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/assignment/target-cover-newtarget.js b/JSTests/test262/test/language/expressions/assignment/target-cover-newtarget.js index fbf00915a770..124acd3090a5 100644 --- a/JSTests/test262/test/language/expressions/assignment/target-cover-newtarget.js +++ b/JSTests/test262/test/language/expressions/assignment/target-cover-newtarget.js @@ -2,25 +2,24 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-assignment-operators-static-semantics-early-errors -es6id: 12.14.1 description: Applied to a "covered" new.target info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/assignment/target-cover-yieldexpr.js b/JSTests/test262/test/language/expressions/assignment/target-cover-yieldexpr.js index 6776026aca58..8e96d4ed01f6 100644 --- a/JSTests/test262/test/language/expressions/assignment/target-cover-yieldexpr.js +++ b/JSTests/test262/test/language/expressions/assignment/target-cover-yieldexpr.js @@ -2,28 +2,28 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-assignment-operators-static-semantics-early-errors -es6id: 12.14.1 description: Applied to a "covered" YieldExpression info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. 12.15.3 Static Semantics: IsValidSimpleAssignmentTarget AssignmentExpression: YieldExpression ArrowFunction + AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression - 1. Return false. + 1. Return invalid. features: [generators] negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/assignment/target-newtarget.js b/JSTests/test262/test/language/expressions/assignment/target-newtarget.js index 30deed8c799e..a50a04a45e02 100644 --- a/JSTests/test262/test/language/expressions/assignment/target-newtarget.js +++ b/JSTests/test262/test/language/expressions/assignment/target-newtarget.js @@ -2,25 +2,24 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-assignment-operators-static-semantics-early-errors -es6id: 12.14.1 description: Applied to new.target info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/assignment/target-null.js b/JSTests/test262/test/language/expressions/assignment/target-null.js index 572b38aba332..5adbb4ce41e5 100644 --- a/JSTests/test262/test/language/expressions/assignment/target-null.js +++ b/JSTests/test262/test/language/expressions/assignment/target-null.js @@ -3,19 +3,18 @@ /*--- esid: sec-assignment-operators-static-semantics-early-errors -es5id: 11.13.1-1-4 description: > - simple assignment throws ReferenceError if LeftHandSide is not a + simple assignment throws SyntaxError if LeftHandSide is not a reference (null) info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/assignment/target-number.js b/JSTests/test262/test/language/expressions/assignment/target-number.js index 3ee507bef958..326043282e5f 100644 --- a/JSTests/test262/test/language/expressions/assignment/target-number.js +++ b/JSTests/test262/test/language/expressions/assignment/target-number.js @@ -3,19 +3,18 @@ /*--- esid: sec-assignment-operators-static-semantics-early-errors -es5id: 11.13.1-1-1 description: > - simple assignment throws ReferenceError if LeftHandSide is not a + simple assignment throws SyntaxError if LeftHandSide is not a reference (number) info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/assignment/target-string.js b/JSTests/test262/test/language/expressions/assignment/target-string.js index 9467f3601107..cd277c903265 100644 --- a/JSTests/test262/test/language/expressions/assignment/target-string.js +++ b/JSTests/test262/test/language/expressions/assignment/target-string.js @@ -3,19 +3,18 @@ /*--- esid: sec-assignment-operators-static-semantics-early-errors -es5id: 11.13.1-1-2 description: > - simple assignment throws ReferenceError if LeftHandSide is not a + simple assignment throws SyntaxError if LeftHandSide is not a reference (string) info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - It is an early Reference Error if LeftHandSideExpression is neither an - ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + It is an early Syntax Error if LeftHandSideExpression is neither an + ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of + LeftHandSideExpression is invalid or strict. negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/async-function/early-errors-expression-not-simple-assignment-target.js b/JSTests/test262/test/language/expressions/async-function/early-errors-expression-not-simple-assignment-target.js index f5127c3181e1..8718c4f3653b 100644 --- a/JSTests/test262/test/language/expressions/async-function/early-errors-expression-not-simple-assignment-target.js +++ b/JSTests/test262/test/language/expressions/async-function/early-errors-expression-not-simple-assignment-target.js @@ -8,7 +8,7 @@ description: > Async function expressions are not a simple assignment target. negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/async-generator/early-errors-expression-not-simple-assignment-target.js b/JSTests/test262/test/language/expressions/async-generator/early-errors-expression-not-simple-assignment-target.js index 1e9b3563dc7d..46c597ca5230 100644 --- a/JSTests/test262/test/language/expressions/async-generator/early-errors-expression-not-simple-assignment-target.js +++ b/JSTests/test262/test/language/expressions/async-generator/early-errors-expression-not-simple-assignment-target.js @@ -8,7 +8,7 @@ description: > Async generator function expressions are not a simple assignment target. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [async-iteration] ---*/ diff --git a/JSTests/test262/test/language/expressions/await/early-errors-await-not-simple-assignment-target.js b/JSTests/test262/test/language/expressions/await/early-errors-await-not-simple-assignment-target.js index 7a6545e51c66..2be96cb82fbb 100644 --- a/JSTests/test262/test/language/expressions/await/early-errors-await-not-simple-assignment-target.js +++ b/JSTests/test262/test/language/expressions/await/early-errors-await-not-simple-assignment-target.js @@ -8,7 +8,7 @@ description: > await is not a simple assignment target and cannot be assigned to. negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..d5a2baac2072 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-contains-superproperty-1.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-expr-fields-eval.template +/*--- +description: super.x in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + x = eval('executed = true; super.x;'); +}; + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..8db334e9a548 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-contains-superproperty-2.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-expr-fields-eval.template +/*--- +description: super['x'] in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + x = eval('executed = true; super["x"];'); +}; + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-1.js deleted file mode 100644 index 2d92ec033332..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,34 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-expr-fields-eval.template -/*--- -description: error if `super.x` in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - x = eval('executed = true; super.x;'); -}; - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-2.js deleted file mode 100644 index b78898025d3d..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,31 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-expr-fields-eval.template -/*--- -description: error if super['x'] in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - x = eval('executed = true; super["x"];'); -}; - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..844be8428bb1 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-contains-superproperty-1.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-expr-fields-indirect-eval.template +/*--- +description: super.x in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + x = (0, eval)('executed = true; super.x;'); +}; + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..48a751c2e8f1 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-contains-superproperty-2.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-expr-fields-indirect-eval.template +/*--- +description: super['x'] in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + x = (0, eval)('executed = true; super["x"];'); +}; + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-superproperty-1.js deleted file mode 100644 index 2506a1191bc6..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,36 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-expr-fields-indirect-eval.template -/*--- -description: error if `super.x` in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - x = (0, eval)('executed = true; super.x;'); -}; - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-superproperty-2.js deleted file mode 100644 index 0223c89b658b..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,33 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-expr-fields-indirect-eval.template -/*--- -description: error if super['x'] in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - x = (0, eval)('executed = true; super["x"];'); -}; - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js index 0caf54ce0f09..eaf0fc386174 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - ZWJ (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js index 3cb13eb9e220..4f3bbbb2ace3 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - ZWNJ (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js index b6dbc38e5429..ed9cecf0c8ff 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - u2118 (℘) (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js index e68e12b09968..c197c5207d6c 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - u6F (o) (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWJ.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWJ.js index 6e651ae7fdc8..459d5b2a1150 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWJ.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - ZWJ (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWNJ.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWNJ.js index 85825b7eaead..77c196089ba5 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWNJ.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-ZWNJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - ZWNJ (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-common.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-common.js index daa40edc0ed4..914d5e89d5f6 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-common.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-common.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - common (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-dollar.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-dollar.js index 9e584dcd4beb..42ab00433b5e 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-dollar.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-dollar.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - $ (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-u2118.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-u2118.js index 0ba94d5a9013..5f1f88d15968 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-u2118.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-u2118.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - ℘ (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-underscore.js b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-underscore.js index 7ac50fcd4fdd..ef28aea8b6bb 100644 --- a/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-underscore.js +++ b/JSTests/test262/test/language/expressions/class/elements/private-accessor-name/static-private-name-underscore.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-expr-static.template /*--- description: Private IdentifierName - _ (Class expression, static private method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..ff537c6a0133 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-contains-superproperty-1.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-eval.template +/*--- +description: super.x in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + #x = eval('executed = true; super.x;'); +}; + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..afa77387a76d --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-contains-superproperty-2.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-eval.template +/*--- +description: super['x'] in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + #x = eval('executed = true; super["x"];'); +}; + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-1.js deleted file mode 100644 index 4abe4665c488..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,34 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-eval.template -/*--- -description: error if `super.x` in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - #x = eval('executed = true; super.x;'); -}; - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-2.js deleted file mode 100644 index 5cf57dcdefa9..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,31 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-eval.template -/*--- -description: error if super['x'] in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - #x = eval('executed = true; super["x"];'); -}; - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..10952a345c80 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-contains-superproperty-1.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-indirect-eval.template +/*--- +description: super.x in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + #x = (0, eval)('executed = true; super.x;'); +}; + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..7f6940075268 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-contains-superproperty-2.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-indirect-eval.template +/*--- +description: super['x'] in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +var A = class {} +var C = class extends A { + #x = (0, eval)('executed = true; super["x"];'); +}; + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-1.js deleted file mode 100644 index 18edba3e048a..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,36 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-indirect-eval.template -/*--- -description: error if `super.x` in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - #x = (0, eval)('executed = true; super.x;'); -}; - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-2.js deleted file mode 100644 index 55f67a15124d..000000000000 --- a/JSTests/test262/test/language/expressions/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,33 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-expr-private-fields-indirect-eval.template -/*--- -description: error if super['x'] in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -var A = class {} -var C = class extends A { - #x = (0, eval)('executed = true; super["x"];'); -}; - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-field-access-on-inner-arrow-function.js b/JSTests/test262/test/language/expressions/class/elements/private-field-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..bd51492dba12 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-field-access-on-inner-arrow-function.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-field-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private field is visible on inner arrow function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-fields-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #f = 'Test262'; + + method() { + let arrowFunction = () => { + return this.#f; + } + + return arrowFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private field from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-field-access-on-inner-function.js b/JSTests/test262/test/language/expressions/class/elements/private-field-access-on-inner-function.js new file mode 100644 index 000000000000..18209f3e2660 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-field-access-on-inner-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-field-access-on-inner-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private field is visible on inner function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-fields-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #f = 'Test262'; + + method() { + let self = this; + function innerFunction() { + return self.#f; + } + + return innerFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private field from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-access-on-inner-arrow-function.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..3c1f0eb71bff --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-access-on-inner-arrow-function.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private getter is visible on inner arrow function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + get #m() { return 'Test262'; } + + method() { + let arrowFunction = () => { + return this.#m; + } + + return arrowFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private accessor from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-access-on-inner-function.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-access-on-inner-function.js new file mode 100644 index 000000000000..89e2665be3f6 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-access-on-inner-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-access-on-inner-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private getter is visible on inner function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + get #m() { return 'Test262'; } + + method() { + let self = this; + function innerFunction() { + return self.#m; + } + + return innerFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private accessor from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-is-not-a-own-property.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-is-not-a-own-property.js new file mode 100644 index 000000000000..8894ea726944 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-is-not-a-own-property.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-is-not-a-own-property.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private getter is not stored as an own property of objects (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + +---*/ + + +var C = class { + get #m() { return "Test262"; } + + checkPrivateGetter() { + assert.sameValue(this.hasOwnProperty("#m"), false); + assert.sameValue("#m" in this, false); + + assert.sameValue(this.__lookupGetter__("#m"), undefined); + + assert.sameValue(this.#m, "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateGetter(), 0); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-on-nested-class.js new file mode 100644 index 000000000000..8ae98d9a9ddf --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-on-nested-class.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private getter is available on inner classes (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + get #m() { return 'test262'; } + + B = class { + method(o) { + return o.#m; + } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(c), 'test262'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-field-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-field-on-nested-class.js new file mode 100644 index 000000000000..44853d1a137f --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-field-on-nested-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-field-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private getter can be shadowed on inner classes by a private field (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + get #m() { return 'outer class'; } + + method() { return this.#m; } + + B = class { + method(o) { + return o.#m; + } + + #m = 'test262'; + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class field from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-getter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-getter-on-nested-class.js new file mode 100644 index 000000000000..d6822fc25dcf --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-getter-on-nested-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-getter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private getter can be shadowed on inner classes by a private getter (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + get #m() { return 'outer class'; } + + method() { return this.#m; } + + B = class { + method(o) { + return o.#m; + } + + get #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class getter from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-method-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-method-on-nested-class.js new file mode 100644 index 000000000000..899db7a5fdc2 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-method-on-nested-class.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-method-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private getter can be shadowed on inner class by a private method (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + get #m() { throw new Test262Error(); } + + B = class { + method(o) { + return o.#m(); + } + + #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class method from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-setter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-setter-on-nested-class.js new file mode 100644 index 000000000000..c14629160564 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-getter-shadowed-by-setter-on-nested-class.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-setter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private getter can be shadowed on inner classes by a private setter (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + get #m() { return 'outer class'; } + + method() { return this.#m; } + + B = class { + method(o) { + return o.#m; + } + + set #m(v) { this._v = v; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB); +}, '[[Get]] operation of an accessor without getter'); + +assert.sameValue(c.method(), 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'access of inner class accessor from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-access-on-inner-arrow-function.js b/JSTests/test262/test/language/expressions/class/elements/private-method-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..a122d5546f15 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-access-on-inner-arrow-function.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private method is visible on inner arrow function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #m() { return 'Test262'; } + + method() { + let arrowFunction = () => { + return this.#m(); + } + + return arrowFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private method from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-access-on-inner-function.js b/JSTests/test262/test/language/expressions/class/elements/private-method-access-on-inner-function.js new file mode 100644 index 000000000000..a6566c93449d --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-access-on-inner-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-access-on-inner-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private method is visible on inner function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #m() { return 'Test262'; } + + method() { + let self = this; + function innerFunction() { + return self.#m(); + } + + return innerFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private method from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-comparison.js b/JSTests/test262/test/language/expressions/class/elements/private-method-comparison.js new file mode 100644 index 000000000000..bec78b75b237 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-comparison.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-comparison.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateFieldGet of a private method returns the same function object to every instance of the same class (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class, class-methods-private] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. + +---*/ + + +var C = class { + #m() { return 'test262'; } + + getPrivateMethod() { + return this.#m; + } + +} + +let c1 = new C(); +let c2 = new C(); + +assert.sameValue(c1.getPrivateMethod(), c2.getPrivateMethod()); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-get-and-call.js b/JSTests/test262/test/language/expressions/class/elements/private-method-get-and-call.js new file mode 100644 index 000000000000..0d04e26a22aa --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-get-and-call.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-get-and-call.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Function returned by a private method can be called with other values as 'this' (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class, class-methods-private] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. + +---*/ + + +var C = class { + #m() { return this._v; } + + getPrivateMethod() { + return this.#m; + } + +} + +let c = new C(); + +let o1 = {_v: 'test262'}; +let o2 = {_v: 'foo'}; +assert.sameValue(c.getPrivateMethod().call(o1), 'test262'); +assert.sameValue(c.getPrivateMethod().call(o2), 'foo'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-is-not-a-own-property.js b/JSTests/test262/test/language/expressions/class/elements/private-method-is-not-a-own-property.js new file mode 100644 index 000000000000..2e136213f7f3 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-is-not-a-own-property.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-is-not-a-own-property.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private method is not stored as an own property of objects (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + +---*/ + + +var C = class { + #m() { return "Test262"; } + + checkPrivateMethod() { + assert.sameValue(this.hasOwnProperty("#m"), false); + assert.sameValue("#m" in this, false); + + assert.sameValue(this.#m(), "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateMethod(), 0); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-method-on-nested-class.js new file mode 100644 index 000000000000..679bfdfc2d58 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-on-nested-class.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private method is available on inner classes (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #m() { return 'test262'; } + + B = class { + method(o) { + return o.#m(); + } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(c), 'test262'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-field-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-field-on-nested-class.js new file mode 100644 index 000000000000..4c5888c16173 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-field-on-nested-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-by-field-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private method can be shadowed on inner classes by a private field (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #m() { return 'outer class'; } + + method() { return this.#m(); } + + B = class { + method(o) { + return o.#m; + } + + #m = 'test262'; + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class field from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-getter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-getter-on-nested-class.js new file mode 100644 index 000000000000..72320a1be493 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-getter-on-nested-class.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-by-getter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private method can be shadowed on inner classes by a private getter (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #m() { return 'outer class'; } + + method() { return this.#m(); } + + B = class { + method(o) { + return o.#m; + } + + get #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class getter from an object of outer class'); +assert.throws(TypeError, function() { + C.prototype.method.call(innerB); +}); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-setter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-setter-on-nested-class.js new file mode 100644 index 000000000000..849b6683df7b --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-by-setter-on-nested-class.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-by-setter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private method can be shadowed on inner classes by a private setter (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #m() { return 'outer class'; } + + method() { return this.#m(); } + + B = class { + method(o) { + return o.#m; + } + + set #m(v) { this._v = v; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB); +}, '[[Get]] operation of an accessor without getter'); + +assert.sameValue(c.method(), 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'access of inner class accessor from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-on-nested-class.js new file mode 100644 index 000000000000..524f527db8d1 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-method-shadowed-on-nested-class.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private method can be shadowed by inner class private method (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + #m() { throw new Test262Error(); } + + B = class { + method() { + return this.#m(); + } + + #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(), 'test262'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-access-on-inner-arrow-function.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..6a517730a32e --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-access-on-inner-arrow-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private setter is visible on inner arrow function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + method() { + let arrowFunction = () => { + this.#m = 'Test262'; + } + + arrowFunction(); + } +} + +let c = new C(); +c.method(); +assert.sameValue(c._v, 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private setter from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-access-on-inner-function.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-access-on-inner-function.js new file mode 100644 index 000000000000..0d8bfd4e6370 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-access-on-inner-function.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-access-on-inner-function.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private setter is visible on inner function of class scope (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + method() { + let self = this; + function innerFunction() { + self.#m = 'Test262'; + } + + innerFunction(); + } +} + +let c = new C(); +c.method(); +assert.sameValue(c._v, 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private setter from an ordinary object'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-is-not-a-own-property.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-is-not-a-own-property.js new file mode 100644 index 000000000000..695c931a944f --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-is-not-a-own-property.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-is-not-a-own-property.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private setter is not stored as an own property of objects (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + checkPrivateSetter() { + assert.sameValue(this.hasOwnProperty("#m"), false); + assert.sameValue("#m" in this, false); + + assert.sameValue(this.__lookupSetter__("#m"), undefined); + + this.#m = "Test262"; + assert.sameValue(this._v, "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateSetter(), 0); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-on-nested-class.js new file mode 100644 index 000000000000..13bdc508c2db --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-on-nested-class.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private setter is available on inner classes (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + B = class { + method(o, v) { + o.#m = v; + } + } +} + +let c = new C(); +let innerB = new c.B(); +innerB.method(c, 'test262'); +assert.sameValue(c._v, 'test262'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-field-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-field-on-nested-class.js new file mode 100644 index 000000000000..162c47ce46b0 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-field-on-nested-class.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-field-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private setter can be shadowed on inner classes by a private field (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + get m() { return this.#m; } + + #m; + } +} + +let c = new C(); +let innerB = new c.B(); + +innerB.method(innerB, 'test262'); +assert.sameValue(innerB.m, 'test262'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c, 'foo'); +}, 'accessed inner class field from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-getter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-getter-on-nested-class.js new file mode 100644 index 000000000000..b1a4b3f34bbc --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-getter-on-nested-class.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-getter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private setter can be shadowed on inner classes by a private getter (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + get #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB); +}, 'invalid [[Set]] of an acessor without setter'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'invalid access of inner class getter from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-method-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-method-on-nested-class.js new file mode 100644 index 000000000000..6e54fda11a07 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-method-on-nested-class.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-method-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private setter can be shadowed on inner class by a private method (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB, 'foo'); +}, 'invalid [[Set]] operation in a private method'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'invalid access of inner class method from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-setter-on-nested-class.js b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-setter-on-nested-class.js new file mode 100644 index 000000000000..3ecebdfce9f5 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/private-setter-shadowed-by-setter-on-nested-class.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-setter-on-nested-class.case +// - src/class-elements/default/cls-expr.template +/*--- +description: PrivateName of private setter can be shadowed on inner classes by a private setter (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +var C = class { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + set #m(v) { this._v = v; } + } +} + +let c = new C(); +let innerB = new c.B(); + +innerB.method(innerB, 'test262'); +assert.sameValue(innerB._v, 'test262'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c, 'foo'); +}, 'access of inner class accessor from an object of outer class'); diff --git a/JSTests/test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-constructor.js b/JSTests/test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-constructor.js new file mode 100644 index 000000000000..37cd4f4d7473 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-constructor.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-getter-before-super-return-in-constructor.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private getters are installed "when super returns" and no earlier (call in constructor) (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +var C = class { + constructor() { + this.f(); + } + +} + +class D extends C { + f() { this.#m; } + get #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('f')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private getters are not installed before super returns'); diff --git a/JSTests/test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-field-initializer.js b/JSTests/test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-field-initializer.js new file mode 100644 index 000000000000..4e6edac36436 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/prod-private-getter-before-super-return-in-field-initializer.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-getter-before-super-return-in-field-initializer.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private getters are installed "when super returns" and no earlier (call in field initializer) (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +var C = class { + f = this.g(); + +} + +class D extends C { + g() { this.#m; } + get #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('g')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private getters are not installed before super returns'); diff --git a/JSTests/test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-constructor.js b/JSTests/test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-constructor.js new file mode 100644 index 000000000000..4b5c49f97de9 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-constructor.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-method-before-super-return-in-constructor.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private methods are installed "when super returns" and no earlier (call in constructor) (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +var C = class { + constructor() { + this.f(); + } + +} + +class D extends C { + f() { this.#m(); } + #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('f')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private methods are not installed before super returns'); diff --git a/JSTests/test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-field-initializer.js b/JSTests/test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-field-initializer.js new file mode 100644 index 000000000000..b13db04f0734 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/prod-private-method-before-super-return-in-field-initializer.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-method-before-super-return-in-field-initializer.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private methods are installed "when super returns" and no earlier (call in field initializer) (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +var C = class { + f = this.g(); + +} + +class D extends C { + g() { this.#m(); } + #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('g')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private methods are not installed before super returns'); diff --git a/JSTests/test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-constructor.js b/JSTests/test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-constructor.js new file mode 100644 index 000000000000..df35d3b1d090 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-constructor.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-setter-before-super-return-in-constructor.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private setters are installed "when super returns" and no earlier (call in constructor) (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +var C = class { + constructor() { + this.f(); + } + +} + +class D extends C { + f() { this.#m = 42; } + set #m(val) {} +} + +assert(D.prototype.hasOwnProperty('f')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private setters are not installed before super returns'); diff --git a/JSTests/test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-field-initializer.js b/JSTests/test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-field-initializer.js new file mode 100644 index 000000000000..bb5970024915 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/elements/prod-private-setter-before-super-return-in-field-initializer.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-setter-before-super-return-in-field-initializer.case +// - src/class-elements/default/cls-expr.template +/*--- +description: Private settters are installed "when super returns" and no earlier (call in field initializer) (field definitions in a class expression) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +var C = class { + f = this.g(); + +} + +class D extends C { + g() { this.#m = 42; } + set #m(val) {} +} + +assert(D.prototype.hasOwnProperty('g')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private setters are not installed before super returns'); diff --git a/JSTests/test262/test/language/expressions/class/poisoned-underscore-proto.js b/JSTests/test262/test/language/expressions/class/poisoned-underscore-proto.js new file mode 100644 index 000000000000..e9e333fade1e --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/poisoned-underscore-proto.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-ClassExpression +description: > + ClassExpression should directly set [[Prototype]] internal slot. +info: | + ClassDefinitionEvaluation + + [...] + 7. Let proto be ObjectCreate(protoParent). + + ObjectCreate ( proto [ , internalSlotsList ] ) + + [...] + 4. Set obj.[[Prototype]] to proto. +features: [class] +---*/ + +Object.defineProperty(Object.prototype, '__proto__', { + set: function() { + throw new Test262Error('should not be called'); + }, +}); + +var A = class extends Array {}; + +assert.sameValue(new A(1).length, 1); diff --git a/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval-indirect.js b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval-indirect.js new file mode 100644 index 000000000000..e3cc5a6d4f48 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval-indirect.js @@ -0,0 +1,49 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private getter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let classStringExpression = `( +class { + get #m() { return 'test262'; } + + access(o) { + return o.#m; + } +} +)`; + +let createAndInstantiateClass = function (_eval) { + return new (_eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(eval); +let c2 = createAndInstantiateClass(eval); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval.js b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval.js new file mode 100644 index 000000000000..e695ea2106d2 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-eval.js @@ -0,0 +1,49 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private getter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let classStringExpression = `( +class { + get #m() { return 'test262'; } + + access(o) { + return o.#m; + } +} +)`; + +let createAndInstantiateClass = function () { + return new (eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-factory.js b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-factory.js new file mode 100644 index 000000000000..732cb1904f6f --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-factory.js @@ -0,0 +1,47 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private getter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let createAndInstantiateClass = function () { + const C = class { + get #m() { return 'test262'; } + + access(o) { + return o.#m; + } + } + + let c = new C(); + return c; +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-function-ctor.js b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-function-ctor.js new file mode 100644 index 000000000000..55f7406ca48f --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-function-ctor.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private getter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let classStringExpression = ` +return class { + get m() { return 'test262'; } + + access(o) { + return o.m; + } +} +`; + +let createAndInstantiateClass = function () { + let classFactoryFunction = new Function(classStringExpression); + let Class = classFactoryFunction(); + return new Class(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js new file mode 100644 index 000000000000..5dcf1e31efee --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private getter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let classStringExpression = ` +return class { + get #m() { return 'test262'; } + + access(o) { + return o.#m; + } +} +`; + +let createAndInstantiateClass = function () { + let classFactoryFunction = new ($262.createRealm().global.Function)(classStringExpression); + let Class = classFactoryFunction(); + return new Class(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm.js b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm.js new file mode 100644 index 000000000000..a28754571f8b --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-getter-brand-check-multiple-evaluations-of-class-realm.js @@ -0,0 +1,52 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private getter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let eval1 = $262.createRealm().global.eval; +let eval2 = $262.createRealm().global.eval; + +let classStringExpression = `( +class { + get #m() { return 'test262'; } + + access(o) { + return o.#m; + } +} +)`; + +let createAndInstantiateClass = function (_eval) { + return new (_eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(eval1); +let c2 = createAndInstantiateClass(eval2); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval-indirect.js b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval-indirect.js new file mode 100644 index 000000000000..eac02682f2ad --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval-indirect.js @@ -0,0 +1,49 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private method) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let classStringExpression = `( +class C { + #m() { return 'test262'; } + + access(o) { + return o.#m(); + } +} +)`; + +let createAndInstantiateClass = function (_eval) { + return new (_eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(eval); +let c2 = createAndInstantiateClass(eval); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval.js b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval.js new file mode 100644 index 000000000000..4cc49d8cb18d --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-eval.js @@ -0,0 +1,49 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private method) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let classStringExpression = `( +class C { + #m() { return 'test262'; } + + access(o) { + return o.#m(); + } +} +)`; + +let createAndInstantiateClass = function () { + return new (eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-factory.js b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-factory.js new file mode 100644 index 000000000000..094165ed6865 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-factory.js @@ -0,0 +1,46 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private method) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let createAndInstantiateClass = function () { + const C = class { + #m() { return 'test262'; } + + access(o) { + return o.#m(); + } + } + + return new C(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-function-ctor.js b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-function-ctor.js new file mode 100644 index 000000000000..6e237409163f --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-function-ctor.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private method) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let classStringExpression = ` +return class C { + #m() { return 'test262'; } + + access(o) { + return o.#m(); + } +} +`; + +let createAndInstantiateClass = function () { + let classFactoryFunction = new Function(classStringExpression); + let Class = classFactoryFunction(); + return new Class(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm-function-ctor.js b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm-function-ctor.js new file mode 100644 index 000000000000..094df6a6c6fa --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm-function-ctor.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private method) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let classStringExpression = ` +return class C { + #m() { return 'test262'; } + + access(o) { + return o.#m(); + } +} +`; + +let createAndInstantiateClass = function () { + let classFactoryFunction = new ($262.createRealm().global.Function)(classStringExpression); + let Class = classFactoryFunction(); + return new Class(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm.js b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm.js new file mode 100644 index 000000000000..49657c84af78 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-method-brand-check-multiple-evaluations-of-class-realm.js @@ -0,0 +1,52 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private method) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let eval1 = $262.createRealm().global.eval; +let eval2 = $262.createRealm().global.eval; + +let classStringExpression = `( +class { + #m() { return 'test262'; } + + access(o) { + return o.#m(); + } +} +)`; + +let createAndInstantiateClass = function (_eval) { + return new (_eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(eval1); +let c2 = createAndInstantiateClass(eval2); + +assert.sameValue(c1.access(c1), 'test262'); +assert.sameValue(c2.access(c2), 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval-indirect.js b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval-indirect.js new file mode 100644 index 000000000000..18e5558e5a52 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval-indirect.js @@ -0,0 +1,51 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private setter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let classStringExpression = `( +class { + set #m(v) { this._v = v; } + + access(o, v) { + o.#m = v; + } +} +)`; + +let createAndInstantiateClass = function (_eval) { + return new (_eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(eval); +let c2 = createAndInstantiateClass(eval); + +c1.access(c1, 'test262'); +assert.sameValue(c1._v, 'test262'); +c2.access(c2, 'test262'); +assert.sameValue(c2._v, 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2, 'foo'); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1, 'foo'); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval.js b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval.js new file mode 100644 index 000000000000..091cff4af951 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-eval.js @@ -0,0 +1,51 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private setter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let classStringExpression = `( +class { + set #m(v) { this._v = v; } + + access(o, v) { + o.#m = v; + } +} +)`; + +let createAndInstantiateClass = function () { + return new (eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +c1.access(c1, 'test262'); +assert.sameValue(c1._v, 'test262'); +c2.access(c2, 'test262'); +assert.sameValue(c2._v, 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2, 'foo'); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1, 'foo'); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-factory.js b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-factory.js new file mode 100644 index 000000000000..58771e30f660 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-factory.js @@ -0,0 +1,48 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private setter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let createAndInstantiateClass = function () { + const C = class { + set #m(v) { this._v = v; } + + access(o, v) { + o.#m = v; + } + } + + return new C(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +c1.access(c1, 'test262'); +assert.sameValue(c1._v, 'test262'); +c2.access(c2, 'test262'); +assert.sameValue(c2._v, 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2, 'foo'); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1, 'foo'); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-function-ctor.js b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-function-ctor.js new file mode 100644 index 000000000000..86722d023d7d --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-function-ctor.js @@ -0,0 +1,52 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private setter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let classStringExpression = ` +return class { + set #m(v) { this._v = v; } + + access(o, v) { + o.#m = v; + } +} +`; + +let createAndInstantiateClass = function () { + let classFactoryFunction = new Function(classStringExpression); + let Class = classFactoryFunction(); + return new Class(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +c1.access(c1, 'test262'); +assert.sameValue(c1._v, 'test262'); +c2.access(c2, 'test262'); +assert.sameValue(c2._v, 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2, 'foo'); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1, 'foo'); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js new file mode 100644 index 000000000000..0c5eff4b1b2f --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm-function-ctor.js @@ -0,0 +1,52 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private setter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let classStringExpression = ` +return class { + set #m(v) { this._v = v; } + + access(o, v) { + o.#m = v; + } +} +`; + +let createAndInstantiateClass = function () { + let classFactoryFunction = new ($262.createRealm().global.Function)(classStringExpression); + let Class = classFactoryFunction(); + return new Class(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +c1.access(c1, 'test262'); +assert.sameValue(c1._v, 'test262'); +c2.access(c2, 'test262'); +assert.sameValue(c2._v, 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2, 'foo'); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1, 'foo'); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm.js b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm.js new file mode 100644 index 000000000000..35a42d364397 --- /dev/null +++ b/JSTests/test262/test/language/expressions/class/private-setter-brand-check-multiple-evaluations-of-class-realm.js @@ -0,0 +1,54 @@ +// Copyright (C) 2019 Jaideep Bhoosreddy (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private setter) +esid: sec-privatefieldget +info: | + ClassTail : ClassHeritage { ClassBody } + ... + 11. Let proto be ObjectCreate(protoParent). + ... + 31. If PrivateBoundIdentifiers of ClassBody contains a Private Name P such that the P's [[Kind]] field is either "method" or "accessor", + a. Set F.[[PrivateBrand]] to proto. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +flags: [noStrict] +---*/ + +let eval1 = $262.createRealm().global.eval; +let eval2 = $262.createRealm().global.eval; + +let classStringExpression = `( +class { + set #m(v) { this._v = v; } + + access(o, v) { + o.#m = v; + } +} +)`; + +let createAndInstantiateClass = function (_eval) { + return new (_eval(classStringExpression)); +}; + +let c1 = createAndInstantiateClass(eval1); +let c2 = createAndInstantiateClass(eval2); + +c1.access(c1, 'test262'); +assert.sameValue(c1._v, 'test262'); +c2.access(c2, 'test262'); +assert.sameValue(c2._v, 'test262'); + +assert.throws(TypeError, function() { + c1.access(c2, 'foo'); +}, 'invalid access of c1 private method'); + +assert.throws(TypeError, function() { + c2.access(c1, 'foo'); +}, 'invalid access of c2 private method'); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/add-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/add-non-simple.js index 76eb1373feac..f74dd5fb5c04 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/add-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/add-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound addition assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/btws-and-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/btws-and-non-simple.js index 13a575ff3503..ceac4aa86948 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/btws-and-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/btws-and-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound "bitwise and" assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/btws-or-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/btws-or-non-simple.js index a52f80bdd202..acbdd1e241b9 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/btws-or-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/btws-or-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound "bitwise or" assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/btws-xor-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/btws-xor-non-simple.js index 1380721e655d..f5f8f6ee14ce 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/btws-xor-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/btws-xor-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound "bitwise xor" assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/div-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/div-non-simple.js index 287f78cb963d..b3b2238d6303 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/div-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/div-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound division assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-shift-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/left-shift-non-simple.js index 343c54de9796..171030b08c80 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/left-shift-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/left-shift-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound "left shift" assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/mod-div-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/mod-div-non-simple.js index 7876fdc19a2b..33c4d56b58d5 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/mod-div-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/mod-div-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound "modular division" assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/mult-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/mult-non-simple.js index c5e2d18620b7..0c53254b54e0 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/mult-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/mult-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound multiplication assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/right-shift-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/right-shift-non-simple.js index 713ad4c1b5d5..a8f141b42709 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/right-shift-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/right-shift-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound "right shift" assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/subtract-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/subtract-non-simple.js index 694ab1751d7f..4221fa74922e 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/subtract-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/subtract-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound subtraction assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/compound-assignment/u-right-shift-non-simple.js b/JSTests/test262/test/language/expressions/compound-assignment/u-right-shift-non-simple.js index 4ee6468a2d19..b7c63dd5d0ab 100644 --- a/JSTests/test262/test/language/expressions/compound-assignment/u-right-shift-non-simple.js +++ b/JSTests/test262/test/language/expressions/compound-assignment/u-right-shift-non-simple.js @@ -2,14 +2,14 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- +esid: sec-assignment-operators-static-semantics-early-errors info: | - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. -es6id: 12.14.1 + It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. description: Compound "unsigned right shift" assignment with non-simple target negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-1-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-1-update-expression.js new file mode 100644 index 000000000000..9c41220f3ac7 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-1-update-expression.js @@ -0,0 +1,46 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and UpdateExpression, but it is an invalid + AssginmentTargetType then it should throw a ReferenceError if used in some + UpdateExpressions +esid: prod-ImportCall +info: | + Update Expressions + Static Semantics: Early Errors + + UpdateExpression: + LeftHandSideExpression++ + LeftHandSideExpression-- + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('')++ diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-10-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-10-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..0d4f25c926c3 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-10-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') -= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-11-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-11-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..cb8e0d4c7fc2 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-11-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') <<= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-12-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-12-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..05baa3ac8fdd --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-12-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') >>= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-13-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-13-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..bafb353d3e73 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-13-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') >>>= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-14-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-14-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..99e8ea681eb4 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-14-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') &= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-15-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-15-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..7722f3c55a56 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-15-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') ^= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-16-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-16-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..e895bbb295e2 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-16-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') |= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-17-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-17-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..d27455ea3f9b --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-17-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') **= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-2-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-2-update-expression.js new file mode 100644 index 000000000000..13af3b8da81c --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-2-update-expression.js @@ -0,0 +1,46 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and UpdateExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + UpdateExpressions +esid: prod-ImportCall +info: | + Update Expressions + Static Semantics: Early Errors + + UpdateExpression: + LeftHandSideExpression++ + LeftHandSideExpression-- + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('')-- diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-3-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-3-update-expression.js new file mode 100644 index 000000000000..52ac1d38e1a7 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-3-update-expression.js @@ -0,0 +1,46 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and UnaryExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + UpdateExpressions +esid: prod-ImportCall +info: | + Update Expressions + Static Semantics: Early Errors + + UpdateExpression: + ++UnaryExpression + --UnaryExpression + + - It is an early Syntax Error if AssignmentTargetType of UnaryExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +++import('') diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-4-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-4-update-expression.js new file mode 100644 index 000000000000..4e57e456e71d --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-4-update-expression.js @@ -0,0 +1,46 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and UnaryExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + UpdateExpressions +esid: prod-ImportCall +info: | + Update Expressions + Static Semantics: Early Errors + + UpdateExpression: + ++UnaryExpression + --UnaryExpression + + - It is an early Syntax Error if AssignmentTargetType of UnaryExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +--import('') diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-5-lhs-equals-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-5-lhs-equals-assignment-expression.js new file mode 100644 index 000000000000..2fe58e633ab1 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-5-lhs-equals-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') = 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-6-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-6-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..d244831dc6f5 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-6-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') *= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-7-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-7-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..6e27083f3c9e --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-7-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') /= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-8-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-8-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..34f45b2c53b1 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-8-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') %= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-9-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-9-lhs-assignment-operator-assignment-expression.js new file mode 100644 index 000000000000..f0702308cc99 --- /dev/null +++ b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-assignmenttargettype-syntax-error-9-lhs-assignment-operator-assignment-expression.js @@ -0,0 +1,48 @@ +// Copyright (C) 2018 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: > + ImportCall is a valid CallExpression and LHSExpression, but it is an invalid + AssginmentTargetType then it should throw a SyntaxError if used in some + LHS Expression of a AssignmentExpression production +esid: prod-ImportCall +info: | + Assignment Operators + Static Semantics: Early Errors + + AssignmentExpression : LeftHandSideExpression = AssignmentExpression + + - It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression + + - It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. + + LeftHandSideExpression: + NewExpression + CallExpression + + CallExpression: + ImportCall + + Left-Hand-Side Expressions + Static Semantics: AssignmentTargetType + #sec-static-semantics-static-semantics-assignmenttargettype + + CallExpression : + MemberExpressionArguments + SuperCall + ImportCall + CallExpressionArguments + CallExpressionTemplateLiteral + + 1. Return invalid +negative: + phase: parse + type: SyntaxError +features: [dynamic-import] +---*/ + +$DONOTEVALUATE(); + +import('') += 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-1-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-1-update-expression.js deleted file mode 100644 index 51fe4fa74acf..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-1-update-expression.js +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and UpdateExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - UpdateExpressions -esid: prod-ImportCall -info: | - Update Expressions - Static Semantics: Early Errors - - UpdateExpression: - LeftHandSideExpression++ - LeftHandSideExpression-- - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('')++ diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-10-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-10-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index d6693260c350..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-10-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') -= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-11-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-11-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index 67ac3cc7d53e..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-11-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') <<= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-12-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-12-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index 51ea2af30b85..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-12-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') >>= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-13-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-13-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index 3cf010ec219f..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-13-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') >>>= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-14-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-14-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index 4a55721d49ae..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-14-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') &= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-15-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-15-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index 047473c138d2..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-15-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') ^= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-16-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-16-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index 7c1abe4d11f6..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-16-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') |= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-17-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-17-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index b8a6ce68e415..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-17-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') **= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-2-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-2-update-expression.js deleted file mode 100644 index 0426cc28b534..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-2-update-expression.js +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and UpdateExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - UpdateExpressions -esid: prod-ImportCall -info: | - Update Expressions - Static Semantics: Early Errors - - UpdateExpression: - LeftHandSideExpression++ - LeftHandSideExpression-- - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('')-- diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-3-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-3-update-expression.js deleted file mode 100644 index 073065107378..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-3-update-expression.js +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and UnaryExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - UpdateExpressions -esid: prod-ImportCall -info: | - Update Expressions - Static Semantics: Early Errors - - UpdateExpression: - ++UnaryExpression - --UnaryExpression - - - It is an early Reference Error if AssignmentTargetType of UnaryExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -++import('') diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-4-update-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-4-update-expression.js deleted file mode 100644 index 7ed39d1f2f06..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-4-update-expression.js +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and UnaryExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - UpdateExpressions -esid: prod-ImportCall -info: | - Update Expressions - Static Semantics: Early Errors - - UpdateExpression: - ++UnaryExpression - --UnaryExpression - - - It is an early Reference Error if AssignmentTargetType of UnaryExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - ---import('') diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-5-lhs-equals-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-5-lhs-equals-assignment-expression.js deleted file mode 100644 index 12b28a8fa78d..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-5-lhs-equals-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') = 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-6-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-6-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index 7f642f957497..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-6-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') *= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-7-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-7-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index b86d9205058d..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-7-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') /= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-8-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-8-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index ba4267738b5c..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-8-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') %= 1; diff --git a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-9-lhs-assignment-operator-assignment-expression.js b/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-9-lhs-assignment-operator-assignment-expression.js deleted file mode 100644 index f80ee6b4e03d..000000000000 --- a/JSTests/test262/test/language/expressions/dynamic-import/syntax/invalid/invalid-asssignmenttargettype-reference-error-9-lhs-assignment-operator-assignment-expression.js +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2018 Leo Balter. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: > - ImportCall is a valid CallExpression and LHSExpression, but it is an invalid - AssginmentTargetType then it should throw a ReferenceError if used in some - LHS Expression of a AssignmentExpression production -esid: prod-ImportCall -info: | - Assignment Operators - Static Semantics: Early Errors - - AssignmentExpression : LeftHandSideExpression = AssignmentExpression - - - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. - - AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression - - - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. - - LeftHandSideExpression: - NewExpression - CallExpression - - CallExpression: - ImportCall - - Left-Hand-Side Expressions - Static Semantics: AssignmentTargetType - #sec-static-semantics-static-semantics-assignmenttargettype - - CallExpression : - MemberExpressionArguments - SuperCall - ImportCall - CallExpressionArguments - CallExpressionTemplateLiteral - - 1. Return invalid -negative: - phase: parse - type: ReferenceError -features: [dynamic-import] ----*/ - -$DONOTEVALUATE(); - -import('') += 1; diff --git a/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-assignment-expr.js b/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-assignment-expr.js index 19b74088595a..65ca9098a24b 100644 --- a/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-assignment-expr.js +++ b/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-assignment-expr.js @@ -17,12 +17,12 @@ info: | AssignmentExpression : LeftHandSideExpression = AssignmentExpression - It is an early Reference Error if LeftHandSideExpression is neither an ObjectLiteral nor an - ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid. + It is an early Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an + ArrayLiteral and AssignmentTargetType of LeftHandSideExpression is invalid or strict. flags: [module] negative: phase: parse - type: ReferenceError + type: SyntaxError features: [import.meta] ---*/ diff --git a/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-update-expr.js b/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-update-expr.js index 5d50f62d0967..85bf62b34a22 100644 --- a/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-update-expr.js +++ b/JSTests/test262/test/language/expressions/import.meta/syntax/invalid-assignment-target-update-expr.js @@ -19,11 +19,11 @@ info: | LeftHandSideExpression++ LeftHandSideExpression-- - It is an early Reference Error if AssignmentTargetType of LeftHandSideExpression is invalid. + It is an early Syntax Error if AssignmentTargetType of LeftHandSideExpression is invalid or strict. flags: [module] negative: phase: parse - type: ReferenceError + type: SyntaxError features: [import.meta] ---*/ diff --git a/JSTests/test262/test/language/expressions/new.target/unary-expr.js b/JSTests/test262/test/language/expressions/new.target/unary-expr.js new file mode 100644 index 000000000000..0e3592c50d50 --- /dev/null +++ b/JSTests/test262/test/language/expressions/new.target/unary-expr.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-UnaryExpression +description: > + While increments and decrements are restricted to use with NewTarget, + other unary operators should not throw SyntaxError. +info: | + UnaryExpression[Yield, Await]: + UpdateExpression[?Yield, ?Await]: + LeftHandSideExpression[?Yield, ?Await]: + NewExpression[?Yield, ?Await]: + MemberExpression[Yield, Await]: + MetaProperty: + NewTarget +features: [new.target, async-functions] +flags: [async] +---*/ + +(function() { assert.sameValue(delete (new.target), true); })(); +(function() { assert.sameValue(void new.target, undefined); })(); +new function() { assert.sameValue(typeof new.target, 'function'); }; +new function() { assert.sameValue(+(new.target), NaN); }; +(function() { assert.sameValue(-(new.target), NaN); })(); +new function() { assert.sameValue(~new.target, -1); }; +(function() { assert.sameValue(!new.target, true); })(); +new function() { assert.sameValue(delete void typeof +-~!(new.target), true); }; + +(async function() { + assert.sameValue(await new.target, undefined); +})().then($DONE, $DONE); diff --git a/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-newtarget.js b/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-newtarget.js index a56749b7f005..07233bccc919 100644 --- a/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-newtarget.js +++ b/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-postfix-expressions-static-semantics-early-errors -es6id: 12.4.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" new.target info: | - PostfixExpression : + UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-yieldexpr.js b/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-yieldexpr.js index a774956f89e7..73788d500891 100644 --- a/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-yieldexpr.js +++ b/JSTests/test262/test/language/expressions/postfix-decrement/target-cover-yieldexpr.js @@ -1,30 +1,30 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-postfix-expressions-static-semantics-early-errors -es6id: 12.4.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" YieldExpression info: | - PostfixExpression : + UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.15.3 Static Semantics: IsValidSimpleAssignmentTarget + 12.15.3 Static Semantics: AssignmentTargetType AssignmentExpression: YieldExpression ArrowFunction + AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression - 1. Return false. + 1. Return invalid. features: [generators] negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/postfix-decrement/target-newtarget.js b/JSTests/test262/test/language/expressions/postfix-decrement/target-newtarget.js index 472f5cd1074b..ddfe95e6a276 100644 --- a/JSTests/test262/test/language/expressions/postfix-decrement/target-newtarget.js +++ b/JSTests/test262/test/language/expressions/postfix-decrement/target-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-postfix-expressions-static-semantics-early-errors -es6id: 12.4.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to new.target info: | - PostfixExpression : + UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/postfix-increment/target-cover-newtarget.js b/JSTests/test262/test/language/expressions/postfix-increment/target-cover-newtarget.js index f6f2f55beec3..19d57288805a 100644 --- a/JSTests/test262/test/language/expressions/postfix-increment/target-cover-newtarget.js +++ b/JSTests/test262/test/language/expressions/postfix-increment/target-cover-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-postfix-expressions-static-semantics-early-errors -es6id: 12.4.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" new.target info: | - PostfixExpression : + UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/postfix-increment/target-cover-yieldexpr.js b/JSTests/test262/test/language/expressions/postfix-increment/target-cover-yieldexpr.js index 5d23858fd9ae..197773fd833e 100644 --- a/JSTests/test262/test/language/expressions/postfix-increment/target-cover-yieldexpr.js +++ b/JSTests/test262/test/language/expressions/postfix-increment/target-cover-yieldexpr.js @@ -1,30 +1,30 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-postfix-expressions-static-semantics-early-errors -es6id: 12.4.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" YieldExpression info: | - PostfixExpression : + UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.15.3 Static Semantics: IsValidSimpleAssignmentTarget + 12.15.3 Static Semantics: AssignmentTargetType AssignmentExpression: YieldExpression ArrowFunction + AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression - 1. Return false. + 1. Return invalid. features: [generators] negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/postfix-increment/target-newtarget.js b/JSTests/test262/test/language/expressions/postfix-increment/target-newtarget.js index ee1109b30d23..54d4a04c31cc 100644 --- a/JSTests/test262/test/language/expressions/postfix-increment/target-newtarget.js +++ b/JSTests/test262/test/language/expressions/postfix-increment/target-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-postfix-expressions-static-semantics-early-errors -es6id: 12.4.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to new.target info: | - PostfixExpression : + UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - LeftHandSideExpression is false. + - It is an early Syntax Error if AssignmentTargetType of + LeftHandSideExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-newtarget.js b/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-newtarget.js index 4f40ea82ed66..f119734145d9 100644 --- a/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-newtarget.js +++ b/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-unary-operators-static-semantics-early-errors -es6id: 12.5.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" new.target info: | UnaryExpression : ++ UnaryExpression -- UnaryExpression - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - UnaryExpression is false. + - It is an early Syntax Error if IsValidSimpleAssignmentTarget of + UnaryExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-yieldexpr.js b/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-yieldexpr.js index fa08eee6520b..f78ed50b8f29 100644 --- a/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-yieldexpr.js +++ b/JSTests/test262/test/language/expressions/prefix-decrement/target-cover-yieldexpr.js @@ -1,30 +1,30 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-unary-operators-static-semantics-early-errors -es6id: 12.5.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" YieldExpression info: | UnaryExpression : ++ UnaryExpression -- UnaryExpression - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - UnaryExpression is false. + - It is an early Syntax Error if IsValidSimpleAssignmentTarget of + UnaryExpression is invalid or strict. - 12.15.3 Static Semantics: IsValidSimpleAssignmentTarget + 12.15.3 Static Semantics: AssignmentTargetType AssignmentExpression: YieldExpression ArrowFunction + AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression - 1. Return false. + 1. Return invalid. features: [generators] negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/prefix-decrement/target-newtarget.js b/JSTests/test262/test/language/expressions/prefix-decrement/target-newtarget.js index c0a08a38f585..a2797575126f 100644 --- a/JSTests/test262/test/language/expressions/prefix-decrement/target-newtarget.js +++ b/JSTests/test262/test/language/expressions/prefix-decrement/target-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-unary-operators-static-semantics-early-errors -es6id: 12.5.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to new.target info: | UnaryExpression : ++ UnaryExpression -- UnaryExpression - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - UnaryExpression is false. + - It is an early Syntax Error if IsValidSimpleAssignmentTarget of + UnaryExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/prefix-increment/target-cover-newtarget.js b/JSTests/test262/test/language/expressions/prefix-increment/target-cover-newtarget.js index 98666e02c10f..13e5d94f583c 100644 --- a/JSTests/test262/test/language/expressions/prefix-increment/target-cover-newtarget.js +++ b/JSTests/test262/test/language/expressions/prefix-increment/target-cover-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-unary-operators-static-semantics-early-errors -es6id: 12.5.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" new.target info: | UnaryExpression : ++ UnaryExpression -- UnaryExpression - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - UnaryExpression is false. + - It is an early Syntax Error if IsValidSimpleAssignmentTarget of + UnaryExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/prefix-increment/target-cover-yieldexpr.js b/JSTests/test262/test/language/expressions/prefix-increment/target-cover-yieldexpr.js index c064968e7910..80d8848e41dd 100644 --- a/JSTests/test262/test/language/expressions/prefix-increment/target-cover-yieldexpr.js +++ b/JSTests/test262/test/language/expressions/prefix-increment/target-cover-yieldexpr.js @@ -1,30 +1,30 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-unary-operators-static-semantics-early-errors -es6id: 12.5.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to a "covered" YieldExpression info: | UnaryExpression : ++ UnaryExpression -- UnaryExpression - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - UnaryExpression is false. + - It is an early Syntax Error if IsValidSimpleAssignmentTarget of + UnaryExpression is invalid or strict. - 12.15.3 Static Semantics: IsValidSimpleAssignmentTarget + 12.15.3 Static Semantics: AssignmentTargetType AssignmentExpression: YieldExpression ArrowFunction + AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression - 1. Return false. + 1. Return invalid. features: [generators] negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/expressions/prefix-increment/target-newtarget.js b/JSTests/test262/test/language/expressions/prefix-increment/target-newtarget.js index e1d06154cfb8..a378cc3635c7 100644 --- a/JSTests/test262/test/language/expressions/prefix-increment/target-newtarget.js +++ b/JSTests/test262/test/language/expressions/prefix-increment/target-newtarget.js @@ -1,27 +1,26 @@ // Copyright (C) 2016 the V8 project authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-unary-operators-static-semantics-early-errors -es6id: 12.5.1 +esid: sec-update-expressions-static-semantics-early-errors description: Applied to new.target info: | UnaryExpression : ++ UnaryExpression -- UnaryExpression - - It is an early Reference Error if IsValidSimpleAssignmentTarget of - UnaryExpression is false. + - It is an early Syntax Error if IsValidSimpleAssignmentTarget of + UnaryExpression is invalid or strict. - 12.3.1.5 Static Semantics: IsValidSimpleAssignmentTarget + 12.3.1.6 Static Semantics: AssignmentTargetType NewTarget: new.target - 1. Return false. + 1. Return invalid. negative: phase: parse - type: ReferenceError + type: SyntaxError features: [new.target] ---*/ diff --git a/JSTests/test262/test/language/expressions/super/call-poisoned-underscore-proto.js b/JSTests/test262/test/language/expressions/super/call-poisoned-underscore-proto.js new file mode 100644 index 000000000000..b9a9ed19e7e8 --- /dev/null +++ b/JSTests/test262/test/language/expressions/super/call-poisoned-underscore-proto.js @@ -0,0 +1,23 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-SuperCall +description: > + SuperCall should directly invoke [[GetPrototypeOf]] internal method. +info: | + GetSuperConstructor ( ) + + [...] + 5. Let superConstructor be ! activeFunction.[[GetPrototypeOf]](). +features: [class] +---*/ + +Object.defineProperty(Object.prototype, '__proto__', { + get: function() { + throw new Test262Error('should not be called'); + }, +}); + +class A extends Array {} + +assert.sameValue(new A(1).length, 1); diff --git a/JSTests/test262/test/language/expressions/super/prop-poisoned-underscore-proto.js b/JSTests/test262/test/language/expressions/super/prop-poisoned-underscore-proto.js new file mode 100644 index 000000000000..c96e21a578b8 --- /dev/null +++ b/JSTests/test262/test/language/expressions/super/prop-poisoned-underscore-proto.js @@ -0,0 +1,35 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-SuperProperty +description: > + SuperProperty should directly call [[GetPrototypeOf]] internal method. +info: | + MakeSuperPropertyReference ( actualThis, propertyKey, strict ) + + [...] + 3. Let baseValue be ? env.GetSuperBase(). + + GetSuperBase ( ) + + [...] + 5. Return ? home.[[GetPrototypeOf]](). +---*/ + +Object.defineProperty(Object.prototype, '__proto__', { + get: function() { + throw new Test262Error('should not be called'); + }, +}); + +var obj = { + superExpression() { + return super['CONSTRUCTOR'.toLowerCase()]; + }, + superIdentifierName() { + return super.toString(); + }, +}; + +assert.sameValue(obj.superExpression(), Object); +assert.sameValue(obj.superIdentifierName(), '[object Object]'); diff --git a/JSTests/test262/test/language/expressions/this/S11.1.1_A1.js b/JSTests/test262/test/language/expressions/this/S11.1.1_A1.js index ac22204c238a..c0b34f336922 100644 --- a/JSTests/test262/test/language/expressions/this/S11.1.1_A1.js +++ b/JSTests/test262/test/language/expressions/this/S11.1.1_A1.js @@ -7,7 +7,7 @@ es5id: 11.1.1_A1 description: Checking if execution of "this=1" fails negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/identifiers/vals-cjk-escaped.js b/JSTests/test262/test/language/identifiers/vals-cjk-escaped.js new file mode 100644 index 000000000000..1270cf142f18 --- /dev/null +++ b/JSTests/test262/test/language/identifiers/vals-cjk-escaped.js @@ -0,0 +1,36 @@ +// Copyright (C) 2019 Student Main. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +info: | + IdentifierName and ReservedWord are tokens that are interpreted according to the + Default Identifier Syntax given in Unicode Standard Annex #31, + Identifier and Pattern Syntax, with some small modifications. +esid: sec-names-and-keywords +description: Check CJK UNIFIED IDEOGRAPH range is correct. +---*/ + +// CJK UNIFIED IDEOGRAPH 4e00-9fff +// u4e00 +var \u4e00 = 1; +assert.sameValue(一, 1); + +// u6c5f, check parser included all CJK range not only first and last +var \u6c5f = 1; +assert.sameValue(江, 1); + +// u9fa5, last character in CJK UNIFIED IDEOGRAPH as for 2019 +var \u9fa5 = 1; +assert.sameValue(龥, 1); + +// CJK UNIFIED IDEOGRAPH EXTENDED A 3400-4dbf +// u3400 +var \u3400 = 1; +assert.sameValue(㐀, 1); + +// u362e +var \u362e = 1; +assert.sameValue(㘮, 1); + +// u4db5, last in CJK UNIFIED IDEOGRAPH EXTENDED A +var \u4db5 = 1; +assert.sameValue(䶵, 1); diff --git a/JSTests/test262/test/language/identifiers/vals-cjk.js b/JSTests/test262/test/language/identifiers/vals-cjk.js new file mode 100644 index 000000000000..819d0b78043d --- /dev/null +++ b/JSTests/test262/test/language/identifiers/vals-cjk.js @@ -0,0 +1,36 @@ +// Copyright (C) 2019 Student Main. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +info: | + IdentifierName and ReservedWord are tokens that are interpreted according to the + Default Identifier Syntax given in Unicode Standard Annex #31, + Identifier and Pattern Syntax, with some small modifications. +esid: sec-names-and-keywords +description: Check CJK UNIFIED IDEOGRAPH range is correct. +---*/ + +// CJK UNIFIED IDEOGRAPH 4e00-9fff +// u4e00 +var 一 = 1; +assert.sameValue(一, 1); + +// u6c5f, check parser included all CJK range not only first and last character +var 江 = 1; +assert.sameValue(江, 1); + +// u9fa5, last character in CJK UNIFIED IDEOGRAPH as for 2019 +var 龥 = 1; +assert.sameValue(龥, 1); + +// CJK UNIFIED IDEOGRAPH EXTENDED A 3400-4dbf +// u3400 +var 㐀 = 1; +assert.sameValue(㐀, 1); + +// u362e +var 㘮 = 1; +assert.sameValue(㘮, 1); + +// u4db5, last in CJK UNIFIED IDEOGRAPH EXTENDED A +var 䶵 = 1; +assert.sameValue(䶵, 1); diff --git a/JSTests/test262/test/language/module-code/instn-resolve-empty-export.js b/JSTests/test262/test/language/module-code/instn-resolve-empty-export.js index 6737bcee5cab..a9017ca11b1a 100644 --- a/JSTests/test262/test/language/module-code/instn-resolve-empty-export.js +++ b/JSTests/test262/test/language/module-code/instn-resolve-empty-export.js @@ -31,7 +31,7 @@ info: | { ExportsList , } negative: phase: resolution - type: ReferenceError + type: SyntaxError flags: [module] ---*/ diff --git a/JSTests/test262/test/language/module-code/instn-resolve-empty-import.js b/JSTests/test262/test/language/module-code/instn-resolve-empty-import.js index c95732e440fa..e1cbf1a8a4de 100644 --- a/JSTests/test262/test/language/module-code/instn-resolve-empty-import.js +++ b/JSTests/test262/test/language/module-code/instn-resolve-empty-import.js @@ -37,7 +37,7 @@ info: | { ImportsList , } negative: phase: resolution - type: ReferenceError + type: SyntaxError flags: [module] ---*/ diff --git a/JSTests/test262/test/language/module-code/instn-resolve-err-reference.js b/JSTests/test262/test/language/module-code/instn-resolve-err-reference.js deleted file mode 100644 index 2efd5196904a..000000000000 --- a/JSTests/test262/test/language/module-code/instn-resolve-err-reference.js +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2016 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: Requested modules that produce an early ReferenceError -esid: sec-moduledeclarationinstantiation -info: | - [...] - 8. For each String required that is an element of - module.[[RequestedModules]] do, - [...] - b. Let requiredModule be ? HostResolveImportedModule(module, required). - [...] -negative: - phase: resolution - type: ReferenceError -flags: [module] ----*/ - -$DONOTEVALUATE(); - -import './instn-resolve-err-reference_FIXTURE.js'; diff --git a/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-1.js b/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-1.js new file mode 100644 index 000000000000..de0f8e0d7886 --- /dev/null +++ b/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-1.js @@ -0,0 +1,21 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: Requested modules that produce an early SyntaxError +esid: sec-moduledeclarationinstantiation +info: | + [...] + 8. For each String required that is an element of + module.[[RequestedModules]] do, + [...] + b. Let requiredModule be ? HostResolveImportedModule(module, required). + [...] +negative: + phase: resolution + type: SyntaxError +flags: [module] +---*/ + +$DONOTEVALUATE(); + +import './instn-resolve-err-syntax-1_FIXTURE.js'; diff --git a/JSTests/test262/test/language/module-code/instn-resolve-err-syntax_FIXTURE.js b/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-1_FIXTURE.js similarity index 100% rename from JSTests/test262/test/language/module-code/instn-resolve-err-syntax_FIXTURE.js rename to JSTests/test262/test/language/module-code/instn-resolve-err-syntax-1_FIXTURE.js diff --git a/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-2.js b/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-2.js new file mode 100644 index 000000000000..e0a619d3f5ea --- /dev/null +++ b/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-2.js @@ -0,0 +1,21 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: Requested modules that produce an early SyntaxError +esid: sec-moduledeclarationinstantiation +info: | + [...] + 8. For each String required that is an element of + module.[[RequestedModules]] do, + [...] + b. Let requiredModule be ? HostResolveImportedModule(module, required). + [...] +negative: + phase: resolution + type: SyntaxError +flags: [module] +---*/ + +$DONOTEVALUATE(); + +import './instn-resolve-err-syntax-2_FIXTURE.js'; diff --git a/JSTests/test262/test/language/module-code/instn-resolve-err-reference_FIXTURE.js b/JSTests/test262/test/language/module-code/instn-resolve-err-syntax-2_FIXTURE.js similarity index 100% rename from JSTests/test262/test/language/module-code/instn-resolve-err-reference_FIXTURE.js rename to JSTests/test262/test/language/module-code/instn-resolve-err-syntax-2_FIXTURE.js diff --git a/JSTests/test262/test/language/module-code/instn-resolve-err-syntax.js b/JSTests/test262/test/language/module-code/instn-resolve-err-syntax.js deleted file mode 100644 index 7c8183ed49df..000000000000 --- a/JSTests/test262/test/language/module-code/instn-resolve-err-syntax.js +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2016 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: Requested modules that produce an early SyntaxError -esid: sec-moduledeclarationinstantiation -info: | - [...] - 8. For each String required that is an element of - module.[[RequestedModules]] do, - [...] - b. Let requiredModule be ? HostResolveImportedModule(module, required). - [...] -negative: - phase: resolution - type: SyntaxError -flags: [module] ----*/ - -$DONOTEVALUATE(); - -import './instn-resolve-err-syntax_FIXTURE.js'; diff --git a/JSTests/test262/test/language/module-code/instn-resolve-order-depth.js b/JSTests/test262/test/language/module-code/instn-resolve-order-depth.js index 275616f4ccc3..1bb0f740f8c7 100644 --- a/JSTests/test262/test/language/module-code/instn-resolve-order-depth.js +++ b/JSTests/test262/test/language/module-code/instn-resolve-order-depth.js @@ -5,7 +5,7 @@ description: Module dependencies are resolved following a depth-first strategy esid: sec-moduledeclarationinstantiation negative: phase: resolution - type: ReferenceError + type: SyntaxError flags: [module] ---*/ diff --git a/JSTests/test262/test/language/module-code/instn-resolve-order-src.js b/JSTests/test262/test/language/module-code/instn-resolve-order-src.js index 0880d85de57f..b8d8b296ab66 100644 --- a/JSTests/test262/test/language/module-code/instn-resolve-order-src.js +++ b/JSTests/test262/test/language/module-code/instn-resolve-order-src.js @@ -5,7 +5,7 @@ description: Modules dependencies are resolved in source text order esid: sec-moduledeclarationinstantiation negative: phase: resolution - type: ReferenceError + type: SyntaxError flags: [module] ---*/ diff --git a/JSTests/test262/test/language/module-code/parse-err-reference.js b/JSTests/test262/test/language/module-code/parse-err-reference.js deleted file mode 100644 index 9a96e685ad38..000000000000 --- a/JSTests/test262/test/language/module-code/parse-err-reference.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (C) 2016 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: Early ReferenceError resulting from module parsing -esid: sec-parsemodule -negative: - phase: parse - type: ReferenceError -info: | - [...] - 2. Parse sourceText using Module as the goal symbol and analyze the parse - result for any Early Error conditions. If the parse was successful and - no early errors were found, let body be the resulting parse tree. - Otherwise, let body be a List of one or more SyntaxError or - ReferenceError objects representing the parsing errors and/or early - errors. -flags: [module] ----*/ - -$DONOTEVALUATE(); - -1++; diff --git a/JSTests/test262/test/language/module-code/parse-err-syntax-1.js b/JSTests/test262/test/language/module-code/parse-err-syntax-1.js new file mode 100644 index 000000000000..d7662458d377 --- /dev/null +++ b/JSTests/test262/test/language/module-code/parse-err-syntax-1.js @@ -0,0 +1,21 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: Early SyntaxError resulting from module parsing +esid: sec-parsemodule +negative: + phase: parse + type: SyntaxError +info: | + [...] + 2. Parse sourceText using Module as the goal symbol and analyze the parse + result for any Early Error conditions. If the parse was successful and + no early errors were found, let body be the resulting parse tree. + Otherwise, let body be a List of one or more SyntaxError objects + representing the parsing errors and/or early errors. +flags: [module] +---*/ + +$DONOTEVALUATE(); + +? diff --git a/JSTests/test262/test/language/module-code/parse-err-syntax-2.js b/JSTests/test262/test/language/module-code/parse-err-syntax-2.js new file mode 100644 index 000000000000..3cd7bdeab3e4 --- /dev/null +++ b/JSTests/test262/test/language/module-code/parse-err-syntax-2.js @@ -0,0 +1,21 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +description: Early SyntaxError resulting from module parsing +esid: sec-parsemodule +negative: + phase: parse + type: SyntaxError +info: | + [...] + 2. Parse sourceText using Module as the goal symbol and analyze the parse + result for any Early Error conditions. If the parse was successful and + no early errors were found, let body be the resulting parse tree. + Otherwise, let body be a List of one or more SyntaxError objects + representing the parsing errors and/or early errors. +flags: [module] +---*/ + +$DONOTEVALUATE(); + +1++; diff --git a/JSTests/test262/test/language/module-code/parse-err-syntax.js b/JSTests/test262/test/language/module-code/parse-err-syntax.js deleted file mode 100644 index 96b79a25535c..000000000000 --- a/JSTests/test262/test/language/module-code/parse-err-syntax.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (C) 2016 the V8 project authors. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. -/*--- -description: Early SyntaxError resulting from module parsing -esid: sec-parsemodule -negative: - phase: parse - type: SyntaxError -info: | - [...] - 2. Parse sourceText using Module as the goal symbol and analyze the parse - result for any Early Error conditions. If the parse was successful and - no early errors were found, let body be the resulting parse tree. - Otherwise, let body be a List of one or more SyntaxError or - ReferenceError objects representing the parsing errors and/or early - errors. -flags: [module] ----*/ - -$DONOTEVALUATE(); - -? diff --git a/JSTests/test262/test/language/statements/class/elements/class-field-is-observable-by-proxy.js b/JSTests/test262/test/language/statements/class/elements/class-field-is-observable-by-proxy.js new file mode 100644 index 000000000000..75bf3b62e700 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/class-field-is-observable-by-proxy.js @@ -0,0 +1,46 @@ +// Copyright (C) 2019 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Public class fields initialization calls [[DefineOwnProperty]] +esid: sec-define-field +info: | + DefineField(receiver, fieldRecord) + ... + 8. If fieldName is a Private Name, + a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue). + 9. Else, + a. Assert: IsPropertyKey(fieldName) is true. + b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue). + 10. Return. +includes: [compareArray.js] +features: [class, class-fields-public, Proxy] +---*/ + +let arr = []; +let expectedTarget = null; +function ProxyBase() { + expectedTarget = this; + return new Proxy(this, { + defineProperty: function (target, key, descriptor) { + arr.push(key); + arr.push(descriptor.value); + arr.push(target); + assert.sameValue(descriptor.enumerable, true); + assert.sameValue(descriptor.configurable, true); + assert.sameValue(descriptor.writable, true); + return Reflect.defineProperty(target, key, descriptor); + } + }); +} + +class Test extends ProxyBase { + f = 3; + g = "Test262"; +} + +let t = new Test(); +assert.sameValue(t.f, 3); +assert.sameValue(t.g, "Test262"); + +assert.compareArray(arr, ["f", 3, expectedTarget, "g", "Test262", expectedTarget]); diff --git a/JSTests/test262/test/language/statements/class/elements/class-field-on-frozen-objects.js b/JSTests/test262/test/language/statements/class/elements/class-field-on-frozen-objects.js new file mode 100644 index 000000000000..424eb35db5e4 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/class-field-on-frozen-objects.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Public class field initialization fails on frozen object +esid: sec-define-field +info: | + DefineField(receiver, fieldRecord) + ... + 8. If fieldName is a Private Name, + a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue). + 9. Else, + a. Assert: IsPropertyKey(fieldName) is true. + b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue). + 10. Return. +includes: [compareArray.js] +features: [class, class-fields-public] +flags: [onlyStrict] +---*/ + +class Test { + f = Object.freeze(this); + g = "Test262"; +} + +assert.throws(TypeError, function() { + new Test(); +}, "Frozen objects can't be changed"); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..7944b8afac67 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-contains-superproperty-1.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-decl-fields-eval.template +/*--- +description: super.x in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + x = eval('executed = true; super.x;'); +} + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..3ad38bc695f1 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-contains-superproperty-2.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-decl-fields-eval.template +/*--- +description: super['x'] in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + x = eval('executed = true; super["x"];'); +} + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-err-contains-superproperty-1.js deleted file mode 100644 index 355681efb4aa..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,34 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-decl-fields-eval.template -/*--- -description: error if `super.x` in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - x = eval('executed = true; super.x;'); -} - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-err-contains-superproperty-2.js deleted file mode 100644 index 4ed773ad4413..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/derived-cls-direct-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,31 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-decl-fields-eval.template -/*--- -description: error if super['x'] in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - x = eval('executed = true; super["x"];'); -} - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..247dac0623f3 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-contains-superproperty-1.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-decl-fields-indirect-eval.template +/*--- +description: super.x in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + x = (0, eval)('executed = true; super.x;'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..51c9f88172c3 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-contains-superproperty-2.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-decl-fields-indirect-eval.template +/*--- +description: super['x'] in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + x = (0, eval)('executed = true; super["x"];'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-err-contains-superproperty-1.js deleted file mode 100644 index d41240f1ac76..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,36 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-decl-fields-indirect-eval.template -/*--- -description: error if `super.x` in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - x = (0, eval)('executed = true; super.x;'); -} - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-err-contains-superproperty-2.js deleted file mode 100644 index 71649ec3512f..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/derived-cls-indirect-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,33 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-decl-fields-indirect-eval.template -/*--- -description: error if super['x'] in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - x = (0, eval)('executed = true; super["x"];'); -} - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js index d68d07423505..6361a95580ca 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - ZWJ (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js index 2433117af0c1..4ef6dbd18cee 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-ZWNJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - ZWNJ (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js index 3fc8b0ab384b..5c8d2307422a 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u2118.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - u2118 (℘) (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js index 5b85c4fe6fad..96b979767f05 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-escape-sequence-u6F.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - u6F (o) (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWJ.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWJ.js index 06716aec3aeb..242c8a99d511 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWJ.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - ZWJ (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWNJ.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWNJ.js index 9e739658ca65..6b09197ecfe1 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWNJ.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-ZWNJ.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - ZWNJ (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-common.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-common.js index 364b0d41538b..9d9addde21af 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-common.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-common.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - common (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-dollar.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-dollar.js index 586222d83666..2004b81103b4 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-dollar.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-dollar.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - $ (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-u2118.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-u2118.js index 09af0ff38ee1..f5026b28e40d 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-u2118.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-u2118.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - ℘ (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-underscore.js b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-underscore.js index 9a5373d8fbb6..eacb64bc7bf6 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-underscore.js +++ b/JSTests/test262/test/language/statements/class/elements/private-accessor-name/static-private-name-underscore.js @@ -3,7 +3,7 @@ // - src/accessor-names/private/cls-private-decl-static.template /*--- description: Private IdentifierName - _ (Class declaration, static method) -features: [class-methods-private] +features: [class-static-methods-private] flags: [generated] info: | ClassElement : diff --git a/JSTests/test262/test/language/statements/class/elements/private-class-field-on-frozen-objects.js b/JSTests/test262/test/language/statements/class/elements/private-class-field-on-frozen-objects.js new file mode 100644 index 000000000000..5eb8431e641d --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-class-field-on-frozen-objects.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: It is possible to add private fields on frozen objects +esid: sec-define-field +info: | + DefineField(receiver, fieldRecord) + ... + 8. If fieldName is a Private Name, + a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue). + 9. Else, + a. Assert: IsPropertyKey(fieldName) is true. + b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue). + 10. Return. +includes: [compareArray.js] +features: [class, class-fields-private, class-fields-public] +flags: [onlyStrict] +---*/ + +class Test { + f = this; + #g = (Object.freeze(this), "Test262"); + + get g() { + return this.#g; + } +} + +let t = new Test(); +assert.sameValue(t.f, t); +assert.sameValue(t.g, "Test262"); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..4b975270be92 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-contains-superproperty-1.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-eval.template +/*--- +description: super.x in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + #x = eval('executed = true; super.x;'); +} + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..fb68ee68d46c --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-contains-superproperty-2.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-eval.template +/*--- +description: super['x'] in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + #x = eval('executed = true; super["x"];'); +} + +new C(); + +assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-1.js deleted file mode 100644 index c3fbed538493..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,34 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-eval.template -/*--- -description: error if `super.x` in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - #x = eval('executed = true; super.x;'); -} - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-2.js deleted file mode 100644 index 3cfa8c99b66d..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-direct-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,31 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-eval.template -/*--- -description: error if super['x'] in StatementList of eval (direct eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - #x = eval('executed = true; super["x"];'); -} - -new C(); - -assert.sameValue(executed, true); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-contains-superproperty-1.js new file mode 100644 index 000000000000..ff5b39962ca7 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-contains-superproperty-1.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-1.case +// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-indirect-eval.template +/*--- +description: super.x in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + #x = (0, eval)('executed = true; super.x;'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-contains-superproperty-2.js new file mode 100644 index 000000000000..3ca538ef8e39 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-contains-superproperty-2.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/eval-contains-superproperty-2.case +// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-indirect-eval.template +/*--- +description: super['x'] in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Methods + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList + + It is a Syntax Error if StatementList Contains SuperProperty. + +---*/ + + +var executed = false; +class A {} +class C extends A { + #x = (0, eval)('executed = true; super["x"];'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-1.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-1.js deleted file mode 100644 index 00ef238a0034..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-1.js +++ /dev/null @@ -1,36 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-1.case -// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-indirect-eval.template -/*--- -description: error if `super.x` in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - #x = (0, eval)('executed = true; super.x;'); -} - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-2.js b/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-2.js deleted file mode 100644 index babca7e45f28..000000000000 --- a/JSTests/test262/test/language/statements/class/elements/private-derived-cls-indirect-eval-err-contains-superproperty-2.js +++ /dev/null @@ -1,33 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-elements/eval-err-contains-superproperty-2.case -// - src/class-elements/initializer-eval-super-property/cls-decl-private-fields-indirect-eval.template -/*--- -description: error if super['x'] in StatementList of eval (indirect eval) -esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, class-fields-private] -flags: [generated] -info: | - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - - Additional Early Error Rules for Eval Outside Methods - - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - - ScriptBody : StatementList - - It is a Syntax Error if StatementList Contains SuperProperty. - ----*/ - - -var executed = false; -class A {} -class C extends A { - #x = (0, eval)('executed = true; super["x"];'); -} - -assert.throws(SyntaxError, function() { - new C(); -}); - -assert.sameValue(executed, false); diff --git a/JSTests/test262/test/language/statements/class/elements/private-field-access-on-inner-arrow-function.js b/JSTests/test262/test/language/statements/class/elements/private-field-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..3c626db89e58 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-field-access-on-inner-arrow-function.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-field-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private field is visible on inner arrow function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-fields-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #f = 'Test262'; + + method() { + let arrowFunction = () => { + return this.#f; + } + + return arrowFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private field from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-field-access-on-inner-function.js b/JSTests/test262/test/language/statements/class/elements/private-field-access-on-inner-function.js new file mode 100644 index 000000000000..0e5e308525fb --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-field-access-on-inner-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-field-access-on-inner-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private field is visible on inner function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-fields-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #f = 'Test262'; + + method() { + let self = this; + function innerFunction() { + return self.#f; + } + + return innerFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private field from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-field-is-not-clobbered-by-computed-property.js b/JSTests/test262/test/language/statements/class/elements/private-field-is-not-clobbered-by-computed-property.js new file mode 100644 index 000000000000..7148cde7a30b --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-field-is-not-clobbered-by-computed-property.js @@ -0,0 +1,43 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private field is not clobbered by computed property +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). +features: [class-fields-public, class-fields-private, class] +---*/ + +class C { + #m = 44; + ["#m"] = this.#m / 11; + + checkPrivateField() { + assert.sameValue(this.hasOwnProperty("#m"), true); + assert.sameValue("#m" in this, true); + + assert.sameValue(this["#m"], 4); + + assert.sameValue(this.#m, 44); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateField(), 0); diff --git a/JSTests/test262/test/language/statements/class/elements/private-field-visible-to-direct-eval-on-initializer.js b/JSTests/test262/test/language/statements/class/elements/private-field-visible-to-direct-eval-on-initializer.js new file mode 100644 index 000000000000..f772fa6430df --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-field-visible-to-direct-eval-on-initializer.js @@ -0,0 +1,47 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private field is visible on initializer with direct eval +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-fields-private, class-fields-public, class] +---*/ + +class C { + #m = 44; + v = eval("this.#m"); +} + +let c = new C(); +assert.sameValue(c.v, 44); diff --git a/JSTests/test262/test/language/statements/class/elements/private-field-visible-to-direct-eval.js b/JSTests/test262/test/language/statements/class/elements/private-field-visible-to-direct-eval.js new file mode 100644 index 000000000000..003332cf67e3 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-field-visible-to-direct-eval.js @@ -0,0 +1,59 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private field is visible to direct eval code +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-fields-private, class] +---*/ + +class C { + #m = 44; + + getWithEval() { + return eval("this.#m"); + } +} + +class D { + #m = 44; +} + +let c = new C(); +assert.sameValue(c.getWithEval(), 44); + +let d = new D(); +assert.throws(TypeError, function() { + c.getWithEval.call(d); +}, "invalid access to a private field"); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-access-on-inner-arrow-function.js b/JSTests/test262/test/language/statements/class/elements/private-getter-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..087142eb9364 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-access-on-inner-arrow-function.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private getter is visible on inner arrow function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + get #m() { return 'Test262'; } + + method() { + let arrowFunction = () => { + return this.#m; + } + + return arrowFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private accessor from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-access-on-inner-function.js b/JSTests/test262/test/language/statements/class/elements/private-getter-access-on-inner-function.js new file mode 100644 index 000000000000..2e7fafb20ad7 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-access-on-inner-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-access-on-inner-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private getter is visible on inner function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + get #m() { return 'Test262'; } + + method() { + let self = this; + function innerFunction() { + return self.#m; + } + + return innerFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private accessor from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js b/JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js index b20ba4563003..2774984b193c 100644 --- a/JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-brand-check-multiple-evaluations-of-class.js @@ -22,12 +22,12 @@ features: [class, class-methods-private] let createAndInstantiateClass = function () { class C { get #m() { return 'test262'; } - + access(o) { return o.#m; } } - + let c = new C(); return c; }; diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-is-not-a-own-property.js b/JSTests/test262/test/language/statements/class/elements/private-getter-is-not-a-own-property.js new file mode 100644 index 000000000000..03ddc9acfb87 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-is-not-a-own-property.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-is-not-a-own-property.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private getter is not stored as an own property of objects (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + +---*/ + + +class C { + get #m() { return "Test262"; } + + checkPrivateGetter() { + assert.sameValue(this.hasOwnProperty("#m"), false); + assert.sameValue("#m" in this, false); + + assert.sameValue(this.__lookupGetter__("#m"), undefined); + + assert.sameValue(this.#m, "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateGetter(), 0); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-is-not-clobbered-by-computed-property.js b/JSTests/test262/test/language/statements/class/elements/private-getter-is-not-clobbered-by-computed-property.js new file mode 100644 index 000000000000..60adabb6162e --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-is-not-clobbered-by-computed-property.js @@ -0,0 +1,43 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private getter is not clobbered by computed property +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). +features: [class-methods-private, class-fields-public, class] +---*/ + +class C { + get #m() { return "Test262"; } + ["#m"] = 0; + + checkPrivateGetter() { + assert.sameValue(this.hasOwnProperty("#m"), true); + assert.sameValue("#m" in this, true); + + assert.sameValue(this["#m"], 0); + + assert.sameValue(this.#m, "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateGetter(), 0); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-getter-on-nested-class.js new file mode 100644 index 000000000000..152368822f9d --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-on-nested-class.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private getter is available on inner classes (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + get #m() { return 'test262'; } + + B = class { + method(o) { + return o.#m; + } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(c), 'test262'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-field-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-field-on-nested-class.js new file mode 100644 index 000000000000..ef7da46cccaa --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-field-on-nested-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-field-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private getter can be shadowed on inner classes by a private field (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + get #m() { return 'outer class'; } + + method() { return this.#m; } + + B = class { + method(o) { + return o.#m; + } + + #m = 'test262'; + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class field from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-getter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-getter-on-nested-class.js new file mode 100644 index 000000000000..d7605389b710 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-getter-on-nested-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-getter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private getter can be shadowed on inner classes by a private getter (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + get #m() { return 'outer class'; } + + method() { return this.#m; } + + B = class { + method(o) { + return o.#m; + } + + get #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class getter from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-method-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-method-on-nested-class.js new file mode 100644 index 000000000000..b65909eb9785 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-method-on-nested-class.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-method-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private getter can be shadowed on inner class by a private method (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + get #m() { throw new Test262Error(); } + + B = class { + method(o) { + return o.#m(); + } + + #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class method from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-setter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-setter-on-nested-class.js new file mode 100644 index 000000000000..f387f03ac340 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-shadowed-by-setter-on-nested-class.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-getter-shadowed-by-setter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private getter can be shadowed on inner classes by a private setter (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + get #m() { return 'outer class'; } + + method() { return this.#m; } + + B = class { + method(o) { + return o.#m; + } + + set #m(v) { this._v = v; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB); +}, '[[Get]] operation of an accessor without getter'); + +assert.sameValue(c.method(), 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'access of inner class accessor from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval-on-initializer.js b/JSTests/test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval-on-initializer.js new file mode 100644 index 000000000000..e7310eb7b8c6 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval-on-initializer.js @@ -0,0 +1,47 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private getter is visible on initializer with direct eval +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-methods-private, class-fields-public, class] +---*/ + +class C { + get #m() { return "Test262"; }; + v = eval("this.#m"); +} + +let c = new C(); +assert.sameValue(c.v, "Test262"); diff --git a/JSTests/test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval.js b/JSTests/test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval.js new file mode 100644 index 000000000000..b4d575f500b5 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-getter-visible-to-direct-eval.js @@ -0,0 +1,59 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private getter is visible to direct eval code +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-methods-private, class] +---*/ + +class C { + get #m() { return "Test262"; }; + + getWithEval() { + return eval("this.#m"); + } +} + +class D { + get #m() { throw new Test262Error(); }; +} + +let c = new C(); +assert.sameValue(c.getWithEval(), "Test262"); + +let d = new D(); +assert.throws(TypeError, function() { + c.getWithEval.call(d); +}, "invalid access to a private getter"); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-access-on-inner-arrow-function.js b/JSTests/test262/test/language/statements/class/elements/private-method-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..488df0afcbf8 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-access-on-inner-arrow-function.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private method is visible on inner arrow function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #m() { return 'Test262'; } + + method() { + let arrowFunction = () => { + return this.#m(); + } + + return arrowFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private method from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-access-on-inner-function.js b/JSTests/test262/test/language/statements/class/elements/private-method-access-on-inner-function.js new file mode 100644 index 000000000000..b672931c77bb --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-access-on-inner-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-access-on-inner-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private method is visible on inner function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #m() { return 'Test262'; } + + method() { + let self = this; + function innerFunction() { + return self.#m(); + } + + return innerFunction(); + } +} + +let c = new C(); +assert.sameValue(c.method(), 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private method from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-comparison-multiple-evaluations-of-class.js b/JSTests/test262/test/language/statements/class/elements/private-method-comparison-multiple-evaluations-of-class.js new file mode 100644 index 000000000000..14ca56857d9a --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-comparison-multiple-evaluations-of-class.js @@ -0,0 +1,45 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Every new evaluation of a class creates a different brand (private getter) +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +features: [class, class-methods-private] +---*/ + +let createAndInstantiateClass = function () { + class C { + #m() { return 'test262'; } + + getPrivateMethod() { + return this.#m; + } + } + + return new C(); +}; + +let c1 = createAndInstantiateClass(); +let c2 = createAndInstantiateClass(); + +assert.notSameValue(c1.getPrivateMethod(), c2.getPrivateMethod()); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-comparison.js b/JSTests/test262/test/language/statements/class/elements/private-method-comparison.js new file mode 100644 index 000000000000..eda852a60adf --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-comparison.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-comparison.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateFieldGet of a private method returns the same function object to every instance of the same class (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class, class-methods-private] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. + +---*/ + + +class C { + #m() { return 'test262'; } + + getPrivateMethod() { + return this.#m; + } + +} + +let c1 = new C(); +let c2 = new C(); + +assert.sameValue(c1.getPrivateMethod(), c2.getPrivateMethod()); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-get-and-call.js b/JSTests/test262/test/language/statements/class/elements/private-method-get-and-call.js new file mode 100644 index 000000000000..02fb12c2fd41 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-get-and-call.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-get-and-call.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Function returned by a private method can be called with other values as 'this' (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class, class-methods-private] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. + +---*/ + + +class C { + #m() { return this._v; } + + getPrivateMethod() { + return this.#m; + } + +} + +let c = new C(); + +let o1 = {_v: 'test262'}; +let o2 = {_v: 'foo'}; +assert.sameValue(c.getPrivateMethod().call(o1), 'test262'); +assert.sameValue(c.getPrivateMethod().call(o2), 'foo'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-is-not-a-own-property.js b/JSTests/test262/test/language/statements/class/elements/private-method-is-not-a-own-property.js new file mode 100644 index 000000000000..3f4570191e08 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-is-not-a-own-property.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-is-not-a-own-property.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private method is not stored as an own property of objects (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + +---*/ + + +class C { + #m() { return "Test262"; } + + checkPrivateMethod() { + assert.sameValue(this.hasOwnProperty("#m"), false); + assert.sameValue("#m" in this, false); + + assert.sameValue(this.#m(), "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateMethod(), 0); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-is-not-clobbered-by-computed-property.js b/JSTests/test262/test/language/statements/class/elements/private-method-is-not-clobbered-by-computed-property.js new file mode 100644 index 000000000000..a5a0a0cbbe6b --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-is-not-clobbered-by-computed-property.js @@ -0,0 +1,43 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private method is not clobbered by computed property +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). +features: [class-methods-private, class-fields-public, class] +---*/ + +class C { + #m() { return "Test262"; } + ["#m"] = 0; + + checkPrivateMethod() { + assert.sameValue(this.hasOwnProperty("#m"), true); + assert.sameValue("#m" in this, true); + + assert.sameValue(this["#m"], 0); + + assert.sameValue(this.#m(), "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateMethod(), 0); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-method-on-nested-class.js new file mode 100644 index 000000000000..306d61a8d1d2 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-on-nested-class.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private method is available on inner classes (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #m() { return 'test262'; } + + B = class { + method(o) { + return o.#m(); + } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(c), 'test262'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-field-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-field-on-nested-class.js new file mode 100644 index 000000000000..2314ab7e7991 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-field-on-nested-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-by-field-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private method can be shadowed on inner classes by a private field (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #m() { return 'outer class'; } + + method() { return this.#m(); } + + B = class { + method(o) { + return o.#m; + } + + #m = 'test262'; + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class field from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-getter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-getter-on-nested-class.js new file mode 100644 index 000000000000..4a25c348b42e --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-getter-on-nested-class.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-by-getter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private method can be shadowed on inner classes by a private getter (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #m() { return 'outer class'; } + + method() { return this.#m(); } + + B = class { + method(o) { + return o.#m; + } + + get #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(innerB), 'test262'); +assert.sameValue(c.method(), 'outer class'); +assert.throws(TypeError, function() { + innerB.method(c); +}, 'accessed inner class getter from an object of outer class'); +assert.throws(TypeError, function() { + C.prototype.method.call(innerB); +}); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-setter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-setter-on-nested-class.js new file mode 100644 index 000000000000..062c3d38d6ca --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-by-setter-on-nested-class.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-by-setter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private method can be shadowed on inner classes by a private setter (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #m() { return 'outer class'; } + + method() { return this.#m(); } + + B = class { + method(o) { + return o.#m; + } + + set #m(v) { this._v = v; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB); +}, '[[Get]] operation of an accessor without getter'); + +assert.sameValue(c.method(), 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'access of inner class accessor from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-on-nested-class.js new file mode 100644 index 000000000000..e7b2308f169a --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-shadowed-on-nested-class.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-method-shadowed-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private method can be shadowed by inner class private method (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + #m() { throw new Test262Error(); } + + B = class { + method() { + return this.#m(); + } + + #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); +assert.sameValue(innerB.method(), 'test262'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-visible-to-direct-eval-on-initializer.js b/JSTests/test262/test/language/statements/class/elements/private-method-visible-to-direct-eval-on-initializer.js new file mode 100644 index 000000000000..c11a11feb93b --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-visible-to-direct-eval-on-initializer.js @@ -0,0 +1,47 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private method is visible on initializer with direct eval +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-methods-private, class-fields-public, class] +---*/ + +class C { + #m() { return "Test262"; }; + v = eval("this.#m()"); +} + +let c = new C(); +assert.sameValue(c.v, "Test262"); diff --git a/JSTests/test262/test/language/statements/class/elements/private-method-visible-to-direct-eval.js b/JSTests/test262/test/language/statements/class/elements/private-method-visible-to-direct-eval.js new file mode 100644 index 000000000000..fb84f0162a25 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-method-visible-to-direct-eval.js @@ -0,0 +1,59 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private method is visible to direct eval code +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-methods-private, class] +---*/ + +class C { + #m() { return "Test262"; }; + + getWithEval() { + return eval("this.#m()"); + } +} + +class D { + #m() { throw new Test262Error(); }; +} + +let c = new C(); +assert.sameValue(c.getWithEval(), "Test262"); + +let d = new D(); +assert.throws(TypeError, function() { + c.getWithEval.call(d); +}, "invalid access to a private method"); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-access-on-inner-arrow-function.js b/JSTests/test262/test/language/statements/class/elements/private-setter-access-on-inner-arrow-function.js new file mode 100644 index 000000000000..640996d1e2f7 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-access-on-inner-arrow-function.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-access-on-inner-arrow-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private setter is visible on inner arrow function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + set #m(v) { this._v = v; } + + method() { + let arrowFunction = () => { + this.#m = 'Test262'; + } + + arrowFunction(); + } +} + +let c = new C(); +c.method(); +assert.sameValue(c._v, 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private setter from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-access-on-inner-function.js b/JSTests/test262/test/language/statements/class/elements/private-setter-access-on-inner-function.js new file mode 100644 index 000000000000..3ea9a612ad3d --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-access-on-inner-function.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-access-on-inner-function.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private setter is visible on inner function of class scope (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + set #m(v) { this._v = v; } + + method() { + let self = this; + function innerFunction() { + self.#m = 'Test262'; + } + + innerFunction(); + } +} + +let c = new C(); +c.method(); +assert.sameValue(c._v, 'Test262'); +let o = {}; +assert.throws(TypeError, function() { + c.method.call(o); +}, 'accessed private setter from an ordinary object'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-is-not-a-own-property.js b/JSTests/test262/test/language/statements/class/elements/private-setter-is-not-a-own-property.js new file mode 100644 index 000000000000..4b1ad372ec81 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-is-not-a-own-property.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-is-not-a-own-property.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private setter is not stored as an own property of objects (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). + +---*/ + + +class C { + set #m(v) { this._v = v; } + + checkPrivateSetter() { + assert.sameValue(this.hasOwnProperty("#m"), false); + assert.sameValue("#m" in this, false); + + assert.sameValue(this.__lookupSetter__("#m"), undefined); + + this.#m = "Test262"; + assert.sameValue(this._v, "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateSetter(), 0); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-is-not-clobbered-by-computed-property.js b/JSTests/test262/test/language/statements/class/elements/private-setter-is-not-clobbered-by-computed-property.js new file mode 100644 index 000000000000..d00cc733d1d2 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-is-not-clobbered-by-computed-property.js @@ -0,0 +1,44 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private setter is not clobbered by computed property +esid: sec-privatefieldget +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Return entry.[[PrivateFieldValue]]. + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + 6. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If P does not have a [[Get]] field, throw a TypeError exception. + c. Let getter be P.[[Get]]. + d. Return ? Call(getter, O). +features: [class-methods-private, class-fields-public, class] +---*/ + +class C { + set #m(v) { this._v = v; } + ["#m"] = 0; + + checkPrivateSetter() { + assert.sameValue(this.hasOwnProperty("#m"), true); + assert.sameValue("#m" in this, true); + + assert.sameValue(this["#m"], 0); + + this.#m = "Test262"; + assert.sameValue(this._v, "Test262"); + + return 0; + } +} + +let c = new C(); +assert.sameValue(c.checkPrivateSetter(), 0); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-setter-on-nested-class.js new file mode 100644 index 000000000000..debaab2c7f62 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-on-nested-class.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private setter is available on inner classes (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + set #m(v) { this._v = v; } + + B = class { + method(o, v) { + o.#m = v; + } + } +} + +let c = new C(); +let innerB = new c.B(); +innerB.method(c, 'test262'); +assert.sameValue(c._v, 'test262'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-field-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-field-on-nested-class.js new file mode 100644 index 000000000000..17cf279dbd3a --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-field-on-nested-class.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-field-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private setter can be shadowed on inner classes by a private field (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + get m() { return this.#m; } + + #m; + } +} + +let c = new C(); +let innerB = new c.B(); + +innerB.method(innerB, 'test262'); +assert.sameValue(innerB.m, 'test262'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c, 'foo'); +}, 'accessed inner class field from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-getter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-getter-on-nested-class.js new file mode 100644 index 000000000000..0c7fa6705bdf --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-getter-on-nested-class.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-getter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private setter can be shadowed on inner classes by a private getter (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + get #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB); +}, 'invalid [[Set]] of an acessor without setter'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'invalid access of inner class getter from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-method-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-method-on-nested-class.js new file mode 100644 index 000000000000..c4903ef99e8f --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-method-on-nested-class.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-method-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private setter can be shadowed on inner class by a private method (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + #m() { return 'test262'; } + } +} + +let c = new C(); +let innerB = new c.B(); + +assert.throws(TypeError, function() { + innerB.method(innerB, 'foo'); +}, 'invalid [[Set]] operation in a private method'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c); +}, 'invalid access of inner class method from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-setter-on-nested-class.js b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-setter-on-nested-class.js new file mode 100644 index 000000000000..3e113f69150e --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-shadowed-by-setter-on-nested-class.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/private-setter-shadowed-by-setter-on-nested-class.case +// - src/class-elements/default/cls-decl.template +/*--- +description: PrivateName of private setter can be shadowed on inner classes by a private setter (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + Updated Productions + + CallExpression[Yield, Await]: + CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] + SuperCall[?Yield, ?Await] + CallExpression[?Yield, ?Await]Arguments[?Yield, ?Await] + CallExpression[?Yield, ?Await][Expression[+In, ?Yield, ?Await]] + CallExpression[?Yield, ?Await].IdentifierName + CallExpression[?Yield, ?Await]TemplateLiteral[?Yield, ?Await] + CallExpression[?Yield, ?Await].PrivateName + +---*/ + + +class C { + set #m(v) { this._v = v; } + + method(v) { this.#m = v; } + + B = class { + method(o, v) { + o.#m = v; + } + + set #m(v) { this._v = v; } + } +} + +let c = new C(); +let innerB = new c.B(); + +innerB.method(innerB, 'test262'); +assert.sameValue(innerB._v, 'test262'); + +c.method('outer class'); +assert.sameValue(c._v, 'outer class'); + +assert.throws(TypeError, function() { + innerB.method(c, 'foo'); +}, 'access of inner class accessor from an object of outer class'); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval-on-initializer.js b/JSTests/test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval-on-initializer.js new file mode 100644 index 000000000000..50cfcbacd082 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval-on-initializer.js @@ -0,0 +1,48 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private setter is visible on initializer with direct eval +esid: sec-privatefieldset +info: | + PrivateFieldSet (P, O, value ) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Set entry.[[PrivateFieldValue]] to value. + d. Return. + 4. If P.[[Kind]] is "method", throw a TypeError exception. + 5. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If O.[[PrivateFieldBrands]] does not contain P.[[Brand]], throw a TypeError exception. + c. If P does not have a [[Set]] field, throw a TypeError exception. + d. Let setter be P.[[Set]]. + e. Perform ? Call(setter, O, value). + f. Return. + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-fields-public, class-methods-private, class] +---*/ + +class C { + set #m(v) { this._v = v; }; + v = (eval("this.#m = 53"), this._v); +} + +let c = new C(); +assert.sameValue(c.v, 53); diff --git a/JSTests/test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval.js b/JSTests/test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval.js new file mode 100644 index 000000000000..d39734b02177 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/private-setter-visible-to-direct-eval.js @@ -0,0 +1,61 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private setter is visible to direct eval code +esid: sec-privatefieldset +info: | + PrivateFieldSet (P, O, value ) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + a. Let entry be PrivateFieldFind(P, O). + b. If entry is empty, throw a TypeError exception. + c. Set entry.[[PrivateFieldValue]] to value. + d. Return. + 4. If P.[[Kind]] is "method", throw a TypeError exception. + 5. Else, + a. Assert: P.[[Kind]] is "accessor". + b. If O.[[PrivateFieldBrands]] does not contain P.[[Brand]], throw a TypeError exception. + c. If P does not have a [[Set]] field, throw a TypeError exception. + d. Let setter be P.[[Set]]. + e. Perform ? Call(setter, O, value). + f. Return. + + ClassElementName : PrivateIdentifier + 1. Let privateIdentifier be StringValue of PrivateIdentifier. + 2. Let privateName be NewPrivateName(privateIdentifier). + 3. Let scope be the running execution context's PrivateEnvironment. + 4. Let scopeEnvRec be scope's EnvironmentRecord. + 5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName). + 6. Return privateName. + + MakePrivateReference ( baseValue, privateIdentifier ) + 1. Let env be the running execution context's PrivateEnvironment. + 2. Let privateNameBinding be ? ResolveBinding(privateIdentifier, env). + 3. Let privateName be GetValue(privateNameBinding). + 4. Assert: privateName is a Private Name. + 5. Return a value of type Reference whose base value is baseValue, whose referenced name is privateName, whose strict reference flag is true. +features: [class-methods-private, class] +---*/ + +class C { + set #m(v) { this._v = v; }; + + setWithEval(v) { + eval("this.#m = v"); + } +} + +class D { + set #m(v) { throw new Test262Error(); }; +} + +let c = new C(); +c.setWithEval("Test262"); +assert.sameValue(c._v, "Test262"); + +let d = new D(); +assert.throws(TypeError, function() { + c.setWithEval.call(d); +}, "invalid access to a private setter"); diff --git a/JSTests/test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-constructor.js b/JSTests/test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-constructor.js new file mode 100644 index 000000000000..44469c960075 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-constructor.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-getter-before-super-return-in-constructor.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private getters are installed "when super returns" and no earlier (call in constructor) (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +class C { + constructor() { + this.f(); + } + +} + +class D extends C { + f() { this.#m; } + get #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('f')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private getters are not installed before super returns'); diff --git a/JSTests/test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-field-initializer.js b/JSTests/test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-field-initializer.js new file mode 100644 index 000000000000..d80d775e3486 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/prod-private-getter-before-super-return-in-field-initializer.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-getter-before-super-return-in-field-initializer.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private getters are installed "when super returns" and no earlier (call in field initializer) (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +class C { + f = this.g(); + +} + +class D extends C { + g() { this.#m; } + get #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('g')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private getters are not installed before super returns'); diff --git a/JSTests/test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-constructor.js b/JSTests/test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-constructor.js new file mode 100644 index 000000000000..8f113aff876e --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-constructor.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-method-before-super-return-in-constructor.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private methods are installed "when super returns" and no earlier (call in constructor) (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +class C { + constructor() { + this.f(); + } + +} + +class D extends C { + f() { this.#m(); } + #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('f')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private methods are not installed before super returns'); diff --git a/JSTests/test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-field-initializer.js b/JSTests/test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-field-initializer.js new file mode 100644 index 000000000000..dd8405b73118 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/prod-private-method-before-super-return-in-field-initializer.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-method-before-super-return-in-field-initializer.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private methods are installed "when super returns" and no earlier (call in field initializer) (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +class C { + f = this.g(); + +} + +class D extends C { + g() { this.#m(); } + #m() { return 42; } +} + +assert(D.prototype.hasOwnProperty('g')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private methods are not installed before super returns'); diff --git a/JSTests/test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-constructor.js b/JSTests/test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-constructor.js new file mode 100644 index 000000000000..e1396b81659c --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-constructor.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-setter-before-super-return-in-constructor.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private setters are installed "when super returns" and no earlier (call in constructor) (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +class C { + constructor() { + this.f(); + } + +} + +class D extends C { + f() { this.#m = 42; } + set #m(val) {} +} + +assert(D.prototype.hasOwnProperty('f')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private setters are not installed before super returns'); diff --git a/JSTests/test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-field-initializer.js b/JSTests/test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-field-initializer.js new file mode 100644 index 000000000000..f5ec8e1f298f --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/prod-private-setter-before-super-return-in-field-initializer.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/class-elements/prod-private-setter-before-super-return-in-field-initializer.case +// - src/class-elements/default/cls-decl.template +/*--- +description: Private settters are installed "when super returns" and no earlier (call in field initializer) (field definitions in a class declaration) +esid: prod-FieldDefinition +features: [class-methods-private, class-fields-public, class] +flags: [generated] +info: | + SuperCall: super Arguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceElements(result, F). + + EDITOR'S NOTE: + Private fields are added to the object one by one, interspersed with + evaluation of the initializers, following the construction of the + receiver. These semantics allow for a later initializer to refer to + a previous private field. + +---*/ + + +class C { + f = this.g(); + +} + +class D extends C { + g() { this.#m = 42; } + set #m(val) {} +} + +assert(D.prototype.hasOwnProperty('g')); +assert.throws(TypeError, function() { + var d = new D(); +}, 'private setters are not installed before super returns'); diff --git a/JSTests/test262/test/language/statements/class/elements/public-class-field-initialization-is-visible-to-proxy.js b/JSTests/test262/test/language/statements/class/elements/public-class-field-initialization-is-visible-to-proxy.js new file mode 100644 index 000000000000..4728ff5bceb6 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/public-class-field-initialization-is-visible-to-proxy.js @@ -0,0 +1,32 @@ +// Copyright (C) 2019 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Public class field initialization calls [[DefineOwnProperty]] and can be observed by Proxies +esid: sec-define-field +info: | + DefineField(receiver, fieldRecord) + ... + 8. If fieldName is a Private Name, + a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue). + 9. Else, + a. Assert: IsPropertyKey(fieldName) is true. + b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue). + 10. Return. +includes: [propertyHelper.js] +features: [class, class-fields-public] +---*/ + +function ProxyBase() { + return new Proxy(this, { + defineProperty: function (target, key, descriptor) { + throw new Test262Error(); + } + }); +} + +class Base extends ProxyBase { + f = "Test262"; +} + +assert.throws(Test262Error, () => { new Base(); }); diff --git a/JSTests/test262/test/language/statements/class/elements/public-class-field-initialization-on-super-class-with-setter.js b/JSTests/test262/test/language/statements/class/elements/public-class-field-initialization-on-super-class-with-setter.js new file mode 100644 index 000000000000..d6b7c2567240 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/public-class-field-initialization-on-super-class-with-setter.js @@ -0,0 +1,37 @@ +// Copyright (C) 2019 Caio Lima. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Public class field initialization calls [[DefineOwnProperty]] and don't execute super's getter +esid: sec-define-field +info: | + DefineField(receiver, fieldRecord) + ... + 8. If fieldName is a Private Name, + a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue). + 9. Else, + a. Assert: IsPropertyKey(fieldName) is true. + b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue). + 10. Return. +includes: [propertyHelper.js] +features: [class, class-fields-public] +---*/ + +class Super { + set f(v) { + throw new Test262Error(); + } +} + +class Base extends Super { + f = "Test262"; +} + +let o = new Base(); + +verifyProperty(o, "f", { + value: "Test262", + enumerable: true, + writable: true, + configurable: true, +}); diff --git a/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-getter.js b/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-getter.js new file mode 100644 index 000000000000..dbb39b1f2afa --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-getter.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private getter contains proper HomeObject +esid: sec-method-definitions-runtime-semantics-classelementevaluation +info: | + MethodDefinition : get ClassElementName () { FunctionBody } + 1. Let key be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(key). + 3. If the function code for this MethodDefinition is strict mode code, let strict be true. Otherwise let strict be false. + 4. Let scope be the running execution context's LexicalEnvironment. + 5. Let formalParameterList be an instance of the production FormalParameters:[empty] . + 6. Let closure be FunctionCreate(Method, formalParameterList, FunctionBody, scope, strict). + 7. Perform MakeMethod(closure, homeObject). + 8. Perform SetFunctionName(closure, key, "get"). + 9. If key is a Private Name, + a. If key has a [[Kind]] field, + i. Assert: key.[[Kind]] is "accessor". + ii. Assert: key.[[Brand]] is homeObject. + iii. Assert: key does not have a [[Get]] field. + iv. Set key.[[Get]] to closure. + b. Otherwise, + i. Set key.[[Kind]] to "accessor". + ii. Set key.[[Brand]] to homeObject. + iii. Set key.[[Get]] to closure. + 10. Else, + a. Let desc be the PropertyDescriptor{[[Get]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true}. + b. Perform ? DefinePropertyOrThrow(homeObject, key, desc). +features: [class-methods-private, class] +---*/ + +class A { + method() { + return "Test262"; + } +} + +class C extends A { + get #m() { + return super.method(); + } + + access() { + return this.#m; + } +} + +let c = new C(); +assert.sameValue(c.access(), "Test262"); diff --git a/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-method.js b/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-method.js new file mode 100644 index 000000000000..f20a1fb94e69 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-method.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private method contains proper HomeObject +esid: sec-method-definitions-runtime-semantics-classelementevaluation +info: | + MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } + 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject. + 2. ReturnIfAbrupt(methodDef). + 3. Perform ? DefineOrdinaryMethod(methodDef.[[Key]], homeObject, methodDef.[[Closure]], _enumerable). + + MethodDefinition : PropertyName ( UniqueFormalParameters ) { FunctionBody } + 1. Let propKey be the result of evaluating PropertyName. + 2. ReturnIfAbrupt(propKey). + 3. Let scope be the running execution context's LexicalEnvironment. + 4. If functionPrototype is present as a parameter, then + a. Let kind be Normal. + b. Let prototype be functionPrototype. + 5. Else, + a. Let kind be Method. + b. Let prototype be the intrinsic object %FunctionPrototype%. + 6. Let closure be FunctionCreate(kind, UniqueFormalParameters, FunctionBody, scope, prototype). + 7. Perform MakeMethod(closure, object). + 8. Set closure.[[SourceText]] to the source text matched by MethodDefinition. + 9. Return the Record { [[Key]]: propKey, [[Closure]]: closure }. +features: [class-methods-private, class] +---*/ + +class A { + method() { + return "Test262"; + } +} + +class C extends A { + #m() { + return super.method(); + } + + access(o) { + return this.#m.call(o); + } +} + +let c = new C(); +assert.sameValue(c.access(c), "Test262"); + +let o = {}; +assert.sameValue(c.access(o), "Test262"); diff --git a/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-setter.js b/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-setter.js new file mode 100644 index 000000000000..ce0d317aebb1 --- /dev/null +++ b/JSTests/test262/test/language/statements/class/elements/super-access-inside-a-private-setter.js @@ -0,0 +1,50 @@ +// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Private setter contains proper HomeObject +esid: sec-method-definitions-runtime-semantics-classelementevaluation +info: | + MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody } + 1. Let key be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(key). + 3. If the function code for this MethodDefinition is strict mode code, let strict be true. Otherwise let strict be false. + 4. Let scope be the running execution context's LexicalEnvironment. + 5. Let closure be FunctionCreate(Method, PropertySetParameterList, FunctionBody, scope, strict). + 6. Perform MakeMethod(closure, homeObject). + 7. Perform SetFunctionName(closure, key, "set"). + 8. If key is a Private Name, + a. If key has a [[Kind]] field, + i. Assert: key.[[Kind]] is "accessor". + ii. Assert: key.[[Brand]] is homeObject. + iii. Assert: key does not have a [[Set]] field. + iv. Set key.[[Set]] to closure. + b. Otherwise, + i. Set key.[[Kind]] to "accessor". + ii. Set key.[[Brand]] to homeObject. + iii. Set key.[[Set]] to closure. + 9. Else, + a. Let desc be the PropertyDescriptor{[[Set]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true}. + b. Perform ? DefinePropertyOrThrow(homeObject, key, desc). +features: [class-methods-private, class] +---*/ + +class A { + method(v) { + return v; + } +} + +class C extends A { + set #m(v) { + this._v = super.method(v); + } + + access() { + return this.#m = "Test262"; + } +} + +let c = new C(); +c.access(); +assert.sameValue(c._v, "Test262"); diff --git a/JSTests/test262/test/language/statements/class/poisoned-underscore-proto.js b/JSTests/test262/test/language/statements/class/poisoned-underscore-proto.js new file mode 100644 index 000000000000..5cb1e736ec4f --- /dev/null +++ b/JSTests/test262/test/language/statements/class/poisoned-underscore-proto.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Alexey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: prod-ClassDeclaration +description: > + ClassDeclaration should directly set [[Prototype]] internal slot. +info: | + ClassDefinitionEvaluation + + [...] + 7. Let proto be ObjectCreate(protoParent). + + ObjectCreate ( proto [ , internalSlotsList ] ) + + [...] + 4. Set obj.[[Prototype]] to proto. +features: [class] +---*/ + +Object.defineProperty(Object.prototype, '__proto__', { + set: function() { + throw new Test262Error('should not be called'); + }, +}); + +class A extends Array {} + +assert.sameValue(new A(1).length, 1); diff --git a/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-init-err.js new file mode 100644 index 000000000000..41a14b4004ea --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-init-err.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for await (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (const [x] = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-init-err.js new file mode 100644 index 000000000000..6ebdb50ba9ff --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-const-obj-ptrn-init-err.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for await (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (const {x} = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-init-err.js new file mode 100644 index 000000000000..c46307b3448a --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-init-err.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for await (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (let [x] = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-init-err.js new file mode 100644 index 000000000000..2c85b9d3ef01 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-let-obj-ptrn-init-err.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for await (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (let {x} = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-init-err.js new file mode 100644 index 000000000000..5ad287f41759 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-init-err.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForBinding position. +info: | + IterationStatement: + for await (var ForBinding of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (var [x] = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-init-err.js new file mode 100644 index 000000000000..3f2681463203 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/async-gen-dstr-var-obj-ptrn-init-err.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForBinding position. +info: | + IterationStatement: + for await (var ForBinding of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (var {x} = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/head-const-init.js b/JSTests/test262/test/language/statements/for-await-of/head-const-init.js new file mode 100644 index 000000000000..7b85eb17368c --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/head-const-init.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for await (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (const x = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/head-let-init.js b/JSTests/test262/test/language/statements/for-await-of/head-let-init.js new file mode 100644 index 000000000000..9bbfff8329f0 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/head-let-init.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for await (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (let x = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-await-of/head-var-init.js b/JSTests/test262/test/language/statements/for-await-of/head-var-init.js new file mode 100644 index 000000000000..aae8974e4af7 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-await-of/head-var-init.js @@ -0,0 +1,20 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForBinding position. +info: | + IterationStatement: + for await (var ForBinding of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +features: [async-iteration] +---*/ + +$DONOTEVALUATE(); + +async function fn() { + for await (var x = 1 of []) {} +} diff --git a/JSTests/test262/test/language/statements/for-of/dstr/const-ary-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-of/dstr/const-ary-ptrn-init-err.js new file mode 100644 index 000000000000..3d2b17af87a0 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/dstr/const-ary-ptrn-init-err.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (const [x] = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/dstr/const-obj-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-of/dstr/const-obj-ptrn-init-err.js new file mode 100644 index 000000000000..c0231a4f2b3c --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/dstr/const-obj-ptrn-init-err.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (const {x} = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/dstr/let-ary-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-of/dstr/let-ary-ptrn-init-err.js new file mode 100644 index 000000000000..d3fc37fd90fc --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/dstr/let-ary-ptrn-init-err.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (let [x] = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/dstr/let-obj-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-of/dstr/let-obj-ptrn-init-err.js new file mode 100644 index 000000000000..055fb082c493 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/dstr/let-obj-ptrn-init-err.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (let {x} = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/dstr/var-ary-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-of/dstr/var-ary-ptrn-init-err.js new file mode 100644 index 000000000000..095da3cf46bd --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/dstr/var-ary-ptrn-init-err.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForBinding position. +info: | + IterationStatement: + for (var ForBinding of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (var [x] = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/dstr/var-obj-ptrn-init-err.js b/JSTests/test262/test/language/statements/for-of/dstr/var-obj-ptrn-init-err.js new file mode 100644 index 000000000000..b7c65c4b49c8 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/dstr/var-obj-ptrn-init-err.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForBinding position. +info: | + IterationStatement: + for (var ForBinding of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (var {x} = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/head-const-init.js b/JSTests/test262/test/language/statements/for-of/head-const-init.js new file mode 100644 index 000000000000..30a341846cb2 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/head-const-init.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (const x = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/head-let-init.js b/JSTests/test262/test/language/statements/for-of/head-let-init.js new file mode 100644 index 000000000000..78210754df3a --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/head-let-init.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForDeclaration position. +info: | + IterationStatement: + for (ForDeclaration of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (let x = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/for-of/head-var-init.js b/JSTests/test262/test/language/statements/for-of/head-var-init.js new file mode 100644 index 000000000000..5722df4976d6 --- /dev/null +++ b/JSTests/test262/test/language/statements/for-of/head-var-init.js @@ -0,0 +1,17 @@ +// Copyright (C) 2019 Aleksey Shvayka. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-iteration-statements +description: > + Initializer is not allowed in head's ForBinding position. +info: | + IterationStatement: + for (var ForBinding of AssignmentExpression) Statement +negative: + phase: parse + type: SyntaxError +---*/ + +$DONOTEVALUATE(); + +for (var x = 1 of []) {} diff --git a/JSTests/test262/test/language/statements/function/13.2-30-s.js b/JSTests/test262/test/language/statements/function/13.2-30-s.js index 778e2e7775dc..a1e55d60869d 100644 --- a/JSTests/test262/test/language/statements/function/13.2-30-s.js +++ b/JSTests/test262/test/language/statements/function/13.2-30-s.js @@ -1,7 +1,7 @@ // Copyright (C) 2015 Caitlin Potter. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. -/*--- +/*--- description: > Functions created using Function.prototype.bind() do not have own properties "caller" or "arguments", but inherit them from diff --git a/JSTests/test262/test/language/types/boolean/S8.3_A2.1.js b/JSTests/test262/test/language/types/boolean/S8.3_A2.1.js index 2c7f677710fe..004d2cdc2c44 100644 --- a/JSTests/test262/test/language/types/boolean/S8.3_A2.1.js +++ b/JSTests/test262/test/language/types/boolean/S8.3_A2.1.js @@ -7,7 +7,7 @@ es5id: 8.3_A2.1 description: Checking if execution of "true=1" fails negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/types/boolean/S8.3_A2.2.js b/JSTests/test262/test/language/types/boolean/S8.3_A2.2.js index 8c5aa38fa5bc..776d3d96861f 100644 --- a/JSTests/test262/test/language/types/boolean/S8.3_A2.2.js +++ b/JSTests/test262/test/language/types/boolean/S8.3_A2.2.js @@ -7,7 +7,7 @@ es5id: 8.3_A2.2 description: Checking if execution of "false=0" fails negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/types/reference/S8.7.2_A1_T1.js b/JSTests/test262/test/language/types/reference/S8.7.2_A1_T1.js index 36470c1e1f49..076163a016f8 100644 --- a/JSTests/test262/test/language/types/reference/S8.7.2_A1_T1.js +++ b/JSTests/test262/test/language/types/reference/S8.7.2_A1_T1.js @@ -7,7 +7,7 @@ es5id: 8.7.2_A1_T1 description: Checking if execution of "'litera'=1;" fails negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test/language/types/reference/S8.7.2_A1_T2.js b/JSTests/test262/test/language/types/reference/S8.7.2_A1_T2.js index afa09426919f..a8d0a8d1799b 100644 --- a/JSTests/test262/test/language/types/reference/S8.7.2_A1_T2.js +++ b/JSTests/test262/test/language/types/reference/S8.7.2_A1_T2.js @@ -7,7 +7,7 @@ es5id: 8.7.2_A1_T2 description: Checking if execution of "1=1" fails negative: phase: parse - type: ReferenceError + type: SyntaxError ---*/ $DONOTEVALUATE(); diff --git a/JSTests/test262/test262-Revision.txt b/JSTests/test262/test262-Revision.txt index af729deed764..e418df1399dc 100644 --- a/JSTests/test262/test262-Revision.txt +++ b/JSTests/test262/test262-Revision.txt @@ -1,2 +1,2 @@ test262 remote url: git@github.com:tc39/test262.git -test262 revision: 2682ab57cf61796b503575b81bd73dc69c10e372 +test262 revision: 26a2268436f28f64c4539d9aab9ebd0f0b7c99c5 diff --git a/JSTests/wasm.yaml b/JSTests/wasm.yaml index 45dbd1acb709..f8711f74baee 100644 --- a/JSTests/wasm.yaml +++ b/JSTests/wasm.yaml @@ -31,6 +31,8 @@ cmd: runWebAssemblySuite unless parseRunCommands - path: wasm/references cmd: runWebAssemblySuite unless parseRunCommands +- path: wasm/references-spec-tests + cmd: runWebAssemblySuite unless parseRunCommands - path: wasm/fuzz cmd: runWebAssemblySuite unless parseRunCommands - path: wasm/stress diff --git a/JSTests/wasm/Builder.js b/JSTests/wasm/Builder.js index 7e7c1b7dc223..976377f7b3d9 100644 --- a/JSTests/wasm/Builder.js +++ b/JSTests/wasm/Builder.js @@ -306,6 +306,7 @@ const _checkImms = (op, imms, expectedImms, ret) => { case "target_count": break; // improve checking https://bugs.webkit.org/show_bug.cgi?id=163421 case "target_table": break; // improve checking https://bugs.webkit.org/show_bug.cgi?id=163421 case "reserved": break; // improve checking https://bugs.webkit.org/show_bug.cgi?id=163421 + case "table_index": break; // improve checking https://bugs.webkit.org/show_bug.cgi?id=163421 default: throw new Error(`Implementation problem: unhandled immediate "${expect.name}" on "${op}"`); } } @@ -536,6 +537,10 @@ export default class Builder { s.data.push({ type, op: "get_global", mutability: _normalizeMutability(mutability), initValue }); return _errorHandlingProxyFor(globalBuilder); }, + RefFunc: (type, initValue, mutability) => { + s.data.push({ type, op: "ref.func", mutability: _normalizeMutability(mutability), initValue }); + return _errorHandlingProxyFor(globalBuilder); + }, RefNull: (type, mutability) => { s.data.push({ type, op: "ref.null", mutability: _normalizeMutability(mutability) }); return _errorHandlingProxyFor(globalBuilder); diff --git a/JSTests/wasm/Builder_WebAssemblyBinary.js b/JSTests/wasm/Builder_WebAssemblyBinary.js index ca8fd8f65f69..86338d345dc8 100644 --- a/JSTests/wasm/Builder_WebAssemblyBinary.js +++ b/JSTests/wasm/Builder_WebAssemblyBinary.js @@ -60,6 +60,8 @@ const putGlobalType = (bin, global) => { const putOp = (bin, op) => { put(bin, "uint8", op.value); + if (WASM.description.opcode[op.name].extendedOp) + put(bin, "uint8", WASM.description.opcode[op.name].extendedOp); if (op.arguments.length !== 0) throw new Error(`Unimplemented: arguments`); // FIXME https://bugs.webkit.org/show_bug.cgi?id=162706 @@ -192,6 +194,8 @@ const emitters = { const data = section.data; put(bin, "varuint32", data.length); for (const {tableIndex, offset, functionIndices} of data) { + if (tableIndex != 0) + put(bin, "uint8", 2); put(bin, "varuint32", tableIndex); let initExpr; diff --git a/JSTests/wasm/function-tests/basic-element.js b/JSTests/wasm/function-tests/basic-element.js index 114f3c814c06..3f5ddeca314e 100644 --- a/JSTests/wasm/function-tests/basic-element.js +++ b/JSTests/wasm/function-tests/basic-element.js @@ -2,7 +2,7 @@ import Builder from '../Builder.js'; import * as assert from '../assert.js'; -const tableDescription = {initial: 1, element: "anyfunc"}; +const tableDescription = {initial: 1, element: "funcref"}; const builder = new Builder() .Type().End() .Import() diff --git a/JSTests/wasm/function-tests/context-switch.js b/JSTests/wasm/function-tests/context-switch.js index 0595e6d9eecb..7230a7c68941 100644 --- a/JSTests/wasm/function-tests/context-switch.js +++ b/JSTests/wasm/function-tests/context-switch.js @@ -3,7 +3,7 @@ import * as assert from '../assert.js' { function makeInstance() { - const tableDescription = {initial: 1, element: "anyfunc"}; + const tableDescription = {initial: 1, element: "funcref"}; const builder = new Builder() .Type() .Func([], "void") @@ -82,7 +82,7 @@ import * as assert from '../assert.js' { function makeInstance() { - const tableDescription = {initial: 1, element: "anyfunc"}; + const tableDescription = {initial: 1, element: "funcref"}; const builder = new Builder() .Type() .Func(["i32"], "void") @@ -171,7 +171,7 @@ import * as assert from '../assert.js' { function makeInstance() { - const tableDescription = {initial: 1, element: "anyfunc"}; + const tableDescription = {initial: 1, element: "funcref"}; const builder = new Builder() .Type() .Func(["i32"], "void") diff --git a/JSTests/wasm/function-tests/exceptions.js b/JSTests/wasm/function-tests/exceptions.js index 952513f265a3..86384377b33c 100644 --- a/JSTests/wasm/function-tests/exceptions.js +++ b/JSTests/wasm/function-tests/exceptions.js @@ -2,7 +2,7 @@ import Builder from '../Builder.js' import * as assert from '../assert.js' function makeInstance() { - const tableDescription = {initial: 1, element: "anyfunc"}; + const tableDescription = {initial: 1, element: "funcref"}; const builder = new Builder() .Type() .Func(["i32", "i32"], "i32") diff --git a/JSTests/wasm/function-tests/grow-memory-2.js b/JSTests/wasm/function-tests/grow-memory-2.js index fba01318f8a4..714c67553016 100644 --- a/JSTests/wasm/function-tests/grow-memory-2.js +++ b/JSTests/wasm/function-tests/grow-memory-2.js @@ -37,7 +37,7 @@ import * as assert from '../assert.js'; { const memoryDescription = {initial: 0, maximum: 2}; - const tableDescription = {initial: 1, maximum: 1, element: "anyfunc"}; + const tableDescription = {initial: 1, maximum: 1, element: "funcref"}; const builder = (new Builder()) .Type() .Func([], "void") diff --git a/JSTests/wasm/function-tests/nameSection.js b/JSTests/wasm/function-tests/nameSection.js index d4dcd3597690..6805e689f5c8 100644 --- a/JSTests/wasm/function-tests/nameSection.js +++ b/JSTests/wasm/function-tests/nameSection.js @@ -38,7 +38,7 @@ const compile = (location, importObject = {}) => { if (typeof importObject[imp.module][imp.name] === "undefined") { switch (imp.kind) { case "function": importObject[imp.module][imp.name] = () => {}; break; - case "table": importObject[imp.module][imp.name] = new WebAssembly.Table({ initial: 6, maximum: 6, element: "anyfunc" }); break; + case "table": importObject[imp.module][imp.name] = new WebAssembly.Table({ initial: 6, maximum: 6, element: "funcref" }); break; case "memory": importObject[imp.module][imp.name] = new WebAssembly.Memory({ initial: 16777216 / (64 * 1024), maximum: 16777216 / (64 * 1024) }); break; case "global": importObject[imp.module][imp.name] = 0; break; } diff --git a/JSTests/wasm/function-tests/stack-overflow.js b/JSTests/wasm/function-tests/stack-overflow.js index cfbb5eed4649..2578fda22b35 100644 --- a/JSTests/wasm/function-tests/stack-overflow.js +++ b/JSTests/wasm/function-tests/stack-overflow.js @@ -3,7 +3,7 @@ import * as assert from '../assert.js' { function makeInstance() { - const tableDescription = {initial: 1, element: "anyfunc"}; + const tableDescription = {initial: 1, element: "funcref"}; const builder = new Builder() .Type() .Func(["i32"], "void") @@ -57,7 +57,7 @@ import * as assert from '../assert.js' { function makeInstance() { - const tableDescription = {initial: 1, element: "anyfunc"}; + const tableDescription = {initial: 1, element: "funcref"}; const builder = new Builder() .Type() .Func([], "void") diff --git a/JSTests/wasm/function-tests/table-basic-2.js b/JSTests/wasm/function-tests/table-basic-2.js index 27361f4939b9..19a632a7fdbc 100644 --- a/JSTests/wasm/function-tests/table-basic-2.js +++ b/JSTests/wasm/function-tests/table-basic-2.js @@ -8,7 +8,7 @@ function makeInstance(func) { .Func(["i32"], "i32") .End() .Import() - .Table("imp", "table", {initial: 20, element: "anyfunc"}) + .Table("imp", "table", {initial: 20, element: "funcref"}) .Function("imp", "func", { params: ["i32"], ret: "i32" }) .End() .Function().End() @@ -33,7 +33,7 @@ function makeInstance(func) { const bin = builder.WebAssembly().get(); const module = new WebAssembly.Module(bin); - const table = new WebAssembly.Table({initial: 20, element: "anyfunc"}); + const table = new WebAssembly.Table({initial: 20, element: "funcref"}); return {instance: new WebAssembly.Instance(module, {imp: {table, func}}), table}; } diff --git a/JSTests/wasm/function-tests/table-basic.js b/JSTests/wasm/function-tests/table-basic.js index 0ff3b4766423..47956d3e2b20 100644 --- a/JSTests/wasm/function-tests/table-basic.js +++ b/JSTests/wasm/function-tests/table-basic.js @@ -8,7 +8,7 @@ function makeInstance() { .Func(["i32"], "i32") .End() .Import() - .Table("imp", "table", {initial: 20, element: "anyfunc"}) + .Table("imp", "table", {initial: 20, element: "funcref"}) .End() .Function().End() .Export() @@ -33,7 +33,7 @@ function makeInstance() { const bin = builder.WebAssembly().get(); const module = new WebAssembly.Module(bin); - const table = new WebAssembly.Table({initial: 20, element: "anyfunc"}); + const table = new WebAssembly.Table({initial: 20, element: "funcref"}); return {instance: new WebAssembly.Instance(module, {imp: {table}}), table}; } diff --git a/JSTests/wasm/function-tests/trap-from-start-async.js b/JSTests/wasm/function-tests/trap-from-start-async.js index 83c7f8921a79..b03b2fe886c8 100644 --- a/JSTests/wasm/function-tests/trap-from-start-async.js +++ b/JSTests/wasm/function-tests/trap-from-start-async.js @@ -2,7 +2,7 @@ import * as assert from '../assert.js'; import Builder from '../Builder.js'; const memoryInfo = { initial: 2 }; -const tableInfo = { element: "anyfunc", initial: 8 }; +const tableInfo = { element: "funcref", initial: 8 }; async function StartTrapsAsync() { const builder = (new Builder()) diff --git a/JSTests/wasm/function-tests/trap-from-start.js b/JSTests/wasm/function-tests/trap-from-start.js index ea5a0ac716c0..d7cc0dd9bda7 100644 --- a/JSTests/wasm/function-tests/trap-from-start.js +++ b/JSTests/wasm/function-tests/trap-from-start.js @@ -2,7 +2,7 @@ import * as assert from '../assert.js'; import Builder from '../Builder.js'; const memoryInfo = { initial: 2 }; -const tableInfo = { element: "anyfunc", initial: 8 }; +const tableInfo = { element: "funcref", initial: 8 }; (function StartTraps() { const builder = (new Builder()) diff --git a/JSTests/wasm/js-api/Module.exports.js b/JSTests/wasm/js-api/Module.exports.js index 76e3fd3fa5c0..777fd06197b3 100644 --- a/JSTests/wasm/js-api/Module.exports.js +++ b/JSTests/wasm/js-api/Module.exports.js @@ -17,7 +17,7 @@ assert.eq(WebAssembly.Module.exports.length, 1); .Type().End() .Function().End() .Table() - .Table({initial: 20, maximum: 30, element: "anyfunc"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) .End() .Memory().InitialMaxPages(1, 1).End() .Global().I32(42, "immutable").End() diff --git a/JSTests/wasm/js-api/Module.imports.js b/JSTests/wasm/js-api/Module.imports.js index 1fc2dd56b7a7..b991c626502b 100644 --- a/JSTests/wasm/js-api/Module.imports.js +++ b/JSTests/wasm/js-api/Module.imports.js @@ -17,7 +17,7 @@ assert.eq(WebAssembly.Module.imports.length, 1); .Type().End() .Import() .Function("fooFunction", "barFunction", { params: [] }) - .Table("fooTable", "barTable", {initial: 20, element: "anyfunc"}) + .Table("fooTable", "barTable", {initial: 20, element: "funcref"}) .Memory("fooMemory", "barMemory", {initial: 20}) .Global().I32("fooGlobal", "barGlobal", "immutable").End() .End() diff --git a/JSTests/wasm/js-api/call-indirect.js b/JSTests/wasm/js-api/call-indirect.js index 01cd42f9b79a..1545484984b2 100644 --- a/JSTests/wasm/js-api/call-indirect.js +++ b/JSTests/wasm/js-api/call-indirect.js @@ -1,12 +1,12 @@ import * as assert from '../assert.js'; import Builder from '../Builder.js'; -const wasmModuleWhichImportJS = () => { +const oneTable = () => { const builder = (new Builder()) .Type().End() .Import() .Function("imp", "func", { params: ["i32"] }) - .Table("imp", "table", { initial: 1, maximum: 1, element: "anyfunc"}) + .Table("imp", "table", { initial: 1, maximum: 1, element: "funcref"}) .End() .Function().End() .Export() @@ -31,8 +31,41 @@ const wasmModuleWhichImportJS = () => { return module; }; +const multiTable = () => { + const builder = (new Builder()) + .Type().End() + .Import() + .Function("imp", "func", { params: ["i32"] }) + .Table("imp", "table0", { initial: 0, maximum: 0, element: "funcref"}) + .Table("imp", "table", { initial: 1, maximum: 1, element: "funcref"}) + .End() + .Function().End() + .Export() + .Function("changeCounter") + .Function("callFunc") + .End() + .Code() + .Function("changeCounter", { params: ["i32", "i32"] }) + .I32Const(42) + .GetLocal(0) + .I32Add() + .GetLocal(1) + .CallIndirect(0, 1) // Calls table[0](param[0] + 42). + .End() + .Function("callFunc", { params: ["i32"] }) + .GetLocal(0) + .Call(0) // Calls func(param[0] + 42) + .End() + .End(); + const bin = builder.WebAssembly().get(); + const module = new WebAssembly.Module(bin); + return module; +}; + +for (const wasmModuleWhichImportJS of [oneTable, multiTable]) { + const makeTable = () => { - return new WebAssembly.Table({initial: 1, maximum: 1, element: "anyfunc"}); + return new WebAssembly.Table({initial: 1, maximum: 1, element: "funcref"}); }; (function MonomorphicImport() { @@ -40,7 +73,7 @@ const makeTable = () => { const counterSetter = v => counter = v; const table = makeTable(); const module = wasmModuleWhichImportJS(); - const instance = new WebAssembly.Instance(module, { imp: { func: counterSetter, table} }); + const instance = new WebAssembly.Instance(module, { imp: { func: counterSetter, table, table0: new WebAssembly.Table({initial: 0, maximum: 0, element: "funcref"}) } }); table.set(0, instance.exports.callFunc); for (let i = 0; i < 4096; ++i) { // Invoke this a bunch of times to make sure the IC in the wasm -> JS stub works correctly. @@ -57,11 +90,11 @@ const makeTable = () => { const module = wasmModuleWhichImportJS(); const tableA = makeTable(); - const instanceA = new WebAssembly.Instance(module, { imp: { func: counterASetter, table: tableA} }); + const instanceA = new WebAssembly.Instance(module, { imp: { func: counterASetter, table: tableA, table0: new WebAssembly.Table({initial: 0, maximum: 0, element: "funcref"}) } }); tableA.set(0, instanceA.exports.callFunc); const tableB = makeTable(); - const instanceB = new WebAssembly.Instance(module, { imp: { func: counterBSetter, table: tableB} }); + const instanceB = new WebAssembly.Instance(module, { imp: { func: counterBSetter, table: tableB, table0: new WebAssembly.Table({initial: 0, maximum: 0, element: "funcref"}) } }); tableB.set(0, instanceB.exports.callFunc); for (let i = 0; i < 2048; ++i) { instanceA.exports.changeCounter(i, 0); @@ -93,7 +126,7 @@ const makeTable = () => { let instances = []; for (let i = 0; i < num; ++i) { let table = makeTable(); - instances[i] = new WebAssembly.Instance(module, { imp: { func: counterSetters[i], table} }); + instances[i] = new WebAssembly.Instance(module, { imp: { func: counterSetters[i], table, table0: new WebAssembly.Table({initial: 0, maximum: 0, element: "funcref"}) } }); table.set(0, instances[i].exports.callFunc); } for (let i = 0; i < 2048; ++i) { @@ -104,3 +137,5 @@ const makeTable = () => { } } })(); + +} diff --git a/JSTests/wasm/js-api/element-data.js b/JSTests/wasm/js-api/element-data.js index cb43f4f1ff44..49f2867002df 100644 --- a/JSTests/wasm/js-api/element-data.js +++ b/JSTests/wasm/js-api/element-data.js @@ -10,7 +10,7 @@ const memoryDescription = { initial: memSizeInPages, maximum: memSizeInPages }; .Type().End() .Import() .Memory("imp", "memory", memoryDescription) - .Table("imp", "table", {element: "anyfunc", initial: 19}) // unspecified maximum. + .Table("imp", "table", {element: "funcref", initial: 19}) // unspecified maximum. .End() .Function().End() .Element() @@ -30,7 +30,7 @@ const memoryDescription = { initial: memSizeInPages, maximum: memSizeInPages }; const bin = builder.WebAssembly().get(); const module = new WebAssembly.Module(bin); const memory = new WebAssembly.Memory(memoryDescription); - const table = new WebAssembly.Table({element: "anyfunc", initial: 19}); + const table = new WebAssembly.Table({element: "funcref", initial: 19}); const imports = { imp: { memory: memory, diff --git a/JSTests/wasm/js-api/element.js b/JSTests/wasm/js-api/element.js index fcbe2827f371..7b80d509afb2 100644 --- a/JSTests/wasm/js-api/element.js +++ b/JSTests/wasm/js-api/element.js @@ -27,7 +27,7 @@ import * as assert from '../assert.js'; .Type().End() .Function().End() .Table() - .Table({element: "anyfunc", initial: 20}) + .Table({element: "funcref", initial: 20}) .End() .Element() .Element({tableIndex: 1, offset: 0, functionIndices: [0]}) @@ -41,7 +41,7 @@ import * as assert from '../assert.js'; .End() .End(); - assert.throws(() => new WebAssembly.Module(builder.WebAssembly().get()), WebAssembly.CompileError, "WebAssembly.Module doesn't parse at byte 30: Element section for Table 1 exceeds available Table 1"); + assert.throws(() => new WebAssembly.Module(builder.WebAssembly().get()), WebAssembly.CompileError, "WebAssembly.Module doesn't parse at byte 31: Element section for Table 1 exceeds available Table 1"); } { @@ -50,7 +50,7 @@ import * as assert from '../assert.js'; .Type().End() .Function().End() .Table() - .Table({element: "anyfunc", initial: 20, maximum: 20}) + .Table({element: "funcref", initial: 20, maximum: 20}) .End() .Element() .Element({offset: 19, functionIndices: [0, 0]}) @@ -74,7 +74,7 @@ import * as assert from '../assert.js'; .Type().End() .Function().End() .Table() - .Table({element: "anyfunc", initial: 20, maximum: 20}) + .Table({element: "funcref", initial: 20, maximum: 20}) .End() .Element() .Element({offset: 20, functionIndices: [0]}) @@ -98,7 +98,7 @@ import * as assert from '../assert.js'; .Type().End() .Function().End() .Table() - .Table({element: "anyfunc", initial: 20, maximum: 20}) + .Table({element: "funcref", initial: 20, maximum: 20}) .End() .Element() .Element({offset: 0, functionIndices: [0, 0, 1]}) @@ -121,7 +121,7 @@ import * as assert from '../assert.js'; const builder = new Builder() .Type().End() .Import() - .Table("imp", "table", {element: "anyfunc", initial: 19}) // unspecified maximum. + .Table("imp", "table", {element: "funcref", initial: 19}) // unspecified maximum. .End() .Function().End() .Element() @@ -142,7 +142,7 @@ import * as assert from '../assert.js'; } for (let i = 19; i < 19 + 5; i++) { - const table = new WebAssembly.Table({element: "anyfunc", initial: i}); + const table = new WebAssembly.Table({element: "funcref", initial: i}); badInstantiation(table, WebAssembly.LinkError, "Element is trying to set an out of bounds table index (evaluating 'new WebAssembly.Instance(module, {imp: {table: actualTable}})')"); } } @@ -152,7 +152,7 @@ import * as assert from '../assert.js'; const builder = new Builder() .Type().End() .Import() - .Table("imp", "table", {element: "anyfunc", initial: 19}) // unspecified maximum. + .Table("imp", "table", {element: "funcref", initial: 19}) // unspecified maximum. .Global().I32("imp", "global", "immutable").End() .End() .Function().End() @@ -173,7 +173,7 @@ import * as assert from '../assert.js'; } function test(i) { - const table = new WebAssembly.Table({element: "anyfunc", initial: 19}); + const table = new WebAssembly.Table({element: "funcref", initial: 19}); const global = i; const module = makeModule(); const instance = new WebAssembly.Instance(module, {imp: {table, global}}); @@ -195,7 +195,7 @@ import * as assert from '../assert.js'; const builder = new Builder() .Type().End() .Import() - .Table("imp", "table", {element: "anyfunc", initial: 19}) // unspecified maximum. + .Table("imp", "table", {element: "funcref", initial: 19}) // unspecified maximum. .Global().F32("imp", "global", "immutable").End() .End() .Function().End() diff --git a/JSTests/wasm/js-api/extension-MemoryMode.js b/JSTests/wasm/js-api/extension-MemoryMode.js index 5608526bc2fa..2f13b2c1da3c 100644 --- a/JSTests/wasm/js-api/extension-MemoryMode.js +++ b/JSTests/wasm/js-api/extension-MemoryMode.js @@ -18,7 +18,7 @@ assert.throws(() => WebAssemblyMemoryMode(1), TypeError, message); assert.throws(() => WebAssemblyMemoryMode(""), TypeError, message); assert.throws(() => WebAssemblyMemoryMode({}), TypeError, message); assert.throws(() => WebAssemblyMemoryMode(new WebAssembly.Module(emptyModuleArray)), TypeError, message); -assert.throws(() => WebAssemblyMemoryMode(new WebAssembly.Table({initial: 1, element: "anyfunc"})), TypeError, message); +assert.throws(() => WebAssemblyMemoryMode(new WebAssembly.Table({initial: 1, element: "funcref"})), TypeError, message); const validateMode = what => { const mode = WebAssemblyMemoryMode(what); diff --git a/JSTests/wasm/js-api/table.js b/JSTests/wasm/js-api/table.js index bbca89ec34f7..aa67d20f61c8 100644 --- a/JSTests/wasm/js-api/table.js +++ b/JSTests/wasm/js-api/table.js @@ -5,15 +5,15 @@ import * as assert from '../assert.js'; const builder = new Builder() .Type().End() .Import() - .Table("imp", "table", {initial: 20, element: "anyfunc"}) + .Table("imp", "table", {initial: 20, element: "funcref"}) .End() .Function().End() .Table() - .Table({initial: 20, maximum: 30, element: "anyfunc"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) .End() .Code() .End(); - assert.throws(() => new WebAssembly.Module(builder.WebAssembly().get()), WebAssembly.CompileError, "WebAssembly.Module doesn't parse at byte 34: Cannot have more than one Table for now"); + new WebAssembly.Module(builder.WebAssembly().get()) } { @@ -33,12 +33,12 @@ import * as assert from '../assert.js'; .Type().End() .Function().End() .Table() - .Table({initial: 20, maximum: 30, element: "anyfunc"}) - .Table({initial: 20, maximum: 30, element: "anyfunc"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) .End() .Code() .End(); - assert.throws(() => new WebAssembly.Module(builder.WebAssembly().get()), WebAssembly.CompileError, "WebAssembly.Module doesn't parse at byte 17: Table count of 2 is invalid, at most 1 is allowed for now (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"); + new WebAssembly.Module(builder.WebAssembly().get()) } { @@ -62,7 +62,7 @@ import * as assert from '../assert.js'; .Type().End() .Function().End() .Table() - .Table({initial:20, element:"anyfunc"}) + .Table({initial:20, element:"funcref"}) .End() .Export() .Function("foo") @@ -73,7 +73,28 @@ import * as assert from '../assert.js'; .CallIndirect(0, 1) .End() .End(); - assert.throws(() => new WebAssembly.Module(builder.WebAssembly().get()), WebAssembly.CompileError, "WebAssembly.Module doesn't parse at byte 6: call_indirect's 'reserved' varuint1 must be 0x0, in function at index 0 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"); + assert.throws(() => new WebAssembly.Module(builder.WebAssembly().get()), WebAssembly.CompileError, "WebAssembly.Module doesn't parse at byte 6: call_indirect's table index 1 invalid, limit is 1, in function at index 0 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"); +} + +{ + const builder = new Builder() + .Type().End() + .Function().End() + .Table() + .Table({initial:20, element:"funcref"}) + .Table({initial:20, element:"funcref"}) + .End() + .Export() + .Function("foo") + .End() + .Code() + .Function("foo", {params: ["i32"]}) + .GetLocal(0) + .GetLocal(0) + .CallIndirect(0, 1) + .End() + .End(); + new WebAssembly.Module(builder.WebAssembly().get()) } { @@ -95,7 +116,7 @@ import * as assert from '../assert.js'; .Type().End() .Function().End() .Table() - .Table({initial: 20, maximum: 30, element: "anyfunc"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) .End() .Export() .Table("foo", 1) @@ -132,40 +153,40 @@ function assertBadTableImport(tableDescription, message) { { let badDescriptions = [ [{initial: 10, element: "i32"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], [{initial: 10, element: "f32"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], [{initial: 10, element: "f64"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], [{initial: 10, element: "i64"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], [{initial: 10, maximum: 20, element: "i32"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -1 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], [{initial: 10, maximum: 20, element: "f32"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -3 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], [{initial: 10, maximum: 20, element: "f64"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -4 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], [{initial: 10, maximum: 20, element: "i64"}, - "WebAssembly.Module doesn't parse at byte 18: Table type should be anyfunc or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", - "WebAssembly.Module doesn't parse at byte 26: Table type should be anyfunc or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], + "WebAssembly.Module doesn't parse at byte 18: Table type should be funcref or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", + "WebAssembly.Module doesn't parse at byte 26: Table type should be funcref or anyref, got -2 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], - [{initial: 10, maximum: 9, element: "anyfunc"}, + [{initial: 10, maximum: 9, element: "funcref"}, "WebAssembly.Module doesn't parse at byte 21: resizable limits has a initial page count of 10 which is greater than its maximum 9 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", "WebAssembly.Module doesn't parse at byte 29: resizable limits has a initial page count of 10 which is greater than its maximum 9 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], - [{initial: 1, maximum: 0, element: "anyfunc"}, + [{initial: 1, maximum: 0, element: "funcref"}, "WebAssembly.Module doesn't parse at byte 21: resizable limits has a initial page count of 1 which is greater than its maximum 0 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", "WebAssembly.Module doesn't parse at byte 29: resizable limits has a initial page count of 1 which is greater than its maximum 0 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], - [{initial: 2**32 - 1, maximum: 2**32 - 2, element: "anyfunc"}, + [{initial: 2**32 - 1, maximum: 2**32 - 2, element: "funcref"}, "WebAssembly.Module doesn't parse at byte 29: resizable limits has a initial page count of 4294967295 which is greater than its maximum 4294967294 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", "WebAssembly.Module doesn't parse at byte 37: resizable limits has a initial page count of 4294967295 which is greater than its maximum 4294967294 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], - [{initial: 2**31, element: "anyfunc"}, + [{initial: 2**31, element: "funcref"}, "WebAssembly.Module doesn't parse at byte 24: Table's initial page count of 2147483648 is too big, maximum 10000000 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')", "WebAssembly.Module doesn't parse at byte 32: Table's initial page count of 2147483648 is too big, maximum 10000000 (evaluating 'new WebAssembly.Module(builder.WebAssembly().get())')"], ]; @@ -180,13 +201,13 @@ function assertBadTableImport(tableDescription, message) { const builder = new Builder() .Type().End() .Import() - .Table("imp", "table", {initial: 20, element: "anyfunc"}) - .Table("imp", "table", {initial: 20, element: "anyfunc"}) + .Table("imp", "table", {initial: 20, element: "funcref"}) + .Table("imp", "table", {initial: 20, element: "funcref"}) .End() .Function().End() .Code() .End(); - assert.throws(() => new WebAssembly.Module(builder.WebAssembly().get()), WebAssembly.CompileError, "WebAssembly.Module doesn't parse at byte 39: Cannot have more than one Table for now"); + new WebAssembly.Module(builder.WebAssembly().get()) } @@ -205,10 +226,10 @@ function assertBadTableImport(tableDescription, message) { } const badTables = [ - [{initial: 100, maximum:100, element:"anyfunc"}, new WebAssembly.Table({initial:100, element: "anyfunc"}), "Table import imp:table does not have a 'maximum' but the module requires that it does (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], - [{initial: 100, maximum:100, element:"anyfunc"}, new WebAssembly.Table({initial:100, maximum:101, element: "anyfunc"}), "Imported Table imp:table 'maximum' is larger than the module's expected 'maximum' (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], - [{initial: 100, element:"anyfunc"}, new WebAssembly.Table({initial:10, element: "anyfunc"}), "Table import imp:table provided an 'initial' that is too small (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], - [{initial: 10, element:"anyfunc"}, new WebAssembly.Table({initial:9, element: "anyfunc"}), "Table import imp:table provided an 'initial' that is too small (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], + [{initial: 100, maximum:100, element:"funcref"}, new WebAssembly.Table({initial:100, element: "funcref"}), "Table import imp:table does not have a 'maximum' but the module requires that it does (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], + [{initial: 100, maximum:100, element:"funcref"}, new WebAssembly.Table({initial:100, maximum:101, element: "funcref"}), "Imported Table imp:table 'maximum' is larger than the module's expected 'maximum' (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], + [{initial: 100, element:"funcref"}, new WebAssembly.Table({initial:10, element: "funcref"}), "Table import imp:table provided an 'initial' that is too small (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], + [{initial: 10, element:"funcref"}, new WebAssembly.Table({initial:9, element: "funcref"}), "Table import imp:table provided an 'initial' that is too small (evaluating 'new WebAssembly.Instance(module, {imp: {table}})')"], ]; for (const [d, t, m] of badTables) { assertBadTableInstance(d, t, m); @@ -219,7 +240,7 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp { { - const table = new WebAssembly.Table({element: "anyfunc", initial: 20, maximum: 30}); + const table = new WebAssembly.Table({element: "funcref", initial: 20, maximum: 30}); assert.eq(20, table.grow(0)); assert.eq(20, table.length); assert.eq(20, table.grow(1)); @@ -227,14 +248,14 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp } { - const table = new WebAssembly.Table({element: "anyfunc", initial: 20, maximum: 30}); + const table = new WebAssembly.Table({element: "funcref", initial: 20, maximum: 30}); assert.eq(20, table.grow(10)); assert.eq(30, table.grow(0)); assert.throws(() => table.grow(1), RangeError, "WebAssembly.Table.prototype.grow could not grow the table"); } { - const table = new WebAssembly.Table({element: "anyfunc", initial: 20}); + const table = new WebAssembly.Table({element: "funcref", initial: 20}); let called = false; table.grow({valueOf() { called = true; return 42; }}); assert.truthy(called); @@ -242,14 +263,14 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp } { - const table = new WebAssembly.Table({element: "anyfunc", initial: 20}); + const table = new WebAssembly.Table({element: "funcref", initial: 20}); assert.throws(() => table.get(20), RangeError, "WebAssembly.Table.prototype.get expects an integer less than the length of the table"); for (let i = 0; i < 20; i++) assert.eq(table.get(i), null); } { - const table = new WebAssembly.Table({element: "anyfunc", initial: 20}); + const table = new WebAssembly.Table({element: "funcref", initial: 20}); assert.throws(() => table.set(20, null), RangeError, "WebAssembly.Table.prototype.set expects an integer less than the length of the table"); for (let i = 0; i < 20; i++) table.set(i, null); @@ -257,7 +278,7 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp { // This should not throw - new WebAssembly.Table({initial: 2**20, maximum: 2**32 - 1, element: "anyfunc"}); + new WebAssembly.Table({initial: 2**20, maximum: 2**32 - 1, element: "funcref"}); } } @@ -267,7 +288,7 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp const builder = new Builder() .Type().End() .Import() - .Table("imp", "table", {initial: 25, element: "anyfunc"}) + .Table("imp", "table", {initial: 25, element: "funcref"}) .End() .Function().End() .Code() @@ -285,7 +306,7 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp const builder = new Builder() .Type().End() .Import() - .Table("imp", "table", {initial: 25, element: "anyfunc"}) + .Table("imp", "table", {initial: 25, element: "funcref"}) .End() .Function().End() .Export() @@ -295,7 +316,7 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp .Code().End(); const module = new WebAssembly.Module(builder.WebAssembly().get()); - const table = new WebAssembly.Table({element: "anyfunc", initial: 25}); + const table = new WebAssembly.Table({element: "funcref", initial: 25}); const instance = new WebAssembly.Instance(module, {imp: {table}}); assert.truthy(table === instance.exports.table); assert.truthy(table === instance.exports.table2); @@ -306,7 +327,7 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp .Type().End() .Function().End() .Table() - .Table({initial: 20, maximum: 30, element: "anyfunc"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) .End() .Export() .Table("table", 0) @@ -320,3 +341,26 @@ assert.throws(() => WebAssembly.Table.prototype.grow(undefined), TypeError, `exp assert.eq(instance.exports.table.length, 20); assert.truthy(instance.exports.table instanceof WebAssembly.Table); } + +{ + const builder = new Builder() + .Type().End() + .Function().End() + .Table() + .Table({initial: 0, maximum: 1, element: "funcref"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) + .End() + .Export() + .Table("table0", 0) + .Table("table", 1) + .Table("table2", 1) + .End() + .Code().End(); + + const module = new WebAssembly.Module(builder.WebAssembly().get()); + const instance = new WebAssembly.Instance(module); + assert.eq(instance.exports.table, instance.exports.table2); + assert.eq(instance.exports.table.length, 20); + assert.eq(instance.exports.table0.length, 0); + assert.truthy(instance.exports.table instanceof WebAssembly.Table); +} diff --git a/JSTests/wasm/js-api/test_basic_api.js b/JSTests/wasm/js-api/test_basic_api.js index 1a2d22210304..2158743edaec 100644 --- a/JSTests/wasm/js-api/test_basic_api.js +++ b/JSTests/wasm/js-api/test_basic_api.js @@ -93,9 +93,9 @@ for (const c in constructorProperties) { new WebAssembly.Memory({initial: 20}); break; case "Table": - new WebAssembly.Table({initial: 20, element: "anyfunc"}); - new WebAssembly.Table({initial: 20, maximum: 20, element: "anyfunc"}); - new WebAssembly.Table({initial: 20, maximum: 25, element: "anyfunc"}); + new WebAssembly.Table({initial: 20, element: "funcref"}); + new WebAssembly.Table({initial: 20, maximum: 20, element: "funcref"}); + new WebAssembly.Table({initial: 20, maximum: 25, element: "funcref"}); break; case "CompileError": case "LinkError": diff --git a/JSTests/wasm/js-api/unique-signature.js b/JSTests/wasm/js-api/unique-signature.js index 8f5a55fca368..6e669e8c0842 100644 --- a/JSTests/wasm/js-api/unique-signature.js +++ b/JSTests/wasm/js-api/unique-signature.js @@ -16,7 +16,7 @@ import Builder from '../Builder.js'; .End() .Function().End() .Table() - .Table({initial: 4, maximum: 4, element: "anyfunc"}) + .Table({initial: 4, maximum: 4, element: "funcref"}) .End() .Export() .Function("entry") diff --git a/JSTests/wasm/js-api/wrapper-function.js b/JSTests/wasm/js-api/wrapper-function.js index e3bc398653e9..c6c03201353b 100644 --- a/JSTests/wasm/js-api/wrapper-function.js +++ b/JSTests/wasm/js-api/wrapper-function.js @@ -56,7 +56,7 @@ function exportImport(type) { } { - const tableDescription = {element: "anyfunc", initial: 2}; + const tableDescription = {element: "funcref", initial: 2}; function makeInstance(type, imp) { const builder = new Builder() .Type() diff --git a/JSTests/wasm/modules/table.wat b/JSTests/wasm/modules/table.wat index 6a6b69962148..17d6db541866 100644 --- a/JSTests/wasm/modules/table.wat +++ b/JSTests/wasm/modules/table.wat @@ -1,5 +1,5 @@ (module - (table $table (export "table") 3 anyfunc) + (table $table (export "table") 3 funcref) (func $f0 (result i32) i32.const 42) (func $f1 (result i32) i32.const 83) (elem (i32.const 0) $f0 $f1)) diff --git a/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat b/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat index e5abeaafcf67..2d044e0b43c0 100644 --- a/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat +++ b/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/imports.wat @@ -1,7 +1,7 @@ (module (import "./re-export.js" "sum" (func $sum (param i32 i32) (result i32))) (import "./re-export.js" "answer" (global i32)) - (import "./re-export.js" "table" (table $table 4 anyfunc)) + (import "./re-export.js" "table" (table $table 4 funcref)) (export "table" (table $table)) (type $t0 (func (param i32) (result i32))) (func $addOne (export "addOne") (type $t0) (param $p0 i32) (result i32) diff --git a/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat b/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat index ca4aaebfcfb3..7f23e5a54ed8 100644 --- a/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat +++ b/JSTests/wasm/modules/wasm-imports-js-re-exports-wasm-exports/sum.wat @@ -5,5 +5,5 @@ get_local $p0 i32.add) (global (export "answer") i32 i32.const 42) - (table $table (export "table") 4 anyfunc) + (table $table (export "table") 4 funcref) (elem (i32.const 0) $sum)) diff --git a/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wat b/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wat index 63c1d2c8d2f7..ae8abf7081b1 100644 --- a/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wat +++ b/JSTests/wasm/modules/wasm-imports-wasm-exports/imports.wat @@ -5,7 +5,7 @@ (import "./sum.wasm" "answer2" (global f64)) (import "./sum.wasm" "answer3" (global f32)) (import "./sum.wasm" "answer4" (global f64)) - (import "./sum.wasm" "table" (table $table 4 anyfunc)) + (import "./sum.wasm" "table" (table $table 4 funcref)) (type $t0 (func (param i32) (result i32))) (func $addOne (export "addOne") (type $t0) (param $p0 i32) (result i32) i32.const 1 diff --git a/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wat b/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wat index fcb767b072ce..6841261d2015 100644 --- a/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wat +++ b/JSTests/wasm/modules/wasm-imports-wasm-exports/sum.wat @@ -1,5 +1,5 @@ (module - (table $table (export "table") 4 anyfunc) + (table $table (export "table") 4 funcref) (type $t0 (func (param i32 i32) (result i32))) (func $sum (export "sum") (type $t0) (param $p0 i32) (param $p1 i32) (result i32) get_local $p1 diff --git a/JSTests/wasm/references-spec-tests/ref_is_null.js b/JSTests/wasm/references-spec-tests/ref_is_null.js new file mode 100644 index 000000000000..ab9f64c8c040 --- /dev/null +++ b/JSTests/wasm/references-spec-tests/ref_is_null.js @@ -0,0 +1,214 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") +'use strict'; +let console = { log: print } +let hostrefs = {}; +let hostsym = Symbol("hostref"); +function hostref(s) { + if (! (s in hostrefs)) hostrefs[s] = {[hostsym]: s}; + return hostrefs[s]; +} +function is_hostref(x) { + return (x !== null && hostsym in x) ? 1 : 0; +} +function is_funcref(x) { + return typeof x === "function" ? 1 : 0; +} +function eq_ref(x, y) { + return x === y ? 1 : 0; +} + +let spectest = { + hostref: hostref, + is_hostref: is_hostref, + is_funcref: is_funcref, + eq_ref: eq_ref, + print: console.log.bind(console), + print_i32: console.log.bind(console), + print_i32_f32: console.log.bind(console), + print_f64_f64: console.log.bind(console), + print_f32: console.log.bind(console), + print_f64: console.log.bind(console), + global_i32: 666, + global_f32: 666, + global_f64: 666, + table: new WebAssembly.Table({initial: 10, maximum: 20, element: 'anyfunc'}), + memory: new WebAssembly.Memory({initial: 1, maximum: 2}) +}; + +let handler = { + get(target, prop) { + return (prop in target) ? target[prop] : {}; + } +}; +let registry = new Proxy({spectest}, handler); + +function register(name, instance) { + registry[name] = instance.exports; +} + +function module(bytes, valid = true) { + let buffer = new ArrayBuffer(bytes.length); + let view = new Uint8Array(buffer); + for (let i = 0; i < bytes.length; ++i) { + view[i] = bytes.charCodeAt(i); + } + let validated; + try { + validated = WebAssembly.validate(buffer); + } catch (e) { + throw new Error("Wasm validate throws"); + } + if (validated !== valid) { + throw new Error("Wasm validate failure" + (valid ? "" : " expected")); + } + return new WebAssembly.Module(buffer); +} + +function instance(bytes, imports = registry) { + return new WebAssembly.Instance(module(bytes), imports); +} + +function call(instance, name, args) { + return instance.exports[name](...args); +} + +function get(instance, name) { + let v = instance.exports[name]; + return (v instanceof WebAssembly.Global) ? v.value : v; +} + +function exports(instance) { + return {module: instance.exports, spectest: spectest}; +} + +function run(action) { + action(); +} + +function assert_malformed(bytes) { + try { module(bytes, false) } catch (e) { + if (e instanceof WebAssembly.CompileError) return; + } + throw new Error("Wasm decoding failure expected"); +} + +function assert_invalid(bytes) { + try { module(bytes, false) } catch (e) { + if (e instanceof WebAssembly.CompileError) return; + } + throw new Error("Wasm validation failure expected"); +} + +function assert_unlinkable(bytes) { + let mod = module(bytes); + try { new WebAssembly.Instance(mod, registry) } catch (e) { + if (e instanceof WebAssembly.LinkError) return; + } + throw new Error("Wasm linking failure expected"); +} + +function assert_uninstantiable(bytes) { + let mod = module(bytes); + try { new WebAssembly.Instance(mod, registry) } catch (e) { + if (e instanceof WebAssembly.RuntimeError) return; + } + throw new Error("Wasm trap expected"); +} + +function assert_trap(action) { + try { action() } catch (e) { + if (e instanceof WebAssembly.RuntimeError) return; + } + throw new Error("Wasm trap expected"); +} + +let StackOverflow; +try { (function f() { 1 + f() })() } catch (e) { StackOverflow = e.constructor } + +function assert_exhaustion(action) { + try { action() } catch (e) { + if (e instanceof StackOverflow) return; + } + throw new Error("Wasm resource exhaustion expected"); +} + +function assert_return(action, expected) { + let actual = action(); + if (!Object.is(actual, expected)) { + throw new Error("Wasm return value " + expected + " expected, got " + actual); + }; +} + +function assert_return_canonical_nan(action) { + let actual = action(); + // Note that JS can't reliably distinguish different NaN values, + // so there's no good way to test that it's a canonical NaN. + if (!Number.isNaN(actual)) { + throw new Error("Wasm return value NaN expected, got " + actual); + }; +} + +function assert_return_arithmetic_nan(action) { + // Note that JS can't reliably distinguish different NaN values, + // so there's no good way to test for specific bitpatterns here. + let actual = action(); + if (!Number.isNaN(actual)) { + throw new Error("Wasm return value NaN expected, got " + actual); + }; +} + +function assert_return_ref(action) { + let actual = action(); + if (actual === null || typeof actual !== "object" && typeof actual !== "function") { + throw new Error("Wasm reference return value expected, got " + actual); + }; +} + +function assert_return_func(action) { + let actual = action(); + if (typeof actual !== "function") { + throw new Error("Wasm function return value expected, got " + actual); + }; +} + +// ref_is_null.wast:1 +let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x97\x80\x80\x80\x00\x05\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x00\x00\x60\x01\x6f\x00\x60\x01\x7f\x01\x7f\x03\x88\x80\x80\x80\x00\x07\x00\x01\x02\x03\x02\x04\x04\x04\x87\x80\x80\x80\x00\x02\x6f\x00\x02\x70\x00\x02\x07\xc1\x80\x80\x80\x00\x06\x06\x61\x6e\x79\x72\x65\x66\x00\x00\x07\x66\x75\x6e\x63\x72\x65\x66\x00\x01\x04\x69\x6e\x69\x74\x00\x03\x06\x64\x65\x69\x6e\x69\x74\x00\x04\x0b\x61\x6e\x79\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x05\x0c\x66\x75\x6e\x63\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x06\x09\x88\x80\x80\x80\x00\x01\x02\x01\x41\x01\x0b\x01\x02\x0a\xd4\x80\x80\x80\x00\x07\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x82\x80\x80\x80\x00\x00\x0b\x88\x80\x80\x80\x00\x00\x41\x01\x20\x00\x26\x00\x0b\x8c\x80\x80\x80\x00\x00\x41\x01\xd0\x26\x00\x41\x01\xd0\x26\x01\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x25\x00\x10\x00\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x25\x01\x10\x01\x0b"); + +// ref_is_null.wast:29 +assert_return(() => call($1, "anyref", [null]), 1); + +// ref_is_null.wast:30 +assert_return(() => call($1, "funcref", [null]), 1); + +// ref_is_null.wast:32 +assert_return(() => call($1, "anyref", [hostref(1)]), 0); + +// ref_is_null.wast:34 +run(() => call($1, "init", [hostref(0)])); + +// ref_is_null.wast:36 +assert_return(() => call($1, "anyref-elem", [0]), 1); + +// ref_is_null.wast:37 +assert_return(() => call($1, "funcref-elem", [0]), 1); + +// ref_is_null.wast:39 +assert_return(() => call($1, "anyref-elem", [1]), 0); + +// ref_is_null.wast:40 +assert_return(() => call($1, "funcref-elem", [1]), 0); + +// ref_is_null.wast:42 +run(() => call($1, "deinit", [])); + +// ref_is_null.wast:44 +assert_return(() => call($1, "anyref-elem", [0]), 1); + +// ref_is_null.wast:45 +assert_return(() => call($1, "funcref-elem", [0]), 1); + +// ref_is_null.wast:47 +assert_return(() => call($1, "anyref-elem", [1]), 1); + +// ref_is_null.wast:48 +assert_return(() => call($1, "funcref-elem", [1]), 1); diff --git a/JSTests/wasm/references-spec-tests/ref_null.js b/JSTests/wasm/references-spec-tests/ref_null.js new file mode 100644 index 000000000000..1cf8da0a5109 --- /dev/null +++ b/JSTests/wasm/references-spec-tests/ref_null.js @@ -0,0 +1,184 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") +'use strict'; + +let console = { log: print } + +let hostrefs = {}; +let hostsym = Symbol("hostref"); +function hostref(s) { + if (! (s in hostrefs)) hostrefs[s] = {[hostsym]: s}; + return hostrefs[s]; +} +function is_hostref(x) { + return (x !== null && hostsym in x) ? 1 : 0; +} +function is_funcref(x) { + return typeof x === "function" ? 1 : 0; +} +function eq_ref(x, y) { + return x === y ? 1 : 0; +} + +let spectest = { + hostref: hostref, + is_hostref: is_hostref, + is_funcref: is_funcref, + eq_ref: eq_ref, + print: console.log.bind(console), + print_i32: console.log.bind(console), + print_i32_f32: console.log.bind(console), + print_f64_f64: console.log.bind(console), + print_f32: console.log.bind(console), + print_f64: console.log.bind(console), + global_i32: 666, + global_f32: 666, + global_f64: 666, + table: new WebAssembly.Table({initial: 10, maximum: 20, element: 'anyfunc'}), + memory: new WebAssembly.Memory({initial: 1, maximum: 2}) +}; + +let handler = { + get(target, prop) { + return (prop in target) ? target[prop] : {}; + } +}; +let registry = new Proxy({spectest}, handler); + +function register(name, instance) { + registry[name] = instance.exports; +} + +function module(bytes, valid = true) { + let buffer = new ArrayBuffer(bytes.length); + let view = new Uint8Array(buffer); + for (let i = 0; i < bytes.length; ++i) { + view[i] = bytes.charCodeAt(i); + } + let validated; + try { + validated = WebAssembly.validate(buffer); + } catch (e) { + console.log(e) + throw new Error("Wasm validate throws"); + } + if (validated !== valid) { + //throw new Error("Wasm validate failure" + (valid ? "" : " expected")); + } + return new WebAssembly.Module(buffer); +} + +function instance(bytes, imports = registry) { + return new WebAssembly.Instance(module(bytes), imports); +} + +function call(instance, name, args) { + return instance.exports[name](...args); +} + +function get(instance, name) { + let v = instance.exports[name]; + return (v instanceof WebAssembly.Global) ? v.value : v; +} + +function exports(instance) { + return {module: instance.exports, spectest: spectest}; +} + +function run(action) { + action(); +} + +function assert_malformed(bytes) { + try { module(bytes, false) } catch (e) { + if (e instanceof WebAssembly.CompileError) return; + } + throw new Error("Wasm decoding failure expected"); +} + +function assert_invalid(bytes) { + try { module(bytes, false) } catch (e) { + if (e instanceof WebAssembly.CompileError) return; + } + throw new Error("Wasm validation failure expected"); +} + +function assert_unlinkable(bytes) { + let mod = module(bytes); + try { new WebAssembly.Instance(mod, registry) } catch (e) { + if (e instanceof WebAssembly.LinkError) return; + } + throw new Error("Wasm linking failure expected"); +} + +function assert_uninstantiable(bytes) { + let mod = module(bytes); + try { new WebAssembly.Instance(mod, registry) } catch (e) { + if (e instanceof WebAssembly.RuntimeError) return; + } + throw new Error("Wasm trap expected"); +} + +function assert_trap(action) { + try { action() } catch (e) { + if (e instanceof WebAssembly.RuntimeError) return; + } + throw new Error("Wasm trap expected"); +} + +let StackOverflow; +try { (function f() { 1 + f() })() } catch (e) { StackOverflow = e.constructor } + +function assert_exhaustion(action) { + try { action() } catch (e) { + if (e instanceof StackOverflow) return; + } + throw new Error("Wasm resource exhaustion expected"); +} + +function assert_return(action, expected) { + let actual = action(); + if (!Object.is(actual, expected)) { + throw new Error("Wasm return value " + expected + " expected, got " + actual); + }; +} + +function assert_return_canonical_nan(action) { + let actual = action(); + // Note that JS can't reliably distinguish different NaN values, + // so there's no good way to test that it's a canonical NaN. + if (!Number.isNaN(actual)) { + throw new Error("Wasm return value NaN expected, got " + actual); + }; +} + +function assert_return_arithmetic_nan(action) { + // Note that JS can't reliably distinguish different NaN values, + // so there's no good way to test for specific bitpatterns here. + let actual = action(); + if (!Number.isNaN(actual)) { + throw new Error("Wasm return value NaN expected, got " + actual); + }; +} + +function assert_return_ref(action) { + let actual = action(); + if (actual === null || typeof actual !== "object" && typeof actual !== "function") { + throw new Error("Wasm reference return value expected, got " + actual); + }; +} + +function assert_return_func(action) { + let actual = action(); + if (typeof actual !== "function") { + throw new Error("Wasm function return value expected, got " + actual); + }; +} + +// ref_null.wast:1 +let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x01\x6f\x60\x00\x01\x70\x03\x83\x80\x80\x80\x00\x02\x00\x01\x06\x89\x80\x80\x80\x00\x02\x6f\x00\xd0\x0b\x70\x00\xd0\x0b\x07\x94\x80\x80\x80\x00\x02\x06\x61\x6e\x79\x72\x65\x66\x00\x00\x07\x66\x75\x6e\x63\x72\x65\x66\x00\x01\x0a\x91\x80\x80\x80\x00\x02\x83\x80\x80\x80\x00\x00\xd0\x0b\x83\x80\x80\x80\x00\x00\xd0\x0b"); + +// ref_null.wast:9 +assert_return(() => call($1, "anyref", []), null); + +// ref_null.wast:10 +assert_return(() => call($1, "funcref", []), null); diff --git a/JSTests/wasm/references/anyref_globals.js b/JSTests/wasm/references/anyref_globals.js index 184457a33fec..61e27d19a8a6 100644 --- a/JSTests/wasm/references/anyref_globals.js +++ b/JSTests/wasm/references/anyref_globals.js @@ -1,3 +1,4 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") import * as assert from '../assert.js'; import Builder from '../Builder.js'; @@ -56,7 +57,9 @@ assert.eq($1.exports.get_glob(), null) const obj = { test: "hi" } -$1.exports.set_glob(obj); assert.eq($1.exports.get_glob(), obj); +assert.throws(() => $1.exports.expglob2 = null, TypeError, "Attempted to assign to readonly property.") + +$1.exports.set_glob(obj); assert.eq($1.exports.get_glob(), obj); assert.eq($1.exports.expglob2, "hi") $1.exports.set_glob(5); assert.eq($1.exports.get_glob(), 5) $1.exports.set_glob(null); assert.eq($1.exports.get_glob(), null) $1.exports.set_glob("hi"); assert.eq($1.exports.get_glob(), "hi") diff --git a/JSTests/wasm/references/anyref_modules.js b/JSTests/wasm/references/anyref_modules.js index ed10096d7b5c..38c1734cef91 100644 --- a/JSTests/wasm/references/anyref_modules.js +++ b/JSTests/wasm/references/anyref_modules.js @@ -1,3 +1,4 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") import * as assert from '../assert.js'; import Builder from '../Builder.js'; diff --git a/JSTests/wasm/references/anyref_table.js b/JSTests/wasm/references/anyref_table.js index 8a0c293e5569..c8beaee81124 100644 --- a/JSTests/wasm/references/anyref_table.js +++ b/JSTests/wasm/references/anyref_table.js @@ -1,3 +1,4 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") import * as assert from '../assert.js'; import Builder from '../Builder.js'; @@ -18,12 +19,12 @@ const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) .Function("set_tbl", { params: ["anyref"], ret: "void" }) .I32Const(0) .GetLocal(0) - .TableSet() + .TableSet(0) .End() .Function("get_tbl", { params: [], ret: "anyref" }) .I32Const(0) - .TableGet() + .TableGet(0) .End() .Function("tbl_is_null", { params: [], ret: "i32" }) @@ -60,6 +61,21 @@ assert.eq($1.exports.get_tbl().test, "test") fullGC() assert.eq($1.exports.get_tbl().test, "test") +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .End() + .Element() + .Element({tableIndex: 0, offset: 0, functionIndices: [0]}) + .End() + .Code() + .Function("ret42", { params: [], ret: "i32" }) + .I32Const(42) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't parse at byte 30: Table 0 must have type 'funcref' to have an element section (evaluating 'new WebAssembly.Module')") + function doGCSet() { fullGC() $1.exports.set_tbl({ test: -1 }) diff --git a/JSTests/wasm/references/anyref_table_import.js b/JSTests/wasm/references/anyref_table_import.js index 88cab7c23fe7..62f3a046aaa9 100644 --- a/JSTests/wasm/references/anyref_table_import.js +++ b/JSTests/wasm/references/anyref_table_import.js @@ -1,3 +1,4 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") import * as assert from '../assert.js'; import Builder from '../Builder.js'; @@ -22,12 +23,12 @@ import Builder from '../Builder.js'; .Function("set_tbl", { params: ["anyref"], ret: "void" }) .I32Const(0) .GetLocal(0) - .TableSet() + .TableSet(0) .End() .Function("get_tbl", { params: [], ret: "anyref" }) .I32Const(0) - .TableGet() + .TableGet(0) .End() .Function("tbl_is_null", { params: [], ret: "i32" }) @@ -88,12 +89,12 @@ import Builder from '../Builder.js'; .Function("set_tbl", { params: ["anyref"], ret: "void" }) .I32Const(0) .GetLocal(0) - .TableSet() + .TableSet(0) .End() .Function("get_tbl", { params: [], ret: "anyref" }) .I32Const(0) - .TableGet() + .TableGet(0) .End() .Function("tbl_is_null", { params: [], ret: "i32" }) @@ -127,12 +128,12 @@ import Builder from '../Builder.js'; .Function("set_tbl", { params: ["anyref"], ret: "void" }) .I32Const(0) .GetLocal(0) - .TableSet() + .TableSet(0) .End() .Function("get_tbl", { params: [], ret: "anyref" }) .I32Const(0) - .TableGet() + .TableGet(0) .End() .Function("tbl_is_null", { params: [], ret: "i32" }) @@ -210,7 +211,24 @@ import Builder from '../Builder.js'; } { - const tbl = new WebAssembly.Table({initial:2, element:"anyfunc"}); + const tbl = new WebAssembly.Table({initial:2, element:"funcref"}); + + const mod = new WebAssembly.Module((new Builder()) + .Type().End() + .Import() + .Table("imp", "tbl", {initial: 2, element: "anyref"}) + .End() + .Function().End() + .Export() + .End() + .Code() + .End().WebAssembly().get()) + + assert.throws(() => new WebAssembly.Instance(mod, { imp: { tbl }}), Error, "Table import imp:tbl provided a 'type' that is wrong (evaluating 'new WebAssembly.Instance(mod, { imp: { tbl }})')"); +} + +{ + const tbl = new WebAssembly.Table({initial:2, element:"funcref"}); const mod = new WebAssembly.Module((new Builder()) .Type().End() diff --git a/JSTests/wasm/references/element_parsing.js b/JSTests/wasm/references/element_parsing.js new file mode 100644 index 000000000000..93be1fd65762 --- /dev/null +++ b/JSTests/wasm/references/element_parsing.js @@ -0,0 +1,26 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") +import * as assert from '../assert.js'; + +function module(bytes, valid = true) { + let buffer = new ArrayBuffer(bytes.length); + let view = new Uint8Array(buffer); + for (let i = 0; i < bytes.length; ++i) { + view[i] = bytes.charCodeAt(i); + } + let validated; + try { + validated = WebAssembly.validate(buffer); + } catch (e) { + console.log(e) + throw new Error("Wasm validate throws"); + } + return new WebAssembly.Module(buffer); +} + +assert.throws(() => module("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x97\x80\x80\x80\x00\x05\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x00\x00\x60\x01\x6f\x00\x60\x01\x7f\x01\x7f\x03\x88\x80\x80\x80\x00\x07\x00\x01\x02\x03\x02\x04\x04\x04\x87\x80\x80\x80\x00\x02\x6f\x00\x02\x70\x00\x02\x07\xc1\x80\x80\x80\x00\x06\x06\x61\x6e\x79\x72\x65\x66\x00\x00\x07\x66\x75\x6e\x63\x72\x65\x66\x00\x01\x04\x69\x6e\x69\x74\x00\x03\x06\x64\x65\x69\x6e\x69\x74\x00\x04\x0b\x61\x6e\x79\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x05\x0c\x66\x75\x6e\x63\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x06\x09\x88\x80\x80\x80\x00\x01" +// Table elem section: +// 0x02 x:tableidx e:expr y*:vec(funcidx) +// + "\x02" + + "\x01" + + "\x41\x01\x0b\x01\x02\x0a\xd4\x80\x80\x80\x00\x07\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x82\x80\x80\x80\x00\x00\x0b\x88\x80\x80\x80\x00\x00\x41\x01\x20\x00\x26\x00\x0b\x8c\x80\x80\x80\x00\x00\x41\x01\xd0\x26\x00\x41\x01\xd0\x26\x01\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x25\x00\x10\x00\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x25\x01\x10\x01\x0b"), + Error, "WebAssembly.Module doesn't parse at byte 143: can't get 0th Element reserved byte, which should be either 0x00 or 0x02 followed by a table index (evaluating 'new WebAssembly.Module(buffer)')"); diff --git a/JSTests/wasm/references/func_ref.js b/JSTests/wasm/references/func_ref.js new file mode 100644 index 000000000000..9265e630b6de --- /dev/null +++ b/JSTests/wasm/references/func_ref.js @@ -0,0 +1,450 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") +import * as assert from '../assert.js'; +import Builder from '../Builder.js'; + +fullGC() +gc() + +function makeExportedFunction(i) { + const builder = (new Builder()) + .Type().End() + .Function().End() + .Export() + .Function("h") + .End() + .Code() + .Function("h", { params: [], ret: "i32" }, []) + .I32Const(i) + .End() + .End(); + + const bin = builder.WebAssembly().get(); + const module = new WebAssembly.Module(bin); + const instance = new WebAssembly.Instance(module); + + return instance.exports.h +} + +function makeExportedIdent() { + const builder = (new Builder()) + .Type().End() + .Function().End() + .Export() + .Function("h") + .End() + .Code() + .Function("h", { params: ["i32"], ret: "i32" }, []) + .GetLocal(0) + .End() + .End(); + + const bin = builder.WebAssembly().get(); + const module = new WebAssembly.Module(bin); + const instance = new WebAssembly.Instance(module); + + return instance.exports.h +} + +function makeFuncrefIdent() { + const builder = (new Builder()) + .Type().End() + .Function().End() + .Export() + .Function("h") + .End() + .Code() + .Function("h", { params: ["funcref"], ret: "funcref" }, []) + .GetLocal(0) + .End() + .End(); + + const bin = builder.WebAssembly().get(); + const module = new WebAssembly.Module(bin); + const instance = new WebAssembly.Instance(module); + + return instance.exports.h +} + +{ + const myfun = makeExportedFunction(1337); + function fun() { + return 41; + } + + const builder = (new Builder()) + .Type().End() + .Function().End() + .Export() + .Function("h") + .Function("i") + .Function("get_h") + .Function("fix") + .Function("get_not_exported") + .Function("local_read") + .End() + .Code() + .Function("h", { params: ["funcref"], ret: "anyref" }, ["anyref"]) + .GetLocal(0) + .SetLocal(1) + .GetLocal(1) + .End() + + .Function("i", { params: ["funcref"], ret: "funcref" }, ["funcref"]) + .GetLocal(0) + .SetLocal(1) + .GetLocal(1) + .End() + + .Function("get_h", { params: [], ret: "funcref" }, ["funcref"]) + .I32Const(0) + .RefFunc(0) + .SetLocal(0) + .If("funcref") + .Block("funcref", (b) => + b.GetLocal(0) + ) + .Else() + .Block("funcref", (b) => + b.GetLocal(0) + ) + .End() + .End() + + .Function("fix", { params: [], ret: "funcref" }, []) + .RefFunc(3) + .End() + + .Function("get_not_exported", { params: [], ret: "funcref" }, []) + .RefFunc(5) + .End() + + .Function("ret_42", { params: [], ret: "i32" }, []) + .I32Const(42) + .End() + + .Function("local_read", { params: [], ret: "i32" }, ["funcref"]) + .GetLocal(0) + .RefIsNull() + .End() + .End(); + + const bin = builder.WebAssembly().get(); + const module = new WebAssembly.Module(bin); + const instance = new WebAssembly.Instance(module); + fullGC(); + + assert.eq(instance.exports.local_read(), 1) + assert.eq(instance.exports.h(null), null) + + assert.throws(() => instance.exports.h(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + assert.eq(instance.exports.h(myfun), myfun) + assert.throws(() => instance.exports.h(5), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + assert.throws(() => instance.exports.h(undefined), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + + assert.eq(instance.exports.i(null), null) + assert.eq(instance.exports.i(myfun), myfun) + assert.throws(() => instance.exports.i(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + assert.throws(() => instance.exports.i(5), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + + assert.throws(() => instance.exports.get_h()(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + assert.eq(instance.exports.get_h()(null), null) + assert.eq(instance.exports.get_h()(myfun), myfun) + assert.throws(() => instance.exports.get_h()(5), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + + assert.eq(instance.exports.get_not_exported()(), 42) + + assert.eq(instance.exports.fix()(), instance.exports.fix()); + assert.eq(instance.exports.fix(), instance.exports.fix); +} + +// Globals + +{ + const myfun = makeExportedFunction(42); + function fun() { + return 41; + } + + const $1 = (() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Import() + .Global().Funcref("imp", "ref", "immutable").End() + .End() + .Function().End() + .Global() + .RefNull("funcref", "mutable") + .RefNull("funcref", "immutable") + .GetGlobal("funcref", 0, "mutable") + .RefFunc("funcref", 2, "immutable") + .End() + .Export() + .Function("set_glob") + .Function("get_glob") + .Function("glob_is_null") + .Function("set_glob_null") + .Function("get_import") + .Global("expglob", 2) + .Global("expglob2", 0) + .Global("exp_glob_is_null", 4) + .End() + .Code() + .Function("set_glob", { params: ["funcref"], ret: "void" }) + .GetLocal(0) + .SetGlobal(1) + .End() + + .Function("get_glob", { params: [], ret: "funcref" }) + .GetGlobal(1) + .End() + + .Function("glob_is_null", { params: [], ret: "i32" }) + .Call(1) + .RefIsNull() + .End() + + .Function("set_glob_null", { params: [], ret: "void" }) + .RefNull() + .Call(0) + .End() + + .Function("get_import", { params: [], ret: "funcref" }) + .GetGlobal(0) + .End() + .End().WebAssembly().get()), { imp: { ref: makeExportedFunction(1337) } }))(); + + fullGC(); + + assert.eq($1.exports.get_import()(), 1337) + assert.eq($1.exports.expglob, null) + assert.eq($1.exports.expglob2(), 1337) + assert.eq($1.exports.exp_glob_is_null, $1.exports.glob_is_null); + assert.eq($1.exports.get_glob(), null) + + $1.exports.set_glob(myfun); assert.eq($1.exports.get_glob(), myfun); assert.eq($1.exports.get_glob()(), 42); assert.eq($1.exports.expglob2(), 1337) + $1.exports.set_glob(null); assert.eq($1.exports.get_glob(), null) + $1.exports.set_glob(myfun); assert.eq($1.exports.get_glob()(), 42); + + assert.throws(() => $1.exports.set_glob(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + + assert.eq($1.exports.glob_is_null(), 0) + $1.exports.set_glob_null(); assert.eq($1.exports.get_glob(), null) + assert.eq($1.exports.glob_is_null(), 1) +} + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Import() + .Global().Funcref("imp", "ref", "immutable").End() + .End() + .Function().End() + .Code().End().WebAssembly().get()), { imp: { ref: function() { return "hi" } } }), Error, "imported global imp:ref must be a wasm exported function or null (evaluating 'new WebAssembly.Instance')"); + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Code() + .Function("h", { params: ["anyref"], ret: "funcref" }) + .GetLocal(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: control flow returns with unexpected type, in function at index 0 (evaluating 'new WebAssembly.Module')"); + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 1, element: "funcref"}) + .End() + .Code() + .Function("h", { params: ["i32"], ret: "void" }) + .GetLocal(0) + .I32Const(0) + .TableSet(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table.set value to type I32 expected Funcref, in function at index 0 (evaluating 'new WebAssembly.Module')"); + +// Tables +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 0, element: "anyref"}) + .Table({initial: 1, element: "funcref"}) + .End() + .Global() + .RefNull("funcref", "mutable") + .End() + .Export() + .Function("set_glob") + .Function("get_glob") + .Function("call_glob") + .Function("ret_20") + .End() + .Code() + .Function("set_glob", { params: ["funcref"], ret: "void" }) + .GetLocal(0) + .SetGlobal(0) + .End() + + .Function("get_glob", { params: [], ret: "funcref" }) + .GetGlobal(0) + .End() + + .Function("call_glob", { params: ["i32"], ret: "i32" }) + .I32Const(0) + .GetGlobal(0) + .TableSet(1) + + .GetLocal(0) + .I32Const(0) + .CallIndirect(2,1) + .End() + + .Function("ret_20", { params: ["i32"], ret: "i32" }) + .I32Const(20) + .End() + .End().WebAssembly().get())); + + const myfun = makeExportedFunction(1337); + function fun(i) { + return 41; + } + const ident = makeExportedIdent(); + + $1.exports.set_glob($1.exports.ret_20); assert.eq($1.exports.get_glob(), $1.exports.ret_20); assert.eq($1.exports.call_glob(42), 20) + $1.exports.set_glob(null); assert.eq($1.exports.get_glob(), null); assert.throws(() => $1.exports.call_glob(42), Error, "call_indirect to a null table entry (evaluating 'func(...args)')") + $1.exports.set_glob(ident); assert.eq($1.exports.get_glob(), ident); assert.eq($1.exports.call_glob(42), 42) + + assert.throws(() => $1.exports.set_glob(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + $1.exports.set_glob(myfun); assert.eq($1.exports.get_glob(), myfun); assert.throws(() => $1.exports.call_glob(42), Error, "call_indirect to a signature that does not match (evaluating 'func(...args)')") + + for (let i=0; i<1000; ++i) { + assert.throws(() => $1.exports.set_glob(function() {}), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')"); + } +} + +// Table set/get + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 0, element: "anyref"}) + .Table({initial: 1, element: "funcref"}) + .End() + .Export() + .Function("set") + .Function("get") + .End() + .Code() + .Function("set", { params: ["funcref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(1) + .End() + + .Function("get", { params: [], ret: "funcref" }) + .I32Const(0) + .TableGet(1) + .End() + .End().WebAssembly().get())); + + function doSet() { + const myfun = makeExportedFunction(444); + for (let i=0; i<1000; ++i) { + $1.exports.set(myfun); + } + $1.exports.set(myfun); assert.eq($1.exports.get(), myfun); assert.eq($1.exports.get()(), 444); + } + + function doTest(j,k, l) { + fullGC(); + let garbage = { val: "hi", val2: 5, arr: [] } + for (let i=0; i<100; ++i) garbage.arr += ({ field: i + j + k + l }) + fullGC(); + + for (let i=0; i<100; ++i) { + assert.eq($1.exports.get()(), 444); + fullGC(); + } + } + + + doSet() + doTest(0,0,0) +} + +// Wasm->JS Calls + +for (let importedFun of [function(i) { return i; }, makeFuncrefIdent()]) { + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Import() + .Function("imp", "h", { params: ["funcref"], ret: "funcref" }) + .End() + .Function().End() + .Table() + .Table({initial: 1, element: "funcref"}) + .End() + .Export() + .Function("test1") + .Function("test2") + .Function("test3") + .Function("test4") + .End() + .Code() + .Function("test1", { params: ["funcref"], ret: "funcref" }) + .GetLocal(0) + .Call(0) + .End() + + .Function("test2", { params: [], ret: "funcref" }) + .RefFunc(1) + .Call(0) + .End() + + .Function("test3", { params: ["funcref"], ret: "funcref" }) + .GetLocal(0) + .I32Const(0) + .RefFunc(0) + .TableSet(0) + .I32Const(0) + .CallIndirect(0, 0) + .End() + + .Function("test4", { params: [], ret: "funcref" }) + .RefFunc(1) + .I32Const(0) + .RefFunc(0) + .TableSet(0) + .I32Const(0) + .CallIndirect(0, 0) + .End() + .End().WebAssembly().get()), { imp: { h: importedFun } }); + + const myfun = makeExportedFunction(1337); + function fun(i) { + return 41; + } + + for (let test of [$1.exports.test1, $1.exports.test3]) { + assert.eq(test(myfun), myfun) + assert.eq(test(myfun)(), 1337) + assert.throws(() => test(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + + for (let i=0; i<1000; ++i) { + assert.throws(() => test(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + } + } + + for (let test of [$1.exports.test2, $1.exports.test4]) { + assert.eq(test(), $1.exports.test1) + assert.eq(test()(myfun), myfun) + assert.throws(() => test()(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + + for (let i=0; i<1000; ++i) { + assert.throws(() => test()(fun), Error, "Funcref must be an exported wasm function (evaluating 'func(...args)')") + } + } +} diff --git a/JSTests/wasm/references/is_null.js b/JSTests/wasm/references/is_null.js index 1c7bc578fa94..6358f45fcf0f 100644 --- a/JSTests/wasm/references/is_null.js +++ b/JSTests/wasm/references/is_null.js @@ -1,3 +1,4 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") import * as assert from '../assert.js'; import Builder from '../Builder.js'; diff --git a/JSTests/wasm/references/multitable.js b/JSTests/wasm/references/multitable.js new file mode 100644 index 000000000000..7ef7130d1ccb --- /dev/null +++ b/JSTests/wasm/references/multitable.js @@ -0,0 +1,461 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") +import * as assert from '../assert.js'; +import Builder from '../Builder.js'; + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 0, maximum: 0, element: "anyref"}) + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Export() + .Function("set_tbl") + .Function("get_tbl") + .Function("get_tbl0") + .Function("set_tbl0") + .Table("tbl", 1) + .End() + .Code() + .Function("set_tbl", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(1) + .End() + + .Function("get_tbl", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(1) + .End() + + .Function("get_tbl0", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(0) + .End() + + .Function("set_tbl0", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(0) + .End() + .End().WebAssembly().get())); + + fullGC() + + assert.eq($1.exports.get_tbl(), null) + + $1.exports.set_tbl("hi") + fullGC() + assert.eq($1.exports.get_tbl(), "hi") + assert.eq($1.exports.tbl.get(0), "hi") + assert.eq($1.exports.tbl.get(1), null) + + assert.throws(() => $1.exports.get_tbl0(), Error, "Out of bounds table access (evaluating 'func(...args)')"); + assert.throws(() => $1.exports.set_tbl0(null), Error, "Out of bounds table access (evaluating 'func(...args)')"); +} + +{ + const tbl = new WebAssembly.Table({initial:0, element:"anyref"}); + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Import() + .Table("imp", "tbl", {initial: 0, element: "anyref"}) + .End() + .Function().End() + .Table() + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Export() + .Function("set_tbl") + .Function("get_tbl") + .Function("get_tbl0") + .Function("set_tbl0") + .Table("tbl", 1) + .End() + .Code() + .Function("set_tbl", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(1) + .End() + + .Function("get_tbl", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(1) + .End() + + .Function("get_tbl0", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(0) + .End() + + .Function("set_tbl0", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(0) + .End() + .End().WebAssembly().get()), { imp: { tbl }}); + + fullGC() + + assert.eq($1.exports.get_tbl(), null) + + $1.exports.set_tbl("hi") + fullGC() + assert.eq($1.exports.get_tbl(), "hi") + assert.eq($1.exports.tbl.get(0), "hi") + assert.eq($1.exports.tbl.get(1), null) + + assert.throws(() => $1.exports.get_tbl0(), Error, "Out of bounds table access (evaluating 'func(...args)')"); + assert.throws(() => $1.exports.set_tbl0(null), Error, "Out of bounds table access (evaluating 'func(...args)')"); +} + +{ + const tbl = new WebAssembly.Table({initial:1, element:"anyref"}); + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Import() + .Table("imp", "tbl", {initial: 1, element: "anyref"}) + .End() + .Function().End() + .Table() + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Export() + .Function("set_tbl") + .Function("get_tbl") + .Function("get_tbl0") + .Function("set_tbl0") + .Table("tbl", 1) + .End() + .Code() + .Function("set_tbl", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(1) + .End() + + .Function("get_tbl", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(1) + .End() + + .Function("get_tbl0", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(0) + .End() + + .Function("set_tbl0", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(0) + .End() + .End().WebAssembly().get()), { imp: { tbl }}); + + fullGC() + + assert.eq($1.exports.get_tbl(), null) + + $1.exports.set_tbl("hi") + fullGC() + $1.exports.set_tbl0(null) + assert.eq($1.exports.get_tbl(), "hi") + assert.eq($1.exports.get_tbl0(), null) + assert.eq($1.exports.tbl.get(0), "hi") + assert.eq($1.exports.tbl.get(1), null) + assert.eq(tbl.get(0), null) +} + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 30, element: "funcref"}) + .Table({initial: 2, maximum: 30, element: "funcref"}) + .End() + .Export() + .Function("call_tbl0") + .Function("call_tbl1") + .Function("ret42") + .Function("ret1337") + .Function("ret256") + .End() + .Element() + .Element({tableIndex: 1, offset: 0, functionIndices: [2]}) + .End() + .Code() + .Function("call_tbl0", { params: ["i32"], ret: "i32" }) + .GetLocal(0) + .CallIndirect(1,0) + .End() + + .Function("call_tbl1", { params: ["i32"], ret: "i32" }) + .GetLocal(0) + .CallIndirect(1,1) + .End() + + .Function("ret42", { params: [], ret: "i32" }) + .I32Const(42) + .End() + + .Function("ret1337", { params: [], ret: "i32" }) + .I32Const(1337) + .End() + + .Function("ret256", { params: [], ret: "i32" }) + .I32Const(256) + .End() + .End().WebAssembly().get())); + + fullGC() + + assert.eq($1.exports.call_tbl1(0), 42) + assert.throws(() => $1.exports.call_tbl0(0), Error, "call_indirect to a null table entry (evaluating 'func(...args)')") + assert.throws(() => $1.exports.call_tbl1(1), Error, "call_indirect to a null table entry (evaluating 'func(...args)')") +} + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 30, element: "funcref"}) + .Table({initial: 2, maximum: 30, element: "funcref"}) + .End() + .Export() + .Function("call_tbl0") + .Function("call_tbl1") + .Function("ret42") + .Function("ret1337") + .Function("ret256") + .End() + .Element() + .Element({tableIndex: 1, offset: 0, functionIndices: [2]}) + .Element({tableIndex: 0, offset: 0, functionIndices: [3]}) + .Element({tableIndex: 1, offset: 1, functionIndices: [4]}) + .End() + .Code() + .Function("call_tbl0", { params: ["i32"], ret: "i32" }) + .GetLocal(0) + .CallIndirect(1,0) + .End() + + .Function("call_tbl1", { params: ["i32"], ret: "i32" }) + .GetLocal(0) + .CallIndirect(1,1) + .End() + + .Function("ret42", { params: [], ret: "i32" }) + .I32Const(42) + .End() + + .Function("ret1337", { params: [], ret: "i32" }) + .I32Const(1337) + .End() + + .Function("ret256", { params: [], ret: "i32" }) + .I32Const(256) + .End() + .End().WebAssembly().get())); + + fullGC() + + assert.eq($1.exports.call_tbl1(0), 42) + assert.eq($1.exports.call_tbl0(0), 1337) + assert.eq($1.exports.call_tbl1(1), 256) + assert.throws(() => $1.exports.call_tbl0(1), Error, "call_indirect to a null table entry (evaluating 'func(...args)')") + assert.throws(() => $1.exports.call_tbl0(2), Error, "call_indirect to a null table entry (evaluating 'func(...args)')") + assert.throws(() => $1.exports.call_tbl1(2), Error, "Out of bounds call_indirect (evaluating 'func(...args)')") +} + assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "funcref"}) + .Table({initial: 2, maximum: 2, element: "funcref"}) + .End() + .Element() + .Element({tableIndex: 1, offset: 0, functionIndices: [0]}) + .Element({tableIndex: 0, offset: 0, functionIndices: [0]}) + .Element({tableIndex: 1, offset: 2, functionIndices: [0]}) + .End() + .Code() + .Function("ret42", { params: [], ret: "i32" }) + .I32Const(42) + .End() + .End().WebAssembly().get())), Error, "Element is trying to set an out of bounds table index (evaluating 'new WebAssembly.Instance')") + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Element() + .Element({tableIndex: 1, offset: 0, functionIndices: [0]}) + .Element({tableIndex: 0, offset: 0, functionIndices: [0]}) + .Element({tableIndex: 1, offset: 2, functionIndices: [0]}) + .End() + .Code() + .Function("ret42", { params: [], ret: "i32" }) + .I32Const(42) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't parse at byte 41: Table 0 must have type 'funcref' to have an element section (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Code() + .Function("fun", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(2) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table index 2 is invalid, limit is 2, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Code() + .Function("fun", { params: [], ret: "void" }) + .I32Const(0) + .RefNull() + .TableSet(2) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table index 2 is invalid, limit is 2, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Code() + .Function("fun", { params: [], ret: "void" }) + .CallIndirect(0, 2) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't parse at byte 4: call_indirect's table index 2 invalid, limit is 2, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Code() + .Function("fun", { params: [], ret: "void" }) + .CallIndirect(0,0) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't parse at byte 4: call_indirect is only valid when a table has type funcref, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Code() + .Function("fun", { params: [], ret: "void" }) + .RefNull() + .TableGet(0) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table.get index to type Funcref expected I32, in function at index 0 (evaluating 'new WebAssembly.Module')") + + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Code() + .Function("fun", { params: [], ret: "void" }) + .RefNull() + .RefNull() + .TableSet(0) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table.set index to type Funcref expected I32, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 3, maximum: 3, element: "anyref"}) + .Table({initial: 2, maximum: 3, element: "funcref"}) + .End() + .Code() + .Function("fun", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(1) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table.set value to type Anyref expected Funcref, in function at index 0 (evaluating 'new WebAssembly.Module')") + +function tableInsanity(num, b) { + b = b.Import() + for (let i=0; i<100000-1; ++i) + b = b.Function("imp", "ref", { params: [], ret: "void" }) + b = b.End().Function().End().Table() + for (let i=0; i new WebAssembly.Instance(new WebAssembly.Module(tableInsanity(1000000, (new Builder()) + .Type().End()) + .Table({initial: 3, maximum: 3, element: "anyref"}) + .End() + .Code() + .Function("fun", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(1) + .End() + .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't parse at byte 5000027: Table count of 1000000 is too big, maximum 1000000 (evaluating 'new WebAssembly.Module')") +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module(tableInsanity(1000000-2, (new Builder()) + .Type().End()) + .Table({initial: 3, maximum: 3, element: "funcref"}) + .Table({initial: 3, maximum: 3, element: "anyref"}) + .End() + .Export() + .Function("set_tbl") + .Function("get_tbl") + .Function("call") + .End() + .Element() + .Element({tableIndex: 1000000-2, offset: 0, functionIndices: [0]}) + .End() + .Code() + .Function("set_tbl", { params: ["anyref"], ret: "void" }) + .I32Const(0) + .GetLocal(0) + .TableSet(1000000-1) + .End() + .Function("get_tbl", { params: [], ret: "anyref" }) + .I32Const(0) + .TableGet(1000000-1) + .End() + .Function("call", { params: [], ret: "void" }) + .I32Const(0) + .CallIndirect(0, 1000000-2) + .End() + .End().WebAssembly().get()), { imp: { ref: function () {} } }) + $1.exports.set_tbl("hi") + assert.eq($1.exports.get_tbl(), "hi") + $1.exports.call() +} diff --git a/JSTests/wasm/references/table_misc.js b/JSTests/wasm/references/table_misc.js new file mode 100644 index 000000000000..5c65716ebd2c --- /dev/null +++ b/JSTests/wasm/references/table_misc.js @@ -0,0 +1,232 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") +import * as assert from '../assert.js'; +import Builder from '../Builder.js'; + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 0, maximum: 0, element: "anyref"}) + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Export() + .Function("tbl_size") + .Table("tbl", 1) + .End() + .Code() + .Function("tbl_size", { params: [], ret: "i32" }) + .TableSize(1) + .End() + .End().WebAssembly().get())); + fullGC() + + assert.eq($1.exports.tbl_size(), 20) + assert.eq($1.exports.tbl.grow(5), 20) + assert.eq($1.exports.tbl_size(), 25) + assert.eq($1.exports.tbl.get(0), null) + assert.eq($1.exports.tbl.get(24), null) +} + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Export() + .Function("tbl_size") + .End() + .Code() + .Function("tbl_size", { params: [], ret: "i32" }) + .TableSize(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table index 0 is invalid, limit is 0, in function at index 0 (evaluating 'new WebAssembly.Module')") + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 0, maximum: 0, element: "anyref"}) + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Export() + .Function("tbl_size") + .Function("tbl_grow") + .Function("ident") + .Table("tbl", 1) + .End() + .Code() + .Function("tbl_size", { params: [], ret: "i32" }) + .TableSize(1) + .End() + .Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" }) + .GetLocal(0) + .GetLocal(1) + .TableGrow(1) + .End() + .Function("ident", { params: ["i32"], ret: "i32" }) + .GetLocal(0) + .End() + .End().WebAssembly().get())); + fullGC() + + assert.eq($1.exports.ident("hi"), 0) + + assert.eq($1.exports.tbl_size(), 20) + assert.eq($1.exports.tbl_grow("hi", 5), 20) + assert.eq($1.exports.tbl_size(), 25) + assert.eq($1.exports.tbl.get(0), null) + assert.eq($1.exports.tbl.get(24), "hi") + + assert.eq($1.exports.tbl_grow(null, 5), 25) + assert.eq($1.exports.tbl.get(24), "hi") + assert.eq($1.exports.tbl.get(25), null) + assert.eq($1.exports.tbl_size(), 30) + assert.eq($1.exports.tbl_grow(null, 0), -1) + assert.eq($1.exports.tbl_grow(null, 5), -1) + assert.eq($1.exports.tbl_grow(null, 0), -1) +} + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Code() + .Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" }) + .GetLocal(0) + .GetLocal(1) + .TableGrow(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table index 0 is invalid, limit is 0, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Code() + .Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" }) + .GetLocal(0) + .TableGrow(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't parse at byte 6: can't pop empty stack in table.grow, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Code() + .Function("tbl_grow", { params: ["i32", "i32"], ret: "i32" }) + .GetLocal(0) + .GetLocal(1) + .TableGrow(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table.grow expects fill value of type Anyref got I32, in function at index 0 (evaluating 'new WebAssembly.Module')") + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Export() + .Function("tbl_size") + .Function("tbl_fill") + .Table("tbl", 0) + .End() + .Code() + .Function("tbl_size", { params: [], ret: "i32" }) + .TableSize(0) + .End() + .Function("tbl_fill", { params: ["i32", "anyref", "i32"], ret: "void" }) + .GetLocal(0) + .GetLocal(1) + .GetLocal(2) + .TableFill(0) + .End() + .End().WebAssembly().get())); + fullGC() + + assert.eq($1.exports.tbl_size(), 20) + $1.exports.tbl_fill(1,"hi",3) + assert.eq($1.exports.tbl.get(0), null) + assert.eq($1.exports.tbl.get(1), "hi") + assert.eq($1.exports.tbl.get(2), "hi") + assert.eq($1.exports.tbl.get(3), "hi") + assert.eq($1.exports.tbl.get(4), null) + + $1.exports.tbl_fill(0,null,1) + assert.eq($1.exports.tbl.get(0), null) + $1.exports.tbl_fill(0,null,0) + + $1.exports.tbl_fill(19,"test",1) + assert.eq($1.exports.tbl.get(19), "test") + assert.eq($1.exports.tbl.get(18), null) + + assert.throws(() => $1.exports.tbl_fill(20,null,0), Error, "Out of bounds table access (evaluating 'func(...args)')") + assert.throws(() => $1.exports.tbl_fill(20,null,1), Error, "Out of bounds table access (evaluating 'func(...args)')") + assert.throws(() => $1.exports.tbl_fill(19,null,2), Error, "Out of bounds table access (evaluating 'func(...args)')") + assert.throws(() => $1.exports.tbl_fill(4294967295,null,1), Error, "Out of bounds table access (evaluating 'func(...args)')") +} + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Code() + .Function("tbl_grow", { params: ["anyref", "i32"], ret: "void" }) + .GetLocal(1) + .GetLocal(0) + .GetLocal(1) + .TableFill(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table index 0 is invalid, limit is 0, in function at index 0 (evaluating 'new WebAssembly.Module')") + +assert.throws(() => new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 20, maximum: 30, element: "anyref"}) + .End() + .Code() + .Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" }) + .GetLocal(0) + .TableFill(0) + .End() + .End().WebAssembly().get()), Error, "WebAssembly.Module doesn't parse at byte 6: can't pop empty stack in table.fill, in function at index 0 (evaluating 'new WebAssembly.Module')") + +{ + const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder()) + .Type().End() + .Function().End() + .Table() + .Table({initial: 0, maximum: 0, element: "funcref"}) + .Table({initial: 20, maximum: 30, element: "funcref"}) + .End() + .Export() + .Function("tbl_size") + .Function("tbl_grow") + .Table("tbl", 1) + .End() + .Code() + .Function("tbl_size", { params: [], ret: "i32" }) + .TableSize(1) + .End() + .Function("tbl_grow", { params: ["i32"], ret: "i32" }) + .I32Const(0) + .TableGet(1) + .GetLocal(0) + .TableGrow(1) + .End() + .End().WebAssembly().get())); + fullGC() + + $1.exports.tbl.set(0, $1.exports.tbl_size); + assert.eq($1.exports.tbl_size(), 20) + assert.eq($1.exports.tbl_grow(5), 20) + assert.eq($1.exports.tbl_size(), 25) + assert.eq($1.exports.tbl.get(0), $1.exports.tbl_size) + assert.eq($1.exports.tbl.get(1), null) + assert.eq($1.exports.tbl.get(24), $1.exports.tbl_size) +} diff --git a/JSTests/wasm/references/validation.js b/JSTests/wasm/references/validation.js index d38c265bfff6..19bddf99e2b7 100644 --- a/JSTests/wasm/references/validation.js +++ b/JSTests/wasm/references/validation.js @@ -1,3 +1,4 @@ +//@ runWebAssemblySuite("--useWebAssemblyReferences=true") import * as assert from '../assert.js'; import Builder from '../Builder.js'; @@ -24,6 +25,9 @@ import Builder from '../Builder.js'; { const builder = (new Builder()) .Type().End() + .Import() + .Table("imp", "tbl", {initial: 2, element: "funcref"}) + .End() .Function().End() .Export() .Function("j") @@ -32,21 +36,21 @@ import Builder from '../Builder.js'; .Function("j", { params: [], ret: "void" }) .I32Const(0) .I32Const(0) - .TableSet() + .TableSet(0) .End() .End(); const bin = builder.WebAssembly(); bin.trim(); - assert.throws(() => new WebAssembly.Module(bin.get()), WebAssembly.CompileError, "WebAssembly.Module doesn't validate: table.set value to type I32 expected Anyref, in function at index 0 (evaluating 'new WebAssembly.Module(bin.get())')"); + assert.throws(() => new WebAssembly.Module(bin.get()), WebAssembly.CompileError, "WebAssembly.Module doesn't validate: table.set value to type I32 expected Funcref, in function at index 0 (evaluating 'new WebAssembly.Module(bin.get())')"); } { const builder = (new Builder()) .Type().End() .Import() - .Table("imp", "tbl", {initial: 2, element: "anyfunc"}) + .Table("imp", "tbl", {initial: 2, element: "funcref"}) .End() .Function().End() .Export() @@ -56,39 +60,39 @@ import Builder from '../Builder.js'; .Function("j", { params: ["anyref"], ret: "void" }) .I32Const(0) .GetLocal(0) - .TableSet() + .TableSet(0) .End() .End(); const bin = builder.WebAssembly(); bin.trim(); - assert.throws(() => new WebAssembly.Module(bin.get()), WebAssembly.CompileError, "WebAssembly.Module doesn't validate: table.set expects the table to have type Anyref, in function at index 0 (evaluating 'new WebAssembly.Module(bin.get())')"); + assert.throws(() => new WebAssembly.Module(bin.get()), WebAssembly.CompileError, "WebAssembly.Module doesn't validate: table.set value to type Anyref expected Funcref, in function at index 0 (evaluating 'new WebAssembly.Module(bin.get())')"); } { const builder = (new Builder()) .Type().End() .Import() - .Table("imp", "tbl", {initial: 2, element: "anyfunc"}) + .Table("imp", "tbl", {initial: 2, element: "anyref"}) .End() .Function().End() .Export() .Function("j") .End() .Code() - .Function("j", { params: [], ret: "anyref" }) + .Function("j", { params: [], ret: "funcref" }) .I32Const(0) - .TableGet() + .TableGet(0) .End() .End(); const bin = builder.WebAssembly(); bin.trim(); - assert.throws(() => new WebAssembly.Module(bin.get()), WebAssembly.CompileError, "WebAssembly.Module doesn't validate: table.get expects the table to have type Anyref, in function at index 0 (evaluating 'new WebAssembly.Module(bin.get())')"); + assert.throws(() => new WebAssembly.Module(bin.get()), WebAssembly.CompileError, "WebAssembly.Module doesn't validate: control flow returns with unexpected type, in function at index 0 (evaluating 'new WebAssembly.Module(bin.get())')"); } { - assert.throws(() => new WebAssembly.Table({initial:2, element:"i32"}), TypeError, "WebAssembly.Table expects its 'element' field to be the string 'anyfunc' or 'anyref'"); + assert.throws(() => new WebAssembly.Table({initial:2, element:"i32"}), TypeError, "WebAssembly.Table expects its 'element' field to be the string 'funcref' or 'anyref'"); } diff --git a/JSTests/wasm/spec-harness/index.js b/JSTests/wasm/spec-harness/index.js index eb00c6d878fc..ccd24fbfe190 100644 --- a/JSTests/wasm/spec-harness/index.js +++ b/JSTests/wasm/spec-harness/index.js @@ -82,7 +82,7 @@ function reinitializeRegistry() { spectest: { print: print, global: 666, - table: new WebAssembly.Table({initial: 10, maximum: 20, element: 'anyfunc'}), + table: new WebAssembly.Table({initial: 10, maximum: 20, element: 'funcref'}), memory: new WebAssembly.Memory({initial: 1, maximum: 2}) } }; diff --git a/JSTests/wasm/spec-harness/wasm-constants.js b/JSTests/wasm/spec-harness/wasm-constants.js index 68c36ef1fd3d..24ae6edee3db 100644 --- a/JSTests/wasm/spec-harness/wasm-constants.js +++ b/JSTests/wasm/spec-harness/wasm-constants.js @@ -71,7 +71,7 @@ let kFunctionNamesCode = 1; let kLocalNamesCode = 2; let kWasmFunctionTypeForm = 0x60; -let kWasmAnyFunctionTypeForm = 0x70; +let kWasmFuncReftionTypeForm = 0x70; let kResizableMaximumFlag = 1; diff --git a/JSTests/wasm/spec-harness/wasm-module-builder.js b/JSTests/wasm/spec-harness/wasm-module-builder.js index 68fab8985c76..8e81af88fb97 100644 --- a/JSTests/wasm/spec-harness/wasm-module-builder.js +++ b/JSTests/wasm/spec-harness/wasm-module-builder.js @@ -321,7 +321,7 @@ class WasmModuleBuilder { section.emit_u32v(imp.initial); // initial if (has_max) section.emit_u32v(imp.maximum); // maximum } else if (imp.kind == kExternalTable) { - section.emit_u8(kWasmAnyFunctionTypeForm); + section.emit_u8(kWasmFuncReftionTypeForm); var has_max = (typeof imp.maximum) != "undefined"; section.emit_u8(has_max ? 1 : 0); // flags section.emit_u32v(imp.initial); // initial @@ -354,7 +354,7 @@ class WasmModuleBuilder { if (debug) print("emitting table @ " + binary.length); binary.emit_section(kTableSectionCode, section => { section.emit_u8(1); // one table entry - section.emit_u8(kWasmAnyFunctionTypeForm); + section.emit_u8(kWasmFuncReftionTypeForm); section.emit_u8(1); section.emit_u32v(wasm.function_table_length); section.emit_u32v(wasm.function_table_length); diff --git a/JSTests/wasm/spec-harness/wast.js b/JSTests/wasm/spec-harness/wast.js index 5d329c102f31..3ea71a3328e5 100644 --- a/JSTests/wasm/spec-harness/wast.js +++ b/JSTests/wasm/spec-harness/wast.js @@ -14831,7 +14831,7 @@ function elem_type(s) { return error(s, s[/* pos */2][0] - 1 | 0, "invalid element type"); } else { - return /* AnyFuncType */0; + return /* FuncRefType */0; } } @@ -20706,7 +20706,7 @@ function token(lexbuf) { ]; })]); case 11 : - return /* ANYFUNC */0; + return /* FUNCREF */0; case 12 : return /* MUT */1; case 13 : @@ -25993,7 +25993,7 @@ var yyact = /* array */[ ]; }, function () { - return /* AnyFuncType */0; + return /* FuncRefType */0; }, function (__caml_parser_env) { var _1 = Parsing.peek_val(__caml_parser_env, 0); @@ -27678,7 +27678,7 @@ var yytables = /* record */[ /* table */'\x86\0\xa3\0\x8b\0\xf9\0\x8b\0\x02\x01\xf7\0\xd9\0\xfc\0\0\x01\x1e\x01\xcf\0\x87\0\x88\0\xfd\0\x8d\0\x13\x01\x0f\x01\x05\x01\x8f\0\x83\0\x04\x01\b\x01\t\x01\x8a\0\xcf\0\x8e\0\xe6\0\x05\x01\xe7\0\x1c\x01\x1c\x01\x05\0\x17\x01\x18\x01*\x01,\x01-\x01\x89\x01\x8a\x01\x8b\x01#\x01\x19\0!\0\x83\x01\x84\x01\x12\0$\x01\x8b\0%\x01\x19\0&\x01\x8b\0T\0n\0\x0f\0\x15\0\x16\x005\x01U\x003\x014\x01v\0\xd1\0"\0\xe4\0\xe4\0\xd8\0\xe4\0\xe2\0\xe3\0D\0\x15\0\x16\0C\x01\x10\x01\x11\x01\x12\x01:\x01\x9b\x01\x1f\x01\xc5\0\xc8\0\x91\0\x12\0K\x01\x05\x01\xd5\0\x91\0\x91\0\xe8\0\xe9\0\xea\0\xeb\0\xec\0|\0\xed\0\xee\0\xef\0\xf0\0\xf1\0}\0J\x01\xaf\x01L\x01\x19\0\xc6\0\xca\0#\0_\x01$\0\x19\0\xd7\0\x19\0\xe4\0\xe4\0\xe4\0\x14\x01\n\x01\x11\0\xcf\0.\0\xcf\0\'\0\x0b\x01\xcf\0P\0g\x01m\x01o\x01P\0|\0~\0P\0+\x011\0.\x01 \x01~\0*\0+\0,\0-\0U\x01\x81\x002\0P\x01\x12\0\x82\0V\x01F\0W\x01\x89\0X\x01(\x01\x13\0\x14\0\x15\0\x16\0\x17\0\x18\0\x19\0\x1a\0\x1b\0\x1c\0\x1d\0\x1e\0\x1f\0 \0&\0L\0(\0)\0|\0\x99\x017\0G\0|\0\x80\x01T\x018\x005\x006\0v\x01\x81\0O\0\x14\x01k\0\x82\0E\0\x95\x01|\0l\0\x98\x01\x8f\x01\x1c\x01\x96\x01\x94\x01\x91\0<\x01=\x01w\x01\x97\x01~\0\x91\0H\0\x1a\x01\x84\0\xe2\0\xe3\0\x9d\x01\x9a\x01\x9f\x01\x01\0\x02\0\x03\0\x9c\x01/\x000\x003\x004\0I\0\xa1\x01Z\x01[\x01\\\x01]\x01n\x01\xab\x01a\0b\0c\0d\0e\0f\0g\0h\0i\0j\0\xc2\0\xae\x01t\x01\xc3\0\xc2\0i\x01\xcf\0\x07\x01j\x01\x19\0\x1c\0J\0\x19\0\x1c\0K\0\x0f\0P\0\xb4\x01\x0f\0Q\0\xb7\x01\xcf\0\xe2\0\xe3\0x\x01y\x01z\x01{\x01\xa3\0\x93\0\x94\0\x95\0\x87\x01\x87\x01\x87\x01\x87\x01\xcf\0\xde\0<\x01=\x01~\0)\x01R\0\x92\x01m\0\x1c\0\x91\0\x91\0\x1c\0S\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\x008\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0o\0\xa3\x01\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0p\0W\0X\0Y\0\x19\0\x19\0q\0Z\0r\0[\0\\\0]\0^\0s\0_\0`\0\x87\x01t\0\x1c\0u\0w\0\x1c\0~\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0x\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0y\0z\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0{\0\x1c\0\x90\0\x91\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\xbf\0\x1c\0\x92\0\xbe\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\xc0\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x1c\0\x84\0\xda\0\xc7\0\x89\0\xd4\0 \0 \0 \0 \0 \0 \0 \0\xdb\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0\x1c\0 \0 \0 \0 \0 \0 \0 \0 \0 \0\xdd\0\xf2\0\xfa\0\xfe\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x01\x01\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x03\x01 \0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\x17\0\n\x01\xf8\0)\x01\x16\x01"\0"\0"\0"\0"\0"\0"\0\x19\x01"\0"\0"\0"\0"\0"\0"\0"\0"\0"\0"\0"\0"\0"\0"\0"\0\x1b\x01\x17\0"\0"\0"\0"\0"\0"\0"\0"\0!\x01/\x01\'\x010\x01\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\x006\x01\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\x009\x01"\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0;\x01>\x01?\x01@\x01\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0A\x01\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0B\x01\x03\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x04\x01D\x01E\x01F\x01\x03\0\x0b\x01\x03\0\x03\0\x03\0\x03\0\x03\0a\x01\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0G\x01\x1e\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0I\x01M\x01O\x01Q\x01\x19\0\x19\0\x19\0\x19\0\x19\0R\x01\x19\0S\x01Y\x01\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0^\x01\x03\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0\x19\0`\x01b\x01c\x01d\x01\x03\0e\x01\x03\0\x03\0\x03\0\x03\0\x03\0r\x01f\x01\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0h\x01\x19\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0k\x01l\x01p\x01q\x01\x03\0\x03\0\x03\0\x03\0\x03\0s\x01\x03\0|\x01}\x01\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0~\x01\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x03\0\x7f\x01\x81\x01\x85\x01\x86\x01\x1e\0\x8d\x01\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x8c\x01\x8e\x01\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x91\x01\x03\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x1e\0\x93\x01\x9e\x01\xa0\x01\xa4\x01\x97\0\xb0\x01\x98\0\x99\0\x9a\0\xa5\x01\x9b\0\xa6\x01\xa7\x01\x9c\0\x9d\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\xa8\x01\x1e\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\xa9\x01\xaa\x01\xac\x01\xad\x01\xf6\0\xb2\x01\x98\0\x99\0\x9a\0\xb1\x01\x9b\0\xb3\x01\xa3\0\x9c\0\x9d\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\xb5\x01\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\xb6\x01\xb8\x01\x84\0\xa3\0\xf8\0~\0\x98\0\x99\0\x9a\0\x91\0\x9b\0\xaa\0P\0\x9c\0\x9d\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\x17\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\t\0R\0\x7f\0\x03\0\xfb\0\x03\0\x98\0\x99\0\x9a\0\x19\0\x9b\0P\0K\0\x9c\0\x9d\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0M\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0H\x01\xc1\0\xf5\0\xf4\0\x82\x018\x01\x98\0\x99\0\x9a\0N\x01\x9b\0\x0e\0\xd6\0\x9c\0\x9d\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\x99\0\xcb\0\0\0\xcc\0\0\0\0\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\xde\0\xdf\0\xe0\0\xe1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe2\0\xe3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\x99\0\xcb\0\0\0\xcc\0\0\0\xb3\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\0\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\xde\0\xdf\0\xe0\0\xe1\0\x98\0\x99\0\xcb\0\0\0\xcc\0\0\0\0\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\0\0\xdf\0\xe0\0\xe1\0\x98\0\x99\0\xcb\0\0\0\xcc\0\0\0\0\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\x99\0\xcb\0\0\0\xcc\0\x90\x01\xce\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\x99\0\xcb\0\0\0\xcc\0\0\0\0\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\0\0\0\0\0\0\xe1\0\x98\0\x99\0\xcb\0\0\0\xcc\0\xa2\x01\0\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\x99\0\xcb\0\0\0\xcc\0\0\0\0\0\x9c\0\xcd\0\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\xa3\0\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\xa9\0\xaa\0\0\0\xb3\0\xab\0\xac\0\xad\0\xae\0\xaf\0\xb0\0\xb1\0\xb2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb3\0', /* check */"Y\0\0\0\\\0\xb5\0^\0\xbf\0\xb4\0\x8f\0\xbc\0\xbd\0\xd7\0\x89\0Z\0[\0\xbc\0]\0\xce\0\xca\0\xc4\0^\0X\0\b\x01\xc5\0\xc6\0\\\0\x97\0^\0\x9b\0\xce\0\x9d\0\xd6\0\xd7\0\t\x01\xd1\0\xd2\0\xdf\0\xe0\0\xe1\0i\x01j\x01k\x01+\x01\x01\x01\n\0b\x01c\x012\x011\x01\x8a\x003\x01\t\x015\x01\x8e\0\x04\x01F\0\t\x01<\x01=\x01\xea\0\n\x01\xe6\0\xe7\0N\0\x8a\0\0\0\x9a\0\x9b\0\x8e\0\x9d\x008\x019\x01&\0<\x01=\x01\b\x01\xcb\0\xcc\0\xcd\0\xfc\0\x85\x01\xd8\0\x87\0\x88\0\x04\x012\x01\x11\x01\b\x01\x8d\0\t\x01\n\x01\x9e\0\x9f\0\xa0\0\xa1\0\xa2\0\x04\x01\xa4\0\xa5\0\xa6\0\xa7\0\xa8\0\n\x01\x10\x01\xaa\x01\x12\x01\x01\x01\x87\0\x88\0\0\0)\x01\x05\x01\x07\x01\x8d\0\t\x01\xcb\0\xcc\0\xcd\0\xcf\0\x01\x01\x03\0\xf6\0\t\x01\xf8\0\x04\x01\x07\x01\xfb\0\n\x011\x01<\x01=\x01\x0e\x01\x04\x01\x01\x01\x11\x01\xdf\0\t\x01\xe1\0\n\x01\x07\x01\x17\0\x18\0\x19\0\x1a\0+\x01\x01\x01\x1d\0\x1a\x012\x01\x05\x011\x01\x04\x013\x01\t\x015\x01\xde\0:\x01;\x01<\x01=\x01>\x01?\x01@\x01A\x01B\x01C\x01D\x01E\x01F\x01G\x01\x13\0\t\x01\x15\0\x16\0\x04\x01{\x01\x04\x01\x04\x01\x04\x01`\x01\n\x01\t\x01\x1f\0 \0\n\x01\x01\x01\n\x01\x14\x01\n\x01\x05\x01'\0x\x01\x04\x01\n\x01z\x01r\x01{\x01x\x01\n\x01\x04\x01.\x01/\x01Q\x01y\x01\x05\x01\n\x01\x04\x016\x01\t\x018\x019\x01\x8c\x01\x81\x01\x8e\x01\x01\0\x02\0\x03\0\x8a\x01\x1b\0\x1c\0\x1d\0\x1e\0\x04\x01\x90\x01#\x01$\x01%\x01&\x01<\x01\x9e\x019\0:\0;\0<\0=\0>\0?\0@\0A\0B\0\x06\x01\xa2\x01K\x01\t\x01\x06\x01\x0e\x01s\x01\t\x01\x11\x01\x06\x01\x06\x01\x04\x01\t\x01\t\x01\x04\x01\x07\x01\x04\x01\xb2\x01\n\x01\x04\x01\xb5\x01\x82\x018\x019\x01U\x01V\x01W\x01X\x01\n\x01\x01\x01\x02\x01\x03\x01h\x01i\x01j\x01k\x01\x91\x01-\x01.\x01/\x01\x05\x01\x06\x01\x04\x01t\x01\n\x01\x06\x01\t\x01\n\x01\t\x01\x04\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\t\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01\x92\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01+\x01,\x01-\x01\t\x01\n\x01\n\x011\x01\n\x013\x014\x015\x016\x01\n\x018\x019\x01\xaa\x01#\x01\x06\x01\n\x01\n\x01\t\x01\x05\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\n\x01H\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01\n\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\x06\x01\x04\x01\x04\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01+\x01\x0f\x01\n\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\t\x01\x04\x01\t\x01\t\x01\t\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\t\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01H\x01\"\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01!\x01\n\x01\t\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\t\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\x01\x01\t\x01\x06\x01\n\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\n\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\t\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\t\x01\x04\x01\n\x01\x04\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\"\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\n\x01\n\x01\n\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\x06\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\b\x01\n\x01\x01\x01\t\x01\t\x01\x07\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\x06\x01\x11\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\n\x01\n\x016\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01\n\x01\x0f\x01\n\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\n\x01\n\x01\x06\x01\t\x01\x04\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x014\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\x0e\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\x0e\x01\n\x01\n\x01\n\x01\t\x01\n\x01\x0b\x01\f\x01\r\x01\t\x01\x0f\x01\n\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\n\x01\n\x01\n\x01\t\x01\x06\x01\x0b\x01\f\x01\r\x01\x0e\x01\x0f\x01\n\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\t\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\n\x01\n\x01\n\x01\t\x01\t\x01\x0b\x01\f\x01\r\x01\n\x01\x0f\x01\n\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\x0e\x01\n\x01\n\x01\t\x01\x11\x01\x0b\x01\f\x01\r\x01\n\x01\x0f\x01\t\x01\0\0\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\x11\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\n\x01\n\x01\n\x01\t\x01\x01\x01\x0b\x01\f\x01\r\x01\n\x01\x0f\x01\n\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\n\x01\n\x01\x01\x01\n\x01\t\x01\t\x01\x0b\x01\f\x01\r\x01\x01\x01\x0f\x01\x0e\x01\n\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\n\x01H\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\x0e\x01\x86\0\xab\0\xaa\0\t\x01\xf4\0\x0b\x01\f\x01\r\x01\x14\x01\x0f\x01\x02\0\x8d\0\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\xff\xff\xff\xff\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff-\x01.\x01/\x010\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff8\x019\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\xff\xffH\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xff\xff\xff#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff-\x01.\x01/\x010\x01\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\xff\xff\xff\xff\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff\xff\xff.\x01/\x010\x01\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\xff\xff\xff\xff\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\x10\x017\x01\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\xff\xff\xff\xff\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff0\x01\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\x10\x01\xff\xff\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x01\f\x01\r\x01\xff\xff\x0f\x01\xff\xff\xff\xff\x12\x01\x13\x01\x14\x01\x15\x01\x16\x01\x17\x01\x18\x01\x19\x01\x1a\x01\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01 \x01\xff\xffH\x01#\x01$\x01%\x01&\x01'\x01(\x01)\x01*\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffH\x01", /* error_function */parse_error, - /* names_const */"ANYFUNC\0MUT\0LPAR\0RPAR\0NOP\0DROP\0BLOCK\0END\0IF\0THEN\0ELSE\0SELECT\0LOOP\0BR\0BR_IF\0BR_TABLE\0CALL\0CALL_INDIRECT\0RETURN\0GET_LOCAL\0SET_LOCAL\0TEE_LOCAL\0GET_GLOBAL\0SET_GLOBAL\0UNREACHABLE\0CURRENT_MEMORY\0GROW_MEMORY\0FUNC\0START\0TYPE\0PARAM\0RESULT\0LOCAL\0GLOBAL\0MODULE\0TABLE\0ELEM\0MEMORY\0DATA\0OFFSET\0IMPORT\0EXPORT\0SCRIPT\0REGISTER\0INVOKE\0GET\0ASSERT_MALFORMED\0ASSERT_INVALID\0ASSERT_SOFT_INVALID\0ASSERT_UNLINKABLE\0ASSERT_RETURN\0ASSERT_RETURN_NAN\0ASSERT_TRAP\0ASSERT_EXHAUSTION\0INPUT\0OUTPUT\0EOF\0", + /* names_const */"FUNCREF\0MUT\0LPAR\0RPAR\0NOP\0DROP\0BLOCK\0END\0IF\0THEN\0ELSE\0SELECT\0LOOP\0BR\0BR_IF\0BR_TABLE\0CALL\0CALL_INDIRECT\0RETURN\0GET_LOCAL\0SET_LOCAL\0TEE_LOCAL\0GET_GLOBAL\0SET_GLOBAL\0UNREACHABLE\0CURRENT_MEMORY\0GROW_MEMORY\0FUNC\0START\0TYPE\0PARAM\0RESULT\0LOCAL\0GLOBAL\0MODULE\0TABLE\0ELEM\0MEMORY\0DATA\0OFFSET\0IMPORT\0EXPORT\0SCRIPT\0REGISTER\0INVOKE\0GET\0ASSERT_MALFORMED\0ASSERT_INVALID\0ASSERT_SOFT_INVALID\0ASSERT_UNLINKABLE\0ASSERT_RETURN\0ASSERT_RETURN_NAN\0ASSERT_TRAP\0ASSERT_EXHAUSTION\0INPUT\0OUTPUT\0EOF\0", /* names_block */"NAT\0INT\0FLOAT\0TEXT\0VAR\0VALUE_TYPE\0LOAD\0STORE\0OFFSET_EQ_NAT\0ALIGN_EQ_NAT\0CONST\0UNARY\0BINARY\0COMPARE\0CONVERT\0TEST\0" ]; @@ -29467,7 +29467,7 @@ function string_of_value_types(ts) { } function string_of_elem_type() { - return "anyfunc"; + return "funcref"; } function string_of_limits(param) { @@ -29482,7 +29482,7 @@ function string_of_memory_type(param) { } function string_of_table_type(param) { - return string_of_limits(param[0]) + " anyfunc"; + return string_of_limits(param[0]) + " funcref"; } function string_of_global_type(param) { diff --git a/JSTests/wasm/spec-tests/imports.wast.js b/JSTests/wasm/spec-tests/imports.wast.js index 48d140966a4f..6b3faafad96f 100644 --- a/JSTests/wasm/spec-tests/imports.wast.js +++ b/JSTests/wasm/spec-tests/imports.wast.js @@ -188,15 +188,6 @@ assert_trap(() => call($14, "call", [3])); // imports.wast:290 assert_trap(() => call($14, "call", [100])); -// imports.wast:293 -assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x02\x8d\x80\x80\x80\x00\x02\x00\x00\x01\x70\x00\x0a\x00\x00\x01\x70\x00\x0a"); - -// imports.wast:297 -assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x02\x87\x80\x80\x80\x00\x01\x00\x00\x01\x70\x00\x0a\x04\x84\x80\x80\x80\x00\x01\x70\x00\x0a"); - -// imports.wast:301 -assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x04\x87\x80\x80\x80\x00\x02\x70\x00\x0a\x70\x00\x0a"); - // imports.wast:306 let $15 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x02\x97\x80\x80\x80\x00\x01\x04\x74\x65\x73\x74\x0c\x74\x61\x62\x6c\x65\x2d\x31\x30\x2d\x69\x6e\x66\x01\x70\x00\x0a"); diff --git a/JSTests/wasm/spec-tests/jsapi.js b/JSTests/wasm/spec-tests/jsapi.js index 179e4fe975cd..8e5d2283cdcc 100644 --- a/JSTests/wasm/spec-tests/jsapi.js +++ b/JSTests/wasm/spec-tests/jsapi.js @@ -514,16 +514,16 @@ test(() => { assertThrows(() => new Table(1), TypeError); assertThrows(() => new Table({initial:1, element:1}), TypeError); assertThrows(() => new Table({initial:1, element:"any"}), TypeError); - assertThrows(() => new Table({initial:1, element:{valueOf() { return "anyfunc" }}}), TypeError); - assertThrows(() => new Table({initial:{valueOf() { throw new Error("here")}}, element:"anyfunc"}), Error); - assertThrows(() => new Table({initial:-1, element:"anyfunc"}), RangeError); - assertThrows(() => new Table({initial:Math.pow(2,32), element:"anyfunc"}), RangeError); - assertThrows(() => new Table({initial:2, maximum:1, element:"anyfunc"}), RangeError); - assertThrows(() => new Table({initial:2, maximum:Math.pow(2,32), element:"anyfunc"}), RangeError); - assert_equals(new Table({initial:1, element:"anyfunc"}) instanceof Table, true); - assert_equals(new Table({initial:1.5, element:"anyfunc"}) instanceof Table, true); - assert_equals(new Table({initial:1, maximum:1.5, element:"anyfunc"}) instanceof Table, true); - assert_equals(new Table({initial:1, maximum:Math.pow(2,32)-1, element:"anyfunc"}) instanceof Table, true); + assertThrows(() => new Table({initial:1, element:{valueOf() { return "funcref" }}}), TypeError); + assertThrows(() => new Table({initial:{valueOf() { throw new Error("here")}}, element:"funcref"}), Error); + assertThrows(() => new Table({initial:-1, element:"funcref"}), RangeError); + assertThrows(() => new Table({initial:Math.pow(2,32), element:"funcref"}), RangeError); + assertThrows(() => new Table({initial:2, maximum:1, element:"funcref"}), RangeError); + assertThrows(() => new Table({initial:2, maximum:Math.pow(2,32), element:"funcref"}), RangeError); + assert_equals(new Table({initial:1, element:"funcref"}) instanceof Table, true); + assert_equals(new Table({initial:1.5, element:"funcref"}) instanceof Table, true); + assert_equals(new Table({initial:1, maximum:1.5, element:"funcref"}) instanceof Table, true); + assert_equals(new Table({initial:1, maximum:Math.pow(2,32)-1, element:"funcref"}) instanceof Table, true); }, "'WebAssembly.Table' constructor function"); test(() => { @@ -543,7 +543,7 @@ test(() => { }, "'WebAssembly.Table.prototype' object"); test(() => { - tbl1 = new Table({initial:2, element:"anyfunc"}); + tbl1 = new Table({initial:2, element:"funcref"}); assert_equals(typeof tbl1, "object"); assert_equals(String(tbl1), "[object WebAssembly.Table]"); assert_equals(Object.getPrototypeOf(tbl1), tableProto); @@ -631,7 +631,7 @@ test(() => { assertThrows(() => tblGrow.call({}), TypeError); assertThrows(() => tblGrow.call(tbl1, -1), RangeError); assertThrows(() => tblGrow.call(tbl1, Math.pow(2,32)), RangeError); - var tbl = new Table({element:"anyfunc", initial:1, maximum:2}); + var tbl = new Table({element:"funcref", initial:1, maximum:2}); assert_equals(tbl.length, 1); assert_equals(tbl.grow(0), 1); assert_equals(tbl.length, 1); @@ -732,7 +732,7 @@ test(() => { }, 'unexpected success in assertInstantiateError'); } var scratch_memory = new WebAssembly.Memory({initial:1}); - var scratch_table = new WebAssembly.Table({element:"anyfunc", initial:1, maximum:1}); + var scratch_table = new WebAssembly.Table({element:"funcref", initial:1, maximum:1}); assertInstantiateError([], TypeError); assertInstantiateError([undefined], TypeError); assertInstantiateError([1], TypeError); diff --git a/JSTests/wasm/stress/wasm-table-grow-initialize.js b/JSTests/wasm/stress/wasm-table-grow-initialize.js new file mode 100644 index 000000000000..9ba8e73305f0 --- /dev/null +++ b/JSTests/wasm/stress/wasm-table-grow-initialize.js @@ -0,0 +1,13 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual); +} + +var table = new WebAssembly.Table({ + element: "funcref", + initial: 20 +}); + +table.grow(5) +for (var i = 0; i < 25; ++i) + shouldBe(table.get(i), null); diff --git a/JSTests/wasm/wasm.json b/JSTests/wasm/wasm.json index 30bbc7472378..d4c3dcca22ca 100644 --- a/JSTests/wasm/wasm.json +++ b/JSTests/wasm/wasm.json @@ -11,14 +11,14 @@ "i64": { "type": "varint7", "value": -2, "b3type": "B3::Int64" }, "f32": { "type": "varint7", "value": -3, "b3type": "B3::Float" }, "f64": { "type": "varint7", "value": -4, "b3type": "B3::Double" }, - "anyfunc": { "type": "varint7", "value": -16, "b3type": "B3::Void" }, + "funcref": { "type": "varint7", "value": -16, "b3type": "B3::Int64" }, "anyref": { "type": "varint7", "value": -17, "b3type": "B3::Int64" }, "func": { "type": "varint7", "value": -32, "b3type": "B3::Void" }, "void": { "type": "varint7", "value": -64, "b3type": "B3::Void" } }, - "value_type": ["i32", "i64", "f32", "f64", "anyref"], - "block_type": ["i32", "i64", "f32", "f64", "void", "anyref"], - "elem_type": ["anyfunc","anyref"], + "value_type": ["i32", "i64", "f32", "f64", "anyref", "funcref"], + "block_type": ["i32", "i64", "f32", "f64", "void", "anyref", "funcref"], + "elem_type": ["funcref","anyref"], "external_kind": { "Function": { "type": "uint8", "value": 0 }, "Table": { "type": "uint8", "value": 1 }, @@ -59,17 +59,21 @@ "i64.const": { "category": "special", "value": 66, "return": ["i64"], "parameter": [], "immediate": [{"name": "value", "type": "varint64"}], "description": "a constant value interpreted as i64" }, "f64.const": { "category": "special", "value": 68, "return": ["f64"], "parameter": [], "immediate": [{"name": "value", "type": "double"}], "description": "a constant value interpreted as f64" }, "f32.const": { "category": "special", "value": 67, "return": ["f32"], "parameter": [], "immediate": [{"name": "value", "type": "float"}], "description": "a constant value interpreted as f32" }, - "ref.null": { "category": "special", "value": 208, "return": ["anyref"], "parameter": [], "immediate": [], "description": "a constant null reference" }, + "ref.null": { "category": "special", "value": 208, "return": ["funcref"], "parameter": [], "immediate": [], "description": "a constant null reference" }, "ref.is_null": { "category": "special", "value": 209, "return": ["i32"], "parameter": ["anyref"], "immediate": [], "description": "determine if a reference is null" }, + "ref.func": { "category": "special", "value": 210, "return": ["funcref"], "parameter": [], "immediate": [{"name": "function_index", "type": "varuint32"}], "description": "return a reference to the function at the given index" }, "get_local": { "category": "special", "value": 32, "return": ["any"], "parameter": [], "immediate": [{"name": "local_index", "type": "varuint32"}], "description": "read a local variable or parameter" }, "set_local": { "category": "special", "value": 33, "return": [], "parameter": ["any"], "immediate": [{"name": "local_index", "type": "varuint32"}], "description": "write a local variable or parameter" }, "tee_local": { "category": "special", "value": 34, "return": ["any"], "parameter": ["any"], "immediate": [{"name": "local_index", "type": "varuint32"}], "description": "write a local variable or parameter and return the same value" }, "get_global": { "category": "special", "value": 35, "return": ["any"], "parameter": [], "immediate": [{"name": "global_index", "type": "varuint32"}], "description": "read a global variable" }, "set_global": { "category": "special", "value": 36, "return": [], "parameter": ["any"], "immediate": [{"name": "global_index", "type": "varuint32"}], "description": "write a global variable" }, - "table.get": { "category": "special", "value": 37, "return": ["anyref"], "parameter": ["i32"], "immediate": [], "description": "get a table value" }, - "table.set": { "category": "special", "value": 38, "return": [], "parameter": ["i32", "anyref"], "immediate": [], "description": "set a table value" }, + "table.get": { "category": "special", "value": 37, "return": ["anyref"], "parameter": ["i32"], "immediate": [{"name": "table_index", "type": "varuint32"}], "description": "get a table value" }, + "table.set": { "category": "special", "value": 38, "return": [], "parameter": ["i32", "anyref"], "immediate": [{"name": "table_index", "type": "varuint32"}], "description": "set a table value" }, + "table.size": { "category": "exttable", "value": 252, "return": ["i32"], "parameter": [], "immediate": [{"name": "global_index", "type": "varuint32"}], "description": "get the size of a table", "extendedOp": 15 }, + "table.grow": { "category": "exttable", "value": 252, "return": ["i32"], "parameter": ["anyref", "i32"], "immediate": [{"name": "global_index", "type": "varuint32"}], "description": "grow a table by the given delta and return the previous size, or -1 if enough space cannot be allocated", "extendedOp": 16 }, + "table.fill": { "category": "exttable", "value": 252, "return": ["i32"], "parameter": ["i32", "anyref", "i32"], "immediate": [{"name": "global_index", "type": "varuint32"}], "description": "fill entries [i,i+n) with the given value", "extendedOp": 17 }, "call": { "category": "call", "value": 16, "return": ["call"], "parameter": ["call"], "immediate": [{"name": "function_index", "type": "varuint32"}], "description": "call a function by its index" }, - "call_indirect": { "category": "call", "value": 17, "return": ["call"], "parameter": ["call"], "immediate": [{"name": "type_index", "type": "varuint32"}, {"name": "reserved", "type": "varuint1"}], "description": "call a function indirect with an expected signature" }, + "call_indirect": { "category": "call", "value": 17, "return": ["call"], "parameter": ["call"], "immediate": [{"name": "type_index", "type": "varuint32"}, {"name": "table_index","type": "varuint32"}],"description": "call a function indirect with an expected signature" }, "i32.load8_s": { "category": "memory", "value": 44, "return": ["i32"], "parameter": ["addr"], "immediate": [{"name": "flags", "type": "varuint32"}, {"name": "offset", "type": "varuint32"}], "description": "load from memory" }, "i32.load8_u": { "category": "memory", "value": 45, "return": ["i32"], "parameter": ["addr"], "immediate": [{"name": "flags", "type": "varuint32"}, {"name": "offset", "type": "varuint32"}], "description": "load from memory" }, "i32.load16_s": { "category": "memory", "value": 46, "return": ["i32"], "parameter": ["addr"], "immediate": [{"name": "flags", "type": "varuint32"}, {"name": "offset", "type": "varuint32"}], "description": "load from memory" }, diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index ac2e99080e41..9e9bf5bcef32 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,12712 @@ +2020-01-10 Alan Coon + + Cherry-pick r254301. rdar://problem/58467176 + + REGRESSION (r253662): Large Data URLs are not being handled properly + https://bugs.webkit.org/show_bug.cgi?id=205979 + + + Reviewed by Youenn Fablet. + + Source/WebCore: + + The URL size limitation added in r253662 was too low. We should bump it to handle + reasonable data URI sizes. + + Test: fast/url/data-url-large.html. + + * page/SecurityOrigin.cpp: + + LayoutTests: + + * fast/url/data-url-large-expected.txt: Added. + * fast/url/data-url-large.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@254301 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2020-01-09 Brent Fulgham + + REGRESSION (r253662): Large Data URLs are not being handled properly + https://bugs.webkit.org/show_bug.cgi?id=205979 + + + Reviewed by Youenn Fablet. + + * fast/url/data-url-large-expected.txt: Added. + * fast/url/data-url-large.html: Added. + +2020-01-09 Alan Coon + + Cherry-pick r254220. rdar://problem/58429231 + + Fix specification violation in Font Loading API + https://bugs.webkit.org/show_bug.cgi?id=205901 + + + Reviewed by Brent Fulgham. + + Source/WebCore: + + Our Font Loading API does not comply with the spec: + + > If the parsed value is a CSS-wide keyword, return a syntax error. + + Rather than crashing, we should return a syntax error. + + Test: fast/text/font-loading-global-keyword.html + + * css/CSSFontFaceSet.cpp: + (WebCore::computeFontSelectionRequest): + (WebCore::CSSFontFaceSet::matchingFacesExcludingPreinstalledFonts): + + LayoutTests: + + Test all the entry points to the CSS Font Loading API that accept CSS keywords. + + * fast/text/font-loading-global-keyword-expected.txt: Added. + * fast/text/font-loading-global-keyword.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@254220 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2020-01-08 Myles C. Maxfield + + Fix specification violation in Font Loading API + https://bugs.webkit.org/show_bug.cgi?id=205901 + + + Reviewed by Brent Fulgham. + + Test all the entry points to the CSS Font Loading API that accept CSS keywords. + + * fast/text/font-loading-global-keyword-expected.txt: Added. + * fast/text/font-loading-global-keyword.html: Added. + +2020-01-08 Alan Coon + + Cherry-pick r252847. rdar://problem/58414545 + + REGRESSION (Safari 13): WebSocket payload is truncated when x-webkit-deflate-frame is used + https://bugs.webkit.org/show_bug.cgi?id=202401 + + + Reviewed by Alex Christensen. + + Source/WebCore: + + Test: http/tests/websocket/tests/hybi/deflate-extension.html + + * Modules/websockets/WebSocketDeflater.cpp: + (WebCore::WebSocketDeflater::finish): + Make sure to continue calling deflate until all output data is flushed. + + LayoutTests: + + * http/tests/websocket/tests/hybi/deflate-extension-expected.txt: Added. + * http/tests/websocket/tests/hybi/deflate-extension.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252847 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-11-25 Youenn Fablet + + REGRESSION (Safari 13): WebSocket payload is truncated when x-webkit-deflate-frame is used + https://bugs.webkit.org/show_bug.cgi?id=202401 + + + Reviewed by Alex Christensen. + + * http/tests/websocket/tests/hybi/deflate-extension-expected.txt: Added. + * http/tests/websocket/tests/hybi/deflate-extension.html: Added. + +2019-12-18 Dan Robson + + Cherry-pick r253563. rdar://problem/58049160 + + Consider top-level context whose origin is unique as insecure + https://bugs.webkit.org/show_bug.cgi?id=205111 + Source/WebCore: + + Reviewed by Brent Fulgham. + + Tests: http/tests/security/top-level-unique-origin.https.html + http/tests/security/top-level-unique-origin2.https.html + + * dom/Document.cpp: + (WebCore::Document::isSecureContext const): + There is no guarantee that top level unique origin contexts like data URL are SecureContext. + This patch makes them no longer SecureContext. + This helps getting closer to https://w3c.github.io/webappsec-secure-contexts/#is-url-trustworthy + which identifies all unique origins as "Not Trustworthy". + Child unique origin contexts will stay SecureContext if their parents are. + + Tools: + + + + Reviewed by Brent Fulgham. + + * TestWebKitAPI/Tests/WebKitCocoa/DeviceOrientation.mm: + (TEST): + Disable secure context checks so that loading directly about:blank from the API test + can call DeviceOrientationEvent.requestPermission() successfully. + + LayoutTests: + + Reviewed by Brent Fulgham. + + * http/tests/security/top-level-unique-origin.https-expected.txt: Added. + * http/tests/security/top-level-unique-origin.https.html: Added. + * http/tests/security/top-level-unique-origin2.https-expected.txt: Added. + * http/tests/security/top-level-unique-origin2.https.html: Added. + * platform/win/TestExpectations: Skipping second test as timing out in windows. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253563 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-12-16 youenn fablet + + Consider top-level context whose origin is unique as insecure + https://bugs.webkit.org/show_bug.cgi?id=205111 + + Reviewed by Brent Fulgham. + + * http/tests/security/top-level-unique-origin.https-expected.txt: Added. + * http/tests/security/top-level-unique-origin.https.html: Added. + * http/tests/security/top-level-unique-origin2.https-expected.txt: Added. + * http/tests/security/top-level-unique-origin2.https.html: Added. + * platform/win/TestExpectations: Skipping second test as timing out in windows. + +2019-12-18 Dan Robson + + Cherry-pick r253544. rdar://problem/58049164 + + SecurityOrigin should be unique for null blob URLs that have been unregistered + https://bugs.webkit.org/show_bug.cgi?id=205169 + + Reviewed by Darin Adler. + + Source/WebCore: + + In case we cannot retrieve a cached origin for a null origin, just create a unique one. + This is better than having an origin with an empty host and empty scheme. + + Test: http/tests/security/blob-null-url-location-origin.html + + * fileapi/ThreadableBlobRegistry.cpp: + (WebCore::ThreadableBlobRegistry::unregisterBlobURL): + (WebCore::ThreadableBlobRegistry::getCachedOrigin): + + LayoutTests: + + * http/tests/security/blob-null-url-location-origin-expected.txt: Added. + * http/tests/security/blob-null-url-location-origin.html: Added. + * platform/win/TestExpectations: Skipping test as timing out in windows. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@253544 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-12-16 youenn fablet + + SecurityOrigin should be unique for null blob URLs that have been unregistered + https://bugs.webkit.org/show_bug.cgi?id=205169 + + Reviewed by Darin Adler. + + * http/tests/security/blob-null-url-location-origin-expected.txt: Added. + * http/tests/security/blob-null-url-location-origin.html: Added. + * platform/win/TestExpectations: Skipping test as timing out in windows. + +2019-11-18 Alan Coon + + Apply patch. rdar://problem/57283569 + + 2019-11-18 Alex Christensen + + WKContentRuleLists should block requests from service workers + https://bugs.webkit.org/show_bug.cgi?id=201980 + + + Reviewed by Chris Dumez. + + * http/tests/contentextensions/resources/fetch-worker.js: Added. + (event.fetch.string_appeared_here.then): + (event.catch): + * http/tests/contentextensions/resources/serviceworkertest.js: Added. + (testServiceWorker): + (test): + * http/tests/contentextensions/service-worker.https-expected.txt: Added. + * http/tests/contentextensions/service-worker.https.html: Added. + * http/tests/contentextensions/service-worker.https.html.json: Added. + +2019-11-18 Alan Coon + + Apply patch. rdar://problem/57257755 + + 2019-11-18 John Wilander + + Check if ITP is on before applying third-party cookie blocking + https://bugs.webkit.org/show_bug.cgi?id=204109 + + + Reviewed by Chris Dumez and Alexey Proskuryakov. + + * http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off-expected.txt: Added. + * http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off.html: Added. + +2019-11-18 Alan Coon + + Cherry-pick r251680. rdar://problem/57283563 + + Hidden framesets should provide default edgeInfo value + https://bugs.webkit.org/show_bug.cgi?id=203506 + + + Reviewed by Simon Fraser. + + Source/WebCore: + + The grid information (and certain associated structures e.g. edegeInfo) for a frameset is updated through the layout() call. + When the used height/width computes to zero on a frameset child (frame or nested frameset), we don't run layout on the renderer thus + hidden nested framesets can only provide the default edge info. + This patch changes this behaviour and we now call layout on those hidden renderers the same way we do it on iOS. + + Test: fast/frames/hidden-frameset.html + + * rendering/RenderFrameSet.cpp: + (WebCore::RenderFrameSet::edgeInfo const): + + LayoutTests: + + * fast/frames/hidden-frameset-expected.txt: Added. + * fast/frames/hidden-frameset.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251680 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-28 Zalan Bujtas + + Hidden framesets should provide default edgeInfo value + https://bugs.webkit.org/show_bug.cgi?id=203506 + + + Reviewed by Simon Fraser. + + * fast/frames/hidden-frameset-expected.txt: Added. + * fast/frames/hidden-frameset.html: Added. + +2019-11-04 Alan Coon + + Cherry-pick r251957. rdar://problem/56887511 + + SVG pair properties must be detached from their owner before it's deleted + https://bugs.webkit.org/show_bug.cgi?id=203545 + + Reviewed by Simon Fraser. + + Source/WebCore: + + SVGAnimatedPropertyPairAccessor needs to override its detach() method so + each of its pair properties detaches itself from the owner. + SVGPointerMemberAccessor does the same thing but for a single property + which covers all the list properties as well. + + Test: svg/custom/pair-properties-detach.html + + * svg/properties/SVGAnimatedPropertyPairAccessor.h: + + LayoutTests: + + * svg/custom/pair-properties-detach-expected.txt: Added. + * svg/custom/pair-properties-detach.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251957 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-11-01 Said Abou-Hallawa + + SVG pair properties must be detached from their owner before it's deleted + https://bugs.webkit.org/show_bug.cgi?id=203545 + + Reviewed by Simon Fraser. + + * svg/custom/pair-properties-detach-expected.txt: Added. + * svg/custom/pair-properties-detach.html: Added. + +2019-10-29 Alan Coon + + Cherry-pick r251317. rdar://problem/56598357 + + [WebAuthn] Warn users when no credentials are found + https://bugs.webkit.org/show_bug.cgi?id=203147 + + + Reviewed by Brent Fulgham. + + Source/WebKit: + + This patch returns _WKWebAuthenticationPanelUpdateNoCredentialsFound to client via + -[_WKWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:] when either + CtapAuthenticator receives kCtap2ErrNoCredentials or U2fAuthenticator exhausts the + allow list. + + This patch also enhances CtapAuthenticator::tryDowngrade to check if the CTAP command + can be converted to U2F commands to ensure kCtap2ErrNoCredentials is returned if it + is the case. Otherwise, after downgrading, U2fAuthenticator will return NotSupportedError + given it can't convert the commands. + + * UIProcess/API/APIUIClient.h: + * UIProcess/API/APIWebAuthenticationPanelClient.h: + (API::WebAuthenticationPanelClient::updatePanel const): + * UIProcess/WebAuthentication/Authenticator.h: + * UIProcess/WebAuthentication/AuthenticatorManager.cpp: + (WebKit::AuthenticatorManager::authenticatorStatusUpdated): + * UIProcess/WebAuthentication/AuthenticatorManager.h: + * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.h: + * UIProcess/WebAuthentication/Cocoa/WebAuthenticationPanelClient.mm: + (WebKit::WebAuthenticationPanelClient::WebAuthenticationPanelClient): + (WebKit::wkWebAuthenticationPanelUpdate): + (WebKit::WebAuthenticationPanelClient::updatePanel const): + * UIProcess/WebAuthentication/WebAuthenticationFlags.h: Renamed from Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationPanelFlags.h. + * UIProcess/WebAuthentication/WebAuthenticationRequestData.h: + * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp: + * UIProcess/WebAuthentication/fido/CtapAuthenticator.cpp: + (WebKit::CtapAuthenticator::continueGetAssertionAfterResponseReceived): + (WebKit::CtapAuthenticator::tryDowngrade): + * UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp: + (WebKit::U2fAuthenticator::issueSignCommand): + * WebKit.xcodeproj/project.pbxproj: + + Tools: + + Adds new tests for _WKWebAuthenticationPanelUpdateNoCredentialsFound. + + * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: + * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: + (-[TestWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:]): + (TestWebKitAPI::TEST): + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-hid-cancel.html: + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-hid-no-credentials.html: Added. + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-hid.html: + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-nfc.html: + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-u2f-no-credentials.html: Added. + + LayoutTests: + + Adds new tests for CtapAuthenticator::tryDowngrade enhancement. + + * http/wpt/webauthn/public-key-credential-get-failure-hid.https-expected.txt: + * http/wpt/webauthn/public-key-credential-get-failure-hid.https.html: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251317 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-18 Jiewen Tan + + [WebAuthn] Warn users when no credentials are found + https://bugs.webkit.org/show_bug.cgi?id=203147 + + + Reviewed by Brent Fulgham. + + Adds new tests for CtapAuthenticator::tryDowngrade enhancement. + + * http/wpt/webauthn/public-key-credential-get-failure-hid.https-expected.txt: + * http/wpt/webauthn/public-key-credential-get-failure-hid.https.html: + +2019-10-29 Alan Coon + + Cherry-pick r251500. rdar://problem/56579657 + + [WebAuthn] Warn users when multiple NFC tags present + https://bugs.webkit.org/show_bug.cgi?id=200932 + + + Reviewed by Brent Fulgham. + + Source/WebCore: + + Covered by new tests in existing test file. + + * testing/MockWebAuthenticationConfiguration.h: + (WebCore::MockWebAuthenticationConfiguration::NfcConfiguration::encode const): + (WebCore::MockWebAuthenticationConfiguration::NfcConfiguration::decode): + * testing/MockWebAuthenticationConfiguration.idl: + Adds a new test option. + + Source/WebKit: + + This patch utilizes -[_WKWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:] to + inform clients about multiple physical tags are presenting such that clients can instruct users + to select only one of them physically. Given a physical tag could have multiple different + interfaces, which NearField will treat them into different NFTags, the tagID is then used to + identify if there are actually multiple physical tags. + + This patch also adds the ability to restart polling of a partiuclar NFReaderSession to NfcConnection + and the ability to restart the whole session to NfcService. The former is used to recover from errors + in the discovery stages, and the latter is used to recover from errors returned from authenticators + in the request stages. For the latter, given NfcConnection is not awared of the syntax of FIDO2/U2F + protocol, and CtapAuthenticator/U2fAuthenticator are not awared the transport of the underneath driver. + A generic restartDiscovery process is added to each service and it is up to the actual service to + implement the actual process such that AuthenticatorManager can arbitrarily call it after exceptions + are returned to restart the whole NFC session. To achieve restartDiscovery, NfcConnection is made + RefCounted as well such that both the NfcService and the CtapNfcDriver could hold it at the same time. + CtapNfcDriver uses the connection to complete requests as before while NfcService has the new capability + to use it to stop the current session when restartDiscovery kicks off. + + * Platform/spi/Cocoa/NearFieldSPI.h: + * UIProcess/WebAuthentication/AuthenticatorManager.cpp: + (WebKit::AuthenticatorManager::serviceStatusUpdated): + (WebKit::AuthenticatorManager::respondReceived): + (WebKit::AuthenticatorManager::restartDiscovery): + * UIProcess/WebAuthentication/AuthenticatorManager.h: + * UIProcess/WebAuthentication/AuthenticatorTransportService.cpp: + (WebKit::AuthenticatorTransportService::startDiscovery): + (WebKit::AuthenticatorTransportService::restartDiscovery): + * UIProcess/WebAuthentication/AuthenticatorTransportService.h: + (WebKit::AuthenticatorTransportService::restartDiscoveryInternal): + * UIProcess/WebAuthentication/Cocoa/NfcConnection.h: + * UIProcess/WebAuthentication/Cocoa/NfcConnection.mm: + (WebKit::NfcConnection::create): + (WebKit::NfcConnection::NfcConnection): + (WebKit::NfcConnection::~NfcConnection): + (WebKit::NfcConnection::stop const): + (WebKit::NfcConnection::didDetectTags): + (WebKit::NfcConnection::restartPolling): + (WebKit::NfcConnection::startPolling): + (WebKit::NfcConnection::didDetectTags const): Deleted. + * UIProcess/WebAuthentication/Cocoa/NfcService.h: + * UIProcess/WebAuthentication/Cocoa/NfcService.mm: + (WebKit::NfcService::NfcService): + (WebKit::NfcService::didConnectTag): + (WebKit::NfcService::didDetectMultipleTags const): + (WebKit::NfcService::setConnection): + (WebKit::NfcService::restartDiscoveryInternal): + (WebKit::NfcService::platformStartDiscovery): + (WebKit::NfcService::setDriver): Deleted. + * UIProcess/WebAuthentication/Mock/MockNfcService.h: + * UIProcess/WebAuthentication/Mock/MockNfcService.mm: + (-[WKMockNFTag tagID]): + (-[WKMockNFTag initWithNFTag:]): + (-[WKMockNFTag dealloc]): + (-[WKMockNFTag initWithType:]): + (-[WKMockNFTag initWithType:tagID:]): + (WebKit::MockNfcService::receiveStopPolling): + (WebKit::MockNfcService::receiveStartPolling): + (WebKit::MockNfcService::platformStartDiscovery): + (WebKit::MockNfcService::detectTags): + (WebKit::MockNfcService::detectTags const): Deleted. + * UIProcess/WebAuthentication/fido/CtapNfcDriver.cpp: + (WebKit::CtapNfcDriver::CtapNfcDriver): + * UIProcess/WebAuthentication/fido/CtapNfcDriver.h: + * UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp: + + Tools: + + * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: + * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: + (-[TestWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:]): + (TestWebKitAPI::TEST): + Adds a new test for -[_WKWebAuthenticationPanelDelegate panel:updateWebAuthenticationPanel:]. + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-nfc-multiple-tags.html: Added. + + LayoutTests: + + * http/wpt/webauthn/public-key-credential-create-success-nfc.https-expected.txt: + * http/wpt/webauthn/public-key-credential-create-success-nfc.https.html: + Adds new tests for multiple physical tags and service restart. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251500 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-21 Jiewen Tan + + [WebAuthn] Warn users when multiple NFC tags present + https://bugs.webkit.org/show_bug.cgi?id=200932 + + + Reviewed by Brent Fulgham. + + * http/wpt/webauthn/public-key-credential-create-success-nfc.https-expected.txt: + * http/wpt/webauthn/public-key-credential-create-success-nfc.https.html: + Adds new tests for multiple physical tags and service restart. + +2019-10-29 Alan Coon + + Cherry-pick r251489. rdar://problem/56579665 + + [WebAuthn] Supply FrameInfo in -[WKUIDelegatePrivate _webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:] + https://bugs.webkit.org/show_bug.cgi?id=202563 + + + Reviewed by Brent Fulgham. + + Source/WebCore: + + Covered by new test contents within existing tests. + + * Modules/webauthn/AuthenticatorCoordinator.cpp: + (WebCore::AuthenticatorCoordinator::create const): + (WebCore::AuthenticatorCoordinator::discoverFromExternalSource const): + * Modules/webauthn/AuthenticatorCoordinatorClient.h: + + Source/WebKit: + + This patch makes WKFrameInfo available to clients via the above SPI. To do so, + SecuirtyOrigin of the caller document is passed from WebContent Process. + + * UIProcess/API/APIUIClient.h: + (API::UIClient::runWebAuthenticationPanel): + * UIProcess/API/C/WKPage.cpp: + (WKPageSetPageUIClient): + * UIProcess/Cocoa/UIDelegate.h: + * UIProcess/Cocoa/UIDelegate.mm: + (WebKit::UIDelegate::UIClient::runWebAuthenticationPanel): + * UIProcess/WebAuthentication/AuthenticatorManager.cpp: + (WebKit::AuthenticatorManager::runPanel): + * UIProcess/WebAuthentication/WebAuthenticationRequestData.h: + * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp: + (WebKit::WebAuthenticatorCoordinatorProxy::makeCredential): + (WebKit::WebAuthenticatorCoordinatorProxy::getAssertion): + (WebKit::WebAuthenticatorCoordinatorProxy::handleRequest): + * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.h: + * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.messages.in: + * WebProcess/WebAuthentication/WebAuthenticatorCoordinator.cpp: + (WebKit::WebAuthenticatorCoordinator::makeCredential): + (WebKit::WebAuthenticatorCoordinator::getAssertion): + * WebProcess/WebAuthentication/WebAuthenticatorCoordinator.h: + + Tools: + + Adds new test contents into existing tests. + + * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: + (-[TestWebAuthenticationPanelUIDelegate init]): + (-[TestWebAuthenticationPanelUIDelegate _webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:]): + (-[TestWebAuthenticationPanelUIDelegate frame]): + (TestWebKitAPI::TEST): + + LayoutTests: + + * http/wpt/webauthn/public-key-credential-get-success-hid.https.html: + Imporves the flakiness. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251489 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-22 Jiewen Tan + + [WebAuthn] Supply FrameInfo in -[WKUIDelegatePrivate _webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:] + https://bugs.webkit.org/show_bug.cgi?id=202563 + + + Reviewed by Brent Fulgham. + + * http/wpt/webauthn/public-key-credential-get-success-hid.https.html: + Imporves the flakiness. + +2019-10-29 Alan Coon + + Cherry-pick r251295. rdar://problem/56579665 + + [WebAuthn] Implement AuthenticatorCancel + https://bugs.webkit.org/show_bug.cgi?id=191523 + + + Reviewed by Brent Fulgham. + + Source/WebCore: + + Covered by new tests in existing test files. + + * Modules/credentialmanagement/CredentialsContainer.cpp: + (WebCore::CredentialsContainer::get): + (WebCore::CredentialsContainer::isCreate): + * Modules/webauthn/AuthenticatorCoordinator.cpp: + (WebCore::AuthenticatorCoordinator::create const): + (WebCore::AuthenticatorCoordinator::discoverFromExternalSource const): + * Modules/webauthn/AuthenticatorCoordinator.h: + * Modules/webauthn/AuthenticatorCoordinatorClient.cpp: Removed. + * Modules/webauthn/AuthenticatorCoordinatorClient.h: + * Modules/webauthn/PublicKeyCredential.cpp: + (WebCore::PublicKeyCredential::tryCreate): + * Modules/webauthn/PublicKeyCredential.h: + * Modules/webauthn/PublicKeyCredentialData.h: + * Modules/webauthn/fido/DeviceRequestConverter.h: + * Modules/webauthn/fido/FidoHidMessage.cpp: + (fido::FidoHidMessage::FidoHidMessage): + * Modules/webauthn/fido/FidoHidPacket.cpp: + (fido::FidoHidInitPacket::getSerializedData const): + (fido::FidoHidContinuationPacket::getSerializedData const): + * Sources.txt: + * WebCore.xcodeproj/project.pbxproj: + * testing/MockWebAuthenticationConfiguration.h: + (WebCore::MockWebAuthenticationConfiguration::HidConfiguration::encode const): + (WebCore::MockWebAuthenticationConfiguration::HidConfiguration::decode): + * testing/MockWebAuthenticationConfiguration.idl: + Adds a new option to test AuthenticatorCancel. + + Source/WebKit: + + This patch implement two ways to cancel a pending WebAuthn ceremony: + 1) Via navigation activities. Activities include i) main frame navigation, ii) main frame reload, + iii) main frame destruction, iv) sub frame navigation, and v) sub frame destruction. All the above + activities will cancel any pending WebAuthn ceremony that is associated with the frame. To prove + the association, a GlobalFrameIdentifier is bridged into WebAuthenticationRequestData. Navigation + cancel is done in WebPageProxy::didStartProvisionalLoadForFrameShared, and destruction cancel is done + in WebProcessProxy::didDestroyFrame and WebPageProxy::resetState. + 2) Via UI. This path is simply bridged -[_WKWebAuthenticationPanel cancel] into AuthenticatorManager. + Noted, this patch follows the spec to wait until time out to notify RPs. + References: i) Step 20 of https://www.w3.org/TR/webauthn/#createCredential, ii) Step 18 of + https://www.w3.org/TR/webauthn/#getAssertion + + As for what the cancel actually does, it: + 1) stops any HID/NFC scanning; + 2) sends CTAPHID_CANCEL to any HID authenticators that have been added. Reference: + https://fidoalliance.org/specs/fido-v2.0-ps-20190130/fido-client-to-authenticator-protocol-v2.0-ps-20190130.html#usb-hid-cancel + Sending CTAPHID_CANCEL, however, is not trivial. An abstract class FidoAuthenticator is crafted to + do this labor for both CtapAuthenticator and U2fAuthenticator during the time of destructions. + Noted: The CtapHidDriver is the only CtapDriver implements the cancel method. Since the message + is sent during state reset, lifecycle of the HidConenction and HidService which manage the underlying + IOHIDDeviceRef is very hard to hold. This is required for the regular async sender. Therefore, + HidConnection::sendSync is crafted to send the message synchronously to get rid of the tediousness + of managing those lifecycles. + + P.S. Vector::grow doesn't initialize POD types. Therefore, this patch also appends it with memset + for FidoHidPacket. + + P.S.S. This patch also simplifies AuthenticatorCoordinatorClient by: i) moving code from AuthenticatorCoordinatorClient + to WebAuthenticatorCoordinatorClient, and ii) using sendWithAsyncReply. The latter allows us to + get rid of the complex mechanism of ensuring the right reply is returned. + + * DerivedSources.make: + * Sources.txt: + * UIProcess/API/APIWebAuthenticationPanel.cpp: + (API::WebAuthenticationPanel::create): + (API::WebAuthenticationPanel::WebAuthenticationPanel): + (API::WebAuthenticationPanel::cancel const): + * UIProcess/API/APIWebAuthenticationPanel.h: + * UIProcess/API/Cocoa/_WKWebAuthenticationPanel.mm: + (-[_WKWebAuthenticationPanel cancel]): + * UIProcess/WebAuthentication/AuthenticatorManager.cpp: + (WebKit::AuthenticatorManager::cancelRequest): + (WebKit::AuthenticatorManager::clearState): + (WebKit::AuthenticatorManager::runPanel): + (WebKit::AuthenticatorManager::resetState): + * UIProcess/WebAuthentication/AuthenticatorManager.h: + * UIProcess/WebAuthentication/Cocoa/HidConnection.h: + (WebKit::HidConnection::isInitialized const): + (WebKit::HidConnection::setIsInitialized): + * UIProcess/WebAuthentication/Cocoa/HidConnection.mm: + (WebKit::HidConnection::~HidConnection): + (WebKit::HidConnection::initialize): + (WebKit::HidConnection::terminate): + (WebKit::HidConnection::sendSync): + (WebKit::HidConnection::send): + (WebKit::HidConnection::registerDataReceivedCallback): + * UIProcess/WebAuthentication/Mock/MockHidConnection.cpp: + (WebKit::MockHidConnection::initialize): + (WebKit::MockHidConnection::terminate): + (WebKit::MockHidConnection::sendSync): + (WebKit::MockHidConnection::send): + (WebKit::MockHidConnection::feedReports): + * UIProcess/WebAuthentication/Mock/MockHidConnection.h: + * UIProcess/WebAuthentication/WebAuthenticationRequestData.h: + * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp: + (WebKit::WebAuthenticatorCoordinatorProxy::makeCredential): + (WebKit::WebAuthenticatorCoordinatorProxy::getAssertion): + (WebKit::WebAuthenticatorCoordinatorProxy::handleRequest): + (WebKit::WebAuthenticatorCoordinatorProxy::isUserVerifyingPlatformAuthenticatorAvailable): + (WebKit::WebAuthenticatorCoordinatorProxy::requestReply): Deleted. + * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.h: + * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.messages.in: + * UIProcess/WebAuthentication/fido/CtapAuthenticator.cpp: + (WebKit::CtapAuthenticator::CtapAuthenticator): + (WebKit::CtapAuthenticator::makeCredential): + (WebKit::CtapAuthenticator::getAssertion): + (WebKit::CtapAuthenticator::tryDowngrade): + * UIProcess/WebAuthentication/fido/CtapAuthenticator.h: + * UIProcess/WebAuthentication/fido/CtapDriver.h: + (WebKit::CtapDriver::cancel): + * UIProcess/WebAuthentication/fido/CtapHidDriver.cpp: + (WebKit::CtapHidDriver::Worker::write): + (WebKit::CtapHidDriver::Worker::read): + (WebKit::CtapHidDriver::Worker::returnMessage): + (WebKit::CtapHidDriver::Worker::reset): + (WebKit::CtapHidDriver::Worker::cancel): + (WebKit::CtapHidDriver::continueAfterChannelAllocated): + (WebKit::CtapHidDriver::continueAfterResponseReceived): + (WebKit::CtapHidDriver::returnResponse): + (WebKit::CtapHidDriver::reset): + (WebKit::CtapHidDriver::cancel): + * UIProcess/WebAuthentication/fido/CtapHidDriver.h: + * UIProcess/WebAuthentication/fido/FidoAuthenticator.cpp: Copied from Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.cpp. + (WebKit::FidoAuthenticator::FidoAuthenticator): + (WebKit::FidoAuthenticator::~FidoAuthenticator): + (WebKit::FidoAuthenticator::driver const): + (WebKit::FidoAuthenticator::releaseDriver): + * UIProcess/WebAuthentication/fido/FidoAuthenticator.h: Copied from Source/WebKit/UIProcess/API/APIWebAuthenticationPanel.cpp. + * UIProcess/WebAuthentication/fido/FidoService.cpp: + (WebKit::FidoService::continueAfterGetInfo): + * UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp: + (WebKit::U2fAuthenticator::U2fAuthenticator): + (WebKit::U2fAuthenticator::issueCommand): + * UIProcess/WebAuthentication/fido/U2fAuthenticator.h: + * UIProcess/WebPageProxy.cpp: + (WebKit::WebPageProxy::didStartProvisionalLoadForFrameShared): + (WebKit::WebPageProxy::resetState): + * UIProcess/WebProcessProxy.cpp: + (WebKit::WebProcessProxy::didDestroyFrame): + * WebKit.xcodeproj/project.pbxproj: + * WebProcess/WebAuthentication/WebAuthenticatorCoordinator.cpp: + (WebKit::WebAuthenticatorCoordinator::WebAuthenticatorCoordinator): + (WebKit::WebAuthenticatorCoordinator::makeCredential): + (WebKit::WebAuthenticatorCoordinator::getAssertion): + (WebKit::WebAuthenticatorCoordinator::isUserVerifyingPlatformAuthenticatorAvailable): + (WebKit::WebAuthenticatorCoordinator::~WebAuthenticatorCoordinator): Deleted. + * WebProcess/WebAuthentication/WebAuthenticatorCoordinator.h: + * WebProcess/WebAuthentication/WebAuthenticatorCoordinator.messages.in: Removed. + * WebProcess/WebPage/WebFrame.cpp: + (WebKit::WebFrame::fromCoreFrame): + * WebProcess/WebPage/WebFrame.h: + + Tools: + + * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: + * TestWebKitAPI/Tests/WebCore/FidoHidMessageTest.cpp: + (TestWebKitAPI::TEST): + * TestWebKitAPI/Tests/WebKitCocoa/_WKWebAuthenticationPanel.mm: + (-[TestWebAuthenticationPanelUIDelegate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:]): + (TestWebKitAPI::TEST): + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-hid-cancel.html: Copied from Tools/TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-hid.html. + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-hid.html: + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion-nfc.html: + * TestWebKitAPI/Tests/WebKitCocoa/web-authentication-get-assertion.html: + + LayoutTests: + + Modified one of the error message that is no longer emitted. + + * http/wpt/webauthn/public-key-credential-create-failure.https.html: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + * http/wpt/webauthn/public-key-credential-get-failure.https.html: + * http/wpt/webauthn/public-key-credential-get-success-hid.https.html: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251295 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-18 Jiewen Tan + + [WebAuthn] Implement AuthenticatorCancel + https://bugs.webkit.org/show_bug.cgi?id=191523 + + + Reviewed by Brent Fulgham. + + Modified one of the error message that is no longer emitted. + + * http/wpt/webauthn/public-key-credential-create-failure.https.html: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + * http/wpt/webauthn/public-key-credential-get-failure.https.html: + * http/wpt/webauthn/public-key-credential-get-success-hid.https.html: + +2019-10-29 Alan Coon + + Cherry-pick r250940. rdar://problem/56598350 + + [WebAuthn] Move the mock testing entrance to Internals + https://bugs.webkit.org/show_bug.cgi?id=202560 + + + Reviewed by Chris Dumez. + + Source/WebCore: + + This patch moves TestRunner.setWebAuthenticationMockConfiguration to + Internals.setMockWebAuthenticationConfiguration and removes the old + entrance. The purpose of this patch is to allow API tests to use + the same mock infrastructure that is used by layout tests. + + No new tests, covered by updates on existing tests. + + * DerivedSources-input.xcfilelist: + * DerivedSources-output.xcfilelist: + * DerivedSources.make: + * Modules/webauthn/PublicKeyCredentialCreationOptions.h: + * WebCore.xcodeproj/project.pbxproj: + * page/ChromeClient.h: + (WebCore::ChromeClient::setMockWebAuthenticationConfiguration): + * testing/Internals.cpp: + (WebCore::Internals::setMockWebAuthenticationConfiguration): + * testing/Internals.h: + * testing/Internals.idl: + * testing/MockWebAuthenticationConfiguration.h: Added. + (WebCore::MockWebAuthenticationConfiguration::LocalConfiguration::encode const): + (WebCore::MockWebAuthenticationConfiguration::LocalConfiguration::decode): + (WebCore::MockWebAuthenticationConfiguration::HidConfiguration::encode const): + (WebCore::MockWebAuthenticationConfiguration::HidConfiguration::decode): + (WebCore::MockWebAuthenticationConfiguration::NfcConfiguration::encode const): + (WebCore::MockWebAuthenticationConfiguration::NfcConfiguration::decode): + (WebCore::MockWebAuthenticationConfiguration::encode const): + (WebCore::MockWebAuthenticationConfiguration::decode): + * testing/MockWebAuthenticationConfiguration.idl: Added. + + Source/WebKit: + + * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: + (WKWebsiteDataStoreSetWebAuthenticationMockConfiguration): Deleted. + * UIProcess/API/C/WKWebsiteDataStoreRef.h: + * UIProcess/WebAuthentication/AuthenticatorTransportService.cpp: + (WebKit::AuthenticatorTransportService::createMock): + * UIProcess/WebAuthentication/AuthenticatorTransportService.h: + * UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.cpp: + (WebKit::MockAuthenticatorManager::MockAuthenticatorManager): + * UIProcess/WebAuthentication/Mock/MockAuthenticatorManager.h: + * UIProcess/WebAuthentication/Mock/MockHidConnection.cpp: + (WebKit::MockHidConnection::send): + (WebKit::MockHidConnection::registerDataReceivedCallbackInternal): + (WebKit::MockHidConnection::parseRequest): + (WebKit::MockHidConnection::feedReports): + (WebKit::MockHidConnection::shouldContinueFeedReports): + * UIProcess/WebAuthentication/Mock/MockHidConnection.h: + * UIProcess/WebAuthentication/Mock/MockHidService.cpp: + (WebKit::MockHidService::MockHidService): + * UIProcess/WebAuthentication/Mock/MockHidService.h: + * UIProcess/WebAuthentication/Mock/MockLocalConnection.h: + * UIProcess/WebAuthentication/Mock/MockLocalConnection.mm: + (WebKit::MockLocalConnection::MockLocalConnection): + * UIProcess/WebAuthentication/Mock/MockLocalService.h: + * UIProcess/WebAuthentication/Mock/MockLocalService.mm: + (WebKit::MockLocalService::MockLocalService): + * UIProcess/WebAuthentication/Mock/MockNfcService.h: + * UIProcess/WebAuthentication/Mock/MockNfcService.mm: + (WebKit::MockNfcService::MockNfcService): + (WebKit::MockNfcService::platformStartDiscovery): + (WebKit::MockNfcService::detectTags const): + * UIProcess/WebAuthentication/Mock/MockWebAuthenticationConfiguration.h: Removed. + * UIProcess/WebPageProxy.cpp: + (WebKit::WebPageProxy::setMockWebAuthenticationConfiguration): + * UIProcess/WebPageProxy.h: + * UIProcess/WebPageProxy.messages.in: + * UIProcess/WebsiteData/WebsiteDataStore.h: + * WebKit.xcodeproj/project.pbxproj: + * WebProcess/WebCoreSupport/WebChromeClient.cpp: + (WebKit::WebChromeClient::setMockWebAuthenticationConfiguration): + * WebProcess/WebCoreSupport/WebChromeClient.h: + + Tools: + + * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: + * WebKitTestRunner/InjectedBundle/TestRunner.cpp: + (WTR::TestRunner::setWebAuthenticationMockConfiguration): Deleted. + * WebKitTestRunner/InjectedBundle/TestRunner.h: + * WebKitTestRunner/TestController.cpp: + (WTR::TestController::setWebAuthenticationMockConfiguration): Deleted. + * WebKitTestRunner/TestController.h: + * WebKitTestRunner/TestInvocation.cpp: + (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle): + + LayoutTests: + + * http/wpt/webauthn/ctap-hid-failure.https.html: + * http/wpt/webauthn/ctap-hid-success.https.html: + * http/wpt/webauthn/ctap-nfc-failure.https.html: + * http/wpt/webauthn/idl.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-hid-silent.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-hid.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-local-silent.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-local.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-u2f-silent.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-u2f.https.html: + * http/wpt/webauthn/public-key-credential-create-failure.https.html: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + * http/wpt/webauthn/public-key-credential-create-success-local.https.html: + * http/wpt/webauthn/public-key-credential-create-success-nfc.https.html: + * http/wpt/webauthn/public-key-credential-create-success-u2f.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-hid-silent.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-hid.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-local-silent.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-local.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-nfc.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-u2f-silent.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-u2f.https.html: + * http/wpt/webauthn/public-key-credential-get-failure.https.html: + * http/wpt/webauthn/public-key-credential-get-success-hid.https.html: + * http/wpt/webauthn/public-key-credential-get-success-local.https.html: + * http/wpt/webauthn/public-key-credential-get-success-nfc.https.html: + * http/wpt/webauthn/public-key-credential-get-success-u2f.https.html: + * http/wpt/webauthn/resources/public-key-credential-ip-address.https.html: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250940 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-09 Jiewen Tan + + [WebAuthn] Move the mock testing entrance to Internals + https://bugs.webkit.org/show_bug.cgi?id=202560 + + + Reviewed by Chris Dumez. + + * http/wpt/webauthn/ctap-hid-failure.https.html: + * http/wpt/webauthn/ctap-hid-success.https.html: + * http/wpt/webauthn/ctap-nfc-failure.https.html: + * http/wpt/webauthn/idl.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-hid-silent.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-hid.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-local-silent.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-local.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-u2f-silent.https.html: + * http/wpt/webauthn/public-key-credential-create-failure-u2f.https.html: + * http/wpt/webauthn/public-key-credential-create-failure.https.html: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + * http/wpt/webauthn/public-key-credential-create-success-local.https.html: + * http/wpt/webauthn/public-key-credential-create-success-nfc.https.html: + * http/wpt/webauthn/public-key-credential-create-success-u2f.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-hid-silent.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-hid.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-local-silent.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-local.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-nfc.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-u2f-silent.https.html: + * http/wpt/webauthn/public-key-credential-get-failure-u2f.https.html: + * http/wpt/webauthn/public-key-credential-get-failure.https.html: + * http/wpt/webauthn/public-key-credential-get-success-hid.https.html: + * http/wpt/webauthn/public-key-credential-get-success-local.https.html: + * http/wpt/webauthn/public-key-credential-get-success-nfc.https.html: + * http/wpt/webauthn/public-key-credential-get-success-u2f.https.html: + * http/wpt/webauthn/resources/public-key-credential-ip-address.https.html: + +2019-10-24 Kocsen Chung + + Cherry-pick r250640. rdar://problem/56237433 + + REGRESSION (r245672): dropdown with text-rendering: optimizeLegibility freezes Safari + https://bugs.webkit.org/show_bug.cgi?id=202198 + + Reviewed by Tim Horton. + + * fast/forms/select-font-optical-size-expected.txt: Added. + * fast/forms/select-font-optical-size.html: Added. + +2019-10-20 Babak Shafiei + + Apply patch. rdar://problem/56427498 + + 2019-10-20 John Wilander + + Cherry-pick r251213. rdar://problem/56262708 + + Resource Load Statistics: Block all third-party cookies on websites without prior user interaction + https://bugs.webkit.org/show_bug.cgi?id=203017 + + + Reviewed by Alex Christensen. + + * http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction-expected.txt: Added. + * http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction.html: Added. + +2019-10-17 Alan Coon + + Cherry-pick r250589. rdar://problem/55927251 + + Storage Access API: document.hasStorageAccess() should return true when the cookie policy allows access + https://bugs.webkit.org/show_bug.cgi?id=202435 + + + Reviewed by Brent Fulgham. + + Source/WebCore: + + WebKit's Storage Access API implementation has so far only looked at whether ITP is + blocking cookie access or not. However, the default cookie policy is still in + effect underneath ITP. document.hasStorageAccess() should return true if the + third-party: + a) is not classified by ITP, and + b) has cookies which implies it can use cookies as third-party according to the + default cookie policy. + + Tests: http/tests/storageAccess/has-storage-access-false-by-default-ephemeral.html + http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral.html + http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies.html + + * platform/network/NetworkStorageSession.h: + * platform/network/cocoa/NetworkStorageSessionCocoa.mm: + (WebCore::NetworkStorageSession::hasCookies const): + * platform/network/curl/NetworkStorageSessionCurl.cpp: + (WebCore::NetworkStorageSession::hasCookies const): + Not yet implemented. Always says false. + * platform/network/soup/NetworkStorageSessionSoup.cpp: + (WebCore::NetworkStorageSession::hasCookies const): + Not yet implemented. Always says false. + + Source/WebKit: + + WebKit's Storage Access API implementation has so far only looked at whether ITP is + blocking cookie access or not. However, the default cookie policy is still in + effect underneath ITP. document.hasStorageAccess() should return true if the + third-party: + a) is not classified by ITP, and + b) has cookies which implies it can use cookies as third-party according to the + default cookie policy. + + * NetworkProcess/Classifier/ResourceLoadStatisticsMemoryStore.cpp: + (WebKit::ResourceLoadStatisticsMemoryStore::hasStorageAccess): + * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp: + (WebKit::WebResourceLoadStatisticsStore::hasCookies): + * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h: + * NetworkProcess/NetworkConnectionToWebProcess.cpp: + (WebKit::NetworkConnectionToWebProcess::hasStorageAccess): + * NetworkProcess/NetworkProcess.cpp: + (WebKit::NetworkProcess::registrableDomainsWithWebsiteData): + + Tools: + + This change makes sure topPrivatelyControlledDomain() correctly handles domains + with leading dots, as often used in cookie domains. + + * TestWebKitAPI/Tests/WebCore/PublicSuffix.cpp: + (TestWebKitAPI::TEST_F): + + LayoutTests: + + WebKit's Storage Access API implementation has so far only looked at whether ITP is + blocking cookie access or not. However, the default cookie policy is still in + effect underneath ITP. document.hasStorageAccess() should return true if the + third-party: + a) is not classified by ITP, and + b) has cookies which implies it can use cookies as third-party according to the + default cookie policy. + + * http/tests/storageAccess/has-storage-access-false-by-default-ephemeral-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-false-by-default-ephemeral.html: Copied from LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral.html: Copied from LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies.html: Renamed from LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html. + * platform/ios/TestExpectations: + * platform/mac-wk2/TestExpectations: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250589 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-01 John Wilander + + Storage Access API: document.hasStorageAccess() should return true when the cookie policy allows access + https://bugs.webkit.org/show_bug.cgi?id=202435 + + + Reviewed by Brent Fulgham. + + WebKit's Storage Access API implementation has so far only looked at whether ITP is + blocking cookie access or not. However, the default cookie policy is still in + effect underneath ITP. document.hasStorageAccess() should return true if the + third-party: + a) is not classified by ITP, and + b) has cookies which implies it can use cookies as third-party according to the + default cookie policy. + + * http/tests/storageAccess/has-storage-access-false-by-default-ephemeral-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-false-by-default-ephemeral.html: Copied from LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral.html: Copied from LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies.html: Renamed from LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html. + * platform/ios/TestExpectations: + * platform/mac-wk2/TestExpectations: + +2019-10-15 Kocsen Chung + + Cherry-pick r251086. rdar://problem/56237429 + + [Cocoa] REGRESSION (r245672): Contenteditable with optical sizing freezes Safari + https://bugs.webkit.org/show_bug.cgi?id=202262 + + Reviewed by Tim Horton. + + Source/WebKit: + + r250640 didn't go far enough. We need to apply the same fix everywhere [NSFontDescriptor fontDescriptorWithFontAttributes:] is called. + + * Shared/Cocoa/ArgumentCodersCocoa.mm: + (IPC::decodeFontInternal): + * Shared/Cocoa/CoreTextHelpers.h: Added. + * Shared/Cocoa/CoreTextHelpers.mm: Added. + (fontDescriptorWithFontAttributes): + * SourcesCocoa.txt: + * UIProcess/Cocoa/WebViewImpl.mm: + (WebKit::WebViewImpl::updateFontManagerIfNeeded): + * UIProcess/mac/WebPopupMenuProxyMac.mm: + (WebKit::WebPopupMenuProxyMac::showPopupMenu): + * WebKit.xcodeproj/project.pbxproj: + + LayoutTests: + + * fast/forms/contenteditable-font-optical-size-expected.txt: Added. + * fast/forms/contenteditable-font-optical-size.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251086 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-14 Myles C. Maxfield + + [Cocoa] REGRESSION (r245672): Contenteditable with optical sizing freezes Safari + https://bugs.webkit.org/show_bug.cgi?id=202262 + + Reviewed by Tim Horton. + + * fast/forms/contenteditable-font-optical-size-expected.txt: Added. + * fast/forms/contenteditable-font-optical-size.html: Added. + +2019-10-15 Kocsen Chung + + Cherry-pick r250887. rdar://problem/56061121 + + Partially undo r250811 + https://bugs.webkit.org/show_bug.cgi?id=202715 + + + Reviewed by Chris Dumez. + + Source/WebCore: + + This patch changes the SerializedScriptValue to always wrap CryptoKey objects again. + CryptoKey objects could belong to an array or another object. In those cases, IDBObjectStore + cannot set the flag for the embedded Cryptokey objects. Neither can postMessage to unset + the flag. Therefore, there is no way to separate the serialization process into two and + this patch restores the old behaviour. However, the hardening part of r250811 is kept + and therefore the crash should still be prevented. + + No new test, updated existing test + + * Modules/indexeddb/IDBObjectStore.cpp: + (WebCore::IDBObjectStore::putOrAdd): + (WebCore::JSC::setIsWrappingRequiredForCryptoKey): Deleted. + * bindings/js/SerializedScriptValue.cpp: + (WebCore::CloneSerializer::dumpIfTerminal): + (WebCore::CloneDeserializer::readTerminal): + * crypto/CryptoKey.h: + (WebCore::CryptoKey::allows const): + (WebCore::CryptoKey::isWrappingRequired const): Deleted. + (WebCore::CryptoKey::setIsWrappingRequired): Deleted. + (): Deleted. + * dom/ScriptExecutionContext.h: + + Tools: + + * TestWebKitAPI/Tests/WebKit/navigation-client-default-crypto.html: + Modified to crash if SerializedScriptValue doesn't wrap CryptoKey objects. + + LayoutTests: + + Some rebaselines. + + * crypto/workers/subtle/ec-postMessage-worker-expected.txt: + * crypto/workers/subtle/hrsa-postMessage-worker-expected.txt: + * crypto/workers/subtle/rsa-postMessage-worker-expected.txt: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250887 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-08 Jiewen Tan + + Partially undo r250811 + https://bugs.webkit.org/show_bug.cgi?id=202715 + + + Reviewed by Chris Dumez. + + Some rebaselines. + + * crypto/workers/subtle/ec-postMessage-worker-expected.txt: + * crypto/workers/subtle/hrsa-postMessage-worker-expected.txt: + * crypto/workers/subtle/rsa-postMessage-worker-expected.txt: + +2019-10-15 Kocsen Chung + + Cherry-pick r250844. rdar://problem/56061121 + + Unreviewed, test gardening + + * TestExpectations: + * platform/ios-simulator/TestExpectations: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250844 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-08 Jiewen Tan + + Unreviewed, test gardening + + * TestExpectations: + * platform/ios-simulator/TestExpectations: + +2019-10-15 Kocsen Chung + + Cherry-pick r250929. rdar://problem/56280990 + + RunResolver::rangeForRendererWithOffsets should check for range end + https://bugs.webkit.org/show_bug.cgi?id=202761 + + + Reviewed by Antti Koivisto. + + Source/WebCore: + + This patch ensures that when rangeForRenderer comes back with a collapsed run (empty range), rangeForRendererWithOffsets returns an empty range as well. + + Test: fast/text/simple-line-layout-range-check-end.html + + * rendering/SimpleLineLayoutResolver.cpp: + (WebCore::SimpleLineLayout::RunResolver::rangeForRendererWithOffsets const): + + LayoutTests: + + * fast/text/simple-line-layout-range-check-end-expected.txt: Added. + * fast/text/simple-line-layout-range-check-end.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250929 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-09 Zalan Bujtas + + RunResolver::rangeForRendererWithOffsets should check for range end + https://bugs.webkit.org/show_bug.cgi?id=202761 + + + Reviewed by Antti Koivisto. + + * fast/text/simple-line-layout-range-check-end-expected.txt: Added. + * fast/text/simple-line-layout-range-check-end.html: Added. + +2019-10-15 Kocsen Chung + + Cherry-pick r250811. rdar://problem/56061121 + + Only wrapping CryptoKeys for IDB during serialization + https://bugs.webkit.org/show_bug.cgi?id=202500 + + + Reviewed by Chris Dumez. + + Source/WebCore: + + Wrapping CryptoKeys during IDB serialization is a legacy request from Netflix when WebKit was an + early adopter. It is not necessary for other kinds of serialization. However, given existing keys + stored in users' idb are wrapped, the wrapping/unwrapping mechanism cannot be easily discarded. + Therefore, this patch restricts the wrapping/unwrapping mechanism to idb only. + + To do so, a isWrappingRequired flag is added to CryptoKey such that whenever idb sees a CryptoKey, + it can set it. SerializedScriptValue will then only wrap a CryptoKey when this flag is set. Otherwise, + a new tag UnwrappedCryptoKeyTag is used to store unwrapped CryptoKeys in order to keep the old CryptoKeyTag + binaries intact. For deserialization, each type will be deserialized differently. + + Besides the above, this patch also hardens WorkerGlobalScope::wrapCryptoKey/unwrapCryptoKey for + any potential racy issues. CryptoBooleanContainer is introduced to capture boolean in the lambda. + workerGlobalScope is replaced with workerMessagingProxy. Now, every variables captured in the lambdas + should be either a copy or a thread safe ref of the original object. + + Test: crypto/workers/subtle/aes-indexeddb.html + + * Modules/indexeddb/IDBObjectStore.cpp: + (WebCore::JSC::setIsWrappingRequiredForCryptoKey): + (WebCore::IDBObjectStore::putOrAdd): + * bindings/js/SerializedScriptValue.cpp: + (WebCore::CloneSerializer::dumpIfTerminal): + (WebCore::CloneDeserializer::readTerminal): + * crypto/CryptoKey.h: + (WebCore::CryptoKey::isWrappingRequired const): + (WebCore::CryptoKey::setIsWrappingRequired): + * dom/ScriptExecutionContext.h: + * workers/WorkerGlobalScope.cpp: + (WebCore::CryptoBooleanContainer::create): + (WebCore::CryptoBooleanContainer::boolean const): + (WebCore::CryptoBooleanContainer::setBoolean): + (WebCore::WorkerGlobalScope::wrapCryptoKey): + (WebCore::WorkerGlobalScope::unwrapCryptoKey): + * workers/WorkerGlobalScope.h: + * workers/WorkerLoaderProxy.h: + (WebCore::WorkerLoaderProxy::isWorkerMessagingProxy const): + * workers/WorkerMessagingProxy.h: + (isType): + + Tools: + + Modifies IndexedDB.StructuredCloneBackwardCompatibility test to include CryptoKeys. + + * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBStructuredCloneBackwardCompatibility.mm: + (-[StructuredCloneBackwardCompatibilityNavigationDelegate _webCryptoMasterKeyForWebView:]): + (TEST): + * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBStructuredCloneBackwardCompatibility.sqlite3: + * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBStructuredCloneBackwardCompatibility.sqlite3-shm: + * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBStructuredCloneBackwardCompatibility.sqlite3-wal: + * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBStructuredCloneBackwardCompatibilityRead.html: + * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBStructuredCloneBackwardCompatibilityWrite.html: + + LayoutTests: + + Adds a new test aes-indexeddb.html to do idb in workers and makes + other tests more deterministic. + + * crypto/workers/subtle/aes-indexeddb-expected.txt: Added. + * crypto/workers/subtle/aes-indexeddb.html: Added. + * crypto/workers/subtle/ec-postMessage-worker-expected.txt: + * crypto/workers/subtle/ec-postMessage-worker.html: + * crypto/workers/subtle/hrsa-postMessage-worker-expected.txt: + * crypto/workers/subtle/hrsa-postMessage-worker.html: + * crypto/workers/subtle/resources/aes-indexeddb.js: Added. + * crypto/workers/subtle/rsa-postMessage-worker-expected.txt: + * crypto/workers/subtle/rsa-postMessage-worker.html: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250811 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-07 Jiewen Tan + + Only wrapping CryptoKeys for IDB during serialization + https://bugs.webkit.org/show_bug.cgi?id=202500 + + + Reviewed by Chris Dumez. + + Adds a new test aes-indexeddb.html to do idb in workers and makes + other tests more deterministic. + + * crypto/workers/subtle/aes-indexeddb-expected.txt: Added. + * crypto/workers/subtle/aes-indexeddb.html: Added. + * crypto/workers/subtle/ec-postMessage-worker-expected.txt: + * crypto/workers/subtle/ec-postMessage-worker.html: + * crypto/workers/subtle/hrsa-postMessage-worker-expected.txt: + * crypto/workers/subtle/hrsa-postMessage-worker.html: + * crypto/workers/subtle/resources/aes-indexeddb.js: Added. + * crypto/workers/subtle/rsa-postMessage-worker-expected.txt: + * crypto/workers/subtle/rsa-postMessage-worker.html: + +2019-10-15 Kocsen Chung + + Cherry-pick r250431. rdar://problem/55927251 + + Storage Access API: document.hasStorageAccess() should return false by default + https://bugs.webkit.org/show_bug.cgi?id=202281 + + + Reviewed by Alex Christensen. + + document.hasStorageAccess() should return false by default so that it only + returns true if the context has asked for and been granted storage access. + + Source/WebKit: + + * NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp: + (WebKit::ResourceLoadStatisticsDatabaseStore::hasStorageAccess): + * NetworkProcess/Classifier/ResourceLoadStatisticsMemoryStore.cpp: + (WebKit::ResourceLoadStatisticsMemoryStore::hasStorageAccess): + + LayoutTests: + + * http/tests/storageAccess/has-storage-access-false-by-default-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-false-by-default.html: Added. + * platform/ios/TestExpectations: + The new test is marked as [ Pass ]. + * platform/mac-wk2/TestExpectations: + The new test is marked as [ Pass ]. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250431 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-27 John Wilander + + Storage Access API: document.hasStorageAccess() should return false by default + https://bugs.webkit.org/show_bug.cgi?id=202281 + + + Reviewed by Alex Christensen. + + document.hasStorageAccess() should return false by default so that it only + returns true if the context has asked for and been granted storage access. + + * http/tests/storageAccess/has-storage-access-false-by-default-expected.txt: Added. + * http/tests/storageAccess/has-storage-access-false-by-default.html: Added. + * platform/ios/TestExpectations: + The new test is marked as [ Pass ]. + * platform/mac-wk2/TestExpectations: + The new test is marked as [ Pass ]. + +2019-10-15 Kocsen Chung + + Cherry-pick r249517. rdar://problem/56000099 + + Mail appears to be double inverting code copied from Notes, Xcode, or Terminal. + https://bugs.webkit.org/show_bug.cgi?id=201368 + rdar://problem/40529867 + + Reviewed by Ryosuke Niwa. + + Source/WebCore: + + Dark mode content that is pasted should have the inline styles inverse color + transformed by the color filter to match the color filtered document contents. + + Layout Test: editing/pasteboard/paste-dark-mode-color-filtered.html + API Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent, + PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent + + * editing/EditingStyle.cpp: + (WebCore::EditingStyle::inverseTransformColorIfNeeded): Added caret-color to the transformed properties. + * editing/ReplaceSelectionCommand.cpp: + (WebCore::fragmentNeedsColorTransformed): Added. + (WebCore::ReplaceSelectionCommand::inverseTransformColor): Added. + (WebCore::ReplaceSelectionCommand::doApply): Call fragmentNeedsColorTransformed() and inverseTransformColor(). + * editing/ReplaceSelectionCommand.h: + + Tools: + + Added Tests: PasteHTML.TransformColorsOfDarkContent, PasteHTML.DoesNotTransformColorsOfLightContent, + PasteRTFD.TransformColorsOfDarkContent, PasteRTFD.DoesNotTransformColorsOfLightContent + + * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: + * TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm: + (createWebViewWithCustomPasteboardDataSetting): Added argument to enable color filter. + * TestWebKitAPI/Tests/WebKitCocoa/PasteRTFD.mm: + (createWebViewWithCustomPasteboardDataEnabled): Added argument to enable color filter. + * TestWebKitAPI/Tests/WebKitCocoa/rich-color-filtered.html: Added. + * TestWebKitAPI/cocoa/TestWKWebView.h: + * TestWebKitAPI/cocoa/TestWKWebView.mm: + (-[TestWKWebView forceDarkMode]): + + LayoutTests: + + * TestExpectations: + * editing/pasteboard/paste-dark-mode-color-filtered-expected.txt: Added. + * editing/pasteboard/paste-dark-mode-color-filtered.html: Added. + * platform/ios-12/TestExpectations: + * platform/ios/TestExpectations: + * platform/mac/TestExpectations: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249517 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-04 Timothy Hatcher + + Mail appears to be double inverting code copied from Notes, Xcode, or Terminal. + https://bugs.webkit.org/show_bug.cgi?id=201368 + rdar://problem/40529867 + + Reviewed by Ryosuke Niwa. + + * TestExpectations: + * editing/pasteboard/paste-dark-mode-color-filtered-expected.txt: Added. + * editing/pasteboard/paste-dark-mode-color-filtered.html: Added. + * platform/ios-12/TestExpectations: + * platform/ios/TestExpectations: + * platform/mac/TestExpectations: + +2019-10-04 Kocsen Chung + + Cherry-pick r249436. rdar://problem/55989217 + + [WebAuthn] Enable WebAuthn by default for MobileSafari and SafariViewService + https://bugs.webkit.org/show_bug.cgi?id=201369 + + + Reviewed by Brent Fulgham. + + Source/WebCore: + + * platform/RuntimeApplicationChecks.h: + * platform/cocoa/RuntimeApplicationChecksCocoa.mm: + (WebCore::IOSApplication::isSafariViewService): + Adds a way to detect SafariViewService. + + Source/WebKit: + + Communications to security keys require entitlements, which are not guaranteed to be present in third party + WKWebView clients. Therefore, only enable WebAuthn by default for MobileSafari and SafariViewService. + + * Shared/WebPreferences.yaml: + * Shared/WebPreferencesDefaultValues.cpp: + (WebKit::defaultWebAuthenticationEnabled): + * Shared/WebPreferencesDefaultValues.h: + + LayoutTests: + + * http/wpt/webauthn/public-key-credential-get-success-nfc.https.html: + Imporves the test a bit. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249436 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-03 Jiewen Tan + + [WebAuthn] Enable WebAuthn by default for MobileSafari and SafariViewService + https://bugs.webkit.org/show_bug.cgi?id=201369 + + + Reviewed by Brent Fulgham. + + * http/wpt/webauthn/public-key-credential-get-success-nfc.https.html: + Imporves the test a bit. + +2019-10-03 Alan Coon + + Cherry-pick r250659. rdar://problem/55954229 + + Support googleLegacyAppidSupport extension + https://bugs.webkit.org/show_bug.cgi?id=202427 + + + Reviewed by Brent Fulgham. + + Source/WebCore: + + This patch adds support for googleLegacyAppidSupport extension, when set: + 1) user agent should only use the U2F transport protocol, + 2) should only communicate with roaming authenticators, and + 3) should use a hard-coded appID of https://www.gstatic.com/securitykey/origins.json. + To be noticed as the name implies, this extension is exclusively for RP ID = google.com. + + Implementation wise, all operations are captured in methods with name processGoogleLegacyAppIdSupportExtension. + 1) AuthenticatorCoordinator takes care of setting the value. + 2) U2fCommandConstructor takes care of hard coding the AppID. + 3) AuthenticatorManager takes care of removing AuthenticatorTransport::Internal from TransportSet, so startDiscovery + will not poke platform authenticators. + 4) CtapAuthenticator takes care of downgrading to U2fAuthenticator. + 5) U2fAuthenticator takes care of setting the AppID in the response. + + Partially covered by new test cases in existing tests, and remaining will be covered by manual tests. + + * Modules/webauthn/AuthenticationExtensionsClientInputs.h: + (WebCore::AuthenticationExtensionsClientInputs::encode const): + (WebCore::AuthenticationExtensionsClientInputs::decode): + * Modules/webauthn/AuthenticationExtensionsClientInputs.idl: + * Modules/webauthn/AuthenticatorCoordinator.cpp: + (WebCore::AuthenticatorCoordinatorInternal::processGoogleLegacyAppIdSupportExtension): + (WebCore::AuthenticatorCoordinator::create const): + * Modules/webauthn/PublicKeyCredentialCreationOptions.h: + (WebCore::PublicKeyCredentialCreationOptions::encode const): + (WebCore::PublicKeyCredentialCreationOptions::decode): + * Modules/webauthn/fido/U2fCommandConstructor.cpp: + (fido::convertToU2fRegisterCommand): + (fido::processGoogleLegacyAppIdSupportExtension): + * Modules/webauthn/fido/U2fCommandConstructor.h: + + Source/WebKit: + + * UIProcess/WebAuthentication/AuthenticatorManager.cpp: + (WebKit::AuthenticatorManagerInternal::collectTransports): + (WebKit::AuthenticatorManagerInternal::processGoogleLegacyAppIdSupportExtension): + (WebKit::AuthenticatorManager::handleRequest): + * UIProcess/WebAuthentication/fido/CtapAuthenticator.cpp: + (WebKit::CtapAuthenticator::makeCredential): + (WebKit::CtapAuthenticator::processGoogleLegacyAppIdSupportExtension): + * UIProcess/WebAuthentication/fido/CtapAuthenticator.h: + * UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp: + (WebKit::U2fAuthenticator::continueRegisterCommandAfterResponseReceived): + + Tools: + + Adds an API test for googleLegacyAppidSupport extension. + + * TestWebKitAPI/Tests/WebCore/FidoTestData.h: + * TestWebKitAPI/Tests/WebCore/U2fCommandConstructorTest.cpp: + (TestWebKitAPI::constructMakeCredentialRequest): + (TestWebKitAPI::constructMakeCredentialRequestWithGoogleLegacyAppidSupport): + (TestWebKitAPI::TEST): + + LayoutTests: + + Add tests to confirm the googleLegacyAppidSupport extension is ignored for RP ID != google.com. + + * http/wpt/webauthn/public-key-credential-create-success-hid.https-expected.txt: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250659 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-10-03 Jiewen Tan + + Support googleLegacyAppidSupport extension + https://bugs.webkit.org/show_bug.cgi?id=202427 + + + Reviewed by Brent Fulgham. + + Add tests to confirm the googleLegacyAppidSupport extension is ignored for RP ID != google.com. + + * http/wpt/webauthn/public-key-credential-create-success-hid.https-expected.txt: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + +2019-10-03 Alan Coon + + Cherry-pick r248308. rdar://problem/55964805 + + [WebAuthN] Enable LocalAuthenticator for macOS + https://bugs.webkit.org/show_bug.cgi?id=182772 + + + Reviewed by Brent Fulgham. + + Source/WebKit: + + This patch enables LocalAuthenticator for macOS. The majority + of this patch is to tweak macOS keychain to use the modern one. + + * Configurations/WebKit.xcconfig: + * Platform/spi/Cocoa/DeviceIdentitySPI.h: + * UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm: + (WebKit::LocalAuthenticatorInternal::toVector): + (WebKit::LocalAuthenticator::makeCredential): + (WebKit::LocalAuthenticator::continueMakeCredentialAfterUserConsented): + (WebKit::LocalAuthenticator::continueMakeCredentialAfterAttested): + (WebKit::LocalAuthenticator::getAssertion): + (WebKit::LocalAuthenticator::continueGetAssertionAfterUserConsented): + * UIProcess/WebAuthentication/Cocoa/LocalConnection.mm: + (WebKit::LocalConnection::getUserConsent const): + (WebKit::LocalConnection::getAttestation const): + * UIProcess/WebAuthentication/Cocoa/LocalService.mm: + (WebKit::LocalService::isAvailable): + * UIProcess/WebAuthentication/Mock/MockLocalConnection.mm: + (WebKit::MockLocalConnection::getAttestation const): + * config.h: + + Source/WTF: + + * wtf/Platform.h: + Adds HAVE_DEVICE_IDENTITY. + * wtf/spi/cocoa/SecuritySPI.h: + Adds a SPI for telling macOS keychain to use the modern one. + + Tools: + + Add an entitlement file to WebKitTestRunner such that it can access + the modern macOS keychain. + + * WebKitTestRunner/Configurations/WebKitTestRunner.entitlements: Added. + * WebKitTestRunner/Configurations/WebKitTestRunner.xcconfig: + * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj: + * WebKitTestRunner/cocoa/TestControllerCocoa.mm: + (WTR::TestController::addTestKeyToKeychain): + (WTR::TestController::cleanUpKeychain): + (WTR::TestController::keyExistsInKeychain): + + LayoutTests: + + Enable existing local authenticator tests for macOS. Since OpenSource bots + don't have the internal setting to include restricted entitlements, tests + will fail on OpenSource bots. + + * platform/mac-wk2/TestExpectations: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248308 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-06 Jiewen Tan + + [WebAuthN] Enable LocalAuthenticator for macOS + https://bugs.webkit.org/show_bug.cgi?id=182772 + + + Reviewed by Brent Fulgham. + + Enable existing local authenticator tests for macOS. Since OpenSource bots + don't have the internal setting to include restricted entitlements, tests + will fail on OpenSource bots. + + * platform/mac-wk2/TestExpectations: + +2019-10-03 Kocsen Chung + + Cherry-pick r249108. rdar://problem/55927253 + + [WebAuthn] Support HID authenticators on iOS + https://bugs.webkit.org/show_bug.cgi?id=201084 + + + Reviewed by Youenn Fablet. + + Source/WebCore/PAL: + + * pal/spi/cocoa/IOKitSPI.h: + Move IOHIDDevice.h and IOHIDManager.h to IOKitSPI.h given they are in iOS. + + Source/WebKit: + + This patch makes the macOS HID implementation available in iOS as well. + Mostly, it removes the PLATFORM(MAC) compile time flag. + + * UIProcess/WebAuthentication/AuthenticatorManager.cpp: + (WebKit::AuthenticatorManagerInternal::collectTransports): + * UIProcess/WebAuthentication/AuthenticatorTransportService.cpp: + (WebKit::AuthenticatorTransportService::create): + (WebKit::AuthenticatorTransportService::createMock): + * UIProcess/WebAuthentication/Cocoa/HidConnection.h: + * UIProcess/WebAuthentication/Cocoa/HidConnection.mm: + * UIProcess/WebAuthentication/Cocoa/HidService.h: + * UIProcess/WebAuthentication/Cocoa/HidService.mm: + * UIProcess/WebAuthentication/Cocoa/NfcConnection.mm: + (WebKit::NfcConnection::NfcConnection): + A tentative solution before there is an official UI. + * UIProcess/WebAuthentication/Mock/MockHidConnection.cpp: + * UIProcess/WebAuthentication/Mock/MockHidConnection.h: + * UIProcess/WebAuthentication/Mock/MockHidService.cpp: + * UIProcess/WebAuthentication/Mock/MockHidService.h: + * UIProcess/WebAuthentication/fido/CtapHidDriver.cpp: + * UIProcess/WebAuthentication/fido/CtapHidDriver.h: + + LayoutTests: + + * platform/ios-wk2/TestExpectations: + Unskips HID tests for iOS. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249108 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-26 Jiewen Tan + + [WebAuthn] Support HID authenticators on iOS + https://bugs.webkit.org/show_bug.cgi?id=201084 + + + Reviewed by Youenn Fablet. + + * platform/ios-wk2/TestExpectations: + Unskips HID tests for iOS. + +2019-10-03 Kocsen Chung + + Cherry-pick r249059. rdar://problem/55927255 + + [WebAuthn] Support NFC authenticators for iOS + https://bugs.webkit.org/show_bug.cgi?id=188624 + + + Reviewed by Chris Dumez. + + Source/WebCore: + + Tests: http/wpt/webauthn/ctap-nfc-failure.https.html + http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html + http/wpt/webauthn/public-key-credential-create-success-nfc.https.html + http/wpt/webauthn/public-key-credential-get-failure-nfc.https.html + http/wpt/webauthn/public-key-credential-get-success-nfc.https.html + + * Modules/webauthn/apdu/ApduResponse.h: + Adds a new method to support moving m_data. + * Modules/webauthn/fido/FidoConstants.h: + Adds constants for NFC applet selection. + + Source/WebKit: + + This patch implements support for NFC authenticators including both FIDO2 and U2F ones. It utilizes a private + framework called NearField instead of CoreNFC to be able to supply a custom UI later if necessary. + + The patch follows almost the same flow as previous HID and Local authenticator support. + 1) Discovery is via NfcService which will invoke NFHardwareManager to start a generic NFC reader session. + 2) Once a reader session is established, a NfcConnection is created to start the polling and register the WKNFReaderSessionDelegate + to wait for 'didDetectTags'. + 3) When tags are detected, NfcConnection will determine if it meets our requriements: { type, connectability, fido applet availability }. + The first tag that meets all requirement will then be returned for WebAuthn operations. + 4) The first WebAuthn operation is to send authenticatorGetInfo command to determine the supported protocol, and then initialize corresponding + authenticators. Noted, the sending/receiving of this command is now abstracted into FidoService which will be shared across HidService and NfcService. + 5) From then, the actual WebAuthn request, either makeCredential or getAssertion will be sent. + + For testing, this patch follows the same flow as well. + 1) MockNfcService overrides NfcService to mock the behavior of NFC Tags discovery. + 2) The same class also swizzles methods from NFReaderSession to mock tag connection and communication. + + * Platform/spi/Cocoa/NearFieldSPI.h: Added. + * Sources.txt: + * SourcesCocoa.txt: + * UIProcess/API/C/WKWebsiteDataStoreRef.cpp: + (WKWebsiteDataStoreSetWebAuthenticationMockConfiguration): + * UIProcess/WebAuthentication/AuthenticatorManager.cpp: + (WebKit::AuthenticatorManagerInternal::collectTransports): + * UIProcess/WebAuthentication/AuthenticatorTransportService.cpp: + (WebKit::AuthenticatorTransportService::create): + (WebKit::AuthenticatorTransportService::createMock): + * UIProcess/WebAuthentication/Cocoa/HidService.h: + * UIProcess/WebAuthentication/Cocoa/HidService.mm: + (WebKit::HidService::HidService): + (WebKit::HidService::deviceAdded): + (WebKit::HidService::continueAddDeviceAfterGetInfo): Deleted. + * UIProcess/WebAuthentication/Cocoa/NearFieldSoftLink.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/Cocoa/NearFieldSoftLink.mm: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/Cocoa/NfcConnection.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/Cocoa/NfcConnection.mm: Added. + (WebKit::fido::compareVersion): + (WebKit::NfcConnection::NfcConnection): + (WebKit::NfcConnection::~NfcConnection): + (WebKit::NfcConnection::transact const): + (WebKit::NfcConnection::didDetectTags const): + * UIProcess/WebAuthentication/Cocoa/NfcService.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/Cocoa/NfcService.mm: Added. + (WebKit::NfcService::NfcService): + (WebKit::NfcService::~NfcService): + (WebKit::NfcService::didConnectTag): + (WebKit::NfcService::startDiscoveryInternal): + (WebKit::NfcService::platformStartDiscovery): + * UIProcess/WebAuthentication/Cocoa/WKNFReaderSessionDelegate.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/Cocoa/WKNFReaderSessionDelegate.mm: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + (-[WKNFReaderSessionDelegate initWithConnection:]): + (-[WKNFReaderSessionDelegate readerSession:didDetectTags:]): + * UIProcess/WebAuthentication/Mock/MockHidConnection.cpp: + (WebKit::MockHidConnection::send): + (WebKit::MockHidConnection::registerDataReceivedCallbackInternal): + (WebKit::MockHidConnection::parseRequest): + (WebKit::MockHidConnection::feedReports): + (WebKit::MockHidConnection::shouldContinueFeedReports): + * UIProcess/WebAuthentication/Mock/MockNfcService.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/Mock/MockNfcService.mm: Added. + (-[WKMockNFTag type]): + (-[WKMockNFTag initWithNFTag:]): + (-[WKMockNFTag description]): + (-[WKMockNFTag isEqualToNFTag:]): + (-[WKMockNFTag initWithType:]): + (WebKit::MockNfcService::MockNfcService): + (WebKit::MockNfcService::transceive): + (WebKit::MockNfcService::platformStartDiscovery): + (WebKit::MockNfcService::detectTags const): + * UIProcess/WebAuthentication/Mock/MockWebAuthenticationConfiguration.h: + * UIProcess/WebAuthentication/fido/CtapAuthenticator.cpp: + * UIProcess/WebAuthentication/fido/CtapAuthenticator.h: + * UIProcess/WebAuthentication/fido/CtapNfcDriver.cpp: Added. + (WebKit::CtapNfcDriver::CtapNfcDriver): + (WebKit::CtapNfcDriver::transact): + (WebKit::CtapNfcDriver::respondAsync const): + * UIProcess/WebAuthentication/fido/CtapNfcDriver.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/fido/FidoService.cpp: Added. + (WebKit::FidoService::FidoService): + (WebKit::FidoService::getInfo): + (WebKit::FidoService::continueAfterGetInfo): + * UIProcess/WebAuthentication/fido/FidoService.h: Copied from Source/WebKit/UIProcess/WebAuthentication/Cocoa/HidService.h. + * UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp: + * UIProcess/WebAuthentication/fido/U2fAuthenticator.h: + * UIProcess/ios/WebPageProxyIOS.mm: + * WebKit.xcodeproj/project.pbxproj: + + Source/WTF: + + * wtf/Platform.h: + Add a feature flag for NearField. + + Tools: + + * WebKitTestRunner/InjectedBundle/TestRunner.cpp: + (WTR::TestRunner::setWebAuthenticationMockConfiguration): + Setup NFC mock testing configuration. + + LayoutTests: + + * http/wpt/webauthn/ctap-nfc-failure.https-expected.txt: Added. + * http/wpt/webauthn/ctap-nfc-failure.https.html: Added. + * http/wpt/webauthn/public-key-credential-create-failure-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html: Added. + * http/wpt/webauthn/public-key-credential-create-success-hid.https-expected.txt: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + This patch replaces the "local" keyword with "hid". + * http/wpt/webauthn/public-key-credential-create-success-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-create-success-nfc.https.html: Added. + * http/wpt/webauthn/public-key-credential-get-failure-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-get-failure-nfc.https.html: Added. + * http/wpt/webauthn/public-key-credential-get-success-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-get-success-nfc.https.html: Added. + * http/wpt/webauthn/resources/util.js: + * platform/ios-simulator-wk2/TestExpectations: + Skip NFC tests for simulators. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249059 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-20 Jiewen Tan + + [WebAuthn] Support NFC authenticators for iOS + https://bugs.webkit.org/show_bug.cgi?id=188624 + + + Reviewed by Chris Dumez. + + * http/wpt/webauthn/ctap-nfc-failure.https-expected.txt: Added. + * http/wpt/webauthn/ctap-nfc-failure.https.html: Added. + * http/wpt/webauthn/public-key-credential-create-failure-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html: Added. + * http/wpt/webauthn/public-key-credential-create-success-hid.https-expected.txt: + * http/wpt/webauthn/public-key-credential-create-success-hid.https.html: + This patch replaces the "local" keyword with "hid". + * http/wpt/webauthn/public-key-credential-create-success-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-create-success-nfc.https.html: Added. + * http/wpt/webauthn/public-key-credential-get-failure-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-get-failure-nfc.https.html: Added. + * http/wpt/webauthn/public-key-credential-get-success-nfc.https-expected.txt: Added. + * http/wpt/webauthn/public-key-credential-get-success-nfc.https.html: Added. + * http/wpt/webauthn/resources/util.js: + * platform/ios-simulator-wk2/TestExpectations: + Skip NFC tests for simulators. + +2019-10-03 Kocsen Chung + + Cherry-pick r249107. rdar://problem/55927255 + + Unreviewed, test gardening + + * platform/mac-wk2/TestExpectations: + Skip WebAuthn tests for HighSierra and Mojave. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249107 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-26 Jiewen Tan + + Unreviewed, test gardening + + * platform/mac-wk2/TestExpectations: + Skip WebAuthn tests for HighSierra and Mojave. + +2019-09-30 Kocsen Chung + + Cherry-pick r250488. rdar://problem/55826334 + + Crash when removing the target element while animating its attributes + https://bugs.webkit.org/show_bug.cgi?id=202247 + + Reviewed by Darin Adler. + + Source/WebCore: + + If SMIL is animating a CSS attribute, there is a chance the animation is + ended while it is being started or progressed. For that reason, the member + SVGAnimateElementBase::m_animator has to be made RefPtr and it has to be + be protected in resetAnimatedType() and calculateAnimatedValue(). + + While SMILTimeContainer::updateAnimations() is calling progress() for the + scheduled animation elements, SMILTimeContainer::unschedule() might get + called if processing an animation causes events to be dispatched. For that + reason we need to copy the scheduled animations Vector before processing + them so we avoid changing the Vector while looping through its items. + + Remove the guard SMILTimeContainer::m_preventScheduledAnimationsChanges + which was added in r129670 for debugging purposes. In some situations, + the scheduled animations map could be modified out from under some of the + functions of SMILTimeContainer. + + Test: svg/animations/animate-and-remove-target-element.html + + * svg/SVGAnimateElementBase.cpp: + (WebCore::SVGAnimateElementBase::resetAnimatedType): + (WebCore::SVGAnimateElementBase::calculateAnimatedValue): + * svg/SVGAnimateElementBase.h: + * svg/SVGElement.cpp: + (WebCore::SVGElement::createAnimator): + * svg/SVGElement.h: + * svg/animation/SMILTimeContainer.cpp: + (WebCore::SMILTimeContainer::schedule): + (WebCore::SMILTimeContainer::unschedule): + (WebCore::SMILTimeContainer::setElapsed): + (WebCore::SMILTimeContainer::sortByPriority): + (WebCore::SMILTimeContainer::processAnimations): + (WebCore::SMILTimeContainer::processScheduledAnimations): + (WebCore::SMILTimeContainer::updateAnimations): + (WebCore::SMILTimeContainer::~SMILTimeContainer): Deleted. + * svg/animation/SMILTimeContainer.h: + * svg/animation/SVGSMILElement.cpp: + (WebCore::SVGSMILElement::calculateNextProgressTime const): + * svg/properties/SVGAnimatedPropertyAccessorImpl.h: + * svg/properties/SVGAnimatedPropertyAnimatorImpl.h: + * svg/properties/SVGAnimatedPropertyPairAccessorImpl.h: + * svg/properties/SVGAnimatedPropertyPairAnimator.h: + * svg/properties/SVGAnimatedPropertyPairAnimatorImpl.h: + * svg/properties/SVGAttributeAnimator.h: + * svg/properties/SVGMemberAccessor.h: + (WebCore::SVGMemberAccessor::createAnimator const): + * svg/properties/SVGPrimitivePropertyAnimator.h: + (WebCore::SVGPrimitivePropertyAnimator::create): + * svg/properties/SVGPropertyAnimatorFactory.h: + (WebCore::SVGPropertyAnimatorFactory::createAnimator): + * svg/properties/SVGPropertyOwnerRegistry.h: + * svg/properties/SVGPropertyRegistry.h: + * svg/properties/SVGValuePropertyAnimatorImpl.h: + * svg/properties/SVGValuePropertyListAnimatorImpl.h: + + LayoutTests: + + * svg/animations/animate-and-remove-target-element-expected.txt: Added. + * svg/animations/animate-and-remove-target-element.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250488 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-28 Said Abou-Hallawa + + Crash when removing the target element while animating its attributes + https://bugs.webkit.org/show_bug.cgi?id=202247 + + Reviewed by Darin Adler. + + * svg/animations/animate-and-remove-target-element-expected.txt: Added. + * svg/animations/animate-and-remove-target-element.html: Added. + +2019-09-30 Babak Shafiei + + Cherry-pick r248591. rdar://problem/55826878 + + FrameLoader::open can execute scritps via style recalc in Frame::setDocument + https://bugs.webkit.org/show_bug.cgi?id=200377 + + Reviewed by Antti Koivisto. + + Source/WebCore: + + Fixed the bug that FrameLoader::open can execute arbitrary author scripts via post style update callbacks + by adding PostResolutionCallbackDisabler, WidgetHierarchyUpdatesSuspensionScope, and NavigationDisabler + to CachedFrameBase::restore and FrameLoader::open. + + This ensures all frames are restored from the page cache before any of them would start running scripts. + + Test: fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update.html + + * history/CachedFrame.cpp: + (WebCore::CachedFrameBase::restore): + * loader/FrameLoader.cpp: + (WebCore::FrameLoader::open): + * page/FrameViewLayoutContext.cpp: + (WebCore::FrameViewLayoutContext::layout): Fixed the debug assertion. The layout of a document may be + updated while we're preparing to put a page into the page cache. + * rendering/RenderLayerCompositor.cpp: + (WebCore::RenderLayerCompositor::updateCompositingLayers): Ditto. + + LayoutTests: + + Added a regression test. + + * fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update-expected.txt: Added. + * fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update.html: Added. + * platform/win/TestExpectations: Skip the newly added test. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248591 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-12 Ryosuke Niwa + + FrameLoader::open can execute scritps via style recalc in Frame::setDocument + https://bugs.webkit.org/show_bug.cgi?id=200377 + + Reviewed by Antti Koivisto. + + Added a regression test. + + * fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update-expected.txt: Added. + * fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update.html: Added. + * platform/win/TestExpectations: Skip the newly added test. + +2019-09-30 Babak Shafiei + + Cherry-pick r248172. rdar://problem/55826873 + + Document::resume should delay resetting of form control elements. + https://bugs.webkit.org/show_bug.cgi?id=200376 + + Reviewed by Geoffrey Garen. + + Source/WebCore: + + Delay the execution of form control element resets until the next task + to avoid synchronously mutating DOM during page cache restoration. + + Test: fast/frames/restoring-page-cache-should-not-run-scripts.html + + * html/HTMLFormElement.cpp: + (WebCore::HTMLFormElement::resumeFromDocumentSuspension): + * html/HTMLInputElement.cpp: + (WebCore::HTMLInputElement::resumeFromDocumentSuspension): + + LayoutTests: + + Added a regression test. + + * fast/frames/restoring-page-cache-should-not-run-scripts-expected.txt: Added. + * fast/frames/restoring-page-cache-should-not-run-scripts.html: Added. + * platform/win/TestExpectations: Skip this test on Windows since navigating to blob fails on Windows. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248172 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-02 Ryosuke Niwa + + Document::resume should delay resetting of form control elements. + https://bugs.webkit.org/show_bug.cgi?id=200376 + + Reviewed by Geoffrey Garen. + + Added a regression test. + + * fast/frames/restoring-page-cache-should-not-run-scripts-expected.txt: Added. + * fast/frames/restoring-page-cache-should-not-run-scripts.html: Added. + * platform/win/TestExpectations: Skip this test on Windows since navigating to blob fails on Windows. + +2019-09-29 Alan Coon + + Cherry-pick r249893. rdar://problem/55825342 + + Expose misspelling ranges for editable content to accessibility clients. + https://bugs.webkit.org/show_bug.cgi?id=201752 + + + Patch by Andres Gonzalez on 2019-09-16 + Reviewed by Chris Fleizach. + + Source/WebCore: + + Test: accessibility/misspelling-range.html + + Added [WebAccessibilityObjectWrapper misspellingTextMarkerRange] and + underlying AccessibilityObject implementation to expose misspellings to + accessibility clients that provide an alternative user interface to + spell checking. + * accessibility/AccessibilityObject.cpp: + (WebCore::AccessibilityObject::getMisspellingRange const): + * accessibility/AccessibilityObject.h: + * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm: + (-[WebAccessibilityObjectWrapper misspellingTextMarkerRange:direction:]): + * accessibility/mac/WebAccessibilityObjectWrapperMac.mm: + (accessibilityMisspellingSearchCriteriaForParameterizedAttribute): + (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:forParameter:]): + + Tools: + + Test code needed for LayoutTests/accessibility/misspelling-range.html. + * WebKitTestRunner/InjectedBundle/AccessibilityUIElement.h: + * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityUIElement.idl: + * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm: + (WTR::AccessibilityUIElement::misspellingTextMarkerRange): + (WTR::AccessibilityUIElement::indexForTextMarker): + * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm: + (WTR::misspellingSearchParameterizedAttributeForCriteria): + (WTR::AccessibilityUIElement::misspellingTextMarkerRange): + + LayoutTests: + + * accessibility/misspelling-range-expected.txt: Added. + * accessibility/misspelling-range.html: Added. + * platform/ios-simulator/TestExpectations: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249893 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-16 Andres Gonzalez + + Expose misspelling ranges for editable content to accessibility clients. + https://bugs.webkit.org/show_bug.cgi?id=201752 + + + Reviewed by Chris Fleizach. + + * accessibility/misspelling-range-expected.txt: Added. + * accessibility/misspelling-range.html: Added. + * platform/ios-simulator/TestExpectations: + +2019-09-29 Babak Shafiei + + Apply patch. rdar://problem/55801087 + + 2019-09-29 John Wilander + + Cherry-pick r250413. + + Patch by Kate Cheney on 2019-09-26. + + Resource Load Statistics: Downgrade all third-party referrer headers + https://bugs.webkit.org/show_bug.cgi?id=201353 + + + Majority of this patch was written by John Wilander + + Reviewed by Brent Fulgham. + + The changes in the two http/tests/resourceLoadStatistics/strip-referrer-to-origin* + tests and the http/tests/navigation/ping-attribute/* tests are for the functional + change. The other changes are to make use of the new + testRunner.setStatisticsShouldDowngradeReferrer() to maintain earlier functionality. + + TestRunner::setStatisticsShouldDowngradeReferrer() function is not + supported for mac-wk1, win or wincairo. + + * http/tests/blink/sendbeacon/beacon-cross-origin-expected.txt: + * http/tests/navigation/ping-attribute/anchor-cross-origin.html: + * http/tests/navigation/ping-attribute/area-cross-origin.html: + * http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http-http.html: + * http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http.https.html: + * http/tests/referrer-policy/no-referrer-when-downgrade/same-origin.html: + * http/tests/referrer-policy/unsafe-url/cross-origin-http-http.html: + * http/tests/referrer-policy/unsafe-url/cross-origin-http.https.html: + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects-expected.txt: + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects.html: + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests-expected.txt: + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests.html: + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects-expected.txt: Copied from LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects-expected.txt. + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects.html: Copied from LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects.html. + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests-expected.txt: Copied from LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests-expected.txt. + * http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests.html: Copied from LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects.html. + * http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies-when-private-browsing-enabled.php: + * http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies.php: + * http/tests/security/referrer-policy-header.html: + * platform/ios-wk2/TestExpectations: + * platform/ios/TestExpectations: + * platform/mac-wk1/TestExpectations: + * platform/mac-wk2/TestExpectations: + * platform/win/TestExpectations: + * platform/wincairo/TestExpectations: + * platform/wk2/TestExpectations: + * resources/js-test.js: + (downgradeReferrerCallback): + * resources/testharnessreport.js: + +2019-09-27 Alan Coon + + Cherry-pick r250432. rdar://problem/55801091 + + [iOS]: When inserting a photo and then inserting auto-corrected text, the photo is removed + https://bugs.webkit.org/show_bug.cgi?id=202294 + + Patch by Said Abou-Hallawa on 2019-09-27 + Reviewed by Wenson Hsieh. + + Source/WebKit: + + WebPage::applyAutocorrectionInternal() calls wordRangeFromPosition() to + calculate the range of the word to be replaced with the auto-corrected + word. But if the text of the range does not match the original text, + applyAutocorrectionInternal() tries to correct the range by moving it + forward such that the length of the text range matches the length of the + original text. + + Another case, which should correct the range also, is: the range does not + have a text but it is not collapsed. In this case, we should set the range + back to the selection range so non-text nodes is removed. + + * WebProcess/WebPage/ios/WebPageIOS.mm: + (WebKit::WebPage::applyAutocorrectionInternal): + + LayoutTests: + + * fast/events/ios/autocorrect-after-image-expected.txt: Added. + * fast/events/ios/autocorrect-after-image.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250432 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-27 Said Abou-Hallawa + + [iOS]: When inserting a photo and then inserting auto-corrected text, the photo is removed + https://bugs.webkit.org/show_bug.cgi?id=202294 + + Reviewed by Wenson Hsieh. + + * fast/events/ios/autocorrect-after-image-expected.txt: Added. + * fast/events/ios/autocorrect-after-image.html: Added. + +2019-09-27 Alan Coon + + Cherry-pick r250392. rdar://problem/55770703 + + [iOS 13] Tapping on a non-editable text selection should toggle callout bar visibility instead of clearing selection + https://bugs.webkit.org/show_bug.cgi?id=202254 + + + Reviewed by Megan Gardner. + + Source/WebKit: + + In iOS 13, tapping a text selection should toggle callout bar visibility (i.e. "selection commands" in UIKit). + This currently does not work for non-editable text, since the synthetic click gesture simultaneously fires + alongside the text interaction assistant's non-editable tap gesture, which dispatches a click to the page which + then clears the selection. + + To remedy this and match platform behavior, we avoid recognizing clicks that occur over the text selection, but + only in the case where the bounding rect of the text selection doesn't cover a large portion of the visible + content rect of the web view. This ensures that the user doesn't get stuck in a state where it's impossible to + dismiss a very large text selection (e.g. after selecting all the content on the page). + + Tests: editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text.html + editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text.html + + * UIProcess/ios/WKContentViewInteraction.mm: + (-[WKContentView _shouldToggleSelectionCommandsAfterTapAt:]): + + Check the last known selection rects (on _lastSelectionDrawingInfo) to see if the tapped point lies within at + least one of the selection rects. + + (-[WKContentView gestureRecognizerShouldBegin:]): + + LayoutTests: + + * editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text-expected.txt: Added. + * editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text.html: Added. + + Add a new layout test to verify that when tapping in a text selection that encompasses the entire page, we allow + the tap to dismiss the selection instead of toggling callout bar visibility. + + * editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text-expected.txt: Added. + * editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text.html: Added. + + Add another layout test to verify that when tapping inside a text selection, the callout bar is toggled, and + when tapping outside the selected text, the selection is dismissed. + + * resources/ui-helper.js: + (window.UIHelper.async.waitForSelectionToAppear): + (window.UIHelper.async.waitForSelectionToDisappear): + + New helper methods to wait for selection rects to appear or disappear. + + (window.UIHelper): + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250392 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-26 Wenson Hsieh + + [iOS 13] Tapping on a non-editable text selection should toggle callout bar visibility instead of clearing selection + https://bugs.webkit.org/show_bug.cgi?id=202254 + + + Reviewed by Megan Gardner. + + * editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text-expected.txt: Added. + * editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text.html: Added. + + Add a new layout test to verify that when tapping in a text selection that encompasses the entire page, we allow + the tap to dismiss the selection instead of toggling callout bar visibility. + + * editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text-expected.txt: Added. + * editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text.html: Added. + + Add another layout test to verify that when tapping inside a text selection, the callout bar is toggled, and + when tapping outside the selected text, the selection is dismissed. + + * resources/ui-helper.js: + (window.UIHelper.async.waitForSelectionToAppear): + (window.UIHelper.async.waitForSelectionToDisappear): + + New helper methods to wait for selection rects to appear or disappear. + + (window.UIHelper): + +2019-09-27 Alan Coon + + Cherry-pick r250365. rdar://problem/55770710 + + Update selections after scrolling for iframes and hide selections while iframes and overflow scrolls are scrolling. + https://bugs.webkit.org/show_bug.cgi?id=202125 + + Reviewed by Tim Horton. + + Source/WebCore: + + Test: editing/selection/ios/update-selection-after-iframe-scroll.html + + When we end scrolling, make sure that iframes get a final update to ensure that the + selection is in the correct position. Pipe that to WebKit/UIProcess via + frame specific plath. + + * loader/EmptyClients.cpp: + * page/EditorClient.h: + * page/scrolling/AsyncScrollingCoordinator.cpp: + (WebCore::AsyncScrollingCoordinator::updateScrollPositionAfterAsyncScroll): + + Source/WebKit: + + Add additional calls into UIKit differentiate between main frame scrolling and overflow/iframe scrolling. + Add piping for iframe specific scrolling. + + * Platform/spi/ios/UIKitSPI.h: + * UIProcess/ios/WKContentViewInteraction.mm: + (-[WKContentView _willStartScrollingOrZooming]): + (-[WKContentView _didEndScrollingOrZooming]): + * WebProcess/WebCoreSupport/WebEditorClient.cpp: + (WebKit::WebEditorClient::subFrameScrollPositionChanged): + * WebProcess/WebCoreSupport/WebEditorClient.h: + * WebProcess/WebCoreSupport/ios/WebEditorClientIOS.mm: + (WebKit::WebEditorClient::subFrameScrollPositionChanged): + + Source/WebKitLegacy/mac: + + Filling out unused functions needed for new fix. + + * WebCoreSupport/WebEditorClient.h: + + LayoutTests: + + Test that an iframe selection is updated after a scroll is completed. + + * editing/selection/ios/update-selection-after-iframe-scroll-expected.txt: Added. + * editing/selection/ios/update-selection-after-iframe-scroll.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250365 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-25 Megan Gardner + + Update selections after scrolling for iframes and hide selections while iframes and overflow scrolls are scrolling. + https://bugs.webkit.org/show_bug.cgi?id=202125 + + Reviewed by Tim Horton. + + Test that an iframe selection is updated after a scroll is completed. + + * editing/selection/ios/update-selection-after-iframe-scroll-expected.txt: Added. + * editing/selection/ios/update-selection-after-iframe-scroll.html: Added. + +2019-09-27 Alan Coon + + Cherry-pick r250361. rdar://problem/55770728 + + Page temporarily jumps to an excessively small viewport scale while loading usatoday.com + https://bugs.webkit.org/show_bug.cgi?id=202224 + + + Reviewed by Tim Horton. + + Source/WebCore: + + On some pages (e.g. usatoday.com), the content width of the page temporarily becomes very large during page + load. This causes a couple of viewport scaling behaviors (notably, the existing shrink-to-fit heuristic in + ViewportConfiguration::initialScaleFromSize, as well as the new iPad-specific content-aware shrink-to-fit + heuristic in WebPage::immediatelyShrinkToFitContent) to cause the page to shrink down excessively in an attempt + to fit all the content to the viewport. This causes a very ugly flash as the page appears zoomed out initially + during page load, before zooming back in. + + To fix this, we add some sanity checks to these viewport scaling heuristics. In ViewportConfiguration's + initialScaleFromSize method, in the codepath where an initial scale is not specified, we always scale to fit the + contents of the page; instead, detect the case where the content width is enormous (with a threshold arbitrarily + chosen to be 1920) and fall back to the scaling to fit the viewport's width, if such a width has been explicitly + set. This ensures that we avoid excessive shrinking in the case where content is extremely wide, but also that + we do scale the viewport down to fit all the content in the case where the content isn't extremely wide (e.g. on + daringfireball.com). + + See WebKit ChangeLog for more detail. + + Test: fast/viewport/ios/shrink-to-fit-large-content-width.html + + * page/ViewportConfiguration.cpp: + (WebCore::ViewportConfiguration::initialScaleFromSize const): + + Source/WebKit: + + Tweaks the content-aware shrink-to-fit algorithm to bail in the case where the content width is extremely large, + such that it bails instead of attempting to fit the entire content of the page. See WebCore ChangeLog for more + details. + + * WebProcess/WebPage/ios/WebPageIOS.mm: + (WebKit::WebPage::immediatelyShrinkToFitContent): + + LayoutTests: + + Adds a new layout test to verify that when the content width of the page is excessively large and an explicit + viewport width is specified, we don't attempt to zoom out to fit the larger content width, and instead zoom to + fit the explicit viewport width. + + * fast/viewport/ios/shrink-to-fit-large-content-width-expected.txt: Added. + * fast/viewport/ios/shrink-to-fit-large-content-width.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250361 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-25 Wenson Hsieh + + Page temporarily jumps to an excessively small viewport scale while loading usatoday.com + https://bugs.webkit.org/show_bug.cgi?id=202224 + + + Reviewed by Tim Horton. + + Adds a new layout test to verify that when the content width of the page is excessively large and an explicit + viewport width is specified, we don't attempt to zoom out to fit the larger content width, and instead zoom to + fit the explicit viewport width. + + * fast/viewport/ios/shrink-to-fit-large-content-width-expected.txt: Added. + * fast/viewport/ios/shrink-to-fit-large-content-width.html: Added. + +2019-09-27 Alan Coon + + Cherry-pick r250315. rdar://problem/55770706 + + [iPadOs] The second click event is missing on double tap when dblclick handler is not present + https://bugs.webkit.org/show_bug.cgi?id=202006 + + + Reviewed by Wenson Hsieh. + + Source/WebKit: + + While double tapping, + 1. the first tap triggers a click event through the normal _singleTapIdentified/_singleTapRecognized codepath. + 2. and the second tap should trigger either + a second single click event or + a second single click followed by a dblclick event when dblclick handler is present. + However the second click is dropped on the floor when the node under the cursor does not have a dblclick handler (see handleDoubleTapForDoubleClickAtPoint()) -so we end up sending one click event. + + This patch fixes this case by sending the second tap through the normal single tap flow when the dblclick handler is not present. + + * Shared/ios/InteractionInformationAtPosition.h: + * Shared/ios/InteractionInformationAtPosition.mm: + (WebKit::InteractionInformationAtPosition::encode const): + (WebKit::InteractionInformationAtPosition::decode): + * UIProcess/ios/WKContentViewInteraction.h: + * UIProcess/ios/WKContentViewInteraction.mm: + (-[WKContentView setupInteraction]): + (-[WKContentView gestureRecognizerShouldBegin:]): + (WebKit::WebPage::positionInformation): + (WebKit::WebPage::requestPositionInformation): + + LayoutTests: + + * fast/events/touch/ios/double-tap-for-two-clicks1-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks1.html: Added. + * fast/events/touch/ios/double-tap-for-two-clicks2-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks2.html: Added. + * fast/events/touch/ios/double-tap-for-two-clicks3-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks3.html: Added. + * fast/events/touch/ios/double-tap-for-two-clicks4-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks4.html: Added. + * fast/events/touch/ios/doubleclick.html: Added. + * fast/events/touch/resources/doubleClickContent.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250315 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-24 Zalan Bujtas + + [iPadOs] The second click event is missing on double tap when dblclick handler is not present + https://bugs.webkit.org/show_bug.cgi?id=202006 + + + Reviewed by Wenson Hsieh. + + * fast/events/touch/ios/double-tap-for-two-clicks1-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks1.html: Added. + * fast/events/touch/ios/double-tap-for-two-clicks2-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks2.html: Added. + * fast/events/touch/ios/double-tap-for-two-clicks3-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks3.html: Added. + * fast/events/touch/ios/double-tap-for-two-clicks4-expected.txt: Added. + * fast/events/touch/ios/double-tap-for-two-clicks4.html: Added. + * fast/events/touch/ios/doubleclick.html: Added. + * fast/events/touch/resources/doubleClickContent.html: Added. + +2019-09-27 Alan Coon + + Cherry-pick r250300. rdar://problem/55770718 + + Mixed content blocking is bypassed for WebSockets in Workers (159726) + https://bugs.webkit.org/show_bug.cgi?id=159726 + + + Patch by Kate Cheney on 2019-09-24 + Reviewed by Brady Eidson. + + Source/WebCore: + + Tests: http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http.html + http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https.html + http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https.html + http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https.html + + * Modules/websockets/WebSocket.cpp: + (WebCore::WebSocket::connect): + * Modules/websockets/WorkerThreadableWebSocketChannel.cpp: + (WebCore::WorkerThreadableWebSocketChannel::Bridge::connect): + * loader/MixedContentChecker.cpp: + (WebCore::MixedContentChecker::checkForMixedContentInFrameTree): + * loader/MixedContentChecker.h: + Patch to block insecure WebSocket URL connection attempts by Workers + on secure pages. If the URL is ws, and any embedding iframe has protocol + https, and the context is a Worker, the connection should be blocked. + + I was unable to write a test case to hit the case where a document + does not have a frame and tries to communicate via a worker to + connect to a WebSocket because after removing the subframe from its + parent, the subframe is unable to perform a postMessage to a worker + even in the same script execution to tell the worker to connect + to a WebSocket. + + LayoutTests: + + Added 4 test cases and 2 html resources utilized by the tests. + The cases test the following: + 1. an https page with a worker trying to connect via ws: url --> + fails. + 2. an https page embedded in an http page trying to connect via ws + :url (through a worker) --> fails. + 3. an http page embedded in an https page with an http top frame + trying to connect via an insecure ws url fails. + 4. an https page embedded in an http page embedded in an https page + trying to connect to a ws :url via a worker --> fails. + + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http.html: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https.html: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https.html: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https.html: Added. + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedded-http.https.html: Added. + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedding-https.js: Added. + (handleConnect.self.postMessage): + (handleConnect): + (runTests.ws.onopen): + (runTests.ws.onerror): + (runTests): + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.html: Added. + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.js: Added. + (handleConnect.self.postMessage): + (handleConnect): + (runTests.ws.onopen): + (runTests.ws.onerror): + (runTests): + * http/tests/workers/service/resources/serviceworker-websocket-worker.js: + (async.doTest): + Updated previous test which was hitting the fix to use a wss url + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250300 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-24 Kate Cheney + + Mixed content blocking is bypassed for WebSockets in Workers (159726) + https://bugs.webkit.org/show_bug.cgi?id=159726 + + + Reviewed by Brady Eidson. + + Added 4 test cases and 2 html resources utilized by the tests. + The cases test the following: + 1. an https page with a worker trying to connect via ws: url --> + fails. + 2. an https page embedded in an http page trying to connect via ws + :url (through a worker) --> fails. + 3. an http page embedded in an https page with an http top frame + trying to connect via an insecure ws url fails. + 4. an https page embedded in an http page embedded in an https page + trying to connect to a ws :url via a worker --> fails. + + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http.html: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https.html: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https.html: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https-expected.txt: Added. + * http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https.html: Added. + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedded-http.https.html: Added. + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedding-https.js: Added. + (handleConnect.self.postMessage): + (handleConnect): + (runTests.ws.onopen): + (runTests.ws.onerror): + (runTests): + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.html: Added. + * http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.js: Added. + (handleConnect.self.postMessage): + (handleConnect): + (runTests.ws.onopen): + (runTests.ws.onerror): + (runTests): + * http/tests/workers/service/resources/serviceworker-websocket-worker.js: + (async.doTest): + Updated previous test which was hitting the fix to use a wss url + +2019-09-23 Alan Coon + + Cherry-pick r250255. rdar://problem/55644665 + + Improve CSP inheritance semantics + https://bugs.webkit.org/show_bug.cgi?id=201884 + + + Reviewed by Brent Fulgham. + + LayoutTests/imported/w3c: + + Update expected results now that we pass more sub-tests. + + * web-platform-tests/content-security-policy/inheritance/iframe-all-local-schemes-inherit-self.sub-expected.txt: + * web-platform-tests/content-security-policy/inheritance/window-expected.txt: + + Source/WebCore: + + Update the CSP inheritance semantics to more closely match the logic in section Initialize a Document's CSP list + of the CSP3 spec., . + + Towards this, move more of the inheritance logic out of Document::initContentSecurityPolicy() and into + DocumentWriter::begin() where details about the document being replaced live. This lets us remove the + need to track the previous content security policy to pass it to Document::initContentSecurityPolicy(). + Moreover, DocumentWriter::begin() knows the owner document that will be replaced with the result of + executing a JavaScript URL. This is needed in order to fix up inheritance of CSP for such documents. + + Tests: http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url.html + http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url.html + http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2.html + + * dom/Document.cpp: + (WebCore::Document::initSecurityContext): If we are inheriting the security origin from the owner + document then inherit its CSP policy. We copy over both the CSP state from the owner as well as + update 'self' to match the owner's origin so that CSP source expressions that include 'self' work + correctly even from about:blank documents. + (WebCore::Document::initContentSecurityPolicy): Move most of the logic from here into DocumentWriter::begin() + to take advantage of the fact that DocumentWriter::begin() knows about the outgoing document (if there + is one) as well as whether the outgoing document is being replaced with a new document that is the result + of evaluating a JavaScript URL. We need do know both these things in order to inherit the correct CSP + policy. This function only exists to copy some upgrade-insecure-requests state and to fix up plugin documents + as we currently do. + (WebCore::Document::shouldInheritContentSecurityPolicy const): Deleted. + * dom/Document.h: + * dom/SecurityContext.cpp: + (WebCore::SecurityContext::setContentSecurityPolicy): Modified to take its param by rvalue-reference + to make it less error prone to use. + * dom/SecurityContext.h: Expose setContentSecurityPolicy() so that we can invoke it from DocumentWriter::begin(). + * loader/DocumentWriter.cpp: + (WebCore::DocumentWriter::begin): For documents being replaced with the result of a JavaScript URL (i.e. ownerDocument + is non-null) inherit the CSP from the owner document. Similarly, if we have an existing document in the frame + and the protocol of the new document's URL is data: or blob: then inherit the CSP from the existing page. The latter + is what we currently do just moved from Document::initContentSecurityPolicy() and re-written in terms of the + existingDocument instead of previousContentSecurityPolicy. Also call setInsecureNavigationRequestsToUpgrade() + both when we have a non-null ownerDocument as well as when we have a non-null existingDocument. The former fixes + the block-all-mixed-content feature for documents loaded via JavaScript URLs and the latter is what we do now. + * loader/FrameLoader.cpp: + (WebCore::FrameLoader::didBeginDocument): Remove parameter previousContentSecurityPolicy as the logic that + made use of it moved to DocumentWriter::begin(). + * loader/FrameLoader.h: + * page/csp/ContentSecurityPolicy.h: + + LayoutTests: + + Add some more tests and update expected results of existing tests now that we pass more sub-tests. + + * http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url-expected.txt: Added. + * http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url.html: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url-expected.txt: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url.html: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2-expected.txt: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2.html: Added. + * http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt: I don't understand + why there is another duplicte console log message emitted, but there are already two such messages, which is + already one too many. The duplicate messages are more cosmetic than functional though there may be implications + with respect to CSP reporting. Filed to track this issue. + * platform/mac-wk1/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt: + * platform/win/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250255 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-23 Daniel Bates + + Improve CSP inheritance semantics + https://bugs.webkit.org/show_bug.cgi?id=201884 + + + Reviewed by Brent Fulgham. + + Add some more tests and update expected results of existing tests now that we pass more sub-tests. + + * http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url-expected.txt: Added. + * http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url.html: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url-expected.txt: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url.html: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2-expected.txt: Added. + * http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2.html: Added. + * http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt: I don't understand + why there is another duplicte console log message emitted, but there are already two such messages, which is + already one too many. The duplicate messages are more cosmetic than functional though there may be implications + with respect to CSP reporting. Filed to track this issue. + * platform/mac-wk1/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt: + * platform/win/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt: + +2019-09-23 Alan Coon + + Cherry-pick r250183. rdar://problem/55608006 + + [Pointer Events] touch-action set to pan-x or pan-y alone should disable scrolling altogether if the intial gesture is in the disallowed direction + https://bugs.webkit.org/show_bug.cgi?id=202053 + + + Reviewed by Tim Horton. + + Source/WebKit: + + Although the Pointer Events specification does not specify this clearly (see https://github.com/w3c/pointerevents/issues/303), setting "touch-action" to a value + that only allows scrolling a specific direction ("pan-x" or "pan-y") should disable scrolling in the specified direction if the panning gesture initially is directed + in the opposite direction. In practice, this means that setting "touch-action: pan-y" on an element should disable scrolling if the user initially pans horizontally, + even if later on in the gesture the user pans vertically. This allows for sites that want to offer a programmatic horizontal scroller to disable vertical scrolling + if the user pans horizontally. + + In order to support this, we add four UISwipeGestureRecognizers, one for each direction, and we selectively allows touches to be recognizer for them based on the + "touch-action" value specified at the initial touch location for a given gesture. In the case of "touch-action: pan-y" we only allow the left and right swipe recognizers + to be enabled, and in the case of "touch-action: pan-x" we only allow the up and down swipe recognizers to be enabled. If any of those gesture recognizers is recognized, + scrolling will be disabled for the duration of this gesture. If a UIScrollView panning gesture recognizer is recognized prior to a swipe, they won't have a chance to be + recognized. + + * UIProcess/ios/WKContentViewInteraction.h: + * UIProcess/ios/WKContentViewInteraction.mm: + (-[WKContentView setupInteraction]): + (-[WKContentView cleanupInteraction]): + (-[WKContentView _removeDefaultGestureRecognizers]): + (-[WKContentView _addDefaultGestureRecognizers]): + (-[WKContentView gestureRecognizer:shouldReceiveTouch:]): + + LayoutTests: + + Add new tests checking that setting "touch-action: pan-y" on an element and initiating a horizontal panning gesture will disallow scrolling vertically + if a vertical scrolling gesture follows. We test both the case where scrolling would apply to the whole page and the case where scrolling would apply + to an "overflow: scroll" element. + + * pointerevents/ios/touch-action-pan-y-horizontal-gesture-prevents-vertical-scrolling-expected.txt: Added. + * pointerevents/ios/touch-action-pan-y-horizontal-gesture-prevents-vertical-scrolling.html: Added. + * pointerevents/ios/touch-action-pan-y-in-overflow-scroll-horizontal-gesture-prevents-vertical-scrolling-expected.txt: Added. + * pointerevents/ios/touch-action-pan-y-in-overflow-scroll-horizontal-gesture-prevents-vertical-scrolling.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250183 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-21 Antoine Quint + + [Pointer Events] touch-action set to pan-x or pan-y alone should disable scrolling altogether if the intial gesture is in the disallowed direction + https://bugs.webkit.org/show_bug.cgi?id=202053 + + + Reviewed by Tim Horton. + + Add new tests checking that setting "touch-action: pan-y" on an element and initiating a horizontal panning gesture will disallow scrolling vertically + if a vertical scrolling gesture follows. We test both the case where scrolling would apply to the whole page and the case where scrolling would apply + to an "overflow: scroll" element. + + * pointerevents/ios/touch-action-pan-y-horizontal-gesture-prevents-vertical-scrolling-expected.txt: Added. + * pointerevents/ios/touch-action-pan-y-horizontal-gesture-prevents-vertical-scrolling.html: Added. + * pointerevents/ios/touch-action-pan-y-in-overflow-scroll-horizontal-gesture-prevents-vertical-scrolling-expected.txt: Added. + * pointerevents/ios/touch-action-pan-y-in-overflow-scroll-horizontal-gesture-prevents-vertical-scrolling.html: Added. + +2019-09-23 Alan Coon + + Cherry-pick r250182. rdar://problem/55608034 + + releasePointerCapture() not working for implicit capture; can't opt-in to pointerenter/leave for touches + https://bugs.webkit.org/show_bug.cgi?id=199803 + + + Reviewed by Dean Jackson. + + Source/WebCore: + + In order to dispatch boundary events (pointerover/out/enter/leave) when the implicit pointer capture is released on iOS, + we need to track the target of the pointer events that was dispatched last for a given pointer id. Then we compare that + target with the current target when dispatching a new pointer event and determine whether we should dispatch boundary + events using the exact same approach used to dispatch mouse boundary events in EventHandler::updateMouseEventTargetNode(). + + Tests: pointerevents/ios/boundary-events-through-hierarchy-without-pointer-capture.html + pointerevents/ios/boundary-events-without-pointer-capture.html + + * page/PointerCaptureController.cpp: + (WebCore::hierarchyHasCapturingEventListeners): + (WebCore::PointerCaptureController::dispatchEventForTouchAtIndex): + (WebCore::PointerCaptureController::pointerEventWillBeDispatched): + (WebCore::PointerCaptureController::ensureCapturingDataForPointerEvent): + (WebCore::PointerCaptureController::cancelPointer): + * page/PointerCaptureController.h: + + LayoutTests: + + Add new tests that check we correctly dispatch boundary events on iOS when pointer capture is disabled. + + * pointerevents/ios/boundary-events-through-hierarchy-without-pointer-capture-expected.txt: Added. + * pointerevents/ios/boundary-events-through-hierarchy-without-pointer-capture.html: Added. + * pointerevents/ios/boundary-events-without-pointer-capture-expected.txt: Added. + * pointerevents/ios/boundary-events-without-pointer-capture.html: Added. + * pointerevents/utils.js: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@250182 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-20 Antoine Quint + + releasePointerCapture() not working for implicit capture; can't opt-in to pointerenter/leave for touches + https://bugs.webkit.org/show_bug.cgi?id=199803 + + + Reviewed by Dean Jackson. + + Add new tests that check we correctly dispatch boundary events on iOS when pointer capture is disabled. + + * pointerevents/ios/boundary-events-through-hierarchy-without-pointer-capture-expected.txt: Added. + * pointerevents/ios/boundary-events-through-hierarchy-without-pointer-capture.html: Added. + * pointerevents/ios/boundary-events-without-pointer-capture-expected.txt: Added. + * pointerevents/ios/boundary-events-without-pointer-capture.html: Added. + * pointerevents/utils.js: + +2019-09-23 Alan Coon + + Apply patch. rdar://problem/55608028 + + Tell websites why a session was cancelled https://bugs.webkit.org/show_bug.cgi?id=201912 Source/WebCore: + + Reviewed by Brady Eidson. + + Added ApplePayCancelEvent as the interface for ApplePaySession's cancel event. This event + object includes a `sessionError` attribute that exposes a Web-safe version of the PassKit + domain error we received from PKPaymentAuthorization(View)Controller. Currently, we report + all errors with code "unknown", but more codes will be added in future patches. + + Test: http/tests/ssl/applepay/ApplePayCancelEvent.https.html + + * DerivedSources-input.xcfilelist: + * DerivedSources-output.xcfilelist: + * DerivedSources.make: + * Modules/applepay/ApplePayCancelEvent.cpp: Copied from Source/WebCore/Modules/applepay/PaymentHeaders.h. + (WebCore::ApplePayCancelEvent::ApplePayCancelEvent): + (WebCore::ApplePayCancelEvent::sessionError const): + (WebCore::ApplePayCancelEvent::eventInterface const): + * Modules/applepay/ApplePayCancelEvent.h: Copied from Source/WebCore/Modules/applepay/PaymentHeaders.h. + (WebCore::ApplePayCancelEvent::create): + * Modules/applepay/ApplePayCancelEvent.idl: Copied from Source/WebCore/Modules/applepay/PaymentHeaders.h. + * Modules/applepay/ApplePaySession.cpp: + (WebCore::ApplePaySession::didCancelPaymentSession): + * Modules/applepay/ApplePaySession.h: + * Modules/applepay/ApplePaySessionError.h: Copied from Source/WebCore/Modules/applepay/PaymentHeaders.h. + * Modules/applepay/ApplePaySessionError.idl: Copied from Source/WebCore/Modules/applepay/PaymentHeaders.h. + * Modules/applepay/PaymentCoordinator.cpp: + (WebCore::PaymentCoordinator::didCancelPaymentSession): + * Modules/applepay/PaymentCoordinator.h: + * Modules/applepay/PaymentHeaders.h: + * Modules/applepay/PaymentSession.cpp: + * Modules/applepay/PaymentSession.h: + * Modules/applepay/PaymentSessionError.h: Copied from Source/WebCore/Modules/applepay/PaymentHeaders.h. + * Modules/applepay/cocoa/PaymentSessionErrorCocoa.mm: Copied from Source/WebCore/Modules/applepay/PaymentSession.h. + (WebCore::additionalError): + (WebCore::PaymentSessionError::PaymentSessionError): + (WebCore::PaymentSessionError::sessionError const): + (WebCore::PaymentSessionError::platformError const): + (WebCore::PaymentSessionError::unknownError const): + * Modules/applepay/paymentrequest/ApplePayPaymentHandler.cpp: + (WebCore::ApplePayPaymentHandler::didCancelPaymentSession): + * Modules/applepay/paymentrequest/ApplePayPaymentHandler.h: + * Modules/webgpu/WHLSL/WHLSLCheckTextureReferences.cpp: + * Modules/webgpu/WHLSL/WHLSLPropertyResolver.cpp: + * SourcesCocoa.txt: + * WebCore.xcodeproj/project.pbxproj: + * dom/EventNames.in: + * testing/MockPaymentCoordinator.cpp: + (WebCore::MockPaymentCoordinator::cancelPayment): + + Source/WebCore/PAL: + + + + Reviewed by Brady Eidson. + + Soft-linked PKPassKitErrorDomain and included PassKit headers more judiciously. + + * pal/cocoa/PassKitSoftLink.h: + * pal/cocoa/PassKitSoftLink.mm: + * pal/spi/cocoa/PassKitSPI.h: + + Source/WebKit: + + + + Reviewed by Brady Eidson. + + Remembered the error passed to -[WKPaymentAuthorizationDelegate _willFinishWithError:] and + sent it to the WebContent process in Messages::WebPaymentCoordinator::DidCancelPaymentSession. + + * Platform/cocoa/PaymentAuthorizationPresenter.h: + * Platform/cocoa/WKPaymentAuthorizationDelegate.mm: + (-[WKPaymentAuthorizationDelegate _didFinish]): + (-[WKPaymentAuthorizationDelegate _willFinishWithError:]): + * Shared/ApplePay/WebPaymentCoordinatorProxy.cpp: + (WebKit::WebPaymentCoordinatorProxy::didCancelPaymentSession): + (WebKit::WebPaymentCoordinatorProxy::presenterDidFinish): + * Shared/ApplePay/WebPaymentCoordinatorProxy.h: + (WebKit::WebPaymentCoordinatorProxy::didCancelPaymentSession): + * Shared/ApplePay/ios/WebPaymentCoordinatorProxyIOS.mm: + * Shared/Cocoa/WebCoreArgumentCodersCocoa.mm: + (IPC::ArgumentCoder::encode): + (IPC::ArgumentCoder::decode): + * Shared/WebCoreArgumentCoders.h: + * WebProcess/ApplePay/WebPaymentCoordinator.cpp: + (WebKit::WebPaymentCoordinator::networkProcessConnectionClosed): + (WebKit::WebPaymentCoordinator::didCancelPaymentSession): + * WebProcess/ApplePay/WebPaymentCoordinator.h: + * WebProcess/ApplePay/WebPaymentCoordinator.messages.in: + + LayoutTests: + + Reviewed by Brady Eidson. + + * http/tests/ssl/applepay/ApplePayCancelEvent.https-expected.txt: Added. + * http/tests/ssl/applepay/ApplePayCancelEvent.https.html: Added. + + 2019-09-18 Andy Estes + + [Apple Pay] Tell websites why a session was cancelled + https://bugs.webkit.org/show_bug.cgi?id=201912 + + Reviewed by Brady Eidson. + + * http/tests/ssl/applepay/ApplePayCancelEvent.https-expected.txt: Added. + * http/tests/ssl/applepay/ApplePayCancelEvent.https.html: Added. + +2019-09-17 Alan Coon + + Cherry-pick r249954. rdar://problem/55461404 + + [First-letter] Use WeakPtr for the first-letter insertion point. + https://bugs.webkit.org/show_bug.cgi?id=201842 + + + Reviewed by Antti Koivisto. + + Source/WebCore: + + The about-to-be-removed first letter renderer's sibling could potentially be destroyed too as the result of the anonymous subtree collapsing logic (when the next sibling is a generated anonymous block and it is not needed anymore.) + + Test: fast/text/first-letter-with-columns-crash.html + + * rendering/updating/RenderTreeBuilderFirstLetter.cpp: + (WebCore::RenderTreeBuilder::FirstLetter::updateStyle): + + LayoutTests: + + * fast/text/first-letter-with-columns-crash-expected.txt: Added. + * fast/text/first-letter-with-columns-crash.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249954 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-17 Zalan Bujtas + + [First-letter] Use WeakPtr for the first-letter insertion point. + https://bugs.webkit.org/show_bug.cgi?id=201842 + + + Reviewed by Antti Koivisto. + + * fast/text/first-letter-with-columns-crash-expected.txt: Added. + * fast/text/first-letter-with-columns-crash.html: Added. + +2019-09-17 Alan Coon + + Cherry-pick r247573. rdar://problem/55461395 + + [Pointer Events] The button and buttons properties are incorrect on iOS + https://bugs.webkit.org/show_bug.cgi?id=199910 + + + Reviewed by Dean Jackson. + + Source/WebCore: + + The button and buttons properties were always set to 0 on iOS. We now use the correct values such that + button is always 0 except for "pointermove" where it's -1, and "buttons" is 1 as long as the pointer is + in contact with the touch surface. + + Tests: pointerevents/ios/pointer-event-button-and-buttons-pointer-cancel.html + pointerevents/ios/pointer-event-button-and-buttons.html + + * dom/ios/PointerEventIOS.cpp: + (WebCore::buttonForType): + (WebCore::buttonsForType): + (WebCore::PointerEvent::PointerEvent): + + LayoutTests: + + * pointerevents/ios/pointer-event-button-and-buttons-expected.txt: Added. + * pointerevents/ios/pointer-event-button-and-buttons-pointer-cancel-expected.txt: Added. + * pointerevents/ios/pointer-event-button-and-buttons-pointer-cancel.html: Added. + * pointerevents/ios/pointer-event-button-and-buttons.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247573 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-07-18 Antoine Quint + + [Pointer Events] The button and buttons properties are incorrect on iOS + https://bugs.webkit.org/show_bug.cgi?id=199910 + + + Reviewed by Dean Jackson. + + * pointerevents/ios/pointer-event-button-and-buttons-expected.txt: Added. + * pointerevents/ios/pointer-event-button-and-buttons-pointer-cancel-expected.txt: Added. + * pointerevents/ios/pointer-event-button-and-buttons-pointer-cancel.html: Added. + * pointerevents/ios/pointer-event-button-and-buttons.html: Added. + +2019-09-17 Kocsen Chung + + Cherry-pick r249813. rdar://problem/55427490 + + [Cocoa] Text indicator for an image link on the front page of apple.com looks wrong + https://bugs.webkit.org/show_bug.cgi?id=201724 + + + Reviewed by Tim Horton. + + Source/WebCore: + + When computing the bounds of the range (, 0) to (, 1) for a text indicator snapshot where is a link + with a single non-breaking whitespace character, we currently use the text rect of the single space. This leads + to a confusing text indicator, as the resulting snapshot is a tiny blank square in the top left corner of the + link. This problem manifests when starting a drag or showing the system context menu on iOS, or force clicking + or three-finger tapping to show a preview on macOS. + + To address this scenario, tweak the heuristic in the case where the text indicator option + TextIndicatorOptionUseBoundingRectAndPaintAllContentForComplexRanges is specified, such that we consider a range + containing only text with whitespaces to be "complex"; additionally, instead of falling back to the range's + bounding rect (which in this case is still tiny), fall back to the common ancestor container's bounding rect, + which encompasses not only the text inside the range but also the element containing the range (in this case, + the anchor element). + + Test: fast/text-indicator/text-indicator-empty-link.html + + * page/TextIndicator.cpp: + (WebCore::containsOnlyWhiteSpaceText): + + Add a helper to determine whether a Range is comprised only of rendered text that only contains whitespace + characters. + + (WebCore::initializeIndicator): + + See ChangeLog entry above for more detail. + + LayoutTests: + + Add a new layout test to exercise this scenario. + + * fast/text-indicator/text-indicator-empty-link-expected.txt: Added. + * fast/text-indicator/text-indicator-empty-link.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249813 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-12 Wenson Hsieh + + [Cocoa] Text indicator for an image link on the front page of apple.com looks wrong + https://bugs.webkit.org/show_bug.cgi?id=201724 + + + Reviewed by Tim Horton. + + Add a new layout test to exercise this scenario. + + * fast/text-indicator/text-indicator-empty-link-expected.txt: Added. + * fast/text-indicator/text-indicator-empty-link.html: Added. + +2019-09-17 Kocsen Chung + + Cherry-pick r249734. rdar://problem/55291693 + + Attempt to make this test not flakey. + https://bugs.webkit.org/show_bug.cgi?id=201482 + + * legacy-animation-engine/compositing/transitions/add-remove-transition.html: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249734 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-17 Kocsen Chung + + Cherry-pick r249511. rdar://problem/55291693 + + Cancelled transitions on Google image search leave content with opacity 0 sometimes + https://bugs.webkit.org/show_bug.cgi?id=201482 + rdar://problem/54921036 + + Reviewed by Tim Horton. + Source/WebCore: + + If, in a single rendering update, we started an accelerated opacity transition, and then removed + it, we'd still push the transition onto the CALayer with fillForwards and never remove it, so its + effects would last forever. + + Fix by making GraphicsLayerCA::removeAnimation() remove animations from the uncomittedAnimations + list as well. + + Also fix layer names in debug; if a layer's primaryLayerID changed, we'd fail to rename the + CALayer, causing confusion when logging at layer dumps. Fix by adding the layer ID just + before pushing the name to the platform layer. + + Some drive-by logging cleanup. + + Test: legacy-animation-engine/compositing/transitions/add-remove-transition.html + + * platform/graphics/GraphicsLayer.cpp: + (WebCore::GraphicsLayer::debugName const): + * platform/graphics/GraphicsLayer.h: + * platform/graphics/ca/GraphicsLayerCA.cpp: + (WebCore::GraphicsLayerCA::setName): + (WebCore::GraphicsLayerCA::debugName const): + (WebCore::GraphicsLayerCA::addAnimation): + (WebCore::GraphicsLayerCA::pauseAnimation): + (WebCore::GraphicsLayerCA::seekAnimation): + (WebCore::GraphicsLayerCA::removeAnimation): + (WebCore::GraphicsLayerCA::platformCALayerAnimationStarted): + (WebCore::GraphicsLayerCA::platformCALayerAnimationEnded): + (WebCore::GraphicsLayerCA::updateNames): + (WebCore::GraphicsLayerCA::createTransformAnimationsFromKeyframes): + * platform/graphics/ca/GraphicsLayerCA.h: + * rendering/RenderLayerCompositor.cpp: + (WebCore::RenderLayerCompositor::logLayerInfo): + + LayoutTests: + + * legacy-animation-engine/compositing/transitions/add-remove-transition-expected.html: Added. + * legacy-animation-engine/compositing/transitions/add-remove-transition.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249511 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-17 Kocsen Chung + + Cherry-pick r249507. rdar://problem/55427491 + + Line artifacts in note body after viewing note with s + https://bugs.webkit.org/show_bug.cgi?id=201474 + + + Reviewed by Simon Fraser. + + Source/WebCore: + + Test: fast/attachment/attachment-border-should-stay-inside-attachment.html + + * rendering/RenderThemeIOS.mm: + (WebCore::attachmentBorderPath): + (WebCore::paintAttachmentBorder): + Inset the border rect by half the width, so that doesn't + paint out-of-bounds. + + LayoutTests: + + * fast/attachment/attachment-border-should-stay-inside-attachment-expected.html: Added. + * fast/attachment/attachment-border-should-stay-inside-attachment.html: Added. + Add a test that ensures that stays inside its bounds. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249507 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-04 Tim Horton + + Line artifacts in note body after viewing note with s + https://bugs.webkit.org/show_bug.cgi?id=201474 + + + Reviewed by Simon Fraser. + + * fast/attachment/attachment-border-should-stay-inside-attachment-expected.html: Added. + * fast/attachment/attachment-border-should-stay-inside-attachment.html: Added. + Add a test that ensures that stays inside its bounds. + +2019-09-09 Ryosuke Niwa + + REGRESSION (iOS 13): Bulleted list copied from Notes to Mail results in Times New Roman + https://bugs.webkit.org/show_bug.cgi?id=201490 + + Reviewed by Daniel Bates. + + Added a test to make sure -webkit-standard font family name isn't stripped away when sanitization is not in effect. + + * editing/pasteboard/paste-cocoa-writer-markup-with-webkit-standard-font-family-expected.txt: Added. + * editing/pasteboard/paste-cocoa-writer-markup-with-webkit-standard-font-family.html: Added. + +2019-09-09 Kocsen Chung + + Cherry-pick r249605. rdar://problem/55182896 + + Incorrect selection rect revealed after pasting images in a contenteditable element + https://bugs.webkit.org/show_bug.cgi?id=201549 + + + Reviewed by Simon Fraser. + + Source/WebCore: + + Editor::replaceSelectionWithFragment currently scrolls to reveal the selection after inserting the given + DocumentFragment. However, this scrolling occurs before any inserted images have loaded yet, which causes the + wrong caret rect to be revealed, since all image elements inserted during paste will be empty. + + To fix this, we defer revealing the selection after inserting the fragment until after all images that have + been inserted are done loading. While waiting for images to load, if any layers which may be scrolled as a + result of revealing the selection are scrolled, we additionally cancel the deferred selection reveal. See + comments below for more detail. + + Tests: editing/pasteboard/do-not-reveal-selection-after-programmatic-scroll.html + editing/pasteboard/reveal-selection-after-pasting-images.html + PasteImage.RevealSelectionAfterPastingImage + + * editing/Editing.cpp: + (WebCore::visibleImageElementsInRangeWithNonLoadedImages): + + Add a new helper to iterate through a range and collect all image elements in that range, that contain cached + images that have not finished loading yet. + + * editing/Editing.h: + * editing/Editor.cpp: + (WebCore::Editor::replaceSelectionWithFragment): + + Instead of always immediately revealing the selection after applying the ReplaceSelectionCommand, collect the + image elements that were just inserted, and avoid immediately revealing the selection if any of these images + have non-null cached images, but are not loaded yet. Instead, hold on to these images in a set, remove them once + they finish loading using the new method below, and once all images are removed, reveal the selection. + + (WebCore::Editor::revealSelectionIfNeededAfterLoadingImageForElement): + (WebCore::Editor::renderLayerDidScroll): + + Called whenever a scrollable RenderLayer is scrolled (or in the case of FrameView, the root layer). In the case + where Editor is waiting to reveal the selection, we check to see if the scrolled layer is an ancestor of the + layer enclosing the start of the selection. + + (WebCore::Editor::respondToChangedSelection): + + If the selection changes between pasting and waiting for pasted images to load, just cancel waiting to reveal + the selection after pasting. + + * editing/Editor.h: + * editing/ReplaceSelectionCommand.cpp: + (WebCore::ReplaceSelectionCommand::insertedContentRange const): + + Add a helper method to grab the Range of content inserted after applying the command. + + * editing/ReplaceSelectionCommand.h: + * page/FrameView.cpp: + (WebCore::FrameView::scrollPositionChanged): + * page/FrameView.h: + * page/Page.cpp: + (WebCore::Page::didFinishLoadingImageForElement): + + Notify Editor after an image finishes loading. + + * rendering/RenderLayer.cpp: + (WebCore::RenderLayer::scrollTo): + + Source/WebKit: + + Tweak some existing logic to use the new visibleImageElementsInRangeWithNonLoadedImages helper function. See + WebCore for more details. + + * WebProcess/WebPage/ios/WebPageIOS.mm: + (WebKit::WebPage::didConcludeEditDrag): + + Tools: + + Add an API test to exercise the scenario where we scroll to reveal the selection after pasting an image that was + directly written to the pasteboard. + + * TestWebKitAPI/Tests/WebKitCocoa/PasteImage.mm: + + LayoutTests: + + Add a couple of new layout tests. + + * editing/pasteboard/do-not-reveal-selection-after-programmatic-scroll-expected.txt: Added. + * editing/pasteboard/do-not-reveal-selection-after-programmatic-scroll.html: Added. + + This test verifies that we don't try to scroll to reveal the caret after pasting, if the scroll position was + changed before the images finished loading. + + * editing/pasteboard/reveal-selection-after-pasting-images-expected.txt: Added. + * editing/pasteboard/reveal-selection-after-pasting-images.html: Added. + * platform/ios/editing/pasteboard/reveal-selection-after-pasting-images-expected.txt: Added. + + This test verifies that we reveal the caret after loading multiple pasted images in a selection, and dispatch a + scroll event in the process. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249605 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-06 Wenson Hsieh + + Incorrect selection rect revealed after pasting images in a contenteditable element + https://bugs.webkit.org/show_bug.cgi?id=201549 + + + Reviewed by Simon Fraser. + +2019-09-04 Simon Fraser + + Cancelled transitions on Google image search leave content with opacity 0 sometimes + https://bugs.webkit.org/show_bug.cgi?id=201482 + rdar://problem/54921036 + + Reviewed by Tim Horton. + + * legacy-animation-engine/compositing/transitions/add-remove-transition-expected.html: Added. + * legacy-animation-engine/compositing/transitions/add-remove-transition.html: Added. + + Add a couple of new layout tests. + + * editing/pasteboard/do-not-reveal-selection-after-programmatic-scroll-expected.txt: Added. + * editing/pasteboard/do-not-reveal-selection-after-programmatic-scroll.html: Added. + + This test verifies that we don't try to scroll to reveal the caret after pasting, if the scroll position was + changed before the images finished loading. + + * editing/pasteboard/reveal-selection-after-pasting-images-expected.txt: Added. + * editing/pasteboard/reveal-selection-after-pasting-images.html: Added. + * platform/ios/editing/pasteboard/reveal-selection-after-pasting-images-expected.txt: Added. + + This test verifies that we reveal the caret after loading multiple pasted images in a selection, and dispatch a + scroll event in the process. + +2019-09-09 Kocsen Chung + + Cherry-pick r249581. rdar://problem/55202922 + + REGRESSION (iOS 13): If an overflow:hidden with a non-zero scroll position is toggled to overflow:scroll, some other scroll causes its scroll position to get reset + https://bugs.webkit.org/show_bug.cgi?id=201528 +2019-09-10 Simon Fraser + + Attempt to make this test not flakey. + https://bugs.webkit.org/show_bug.cgi?id=201482 + + * legacy-animation-engine/compositing/transitions/add-remove-transition.html: + + rdar://problem/55044885 + + Reviewed by Frédéric Wang. + Source/WebCore: + + If, when an overflow scrolling node is created, the scroller has non-zero scroll + position (for example, via toggling to overflow:hidden, setting scrollTop, then toggling + to overflow:scroll), then on the next update its scroll position will reset back to zero. + + The bug was that newly created ScrollingTreeScrollingNodes didn't set m_currentScrollPosition + to the scroll position coming from the state node, so a subsequent update could cause + the 0,0 currentScrollPosition to get applied. If we're making a new node, and there's no + requestedScrollPosition, then initialize m_currentScrollPosition. + + Test: scrollingcoordinator/ios/scroller-initial-scroll-position.html + + * page/scrolling/ScrollingTreeScrollingNode.cpp: + (WebCore::ScrollingTreeScrollingNode::commitStateBeforeChildren): + (WebCore::ScrollingTreeScrollingNode::commitStateAfterChildren): + * page/scrolling/ScrollingTreeScrollingNode.h: + + LayoutTests: + + * scrollingcoordinator/ios/scroller-initial-scroll-position-expected.html: Added. + * scrollingcoordinator/ios/scroller-initial-scroll-position.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249581 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-09 Kocsen Chung + + Cherry-pick r249565. rdar://problem/55113261 + + AccessibilityRenderObject::setSelectedTextRange fails to set the selection passed an empty line. + https://bugs.webkit.org/show_bug.cgi?id=201518 + + + Patch by Andres Gonzalez on 2019-09-06 + Reviewed by Ryosuke Niwa. + + Source/WebCore: + + Test: accessibility/set-selected-text-range-after-newline.html + + In the case of an empty line, the CharacterIterator range start and end + were not equal, thus we were not advancing the iterator and returning + the iterator range end, which is not correct. With this change we are + always advancing the iterator if its text is just '\n'. This covers all + the cases we fixed before plus empty lines. + + * editing/Editing.cpp: + (WebCore::visiblePositionForIndexUsingCharacterIterator): + + LayoutTests: + + Extended this test to set the selection range passed an empty line. + * accessibility/set-selected-text-range-after-newline-expected.txt: + * accessibility/set-selected-text-range-after-newline.html: + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249565 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-06 Andres Gonzalez + + AccessibilityRenderObject::setSelectedTextRange fails to set the selection passed an empty line. + https://bugs.webkit.org/show_bug.cgi?id=201518 + + + Reviewed by Ryosuke Niwa. + + Extended this test to set the selection range passed an empty line. + * accessibility/set-selected-text-range-after-newline-expected.txt: + * accessibility/set-selected-text-range-after-newline.html: + +2019-09-09 Kocsen Chung + + Cherry-pick r249534. rdar://problem/55183098 + + AX: children cache are not re-computed if tab index is removed + https://bugs.webkit.org/show_bug.cgi?id=201502 + + Reviewed by Zalan Bujtas. + + Source/WebCore: + + Test: accessibility/tabindex-removed.html + + If the tabindex changes, it can potentially affect whether an element is accessible. If we don't update the children cache + information can be stale and lead to incorrect navigation with VoiceOver. + + * accessibility/AXObjectCache.cpp: + (WebCore::AXObjectCache::handleAttributeChange): + + LayoutTests: + + * accessibility/tabindex-removed-expected.txt: Added. + * accessibility/tabindex-removed.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249534 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-05 Chris Fleizach + + AX: children cache are not re-computed if tab index is removed + https://bugs.webkit.org/show_bug.cgi?id=201502 + + Reviewed by Zalan Bujtas. + + * accessibility/tabindex-removed-expected.txt: Added. + * accessibility/tabindex-removed.html: Added. + +2019-09-05 Kocsen Chung + + Apply patch. rdar://problem/55001140 + + Treat a two-finger single tap as if the user tapped with the Cmd key pressed https://bugs.webkit.org/show_bug.cgi?id=201420 + + Reviewed by Simon Fraser. + + Source/WebKit: + + Set the metaKey modifier to true when generating a click event based on a two-finger single tap. This is important so that sites like Google and DuckDuckGo + correctly open links in their search results page in a new tab in Safari on iOS. This currently doesn't work because those sites will call preventDefault() + if the metaKey flag isn't set on a "click" event, and if it is set, they let the browser handle the navigation themselves. + + * UIProcess/ios/WKContentViewInteraction.mm: + (-[WKContentView _twoFingerSingleTapGestureRecognized:]): + + Tools: + + Add a new twoFingerSingleTapAtPoint() method to UIScriptController, which just calls into the existing (but unused) + -[HIDEventGenerator twoFingerTap:completionBlock:]. + + * TestRunnerShared/UIScriptContext/Bindings/UIScriptController.idl: + * TestRunnerShared/UIScriptContext/UIScriptController.h: + (WTR::UIScriptController::twoFingerSingleTapAtPoint): + * WebKitTestRunner/ios/UIScriptControllerIOS.h: + * WebKitTestRunner/ios/UIScriptControllerIOS.mm: + (WTR::UIScriptControllerIOS::twoFingerSingleTapAtPoint): + + LayoutTests: + + Add a new event that checks that a two-finger single tap on a clickable element yields a "click" event with the metaKey flag set to true. + + * fast/events/ios/click-event-two-finger-single-tap-meta-key-expected.txt: Added. + * fast/events/ios/click-event-two-finger-single-tap-meta-key.html: Added. + + 2019-09-03 Antoine Quint + + [iOS] Treat a two-finger single tap as if the user tapped with the Cmd key pressed + https://bugs.webkit.org/show_bug.cgi?id=201420 + + + Reviewed by Simon Fraser. + + Add a new event that checks that a two-finger single tap on a clickable element yields a "click" event with the metaKey flag set to true. + + * fast/events/ios/click-event-two-finger-single-tap-meta-key-expected.txt: Added. + * fast/events/ios/click-event-two-finger-single-tap-meta-key.html: Added. + +2019-09-04 Kocsen Chung + + Cherry-pick r249368. rdar://problem/55001166 + + Long presses that interrupt accelerated scrolling dispatch clicks on apps linked against iOS 12 or earlier + https://bugs.webkit.org/show_bug.cgi?id=201346 + + + Reviewed by Dean Jackson. + + Source/WebKit: + + For apps that are linked on or after iOS 13, we add a context menu interaction to the content view, which + requires us to disable (or avoid adding) the highlight long press gesture recognizer. However, for apps that are + linked on the iOS 12 SDK or prior, this gesture is still present, and fires when long pressing for (roughly) up + to 0.75 seconds if a tap gesture was not recognized instead. Firing this gesture sends a click event to the + page; this brings back some form of , but only when holding for slightly longer than a + normal tap, and also only in apps linked on iOS 12 or earlier. To fix this, we apply a similar solution as in + r248433 and detect whether a long press gesture interrupted scroll view deceleration in + -gestureRecognizerShouldBegin:. If so, we return NO to avoid clicking. See per-method comments below for more + details. + + Testing this bug as-is was tricky, since there's no way in layout tests to simulate being linked on or before a + given SDK version. Luckily, recall that: + 1. This bug occurs when the highlight gesture recognizer is enabled and added to the content view. + 2. The highlight gesture recognizer only needs to be disabled or removed when context menu interaction is added. + As such, we should be able to restore the highlight gesture recognizer by suppressing the context menu + interaction in an app linked-on-or-after iOS 13, by setting allowsLinkPreview to NO. Unfortunately, this doesn't + quite work, since we currently always avoid adding the highlight gesture recognizer if the app is linked on + iOS 13 or later. + + However, this means that the highlight gesture recognizer is absent from the content view in apps linked against + iOS 13 that disable link previews, even though its absence is not required. This means that long pressing a + clickable element in a web view that disables link previews does not show a tap highlight on iOS 13, whereas it + would on iOS 12; this is a regression, albeit a very subtle one. To fix this subtle issue and make it possible + to write a test for this bug, we refactor some logic for creating and configuring the highlight long press + gesture, such that we now unconditionally add the highlight gesture, but only enable it in apps linked on or + after iOS 13 if link previews (i.e. context menu interaction) are not allowed. + + Test: fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow.html + + * SourcesCocoa.txt: + * UIProcess/API/Cocoa/WKWebView.mm: + (-[WKWebView setAllowsLinkPreview:]): + * UIProcess/ios/WKContentViewInteraction.h: + * UIProcess/ios/WKContentViewInteraction.mm: + (-[WKContentView setupInteraction]): + + Refactor our gesture setup logic to always create and add the long press and highlight long press gestures, but + conditionally disable them based on whether or not (1) the context menu is available, and (2) WKWebView's + allowsLinkPreview property. + + (-[WKContentView _didChangeLinkPreviewAvailability]): + (-[WKContentView _updateLongPressAndHighlightLongPressGestures]): + + Add a new helper to update the enabled state of the long press and highlight long press gestures, by consulting + -_shouldUseContextMenu and -allowsLinkPreview. This is called when setting up the gestures, as well as whenever + -allowsLinkPreview changes. + + (-[WKContentView gestureRecognizerShouldBegin:]): + + Factor out logic to ascend the view hierarchy in search of a UIScrollView that was interrupted while + decelerating into a local lambda function; use this for both the highlight gesture and the single tap gesture, + to determine whether they should begin. + + * UIProcess/ios/WKHighlightLongPressGestureRecognizer.h: Added. + * UIProcess/ios/WKHighlightLongPressGestureRecognizer.mm: Added. + + In order to remember the UIScrollView (if any) tracked by the highlight long press gesture, we subclass + _UIWebHighlightLongPressGestureRecognizer. While UILongPressGestureRecognizer does have SPI to ask for a list of + UITouches, by the time the gesture has been recognized and the gesture delegates are invoked, these UITouches + no longer correspond to UIViews. As such, the only time we have access to the list of UITouches with their + UIViews is during the touches* subclass hooks. + + (-[WKHighlightLongPressGestureRecognizer reset]): + + Clear out the tracked UIScrollView here, when the gesture is reset (i.e. after ending, or being canceled). + + (-[WKHighlightLongPressGestureRecognizer touchesBegan:withEvent:]): + + Remember the last touched UIScrollView here. + + (-[WKHighlightLongPressGestureRecognizer lastTouchedScrollView]): + * WebKit.xcodeproj/project.pbxproj: + + Tools: + + Add a new test option to allow tests to disable link previews. + + * WebKitTestRunner/TestController.cpp: + (WTR::updateTestOptionsFromTestHeader): + * WebKitTestRunner/TestOptions.h: + + Drive-by fix: also check enableLazyImageLoading when determining whether two TestOptions are the same. + + (WTR::TestOptions::hasSameInitializationOptions const): + * WebKitTestRunner/cocoa/TestControllerCocoa.mm: + (WTR::TestController::platformCreateWebView): + + LayoutTests: + + Add a couple of new layout tests to verify that using a long press gesture to interrupt momentum scrolling in a + web view that uses API to disable link previews does not result in a click. + + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame-expected.txt: Added. + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame.html: Added. + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow-expected.txt: Added. + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249368 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-09-01 Wenson Hsieh + + Long presses that interrupt accelerated scrolling dispatch clicks on apps linked against iOS 12 or earlier + https://bugs.webkit.org/show_bug.cgi?id=201346 + + + Reviewed by Dean Jackson. + + Add a couple of new layout tests to verify that using a long press gesture to interrupt momentum scrolling in a + web view that uses API to disable link previews does not result in a click. + + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame-expected.txt: Added. + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame.html: Added. + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow-expected.txt: Added. + * fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow.html: Added. + +2019-09-04 Kocsen Chung + + Cherry-pick r249147. rdar://problem/55001178 + + Removing fullscreen element in rAF() callback after requestFullscreen() can leave fullscreen in inconsistent state. + https://bugs.webkit.org/show_bug.cgi?id=201101 + + + Reviewed by Eric Carlson. + + Source/WebCore: + + Test: fullscreen/full-screen-request-removed-with-raf.html + + Add a new state variable, m_pendingFullscreenElement, to track which element is about to + become the fullscreen element, so that when elements are removed or cancelFullscreen() is + called, the state machine inside the fullscreen algorithm can cancel effectively. + + * dom/FullscreenManager.cpp: + (WebCore::FullscreenManager::requestFullscreenForElement): + (WebCore::FullscreenManager::cancelFullscreen): + (WebCore::FullscreenManager::exitFullscreen): + (WebCore::FullscreenManager::willEnterFullscreen): + (WebCore::FullscreenManager::willExitFullscreen): + (WebCore::FullscreenManager::didExitFullscreen): + (WebCore::FullscreenManager::adjustFullscreenElementOnNodeRemoval): + (WebCore::FullscreenManager::clear): + (WebCore::FullscreenManager::fullscreenElementRemoved): Deleted. + * dom/FullscreenManager.h: + + Source/WebKit: + + Add more state to track in which direction the animation is flowing to allow in-process + animations to be cancelled more gracefully. + + * UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm: + (-[WKFullScreenWindowController enterFullScreen]): + (-[WKFullScreenWindowController beganEnterFullScreenWithInitialFrame:finalFrame:]): + (-[WKFullScreenWindowController requestExitFullScreen]): + (-[WKFullScreenWindowController exitFullScreen]): + * WebProcess/cocoa/VideoFullscreenManager.h: + (WebKit::VideoFullscreenInterfaceContext::animationState const): + (WebKit::VideoFullscreenInterfaceContext::setAnimationState): + (WebKit::VideoFullscreenInterfaceContext::isAnimating const): Deleted. + (WebKit::VideoFullscreenInterfaceContext::setIsAnimating): Deleted. + * WebProcess/cocoa/VideoFullscreenManager.mm: + (WebKit::VideoFullscreenManager::enterVideoFullscreenForVideoElement): + (WebKit::VideoFullscreenManager::exitVideoFullscreenForVideoElement): + (WebKit::VideoFullscreenManager::didEnterFullscreen): + (WebKit::VideoFullscreenManager::didCleanupFullscreen): + + LayoutTests: + + * fullscreen/full-screen-request-removed-with-raf-expected.txt: Added. + * fullscreen/full-screen-request-removed-with-raf.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249147 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-26 Jer Noble + + Removing fullscreen element in rAF() callback after requestFullscreen() can leave fullscreen in inconsistent state. + https://bugs.webkit.org/show_bug.cgi?id=201101 + + + Reviewed by Eric Carlson. + + * fullscreen/full-screen-request-removed-with-raf-expected.txt: Added. + * fullscreen/full-screen-request-removed-with-raf.html: Added. + +2019-09-03 Kocsen Chung + + Cherry-pick r249339. rdar://problem/55001170 + + Caret does not appear in text field inside a transformed, overflow: hidden container + https://bugs.webkit.org/show_bug.cgi?id=201317 + + + Reviewed by Simon Fraser. + + Source/WebCore: + + This patch refactors the heuristic for determining whether to suppress selection gestures and UI in a way that + fixes the corner case encountered in this bug. To understand why this test case fails with our existing + heuristic, consider the below test case. + + Let's say we have an input field inside an "overflow: hidden;" container, which is positioned in such a way that + it is completely clipped by its enclosing container which is also "overflow: hidden". Our existing logic would + appropriately identify this as a hidden editable element. + + However, let's now apply a transform to the input field's closest "overflow: hidden" ancestor, such that the + field is now visible. Since RenderLayer::offsetFromAncestor doesn't take transforms into account when we try to + find the offset of the "overflow: hidden" layer relative to the root view, we end up passing an offsetFromRoot + of (0, 100vw) to RenderLayer::calculateClipRects, which computes a background clip rect of (0, 0, 100vw, 100vh). + + This means that at the end of RenderLayer::calculateClipRects, we end up intersecting the background clip rect + (0, 0, 100vw, 100vh) against (100vw, 0, 100vw, 100vh), which results in the empty rect, and subsequently makes + us believe we're editing a hidden editable element. + + Instead of tacking on more logic to isTransparentOrFullyClippedRespectingParentFrames, we can fix this by using + RenderObject::computeVisibleRectInContainer instead, performing a similar walk up the render tree to compute the + visible rect of each focused element or subframe relative to its root. This is capable of taking transforms into + account. See comments below for more details. + + Test: editing/selection/ios/show-selection-in-transformed-container-2.html + + * rendering/RenderLayer.cpp: + (WebCore::RenderLayer::isTransparentRespectingParentFrames const): + + Split out isTransparentOrFullyClippedRespectingParentFrames into two methods: RenderLayer's + isTransparentRespectingParentFrames, and RenderObject's hasNonEmptyVisibleRectRespectingParentFrames. The + transparency check starts at the enclosing layer and walks up the layer tree, while the non-empty visible rect + check looks for renderers that are completely empty relative to their root views. + + * rendering/RenderLayer.h: + * rendering/RenderObject.cpp: + (WebCore::RenderObject::hasNonEmptyVisibleRectRespectingParentFrames const): + + Rewrite logic for detecting completely clipped editable areas (that formerly lived in + isTransparentOrFullyClippedRespectingParentFrames) to use computeVisibleRectInContainer instead. + + * rendering/RenderObject.h: + + Source/WebKit: + + Adjust isTransparentOrFullyClipped to use the new methods in RenderLayer and RenderObject. See WebCore ChangeLog + for more details. + + * WebProcess/WebPage/ios/WebPageIOS.mm: + (WebKit::WebPage::isTransparentOrFullyClipped const): + + LayoutTests: + + Add a new layout test that covers this scenario. See WebCore ChangeLog for additional detail. + + * editing/selection/ios/show-selection-in-transformed-container-2-expected.txt: Added. + * editing/selection/ios/show-selection-in-transformed-container-2.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249339 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-30 Wenson Hsieh + + Caret does not appear in text field inside a transformed, overflow: hidden container + https://bugs.webkit.org/show_bug.cgi?id=201317 + + + Reviewed by Simon Fraser. + + Add a new layout test that covers this scenario. See WebCore ChangeLog for additional detail. + + * editing/selection/ios/show-selection-in-transformed-container-2-expected.txt: Added. + * editing/selection/ios/show-selection-in-transformed-container-2.html: Added. + +2019-09-03 Kocsen Chung + + Cherry-pick r249296. rdar://problem/55001174 + + [iOS 13] Caret does not appear in text field if the body element is translated completely out of the viewport + https://bugs.webkit.org/show_bug.cgi?id=201287 + + + Reviewed by Tim Horton. + + Source/WebKit: + + During EditorState computation, we use the hidden editable element heuristic to determine whether we should + begin suppressing selection gestures and UI. Currently, we use the editable root of the selection range to + determine where in the layer tree we should start our ascent, in search of a completely transparent or + completely clipped container. + + However, in the case where the selection is inside a focused text field, this causes us to walk up the layer + tree starting at the RenderLayer corresponding to the text field's inner contenteditable div, which is different + than the text field's enclosing RenderLayer in the case where the containing block is transformed, such that no + part of it is within the visible viewport. This scenario is exercised by the below test case, in which the caret + after transforming the body horizontally by -100vw is hidden due to a false positive in the hidden editable area + heuristic. + + Fix this by starting the layer tree ascent from the enclosing layer of the text form control if applicable, + instead of the inner editable area under the shadow root of the form control. + + Test: editing/selection/ios/show-selection-in-transformed-container.html + + * WebProcess/WebPage/ios/WebPageIOS.mm: + (WebKit::WebPage::platformEditorState const): + + LayoutTests: + + Add a new layout test that covers this scenario. See WebKit ChangeLog for additional detail. + + * editing/selection/ios/show-selection-in-transformed-container-expected.txt: Added. + * editing/selection/ios/show-selection-in-transformed-container.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249296 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-29 Wenson Hsieh + + [iOS 13] Caret does not appear in text field if the body element is translated completely out of the viewport + https://bugs.webkit.org/show_bug.cgi?id=201287 + + + Reviewed by Tim Horton. + + Add a new layout test that covers this scenario. See WebKit ChangeLog for additional detail. + + * editing/selection/ios/show-selection-in-transformed-container-expected.txt: Added. + * editing/selection/ios/show-selection-in-transformed-container.html: Added. + +2019-09-03 Kocsen Chung + + Cherry-pick r249026. rdar://problem/55001375 + + Crash may happen when an SVG element references the root element + https://bugs.webkit.org/show_bug.cgi?id=201014 + + Reviewed by Ryosuke Niwa. + + Source/WebCore: + + When an references an element as its target image but + this element is also one of the ancestors of the , the + parent should not be applied. + + Test: svg/filters/filter-image-ref-root.html + + * svg/SVGFEImageElement.cpp: + (WebCore::SVGFEImageElement::build const): + + LayoutTests: + + Ensure the cyclic reference between the renderer and its + ancestor root renderer is broken. + + * svg/filters/filter-image-ref-root-expected.txt: Added. + * svg/filters/filter-image-ref-root.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249026 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-22 Said Abou-Hallawa + + Crash may happen when an SVG element references the root element + https://bugs.webkit.org/show_bug.cgi?id=201014 + + Reviewed by Ryosuke Niwa. + + Ensure the cyclic reference between the renderer and its + ancestor root renderer is broken. + + * svg/filters/filter-image-ref-root-expected.txt: Added. + * svg/filters/filter-image-ref-root.html: Added. + +2019-08-28 Kocsen Chung + + Cherry-pick r249156. rdar://problem/54775048 + + Crash under WebCore::jsNotificationConstructorPermission + https://bugs.webkit.org/show_bug.cgi?id=201186 + + + Reviewed by Youenn Fablet. + + Source/WebCore: + + Update the Notification API implementation to null-check the page before using. The page becomes null + when using the API in a frame that gets detached from its parent while in the middle of running + script. + + Test: http/tests/notifications/request-in-detached-frame.html + + * Modules/notifications/Notification.cpp: + (WebCore::Notification::permission): + (WebCore::Notification::requestPermission): + + LayoutTests: + + Add layout test coverage. + + * http/tests/notifications/request-in-detached-frame-expected.txt: Added. + * http/tests/notifications/request-in-detached-frame.html: Added. + * http/tests/notifications/resources/request-in-detached-frame-subframe.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249156 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-27 Chris Dumez + + Crash under WebCore::jsNotificationConstructorPermission + https://bugs.webkit.org/show_bug.cgi?id=201186 + + + Reviewed by Youenn Fablet. + + Add layout test coverage. + + * http/tests/notifications/request-in-detached-frame-expected.txt: Added. + * http/tests/notifications/request-in-detached-frame.html: Added. + * http/tests/notifications/resources/request-in-detached-frame-subframe.html: Added. + +2019-08-27 Ryan Haddad + + Revert r249166. rdar://problem/53829560 + +2019-08-27 Alan Coon + + Revert r249147. rdar://problem/54751753 + +2019-08-27 Ryan Haddad + + Cherry-pick r249157. rdar://problem/53829560 + + Unreviewed test gardening, remove failure expectations for tests that are now passing. + + * platform/ios-12/TestExpectations: + * platform/ios/TestExpectations: + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@249157 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-27 Ryan Haddad + + Unreviewed test gardening, remove failure expectations for tests that are now passing. + + * platform/ios-12/TestExpectations: + * platform/ios/TestExpectations: + +2019-08-27 Ryan Haddad + + Cherry-pick r249099. rdar://problem/51857070 + + rdar://51857070 (iPad: Many fast/text-autosizing layout tests are consistently failing) + + Unreviewed Test Gardening. + Tests are no longer failing. Removing test expectations. + + * platform/ipad/TestExpectations: + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@249099 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-26 Russell Epstein + + rdar://51857070 (iPad: Many fast/text-autosizing layout tests are consistently failing) + + Unreviewed Test Gardening. + Tests are no longer failing. Removing test expectations. + + * platform/ipad/TestExpectations: + +2019-08-27 Alan Coon + + Cherry-pick r249147. rdar://problem/54751753 + + Removing fullscreen element in rAF() callback after requestFullscreen() can leave fullscreen in inconsistent state. + https://bugs.webkit.org/show_bug.cgi?id=201101 + + + Reviewed by Eric Carlson. + + Source/WebCore: + + Test: fullscreen/full-screen-request-removed-with-raf.html + + Add a new state variable, m_pendingFullscreenElement, to track which element is about to + become the fullscreen element, so that when elements are removed or cancelFullscreen() is + called, the state machine inside the fullscreen algorithm can cancel effectively. + + * dom/FullscreenManager.cpp: + (WebCore::FullscreenManager::requestFullscreenForElement): + (WebCore::FullscreenManager::cancelFullscreen): + (WebCore::FullscreenManager::exitFullscreen): + (WebCore::FullscreenManager::willEnterFullscreen): + (WebCore::FullscreenManager::willExitFullscreen): + (WebCore::FullscreenManager::didExitFullscreen): + (WebCore::FullscreenManager::adjustFullscreenElementOnNodeRemoval): + (WebCore::FullscreenManager::clear): + (WebCore::FullscreenManager::fullscreenElementRemoved): Deleted. + * dom/FullscreenManager.h: +2019-09-06 Simon Fraser + + REGRESSION (iOS 13): If an overflow:hidden with a non-zero scroll position is toggled to overflow:scroll, some other scroll causes its scroll position to get reset + https://bugs.webkit.org/show_bug.cgi?id=201528 + rdar://problem/55044885 + + Reviewed by Frédéric Wang. + + * scrollingcoordinator/ios/scroller-initial-scroll-position-expected.html: Added. + * scrollingcoordinator/ios/scroller-initial-scroll-position.html: Added. + + + Source/WebKit: + + Add more state to track in which direction the animation is flowing to allow in-process + animations to be cancelled more gracefully. + + * UIProcess/ios/fullscreen/WKFullScreenWindowControllerIOS.mm: + (-[WKFullScreenWindowController enterFullScreen]): + (-[WKFullScreenWindowController beganEnterFullScreenWithInitialFrame:finalFrame:]): + (-[WKFullScreenWindowController requestExitFullScreen]): + (-[WKFullScreenWindowController exitFullScreen]): + * WebProcess/cocoa/VideoFullscreenManager.h: + (WebKit::VideoFullscreenInterfaceContext::animationState const): + (WebKit::VideoFullscreenInterfaceContext::setAnimationState): + (WebKit::VideoFullscreenInterfaceContext::isAnimating const): Deleted. + (WebKit::VideoFullscreenInterfaceContext::setIsAnimating): Deleted. + * WebProcess/cocoa/VideoFullscreenManager.mm: + (WebKit::VideoFullscreenManager::enterVideoFullscreenForVideoElement): + (WebKit::VideoFullscreenManager::exitVideoFullscreenForVideoElement): + (WebKit::VideoFullscreenManager::didEnterFullscreen): + (WebKit::VideoFullscreenManager::didCleanupFullscreen): + + LayoutTests: + + * fullscreen/full-screen-request-removed-with-raf-expected.txt: Added. + * fullscreen/full-screen-request-removed-with-raf.html: Added. + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249147 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-26 Jer Noble + + Removing fullscreen element in rAF() callback after requestFullscreen() can leave fullscreen in inconsistent state. + https://bugs.webkit.org/show_bug.cgi?id=201101 + + + Reviewed by Eric Carlson. + + * fullscreen/full-screen-request-removed-with-raf-expected.txt: Added. + * fullscreen/full-screen-request-removed-with-raf.html: Added. + +2019-08-27 Alan Coon + + Cherry-pick r249074. rdar://problem/54735492 + + [iOS] [WebKit2] Tapping on the “I’m” text suggestion after typing “i’” does nothing + https://bugs.webkit.org/show_bug.cgi?id=201085 + + + Reviewed by Tim Horton. + + Source/WebCore: + + Exposes an existing quote folding function as a helper on TextIterator, and also adjusts foldQuoteMarks to take + a const String& rather than a String. See WebKit ChangeLog for more details. + + * editing/TextIterator.cpp: + (WebCore::foldQuoteMarks): + (WebCore::SearchBuffer::SearchBuffer): + * editing/TextIterator.h: + + Source/WebKit: + + Currently, logic in applyAutocorrectionInternal only selects the range to autocorrect if the text of the range + matches the string to replace (delivered to us from UIKit). In the case of changing "I’" to "I’m", the string to + replace is "I'" (with a straight quote rather than an apostrophe), even though the DOM contains an apostrophe. + + This is because kbd believes that the document context contains straight quotes (rather than apostrophes). For + native text views, this works out because UIKit uses relative UITextPositions to determine the replacement + range rather than by checking against the contents of the document. However, WKWebView does not have the ability + to synchronously compute and reason about arbitrary UITextPositions relative to the selection, so we instead + search for the string near the current selection when applying autocorrections. + + Of course, this doesn't work in this scenario because the replacement string contains a straight quote, yet the + text node contains an apostrophe, so we bail and don't end up replacing any text. To address this, we repurpose + TextIterator helpers currently used to allow find-in-page to match straight quotes against apostrophes; instead + of matching the replacement string exactly, we instead match the quote-folded versions of these strings when + finding the range to replace. + + Test: fast/events/ios/autocorrect-with-apostrophe.html + + * WebProcess/WebPage/ios/WebPageIOS.mm: + (WebKit::WebPage::applyAutocorrectionInternal): + + LayoutTests: + + Add a new layout test to verify that "I’" can be autocorrected to "I’m". + + * fast/events/ios/autocorrect-with-apostrophe-expected.txt: Added. + * fast/events/ios/autocorrect-with-apostrophe.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249074 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-23 Wenson Hsieh + + [iOS] [WebKit2] Tapping on the “I’m” text suggestion after typing “i’” does nothing + https://bugs.webkit.org/show_bug.cgi?id=201085 + + + Reviewed by Tim Horton. + + Add a new layout test to verify that "I’" can be autocorrected to "I’m". + + * fast/events/ios/autocorrect-with-apostrophe-expected.txt: Added. + * fast/events/ios/autocorrect-with-apostrophe.html: Added. + +2019-08-23 Ryan Haddad + + Cherry-pick r249042. rdar://problem/54622280 + + Revert delete-in-input-in-iframe.html and typing-in-input-in-iframe.html to original behaviour after r248977 and make associated test autoscroll-input-when-very-zoomed.html more stable + https://bugs.webkit.org/show_bug.cgi?id=201058 + + Reviewed by Simon Fraser. + + delete-in-input-in-iframe and typing-in-input-in-iframe were changed when scrolling was made to work differently in r244141. + They actually did find a bug, and that bug was fixed in r248977, so we put the tests back to test that scolls do not happen. + Also update autoscroll-input-when-very-zoomed which was added to test r248977 to be more robust. + + * fast/forms/ios/delete-in-input-in-iframe-expected.txt: + * fast/forms/ios/delete-in-input-in-iframe.html: + * fast/forms/ios/typing-in-input-in-iframe-expected.txt: + * fast/forms/ios/typing-in-input-in-iframe.html: + * fast/scrolling/ios/autoscroll-input-when-very-zoomed.html: + + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@249042 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-23 Megan Gardner + + Revert delete-in-input-in-iframe.html and typing-in-input-in-iframe.html to original behaviour after r248977 and make associated test autoscroll-input-when-very-zoomed.html more stable + https://bugs.webkit.org/show_bug.cgi?id=201058 + + Reviewed by Simon Fraser. + + delete-in-input-in-iframe and typing-in-input-in-iframe were changed when scrolling was made to work differently in r244141. + They actually did find a bug, and that bug was fixed in r248977, so we put the tests back to test that scolls do not happen. + Also update autoscroll-input-when-very-zoomed which was added to test r248977 to be more robust. + + * fast/forms/ios/delete-in-input-in-iframe-expected.txt: + * fast/forms/ios/delete-in-input-in-iframe.html: + * fast/forms/ios/typing-in-input-in-iframe-expected.txt: + * fast/forms/ios/typing-in-input-in-iframe.html: + * fast/scrolling/ios/autoscroll-input-when-very-zoomed.html: + +2019-08-23 Ryan Haddad + + Cherry-pick r249028. rdar://problem/54614691 + + REGRESSION (r248974): fast/events/ios/select-all-with-existing-selection.html fails + https://bugs.webkit.org/show_bug.cgi?id=201050 + + Reviewed by Wenson Hsieh. + + * fast/events/ios/select-all-with-existing-selection.html: + The test as-written doesn't actually wait for the tap to complete before + continuing on with the test - it starts immediately when the focus event + fires. This results in the selection being changed by the single click + handler *after* focusing the field. + + Rewrite the test to await completion of the tap before moving forward + instead of waiting for focus. + + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@249028 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-22 Tim Horton + + REGRESSION (r248974): fast/events/ios/select-all-with-existing-selection.html fails + https://bugs.webkit.org/show_bug.cgi?id=201050 + + Reviewed by Wenson Hsieh. + + * fast/events/ios/select-all-with-existing-selection.html: + The test as-written doesn't actually wait for the tap to complete before + continuing on with the test - it starts immediately when the focus event + fires. This results in the selection being changed by the single click + handler *after* focusing the field. + + Rewrite the test to await completion of the tap before moving forward + instead of waiting for focus. + +2019-08-23 Ryan Haddad + + Cherry-pick r249017. rdar://problem/54564878 + + Rebaseline some editing tests after r248974 + https://bugs.webkit.org/show_bug.cgi?id=200999 + + + * platform/ios/editing/deleting/smart-delete-003-expected.txt: + * platform/ios/editing/deleting/smart-delete-004-expected.txt: + * platform/ios/editing/pasteboard/smart-paste-008-expected.txt: + + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@249017 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-22 Tim Horton + + Rebaseline some editing tests after r248974 + https://bugs.webkit.org/show_bug.cgi?id=200999 + + + * platform/ios/editing/deleting/smart-delete-003-expected.txt: + * platform/ios/editing/deleting/smart-delete-004-expected.txt: + * platform/ios/editing/pasteboard/smart-paste-008-expected.txt: + +2019-08-22 Kocsen Chung + + Cherry-pick r249006. rdar://problem/54600921 + + Typing Korean in title field after typing in the body inserts extraneous characters on blog.naver.com + https://bugs.webkit.org/show_bug.cgi?id=201023 + + + Reviewed by Ryosuke Niwa. + + Source/WebCore: + + Ensures that we recognize the blog editor on blog.naver.com to be a hidden editable area. This website places + focus inside an editable body element of a subframe that is completely empty (width: 0 and border: 0). See the + WebKit ChangeLog for more details. + + Test: editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe.html + + * rendering/RenderLayer.cpp: + (WebCore::RenderLayer::calculateClipRects const): + + Source/WebKit: + + After r242833, we began to avoid sending redundant ElementDidFocus updates in the case where a focused element + was blurred and refocused within the same runloop. This was done to prevent the input view from flickering due + to input view reloading, as well as scrolling to reveal the focused element, when tapping to change selection on + Microsoft Word online. + + However, on blog.naver.com, these ElementDidFocus messages were necessary in order to ensure that the platform + input context changes when moving between the title and body fields, or when tapping to change selection. This + is because blog.naver.com uses a hidden contenteditable area under a subframe (see WebCore ChangeLog for more + detail here). While text is never directly inserted into this hidden contenteditable, the events are observed + and used to "play back" editing in the main visible content area. + + Thus, when moving between the title and body fields (or when changing selection within either), the only hint we + get is that the hidden editable element is blurred and immediately refocused. Since we no longer send + ElementDidFocus updates in this scenario, UIKeyboardImpl and kbd are not aware that the page has effectively + changed input contexts. + + Combined with the fact that Korean IME on iOS may insert additional text given the document context (i.e. text + that the input manager, kbd, thinks we've previously inserted), this means that when typing several characters + into the body field on naver and then switching to edit the title, initial keystrokes may insert unexpected + text in the title field. + + To fix this, we add some hooks to notify the UI process when an element that was blurred has been immediately + refocused. Upon receiving this message, the UI process then tells UIKeyboardImpl to re-retrieve its input + context, which calls into -requestAutocorrectionContextWithCompletionHandler: in WKContentView. While notorious + for being synchronous IPC, this is mitigated by (1) being limiting to only instances where we have a hidden + editable area, and (2) being limited by a batching mechanism in the web process, such that if the focused + element is blurred, refocused, re-blurred, and refocused many times in the same runloop, we'll only send a + single UpdateInputContextAfterBlurringAndRefocusingElement message (as opposed to the many ElementDidFocus + messages we would've sent in previous releases). + + * Platform/spi/ios/UIKitSPI.h: + * UIProcess/PageClient.h: + * UIProcess/WebPageProxy.h: + * UIProcess/WebPageProxy.messages.in: + + Add a new mechanism to update the platform input context (on iOS, UIKeyboardImpl's document state) when focus + moves away from and immediately returns to a hidden editable element. + + * UIProcess/ios/PageClientImplIOS.h: + * UIProcess/ios/PageClientImplIOS.mm: + (WebKit::PageClientImpl::updateInputContextAfterBlurringAndRefocusingElement): + * UIProcess/ios/WKContentViewInteraction.h: + * UIProcess/ios/WKContentViewInteraction.mm: + (-[WKContentView _updateInputContextAfterBlurringAndRefocusingElement]): + + Tell the active UIKeyboardImpl to refetch document state from the WKContentView. While this does result in a new + autocorrection context request (which, unfortunately, triggers synchronous IPC to the web process), this request + would've still happened anyways in the case where we would previously have sent an ElementDidFocus message. + + * UIProcess/ios/WebPageProxyIOS.mm: + (WebKit::WebPageProxy::updateInputContextAfterBlurringAndRefocusingElement): + * WebProcess/WebPage/WebPage.cpp: + (WebKit::WebPage::elementDidFocus): + + In the case where we avoid sending a full ElementDidFocus message to the UI process due to refocusing the same + element, we should still notify the UI process so that it can synchronize state between the application process + and kbd. See above for more details. + + (WebKit::WebPage::elementDidBlur): + (WebKit::WebPage::updateInputContextAfterBlurringAndRefocusingElementIfNeeded): + * WebProcess/WebPage/WebPage.h: + * WebProcess/WebPage/ios/WebPageIOS.mm: + (WebKit::WebPage::updateInputContextAfterBlurringAndRefocusingElementIfNeeded): + + LayoutTests: + + Add a new layout test to verify that we suppress text interactions when focusing an editable element inside an + empty, borderless subframe. + + * editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe-expected.txt: Added. + * editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249006 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-22 Wenson Hsieh + + Typing Korean in title field after typing in the body inserts extraneous characters on blog.naver.com + https://bugs.webkit.org/show_bug.cgi?id=201023 + + + Reviewed by Ryosuke Niwa. + + Add a new layout test to verify that we suppress text interactions when focusing an editable element inside an + empty, borderless subframe. + + * editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe-expected.txt: Added. + * editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe.html: Added. + +2019-08-22 Kocsen Chung + + Cherry-pick r248977. rdar://problem/54599960 + + Do not adjust viewport if editing selection is already visible + https://bugs.webkit.org/show_bug.cgi?id=200907 + + + Reviewed by Simon Fraser. + + Source/WebCore: + + Test: fast/scrolling/ios/autoscroll-input-when-very-zoomed.html + + Currently due to scrolling being mostly handled by integers, we are getting + issues with rounding errors when trying to adjust the viewport while + editing text when we are significantly zoomed in. The real fix would be to + start dealing with scrolling with floats/doubles, but until such time, + we should early out of adjusting selections that we are certain are currently + visible. + + * rendering/RenderLayer.cpp: + (WebCore::RenderLayer::scrollRectToVisible): + + LayoutTests: + + * fast/scrolling/ios/autoscroll-input-when-very-zoomed-expected.txt: Added. + * fast/scrolling/ios/autoscroll-input-when-very-zoomed.html: Added. + * resources/ui-helper.js: + (window.UIHelper.immediateZoomToScale): + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248977 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-21 Megan Gardner + + Do not adjust viewport if editing selection is already visible + https://bugs.webkit.org/show_bug.cgi?id=200907 + + + Reviewed by Simon Fraser. + + * fast/scrolling/ios/autoscroll-input-when-very-zoomed-expected.txt: Added. + * fast/scrolling/ios/autoscroll-input-when-very-zoomed.html: Added. + * resources/ui-helper.js: + (window.UIHelper.immediateZoomToScale): + +2019-08-21 Kocsen Chung + + Cherry-pick r248974. rdar://problem/54579634 + + [Mail] Tapping top of message scrolls back to copied text instead of top of the message + https://bugs.webkit.org/show_bug.cgi?id=200999 + + + Reviewed by Wenson Hsieh. + + Source/WebCore: + + Test: editing/selection/ios/change-selection-by-tapping-with-existing-selection.html + + * page/EditorClient.h: + (WebCore::EditorClient::shouldAllowSingleClickToChangeSelection const): + * page/EventHandler.cpp: + (WebCore::EventHandler::handleMousePressEventSingleClick): + Instead of encoding platform behaviors in EventHandler, defer to EditorClient. + + Source/WebKit: + + In the case where you have a WebCore selection but are not first responder, + when you tap the WKWebView to become first responder, EventHandler would + bail from setting the selection, assuming UIKit was going to do it. This + behavior was introduced in r233311. + + However, since we are not first responder, UIKit does not change the + selection, since it considers the view to not be editable. + + Fix this by letting WebCore set the selection in this case, as it used to. + + * WebProcess/WebCoreSupport/WebEditorClient.h: + * WebProcess/WebCoreSupport/ios/WebEditorClientIOS.mm: + (WebKit::WebEditorClient::shouldAllowSingleClickToChangeSelection const): + * WebProcess/WebPage/WebPage.h: + (WebKit::WebPage::isShowingInputViewForFocusedElement const): + Copy the logic from EventHandler, with the added caveat (which fixes the + aforementioned behavior) that we will allow EventHandler to change the + selection if we don't have a focused node in the UIKit sense, because + we know that the platform text interaction code will *not* change the + selection if that is the case, so it's up to us. + + Source/WebKitLegacy/mac: + + * WebCoreSupport/WebEditorClient.h: + * WebCoreSupport/WebEditorClient.mm: + (WebEditorClient::shouldAllowSingleClickToChangeSelection const): + Copy the existing behavior from EventHandler. + We do not fix the bug in WebKitLegacy for a multitude of reasons, primarily + because we do not know of any user impact. + + LayoutTests: + + * editing/selection/ios/change-selection-by-tapping-with-existing-selection-expected.txt: Added. + * editing/selection/ios/change-selection-by-tapping-with-existing-selection.html: Added. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248974 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-21 Tim Horton + + [Mail] Tapping top of message scrolls back to copied text instead of top of the message + https://bugs.webkit.org/show_bug.cgi?id=200999 + + + Reviewed by Wenson Hsieh. + + * editing/selection/ios/change-selection-by-tapping-with-existing-selection-expected.txt: Added. + * editing/selection/ios/change-selection-by-tapping-with-existing-selection.html: Added. + +2019-08-21 Ryan Haddad + + Cherry-pick r248964. rdar://problem/54561673 + + Unreviewed test gardening, land test expectations for rdar://54561673. + + * platform/ios/TestExpectations: + * platform/ios-12/TestExpectations: + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@248964 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-21 Ryan Haddad + + Unreviewed test gardening, land test expectations for rdar://54561673. + + * platform/ios/TestExpectations: + * platform/ios-12/TestExpectations: + +2019-08-21 Ryan Haddad + + Cherry-pick r248917. rdar://problem/53829560 + + Updating Expectations for Multiple Newly Passing Tests. + + Unreviewed Test Gardening. + + * platform/ios-12/TestExpectations: + * platform/ios-wk1/TestExpectations: + * platform/ios/TestExpectations: + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@248917 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-20 Russell Epstein + + Updating Expectations for Multiple Newly Passing Tests. + + Unreviewed Test Gardening. + + * platform/ios-12/TestExpectations: + * platform/ios-wk1/TestExpectations: + * platform/ios/TestExpectations: + +2019-08-20 Babak Shafiei + + Cherry-pick r248909. rdar://problem/54543354 + + Clicking the search icon on ae.com hangs the web content process + https://bugs.webkit.org/show_bug.cgi?id=200889 + + + Reviewed by Ryosuke Niwa. + + Source/WebCore: + + The hang occurs under FrameSelection::selectionAtSentenceStart, while computing an EditorState to send to the UI + process. This act of determining whether the given positon is at the start of sentence entails moving backwards + from the start of the current visible selection until the start of a paragraph or sentence is found, using + VisiblePosition::previous to iterate backwards through VisiblePositions. + + However, on this website, VisiblePosition::previous ends up just returning the current position, and we loop + infinitely as a result because we never actually move backwards. This happens because VisiblePosition::previous + first uses previousVisuallyDistinctCandidate to find a candidate Position before the current position, but when + the position is canonicalized to create a VisiblePosition, it is moved back to its original Position as the deep + equivalent. + + In the attached test case (which is representative of the relevant part of the DOM on ae.com), we try to find + the previous VisiblePosition from (#c, 0). The previous visually distinct candidate we initially find is + (#b, 0), since: + + 1. The enclosing renderer is a RenderBlock with a non-zero height. + 2. The enclosing renderer has no rendered children. + 3. The position is at the first editing position in the node (i.e. the span element). + + However, when canonicalizing the position, we find that neither the upstream nor the downstream position is a + candidate because both the upstream and downstream nodes end up well outside of the span (the upstream node ends + up being at the start of the body element, and the downstream position ends up right before the start of #c's + container). The downstream position is at the end of a text node with a leading newline, it's not a candidate + because its last caret offset is less than the length of the text node. + + As a result, even though the given position (#b, 0) is a candidate itself, its downstream and upstream positions + are not. Thus, VisiblePosition::canonicalPosition expands the scope of its candidate positions to the next + closest candidate positions; the next candidate position is (#c, 0). Both of these candidates are outside of the + containing block, so we (somewhat arbitrarily) break the tie by choosing the next visible position, bringing us + back to (#c, 0). + + There are several ways to fix this, one of which involves fixing the downstream/upstream positions of (#b, 0) so + that they no longer jump out of the containing block of #b and cause (#b, 0) to be an invalid visible position + despite being a candidate position. This can be achieved by adjusting the heuristic in + endsOfNodeAreVisuallyDistinctPositions (used when moving upstream or downstream). Currently, this helper + function returns false for #b because they contain a single (non-rendered) whitespace character. Removing this + extraneous whitespace character actually causes the problem to stop reproducing, since #b and #c no longer + contain any child nodes. This is important because the heuristic in Position::downstream attempts to keep the + downstream position within the confines of the enclosing visual boundary, which (currently) ends up being the + entire body element because endsOfNodeAreVisuallyDistinctPositions returns false for #b. + + To avoid this scenario, we teach endsOfNodeAreVisuallyDistinctPositions to treat inline-block containers that + are empty (that is, contain no rendered content) but may have children for editing in the same way as inline- + block containers that don't have any children; in both scenarios, they may contain a candidate position, so we + should treat the ends of the container node as being visually distinct. + + Doing so causes the downstream position of (#b, 0) to be kept within the immediate containing span element, + which then allows (#b, 0) to be a canonical VisiblePosition. + + Tests: fast/events/focus-anchor-with-tabindex-hang.html + editing/selection/modify-backward-inline-block-containers.html + + * editing/VisiblePosition.cpp: + (WebCore::VisiblePosition::previous const): + + LayoutTests: + + * editing/selection/modify-backward-inline-block-containers-expected.txt: Added. + * editing/selection/modify-backward-inline-block-containers.html: Added. + + Add a layout test to ensure that the selection may be moved through empty inline-block containers that span the + width of the page. + + * fast/events/focus-anchor-with-tabindex-hang-expected.txt: Added. + * fast/events/focus-anchor-with-tabindex-hang.html: Added. + + Add a layout test to ensure that clicking an empty span under a focusable anchor element moves focus to the + anchor element instead of hanging the web content process or hitting a debug assertion. + + + git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248909 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-20 Wenson Hsieh + + Clicking the search icon on ae.com hangs the web content process + https://bugs.webkit.org/show_bug.cgi?id=200889 + + + Reviewed by Ryosuke Niwa. + + * editing/selection/modify-backward-inline-block-containers-expected.txt: Added. + * editing/selection/modify-backward-inline-block-containers.html: Added. + + Add a layout test to ensure that the selection may be moved through empty inline-block containers that span the + width of the page. + + * fast/events/focus-anchor-with-tabindex-hang-expected.txt: Added. + * fast/events/focus-anchor-with-tabindex-hang.html: Added. + + Add a layout test to ensure that clicking an empty span under a focusable anchor element moves focus to the + anchor element instead of hanging the web content process or hitting a debug assertion. + +2019-08-19 Ryan Haddad + + Cherry-pick r248875. rdar://problem/52961406 + + rdar://52961406 (scrollingcoordinator/ios/scroll-position-after-reattach.html is a flaky image failure on iOS) + + Unreviewed Test Gardening. + + * platform/ios/TestExpectations: Updated test expectations to [ Pass Failure ] + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@248875 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-19 Russell Epstein + + rdar://52961406 (scrollingcoordinator/ios/scroll-position-after-reattach.html is a flaky image failure on iOS) + + Unreviewed Test Gardening. + + * platform/ios/TestExpectations: Updated test expectations to [ Pass Failure ] + +2019-08-19 Ryan Haddad + + Cherry-pick r248863. rdar://problem/54481698 + + rdar://54481698 (Layout Test platform/ios/ios/fast/text/opticalFont.html is Failing) + + Unreviewed Test Gardening. + + * platform/ios-12/platform/ios/ios/fast/text/opticalFont-expected.txt: Copied from LayoutTests/platform/ios/platform/ios/ios/fast/text/opticalFont-expected.txt. + * platform/ios/platform/ios/ios/fast/text/opticalFont-expected.txt: Rebaseline. + + git-svn-id: http://svn.webkit.org/repository/webkit/trunk@248863 268f45cc-cd09-0410-ab3c-d52691b4dbfc + + 2019-08-19 Russell Epstein + + rdar://54481698 (Layout Test platform/ios/ios/fast/text/opticalFont.html is Failing) + + Unreviewed Test Gardening. + + * platform/ios-12/platform/ios/ios/fast/text/opticalFont-expected.txt: Copied from LayoutTests/platform/ios/platform/ios/ios/fast/text/opticalFont-expected.txt. + * platform/ios/platform/ios/ios/fast/text/opticalFont-expected.txt: Rebaseline. + +2019-08-18 Babak Shafiei + + Cherry-pick r248819. rdar://problem/54455005 + + Content in etc. Fix by handling + region painting in RenderReplaced. + + This still doesn't fix '); +shouldBeFalse('didExecute'); + +didExecute = false; +debug(''); +debug('Inserting with script element'); +editor.addEventListener('beforeinput', () => { + shouldBeTrue(`event.dataTransfer.getData('text/html').includes('script')`); +}, {once: true}); +insertHTML(`'); +shouldBeFalse('didExecute'); + +didExecute = false; +debug(''); +debug('Inserting iframe with a name into plaintext-only'); +editor.setAttribute('contenteditable', 'plaintext-only'); + +let i = 0; +function insertObjectElement() { + const object = document.createElement('object'); + object.data = 'about:blank'; + object.onload = () => { + try { + if (window.open('about:blank', 'named-frame').frameElement.parentNode) + didExecute = true; + } catch (e) { } + if (!didExecute && i++ < 10) + insertObjectElement(); + } + document.body.appendChild(object); +} +insertObjectElement(); +editor.focus(); +editor.addEventListener('beforeinput', () => { + shouldBeTrue(`event.dataTransfer.getData("text/html").includes("iframe name=")`); +}, {once: true}); +insertHTML(``); +shouldBeFalse('didExecute'); +didExecute = true; + + + + diff --git a/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered-expected.txt b/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered-expected.txt new file mode 100644 index 000000000000..d6c73ae07428 --- /dev/null +++ b/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered-expected.txt @@ -0,0 +1,27 @@ +This test checks that pasting into a color filtered dark mode document inserts light mode transformed content. + +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'HelloHello 2' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is '
  • Item 1
  • Hello
  • Item 2
  • ' +PASS pastedMarkup is '
  • Item 1
  • Hello 1
  • Hello 2
  • Item 2
  • ' +PASS pastedMarkup is '
  • Item 1
  • Hello 1
  • Hello 2
  • Item 2
  • ' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'HelloHello 2' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is 'Hello' +PASS pastedMarkup is '
  • Item 1
  • Hello
  • Item 2
  • ' +PASS pastedMarkup is '
  • Item 1
  • Hello 1
  • Hello 2
  • Item 2
  • ' +PASS pastedMarkup is '
  • Item 1
  • Hello 1
  • Hello 2
  • Item 2
  • ' +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered.html b/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered.html new file mode 100644 index 000000000000..2faa8c759d5c --- /dev/null +++ b/LayoutTests/editing/pasteboard/paste-dark-mode-color-filtered.html @@ -0,0 +1,95 @@ + + + + + + + + +

    This test checks that pasting into a color filtered dark mode document inserts light mode transformed content.

    +
    + + + + + + diff --git a/LayoutTests/editing/pasteboard/paste-does-not-fire-promises-while-sanitizing-web-content-expected.txt b/LayoutTests/editing/pasteboard/paste-does-not-fire-promises-while-sanitizing-web-content-expected.txt new file mode 100644 index 000000000000..d1801a7f478d --- /dev/null +++ b/LayoutTests/editing/pasteboard/paste-does-not-fire-promises-while-sanitizing-web-content-expected.txt @@ -0,0 +1,13 @@ +Click here to copy + +Verifies that a promise scheduled right before a programmatically triggered paste does not resolve during the paste. To test manually, tap the frame to copy some text, and then tap the editable area to paste. The promise should run after the paste event handler. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS Focused editor. +PASS Handled paste. +PASS Focused textarea. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/pasteboard/paste-does-not-fire-promises-while-sanitizing-web-content.html b/LayoutTests/editing/pasteboard/paste-does-not-fire-promises-while-sanitizing-web-content.html new file mode 100644 index 000000000000..d62170747929 --- /dev/null +++ b/LayoutTests/editing/pasteboard/paste-does-not-fire-promises-while-sanitizing-web-content.html @@ -0,0 +1,89 @@ + + + + + + + + + +
    + + +
    +
    + + + diff --git a/LayoutTests/editing/pasteboard/reveal-selection-after-pasting-images-expected.txt b/LayoutTests/editing/pasteboard/reveal-selection-after-pasting-images-expected.txt new file mode 100644 index 000000000000..7093ac4490be --- /dev/null +++ b/LayoutTests/editing/pasteboard/reveal-selection-after-pasting-images-expected.txt @@ -0,0 +1,13 @@ +This test verifies that we scroll to reveal the selection after pasting images in an editable area. To run the test manually, copy the selected images and paste into the red editable container above. The container should scroll to reveal the caret after the last image. + +Scrolled after pasting: +|
    +| +| src="resources/mozilla.gif" +|
    +| +| src="resources/apple.gif" +|
    +| +| src="../resources/abe.png" +| <#selection-caret> diff --git a/LayoutTests/editing/pasteboard/reveal-selection-after-pasting-images.html b/LayoutTests/editing/pasteboard/reveal-selection-after-pasting-images.html new file mode 100644 index 000000000000..331ccc15d7e0 --- /dev/null +++ b/LayoutTests/editing/pasteboard/reveal-selection-after-pasting-images.html @@ -0,0 +1,46 @@ + + + + + + + + + +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/editing/selection/ios/autoscroll-with-top-content-inset-2-expected.txt b/LayoutTests/editing/selection/ios/autoscroll-with-top-content-inset-2-expected.txt new file mode 100644 index 000000000000..66b24d041966 --- /dev/null +++ b/LayoutTests/editing/selection/ios/autoscroll-with-top-content-inset-2-expected.txt @@ -0,0 +1 @@ +PASS - caret appeared within the visual viewport diff --git a/LayoutTests/editing/selection/ios/autoscroll-with-top-content-inset-2.html b/LayoutTests/editing/selection/ios/autoscroll-with-top-content-inset-2.html new file mode 100644 index 000000000000..8cc05135bcaf --- /dev/null +++ b/LayoutTests/editing/selection/ios/autoscroll-with-top-content-inset-2.html @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/LayoutTests/editing/selection/ios/change-selection-by-tapping-with-existing-selection-expected.txt b/LayoutTests/editing/selection/ios/change-selection-by-tapping-with-existing-selection-expected.txt new file mode 100644 index 000000000000..55c47f67528f --- /dev/null +++ b/LayoutTests/editing/selection/ios/change-selection-by-tapping-with-existing-selection-expected.txt @@ -0,0 +1,13 @@ +Here's to the crazy ones, the misfits, the rebels, the trouble makers, the round pegs in the square holes, the ones who see things differently. There not fond of rules, and they have no respect for the status quo, you can quote then, disagree with them, glorify or vilify them, about the only thing you can't do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world are the ones who do. + +Verifies that tapping to change selection works when we already have a selection in the same editable root but do not currently have a focused node in the UIKit sense. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS successfullyParsed is true + +TEST COMPLETE + +Selection before tap: (target#0, target#2) +Selection after tap: (editor#0, editor#0) diff --git a/LayoutTests/editing/selection/ios/change-selection-by-tapping-with-existing-selection.html b/LayoutTests/editing/selection/ios/change-selection-by-tapping-with-existing-selection.html new file mode 100644 index 000000000000..370740c6568b --- /dev/null +++ b/LayoutTests/editing/selection/ios/change-selection-by-tapping-with-existing-selection.html @@ -0,0 +1,69 @@ + + + + + + + + + + +

    Here's to the crazy ones, the misfits, the rebels, the trouble makers, the round pegs in the square holes, the ones who see things differently. There not fond of rules, and they have no respect for the status quo, you can quote then, disagree with them, glorify or vilify them, about the only thing you can't do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world are the ones who do.

    +

    +

    +
    Selection before tap:
    +
    Selection after tap:
    + + diff --git a/LayoutTests/editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text-expected.txt b/LayoutTests/editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text-expected.txt new file mode 100644 index 000000000000..40fefbb6f5dd --- /dev/null +++ b/LayoutTests/editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text-expected.txt @@ -0,0 +1,11 @@ +This test verifies that tapping selected non-editable text clears the text selection in the case where the selected text covers the vast majority of visible content. To manually test, tap the button to select the text above, and then tap inside the selection to clear it. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Observed selection. +PASS Dismissed selection. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text.html b/LayoutTests/editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text.html new file mode 100644 index 000000000000..0179dc87d540 --- /dev/null +++ b/LayoutTests/editing/selection/ios/clear-selection-after-tap-in-large-selected-non-editable-text.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + +

    Here’s to the crazy ones, the misfits, the rebels, the trouble makers, the round pegs in the square holes, the ones who see things differently. There not fond of rules, and they have no respect for the status quo, you can quote then, disagree with them, glorify or vilify them, about the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world are the ones who do.

    +

    +

    + + diff --git a/LayoutTests/editing/selection/ios/clear-selection-after-tapping-on-element-with-click-handler-expected.txt b/LayoutTests/editing/selection/ios/clear-selection-after-tapping-on-element-with-click-handler-expected.txt new file mode 100644 index 000000000000..660a6ac2cea9 --- /dev/null +++ b/LayoutTests/editing/selection/ios/clear-selection-after-tapping-on-element-with-click-handler-expected.txt @@ -0,0 +1,12 @@ +This test verifies that the DOM selection is dismissed when tapping on an element that listens to click events. To manually test, select 'WebKit' and tap on the red square. The selection should be dismissed, and the output area should indicate that no text is selected. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS getSelection().toString() is "" +PASS getSelection().type is "Caret" +PASS successfullyParsed is true + +TEST COMPLETE +WebKit +The selected text is: "" diff --git a/LayoutTests/editing/selection/ios/clear-selection-after-tapping-on-element-with-click-handler.html b/LayoutTests/editing/selection/ios/clear-selection-after-tapping-on-element-with-click-handler.html new file mode 100644 index 000000000000..7356329853e4 --- /dev/null +++ b/LayoutTests/editing/selection/ios/clear-selection-after-tapping-on-element-with-click-handler.html @@ -0,0 +1,53 @@ + + + + + + + + + + +
    WebKit
    +
    +
    The selected text is: ""
    + + diff --git a/LayoutTests/editing/selection/ios/dispatch-mouse-events-when-modifying-selection-quirk.html b/LayoutTests/editing/selection/ios/dispatch-mouse-events-when-modifying-selection-quirk.html index 0a2fb95a5dfa..a118033d120a 100644 --- a/LayoutTests/editing/selection/ios/dispatch-mouse-events-when-modifying-selection-quirk.html +++ b/LayoutTests/editing/selection/ios/dispatch-mouse-events-when-modifying-selection-quirk.html @@ -41,6 +41,15 @@ addEventListener("mousemove", recordEvent); addEventListener("mouseup", recordEvent); +async function waitForCaretToAppear() +{ + while (true) { + const rect = await UIHelper.getUICaretViewRect(); + if (rect && rect.top && rect.left && rect.width > 0 && rect.height > 0) + return rect; + } +} + async function waitForSelectionToAppear() { while (true) { @@ -63,7 +72,8 @@ debug("\nAttempting to show the callout bar."); const editor = document.querySelector(".editor"); await UIHelper.activateElementAndWaitForInputSession(editor); - await UIHelper.activateElement(editor); + const [caretX, caretY] = midPointOfRect(await waitForCaretToAppear()); + await UIHelper.activateAt(caretX, caretY); await UIHelper.waitForMenuToShow(); testPassed("Displayed the callout bar."); diff --git a/LayoutTests/editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe-expected.txt b/LayoutTests/editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe-expected.txt new file mode 100644 index 000000000000..5bbb2ceaeb3a --- /dev/null +++ b/LayoutTests/editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe-expected.txt @@ -0,0 +1,11 @@ +This test verifies that selection UI is suppressed when focusing an element inside an empty subframe. To run the test manually, tap the button and check that a blue selection caret is not visible. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS caretRect.width is 0 +PASS caretRect.height is 0 +PASS successfullyParsed is true + +TEST COMPLETE +Focus the hidden frame diff --git a/LayoutTests/editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe.html b/LayoutTests/editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe.html new file mode 100644 index 000000000000..c7390b1a70db --- /dev/null +++ b/LayoutTests/editing/selection/ios/do-not-show-selection-in-empty-borderless-subframe.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-click-handler-expected.txt b/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-click-handler-expected.txt deleted file mode 100644 index e6d97ef4fdd8..000000000000 --- a/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-click-handler-expected.txt +++ /dev/null @@ -1,3 +0,0 @@ -WebKit -The selected text is: "WebKit" -This test verifies that the DOM selection is not dismissed when tapping on an element that preventDefault()s the click event. diff --git a/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-click-handler.html b/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-click-handler.html deleted file mode 100644 index e38f4d30fc04..000000000000 --- a/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-click-handler.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - -
    WebKit
    -
    -
    The selected text is: ""
    -

    This test verifies that the DOM selection is not dismissed when tapping on an element that preventDefault()s the click event.

    - - diff --git a/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-mousedown-handler-expected.txt b/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-mousedown-handler-expected.txt new file mode 100644 index 000000000000..611c694affb2 --- /dev/null +++ b/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-mousedown-handler-expected.txt @@ -0,0 +1,3 @@ +WebKit +The selected text is: "WebKit" +This test verifies that the DOM selection is not dismissed when tapping on an element that preventDefault()s the mousedown event. diff --git a/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-mousedown-handler.html b/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-mousedown-handler.html new file mode 100644 index 000000000000..89b76cd92453 --- /dev/null +++ b/LayoutTests/editing/selection/ios/persist-selection-after-tapping-on-element-with-mousedown-handler.html @@ -0,0 +1,60 @@ + + + + + + + + + + +
    WebKit
    +
    +
    The selected text is: ""
    +

    This test verifies that the DOM selection is not dismissed when tapping on an element that preventDefault()s the mousedown event.

    + + diff --git a/LayoutTests/editing/selection/ios/place-selection-in-overflow-area-expected.txt b/LayoutTests/editing/selection/ios/place-selection-in-overflow-area-expected.txt new file mode 100644 index 000000000000..11b5a5b80bca --- /dev/null +++ b/LayoutTests/editing/selection/ios/place-selection-in-overflow-area-expected.txt @@ -0,0 +1,28 @@ +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +Selection before tap: (node at 2#11, [object Text]#11) +Selection after tap: (node at 40#13, [object Text]#13) diff --git a/LayoutTests/editing/selection/ios/place-selection-in-overflow-area.html b/LayoutTests/editing/selection/ios/place-selection-in-overflow-area.html new file mode 100644 index 000000000000..63236687e164 --- /dev/null +++ b/LayoutTests/editing/selection/ios/place-selection-in-overflow-area.html @@ -0,0 +1,88 @@ + + + + + + + + + + +
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    +
    + +
    Selection before tap:
    +
    Selection after tap:
    + + + diff --git a/LayoutTests/editing/selection/ios/select-all-non-editable-text-using-keyboard-expected.txt b/LayoutTests/editing/selection/ios/select-all-non-editable-text-using-keyboard-expected.txt new file mode 100644 index 000000000000..30ff7f428f12 --- /dev/null +++ b/LayoutTests/editing/selection/ios/select-all-non-editable-text-using-keyboard-expected.txt @@ -0,0 +1,10 @@ +Tests pressing Command + a to select all non-editable text. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS window.getSelection().toString() is "Here's to the crazy ones.\n\nThe misfits.\n\nThe rebels." +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/select-all-non-editable-text-using-keyboard.html b/LayoutTests/editing/selection/ios/select-all-non-editable-text-using-keyboard.html new file mode 100644 index 000000000000..56fb549c78d3 --- /dev/null +++ b/LayoutTests/editing/selection/ios/select-all-non-editable-text-using-keyboard.html @@ -0,0 +1,46 @@ + + + + + + + + +
    +

    Here's to the crazy ones.

    +

    The misfits.

    +

    The rebels.

    +
    + + + diff --git a/LayoutTests/editing/selection/ios/select-non-editable-text-using-keyboard-expected.txt b/LayoutTests/editing/selection/ios/select-non-editable-text-using-keyboard-expected.txt new file mode 100644 index 000000000000..be2232e52219 --- /dev/null +++ b/LayoutTests/editing/selection/ios/select-non-editable-text-using-keyboard-expected.txt @@ -0,0 +1,45 @@ +Test selecting non-editable text using the keyboard. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + + +Press Shift + right arrow to select the next character: +PASS window.getSelection().toString() is "He" + +Press Shift + left arrow to select the previous character: +PASS window.getSelection().toString() is "Her" + +Press Shift + Option + right arrow to select to the end of the word: +PASS window.getSelection().toString() is "Here's " + +Press Shift + Option + left arrow to select to the beginning of the word: +PASS window.getSelection().toString() is "The" + +Press Shift + Control + right arrow to select to the end of the line: +PASS window.getSelection().toString() is "Here's to the crazy ones." + +Press Shift + Control + left arrow to select to the beginning of the line: +PASS window.getSelection().toString() is "The misfits." + +Press Shift + up arrow to select up: +PASS window.getSelection().toString() is "Here's to the crazy ones.\n\nT" + +Press Shift + down arrow to select down: +PASS window.getSelection().toString() is "The misfits.\n\nT" + +Press Shift + Option + down arrow to select to the end of the paragraph: +PASS window.getSelection().toString() is "Here's to the crazy ones." + +Press Shift + Option + up arrow to select to the beginning of the paragraph: +PASS window.getSelection().toString() is "The rebels." + +Press Shift + Control + down arrow to select to the end of the document: +PASS window.getSelection().toString() is "Here's to the crazy ones.\n\nThe misfits.\n\nThe rebels." + +Press Shift + Control + up arrow to select to the beginning of the document: +PASS window.getSelection().toString() is "Here's to the crazy ones.\n\nThe misfits." +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/select-non-editable-text-using-keyboard.html b/LayoutTests/editing/selection/ios/select-non-editable-text-using-keyboard.html new file mode 100644 index 000000000000..e14810a6275f --- /dev/null +++ b/LayoutTests/editing/selection/ios/select-non-editable-text-using-keyboard.html @@ -0,0 +1,176 @@ + + + + + + + + +
    +

    Here's to the crazy ones.

    +

    The misfits.

    +

    The rebels.

    +
    + + + diff --git a/LayoutTests/editing/selection/ios/selection-extends-into-overflow-area-expected.txt b/LayoutTests/editing/selection/ios/selection-extends-into-overflow-area-expected.txt new file mode 100644 index 000000000000..5c7dee3bd54d --- /dev/null +++ b/LayoutTests/editing/selection/ios/selection-extends-into-overflow-area-expected.txt @@ -0,0 +1,27 @@ +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +line +Selection rects: (left = 9, top = 386, width = 32, height = 19) diff --git a/LayoutTests/editing/selection/ios/selection-extends-into-overflow-area.html b/LayoutTests/editing/selection/ios/selection-extends-into-overflow-area.html new file mode 100644 index 000000000000..73fcbeb4a587 --- /dev/null +++ b/LayoutTests/editing/selection/ios/selection-extends-into-overflow-area.html @@ -0,0 +1,95 @@ + + + + + + + + + + +
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    + line
    +
    + +
    Selection rects:
    + + + diff --git a/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-2-expected.txt b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-2-expected.txt new file mode 100644 index 000000000000..58189a75ca56 --- /dev/null +++ b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-2-expected.txt @@ -0,0 +1,14 @@ + +This test verifies that after focusing a visible input field in a display: flex container that has been translated horizontally out of view, the caret is still visible. To run the test manually, tap the input field and check that the caret shows up. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS caretRect.left is 12 +PASS caretRect.top is 6 +PASS caretRect.width is 2 +PASS caretRect.height is 23 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-2.html b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-2.html new file mode 100644 index 000000000000..46491f9e4950 --- /dev/null +++ b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-2.html @@ -0,0 +1,75 @@ + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +

    +

    + + diff --git a/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-expected.txt b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-expected.txt new file mode 100644 index 000000000000..f7b3128973b0 --- /dev/null +++ b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container-expected.txt @@ -0,0 +1,19 @@ + + +Apply transform +This test verifies that after focusing a visible input field in a body element that has been translated horizontally out of view, the caret is still visible. To run the test manually, first tap the input field and check that the caret shows up. Then, tap the button to apply the CSS transform, tap the input field again, and check that the caret is still visible. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS caretBefore.left is 20 +PASS caretBefore.top is 14 +PASS caretBefore.width is 2 +PASS caretBefore.height is 23 +PASS caretAfter.left is 20 +PASS caretAfter.top is 14 +PASS caretAfter.width is 2 +PASS caretAfter.height is 23 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/show-selection-in-transformed-container.html b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container.html new file mode 100644 index 000000000000..69bc09f6f5d3 --- /dev/null +++ b/LayoutTests/editing/selection/ios/show-selection-in-transformed-container.html @@ -0,0 +1,89 @@ + + + + + + + + + + +
    + + +
    + +
    +
    + + diff --git a/LayoutTests/editing/selection/ios/tap-during-loupe-gesture-expected.txt b/LayoutTests/editing/selection/ios/tap-during-loupe-gesture-expected.txt new file mode 100644 index 000000000000..c2dc479f924e --- /dev/null +++ b/LayoutTests/editing/selection/ios/tap-during-loupe-gesture-expected.txt @@ -0,0 +1,10 @@ + +This test verifies that the UI process doesn't hang if the user taps during a loupe gesture if focus is inside editable content in a same-origin child frame. To run the test manually, long press and drag on the page with one finger, and tap the page several times with the other finger at the same time. The UI process should not permanently hang as a result. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS Did not hang. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/tap-during-loupe-gesture.html b/LayoutTests/editing/selection/ios/tap-during-loupe-gesture.html new file mode 100644 index 000000000000..f2bb17a8cf92 --- /dev/null +++ b/LayoutTests/editing/selection/ios/tap-during-loupe-gesture.html @@ -0,0 +1,255 @@ + + + + + + + + + + + +
    +
    +
    + + + + diff --git a/LayoutTests/editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text-expected.txt b/LayoutTests/editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text-expected.txt new file mode 100644 index 000000000000..33a499ad2fa8 --- /dev/null +++ b/LayoutTests/editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text-expected.txt @@ -0,0 +1,13 @@ +This test verifies that tapping selected non-editable text toggles callout bar visibility. To manually test, tap the button to select the text above, and then tap inside the selection to show the callout bar; tap inside the selection again to dismiss the callout bar, and finally tap outside of the selected text to clear the selection. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Observed selection. +PASS Showed callout bar after first tap in selection. +PASS Dismissed callout bar after second tap in selection. +PASS Dismissed selection after tap outside of selection. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text.html b/LayoutTests/editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text.html new file mode 100644 index 000000000000..32a1625c07d7 --- /dev/null +++ b/LayoutTests/editing/selection/ios/toggle-callout-bar-after-tap-in-selected-non-editable-text.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + +

    Here’s to the crazy ones, the misfits, the rebels, the trouble makers, the round pegs in the square holes, the ones who see things differently. There not fond of rules, and they have no respect for the status quo, you can quote then, disagree with them, glorify or vilify them, about the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world are the ones who do.

    +
    Then click here
    +

    +

    + + diff --git a/LayoutTests/editing/selection/ios/update-selection-after-iframe-scroll-expected.txt b/LayoutTests/editing/selection/ios/update-selection-after-iframe-scroll-expected.txt new file mode 100644 index 000000000000..7dbfa465abc1 --- /dev/null +++ b/LayoutTests/editing/selection/ios/update-selection-after-iframe-scroll-expected.txt @@ -0,0 +1,23 @@ +PASS selectionRectsBefore[0].top is 74 +PASS selectionRectsBefore[0].width is 184 +PASS selectionRectsBefore[0].left is 10 +PASS selectionRectsBefore[0].height is 19 +PASS selectionRectsBefore[1].top is 93 +PASS selectionRectsBefore[1].width is 167 +PASS selectionRectsBefore[1].left is 10 +PASS selectionRectsBefore[1].height is 20 +PASS selectionRectsAfter[0].top is 24 +PASS selectionRectsAfter[0].width is 184 +PASS selectionRectsAfter[0].left is 10 +PASS selectionRectsAfter[0].height is 19 +PASS selectionRectsAfter[1].top is 43 +PASS selectionRectsAfter[1].width is 167 +PASS selectionRectsAfter[1].left is 10 +PASS selectionRectsAfter[1].height is 20 +PASS successfullyParsed is true + +TEST COMPLETE + +This test verifies that a selection in an iframe area is kept up to date after scrolling. To test manually, tap the frame and scroll the editable area down; the selection move to account for the new scroll position. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". diff --git a/LayoutTests/editing/selection/ios/update-selection-after-iframe-scroll.html b/LayoutTests/editing/selection/ios/update-selection-after-iframe-scroll.html new file mode 100644 index 000000000000..b70fca6aa526 --- /dev/null +++ b/LayoutTests/editing/selection/ios/update-selection-after-iframe-scroll.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + +
    + + + \ No newline at end of file diff --git a/LayoutTests/editing/selection/ios/update-selection-after-overflow-scroll-expected.txt b/LayoutTests/editing/selection/ios/update-selection-after-overflow-scroll-expected.txt new file mode 100644 index 000000000000..c0f3da8c44bb --- /dev/null +++ b/LayoutTests/editing/selection/ios/update-selection-after-overflow-scroll-expected.txt @@ -0,0 +1,24 @@ +This test verifies that a selection in a fast scrollable area is kept up to date after scrolling. To test manually, tap the button and scroll the editable area down; the selection move to account for the new scroll position. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS selectionRectsBefore[0].top is 108 +PASS selectionRectsBefore[0].width is 320 +PASS selectionRectsBefore[0].left is 0 +PASS selectionRectsBefore[0].height is 29 +PASS selectionRectsBefore[1].top is 137 +PASS selectionRectsBefore[1].width is 172 +PASS selectionRectsBefore[1].left is 0 +PASS selectionRectsBefore[1].height is 30 +PASS selectionRectsAfter[0].top is 58 +PASS selectionRectsAfter[0].width is 320 +PASS selectionRectsAfter[0].left is 0 +PASS selectionRectsAfter[0].height is 29 +PASS selectionRectsAfter[1].top is 87 +PASS selectionRectsAfter[1].width is 172 +PASS selectionRectsAfter[1].left is 0 +PASS selectionRectsAfter[1].height is 30 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/editing/selection/ios/update-selection-after-overflow-scroll.html b/LayoutTests/editing/selection/ios/update-selection-after-overflow-scroll.html new file mode 100644 index 000000000000..a2bdb6d10467 --- /dev/null +++ b/LayoutTests/editing/selection/ios/update-selection-after-overflow-scroll.html @@ -0,0 +1,103 @@ + + + + + + + + + + +
    +

    The quick brown fox jumped over the lazy dog.

    +

    The quick brown fox jumped over the lazy dog.

    +

    The quick brown fox jumped over the lazy dog.

    +
    + +
    +
    + + \ No newline at end of file diff --git a/LayoutTests/editing/selection/modify-backward-inline-block-containers-expected.txt b/LayoutTests/editing/selection/modify-backward-inline-block-containers-expected.txt new file mode 100644 index 000000000000..312d9c224103 --- /dev/null +++ b/LayoutTests/editing/selection/modify-backward-inline-block-containers-expected.txt @@ -0,0 +1,156 @@ +This test verifies that the selection can be moved forwards and backwards through empty inline-block containers that span the full width of the document. To manually test, use arrow keys or click before each exclamation mark to verify that the selection can be moved into each inline-block span element. + +Initial caret position: +| " + " +|
    +| " + " +| +| class="empty" +| " " +| " + " +| +| class="empty" +| " " +| " + " +| " + " +|
    +| " + " +| +| class="empty" +| id="start" +| <#selection-caret> +| " " +| " + " +| " + " + +Move backward: +| " + " +| +| " + " +| +| class="empty" +| " " +| " + " +| +| class="empty" +| <#selection-caret> +| " " +| " + " +| " + " +|
    +| " + " +| +| class="empty" +| id="start" +| " " +| " + " +| " + " + +Move backward again: +| " + " +| +| " + " +| +| class="empty" +| <#selection-caret> +| " " +| " + " +| +| class="empty" +| " " +| " + " +| " + " +|
    +| " + " +| +| class="empty" +| id="start" +| " " +| " + " +| " + " + +Move forward: +| " + " +| +| " + " +| +| class="empty" +| " " +| " + " +| +| class="empty" +| <#selection-caret> +| " " +| " + " +| " + " +|
    +| " + " +| +| class="empty" +| id="start" +| " " +| " + " +| " + " + +Move forward again: +| " + " +| +| " + " +| +| class="empty" +| " " +| " + " +| +| class="empty" +| " " +| " + " +| " + " +|
    +| " + " +| +| class="empty" +| id="start" +| <#selection-caret> +| " " +| " + " +| " + " diff --git a/LayoutTests/editing/selection/modify-backward-inline-block-containers.html b/LayoutTests/editing/selection/modify-backward-inline-block-containers.html new file mode 100644 index 000000000000..74f5cdb3ebe0 --- /dev/null +++ b/LayoutTests/editing/selection/modify-backward-inline-block-containers.html @@ -0,0 +1,50 @@ + + + + + + + + +

    +
    + + + + +
    + +
    +
    + + diff --git a/LayoutTests/fast/attachment/attachment-border-should-stay-inside-attachment-expected.html b/LayoutTests/fast/attachment/attachment-border-should-stay-inside-attachment-expected.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/LayoutTests/fast/attachment/attachment-border-should-stay-inside-attachment.html b/LayoutTests/fast/attachment/attachment-border-should-stay-inside-attachment.html new file mode 100644 index 000000000000..cdf0b8c67d1b --- /dev/null +++ b/LayoutTests/fast/attachment/attachment-border-should-stay-inside-attachment.html @@ -0,0 +1,58 @@ + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + diff --git a/LayoutTests/fast/content-observation/click-event-suppression-on-content-change.html b/LayoutTests/fast/content-observation/click-event-suppression-on-content-change.html deleted file mode 100644 index dd88b1884798..000000000000 --- a/LayoutTests/fast/content-observation/click-event-suppression-on-content-change.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - -
    Test that if document is visibly mutated in mouseover handler then synthetic click is not generated until the next tap.
    -
    -
    -
    -
    -
    - - diff --git a/LayoutTests/fast/css/border-radius-negative-size-expected.txt b/LayoutTests/fast/css/border-radius-negative-size-expected.txt new file mode 100644 index 000000000000..622ee0e686d8 --- /dev/null +++ b/LayoutTests/fast/css/border-radius-negative-size-expected.txt @@ -0,0 +1 @@ +This test passes if it doesn't hang. diff --git a/LayoutTests/fast/css/border-radius-negative-size.html b/LayoutTests/fast/css/border-radius-negative-size.html new file mode 100644 index 000000000000..6a59bba93e43 --- /dev/null +++ b/LayoutTests/fast/css/border-radius-negative-size.html @@ -0,0 +1,28 @@ + + +
    +
    +This test passes if it doesn't hang. +
    +
    diff --git a/LayoutTests/fast/css/getComputedStyle/sticky-scroll-container-crash-expected.txt b/LayoutTests/fast/css/getComputedStyle/sticky-scroll-container-crash-expected.txt new file mode 100644 index 000000000000..2985393944b6 --- /dev/null +++ b/LayoutTests/fast/css/getComputedStyle/sticky-scroll-container-crash-expected.txt @@ -0,0 +1 @@ +This test passes if it doesn't crash diff --git a/LayoutTests/fast/css/getComputedStyle/sticky-scroll-container-crash.html b/LayoutTests/fast/css/getComputedStyle/sticky-scroll-container-crash.html new file mode 100644 index 000000000000..c08802f993a9 --- /dev/null +++ b/LayoutTests/fast/css/getComputedStyle/sticky-scroll-container-crash.html @@ -0,0 +1,13 @@ + +
    This test passes if it doesn't crash
    + diff --git a/LayoutTests/fast/dom/HTMLLinkElement/cachedresource-types.html b/LayoutTests/fast/dom/HTMLLinkElement/cachedresource-types.html index 9cbb57501647..545b1adc1339 100644 --- a/LayoutTests/fast/dom/HTMLLinkElement/cachedresource-types.html +++ b/LayoutTests/fast/dom/HTMLLinkElement/cachedresource-types.html @@ -3,7 +3,7 @@ testRunner.dumpAsText(); - + This test passes if it does not crash. diff --git a/LayoutTests/fast/events/focus-anchor-with-tabindex-hang-expected.txt b/LayoutTests/fast/events/focus-anchor-with-tabindex-hang-expected.txt new file mode 100644 index 000000000000..3e6b30490d0e --- /dev/null +++ b/LayoutTests/fast/events/focus-anchor-with-tabindex-hang-expected.txt @@ -0,0 +1,12 @@ +This test verifies that clicking an empty container in an anchor element with a tabindex correctly focuses the anchor without hanging the web content process. To run the test manually, tap or click the red box; the active element should be set to the anchor element, and the web process should remain responsive. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Clicked target. +PASS document.activeElement is anchor +PASS successfullyParsed is true + +TEST COMPLETE + + diff --git a/LayoutTests/fast/events/focus-anchor-with-tabindex-hang.html b/LayoutTests/fast/events/focus-anchor-with-tabindex-hang.html new file mode 100644 index 000000000000..2075913c9dca --- /dev/null +++ b/LayoutTests/fast/events/focus-anchor-with-tabindex-hang.html @@ -0,0 +1,56 @@ + + + + + + + + + + +

    +

    + + + + +
    + +
    + + diff --git a/LayoutTests/fast/events/ios/autocorrect-after-image-expected.txt b/LayoutTests/fast/events/ios/autocorrect-after-image-expected.txt new file mode 100644 index 000000000000..b1180c873c2a --- /dev/null +++ b/LayoutTests/fast/events/ios/autocorrect-after-image-expected.txt @@ -0,0 +1,13 @@ +The +This test verifies that inserting an auto-corrected text after an image does not remove the image. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS Observed input event of inputType insertText +PASS document.activeElement is editor +PASS editor.children.length is 1 +PASS editor.children[0] instanceof HTMLImageElement is true +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/ios/autocorrect-after-image.html b/LayoutTests/fast/events/ios/autocorrect-after-image.html new file mode 100644 index 000000000000..e32b4b9cca7e --- /dev/null +++ b/LayoutTests/fast/events/ios/autocorrect-after-image.html @@ -0,0 +1,44 @@ + + + + + + + + + + + +
    + +
    +
    +
    + + + diff --git a/LayoutTests/fast/events/ios/autocorrect-with-apostrophe-expected.txt b/LayoutTests/fast/events/ios/autocorrect-with-apostrophe-expected.txt new file mode 100644 index 000000000000..8917f0b8bd27 --- /dev/null +++ b/LayoutTests/fast/events/ios/autocorrect-with-apostrophe-expected.txt @@ -0,0 +1,12 @@ + +This test verifies that "I'" can be autocorrected to "I’m". To manually run the test, focus the text area, place the caret at the end of the apostrophe, and select the "I’m" text candidate above the keyboard. Check that the text candidate is inserted as expected. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS Observed input event of inputType insertReplacementText +PASS document.activeElement is editor +PASS editor.value is "I’m" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/ios/autocorrect-with-apostrophe.html b/LayoutTests/fast/events/ios/autocorrect-with-apostrophe.html new file mode 100644 index 000000000000..87ebc9a50c29 --- /dev/null +++ b/LayoutTests/fast/events/ios/autocorrect-with-apostrophe.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + +
    +
    + + + diff --git a/LayoutTests/fast/events/ios/click-event-and-display-contents-expected.txt b/LayoutTests/fast/events/ios/click-event-and-display-contents-expected.txt new file mode 100644 index 000000000000..69cfc5a98db7 --- /dev/null +++ b/LayoutTests/fast/events/ios/click-event-and-display-contents-expected.txt @@ -0,0 +1,2 @@ +PASS + diff --git a/LayoutTests/fast/events/ios/click-event-and-display-contents.html b/LayoutTests/fast/events/ios/click-event-and-display-contents.html new file mode 100644 index 000000000000..33a1eb113e5a --- /dev/null +++ b/LayoutTests/fast/events/ios/click-event-and-display-contents.html @@ -0,0 +1,43 @@ + + + +This tests that a tap on an element with display: contents dispatches a "click" event. + + + + +
    FAIL
    + + + diff --git a/LayoutTests/fast/events/ios/click-event-two-finger-single-tap-meta-key-expected.txt b/LayoutTests/fast/events/ios/click-event-two-finger-single-tap-meta-key-expected.txt new file mode 100644 index 000000000000..3fa25818f830 --- /dev/null +++ b/LayoutTests/fast/events/ios/click-event-two-finger-single-tap-meta-key-expected.txt @@ -0,0 +1 @@ +PASS: received click event with metaKey set to true diff --git a/LayoutTests/fast/events/ios/click-event-two-finger-single-tap-meta-key.html b/LayoutTests/fast/events/ios/click-event-two-finger-single-tap-meta-key.html new file mode 100644 index 000000000000..b526d33c8db5 --- /dev/null +++ b/LayoutTests/fast/events/ios/click-event-two-finger-single-tap-meta-key.html @@ -0,0 +1,47 @@ + + + + + + + + + +
    + FAIL: did not receive click event. +
    + + + diff --git a/LayoutTests/fast/events/ios/command+shift+v-should-not-insert-v-expected.txt b/LayoutTests/fast/events/ios/command+shift+v-should-not-insert-v-expected.txt new file mode 100644 index 000000000000..6c1447410f5e --- /dev/null +++ b/LayoutTests/fast/events/ios/command+shift+v-should-not-insert-v-expected.txt @@ -0,0 +1,10 @@ +Tests that Command + Shift + v does not insert v and that pressing a does insert an a. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS window.event.data is "a" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/ios/command+shift+v-should-not-insert-v.html b/LayoutTests/fast/events/ios/command+shift+v-should-not-insert-v.html new file mode 100644 index 000000000000..fab6468b1d80 --- /dev/null +++ b/LayoutTests/fast/events/ios/command+shift+v-should-not-insert-v.html @@ -0,0 +1,46 @@ + + + + + + + + +

    +
    +
    + + diff --git a/LayoutTests/fast/events/ios/dom-update-on-keydown-quirk-expected.txt b/LayoutTests/fast/events/ios/dom-update-on-keydown-quirk-expected.txt new file mode 100644 index 000000000000..fad26c291f98 --- /dev/null +++ b/LayoutTests/fast/events/ios/dom-update-on-keydown-quirk-expected.txt @@ -0,0 +1,21 @@ +This tests that the value of the field is updated by the time any timer scheduled on keydown, keypress, or keyup fires. To run this test manually, focus the text field and press [. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + + +For keydown: +PASS document.getElementById("input").value is "[" + +For keypress: +PASS document.getElementById("input").value is "[" + +For input: +PASS document.getElementById("input").value is "[" + +For keyup: +PASS document.getElementById("input").value is "[" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/ios/dom-update-on-keydown-quirk.html b/LayoutTests/fast/events/ios/dom-update-on-keydown-quirk.html new file mode 100644 index 000000000000..38e22f78e193 --- /dev/null +++ b/LayoutTests/fast/events/ios/dom-update-on-keydown-quirk.html @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/LayoutTests/fast/events/ios/key-events-control-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-expected.txt similarity index 100% rename from LayoutTests/fast/events/ios/key-events-control-expected.txt rename to LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-expected.txt diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-option-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-option-expected.txt new file mode 100644 index 000000000000..e53e77e7f2a2 --- /dev/null +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-option-expected.txt @@ -0,0 +1,372 @@ +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Control + Option + X. Must be run in WebKitTestRunner. + + +Test Control + Option + a: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: a, code: KeyA, keyIdentifier: , keyCode: 1, charCode: 1, keyCode: 1, which: 1, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + b: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: b, code: KeyB, keyIdentifier: , keyCode: 2, charCode: 2, keyCode: 2, which: 2, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + c: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: c, code: KeyC, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + d: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: d, code: KeyD, keyIdentifier: , keyCode: 4, charCode: 4, keyCode: 4, which: 4, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + f: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: f, code: KeyF, keyIdentifier: , keyCode: 6, charCode: 6, keyCode: 6, which: 6, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + g: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: g, code: KeyG, keyIdentifier: , keyCode: 7, charCode: 7, keyCode: 7, which: 7, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + h: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 8, charCode: 0, keyCode: 8, which: 8, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: h, code: KeyH, keyIdentifier: , keyCode: 8, charCode: 8, keyCode: 8, which: 8, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 8, charCode: 0, keyCode: 8, which: 8, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + j: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: j, code: KeyJ, keyIdentifier: , keyCode: 10, charCode: 10, keyCode: 10, which: 10, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + k: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: k, code: KeyK, keyIdentifier: , keyCode: 11, charCode: 11, keyCode: 11, which: 11, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + l: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: l, code: KeyL, keyIdentifier: , keyCode: 12, charCode: 12, keyCode: 12, which: 12, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + m: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: m, code: KeyM, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + o: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: o, code: KeyO, keyIdentifier: , keyCode: 15, charCode: 15, keyCode: 15, which: 15, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + p: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: p, code: KeyP, keyIdentifier: , keyCode: 16, charCode: 16, keyCode: 16, which: 16, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + q: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: q, code: KeyQ, keyIdentifier: , keyCode: 17, charCode: 17, keyCode: 17, which: 17, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + r: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: r, code: KeyR, keyIdentifier: , keyCode: 18, charCode: 18, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + s: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: s, code: KeyS, keyIdentifier: , keyCode: 19, charCode: 19, keyCode: 19, which: 19, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + t: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: t, code: KeyT, keyIdentifier: , keyCode: 20, charCode: 20, keyCode: 20, which: 20, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + v: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: v, code: KeyV, keyIdentifier: , keyCode: 22, charCode: 22, keyCode: 22, which: 22, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + w: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: w, code: KeyW, keyIdentifier: , keyCode: 23, charCode: 23, keyCode: 23, which: 23, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + x: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: x, code: KeyX, keyIdentifier: , keyCode: 24, charCode: 24, keyCode: 24, which: 24, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + y: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: y, code: KeyY, keyIdentifier: , keyCode: 25, charCode: 25, keyCode: 25, which: 25, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + z: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: z, code: KeyZ, keyIdentifier: , keyCode: 26, charCode: 26, keyCode: 26, which: 26, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 0: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 0, code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 1: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 1, code: Digit1, keyIdentifier: , keyCode: 49, charCode: 49, keyCode: 49, which: 49, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 2: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 2, code: Digit2, keyIdentifier: , keyCode: 50, charCode: 50, keyCode: 50, which: 50, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 3: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 3, code: Digit3, keyIdentifier: , keyCode: 51, charCode: 51, keyCode: 51, which: 51, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 4: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 4, code: Digit4, keyIdentifier: , keyCode: 52, charCode: 52, keyCode: 52, which: 52, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 5: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 5, code: Digit5, keyIdentifier: , keyCode: 53, charCode: 53, keyCode: 53, which: 53, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 6: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 6, code: Digit6, keyIdentifier: , keyCode: 54, charCode: 54, keyCode: 54, which: 54, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 7: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 7, code: Digit7, keyIdentifier: , keyCode: 55, charCode: 55, keyCode: 55, which: 55, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 8: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 8, code: Digit8, keyIdentifier: , keyCode: 56, charCode: 56, keyCode: 56, which: 56, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + 9: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: 9, code: Digit9, keyIdentifier: , keyCode: 57, charCode: 57, keyCode: 57, which: 57, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + -: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: -, code: Minus, keyIdentifier: , keyCode: 31, charCode: 31, keyCode: 31, which: 31, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + =: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: =, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + [: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: [, code: BracketLeft, keyIdentifier: U+005B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: [, code: BracketLeft, keyIdentifier: , keyCode: 27, charCode: 27, keyCode: 27, which: 27, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: [, code: BracketLeft, keyIdentifier: U+005B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + ]: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: ], code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: ], code: BracketRight, keyIdentifier: , keyCode: 29, charCode: 29, keyCode: 29, which: 29, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: ], code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + ;: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: ;, code: Semicolon, keyIdentifier: , keyCode: 59, charCode: 59, keyCode: 59, which: 59, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + ': +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: ', code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + ,: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: ,, code: Comma, keyIdentifier: , keyCode: 44, charCode: 44, keyCode: 44, which: 44, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + .: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: ., code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + +Test Control + Option + /: +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keydown, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keypress, key: /, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0 +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1 + diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-option.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-option.html new file mode 100644 index 000000000000..d1aeaf7ee454 --- /dev/null +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-option.html @@ -0,0 +1,19 @@ + + + + + + + + + +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Control + Option + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-shift-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-shift-expected.txt
    new file mode 100644
    index 000000000000..15986883d9d3
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-shift-expected.txt
    @@ -0,0 +1,372 @@
    +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Control + Shift + X. Must be run in WebKitTestRunner.
    +
    +
    +Test Control + Shift + a:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: A, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: A, code: KeyA, keyIdentifier: , keyCode: 1, charCode: 1, keyCode: 1, which: 1, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + b:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: B, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: B, code: KeyB, keyIdentifier: , keyCode: 2, charCode: 2, keyCode: 2, which: 2, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + c:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: C, code: KeyC, keyIdentifier: U+0043, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: C, code: KeyC, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + d:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: D, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: D, code: KeyD, keyIdentifier: , keyCode: 4, charCode: 4, keyCode: 4, which: 4, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + f:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: F, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: F, code: KeyF, keyIdentifier: , keyCode: 6, charCode: 6, keyCode: 6, which: 6, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + g:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: G, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: G, code: KeyG, keyIdentifier: , keyCode: 7, charCode: 7, keyCode: 7, which: 7, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + h:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: H, code: KeyH, keyIdentifier: U+0048, keyCode: 8, charCode: 0, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: H, code: KeyH, keyIdentifier: , keyCode: 8, charCode: 8, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 8, charCode: 0, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + j:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: J, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: J, code: KeyJ, keyIdentifier: , keyCode: 10, charCode: 10, keyCode: 10, which: 10, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + k:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: K, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: K, code: KeyK, keyIdentifier: , keyCode: 11, charCode: 11, keyCode: 11, which: 11, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + l:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: L, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: L, code: KeyL, keyIdentifier: , keyCode: 12, charCode: 12, keyCode: 12, which: 12, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + m:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: M, code: KeyM, keyIdentifier: U+004D, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: M, code: KeyM, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + o:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: O, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: O, code: KeyO, keyIdentifier: , keyCode: 15, charCode: 15, keyCode: 15, which: 15, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + p:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: P, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: P, code: KeyP, keyIdentifier: , keyCode: 16, charCode: 16, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + q:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Q, code: KeyQ, keyIdentifier: , keyCode: 17, charCode: 17, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + r:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: R, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: R, code: KeyR, keyIdentifier: , keyCode: 18, charCode: 18, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + s:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: S, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: S, code: KeyS, keyIdentifier: , keyCode: 19, charCode: 19, keyCode: 19, which: 19, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + t:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: T, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: T, code: KeyT, keyIdentifier: , keyCode: 20, charCode: 20, keyCode: 20, which: 20, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + v:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: V, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: V, code: KeyV, keyIdentifier: , keyCode: 22, charCode: 22, keyCode: 22, which: 22, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + w:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: W, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: W, code: KeyW, keyIdentifier: , keyCode: 23, charCode: 23, keyCode: 23, which: 23, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + x:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: X, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: X, code: KeyX, keyIdentifier: , keyCode: 24, charCode: 24, keyCode: 24, which: 24, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + y:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Y, code: KeyY, keyIdentifier: , keyCode: 25, charCode: 25, keyCode: 25, which: 25, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + z:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Z, code: KeyZ, keyIdentifier: , keyCode: 26, charCode: 26, keyCode: 26, which: 26, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 0:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ), code: Digit0, keyIdentifier: U+0029, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ), code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 1:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: !, code: Digit1, keyIdentifier: U+0021, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: !, code: Digit1, keyIdentifier: , keyCode: 49, charCode: 49, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 2:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: @, code: Digit2, keyIdentifier: U+0040, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: @, code: Digit2, keyIdentifier: , keyCode: 50, charCode: 50, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 3:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: #, code: Digit3, keyIdentifier: U+0023, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: #, code: Digit3, keyIdentifier: , keyCode: 51, charCode: 51, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 4:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: $, code: Digit4, keyIdentifier: U+0024, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: $, code: Digit4, keyIdentifier: , keyCode: 52, charCode: 52, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 5:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: %, code: Digit5, keyIdentifier: U+0025, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: %, code: Digit5, keyIdentifier: , keyCode: 53, charCode: 53, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 6:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ^, code: Digit6, keyIdentifier: U+005E, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ^, code: Digit6, keyIdentifier: , keyCode: 54, charCode: 54, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 7:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: &, code: Digit7, keyIdentifier: U+0026, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: &, code: Digit7, keyIdentifier: , keyCode: 55, charCode: 55, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 8:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: *, code: Digit8, keyIdentifier: U+002A, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: *, code: Digit8, keyIdentifier: , keyCode: 56, charCode: 56, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + 9:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: (, code: Digit9, keyIdentifier: U+0028, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: (, code: Digit9, keyIdentifier: , keyCode: 57, charCode: 57, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + -:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: _, code: Minus, keyIdentifier: U+005F, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: _, code: Minus, keyIdentifier: , keyCode: 31, charCode: 31, keyCode: 31, which: 31, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + =:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: +, code: Equal, keyIdentifier: U+002B, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: +, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + [:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: {, code: BracketLeft, keyIdentifier: U+007B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: {, code: BracketLeft, keyIdentifier: , keyCode: 27, charCode: 27, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: [, code: BracketLeft, keyIdentifier: U+005B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + ]:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: }, code: BracketRight, keyIdentifier: U+007D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: }, code: BracketRight, keyIdentifier: , keyCode: 29, charCode: 29, keyCode: 29, which: 29, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ], code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + ;:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: :, code: Semicolon, keyIdentifier: U+003A, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: :, code: Semicolon, keyIdentifier: , keyCode: 59, charCode: 59, keyCode: 59, which: 59, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + ':
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ", code: Quote, keyIdentifier: U+0022, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ", code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + ,:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: <, code: Comma, keyIdentifier: U+003C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: <, code: Comma, keyIdentifier: , keyCode: 44, charCode: 44, keyCode: 44, which: 44, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + .:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: >, code: Period, keyIdentifier: U+003E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: >, code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Control + Shift + /:
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ?, code: Slash, keyIdentifier: U+003F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ?, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: true, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-shift.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-shift.html
    new file mode 100644
    index 000000000000..b3f17f598e97
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control-shift.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Control + Shift + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control.html
    new file mode 100644
    index 000000000000..2e57615ad49f
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-control.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Control + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-control-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-control-expected.txt
    new file mode 100644
    index 000000000000..0fed5e7b0b49
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-control-expected.txt
    @@ -0,0 +1,332 @@
    +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + Control + X. Must be run in WebKitTestRunner.
    +
    +
    +Test Command + Control + a:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: a, code: KeyA, keyIdentifier: , keyCode: 1, charCode: 1, keyCode: 1, which: 1, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + b:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: b, code: KeyB, keyIdentifier: , keyCode: 2, charCode: 2, keyCode: 2, which: 2, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + c:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: c, code: KeyC, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + d:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: d, code: KeyD, keyIdentifier: , keyCode: 4, charCode: 4, keyCode: 4, which: 4, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + f:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: f, code: KeyF, keyIdentifier: , keyCode: 6, charCode: 6, keyCode: 6, which: 6, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + g:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: g, code: KeyG, keyIdentifier: , keyCode: 7, charCode: 7, keyCode: 7, which: 7, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + h:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 8, charCode: 0, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: h, code: KeyH, keyIdentifier: , keyCode: 8, charCode: 8, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + j:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: j, code: KeyJ, keyIdentifier: , keyCode: 10, charCode: 10, keyCode: 10, which: 10, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + k:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: k, code: KeyK, keyIdentifier: , keyCode: 11, charCode: 11, keyCode: 11, which: 11, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + l:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: l, code: KeyL, keyIdentifier: , keyCode: 12, charCode: 12, keyCode: 12, which: 12, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + m:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: m, code: KeyM, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + o:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: o, code: KeyO, keyIdentifier: , keyCode: 15, charCode: 15, keyCode: 15, which: 15, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + p:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: p, code: KeyP, keyIdentifier: , keyCode: 16, charCode: 16, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + q:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: q, code: KeyQ, keyIdentifier: , keyCode: 17, charCode: 17, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + r:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: r, code: KeyR, keyIdentifier: , keyCode: 18, charCode: 18, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + s:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: s, code: KeyS, keyIdentifier: , keyCode: 19, charCode: 19, keyCode: 19, which: 19, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + t:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: t, code: KeyT, keyIdentifier: , keyCode: 20, charCode: 20, keyCode: 20, which: 20, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + v:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: v, code: KeyV, keyIdentifier: , keyCode: 22, charCode: 22, keyCode: 22, which: 22, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + w:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: w, code: KeyW, keyIdentifier: , keyCode: 23, charCode: 23, keyCode: 23, which: 23, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + x:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: x, code: KeyX, keyIdentifier: , keyCode: 24, charCode: 24, keyCode: 24, which: 24, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + y:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: y, code: KeyY, keyIdentifier: , keyCode: 25, charCode: 25, keyCode: 25, which: 25, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + z:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: z, code: KeyZ, keyIdentifier: , keyCode: 26, charCode: 26, keyCode: 26, which: 26, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 0:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 0, code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 1:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 1, code: Digit1, keyIdentifier: , keyCode: 49, charCode: 49, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 2:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 2, code: Digit2, keyIdentifier: , keyCode: 50, charCode: 50, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 3:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 3, code: Digit3, keyIdentifier: , keyCode: 51, charCode: 51, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 4:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 4, code: Digit4, keyIdentifier: , keyCode: 52, charCode: 52, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 5:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 5, code: Digit5, keyIdentifier: , keyCode: 53, charCode: 53, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 6:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 6, code: Digit6, keyIdentifier: , keyCode: 54, charCode: 54, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 7:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 7, code: Digit7, keyIdentifier: , keyCode: 55, charCode: 55, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 8:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 8, code: Digit8, keyIdentifier: , keyCode: 56, charCode: 56, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + 9:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: 9, code: Digit9, keyIdentifier: , keyCode: 57, charCode: 57, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + -:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: -, code: Minus, keyIdentifier: , keyCode: 31, charCode: 31, keyCode: 31, which: 31, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + =:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: =, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + [:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: [, code: BracketLeft, keyIdentifier: U+005B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: [, code: BracketLeft, keyIdentifier: , keyCode: 27, charCode: 27, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + ]:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ], code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ], code: BracketRight, keyIdentifier: , keyCode: 29, charCode: 29, keyCode: 29, which: 29, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + ;:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ;, code: Semicolon, keyIdentifier: , keyCode: 59, charCode: 59, keyCode: 59, which: 59, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + ':
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ', code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + ,:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ,, code: Comma, keyIdentifier: , keyCode: 44, charCode: 44, keyCode: 44, which: 44, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + .:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: UIKeyInputEscape, code: Period, keyIdentifier: Unidentified, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: UIKeyInputEscape, code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: UIKeyInputEscape, code: Period, keyIdentifier: Unidentified, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Control + /:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: /, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47, altKey: false, ctrlKey: true, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-control.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-control.html
    new file mode 100644
    index 000000000000..39abe9da7962
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-control.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + Control + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-meta-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-expected.txt
    similarity index 93%
    rename from LayoutTests/fast/events/ios/key-events-meta-expected.txt
    rename to LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-expected.txt
    index f60191a1dc84..77bb522ed1b5 100644
    --- a/LayoutTests/fast/events/ios/key-events-meta-expected.txt
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-expected.txt
    @@ -1,12 +1,6 @@
     This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + X. Must be run in WebKitTestRunner.
     
     
    -Test Command + a:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: a, code: KeyA, keyIdentifier: , keyCode: 97, charCode: 97, keyCode: 97, which: 97, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
     Test Command + b:
     type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
     type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    @@ -146,9 +140,8 @@ type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCo
     
     Test Command + .:
     type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ., code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keydown, key: Escape, code: Escape, keyIdentifier: U+001B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: Escape, code: Escape, keyIdentifier: , keyCode: 27, charCode: 27, keyCode: 27, which: 27, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
     type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
     
     Test Command + /:
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-option-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-option-expected.txt
    new file mode 100644
    index 000000000000..5f85026ee623
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-option-expected.txt
    @@ -0,0 +1,308 @@
    +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + Option + X. Must be run in WebKitTestRunner.
    +
    +
    +Test Command + Option + a:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: å, code: KeyA, keyIdentifier: , keyCode: 229, charCode: 229, keyCode: 229, which: 229, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + b:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∫, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∫, code: KeyB, keyIdentifier: , keyCode: 8747, charCode: 8747, keyCode: 8747, which: 8747, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + c:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ç, code: KeyC, keyIdentifier: , keyCode: 231, charCode: 231, keyCode: 231, which: 231, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + d:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∂, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∂, code: KeyD, keyIdentifier: , keyCode: 8706, charCode: 8706, keyCode: 8706, which: 8706, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + g:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ©, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ©, code: KeyG, keyIdentifier: , keyCode: 169, charCode: 169, keyCode: 169, which: 169, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + h:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ˙, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ˙, code: KeyH, keyIdentifier: , keyCode: 729, charCode: 729, keyCode: 729, which: 729, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + j:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∆, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∆, code: KeyJ, keyIdentifier: , keyCode: 8710, charCode: 8710, keyCode: 8710, which: 8710, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + k:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ˚, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ˚, code: KeyK, keyIdentifier: , keyCode: 730, charCode: 730, keyCode: 730, which: 730, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + l:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¬, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¬, code: KeyL, keyIdentifier: , keyCode: 172, charCode: 172, keyCode: 172, which: 172, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + m:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: µ, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: µ, code: KeyM, keyIdentifier: , keyCode: 181, charCode: 181, keyCode: 181, which: 181, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + o:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ø, code: KeyO, keyIdentifier: , keyCode: 248, charCode: 248, keyCode: 248, which: 248, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + p:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: π, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: π, code: KeyP, keyIdentifier: , keyCode: 960, charCode: 960, keyCode: 960, which: 960, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + q:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: œ, code: KeyQ, keyIdentifier: , keyCode: 339, charCode: 339, keyCode: 339, which: 339, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + s:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ß, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ß, code: KeyS, keyIdentifier: , keyCode: 223, charCode: 223, keyCode: 223, which: 223, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + t:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: †, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: †, code: KeyT, keyIdentifier: , keyCode: 8224, charCode: 8224, keyCode: 8224, which: 8224, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + v:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: √, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: √, code: KeyV, keyIdentifier: , keyCode: 8730, charCode: 8730, keyCode: 8730, which: 8730, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + x:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≈, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≈, code: KeyX, keyIdentifier: , keyCode: 8776, charCode: 8776, keyCode: 8776, which: 8776, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + y:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¥, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¥, code: KeyY, keyIdentifier: , keyCode: 165, charCode: 165, keyCode: 165, which: 165, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + z:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Ω, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: Ω, code: KeyZ, keyIdentifier: , keyCode: 937, charCode: 937, keyCode: 937, which: 937, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 0:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: º, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: º, code: Digit0, keyIdentifier: , keyCode: 186, charCode: 186, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 1:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¡, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¡, code: Digit1, keyIdentifier: , keyCode: 161, charCode: 161, keyCode: 161, which: 161, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 2:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ™, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ™, code: Digit2, keyIdentifier: , keyCode: 8482, charCode: 8482, keyCode: 8482, which: 8482, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 3:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: £, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: £, code: Digit3, keyIdentifier: , keyCode: 163, charCode: 163, keyCode: 163, which: 163, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 4:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¢, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¢, code: Digit4, keyIdentifier: , keyCode: 162, charCode: 162, keyCode: 162, which: 162, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 5:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∞, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∞, code: Digit5, keyIdentifier: , keyCode: 8734, charCode: 8734, keyCode: 8734, which: 8734, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 6:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: §, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: §, code: Digit6, keyIdentifier: , keyCode: 167, charCode: 167, keyCode: 167, which: 167, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 7:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¶, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¶, code: Digit7, keyIdentifier: , keyCode: 182, charCode: 182, keyCode: 182, which: 182, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 8:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: •, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: •, code: Digit8, keyIdentifier: , keyCode: 8226, charCode: 8226, keyCode: 8226, which: 8226, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + 9:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ª, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ª, code: Digit9, keyIdentifier: , keyCode: 170, charCode: 170, keyCode: 170, which: 170, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + -:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: –, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: –, code: Minus, keyIdentifier: , keyCode: 8211, charCode: 8211, keyCode: 8211, which: 8211, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + =:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≠, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≠, code: Equal, keyIdentifier: , keyCode: 8800, charCode: 8800, keyCode: 8800, which: 8800, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + [:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: “, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: “, code: BracketLeft, keyIdentifier: , keyCode: 8220, charCode: 8220, keyCode: 8220, which: 8220, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + ]:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ‘, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ‘, code: BracketRight, keyIdentifier: , keyCode: 8216, charCode: 8216, keyCode: 8216, which: 8216, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + ;:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: …, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: …, code: Semicolon, keyIdentifier: , keyCode: 8230, charCode: 8230, keyCode: 8230, which: 8230, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + ':
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: æ, code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: æ, code: Quote, keyIdentifier: , keyCode: 230, charCode: 230, keyCode: 230, which: 230, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + ,:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≤, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≤, code: Comma, keyIdentifier: , keyCode: 8804, charCode: 8804, keyCode: 8804, which: 8804, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + .:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≥, code: Period, keyIdentifier: Unidentified, keyCode: 85, charCode: 0, keyCode: 85, which: 85, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≥, code: Period, keyIdentifier: , keyCode: 8805, charCode: 8805, keyCode: 8805, which: 8805, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ≥, code: Period, keyIdentifier: Unidentified, keyCode: 85, charCode: 0, keyCode: 85, which: 85, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Option + /:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ÷, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ÷, code: Slash, keyIdentifier: , keyCode: 247, charCode: 247, keyCode: 247, which: 247, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-option.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-option.html
    new file mode 100644
    index 000000000000..3281bb41738f
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-option.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + Option + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-shift-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-shift-expected.txt
    new file mode 100644
    index 000000000000..201870ecacef
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-shift-expected.txt
    @@ -0,0 +1,331 @@
    +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + Shift + X. Must be run in WebKitTestRunner.
    +
    +
    +Test Command + Shift + a:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: a, code: KeyA, keyIdentifier: , keyCode: 97, charCode: 97, keyCode: 97, which: 97, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + b:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: b, code: KeyB, keyIdentifier: , keyCode: 98, charCode: 98, keyCode: 98, which: 98, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + c:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: c, code: KeyC, keyIdentifier: , keyCode: 99, charCode: 99, keyCode: 99, which: 99, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + d:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: d, code: KeyD, keyIdentifier: , keyCode: 100, charCode: 100, keyCode: 100, which: 100, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + f:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: f, code: KeyF, keyIdentifier: , keyCode: 102, charCode: 102, keyCode: 102, which: 102, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + g:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: g, code: KeyG, keyIdentifier: , keyCode: 103, charCode: 103, keyCode: 103, which: 103, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + h:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: h, code: KeyH, keyIdentifier: , keyCode: 104, charCode: 104, keyCode: 104, which: 104, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + j:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: j, code: KeyJ, keyIdentifier: , keyCode: 106, charCode: 106, keyCode: 106, which: 106, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + k:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: k, code: KeyK, keyIdentifier: , keyCode: 107, charCode: 107, keyCode: 107, which: 107, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + l:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: l, code: KeyL, keyIdentifier: , keyCode: 108, charCode: 108, keyCode: 108, which: 108, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + m:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: m, code: KeyM, keyIdentifier: , keyCode: 109, charCode: 109, keyCode: 109, which: 109, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + o:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: o, code: KeyO, keyIdentifier: , keyCode: 111, charCode: 111, keyCode: 111, which: 111, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + p:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: p, code: KeyP, keyIdentifier: , keyCode: 112, charCode: 112, keyCode: 112, which: 112, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + q:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: q, code: KeyQ, keyIdentifier: , keyCode: 113, charCode: 113, keyCode: 113, which: 113, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + r:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: r, code: KeyR, keyIdentifier: , keyCode: 114, charCode: 114, keyCode: 114, which: 114, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + s:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: s, code: KeyS, keyIdentifier: , keyCode: 115, charCode: 115, keyCode: 115, which: 115, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + t:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: t, code: KeyT, keyIdentifier: , keyCode: 116, charCode: 116, keyCode: 116, which: 116, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + v:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: v, code: KeyV, keyIdentifier: , keyCode: 118, charCode: 118, keyCode: 118, which: 118, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + w:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: w, code: KeyW, keyIdentifier: , keyCode: 119, charCode: 119, keyCode: 119, which: 119, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + x:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: x, code: KeyX, keyIdentifier: , keyCode: 120, charCode: 120, keyCode: 120, which: 120, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + y:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: y, code: KeyY, keyIdentifier: , keyCode: 121, charCode: 121, keyCode: 121, which: 121, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + z:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 0:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 0, code: Digit0, keyIdentifier: U+0029, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 0, code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 1:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 1, code: Digit1, keyIdentifier: U+0021, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 1, code: Digit1, keyIdentifier: , keyCode: 49, charCode: 49, keyCode: 49, which: 49, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 2:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 2, code: Digit2, keyIdentifier: U+0040, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 2, code: Digit2, keyIdentifier: , keyCode: 50, charCode: 50, keyCode: 50, which: 50, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 3:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 3, code: Digit3, keyIdentifier: U+0023, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 3, code: Digit3, keyIdentifier: , keyCode: 51, charCode: 51, keyCode: 51, which: 51, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 4:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 4, code: Digit4, keyIdentifier: U+0024, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 4, code: Digit4, keyIdentifier: , keyCode: 52, charCode: 52, keyCode: 52, which: 52, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 5:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 5, code: Digit5, keyIdentifier: U+0025, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 5, code: Digit5, keyIdentifier: , keyCode: 53, charCode: 53, keyCode: 53, which: 53, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 6:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 6, code: Digit6, keyIdentifier: U+005E, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 6, code: Digit6, keyIdentifier: , keyCode: 54, charCode: 54, keyCode: 54, which: 54, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 7:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 7, code: Digit7, keyIdentifier: U+0026, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 7, code: Digit7, keyIdentifier: , keyCode: 55, charCode: 55, keyCode: 55, which: 55, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 8:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 8, code: Digit8, keyIdentifier: U+002A, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 8, code: Digit8, keyIdentifier: , keyCode: 56, charCode: 56, keyCode: 56, which: 56, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + 9:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: 9, code: Digit9, keyIdentifier: U+0028, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: 9, code: Digit9, keyIdentifier: , keyCode: 57, charCode: 57, keyCode: 57, which: 57, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + -:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: -, code: Minus, keyIdentifier: U+005F, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: -, code: Minus, keyIdentifier: , keyCode: 45, charCode: 45, keyCode: 45, which: 45, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + =:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: =, code: Equal, keyIdentifier: U+002B, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: =, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + [:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: [, code: BracketLeft, keyIdentifier: U+007B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: [, code: BracketLeft, keyIdentifier: , keyCode: 91, charCode: 91, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + ]:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ], code: BracketRight, keyIdentifier: U+007D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ], code: BracketRight, keyIdentifier: , keyCode: 93, charCode: 93, keyCode: 93, which: 93, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + ;:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ;, code: Semicolon, keyIdentifier: U+003A, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ;, code: Semicolon, keyIdentifier: , keyCode: 59, charCode: 59, keyCode: 59, which: 59, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + ':
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ', code: Quote, keyIdentifier: U+0022, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ', code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + ,:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ,, code: Comma, keyIdentifier: U+003C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ,, code: Comma, keyIdentifier: , keyCode: 44, charCode: 44, keyCode: 44, which: 44, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + .:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ., code: Period, keyIdentifier: U+003E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ., code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ., code: Period, keyIdentifier: Unidentified, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Command + Shift + /:
    +type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: /, code: Slash, keyIdentifier: U+003F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: /, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47, altKey: false, ctrlKey: false, metaKey: true, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-shift.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-shift.html
    new file mode 100644
    index 000000000000..aa3aa4678c41
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta-shift.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + Shift + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta.html
    new file mode 100644
    index 000000000000..11a49dbcdc7d
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-meta.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-expected.txt
    new file mode 100644
    index 000000000000..fd816f38988a
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-expected.txt
    @@ -0,0 +1,290 @@
    +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Option + X. Must be run in WebKitTestRunner.
    +
    +
    +Test Option + a:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: å, code: KeyA, keyIdentifier: , keyCode: 229, charCode: 229, keyCode: 229, which: 229, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + b:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∫, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∫, code: KeyB, keyIdentifier: , keyCode: 8747, charCode: 8747, keyCode: 8747, which: 8747, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ∫, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + c:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ç, code: KeyC, keyIdentifier: , keyCode: 231, charCode: 231, keyCode: 231, which: 231, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + d:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∂, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∂, code: KeyD, keyIdentifier: , keyCode: 8706, charCode: 8706, keyCode: 8706, which: 8706, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ∂, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + f:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ƒ, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ƒ, code: KeyF, keyIdentifier: , keyCode: 402, charCode: 402, keyCode: 402, which: 402, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ƒ, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + g:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ©, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ©, code: KeyG, keyIdentifier: , keyCode: 169, charCode: 169, keyCode: 169, which: 169, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ©, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + h:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ˙, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ˙, code: KeyH, keyIdentifier: , keyCode: 729, charCode: 729, keyCode: 729, which: 729, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ˙, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + j:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∆, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∆, code: KeyJ, keyIdentifier: , keyCode: 8710, charCode: 8710, keyCode: 8710, which: 8710, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ∆, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + k:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ˚, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ˚, code: KeyK, keyIdentifier: , keyCode: 730, charCode: 730, keyCode: 730, which: 730, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ˚, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + l:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¬, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¬, code: KeyL, keyIdentifier: , keyCode: 172, charCode: 172, keyCode: 172, which: 172, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ¬, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + m:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: µ, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: µ, code: KeyM, keyIdentifier: , keyCode: 181, charCode: 181, keyCode: 181, which: 181, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: µ, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + o:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ø, code: KeyO, keyIdentifier: , keyCode: 248, charCode: 248, keyCode: 248, which: 248, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + p:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: π, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: π, code: KeyP, keyIdentifier: , keyCode: 960, charCode: 960, keyCode: 960, which: 960, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: π, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + q:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: œ, code: KeyQ, keyIdentifier: , keyCode: 339, charCode: 339, keyCode: 339, which: 339, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + r:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ®, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ®, code: KeyR, keyIdentifier: , keyCode: 174, charCode: 174, keyCode: 174, which: 174, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ®, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + s:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ß, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ß, code: KeyS, keyIdentifier: , keyCode: 223, charCode: 223, keyCode: 223, which: 223, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ß, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + t:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: †, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: †, code: KeyT, keyIdentifier: , keyCode: 8224, charCode: 8224, keyCode: 8224, which: 8224, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: †, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + v:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: √, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: √, code: KeyV, keyIdentifier: , keyCode: 8730, charCode: 8730, keyCode: 8730, which: 8730, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: √, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + w:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∑, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∑, code: KeyW, keyIdentifier: , keyCode: 8721, charCode: 8721, keyCode: 8721, which: 8721, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ∑, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + x:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≈, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≈, code: KeyX, keyIdentifier: , keyCode: 8776, charCode: 8776, keyCode: 8776, which: 8776, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ≈, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + y:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¥, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¥, code: KeyY, keyIdentifier: , keyCode: 165, charCode: 165, keyCode: 165, which: 165, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ¥, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + z:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Ω, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: Ω, code: KeyZ, keyIdentifier: , keyCode: 937, charCode: 937, keyCode: 937, which: 937, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Ω, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 0:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: º, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: º, code: Digit0, keyIdentifier: , keyCode: 186, charCode: 186, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: º, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 1:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¡, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¡, code: Digit1, keyIdentifier: , keyCode: 161, charCode: 161, keyCode: 161, which: 161, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ¡, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 2:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ™, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ™, code: Digit2, keyIdentifier: , keyCode: 8482, charCode: 8482, keyCode: 8482, which: 8482, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ™, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 3:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: £, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: £, code: Digit3, keyIdentifier: , keyCode: 163, charCode: 163, keyCode: 163, which: 163, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: £, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 4:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¢, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¢, code: Digit4, keyIdentifier: , keyCode: 162, charCode: 162, keyCode: 162, which: 162, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ¢, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 5:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ∞, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ∞, code: Digit5, keyIdentifier: , keyCode: 8734, charCode: 8734, keyCode: 8734, which: 8734, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ∞, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 6:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: §, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: §, code: Digit6, keyIdentifier: , keyCode: 167, charCode: 167, keyCode: 167, which: 167, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: §, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 7:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ¶, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ¶, code: Digit7, keyIdentifier: , keyCode: 182, charCode: 182, keyCode: 182, which: 182, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ¶, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 8:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: •, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: •, code: Digit8, keyIdentifier: , keyCode: 8226, charCode: 8226, keyCode: 8226, which: 8226, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: •, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + 9:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ª, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ª, code: Digit9, keyIdentifier: , keyCode: 170, charCode: 170, keyCode: 170, which: 170, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ª, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + -:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: –, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: –, code: Minus, keyIdentifier: , keyCode: 8211, charCode: 8211, keyCode: 8211, which: 8211, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: –, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + =:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≠, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≠, code: Equal, keyIdentifier: , keyCode: 8800, charCode: 8800, keyCode: 8800, which: 8800, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ≠, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + [:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: “, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: “, code: BracketLeft, keyIdentifier: , keyCode: 8220, charCode: 8220, keyCode: 8220, which: 8220, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: “, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + ]:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ‘, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ‘, code: BracketRight, keyIdentifier: , keyCode: 8216, charCode: 8216, keyCode: 8216, which: 8216, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ‘, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + ;:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: …, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: …, code: Semicolon, keyIdentifier: , keyCode: 8230, charCode: 8230, keyCode: 8230, which: 8230, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: …, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + ':
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: æ, code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: æ, code: Quote, keyIdentifier: , keyCode: 230, charCode: 230, keyCode: 230, which: 230, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: æ, code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + ,:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≤, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≤, code: Comma, keyIdentifier: , keyCode: 8804, charCode: 8804, keyCode: 8804, which: 8804, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ≤, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + .:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ≥, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ≥, code: Period, keyIdentifier: , keyCode: 8805, charCode: 8805, keyCode: 8805, which: 8805, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ≥, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + /:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: ÷, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keypress, key: ÷, code: Slash, keyIdentifier: , keyCode: 247, charCode: 247, keyCode: 247, which: 247, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: ÷, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-shift-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-shift-expected.txt
    new file mode 100644
    index 000000000000..f8a30d43e34a
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-shift-expected.txt
    @@ -0,0 +1,372 @@
    +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Option + Shift + X. Must be run in WebKitTestRunner.
    +
    +
    +Test Option + Shift + a:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Å, code: KeyA, keyIdentifier: , keyCode: 197, charCode: 197, keyCode: 197, which: 197, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + b:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ı, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ı, code: KeyB, keyIdentifier: , keyCode: 305, charCode: 305, keyCode: 305, which: 305, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ı, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + c:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Ç, code: KeyC, keyIdentifier: , keyCode: 199, charCode: 199, keyCode: 199, which: 199, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + d:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Î, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Î, code: KeyD, keyIdentifier: , keyCode: 206, charCode: 206, keyCode: 206, which: 206, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Î, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + f:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Ï, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Ï, code: KeyF, keyIdentifier: , keyCode: 207, charCode: 207, keyCode: 207, which: 207, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Ï, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + g:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ˝, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ˝, code: KeyG, keyIdentifier: , keyCode: 733, charCode: 733, keyCode: 733, which: 733, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ˝, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + h:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Ó, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Ó, code: KeyH, keyIdentifier: , keyCode: 211, charCode: 211, keyCode: 211, which: 211, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Ó, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + j:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Ô, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Ô, code: KeyJ, keyIdentifier: , keyCode: 212, charCode: 212, keyCode: 212, which: 212, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Ô, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + k:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: , code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: , code: KeyK, keyIdentifier: , keyCode: 63743, charCode: 63743, keyCode: 63743, which: 63743, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: , code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + l:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Ò, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Ò, code: KeyL, keyIdentifier: , keyCode: 210, charCode: 210, keyCode: 210, which: 210, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Ò, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + m:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Â, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Â, code: KeyM, keyIdentifier: , keyCode: 194, charCode: 194, keyCode: 194, which: 194, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Â, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + o:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Ø, code: KeyO, keyIdentifier: , keyCode: 216, charCode: 216, keyCode: 216, which: 216, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + p:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ∏, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ∏, code: KeyP, keyIdentifier: , keyCode: 8719, charCode: 8719, keyCode: 8719, which: 8719, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ∏, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + q:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Œ, code: KeyQ, keyIdentifier: , keyCode: 338, charCode: 338, keyCode: 338, which: 338, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + r:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ‰, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ‰, code: KeyR, keyIdentifier: , keyCode: 8240, charCode: 8240, keyCode: 8240, which: 8240, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ‰, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + s:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Í, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Í, code: KeyS, keyIdentifier: , keyCode: 205, charCode: 205, keyCode: 205, which: 205, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Í, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + t:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ˇ, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ˇ, code: KeyT, keyIdentifier: , keyCode: 711, charCode: 711, keyCode: 711, which: 711, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ˇ, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + v:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ◊, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ◊, code: KeyV, keyIdentifier: , keyCode: 9674, charCode: 9674, keyCode: 9674, which: 9674, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ◊, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + w:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: „, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: „, code: KeyW, keyIdentifier: , keyCode: 8222, charCode: 8222, keyCode: 8222, which: 8222, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: „, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + x:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ˛, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ˛, code: KeyX, keyIdentifier: , keyCode: 731, charCode: 731, keyCode: 731, which: 731, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ˛, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + y:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Á, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Á, code: KeyY, keyIdentifier: , keyCode: 193, charCode: 193, keyCode: 193, which: 193, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Á, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + z:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ¸, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ¸, code: KeyZ, keyIdentifier: , keyCode: 184, charCode: 184, keyCode: 184, which: 184, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ¸, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 0:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ‚, code: Digit0, keyIdentifier: U+0029, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ‚, code: Digit0, keyIdentifier: , keyCode: 8218, charCode: 8218, keyCode: 8218, which: 8218, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ‚, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 1:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ⁄, code: Digit1, keyIdentifier: U+0021, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ⁄, code: Digit1, keyIdentifier: , keyCode: 8260, charCode: 8260, keyCode: 8260, which: 8260, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ⁄, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 2:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: €, code: Digit2, keyIdentifier: U+0040, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: €, code: Digit2, keyIdentifier: , keyCode: 8364, charCode: 8364, keyCode: 8364, which: 8364, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: €, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 3:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ‹, code: Digit3, keyIdentifier: U+0023, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ‹, code: Digit3, keyIdentifier: , keyCode: 8249, charCode: 8249, keyCode: 8249, which: 8249, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ‹, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 4:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ›, code: Digit4, keyIdentifier: U+0024, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ›, code: Digit4, keyIdentifier: , keyCode: 8250, charCode: 8250, keyCode: 8250, which: 8250, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ›, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 5:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: fi, code: Digit5, keyIdentifier: U+0025, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: fi, code: Digit5, keyIdentifier: , keyCode: 64257, charCode: 64257, keyCode: 64257, which: 64257, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: fi, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 6:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: fl, code: Digit6, keyIdentifier: U+005E, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: fl, code: Digit6, keyIdentifier: , keyCode: 64258, charCode: 64258, keyCode: 64258, which: 64258, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: fl, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 7:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ‡, code: Digit7, keyIdentifier: U+0026, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ‡, code: Digit7, keyIdentifier: , keyCode: 8225, charCode: 8225, keyCode: 8225, which: 8225, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ‡, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 8:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: °, code: Digit8, keyIdentifier: U+002A, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: °, code: Digit8, keyIdentifier: , keyCode: 176, charCode: 176, keyCode: 176, which: 176, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: °, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + 9:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ·, code: Digit9, keyIdentifier: U+0028, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ·, code: Digit9, keyIdentifier: , keyCode: 183, charCode: 183, keyCode: 183, which: 183, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ·, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + -:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: —, code: Minus, keyIdentifier: U+005F, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: —, code: Minus, keyIdentifier: , keyCode: 8212, charCode: 8212, keyCode: 8212, which: 8212, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: —, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + =:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ±, code: Equal, keyIdentifier: U+002B, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ±, code: Equal, keyIdentifier: , keyCode: 177, charCode: 177, keyCode: 177, which: 177, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ±, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + [:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ”, code: BracketLeft, keyIdentifier: U+007B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ”, code: BracketLeft, keyIdentifier: , keyCode: 8221, charCode: 8221, keyCode: 8221, which: 8221, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ”, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + ]:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ’, code: BracketRight, keyIdentifier: U+007D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ’, code: BracketRight, keyIdentifier: , keyCode: 8217, charCode: 8217, keyCode: 8217, which: 8217, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ’, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + ;:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Ú, code: Semicolon, keyIdentifier: U+003A, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Ú, code: Semicolon, keyIdentifier: , keyCode: 218, charCode: 218, keyCode: 218, which: 218, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Ú, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + ':
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Æ, code: Quote, keyIdentifier: U+0022, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Æ, code: Quote, keyIdentifier: , keyCode: 198, charCode: 198, keyCode: 198, which: 198, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Æ, code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + ,:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ¯, code: Comma, keyIdentifier: U+003C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ¯, code: Comma, keyIdentifier: , keyCode: 175, charCode: 175, keyCode: 175, which: 175, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ¯, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + .:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ˘, code: Period, keyIdentifier: U+003E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ˘, code: Period, keyIdentifier: , keyCode: 728, charCode: 728, keyCode: 728, which: 728, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ˘, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Option + Shift + /:
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ¿, code: Slash, keyIdentifier: U+003F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ¿, code: Slash, keyIdentifier: , keyCode: 191, charCode: 191, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ¿, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-shift.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-shift.html
    new file mode 100644
    index 000000000000..5e7905159c75
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option-shift.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Option + Shift + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option.html
    new file mode 100644
    index 000000000000..05c15c0e04b5
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-option.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Option + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-shift-expected.txt b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-shift-expected.txt
    new file mode 100644
    index 000000000000..c8b55ae02e25
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-shift-expected.txt
    @@ -0,0 +1,290 @@
    +This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Shift + X. Must be run in WebKitTestRunner.
    +
    +
    +Test Shift + a:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: A, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: A, code: KeyA, keyIdentifier: , keyCode: 65, charCode: 65, keyCode: 65, which: 65, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: A, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + b:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: B, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: B, code: KeyB, keyIdentifier: , keyCode: 66, charCode: 66, keyCode: 66, which: 66, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: B, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + c:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: C, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: C, code: KeyC, keyIdentifier: , keyCode: 67, charCode: 67, keyCode: 67, which: 67, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: C, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + d:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: D, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: D, code: KeyD, keyIdentifier: , keyCode: 68, charCode: 68, keyCode: 68, which: 68, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: D, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + f:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: F, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: F, code: KeyF, keyIdentifier: , keyCode: 70, charCode: 70, keyCode: 70, which: 70, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: F, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + g:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: G, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: G, code: KeyG, keyIdentifier: , keyCode: 71, charCode: 71, keyCode: 71, which: 71, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: G, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + h:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: H, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: H, code: KeyH, keyIdentifier: , keyCode: 72, charCode: 72, keyCode: 72, which: 72, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: H, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + j:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: J, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: J, code: KeyJ, keyIdentifier: , keyCode: 74, charCode: 74, keyCode: 74, which: 74, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: J, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + k:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: K, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: K, code: KeyK, keyIdentifier: , keyCode: 75, charCode: 75, keyCode: 75, which: 75, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: K, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + l:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: L, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: L, code: KeyL, keyIdentifier: , keyCode: 76, charCode: 76, keyCode: 76, which: 76, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: L, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + m:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: M, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: M, code: KeyM, keyIdentifier: , keyCode: 77, charCode: 77, keyCode: 77, which: 77, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: M, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + o:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: O, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: O, code: KeyO, keyIdentifier: , keyCode: 79, charCode: 79, keyCode: 79, which: 79, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: O, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + p:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: P, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: P, code: KeyP, keyIdentifier: , keyCode: 80, charCode: 80, keyCode: 80, which: 80, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: P, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + q:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Q, code: KeyQ, keyIdentifier: , keyCode: 81, charCode: 81, keyCode: 81, which: 81, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + r:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: R, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: R, code: KeyR, keyIdentifier: , keyCode: 82, charCode: 82, keyCode: 82, which: 82, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: R, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + s:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: S, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: S, code: KeyS, keyIdentifier: , keyCode: 83, charCode: 83, keyCode: 83, which: 83, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: S, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + t:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: T, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: T, code: KeyT, keyIdentifier: , keyCode: 84, charCode: 84, keyCode: 84, which: 84, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: T, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + v:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: V, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: V, code: KeyV, keyIdentifier: , keyCode: 86, charCode: 86, keyCode: 86, which: 86, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: V, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + w:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: W, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: W, code: KeyW, keyIdentifier: , keyCode: 87, charCode: 87, keyCode: 87, which: 87, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: W, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + x:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: X, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: X, code: KeyX, keyIdentifier: , keyCode: 88, charCode: 88, keyCode: 88, which: 88, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: X, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + y:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Y, code: KeyY, keyIdentifier: , keyCode: 89, charCode: 89, keyCode: 89, which: 89, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + z:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: Z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: Z, code: KeyZ, keyIdentifier: , keyCode: 90, charCode: 90, keyCode: 90, which: 90, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 0:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ), code: Digit0, keyIdentifier: U+0029, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ), code: Digit0, keyIdentifier: , keyCode: 41, charCode: 41, keyCode: 41, which: 41, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ), code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 1:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: !, code: Digit1, keyIdentifier: U+0021, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: !, code: Digit1, keyIdentifier: , keyCode: 33, charCode: 33, keyCode: 33, which: 33, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: !, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 2:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: @, code: Digit2, keyIdentifier: U+0040, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: @, code: Digit2, keyIdentifier: , keyCode: 64, charCode: 64, keyCode: 64, which: 64, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: @, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 3:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: #, code: Digit3, keyIdentifier: U+0023, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: #, code: Digit3, keyIdentifier: , keyCode: 35, charCode: 35, keyCode: 35, which: 35, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: #, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 4:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: $, code: Digit4, keyIdentifier: U+0024, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: $, code: Digit4, keyIdentifier: , keyCode: 36, charCode: 36, keyCode: 36, which: 36, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: $, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 5:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: %, code: Digit5, keyIdentifier: U+0025, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: %, code: Digit5, keyIdentifier: , keyCode: 37, charCode: 37, keyCode: 37, which: 37, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: %, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 6:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ^, code: Digit6, keyIdentifier: U+005E, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ^, code: Digit6, keyIdentifier: , keyCode: 94, charCode: 94, keyCode: 94, which: 94, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ^, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 7:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: &, code: Digit7, keyIdentifier: U+0026, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: &, code: Digit7, keyIdentifier: , keyCode: 38, charCode: 38, keyCode: 38, which: 38, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: &, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 8:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: *, code: Digit8, keyIdentifier: U+002A, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: *, code: Digit8, keyIdentifier: , keyCode: 42, charCode: 42, keyCode: 42, which: 42, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: *, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + 9:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: (, code: Digit9, keyIdentifier: U+0028, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: (, code: Digit9, keyIdentifier: , keyCode: 40, charCode: 40, keyCode: 40, which: 40, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: (, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + -:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: _, code: Minus, keyIdentifier: U+005F, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: _, code: Minus, keyIdentifier: , keyCode: 95, charCode: 95, keyCode: 95, which: 95, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: _, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + =:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: +, code: Equal, keyIdentifier: U+002B, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: +, code: Equal, keyIdentifier: , keyCode: 43, charCode: 43, keyCode: 43, which: 43, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: +, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + [:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: {, code: BracketLeft, keyIdentifier: U+007B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: {, code: BracketLeft, keyIdentifier: , keyCode: 123, charCode: 123, keyCode: 123, which: 123, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: {, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + ]:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: }, code: BracketRight, keyIdentifier: U+007D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: }, code: BracketRight, keyIdentifier: , keyCode: 125, charCode: 125, keyCode: 125, which: 125, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: }, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + ;:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: :, code: Semicolon, keyIdentifier: U+003A, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: :, code: Semicolon, keyIdentifier: , keyCode: 58, charCode: 58, keyCode: 58, which: 58, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: :, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + ':
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ", code: Quote, keyIdentifier: U+0022, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ", code: Quote, keyIdentifier: , keyCode: 34, charCode: 34, keyCode: 34, which: 34, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ", code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + ,:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: <, code: Comma, keyIdentifier: U+003C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: <, code: Comma, keyIdentifier: , keyCode: 60, charCode: 60, keyCode: 60, which: 60, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: <, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + .:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: >, code: Period, keyIdentifier: U+003E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: >, code: Period, keyIdentifier: , keyCode: 62, charCode: 62, keyCode: 62, which: 62, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: >, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    +Test Shift + /:
    +type: keydown, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 1, keyLocation: 1
    +type: keydown, key: ?, code: Slash, keyIdentifier: U+003F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keypress, key: ?, code: Slash, keyIdentifier: , keyCode: 63, charCode: 63, keyCode: 63, which: 63, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: ?, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: false, metaKey: false, shiftKey: true, location: 0, keyLocation: 0
    +type: keyup, key: Shift, code: ShiftLeft, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-shift.html b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-shift.html
    new file mode 100644
    index 000000000000..8bde7cd28d5f
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/key-events-comprehensive/key-events-shift.html
    @@ -0,0 +1,19 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Shift + X. Must be run in WebKitTestRunner.

    +
    
    +
    +
    diff --git a/LayoutTests/fast/events/ios/key-events-control.html b/LayoutTests/fast/events/ios/key-events-control.html
    deleted file mode 100644
    index a94a41a950b9..000000000000
    --- a/LayoutTests/fast/events/ios/key-events-control.html
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Control + X. Must be run in WebKitTestRunner.

    -
    
    -
    -
    diff --git a/LayoutTests/fast/events/ios/key-events-meta-alt-combinations-expected.txt b/LayoutTests/fast/events/ios/key-events-meta-alt-combinations-expected.txt
    deleted file mode 100644
    index 2460208c8694..000000000000
    --- a/LayoutTests/fast/events/ios/key-events-meta-alt-combinations-expected.txt
    +++ /dev/null
    @@ -1,746 +0,0 @@
    -This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + X, Option + X and Command + Option + X. Must be run in WebKitTestRunner.
    -
    -
    -Test Command + a:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + a:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: å, code: KeyA, keyIdentifier: , keyCode: 229, charCode: 229, keyCode: 229, which: 229, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + a:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: å, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: å, code: KeyA, keyIdentifier: , keyCode: 229, charCode: 229, keyCode: 229, which: 229, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + b:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + b:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∫, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∫, code: KeyB, keyIdentifier: , keyCode: 8747, charCode: 8747, keyCode: 8747, which: 8747, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ∫, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + b:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∫, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∫, code: KeyB, keyIdentifier: , keyCode: 8747, charCode: 8747, keyCode: 8747, which: 8747, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + c:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + c:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ç, code: KeyC, keyIdentifier: , keyCode: 231, charCode: 231, keyCode: 231, which: 231, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + c:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ç, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ç, code: KeyC, keyIdentifier: , keyCode: 231, charCode: 231, keyCode: 231, which: 231, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + d:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: d, code: KeyD, keyIdentifier: , keyCode: 100, charCode: 100, keyCode: 100, which: 100, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + d:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∂, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∂, code: KeyD, keyIdentifier: , keyCode: 8706, charCode: 8706, keyCode: 8706, which: 8706, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ∂, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + d:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∂, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∂, code: KeyD, keyIdentifier: , keyCode: 8706, charCode: 8706, keyCode: 8706, which: 8706, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + f:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: f, code: KeyF, keyIdentifier: , keyCode: 102, charCode: 102, keyCode: 102, which: 102, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + f:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ƒ, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ƒ, code: KeyF, keyIdentifier: , keyCode: 402, charCode: 402, keyCode: 402, which: 402, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ƒ, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + g:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: g, code: KeyG, keyIdentifier: , keyCode: 103, charCode: 103, keyCode: 103, which: 103, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + g:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ©, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ©, code: KeyG, keyIdentifier: , keyCode: 169, charCode: 169, keyCode: 169, which: 169, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ©, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + g:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ©, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ©, code: KeyG, keyIdentifier: , keyCode: 169, charCode: 169, keyCode: 169, which: 169, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + h:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: h, code: KeyH, keyIdentifier: , keyCode: 104, charCode: 104, keyCode: 104, which: 104, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + h:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ˙, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ˙, code: KeyH, keyIdentifier: , keyCode: 729, charCode: 729, keyCode: 729, which: 729, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ˙, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + h:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ˙, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ˙, code: KeyH, keyIdentifier: , keyCode: 729, charCode: 729, keyCode: 729, which: 729, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + j:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: j, code: KeyJ, keyIdentifier: , keyCode: 106, charCode: 106, keyCode: 106, which: 106, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + j:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∆, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∆, code: KeyJ, keyIdentifier: , keyCode: 8710, charCode: 8710, keyCode: 8710, which: 8710, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ∆, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + j:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∆, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∆, code: KeyJ, keyIdentifier: , keyCode: 8710, charCode: 8710, keyCode: 8710, which: 8710, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + k:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: k, code: KeyK, keyIdentifier: , keyCode: 107, charCode: 107, keyCode: 107, which: 107, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + k:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ˚, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ˚, code: KeyK, keyIdentifier: , keyCode: 730, charCode: 730, keyCode: 730, which: 730, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ˚, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + k:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ˚, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ˚, code: KeyK, keyIdentifier: , keyCode: 730, charCode: 730, keyCode: 730, which: 730, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + l:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¬, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¬, code: KeyL, keyIdentifier: , keyCode: 172, charCode: 172, keyCode: 172, which: 172, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ¬, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + l:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¬, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¬, code: KeyL, keyIdentifier: , keyCode: 172, charCode: 172, keyCode: 172, which: 172, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + m:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: m, code: KeyM, keyIdentifier: , keyCode: 109, charCode: 109, keyCode: 109, which: 109, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + m:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: µ, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: µ, code: KeyM, keyIdentifier: , keyCode: 181, charCode: 181, keyCode: 181, which: 181, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: µ, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + m:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: µ, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: µ, code: KeyM, keyIdentifier: , keyCode: 181, charCode: 181, keyCode: 181, which: 181, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + o:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: o, code: KeyO, keyIdentifier: , keyCode: 111, charCode: 111, keyCode: 111, which: 111, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + o:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ø, code: KeyO, keyIdentifier: , keyCode: 248, charCode: 248, keyCode: 248, which: 248, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + o:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ø, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ø, code: KeyO, keyIdentifier: , keyCode: 248, charCode: 248, keyCode: 248, which: 248, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + p:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: p, code: KeyP, keyIdentifier: , keyCode: 112, charCode: 112, keyCode: 112, which: 112, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + p:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: π, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: π, code: KeyP, keyIdentifier: , keyCode: 960, charCode: 960, keyCode: 960, which: 960, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: π, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + p:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: π, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: π, code: KeyP, keyIdentifier: , keyCode: 960, charCode: 960, keyCode: 960, which: 960, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + q:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: q, code: KeyQ, keyIdentifier: , keyCode: 113, charCode: 113, keyCode: 113, which: 113, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + q:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: œ, code: KeyQ, keyIdentifier: , keyCode: 339, charCode: 339, keyCode: 339, which: 339, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + q:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: œ, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: œ, code: KeyQ, keyIdentifier: , keyCode: 339, charCode: 339, keyCode: 339, which: 339, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + r:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ®, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ®, code: KeyR, keyIdentifier: , keyCode: 174, charCode: 174, keyCode: 174, which: 174, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ®, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + s:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: s, code: KeyS, keyIdentifier: , keyCode: 115, charCode: 115, keyCode: 115, which: 115, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + s:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ß, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ß, code: KeyS, keyIdentifier: , keyCode: 223, charCode: 223, keyCode: 223, which: 223, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ß, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + s:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ß, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ß, code: KeyS, keyIdentifier: , keyCode: 223, charCode: 223, keyCode: 223, which: 223, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + t:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: †, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: †, code: KeyT, keyIdentifier: , keyCode: 8224, charCode: 8224, keyCode: 8224, which: 8224, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: †, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + t:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: †, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: †, code: KeyT, keyIdentifier: , keyCode: 8224, charCode: 8224, keyCode: 8224, which: 8224, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + v:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + v:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: √, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: √, code: KeyV, keyIdentifier: , keyCode: 8730, charCode: 8730, keyCode: 8730, which: 8730, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: √, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + v:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: √, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: √, code: KeyV, keyIdentifier: , keyCode: 8730, charCode: 8730, keyCode: 8730, which: 8730, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + w:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∑, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∑, code: KeyW, keyIdentifier: , keyCode: 8721, charCode: 8721, keyCode: 8721, which: 8721, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ∑, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + x:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + x:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≈, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≈, code: KeyX, keyIdentifier: , keyCode: 8776, charCode: 8776, keyCode: 8776, which: 8776, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ≈, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + x:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≈, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≈, code: KeyX, keyIdentifier: , keyCode: 8776, charCode: 8776, keyCode: 8776, which: 8776, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + y:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: y, code: KeyY, keyIdentifier: , keyCode: 121, charCode: 121, keyCode: 121, which: 121, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + y:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¥, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¥, code: KeyY, keyIdentifier: , keyCode: 165, charCode: 165, keyCode: 165, which: 165, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ¥, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + y:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¥, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¥, code: KeyY, keyIdentifier: , keyCode: 165, charCode: 165, keyCode: 165, which: 165, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + z:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + z:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Ω, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: Ω, code: KeyZ, keyIdentifier: , keyCode: 937, charCode: 937, keyCode: 937, which: 937, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Ω, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + z:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Ω, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: Ω, code: KeyZ, keyIdentifier: , keyCode: 937, charCode: 937, keyCode: 937, which: 937, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + 0:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: 0, code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 0:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: º, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: º, code: Digit0, keyIdentifier: , keyCode: 186, charCode: 186, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: º, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 0:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: º, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: º, code: Digit0, keyIdentifier: , keyCode: 186, charCode: 186, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 1:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¡, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¡, code: Digit1, keyIdentifier: , keyCode: 161, charCode: 161, keyCode: 161, which: 161, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ¡, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 1:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¡, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¡, code: Digit1, keyIdentifier: , keyCode: 161, charCode: 161, keyCode: 161, which: 161, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 2:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ™, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ™, code: Digit2, keyIdentifier: , keyCode: 8482, charCode: 8482, keyCode: 8482, which: 8482, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ™, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 2:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ™, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ™, code: Digit2, keyIdentifier: , keyCode: 8482, charCode: 8482, keyCode: 8482, which: 8482, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 3:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: £, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: £, code: Digit3, keyIdentifier: , keyCode: 163, charCode: 163, keyCode: 163, which: 163, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: £, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 3:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: £, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: £, code: Digit3, keyIdentifier: , keyCode: 163, charCode: 163, keyCode: 163, which: 163, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 4:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¢, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¢, code: Digit4, keyIdentifier: , keyCode: 162, charCode: 162, keyCode: 162, which: 162, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ¢, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 4:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¢, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¢, code: Digit4, keyIdentifier: , keyCode: 162, charCode: 162, keyCode: 162, which: 162, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 5:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∞, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∞, code: Digit5, keyIdentifier: , keyCode: 8734, charCode: 8734, keyCode: 8734, which: 8734, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ∞, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 5:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ∞, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ∞, code: Digit5, keyIdentifier: , keyCode: 8734, charCode: 8734, keyCode: 8734, which: 8734, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 6:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: §, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: §, code: Digit6, keyIdentifier: , keyCode: 167, charCode: 167, keyCode: 167, which: 167, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: §, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 6:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: §, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: §, code: Digit6, keyIdentifier: , keyCode: 167, charCode: 167, keyCode: 167, which: 167, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 7:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¶, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¶, code: Digit7, keyIdentifier: , keyCode: 182, charCode: 182, keyCode: 182, which: 182, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ¶, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 7:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ¶, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ¶, code: Digit7, keyIdentifier: , keyCode: 182, charCode: 182, keyCode: 182, which: 182, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 8:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: •, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: •, code: Digit8, keyIdentifier: , keyCode: 8226, charCode: 8226, keyCode: 8226, which: 8226, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: •, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 8:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: •, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: •, code: Digit8, keyIdentifier: , keyCode: 8226, charCode: 8226, keyCode: 8226, which: 8226, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + 9:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ª, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ª, code: Digit9, keyIdentifier: , keyCode: 170, charCode: 170, keyCode: 170, which: 170, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ª, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + 9:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ª, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ª, code: Digit9, keyIdentifier: , keyCode: 170, charCode: 170, keyCode: 170, which: 170, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + -:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: -, code: Minus, keyIdentifier: , keyCode: 45, charCode: 45, keyCode: 45, which: 45, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + -:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: –, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: –, code: Minus, keyIdentifier: , keyCode: 8211, charCode: 8211, keyCode: 8211, which: 8211, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: –, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + -:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: –, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: –, code: Minus, keyIdentifier: , keyCode: 8211, charCode: 8211, keyCode: 8211, which: 8211, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + =:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: =, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + =:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≠, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≠, code: Equal, keyIdentifier: , keyCode: 8800, charCode: 8800, keyCode: 8800, which: 8800, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ≠, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + =:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≠, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≠, code: Equal, keyIdentifier: , keyCode: 8800, charCode: 8800, keyCode: 8800, which: 8800, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + [:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: “, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: “, code: BracketLeft, keyIdentifier: , keyCode: 8220, charCode: 8220, keyCode: 8220, which: 8220, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: “, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + [:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: “, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: “, code: BracketLeft, keyIdentifier: , keyCode: 8220, charCode: 8220, keyCode: 8220, which: 8220, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + ]:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ‘, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ‘, code: BracketRight, keyIdentifier: , keyCode: 8216, charCode: 8216, keyCode: 8216, which: 8216, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ‘, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + ]:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ‘, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ‘, code: BracketRight, keyIdentifier: , keyCode: 8216, charCode: 8216, keyCode: 8216, which: 8216, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + ;:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ;, code: Semicolon, keyIdentifier: , keyCode: 59, charCode: 59, keyCode: 59, which: 59, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + ;:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: …, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: …, code: Semicolon, keyIdentifier: , keyCode: 8230, charCode: 8230, keyCode: 8230, which: 8230, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: …, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + ;:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: …, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: …, code: Semicolon, keyIdentifier: , keyCode: 8230, charCode: 8230, keyCode: 8230, which: 8230, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + ':
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ', code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + ':
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: æ, code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: æ, code: Quote, keyIdentifier: , keyCode: 230, charCode: 230, keyCode: 230, which: 230, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: æ, code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + ':
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: æ, code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: æ, code: Quote, keyIdentifier: , keyCode: 230, charCode: 230, keyCode: 230, which: 230, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + ,:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ,, code: Comma, keyIdentifier: , keyCode: 44, charCode: 44, keyCode: 44, which: 44, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + ,:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≤, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≤, code: Comma, keyIdentifier: , keyCode: 8804, charCode: 8804, keyCode: 8804, which: 8804, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ≤, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + ,:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≤, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≤, code: Comma, keyIdentifier: , keyCode: 8804, charCode: 8804, keyCode: 8804, which: 8804, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + .:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ., code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + .:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≥, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≥, code: Period, keyIdentifier: , keyCode: 8805, charCode: 8805, keyCode: 8805, which: 8805, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ≥, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + .:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ≥, code: Period, keyIdentifier: Unidentified, keyCode: 85, charCode: 0, keyCode: 85, which: 85, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ≥, code: Period, keyIdentifier: , keyCode: 8805, charCode: 8805, keyCode: 8805, which: 8805, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ≥, code: Period, keyIdentifier: Unidentified, keyCode: 85, charCode: 0, keyCode: 85, which: 85, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + /:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: /, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Option + /:
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ÷, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ÷, code: Slash, keyIdentifier: , keyCode: 247, charCode: 247, keyCode: 247, which: 247, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: ÷, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    -Test Command + Option + /:
    -type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keydown, key: ÷, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keypress, key: ÷, code: Slash, keyIdentifier: , keyCode: 247, charCode: 247, keyCode: 247, which: 247, altKey: true, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
    -type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
    -
    diff --git a/LayoutTests/fast/events/ios/key-events-meta-alt-combinations.html b/LayoutTests/fast/events/ios/key-events-meta-alt-combinations.html
    deleted file mode 100644
    index f7660ff3eb73..000000000000
    --- a/LayoutTests/fast/events/ios/key-events-meta-alt-combinations.html
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + X, Option + X and Command + Option + X. Must be run in WebKitTestRunner.

    -
    
    -
    -
    diff --git a/LayoutTests/fast/events/ios/key-events-meta.html b/LayoutTests/fast/events/ios/key-events-meta.html
    deleted file mode 100644
    index a85bea63b970..000000000000
    --- a/LayoutTests/fast/events/ios/key-events-meta.html
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + X. Must be run in WebKitTestRunner.

    -
    
    -
    -
    diff --git a/LayoutTests/fast/events/ios/keyboard-event-key-attribute.html b/LayoutTests/fast/events/ios/keyboard-event-key-attribute.html
    index 7c1a2fcff2e3..58750afe6d58 100644
    --- a/LayoutTests/fast/events/ios/keyboard-event-key-attribute.html
    +++ b/LayoutTests/fast/events/ios/keyboard-event-key-attribute.html
    @@ -30,6 +30,9 @@
     var i = 0;
     var testInput = document.getElementById("testInput");
     testInput.onkeydown = function(e) {
    +    // Ignore the Shift key so as to normalize the test results across different iOS versions.
    +    if (e.key == "Shift")
    +        return;
         event = e;
         shouldBeEqualToString("event.key", "" + tests[i][0]);
         shouldBeEqualToString("event.code", "" + tests[i][1]);
    diff --git a/LayoutTests/fast/events/ios/keydown-keyup-keypress-keys-in-non-editable-using-chinese-keyboard-expected.txt b/LayoutTests/fast/events/ios/keydown-keyup-keypress-keys-in-non-editable-using-chinese-keyboard-expected.txt
    new file mode 100644
    index 000000000000..3188cd4cf717
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/keydown-keyup-keypress-keys-in-non-editable-using-chinese-keyboard-expected.txt
    @@ -0,0 +1,138 @@
    +This tests that DOM keydown, keyup, and keypress events are dispatched to a non-editable  on iOS using a Chinese keyboard.
    +
    +type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65
    +type: keypress, key: a, code: KeyA, keyIdentifier: , keyCode: 97, charCode: 97, keyCode: 97, which: 97
    +type: keyup, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65
    +type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66
    +type: keypress, key: b, code: KeyB, keyIdentifier: , keyCode: 98, charCode: 98, keyCode: 98, which: 98
    +type: keyup, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66
    +type: keydown, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67
    +type: keypress, key: c, code: KeyC, keyIdentifier: , keyCode: 99, charCode: 99, keyCode: 99, which: 99
    +type: keyup, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67
    +type: keydown, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68
    +type: keypress, key: d, code: KeyD, keyIdentifier: , keyCode: 100, charCode: 100, keyCode: 100, which: 100
    +type: keyup, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68
    +type: keydown, key: e, code: KeyE, keyIdentifier: U+0045, keyCode: 69, charCode: 0, keyCode: 69, which: 69
    +type: keypress, key: e, code: KeyE, keyIdentifier: , keyCode: 101, charCode: 101, keyCode: 101, which: 101
    +type: keyup, key: e, code: KeyE, keyIdentifier: U+0045, keyCode: 69, charCode: 0, keyCode: 69, which: 69
    +type: keydown, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70
    +type: keypress, key: f, code: KeyF, keyIdentifier: , keyCode: 102, charCode: 102, keyCode: 102, which: 102
    +type: keyup, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70
    +type: keydown, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71
    +type: keypress, key: g, code: KeyG, keyIdentifier: , keyCode: 103, charCode: 103, keyCode: 103, which: 103
    +type: keyup, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71
    +type: keydown, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72
    +type: keypress, key: h, code: KeyH, keyIdentifier: , keyCode: 104, charCode: 104, keyCode: 104, which: 104
    +type: keyup, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72
    +type: keydown, key: i, code: KeyI, keyIdentifier: U+0049, keyCode: 73, charCode: 0, keyCode: 73, which: 73
    +type: keypress, key: i, code: KeyI, keyIdentifier: , keyCode: 105, charCode: 105, keyCode: 105, which: 105
    +type: keyup, key: i, code: KeyI, keyIdentifier: U+0049, keyCode: 73, charCode: 0, keyCode: 73, which: 73
    +type: keydown, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74
    +type: keypress, key: j, code: KeyJ, keyIdentifier: , keyCode: 106, charCode: 106, keyCode: 106, which: 106
    +type: keyup, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74
    +type: keydown, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75
    +type: keypress, key: k, code: KeyK, keyIdentifier: , keyCode: 107, charCode: 107, keyCode: 107, which: 107
    +type: keyup, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75
    +type: keydown, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76
    +type: keypress, key: l, code: KeyL, keyIdentifier: , keyCode: 108, charCode: 108, keyCode: 108, which: 108
    +type: keyup, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76
    +type: keydown, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77
    +type: keypress, key: m, code: KeyM, keyIdentifier: , keyCode: 109, charCode: 109, keyCode: 109, which: 109
    +type: keyup, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77
    +type: keydown, key: n, code: KeyN, keyIdentifier: U+004E, keyCode: 78, charCode: 0, keyCode: 78, which: 78
    +type: keypress, key: n, code: KeyN, keyIdentifier: , keyCode: 110, charCode: 110, keyCode: 110, which: 110
    +type: keyup, key: n, code: KeyN, keyIdentifier: U+004E, keyCode: 78, charCode: 0, keyCode: 78, which: 78
    +type: keydown, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79
    +type: keypress, key: o, code: KeyO, keyIdentifier: , keyCode: 111, charCode: 111, keyCode: 111, which: 111
    +type: keyup, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79
    +type: keydown, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80
    +type: keypress, key: p, code: KeyP, keyIdentifier: , keyCode: 112, charCode: 112, keyCode: 112, which: 112
    +type: keyup, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80
    +type: keydown, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81
    +type: keypress, key: q, code: KeyQ, keyIdentifier: , keyCode: 113, charCode: 113, keyCode: 113, which: 113
    +type: keyup, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81
    +type: keydown, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82
    +type: keypress, key: r, code: KeyR, keyIdentifier: , keyCode: 114, charCode: 114, keyCode: 114, which: 114
    +type: keyup, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82
    +type: keydown, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83
    +type: keypress, key: s, code: KeyS, keyIdentifier: , keyCode: 115, charCode: 115, keyCode: 115, which: 115
    +type: keyup, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83
    +type: keydown, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84
    +type: keypress, key: t, code: KeyT, keyIdentifier: , keyCode: 116, charCode: 116, keyCode: 116, which: 116
    +type: keyup, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84
    +type: keydown, key: u, code: KeyU, keyIdentifier: U+0055, keyCode: 85, charCode: 0, keyCode: 85, which: 85
    +type: keypress, key: u, code: KeyU, keyIdentifier: , keyCode: 117, charCode: 117, keyCode: 117, which: 117
    +type: keyup, key: u, code: KeyU, keyIdentifier: U+0055, keyCode: 85, charCode: 0, keyCode: 85, which: 85
    +type: keydown, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86
    +type: keypress, key: v, code: KeyV, keyIdentifier: , keyCode: 118, charCode: 118, keyCode: 118, which: 118
    +type: keyup, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86
    +type: keydown, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87
    +type: keypress, key: w, code: KeyW, keyIdentifier: , keyCode: 119, charCode: 119, keyCode: 119, which: 119
    +type: keyup, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87
    +type: keydown, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88
    +type: keypress, key: x, code: KeyX, keyIdentifier: , keyCode: 120, charCode: 120, keyCode: 120, which: 120
    +type: keyup, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88
    +type: keydown, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89
    +type: keypress, key: y, code: KeyY, keyIdentifier: , keyCode: 121, charCode: 121, keyCode: 121, which: 121
    +type: keyup, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89
    +type: keydown, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90
    +type: keypress, key: z, code: KeyZ, keyIdentifier: , keyCode: 122, charCode: 122, keyCode: 122, which: 122
    +type: keyup, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90
    +type: keydown, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48
    +type: keypress, key: 0, code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48
    +type: keyup, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48
    +type: keydown, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49
    +type: keypress, key: 1, code: Digit1, keyIdentifier: , keyCode: 49, charCode: 49, keyCode: 49, which: 49
    +type: keyup, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49
    +type: keydown, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50
    +type: keypress, key: 2, code: Digit2, keyIdentifier: , keyCode: 50, charCode: 50, keyCode: 50, which: 50
    +type: keyup, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50
    +type: keydown, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51
    +type: keypress, key: 3, code: Digit3, keyIdentifier: , keyCode: 51, charCode: 51, keyCode: 51, which: 51
    +type: keyup, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51
    +type: keydown, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52
    +type: keypress, key: 4, code: Digit4, keyIdentifier: , keyCode: 52, charCode: 52, keyCode: 52, which: 52
    +type: keyup, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52
    +type: keydown, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53
    +type: keypress, key: 5, code: Digit5, keyIdentifier: , keyCode: 53, charCode: 53, keyCode: 53, which: 53
    +type: keyup, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53
    +type: keydown, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54
    +type: keypress, key: 6, code: Digit6, keyIdentifier: , keyCode: 54, charCode: 54, keyCode: 54, which: 54
    +type: keyup, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54
    +type: keydown, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55
    +type: keypress, key: 7, code: Digit7, keyIdentifier: , keyCode: 55, charCode: 55, keyCode: 55, which: 55
    +type: keyup, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55
    +type: keydown, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56
    +type: keypress, key: 8, code: Digit8, keyIdentifier: , keyCode: 56, charCode: 56, keyCode: 56, which: 56
    +type: keyup, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56
    +type: keydown, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57
    +type: keypress, key: 9, code: Digit9, keyIdentifier: , keyCode: 57, charCode: 57, keyCode: 57, which: 57
    +type: keyup, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57
    +type: keydown, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189
    +type: keypress, key: -, code: Minus, keyIdentifier: , keyCode: 45, charCode: 45, keyCode: 45, which: 45
    +type: keyup, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189
    +type: keydown, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187
    +type: keypress, key: =, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61
    +type: keyup, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187
    +type: keydown, key: 【, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219
    +type: keypress, key: 【, code: BracketLeft, keyIdentifier: , keyCode: 12304, charCode: 12304, keyCode: 12304, which: 12304
    +type: keyup, key: 【, code: BracketLeft, keyIdentifier: U+005B, keyCode: 219, charCode: 0, keyCode: 219, which: 219
    +type: keydown, key: 】, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221
    +type: keypress, key: 】, code: BracketRight, keyIdentifier: , keyCode: 12305, charCode: 12305, keyCode: 12305, which: 12305
    +type: keyup, key: 】, code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221
    +type: keydown, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186
    +type: keypress, key: ;, code: Semicolon, keyIdentifier: , keyCode: 65307, charCode: 65307, keyCode: 65307, which: 65307
    +type: keyup, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186
    +type: keydown, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222
    +type: keypress, key: ', code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39
    +type: keyup, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222
    +type: keydown, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188
    +type: keypress, key: ,, code: Comma, keyIdentifier: , keyCode: 65292, charCode: 65292, keyCode: 65292, which: 65292
    +type: keyup, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188
    +type: keydown, key: 。, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190
    +type: keypress, key: 。, code: Period, keyIdentifier: , keyCode: 12290, charCode: 12290, keyCode: 12290, which: 12290
    +type: keyup, key: 。, code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190
    +type: keydown, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191
    +type: keypress, key: /, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47
    +type: keyup, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191
    +
    diff --git a/LayoutTests/fast/events/ios/keydown-keyup-keypress-keys-in-non-editable-using-chinese-keyboard.html b/LayoutTests/fast/events/ios/keydown-keyup-keypress-keys-in-non-editable-using-chinese-keyboard.html
    new file mode 100644
    index 000000000000..3b2ceccaf50d
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/keydown-keyup-keypress-keys-in-non-editable-using-chinese-keyboard.html
    @@ -0,0 +1,74 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This tests that DOM keydown, keyup, and keypress events are dispatched to a non-editable <body> on iOS using a Chinese keyboard.

    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt b/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt
    index 816d706a239b..bfbdd8534695 100644
    --- a/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt
    +++ b/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt
    @@ -1,7 +1,7 @@
     This tests that DOM keydown and keyup events are dispatched to a non-editable  on iOS when pressing special keys on a hardware keyboard. To run this test manually, verify that two messages are emitted when you press the following keys: Tab, ↑, ↓, ←, →, Delete, End, Enter, Escape, Home, left Alt, left ⌘ Command, left Ctrl, left ⇧ Shift, Page Down, Page Up, Return, right Alt, right ⌘ Command, right Ctrl, right ⇧ Shift, Numpad ,, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16.
     
     type: keydown, key: Tab, code: Tab, keyIdentifier: U+0009, keyCode: 9, charCode: 0, keyCode: 9, which: 9
    -type: keyup, key: Dead, code: Tab, keyIdentifier: Unidentified, keyCode: 9, charCode: 0, keyCode: 9, which: 9
    +type: keyup, key: Tab, code: Tab, keyIdentifier: U+0009, keyCode: 9, charCode: 0, keyCode: 9, which: 9
     type: keydown, key: ArrowUp, code: ArrowUp, keyIdentifier: Up, keyCode: 38, charCode: 0, keyCode: 38, which: 38
     type: keyup, key: ArrowUp, code: ArrowUp, keyIdentifier: Up, keyCode: 38, charCode: 0, keyCode: 38, which: 38
     type: keydown, key: ArrowDown, code: ArrowDown, keyIdentifier: Down, keyCode: 40, charCode: 0, keyCode: 40, which: 40
    @@ -11,19 +11,17 @@ type: keyup, key: ArrowLeft, code: ArrowLeft, keyIdentifier: Left, keyCode: 37,
     type: keydown, key: ArrowRight, code: ArrowRight, keyIdentifier: Right, keyCode: 39, charCode: 0, keyCode: 39, which: 39
     type: keyup, key: ArrowRight, code: ArrowRight, keyIdentifier: Right, keyCode: 39, charCode: 0, keyCode: 39, which: 39
     type: keydown, key: Backspace, code: Backspace, keyIdentifier: U+0008, keyCode: 8, charCode: 0, keyCode: 8, which: 8
    -type: keyup, key: Dead, code: Backspace, keyIdentifier: Unidentified, keyCode: 8, charCode: 0, keyCode: 8, which: 8
    -type: keydown, key: , code: End, keyIdentifier: U+0004, keyCode: 35, charCode: 0, keyCode: 35, which: 35
    -type: keyup, key: Dead, code: End, keyIdentifier: Unidentified, keyCode: 35, charCode: 0, keyCode: 35, which: 35
    +type: keyup, key: Backspace, code: Backspace, keyIdentifier: U+0008, keyCode: 8, charCode: 0, keyCode: 8, which: 8
    +type: keydown, key: End, code: End, keyIdentifier: End, keyCode: 35, charCode: 0, keyCode: 35, which: 35
    +type: keyup, key: End, code: End, keyIdentifier: End, keyCode: 35, charCode: 0, keyCode: 35, which: 35
     type: keydown, key: Enter, code: Enter, keyIdentifier: Enter, keyCode: 13, charCode: 0, keyCode: 13, which: 13
    -type: keyup, key: Dead, code: Enter, keyIdentifier: Unidentified, keyCode: 13, charCode: 0, keyCode: 13, which: 13
    +type: keyup, key: Enter, code: Enter, keyIdentifier: Enter, keyCode: 13, charCode: 0, keyCode: 13, which: 13
     type: keydown, key: Escape, code: Escape, keyIdentifier: U+001B, keyCode: 27, charCode: 0, keyCode: 27, which: 27
     type: keyup, key: Escape, code: Escape, keyIdentifier: U+001B, keyCode: 27, charCode: 0, keyCode: 27, which: 27
    -type: keydown, key: , code: Home, keyIdentifier: U+0001, keyCode: 36, charCode: 0, keyCode: 36, which: 36
    -type: keyup, key: Dead, code: Home, keyIdentifier: Unidentified, keyCode: 36, charCode: 0, keyCode: 36, which: 36
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 45, charCode: 0, keyCode: 45, which: 45
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 45, charCode: 0, keyCode: 45, which: 45
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
    +type: keydown, key: Home, code: Home, keyIdentifier: Home, keyCode: 36, charCode: 0, keyCode: 36, which: 36
    +type: keyup, key: Home, code: Home, keyIdentifier: Home, keyCode: 36, charCode: 0, keyCode: 36, which: 36
    +type: keydown, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
    +type: keyup, key: Alt, code: AltLeft, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
     type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91
     type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91
     type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17
    @@ -35,9 +33,9 @@ type: keyup, key: PageDown, code: PageDown, keyIdentifier: PageDown, keyCode: 34
     type: keydown, key: PageUp, code: PageUp, keyIdentifier: PageUp, keyCode: 33, charCode: 0, keyCode: 33, which: 33
     type: keyup, key: PageUp, code: PageUp, keyIdentifier: PageUp, keyCode: 33, charCode: 0, keyCode: 33, which: 33
     type: keydown, key: Enter, code: Enter, keyIdentifier: Enter, keyCode: 13, charCode: 0, keyCode: 13, which: 13
    -type: keyup, key: Dead, code: Enter, keyIdentifier: Unidentified, keyCode: 13, charCode: 0, keyCode: 13, which: 13
    -type: keydown, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
    -type: keyup, key: Alt, code: Unidentified, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
    +type: keyup, key: Enter, code: Enter, keyIdentifier: Enter, keyCode: 13, charCode: 0, keyCode: 13, which: 13
    +type: keydown, key: Alt, code: AltRight, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
    +type: keyup, key: Alt, code: AltRight, keyIdentifier: Alt, keyCode: 18, charCode: 0, keyCode: 18, which: 18
     type: keydown, key: Meta, code: MetaRight, keyIdentifier: Meta, keyCode: 93, charCode: 0, keyCode: 93, which: 93
     type: keyup, key: Meta, code: MetaRight, keyIdentifier: Meta, keyCode: 93, charCode: 0, keyCode: 93, which: 93
     type: keydown, key: Control, code: ControlRight, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17
    @@ -45,53 +43,37 @@ type: keyup, key: Control, code: ControlRight, keyIdentifier: Control, keyCode:
     type: keydown, key: Shift, code: ShiftRight, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16
     type: keyup, key: Shift, code: ShiftRight, keyIdentifier: Shift, keyCode: 16, charCode: 0, keyCode: 16, which: 16
     type: keydown, key: ,, code: NumpadComma, keyIdentifier: U+002C, keyCode: 108, charCode: 0, keyCode: 108, which: 108
    -type: keyup, key: Dead, code: NumpadComma, keyIdentifier: Unidentified, keyCode: 108, charCode: 0, keyCode: 108, which: 108
    -type: keydown, key: , code: F1, keyIdentifier: U+0010, keyCode: 112, charCode: 0, keyCode: 112, which: 112
    -type: keyup, key: Dead, code: F1, keyIdentifier: Unidentified, keyCode: 112, charCode: 0, keyCode: 112, which: 112
    -type: keydown, key: , code: F2, keyIdentifier: U+0010, keyCode: 113, charCode: 0, keyCode: 113, which: 113
    -type: keyup, key: Dead, code: F2, keyIdentifier: Unidentified, keyCode: 113, charCode: 0, keyCode: 113, which: 113
    -type: keydown, key: , code: F3, keyIdentifier: U+0010, keyCode: 114, charCode: 0, keyCode: 114, which: 114
    -type: keyup, key: Dead, code: F3, keyIdentifier: Unidentified, keyCode: 114, charCode: 0, keyCode: 114, which: 114
    -type: keydown, key: , code: F4, keyIdentifier: U+0010, keyCode: 115, charCode: 0, keyCode: 115, which: 115
    -type: keyup, key: Dead, code: F4, keyIdentifier: Unidentified, keyCode: 115, charCode: 0, keyCode: 115, which: 115
    -type: keydown, key: , code: F5, keyIdentifier: U+0010, keyCode: 116, charCode: 0, keyCode: 116, which: 116
    -type: keyup, key: Dead, code: F5, keyIdentifier: Unidentified, keyCode: 116, charCode: 0, keyCode: 116, which: 116
    -type: keydown, key: , code: F6, keyIdentifier: U+0010, keyCode: 117, charCode: 0, keyCode: 117, which: 117
    -type: keyup, key: Dead, code: F6, keyIdentifier: Unidentified, keyCode: 117, charCode: 0, keyCode: 117, which: 117
    -type: keydown, key: , code: F7, keyIdentifier: U+0010, keyCode: 118, charCode: 0, keyCode: 118, which: 118
    -type: keyup, key: Dead, code: F7, keyIdentifier: Unidentified, keyCode: 118, charCode: 0, keyCode: 118, which: 118
    -type: keydown, key: , code: F8, keyIdentifier: U+0010, keyCode: 119, charCode: 0, keyCode: 119, which: 119
    -type: keyup, key: Dead, code: F8, keyIdentifier: Unidentified, keyCode: 119, charCode: 0, keyCode: 119, which: 119
    -type: keydown, key: , code: F9, keyIdentifier: U+0010, keyCode: 120, charCode: 0, keyCode: 120, which: 120
    -type: keyup, key: Dead, code: F9, keyIdentifier: Unidentified, keyCode: 120, charCode: 0, keyCode: 120, which: 120
    -type: keydown, key: , code: F10, keyIdentifier: U+0010, keyCode: 121, charCode: 0, keyCode: 121, which: 121
    -type: keyup, key: Dead, code: F10, keyIdentifier: Unidentified, keyCode: 121, charCode: 0, keyCode: 121, which: 121
    -type: keydown, key: , code: F11, keyIdentifier: U+0010, keyCode: 122, charCode: 0, keyCode: 122, which: 122
    -type: keyup, key: Dead, code: F11, keyIdentifier: Unidentified, keyCode: 122, charCode: 0, keyCode: 122, which: 122
    -type: keydown, key: , code: F12, keyIdentifier: U+0010, keyCode: 123, charCode: 0, keyCode: 123, which: 123
    -type: keyup, key: Dead, code: F12, keyIdentifier: Unidentified, keyCode: 123, charCode: 0, keyCode: 123, which: 123
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 43, charCode: 0, keyCode: 43, which: 43
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 43, charCode: 0, keyCode: 43, which: 43
    -type: keydown, key: , code: Unidentified, keyIdentifier: U+0005, keyCode: 45, charCode: 0, keyCode: 45, which: 45
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 45, charCode: 0, keyCode: 45, which: 45
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 41, charCode: 0, keyCode: 41, which: 41
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 41, charCode: 0, keyCode: 41, which: 41
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
    -type: keydown, key: Dead, code: AudioVolumeMute, keyIdentifier: Unidentified, keyCode: 173, charCode: 0, keyCode: 173, which: 173
    -type: keyup, key: Dead, code: AudioVolumeMute, keyIdentifier: Unidentified, keyCode: 173, charCode: 0, keyCode: 173, which: 173
    +type: keyup, key: ,, code: NumpadComma, keyIdentifier: U+002C, keyCode: 108, charCode: 0, keyCode: 108, which: 108
    +type: keydown, key: F1, code: F1, keyIdentifier: F1, keyCode: 112, charCode: 0, keyCode: 112, which: 112
    +type: keyup, key: F1, code: F1, keyIdentifier: F1, keyCode: 112, charCode: 0, keyCode: 112, which: 112
    +type: keydown, key: F2, code: F2, keyIdentifier: F2, keyCode: 113, charCode: 0, keyCode: 113, which: 113
    +type: keyup, key: F2, code: F2, keyIdentifier: F2, keyCode: 113, charCode: 0, keyCode: 113, which: 113
    +type: keydown, key: F3, code: F3, keyIdentifier: F3, keyCode: 114, charCode: 0, keyCode: 114, which: 114
    +type: keyup, key: F3, code: F3, keyIdentifier: F3, keyCode: 114, charCode: 0, keyCode: 114, which: 114
    +type: keydown, key: F4, code: F4, keyIdentifier: F4, keyCode: 115, charCode: 0, keyCode: 115, which: 115
    +type: keyup, key: F4, code: F4, keyIdentifier: F4, keyCode: 115, charCode: 0, keyCode: 115, which: 115
    +type: keydown, key: F5, code: F5, keyIdentifier: F5, keyCode: 116, charCode: 0, keyCode: 116, which: 116
    +type: keyup, key: F5, code: F5, keyIdentifier: F5, keyCode: 116, charCode: 0, keyCode: 116, which: 116
    +type: keydown, key: F6, code: F6, keyIdentifier: F6, keyCode: 117, charCode: 0, keyCode: 117, which: 117
    +type: keyup, key: F6, code: F6, keyIdentifier: F6, keyCode: 117, charCode: 0, keyCode: 117, which: 117
    +type: keydown, key: F7, code: F7, keyIdentifier: F7, keyCode: 118, charCode: 0, keyCode: 118, which: 118
    +type: keyup, key: F7, code: F7, keyIdentifier: F7, keyCode: 118, charCode: 0, keyCode: 118, which: 118
    +type: keydown, key: F8, code: F8, keyIdentifier: F8, keyCode: 119, charCode: 0, keyCode: 119, which: 119
    +type: keyup, key: F8, code: F8, keyIdentifier: F8, keyCode: 119, charCode: 0, keyCode: 119, which: 119
    +type: keydown, key: F9, code: F9, keyIdentifier: F9, keyCode: 120, charCode: 0, keyCode: 120, which: 120
    +type: keyup, key: F9, code: F9, keyIdentifier: F9, keyCode: 120, charCode: 0, keyCode: 120, which: 120
    +type: keydown, key: F10, code: F10, keyIdentifier: F10, keyCode: 121, charCode: 0, keyCode: 121, which: 121
    +type: keyup, key: F10, code: F10, keyIdentifier: F10, keyCode: 121, charCode: 0, keyCode: 121, which: 121
    +type: keydown, key: F11, code: F11, keyIdentifier: F11, keyCode: 122, charCode: 0, keyCode: 122, which: 122
    +type: keyup, key: F11, code: F11, keyIdentifier: F11, keyCode: 122, charCode: 0, keyCode: 122, which: 122
    +type: keydown, key: F12, code: F12, keyIdentifier: F12, keyCode: 123, charCode: 0, keyCode: 123, which: 123
    +type: keyup, key: F12, code: F12, keyIdentifier: F12, keyCode: 123, charCode: 0, keyCode: 123, which: 123
    +type: keydown, key: F13, code: F13, keyIdentifier: F13, keyCode: 124, charCode: 0, keyCode: 124, which: 124
    +type: keyup, key: F13, code: F13, keyIdentifier: F13, keyCode: 124, charCode: 0, keyCode: 124, which: 124
    +type: keydown, key: F14, code: F14, keyIdentifier: F14, keyCode: 125, charCode: 0, keyCode: 125, which: 125
    +type: keyup, key: F14, code: F14, keyIdentifier: F14, keyCode: 125, charCode: 0, keyCode: 125, which: 125
    +type: keydown, key: F15, code: F15, keyIdentifier: F15, keyCode: 126, charCode: 0, keyCode: 126, which: 126
    +type: keyup, key: F15, code: F15, keyIdentifier: F15, keyCode: 126, charCode: 0, keyCode: 126, which: 126
    +type: keydown, key: F16, code: F16, keyIdentifier: F16, keyCode: 127, charCode: 0, keyCode: 127, which: 127
    +type: keyup, key: F16, code: F16, keyIdentifier: F16, keyCode: 127, charCode: 0, keyCode: 127, which: 127
     
    diff --git a/LayoutTests/fast/events/ios/resources/key-tester.js b/LayoutTests/fast/events/ios/resources/key-tester.js
    index 60dbe9ece7dd..0efd96e459eb 100644
    --- a/LayoutTests/fast/events/ios/resources/key-tester.js
    +++ b/LayoutTests/fast/events/ios/resources/key-tester.js
    @@ -75,6 +75,9 @@ let disallowedKeyCommands = [
         new KeyCommand("]", ["metaKey"]),
         new KeyCommand("r", ["metaKey"]),
         new KeyCommand("r", ["metaKey", "altKey"]),
    +
    +    // FIXME: Command + A cannot be prevented from keypress. See .
    +    new KeyCommand("a", ["metaKey"]),
     ];
     for (let i = 1; i <= 9; ++i)
         disallowedKeyCommands.push(new KeyCommand(i, ["metaKey"]));
    diff --git a/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body-expected.txt b/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body-expected.txt
    index 85c5edbfd2e1..97f2e06bcb1a 100644
    --- a/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body-expected.txt
    +++ b/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body-expected.txt
    @@ -4,11 +4,8 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
     
     
     Before rotation
    -PASS In body's onorientationchange event handler
    -PASS In window's orientationchange event listener
    -PASS In body's onresize event handler
    -PASS In window's resize event listener
     After rotation
    +PASS eventListenerCalls is 4
     PASS successfullyParsed is true
     
     TEST COMPLETE
    diff --git a/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body.html b/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body.html
    index f5b2d66f33e4..1c50c75f691e 100644
    --- a/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body.html
    +++ b/LayoutTests/fast/events/ios/rotation/orientationchange-event-listener-on.body.html
    @@ -30,34 +30,38 @@
     
                 testRunner.runUIScript(getRotationUIScript(), function(result) {
                     debug('After rotation');
    -
    +                shouldBe("eventListenerCalls", "4");
                     finishJSTest();
                 });
             }
    +
    +        eventListenerCalls = 0;
             window.addEventListener('resize', function() {
    -            testPassed("In window's resize event listener");
    +            ++eventListenerCalls;
             }, false);
     
             window.addEventListener('orientationchange', function() {
    -            testPassed("In window's orientationchange event listener");
    +            ++eventListenerCalls;
             }, false);
     
             document.body.addEventListener('resize', function() {
                 testFailed("In body's resize event listener");
    +            ++eventListenerCalls;
             }, false);
     
             document.body.addEventListener('orientationchange', function() {
                 testFailed("In body's orientationchange event listener");
    +            ++eventListenerCalls;
             }, false);
     
             function bodyOrientationChange()
             {
    -            testPassed("In body's onorientationchange event handler");
    +            ++eventListenerCalls;
             }
     
             function bodyResize()
             {
    -            testPassed("In body's onresize event handler");
    +            ++eventListenerCalls;
             }
     
             window.addEventListener('load', doTest, false);
    diff --git a/LayoutTests/fast/events/ios/select-all-with-existing-selection-expected.txt b/LayoutTests/fast/events/ios/select-all-with-existing-selection-expected.txt
    new file mode 100644
    index 000000000000..d5573f148cff
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/select-all-with-existing-selection-expected.txt
    @@ -0,0 +1,11 @@
    +This tests that pressing Command + A selects all the text even when there is an existing range selction. To run this test by hand, press Command + A.
    +
    +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
    +
    +
    +PASS document.getElementById("test").selectionStart is 0
    +PASS document.getElementById("test").selectionEnd is document.getElementById("test").value.length
    +PASS successfullyParsed is true
    +
    +TEST COMPLETE
    +
    diff --git a/LayoutTests/fast/events/ios/select-all-with-existing-selection.html b/LayoutTests/fast/events/ios/select-all-with-existing-selection.html
    new file mode 100644
    index 000000000000..9c0b28e17035
    --- /dev/null
    +++ b/LayoutTests/fast/events/ios/select-all-with-existing-selection.html
    @@ -0,0 +1,47 @@
    +
    +
    +
    +
    +
    +
    +
    +

    +
    + + + + diff --git a/LayoutTests/fast/events/ios/should-be-able-to-dismiss-form-accessory-after-tapping-outside-iframe-with-focused-field-expected.txt b/LayoutTests/fast/events/ios/should-be-able-to-dismiss-form-accessory-after-tapping-outside-iframe-with-focused-field-expected.txt new file mode 100644 index 000000000000..806179fe5457 --- /dev/null +++ b/LayoutTests/fast/events/ios/should-be-able-to-dismiss-form-accessory-after-tapping-outside-iframe-with-focused-field-expected.txt @@ -0,0 +1,13 @@ +This test focuses the text field in the iframe, taps outside the iframe and then presses the Done button. The keyboard should hide. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +dispatched blur to main frame +dispatched focus to +dispatched blur to +PASS dismissed form accessory +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/ios/should-be-able-to-dismiss-form-accessory-after-tapping-outside-iframe-with-focused-field.html b/LayoutTests/fast/events/ios/should-be-able-to-dismiss-form-accessory-after-tapping-outside-iframe-with-focused-field.html new file mode 100644 index 000000000000..9d5d90aec96f --- /dev/null +++ b/LayoutTests/fast/events/ios/should-be-able-to-dismiss-form-accessory-after-tapping-outside-iframe-with-focused-field.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + diff --git a/LayoutTests/fast/events/ios/tab-cycle-expected.txt b/LayoutTests/fast/events/ios/tab-cycle-expected.txt new file mode 100644 index 000000000000..0bad57f504d7 --- /dev/null +++ b/LayoutTests/fast/events/ios/tab-cycle-expected.txt @@ -0,0 +1,12 @@ +This tests tab cycling through editable elements on iOS. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS elementName is "A" +PASS elementName is "B" +PASS elementName is "C" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/ios/tab-cycle.html b/LayoutTests/fast/events/ios/tab-cycle.html new file mode 100644 index 000000000000..42850593e8d7 --- /dev/null +++ b/LayoutTests/fast/events/ios/tab-cycle.html @@ -0,0 +1,46 @@ + + + + + + + +
    + + + +
    + + + diff --git a/LayoutTests/fast/events/ios/tab-into-text-field-inside-iframe-expected.txt b/LayoutTests/fast/events/ios/tab-into-text-field-inside-iframe-expected.txt new file mode 100644 index 000000000000..0692807f4e59 --- /dev/null +++ b/LayoutTests/fast/events/ios/tab-into-text-field-inside-iframe-expected.txt @@ -0,0 +1,10 @@ +This tests that you can tab cycle into a field inside an iframe. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS focused text field inside iframe +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/events/ios/tab-into-text-field-inside-iframe.html b/LayoutTests/fast/events/ios/tab-into-text-field-inside-iframe.html new file mode 100644 index 000000000000..81e2bcf47ffb --- /dev/null +++ b/LayoutTests/fast/events/ios/tab-into-text-field-inside-iframe.html @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/LayoutTests/fast/events/touch/ios/click-after-long-press-expected.txt b/LayoutTests/fast/events/touch/ios/click-after-long-press-expected.txt new file mode 100644 index 000000000000..7ef22e9a431a --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/click-after-long-press-expected.txt @@ -0,0 +1 @@ +PASS diff --git a/LayoutTests/fast/events/touch/ios/click-after-long-press.html b/LayoutTests/fast/events/touch/ios/click-after-long-press.html new file mode 100644 index 000000000000..9983fd30fcc8 --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/click-after-long-press.html @@ -0,0 +1,70 @@ + + + + + + + + + +
    + Dice + FAIL. +
    + + diff --git a/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-and-recursive-update-style-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-and-recursive-update-style-expected.txt new file mode 100644 index 000000000000..3cd69deabafa --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-and-recursive-update-style-expected.txt @@ -0,0 +1,2 @@ +PASS if no crash or assert. + diff --git a/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-and-recursive-update-style.html b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-and-recursive-update-style.html new file mode 100644 index 000000000000..c801e824b615 --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-and-recursive-update-style.html @@ -0,0 +1,53 @@ + + + +This tests the case when visible content change happens through transition and there's a pending style update. + + + + + +
    PASS if no crash or assert.
    +
    + + + diff --git a/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-crash-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-crash-expected.txt new file mode 100644 index 000000000000..3cd69deabafa --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-crash-expected.txt @@ -0,0 +1,2 @@ +PASS if no crash or assert. + diff --git a/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-crash.html b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-crash.html new file mode 100644 index 000000000000..594ab2aa5756 --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/content-observation/animation-end-with-visiblity-change-crash.html @@ -0,0 +1,59 @@ + + + +This tests the case when visible content change happens through transition and the click removes the animated element. + + + + + +
    PASS if no crash or assert.
    +
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/content-observation/click-event-suppression-on-content-change-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/click-event-suppression-on-content-change-expected.txt
    similarity index 100%
    rename from LayoutTests/fast/content-observation/click-event-suppression-on-content-change-expected.txt
    rename to LayoutTests/fast/events/touch/ios/content-observation/click-event-suppression-on-content-change-expected.txt
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/click-event-suppression-on-content-change.html b/LayoutTests/fast/events/touch/ios/content-observation/click-event-suppression-on-content-change.html
    new file mode 100644
    index 000000000000..53fb8f2e1667
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/click-event-suppression-on-content-change.html
    @@ -0,0 +1,84 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +    
    Test that if document is visibly mutated in mouseover handler then synthetic click is not generated until the next tap.
    +
    +
    + +
    + + diff --git a/LayoutTests/fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html b/LayoutTests/fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html index 48e1846e841c..92ef84801342 100644 --- a/LayoutTests/fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html +++ b/LayoutTests/fast/events/touch/ios/content-observation/mouse-out-event-should-fire-on-click.html @@ -1,7 +1,7 @@ -This tests that we fire mouseout on synthetic click +This tests that we fire mouseout on synthetic click when the quirk is on. + + + + +
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-change-in-fullscreen-mode-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-change-in-fullscreen-mode-expected.txt
    new file mode 100644
    index 000000000000..b7941c2938e3
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-change-in-fullscreen-mode-expected.txt
    @@ -0,0 +1,4 @@
    +PASS if 'clicked' text is shown below.
    +clicked
    +END OF TEST
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-change-in-fullscreen-mode.html b/LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-change-in-fullscreen-mode.html
    new file mode 100644
    index 000000000000..0df44856fa30
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-change-in-fullscreen-mode.html
    @@ -0,0 +1,70 @@
    +
    +
    +
    +This tests the case when the tap target node is not part of the fullscreen content -> hidden -> click
    +
    +
    +
    +
    +
    +
    +PASS if 'clicked' text is shown below.
    +
    +
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition2-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition2-expected.txt
    new file mode 100644
    index 000000000000..a35f2c8cf410
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition2-expected.txt
    @@ -0,0 +1,3 @@
    +
    +PASS if 'clicked' text is not shown below.
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition2.html b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition2.html
    new file mode 100644
    index 000000000000..be39d498bd41
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition2.html
    @@ -0,0 +1,49 @@
    +
    +
    +
    +This tests the case when the touch target is initially hidden.
    +
    +
    +
    +
    +
    +
    +
    PASS if 'clicked' text is not shown below.
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition3-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition3-expected.txt
    new file mode 100644
    index 000000000000..441f214561e3
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition3-expected.txt
    @@ -0,0 +1,3 @@
    +
    +PASS if 'clicked' text is shown below.
    +clicked
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition3.html b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition3.html
    new file mode 100644
    index 000000000000..e800731d9837
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/opacity-change-happens-on-touchstart-with-transition3.html
    @@ -0,0 +1,40 @@
    +
    +
    +
    +This tests the case when the touch target is hidden (hidden at the time of touch start and it does remain hidden throughout the hover heuristics).
    +
    +
    +
    +
    +
    +
    +
    PASS if 'clicked' text is shown below.
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-height-content-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-height-content-expected.txt
    new file mode 100644
    index 000000000000..677e3a31e4d2
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-height-content-expected.txt
    @@ -0,0 +1,2 @@
    +PASS if 'clicked' text is shown below.
    +clicked
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-height-content.html b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-height-content.html
    new file mode 100644
    index 000000000000..0d4e0cd29685
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-height-content.html
    @@ -0,0 +1,54 @@
    +
    +
    +
    +This tests the case when visible content change happens on mouseover but the newly visible (and clickable) content is too small.
    +
    +
    +
    +
    +
    +
    PASS if 'clicked' text is shown below.
    +
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-width-content-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-width-content-expected.txt
    new file mode 100644
    index 000000000000..677e3a31e4d2
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-width-content-expected.txt
    @@ -0,0 +1,2 @@
    +PASS if 'clicked' text is shown below.
    +clicked
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-width-content.html b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-width-content.html
    new file mode 100644
    index 000000000000..ef2c1c13d074
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-1px-width-content.html
    @@ -0,0 +1,54 @@
    +
    +
    +
    +This tests the case when visible content change happens on mouseover but the newly visible (and clickable) content is too small.
    +
    +
    +
    +
    +
    +
    PASS if 'clicked' text is shown below.
    +
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-looking-div-with-role.html b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-looking-div-with-role.html
    index ad397fbcc20a..69eae14582dc 100644
    --- a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-looking-div-with-role.html
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-looking-div-with-role.html
    @@ -43,10 +43,6 @@
         becomesVisible.style.visibility = "visible";
     }, false);
     
    -becomesVisible.addEventListener("click", function( event ) {   
    -    result.innerHTML = "clicked hidden";
    -}, false);
    -
     tapthis.addEventListener("click", function( event ) {   
         result.innerHTML = "clicked";
         if (window.testRunner)
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-async-clickable-change-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-async-clickable-change-expected.txt
    new file mode 100644
    index 000000000000..31954a39d709
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-async-clickable-change-expected.txt
    @@ -0,0 +1,3 @@
    +PASS if 'clicked' text is shown below.
    +
    +clicked
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-async-clickable-change.html b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-async-clickable-change.html
    new file mode 100644
    index 000000000000..e067e51caad6
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-async-clickable-change.html
    @@ -0,0 +1,57 @@
    +
    +
    +
    +This tests the case when the tap target node is a form control element but it triggers async actionable visibility change -> click (we want to preserve fast click behavior on form controls).
    +
    +
    +
    +
    +
    +PASS if 'clicked' text is shown below.
    + +
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-clickable-change-expected.txt b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-clickable-change-expected.txt
    new file mode 100644
    index 000000000000..a7047838af69
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-clickable-change-expected.txt
    @@ -0,0 +1,3 @@
    +PASS if 'clicked' text is NOT shown below.
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-clickable-change.html b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-clickable-change.html
    new file mode 100644
    index 000000000000..d73cdeaec12a
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element-with-clickable-change.html
    @@ -0,0 +1,55 @@
    +
    +
    +
    +This tests the case when the tap target node is a form control element but it triggers synchronous actionable visibility change -> "fast" hover.
    +
    +
    +
    +
    +
    +PASS if 'clicked' text is NOT shown below.
    + +
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element.html b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element.html
    index fde28249bdc9..1a2da91b6dc8 100644
    --- a/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element.html
    +++ b/LayoutTests/fast/events/touch/ios/content-observation/tap-on-input-type-button-element.html
    @@ -1,7 +1,7 @@
     
     
     
    -This tests the case when the tap target node is a form control element.
    +This tests the case when the tap target node is a form control element -> "fast" click.
     
     
    +
    +
    +    
    +    
    +
    
    +    
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3-expected.txt b/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3-expected.txt
    index a0292c210c3d..836898221169 100644
    --- a/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3-expected.txt
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-double-click3-expected.txt
    @@ -1,2 +1,2 @@
     PASS if 'double click' text is NOT shown below.
    -[click][click]
    +[click]
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks1-expected.txt b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks1-expected.txt
    new file mode 100644
    index 000000000000..4d63b608d0b3
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks1-expected.txt
    @@ -0,0 +1,2 @@
    +PASS if '[click][click]' text is shown below.
    +[click][click]
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks1.html b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks1.html
    new file mode 100644
    index 000000000000..8a89ec7ddef2
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks1.html
    @@ -0,0 +1,40 @@
    +
    +
    +
    +
    +This tests that we fire two click events on double tap when dblclick handler is not present.
    +
    +
    +
    +
    +
    +
    PASS if '[click][click]' text is shown below.
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks2-expected.txt b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks2-expected.txt
    new file mode 100644
    index 000000000000..4d63b608d0b3
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks2-expected.txt
    @@ -0,0 +1,2 @@
    +PASS if '[click][click]' text is shown below.
    +[click][click]
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks2.html b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks2.html
    new file mode 100644
    index 000000000000..c2e2883e45f9
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks2.html
    @@ -0,0 +1,46 @@
    +
    +
    +
    +
    +This tests that we fire two click events on double tap when dblclick handler is removed dynamically.
    +
    +
    +
    +
    +
    PASS if '[click][click]' text is shown below.
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks3-expected.txt b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks3-expected.txt
    new file mode 100644
    index 000000000000..0ff14a09a734
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks3-expected.txt
    @@ -0,0 +1,2 @@
    +PASS if '[click][click][double click]' text is shown below.
    +[click][click][double click]
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks3.html b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks3.html
    new file mode 100644
    index 000000000000..8c564b974db5
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks3.html
    @@ -0,0 +1,50 @@
    +
    +
    +
    +
    +This tests that we fire two click events on double tap when multiple dblclick handlers are present.
    +
    +
    +
    +
    +
    PASS if '[click][click][double click]' text is shown below.
    +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks4-expected.txt b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks4-expected.txt
    new file mode 100644
    index 000000000000..5a5b90d6bef8
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks4-expected.txt
    @@ -0,0 +1,2 @@
    +PASS if '[click][click][double click]' text is shown below.
    + [click][click][double click]
    diff --git a/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks4.html b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks4.html
    new file mode 100644
    index 000000000000..d3b32594f071
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/double-tap-for-two-clicks4.html
    @@ -0,0 +1,46 @@
    +
    +
    +
    +
    +This tests that we fire two click events on double tap when dblclick handler is in an iframe.
    +
    +
    +
    +
    +
    PASS if '[click][click][double click]' text is shown below.
    + +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/long-press-then-drag-to-select-text.html b/LayoutTests/fast/events/touch/ios/long-press-then-drag-to-select-text.html
    index ddb4d0227932..922909ff0287 100644
    --- a/LayoutTests/fast/events/touch/ios/long-press-then-drag-to-select-text.html
    +++ b/LayoutTests/fast/events/touch/ios/long-press-then-drag-to-select-text.html
    @@ -31,7 +31,7 @@
                 output += '
    '; var result = await continueTouchAndDragFromPointToPoint(pressPointX, pressPointY, dragX, dragY); - if (document.getSelection().toString() == "labore") + if (document.getSelection().toString() == "eiusmod tempor incididunt ut labore et dolore magna") output += 'PASS: Correct Selection'; else output += 'FAIL: failed to reduce selection to a single character by dragging down. Incorrect Selection: ' + document.getSelection().toString(); diff --git a/LayoutTests/fast/events/touch/ios/show-keyboard-after-preventing-touchstart-expected.txt b/LayoutTests/fast/events/touch/ios/show-keyboard-after-preventing-touchstart-expected.txt deleted file mode 100644 index d8c45bf6977a..000000000000 --- a/LayoutTests/fast/events/touch/ios/show-keyboard-after-preventing-touchstart-expected.txt +++ /dev/null @@ -1,11 +0,0 @@ - -Verifies that the keyboard shows up even after preventing default on touchstart. To manually test, tap the textarea; the textarea should remain focused, and the keyboard should appear. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS keyboard was shown. -PASS document.activeElement is textarea -PASS successfullyParsed is true - -TEST COMPLETE - diff --git a/LayoutTests/fast/events/touch/ios/show-keyboard-after-preventing-touchstart.html b/LayoutTests/fast/events/touch/ios/show-keyboard-after-preventing-touchstart.html deleted file mode 100644 index b25af030e4b3..000000000000 --- a/LayoutTests/fast/events/touch/ios/show-keyboard-after-preventing-touchstart.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - -
    
    -    
    
    -
    -
    -
    diff --git a/LayoutTests/fast/events/touch/ios/touch-event-regions/scrolled-overflow-expected.txt b/LayoutTests/fast/events/touch/ios/touch-event-regions/scrolled-overflow-expected.txt
    new file mode 100644
    index 000000000000..198f681407a8
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/touch-event-regions/scrolled-overflow-expected.txt
    @@ -0,0 +1,11 @@
    +touchstart inside overflow
    +touchstart
    +58, 50 - 260, 252
    +touchstart
    +58, 50 - 260, 252
    +touchend
    +58, 50 - 260, 252
    +touchforcechange
    +58, 50 - 260, 252
    +passive
    +
    diff --git a/LayoutTests/fast/events/touch/ios/touch-event-regions/scrolled-overflow.html b/LayoutTests/fast/events/touch/ios/touch-event-regions/scrolled-overflow.html
    new file mode 100644
    index 000000000000..89d05879cb29
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/touch-event-regions/scrolled-overflow.html
    @@ -0,0 +1,37 @@
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +    
    +
    touchstart inside overflow
    +
    + + diff --git a/LayoutTests/fast/events/touch/ios/visibility-hidden-iframe-click-expected.txt b/LayoutTests/fast/events/touch/ios/visibility-hidden-iframe-click-expected.txt new file mode 100644 index 000000000000..ec17b983689d --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/visibility-hidden-iframe-click-expected.txt @@ -0,0 +1,2 @@ +PASS if 'clicked' text is shown below +clicked diff --git a/LayoutTests/fast/events/touch/ios/visibility-hidden-iframe-click.html b/LayoutTests/fast/events/touch/ios/visibility-hidden-iframe-click.html new file mode 100644 index 000000000000..0f849a497f6e --- /dev/null +++ b/LayoutTests/fast/events/touch/ios/visibility-hidden-iframe-click.html @@ -0,0 +1,48 @@ + + + +This tests the case when the tap target node is a hidden iframe. + + + + + + +
    PASS if 'clicked' text is shown below
    + +
    
    +
    +
    +
    diff --git a/LayoutTests/fast/events/touch/ios/visibility-hidden-nested-iframe-click-expected.txt b/LayoutTests/fast/events/touch/ios/visibility-hidden-nested-iframe-click-expected.txt
    new file mode 100644
    index 000000000000..f1163310c396
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/visibility-hidden-nested-iframe-click-expected.txt
    @@ -0,0 +1,3 @@
    +PASS if 'clicked' text is shown below
    +
    +clicked
    diff --git a/LayoutTests/fast/events/touch/ios/visibility-hidden-nested-iframe-click.html b/LayoutTests/fast/events/touch/ios/visibility-hidden-nested-iframe-click.html
    new file mode 100644
    index 000000000000..a0dc1f2dbd78
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/ios/visibility-hidden-nested-iframe-click.html
    @@ -0,0 +1,52 @@
    + 
    +
    +
    +This tests the case when the target node of the tap is a nested iframe with visibility hidden.
    +
    +
    +
    +
    +
    +
    +
    PASS if 'clicked' text is shown below
    + +
    
    +
    +
    diff --git a/LayoutTests/fast/events/touch/resources/doubleClickContent.html b/LayoutTests/fast/events/touch/resources/doubleClickContent.html
    new file mode 100644
    index 000000000000..bb93b25a5838
    --- /dev/null
    +++ b/LayoutTests/fast/events/touch/resources/doubleClickContent.html
    @@ -0,0 +1,8 @@
    +
    some text
    +
    some text
    + diff --git a/LayoutTests/fast/forms/contenteditable-font-optical-size-expected.txt b/LayoutTests/fast/forms/contenteditable-font-optical-size-expected.txt new file mode 100644 index 000000000000..aee2599349d1 --- /dev/null +++ b/LayoutTests/fast/forms/contenteditable-font-optical-size-expected.txt @@ -0,0 +1,9 @@ +This test makes sure that contenteditable with optical size doesn't hang the browser. The test passes if there is no hang when typing occurs in the contenteditable element. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS successfullyParsed is true + +TEST COMPLETE +Lorem ipsumabcde diff --git a/LayoutTests/fast/forms/contenteditable-font-optical-size.html b/LayoutTests/fast/forms/contenteditable-font-optical-size.html new file mode 100644 index 000000000000..74234aa531b5 --- /dev/null +++ b/LayoutTests/fast/forms/contenteditable-font-optical-size.html @@ -0,0 +1,47 @@ + + + + + + + + +
    Lorem ipsum
    + + + + diff --git a/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard-after-pointerup-expected.txt b/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard-after-pointerup-expected.txt new file mode 100644 index 000000000000..0589736f7782 --- /dev/null +++ b/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard-after-pointerup-expected.txt @@ -0,0 +1,17 @@ +This tests updating inputmode of an input element from "none" to "text". The software keyboard should be brought up after pointerup. +To manually test, tap on the input element below. The software keyboard should be brought up + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS textHeight = keyboardRect.height; keyboardRect.height > 0 is true +PASS logs.length is 2 +PASS logs[0].event.type is "pointerdown" +PASS logs[0].visualViewportHeight is originalVisualViewportHeight +PASS logs[1].event.type is "pointerup" +PASS logs[1].visualViewportHeight is originalVisualViewportHeight +PASS successfullyParsed is true + +TEST COMPLETE + + diff --git a/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard-after-pointerup.html b/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard-after-pointerup.html new file mode 100644 index 000000000000..d92e2fb498e8 --- /dev/null +++ b/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard-after-pointerup.html @@ -0,0 +1,60 @@ + + + + + + + + + +
    + + + diff --git a/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard.html b/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard.html index 852631401fbd..2d01aa22165c 100644 --- a/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard.html +++ b/LayoutTests/fast/forms/ios/inputmode-change-update-keyboard.html @@ -30,7 +30,8 @@ } async function runTest() { - await UIHelper.setHardwareKeyboardAttached(false); + if (window.testRunner) + await UIHelper.setHardwareKeyboardAttached(false); debug('inputmode="text"'); diff --git a/LayoutTests/fast/forms/ios/no-scrolling-when-moving-focus-between-adjacent-fields-expected.txt b/LayoutTests/fast/forms/ios/no-scrolling-when-moving-focus-between-adjacent-fields-expected.txt new file mode 100644 index 000000000000..042da7501612 --- /dev/null +++ b/LayoutTests/fast/forms/ios/no-scrolling-when-moving-focus-between-adjacent-fields-expected.txt @@ -0,0 +1,7 @@ +PASS Did not observe unnecessary scrolling + +This test verifies that moving focus between two fields that are at the same y offset does not induce vertical scrolling. To test manually, focus the left field and press any key. Focus should move to the right field, and there should be no scrolling. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + diff --git a/LayoutTests/fast/forms/ios/no-scrolling-when-moving-focus-between-adjacent-fields.html b/LayoutTests/fast/forms/ios/no-scrolling-when-moving-focus-between-adjacent-fields.html new file mode 100644 index 000000000000..7f02ba2bb512 --- /dev/null +++ b/LayoutTests/fast/forms/ios/no-scrolling-when-moving-focus-between-adjacent-fields.html @@ -0,0 +1,112 @@ + + + + + + + + + +
    +
    + + +
    +
    +
    +
    + + + diff --git a/LayoutTests/fast/forms/select-font-optical-size-expected.txt b/LayoutTests/fast/forms/select-font-optical-size-expected.txt new file mode 100644 index 000000000000..b7faba95ffcf --- /dev/null +++ b/LayoutTests/fast/forms/select-font-optical-size-expected.txt @@ -0,0 +1,9 @@ +This test makes sure that text-rendering: optimizeLegibility on a drop-down select element doesn't cause a hang. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/forms/select-font-optical-size.html b/LayoutTests/fast/forms/select-font-optical-size.html new file mode 100644 index 000000000000..fe5f869968fb --- /dev/null +++ b/LayoutTests/fast/forms/select-font-optical-size.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/LayoutTests/fast/frames/frames-not-double-painted-expected.html b/LayoutTests/fast/frames/frames-not-double-painted-expected.html new file mode 100644 index 000000000000..de147319acdf --- /dev/null +++ b/LayoutTests/fast/frames/frames-not-double-painted-expected.html @@ -0,0 +1,28 @@ + + + + + + +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/fast/frames/frames-not-double-painted.html b/LayoutTests/fast/frames/frames-not-double-painted.html new file mode 100644 index 000000000000..4ec9138eabf8 --- /dev/null +++ b/LayoutTests/fast/frames/frames-not-double-painted.html @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/LayoutTests/webgpu/compute-squares-expected.txt b/LayoutTests/fast/frames/hidden-frameset-expected.txt similarity index 100% rename from LayoutTests/webgpu/compute-squares-expected.txt rename to LayoutTests/fast/frames/hidden-frameset-expected.txt diff --git a/LayoutTests/fast/frames/hidden-frameset.html b/LayoutTests/fast/frames/hidden-frameset.html new file mode 100644 index 000000000000..7c0d06febe7d --- /dev/null +++ b/LayoutTests/fast/frames/hidden-frameset.html @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/LayoutTests/fast/frames/lots-of-iframes-expected.txt b/LayoutTests/fast/frames/lots-of-iframes-expected.txt index 3dc7353075eb..d3517638c8bb 100644 --- a/LayoutTests/fast/frames/lots-of-iframes-expected.txt +++ b/LayoutTests/fast/frames/lots-of-iframes-expected.txt @@ -1,2 +1,3 @@ Sucessfully created 1000 frames. Successfully blocked creation of frame number 1001. + diff --git a/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-expected.txt b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-expected.txt new file mode 100644 index 000000000000..1cc9f0159985 --- /dev/null +++ b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-expected.txt @@ -0,0 +1,3 @@ +This tests that pageshow event is fired before the focus elements are reset when a document in the page cache is restored. + +PASS diff --git a/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update-expected.txt b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update-expected.txt new file mode 100644 index 000000000000..30ecdfdd90a0 --- /dev/null +++ b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update-expected.txt @@ -0,0 +1,3 @@ +This tests that pageshow event is fired before the object element loads when a document in the page cache is restored. + +PASS diff --git a/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update.html b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update.html new file mode 100644 index 000000000000..a8e5d4c4edd3 --- /dev/null +++ b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts-via-style-update.html @@ -0,0 +1,102 @@ + + + +

    This tests that pageshow event is fired before the object element loads when a document in the page cache is restored.

    +
    + + + diff --git a/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts.html b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts.html new file mode 100644 index 000000000000..c0083bdc85d7 --- /dev/null +++ b/LayoutTests/fast/frames/restoring-page-cache-should-not-run-scripts.html @@ -0,0 +1,73 @@ + + + +

    This tests that pageshow event is fired before the focus elements are reset when a document in the page cache is restored.

    +
    + + + diff --git a/LayoutTests/fast/history/page-cache-MessagePort-pending-message-expected.txt b/LayoutTests/fast/history/page-cache-MessagePort-pending-message-expected.txt new file mode 100644 index 000000000000..454587527eff --- /dev/null +++ b/LayoutTests/fast/history/page-cache-MessagePort-pending-message-expected.txt @@ -0,0 +1,15 @@ +Tests that a page that has a MessagePort with a pending message can enter PageCache. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +pageshow - not from cache +pagehide - entering cache +pageshow - from cache +PASS Page did enter and was restored from the page cache +PASS e.data is "foo" +PASS afterPageCacheRestore is true +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/history/page-cache-MessagePort-pending-message.html b/LayoutTests/fast/history/page-cache-MessagePort-pending-message.html new file mode 100644 index 000000000000..c9a18675fc51 --- /dev/null +++ b/LayoutTests/fast/history/page-cache-MessagePort-pending-message.html @@ -0,0 +1,54 @@ + + + + + + + + diff --git a/LayoutTests/fast/loader/stateobjects/pushstate-frequency-expected.txt b/LayoutTests/fast/loader/stateobjects/pushstate-frequency-expected.txt index 1bf0fe6fcb6a..8a325f6a040f 100644 --- a/LayoutTests/fast/loader/stateobjects/pushstate-frequency-expected.txt +++ b/LayoutTests/fast/loader/stateobjects/pushstate-frequency-expected.txt @@ -99,6 +99,6 @@ Successfully added item: 96 Successfully added item: 97 Successfully added item: 98 Successfully added item: 99 -SecurityError: Attempt to use history.pushState() more than 100 times per 30.000000 seconds +SecurityError: Attempt to use history.pushState() more than 100 times per 30 seconds Test complete diff --git a/LayoutTests/fast/loader/stateobjects/pushstate-frequency-iframe-expected.txt b/LayoutTests/fast/loader/stateobjects/pushstate-frequency-iframe-expected.txt index d8d409585989..ce496e0dbda4 100644 --- a/LayoutTests/fast/loader/stateobjects/pushstate-frequency-iframe-expected.txt +++ b/LayoutTests/fast/loader/stateobjects/pushstate-frequency-iframe-expected.txt @@ -107,5 +107,5 @@ Successfully added item: 21 Successfully added item: 22 Successfully added item: 23 Successfully added item: 24 -Expected exception: SecurityError: Attempt to use history.pushState() more than 100 times per 30.000000 seconds +Expected exception: SecurityError: Attempt to use history.pushState() more than 100 times per 30 seconds diff --git a/LayoutTests/fast/loader/stateobjects/replacestate-frequency-expected.txt b/LayoutTests/fast/loader/stateobjects/replacestate-frequency-expected.txt index b4646b3a65af..4481204a3524 100644 --- a/LayoutTests/fast/loader/stateobjects/replacestate-frequency-expected.txt +++ b/LayoutTests/fast/loader/stateobjects/replacestate-frequency-expected.txt @@ -99,6 +99,6 @@ Successfully added item: 96 Successfully added item: 97 Successfully added item: 98 Successfully added item: 99 -SecurityError: Attempt to use history.replaceState() more than 100 times per 30.000000 seconds +SecurityError: Attempt to use history.replaceState() more than 100 times per 30 seconds Test complete diff --git a/LayoutTests/fast/loader/stateobjects/replacestate-frequency-iframe-expected.txt b/LayoutTests/fast/loader/stateobjects/replacestate-frequency-iframe-expected.txt index 3aad9fd11a24..f3d9d7690b52 100644 --- a/LayoutTests/fast/loader/stateobjects/replacestate-frequency-iframe-expected.txt +++ b/LayoutTests/fast/loader/stateobjects/replacestate-frequency-iframe-expected.txt @@ -106,5 +106,5 @@ Successfully added item: 21 Successfully added item: 22 Successfully added item: 23 Successfully added item: 24 -Expected exception: SecurityError: Attempt to use history.replaceState() more than 100 times per 30.000000 seconds +Expected exception: SecurityError: Attempt to use history.replaceState() more than 100 times per 30 seconds diff --git a/LayoutTests/fast/mediastream/MediaStreamTrack-clone-expected.txt b/LayoutTests/fast/mediastream/MediaStreamTrack-clone-expected.txt index 9ef68ded5447..7102c658237d 100644 --- a/LayoutTests/fast/mediastream/MediaStreamTrack-clone-expected.txt +++ b/LayoutTests/fast/mediastream/MediaStreamTrack-clone-expected.txt @@ -20,6 +20,7 @@ PASS videoTrack.onunmute is not videoTrack2.onunmute PASS videoTrack.onended is not videoTrack2.onended PASS videoTrack.onoverconstrained is not videoTrack2.onoverconstrained PASS videoTrack.readyState is not videoTrack2.readyState +PASS videoTrack.readyState is videoTrack3.readyState PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/fast/mediastream/MediaStreamTrack-clone.html b/LayoutTests/fast/mediastream/MediaStreamTrack-clone.html index 17c6f1d1495f..63e87752647e 100644 --- a/LayoutTests/fast/mediastream/MediaStreamTrack-clone.html +++ b/LayoutTests/fast/mediastream/MediaStreamTrack-clone.html @@ -7,6 +7,7 @@ var mediaStream; var videoTrack; var videoTrack2; + var videoTrack3; var audioTrack; function gotStream(stream) { @@ -40,6 +41,9 @@ videoTrack.stop(); shouldNotBe('videoTrack.readyState', 'videoTrack2.readyState'); + videoTrack3 = videoTrack.clone(); + shouldBe('videoTrack.readyState', 'videoTrack3.readyState'); + finishJSTest(); } diff --git a/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt index a70a2c15dd25..79e1144d27f8 100644 --- a/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt +++ b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3-expected.txt @@ -1,3 +1,3 @@ -PASS Testing same page getUserMedia deny persistency with audio and video denied +PASS Testing same page getUserMedia deny persistency, the first denied request being audio and video, the second granted request being audio diff --git a/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html index 21cb9de27d0c..20ceed4265e5 100644 --- a/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html +++ b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency3.html @@ -6,23 +6,23 @@ diff --git a/LayoutTests/fast/mediastream/getUserMedia-deny-persistency4-expected.txt b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency4-expected.txt new file mode 100644 index 000000000000..192ababcf671 --- /dev/null +++ b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency4-expected.txt @@ -0,0 +1,3 @@ + +PASS Testing same page getUserMedia deny persistency, the first denied request being audio and video, the second granted request being video + diff --git a/LayoutTests/fast/mediastream/getUserMedia-deny-persistency4.html b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency4.html new file mode 100644 index 000000000000..ae8608f19f79 --- /dev/null +++ b/LayoutTests/fast/mediastream/getUserMedia-deny-persistency4.html @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/LayoutTests/fast/mediastream/getUserMedia-webaudio-expected.txt b/LayoutTests/fast/mediastream/getUserMedia-webaudio-expected.txt index 481f9e572d34..b2a8900dd516 100644 --- a/LayoutTests/fast/mediastream/getUserMedia-webaudio-expected.txt +++ b/LayoutTests/fast/mediastream/getUserMedia-webaudio-expected.txt @@ -1,3 +1,4 @@ PASS Plugging in getUserMedia audio stream into Web Audio +PASS Web Audio should work even if number of channels of a track increases from 1 to 2 diff --git a/LayoutTests/fast/mediastream/getUserMedia-webaudio.html b/LayoutTests/fast/mediastream/getUserMedia-webaudio.html index 229605f5b251..ae5f00d0d192 100644 --- a/LayoutTests/fast/mediastream/getUserMedia-webaudio.html +++ b/LayoutTests/fast/mediastream/getUserMedia-webaudio.html @@ -38,6 +38,33 @@ }); }); }, "Plugging in getUserMedia audio stream into Web Audio"); + +function waitFor(duration) +{ + return new Promise(resolve => setTimeout(resolve, duration)); +} + +promise_test(async (test) => { + if (!window.internals) + return Promise.reject("Internals API required"); + + const stream = await navigator.mediaDevices.getUserMedia({ audio: {deviceId: true}}); + internals.setMockAudioTrackChannelNumber(stream.getAudioTracks()[0], 1); + + var audioContext = new webkitAudioContext(); + var script = audioContext.createScriptProcessor(2048, 1, 1); + let source = audioContext.createMediaStreamSource(stream); + source.connect(script); + script.connect(audioContext.destination); + + await waitFor(200); + + internals.setMockAudioTrackChannelNumber(stream.getAudioTracks()[0], 2); + await waitFor(200); + + source.disconnect(script); + script.disconnect(audioContext.destination); +}, "Web Audio should work even if number of channels of a track increases from 1 to 2"); diff --git a/LayoutTests/fast/mediastream/mediastreamtrack-video-clone-expected.txt b/LayoutTests/fast/mediastream/mediastreamtrack-video-clone-expected.txt new file mode 100644 index 000000000000..eefda5834aed --- /dev/null +++ b/LayoutTests/fast/mediastream/mediastreamtrack-video-clone-expected.txt @@ -0,0 +1,15 @@ + + +PASS Setup for width test +PASS Setup for height test +PASS Setup for width+height test +PASS Stopping a track should not stop its clone +PASS Stopping a cloned track should not stop the original track +PASS Collecting a cloned track should not stop the original track +PASS Check cloned track settings after applying width constraints +PASS Check cloned track settings after applying width constraint to original track +PASS Check cloned track settings after applying height constraints +PASS Check cloned track settings after applying height constraints to original track +PASS Check cloned track settings after applying width+height constraints +PASS Check cloned track settings after applying width+height constraints to original track + diff --git a/LayoutTests/fast/mediastream/mediastreamtrack-video-clone.html b/LayoutTests/fast/mediastream/mediastreamtrack-video-clone.html new file mode 100644 index 000000000000..a1f54de0ef48 --- /dev/null +++ b/LayoutTests/fast/mediastream/mediastreamtrack-video-clone.html @@ -0,0 +1,143 @@ + + + + + Clone a video track. + + + + + + + + + + + diff --git a/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt b/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt new file mode 100644 index 000000000000..87bc40015718 --- /dev/null +++ b/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt @@ -0,0 +1,10 @@ +Test for the SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply sendSync flag + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS internals.testProcessIncomingSyncMessagesWhenWaitingForSyncReply() is true +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html b/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html new file mode 100644 index 000000000000..55ab448a1898 --- /dev/null +++ b/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html @@ -0,0 +1,11 @@ + + + + + + + diff --git a/LayoutTests/fast/parser/parser-yield-timing-expected.txt b/LayoutTests/fast/parser/parser-yield-timing-expected.txt index 948da42452ba..75dccbe2b26d 100644 --- a/LayoutTests/fast/parser/parser-yield-timing-expected.txt +++ b/LayoutTests/fast/parser/parser-yield-timing-expected.txt @@ -3,9 +3,9 @@ Runs 3 separate 1 second + + + + + +This test focuses a form, them zooms and scrolls the page. +Then text is entered in the form, and we check to make sure the page has scrolled +so that the input is visible again, but not more that once, as it should be visible +after the first scroll. +
    + + + + + + diff --git a/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame-expected.txt b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame-expected.txt new file mode 100644 index 000000000000..44a416505798 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame-expected.txt @@ -0,0 +1,10 @@ +Verifies that long pressing the page during momentum scrolling does not dispatch click events to the page. This test requires WebKitTestRunner. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS document.scrollingElement.scrollTop passed 1000 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame.html b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame.html new file mode 100644 index 000000000000..28e8bab25991 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-main-frame.html @@ -0,0 +1,64 @@ + + + + + + + + + +
    + + + diff --git a/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow-expected.txt b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow-expected.txt new file mode 100644 index 000000000000..800baf336fc8 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow-expected.txt @@ -0,0 +1,10 @@ +Verifies that long pressing a subscrollable region during momentum scrolling does not dispatch click events. This test requires WebKitTestRunner. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS scroller.scrollTop passed 500 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow.html b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow.html new file mode 100644 index 000000000000..5a1cbf24c490 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-after-long-press-during-momentum-scroll-in-overflow.html @@ -0,0 +1,79 @@ + + + + + + + + + +
    +
    +
    +

    +

    + + + diff --git a/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-main-frame-expected.txt b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-main-frame-expected.txt new file mode 100644 index 000000000000..d977128057fd --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-main-frame-expected.txt @@ -0,0 +1,10 @@ +Verifies that tapping the page during momentum scrolling does not dispatch click events to the page. To run the test manually, swipe up to scroll down; while the page is momentum scrolling, tap the screen to interrupt scrolling. The page should not observe any click events. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS document.scrollingElement.scrollTop passed 1000 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-main-frame.html b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-main-frame.html new file mode 100644 index 000000000000..aa1b7d6115fe --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-main-frame.html @@ -0,0 +1,62 @@ + + + + + + + + +
    + + + diff --git a/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-after-tap-on-body-expected.txt b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-after-tap-on-body-expected.txt new file mode 100644 index 000000000000..000a31af65a8 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-after-tap-on-body-expected.txt @@ -0,0 +1,11 @@ +Verifies that tapping outside of a subscrollable region during momentum scrolling dispatches click events. To run the test manually, swipe up on the black box to scroll it; while scrolling, tap outside of the scrollable area. The page should observe click events. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS scroller.scrollTop passed 400 +PASS Observed click event. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-after-tap-on-body.html b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-after-tap-on-body.html new file mode 100644 index 000000000000..9369041adca7 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-after-tap-on-body.html @@ -0,0 +1,80 @@ + + + + + + + + +
    +
    +
    +

    +

    + + + diff --git a/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-expected.txt b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-expected.txt new file mode 100644 index 000000000000..a1cf81071391 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow-expected.txt @@ -0,0 +1,10 @@ +Verifies that tapping a subscrollable region during momentum scrolling does not dispatch click events. To run the test manually, swipe up on the black box to scroll it; while scrolling, tap the scrollable area to interrupt scrolling. The scrollable area should not observe any click events. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS scroller.scrollTop passed 500 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow.html b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow.html new file mode 100644 index 000000000000..aa9979a2e02e --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/click-events-during-momentum-scroll-in-overflow.html @@ -0,0 +1,77 @@ + + + + + + + + +
    +
    +
    +

    +

    + + + diff --git a/LayoutTests/fast/scrolling/ios/non-invertible-transformed-over-scroller-expected.txt b/LayoutTests/fast/scrolling/ios/non-invertible-transformed-over-scroller-expected.txt new file mode 100644 index 000000000000..82fba7175bd4 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/non-invertible-transformed-over-scroller-expected.txt @@ -0,0 +1,12 @@ +Tests hit-testing of layers over scrollers with odd transforms + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS scrollTopWithScale0Overlay is 100 +PASS scrollTopWithScaledOverlayHitOverlay is 0 +PASS scrollTopWithScaledOverlayHitScroller is 100 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/scrolling/ios/non-invertible-transformed-over-scroller.html b/LayoutTests/fast/scrolling/ios/non-invertible-transformed-over-scroller.html new file mode 100644 index 000000000000..9bd448407e05 --- /dev/null +++ b/LayoutTests/fast/scrolling/ios/non-invertible-transformed-over-scroller.html @@ -0,0 +1,99 @@ + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/fast/shadow-dom/stylesheet-in-shadow-without-base-url-crash-expected.txt b/LayoutTests/fast/shadow-dom/stylesheet-in-shadow-without-base-url-crash-expected.txt new file mode 100644 index 000000000000..23c2be540972 --- /dev/null +++ b/LayoutTests/fast/shadow-dom/stylesheet-in-shadow-without-base-url-crash-expected.txt @@ -0,0 +1 @@ +This test passes it doesn't crash. diff --git a/LayoutTests/fast/shadow-dom/stylesheet-in-shadow-without-base-url-crash.html b/LayoutTests/fast/shadow-dom/stylesheet-in-shadow-without-base-url-crash.html new file mode 100644 index 000000000000..09e14bb2bc37 --- /dev/null +++ b/LayoutTests/fast/shadow-dom/stylesheet-in-shadow-without-base-url-crash.html @@ -0,0 +1,13 @@ + +This test passes it doesn't crash. diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-after-changing-initial-scale.html b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-after-changing-initial-scale.html index 6e40502831d0..87745d27c09d 100644 --- a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-after-changing-initial-scale.html +++ b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-after-changing-initial-scale.html @@ -20,7 +20,6 @@ .container { border: 1px solid black; padding: 8px 12px 12px 12px; - max-width: 320px; } #text0, #text5 { diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidate-special-cases-expected.txt b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidate-special-cases-expected.txt new file mode 100644 index 000000000000..54ac33c3d3ea --- /dev/null +++ b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidate-special-cases-expected.txt @@ -0,0 +1,20 @@ +PASS elementWasAutosized('text1') is true +PASS elementWasAutosized('text2') is false +PASS elementWasAutosized('text3') is true +PASS elementWasAutosized('text4') is true +PASS elementWasAutosized('text5') is true +PASS elementWasAutosized('text6') is false +PASS successfullyParsed is true + +TEST COMPLETE +Hello world + +Hello world + +Hello world + +Hello world + +Hello world + +Hello world diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidate-special-cases.html b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidate-special-cases.html new file mode 100644 index 000000000000..6c107c30afd2 --- /dev/null +++ b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidate-special-cases.html @@ -0,0 +1,46 @@ + + + + + + + + + +
    +

    Hello world

    +

    Hello world

    +
    +

    Hello world

    +

    Hello world

    +

    Hello world

    +

    Hello world

    + + + + diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidates-expected.txt b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidates-expected.txt new file mode 100644 index 000000000000..cb7bf6884105 --- /dev/null +++ b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidates-expected.txt @@ -0,0 +1,61 @@ +Checking target1: +PASS result is >= 13 +Checking target2: +PASS result is >= 13 +Checking target3: +PASS result is 12 +Checking target4: +PASS result is >= 13 +Checking target5: +PASS result is >= 13 +Checking target6: +PASS result is 12 +Checking target7: +PASS result is >= result2 +Checking target8: +PASS result is 12 +Checking target9: +PASS result is >= 13 +Checking target10: +PASS result is >= 13 +Checking target11: +PASS result is >= 13 +Checking target12: +PASS result is >= 13 +Checking target13: +PASS result is 12 +Checking target14: +PASS result is 12 +Checking target15: +PASS result is >= 13 +Checking target16: +PASS result is >= 13 +Checking target17: +PASS result is 12 +Checking target18: +PASS result is 12 +Checking target19: +PASS result is >= 13 +PASS successfullyParsed is true + +TEST COMPLETE +Test +Test +Test +Test +Test +TestTestTestTest +Test +Test +Test +Test +Test +Test +Test +Test +Test +Test +Test +Test +Test +Test diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidates.html b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidates.html new file mode 100644 index 000000000000..8a74ad6a3853 --- /dev/null +++ b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-candidates.html @@ -0,0 +1,85 @@ + + + + + + + + +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    +
    TestTestTestTest
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    Test
    +
    + Test +
    + Test +
    + Test +
    +
    Test
    + + + + diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-skip-expected.txt b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-skip-expected.txt deleted file mode 100644 index 339d190531fc..000000000000 --- a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-skip-expected.txt +++ /dev/null @@ -1,18 +0,0 @@ -PASS result is >= 13 -PASS result is >= 13 -PASS result is 12 -PASS result is 12 -PASS result is 12 -PASS result is 12 -PASS result is >= result2 -PASS result is >= 13 -PASS successfullyParsed is true - -TEST COMPLETE -Test -Test -Test -Test -Test -TestTestTestTest -Test diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-skip.html b/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-skip.html deleted file mode 100644 index 90cfa6d727a4..000000000000 --- a/LayoutTests/fast/text-autosizing/ios/idempotentmode/idempotent-autosizing-skip.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - -
    Test
    -
    Test
    -
    Test
    -
    Test
    -
    Test
    -
    -
    TestTestTestTest
    -
    Test
    - - - - diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/line-height-boosting-expected.txt b/LayoutTests/fast/text-autosizing/ios/idempotentmode/line-height-boosting-expected.txt new file mode 100644 index 000000000000..ac33c4cbf4e2 --- /dev/null +++ b/LayoutTests/fast/text-autosizing/ios/idempotentmode/line-height-boosting-expected.txt @@ -0,0 +1,19 @@ +PASS result is >= 18 +PASS result is >= 13 +PASS result is >= 11 +PASS result is 12 +PASS result is 22 +PASS result is 18 +PASS result is 18 +PASS result is 18 +PASS successfullyParsed is true + +TEST COMPLETE +yes line-height boost +yes line-height boost +yes line-height boost +no line-height boost +no line-height boost +no line-height boost +no line-height boost +no line-height boost diff --git a/LayoutTests/fast/text-autosizing/ios/idempotentmode/line-height-boosting.html b/LayoutTests/fast/text-autosizing/ios/idempotentmode/line-height-boosting.html new file mode 100644 index 000000000000..8efefb62be48 --- /dev/null +++ b/LayoutTests/fast/text-autosizing/ios/idempotentmode/line-height-boosting.html @@ -0,0 +1,52 @@ + + + + + + + + +
    yes line-height boost
    +
    yes line-height boost
    +
    yes line-height boost
    +
    no line-height boost
    +
    no line-height boost
    +
    +
    no line-height boost
    +
    no line-height boost
    +
    no line-height boost
    +
    + + + + diff --git a/LayoutTests/fast/text-indicator/text-indicator-empty-link-expected.txt b/LayoutTests/fast/text-indicator/text-indicator-empty-link-expected.txt new file mode 100644 index 000000000000..58f41c80c423 --- /dev/null +++ b/LayoutTests/fast/text-indicator/text-indicator-empty-link-expected.txt @@ -0,0 +1,11 @@ +PASS 0 is >= boundingRect.x +PASS 0 is >= boundingRect.y +PASS boundingRect.width is >= innerWidth +PASS boundingRect.height is >= innerHeight +PASS successfullyParsed is true + +TEST COMPLETE +  +To test manually, force click on macOS or begin a drag on iPadOS here. The preview highlight rect or targeted drag preview (respectively) should encompass the entire window, instead of just a tiny piece of empty text in the upper left hand corner. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". diff --git a/LayoutTests/fast/text-indicator/text-indicator-empty-link.html b/LayoutTests/fast/text-indicator/text-indicator-empty-link.html new file mode 100644 index 000000000000..63973f621e88 --- /dev/null +++ b/LayoutTests/fast/text-indicator/text-indicator-empty-link.html @@ -0,0 +1,66 @@ + + + + + + + + +   +
    + + + diff --git a/LayoutTests/fast/text-indicator/text-indicator-uses-img-size-inside-picture-expected.txt b/LayoutTests/fast/text-indicator/text-indicator-uses-img-size-inside-picture-expected.txt new file mode 100644 index 000000000000..825763439f97 --- /dev/null +++ b/LayoutTests/fast/text-indicator/text-indicator-uses-img-size-inside-picture-expected.txt @@ -0,0 +1,6 @@ + +imageOnly: -2 -1 260 258 +picture: -2 -1 260 258 +clippedPicture: -2 -1 260 22 +deeperClippedPicture: -2 -1 260 22 + diff --git a/LayoutTests/fast/text-indicator/text-indicator-uses-img-size-inside-picture.html b/LayoutTests/fast/text-indicator/text-indicator-uses-img-size-inside-picture.html new file mode 100644 index 000000000000..0fdfdfd867e1 --- /dev/null +++ b/LayoutTests/fast/text-indicator/text-indicator-uses-img-size-inside-picture.html @@ -0,0 +1,48 @@ + + + + + + + + + + +
    +
    
    +
    +
    \ No newline at end of file
    diff --git a/LayoutTests/fast/text-indicator/text-indicator-with-low-contrast-text-expected.txt b/LayoutTests/fast/text-indicator/text-indicator-with-low-contrast-text-expected.txt
    new file mode 100644
    index 000000000000..3f0f73e314c8
    --- /dev/null
    +++ b/LayoutTests/fast/text-indicator/text-indicator-with-low-contrast-text-expected.txt
    @@ -0,0 +1,40 @@
    +whiteTextWhiteBackground: NOT legible
    +    0 0 68 66
    +whiteTextGrayBackground: NOT legible
    +    0 0 68 66
    +whiteTextBlackBackground: legible
    +    0 0 68 18
    +    0 48 36 18
    +grayTextWhiteBackground: NOT legible
    +    0 0 68 66
    +grayTextGrayBackground: NOT legible
    +    0 0 68 66
    +grayTextBlackBackground: legible
    +    0 0 68 18
    +    0 48 36 18
    +lightGrayTextWhiteBackground: NOT legible
    +    0 0 68 66
    +lightGrayTextGrayBackground: NOT legible
    +    0 0 68 66
    +lightGrayTextBlackBackground: legible
    +    0 0 68 18
    +    0 48 36 18
    +darkGrayTextWhiteBackground: legible
    +    0 0 68 18
    +    0 48 36 18
    +darkGrayTextGrayBackground: NOT legible
    +    0 0 68 66
    +darkGrayTextBlackBackground: NOT legible
    +    0 0 68 66
    +blackTextWhiteBackground: legible
    +    0 0 68 18
    +    0 48 36 18
    +blackTextGrayBackground: legible
    +    0 0 68 18
    +    0 48 36 18
    +blackTextBlackBackground: NOT legible
    +    0 0 68 66
    +dfTextDfBackground: legible
    +    0 0 68 18
    +    0 48 36 18
    +
    diff --git a/LayoutTests/fast/text-indicator/text-indicator-with-low-contrast-text.html b/LayoutTests/fast/text-indicator/text-indicator-with-low-contrast-text.html
    new file mode 100644
    index 000000000000..57bbee4ebfe4
    --- /dev/null
    +++ b/LayoutTests/fast/text-indicator/text-indicator-with-low-contrast-text.html
    @@ -0,0 +1,106 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    test


    test
    +
    test


    test
    +
    test


    test
    + +
    test


    test
    +
    test


    test
    +
    test


    test
    + +
    test


    test
    +
    test


    test
    +
    test


    test
    + +
    test


    test
    +
    test


    test
    +
    test


    test
    + +
    test


    test
    +
    test


    test
    +
    test


    test
    + +
    test


    test
    +
    +
    
    +
    +
    \ No newline at end of file
    diff --git a/LayoutTests/fast/text-indicator/text-indicator-with-tiny-child-expected.txt b/LayoutTests/fast/text-indicator/text-indicator-with-tiny-child-expected.txt
    new file mode 100644
    index 000000000000..7aef01d0309a
    --- /dev/null
    +++ b/LayoutTests/fast/text-indicator/text-indicator-with-tiny-child-expected.txt
    @@ -0,0 +1,3 @@
    +
    +elementWithTinyChild: -2 -1 36 34
    +
    diff --git a/LayoutTests/fast/text-indicator/text-indicator-with-tiny-child.html b/LayoutTests/fast/text-indicator/text-indicator-with-tiny-child.html
    new file mode 100644
    index 000000000000..2334edf28bba
    --- /dev/null
    +++ b/LayoutTests/fast/text-indicator/text-indicator-with-tiny-child.html
    @@ -0,0 +1,43 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    
    +
    +
    \ No newline at end of file
    diff --git a/LayoutTests/fast/text/design-system-ui-10-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-10-expected-mismatch.html
    new file mode 100644
    index 000000000000..ad59baeac027
    --- /dev/null
    +++ b/LayoutTests/fast/text/design-system-ui-10-expected-mismatch.html
    @@ -0,0 +1,20 @@
    +
    +
    +
    +
    +
    +
    +
    +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-10.html b/LayoutTests/fast/text/design-system-ui-10.html new file mode 100644 index 000000000000..5f6a3eb6854c --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-10.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-11-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-11-expected-mismatch.html new file mode 100644 index 000000000000..253794a71164 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-11-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-11.html b/LayoutTests/fast/text/design-system-ui-11.html new file mode 100644 index 000000000000..b403a7c0e8be --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-11.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-12-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-12-expected-mismatch.html new file mode 100644 index 000000000000..253794a71164 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-12-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-12.html b/LayoutTests/fast/text/design-system-ui-12.html new file mode 100644 index 000000000000..2a396378f937 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-12.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-13-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-13-expected-mismatch.html new file mode 100644 index 000000000000..253794a71164 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-13-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-13.html b/LayoutTests/fast/text/design-system-ui-13.html new file mode 100644 index 000000000000..c6143915a05a --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-13.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-14-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-14-expected-mismatch.html new file mode 100644 index 000000000000..253794a71164 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-14-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-14.html b/LayoutTests/fast/text/design-system-ui-14.html new file mode 100644 index 000000000000..d5ca66bc19fb --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-14.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-15-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-15-expected-mismatch.html new file mode 100644 index 000000000000..253794a71164 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-15-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-15.html b/LayoutTests/fast/text/design-system-ui-15.html new file mode 100644 index 000000000000..2a6fffa03420 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-15.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-16-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-16-expected-mismatch.html new file mode 100644 index 000000000000..253794a71164 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-16-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-16.html b/LayoutTests/fast/text/design-system-ui-16.html new file mode 100644 index 000000000000..771d38dc4f6f --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-16.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-2-expected.html b/LayoutTests/fast/text/design-system-ui-2-expected.html new file mode 100644 index 000000000000..5adc3625db73 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-2-expected.html @@ -0,0 +1,21 @@ + + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is bold. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-2.html b/LayoutTests/fast/text/design-system-ui-2.html new file mode 100644 index 000000000000..77f66cdb3ec9 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-2.html @@ -0,0 +1,21 @@ + + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is bold. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-3-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-3-expected-mismatch.html new file mode 100644 index 000000000000..616138f6323a --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-3-expected-mismatch.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-3.html b/LayoutTests/fast/text/design-system-ui-3.html new file mode 100644 index 000000000000..c5334a692d1c --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-3.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-4-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-4-expected-mismatch.html new file mode 100644 index 000000000000..fc2e48acf160 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-4-expected-mismatch.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-4.html b/LayoutTests/fast/text/design-system-ui-4.html new file mode 100644 index 000000000000..837f2ba5dced --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-4.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-5-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-5-expected-mismatch.html new file mode 100644 index 000000000000..2186ce6a9900 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-5-expected-mismatch.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-5.html b/LayoutTests/fast/text/design-system-ui-5.html new file mode 100644 index 000000000000..cfa6faef6756 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-5.html @@ -0,0 +1,14 @@ + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-6-expected.html b/LayoutTests/fast/text/design-system-ui-6-expected.html new file mode 100644 index 000000000000..b6cdaed76c8f --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-6-expected.html @@ -0,0 +1,17 @@ + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is rendered in Times. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-6.html b/LayoutTests/fast/text/design-system-ui-6.html new file mode 100644 index 000000000000..12dabb65daf4 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-6.html @@ -0,0 +1,47 @@ + + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is rendered in Times. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-7-expected.html b/LayoutTests/fast/text/design-system-ui-7-expected.html new file mode 100644 index 000000000000..475387037c05 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-7-expected.html @@ -0,0 +1,51 @@ + + + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is bold. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-7.html b/LayoutTests/fast/text/design-system-ui-7.html new file mode 100644 index 000000000000..616d87d39715 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-7.html @@ -0,0 +1,51 @@ + + + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is bold. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-8-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-8-expected-mismatch.html new file mode 100644 index 000000000000..9e9804992340 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-8-expected-mismatch.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-8.html b/LayoutTests/fast/text/design-system-ui-8.html new file mode 100644 index 000000000000..49a1d1d1df48 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-8.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-9-expected-mismatch.html b/LayoutTests/fast/text/design-system-ui-9-expected-mismatch.html new file mode 100644 index 000000000000..e0fbf782d543 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-9-expected-mismatch.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-9.html b/LayoutTests/fast/text/design-system-ui-9.html new file mode 100644 index 000000000000..469eeb417cbf --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-9.html @@ -0,0 +1,20 @@ + + + + + + + +
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui-expected.html b/LayoutTests/fast/text/design-system-ui-expected.html new file mode 100644 index 000000000000..b6cdaed76c8f --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui-expected.html @@ -0,0 +1,17 @@ + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is rendered in Times. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/design-system-ui.html b/LayoutTests/fast/text/design-system-ui.html new file mode 100644 index 000000000000..40470c070dc7 --- /dev/null +++ b/LayoutTests/fast/text/design-system-ui.html @@ -0,0 +1,17 @@ + + + + + +This test makes sure that the design system UI fonts don't work unless the shouldAllowDesignSystemUIFonts preference is set. The test passes if all the text below is rendered in Times. +
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    HeJllo
    +
    + + diff --git a/LayoutTests/fast/text/emoji-variation-selector-expected-mismatch.html b/LayoutTests/fast/text/emoji-variation-selector-expected-mismatch.html new file mode 100644 index 000000000000..a777c9d9025b --- /dev/null +++ b/LayoutTests/fast/text/emoji-variation-selector-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + + + +
    ⚠︎
    + + diff --git a/LayoutTests/fast/text/emoji-variation-selector.html b/LayoutTests/fast/text/emoji-variation-selector.html new file mode 100644 index 000000000000..cc8e49f240ff --- /dev/null +++ b/LayoutTests/fast/text/emoji-variation-selector.html @@ -0,0 +1,10 @@ + + + + + + + +
    ⚠️
    + + diff --git a/LayoutTests/fast/text/first-letter-with-columns-crash-expected.txt b/LayoutTests/fast/text/first-letter-with-columns-crash-expected.txt new file mode 100644 index 000000000000..a6dc2c48af41 --- /dev/null +++ b/LayoutTests/fast/text/first-letter-with-columns-crash-expected.txt @@ -0,0 +1 @@ +First letter -PASS if no crash. diff --git a/LayoutTests/fast/text/first-letter-with-columns-crash.html b/LayoutTests/fast/text/first-letter-with-columns-crash.html new file mode 100644 index 000000000000..971b8fb83a56 --- /dev/null +++ b/LayoutTests/fast/text/first-letter-with-columns-crash.html @@ -0,0 +1,23 @@ + +First letter -PASS if no crash. + diff --git a/LayoutTests/fast/text/font-loading-global-keyword-expected.txt b/LayoutTests/fast/text/font-loading-global-keyword-expected.txt new file mode 100644 index 000000000000..80e3ab892f52 --- /dev/null +++ b/LayoutTests/fast/text/font-loading-global-keyword-expected.txt @@ -0,0 +1,45 @@ +This test ensure that global CSS keywords generate expected syntax errors. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS document.fonts.check('initial', 'A') threw exception SyntaxError: The string did not match the expected pattern.. +PASS document.fonts.check('inherited', 'A') threw exception SyntaxError: The string did not match the expected pattern.. +PASS document.fonts.check('unset', 'A') threw exception SyntaxError: The string did not match the expected pattern.. +PASS document.fonts.check('revert', 'A') threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'style': 'initial'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'style': 'inherited'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'style': 'unset'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'style': 'revert'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'weight': 'initial'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'weight': 'inherited'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'weight': 'unset'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'weight': 'revert'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'stretch': 'initial'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'stretch': 'inherited'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'stretch': 'unset'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'stretch': 'revert'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'unicodeRange': 'initial'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'unicodeRange': 'inherited'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'unicodeRange': 'unset'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'unicodeRange': 'revert'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'featureSettings': 'initial'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'featureSettings': 'inherited'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'featureSettings': 'unset'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'featureSettings': 'revert'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'display': 'initial'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'display': 'inherited'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'display': 'unset'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'url(asdf)', {'display': 'initial'}) threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'inherited') threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'unset') threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'revert') threw exception SyntaxError: The string did not match the expected pattern.. +PASS new FontFace('abc', 'revert') threw exception SyntaxError: The string did not match the expected pattern.. +PASS document.fonts.load('initial', 'A') rejected promise with SyntaxError: The string did not match the expected pattern.. +PASS document.fonts.load('inherited', 'A') rejected promise with SyntaxError: The string did not match the expected pattern.. +PASS document.fonts.load('unset', 'A') rejected promise with SyntaxError: The string did not match the expected pattern.. +PASS document.fonts.load('revert', 'A') rejected promise with SyntaxError: The string did not match the expected pattern.. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/text/font-loading-global-keyword.html b/LayoutTests/fast/text/font-loading-global-keyword.html new file mode 100644 index 000000000000..b21f69a242c1 --- /dev/null +++ b/LayoutTests/fast/text/font-loading-global-keyword.html @@ -0,0 +1,48 @@ + + + + + + + + + + diff --git a/LayoutTests/fast/text/international/system-language/composition-expected.txt b/LayoutTests/fast/text/international/system-language/composition-expected.txt new file mode 100644 index 000000000000..bd1befa7b80c --- /dev/null +++ b/LayoutTests/fast/text/international/system-language/composition-expected.txt @@ -0,0 +1,6 @@ +PASS target1.offsetWidth is target2.offsetWidth +PASS successfullyParsed is true + +TEST COMPLETE +ㄔˉㄔˉㄔˉㄔˉㄔˉㄔˉ +ㄔˉㄔˉㄔˉㄔˉㄔˉㄔˉ diff --git a/LayoutTests/fast/text/international/system-language/composition.html b/LayoutTests/fast/text/international/system-language/composition.html new file mode 100644 index 000000000000..69f47522a91a --- /dev/null +++ b/LayoutTests/fast/text/international/system-language/composition.html @@ -0,0 +1,16 @@ + + + + + + +
    ㄔˉㄔˉㄔˉㄔˉㄔˉㄔˉ
    +
    ㄔˉㄔˉㄔˉㄔˉㄔˉㄔˉ
    + + + + diff --git a/LayoutTests/fast/text/simple-line-layout-range-check-end-expected.txt b/LayoutTests/fast/text/simple-line-layout-range-check-end-expected.txt new file mode 100644 index 000000000000..03ad4614df19 --- /dev/null +++ b/LayoutTests/fast/text/simple-line-layout-range-check-end-expected.txt @@ -0,0 +1,3 @@ +Pass if no crash or assert. +text + diff --git a/LayoutTests/fast/text/simple-line-layout-range-check-end.html b/LayoutTests/fast/text/simple-line-layout-range-check-end.html new file mode 100644 index 000000000000..655d4c69a81c --- /dev/null +++ b/LayoutTests/fast/text/simple-line-layout-range-check-end.html @@ -0,0 +1,14 @@ +Pass if no crash or assert. +
    +
    +
    + diff --git a/LayoutTests/fast/text/user-installed-fonts/extended-character-expected.html b/LayoutTests/fast/text/user-installed-fonts/extended-character-expected.html new file mode 100644 index 000000000000..3d5f6fb306c7 --- /dev/null +++ b/LayoutTests/fast/text/user-installed-fonts/extended-character-expected.html @@ -0,0 +1,10 @@ + + + + + + + + 𑝀 + + diff --git a/LayoutTests/fast/text/user-installed-fonts/extended-character-with-user-font-expected-mismatch.html b/LayoutTests/fast/text/user-installed-fonts/extended-character-with-user-font-expected-mismatch.html new file mode 100644 index 000000000000..3d5f6fb306c7 --- /dev/null +++ b/LayoutTests/fast/text/user-installed-fonts/extended-character-with-user-font-expected-mismatch.html @@ -0,0 +1,10 @@ + + + + + + + + 𑝀 + + diff --git a/LayoutTests/fast/text/user-installed-fonts/extended-character-with-user-font.html b/LayoutTests/fast/text/user-installed-fonts/extended-character-with-user-font.html new file mode 100644 index 000000000000..94d169998961 --- /dev/null +++ b/LayoutTests/fast/text/user-installed-fonts/extended-character-with-user-font.html @@ -0,0 +1,16 @@ + + + + + + + + + 𑜡 + + diff --git a/LayoutTests/fast/text/user-installed-fonts/extended-character.html b/LayoutTests/fast/text/user-installed-fonts/extended-character.html new file mode 100644 index 000000000000..f67badbb3ed0 --- /dev/null +++ b/LayoutTests/fast/text/user-installed-fonts/extended-character.html @@ -0,0 +1,18 @@ + + + + + + + + + 𑜡 + + diff --git a/LayoutTests/fast/url/data-url-large-expected.txt b/LayoutTests/fast/url/data-url-large-expected.txt new file mode 100644 index 000000000000..8db49342f166 --- /dev/null +++ b/LayoutTests/fast/url/data-url-large-expected.txt @@ -0,0 +1,5 @@ +PASS Large URL handled properly. +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/url/data-url-large.html b/LayoutTests/fast/url/data-url-large.html new file mode 100644 index 000000000000..5400eea02a94 --- /dev/null +++ b/LayoutTests/fast/url/data-url-large.html @@ -0,0 +1,22 @@ + + + + + + + diff --git a/LayoutTests/fast/viewport/ios/non-responsive-viewport-after-changing-view-scale-expected.txt b/LayoutTests/fast/viewport/ios/non-responsive-viewport-after-changing-view-scale-expected.txt new file mode 100644 index 000000000000..f2f1d13c0490 --- /dev/null +++ b/LayoutTests/fast/viewport/ios/non-responsive-viewport-after-changing-view-scale-expected.txt @@ -0,0 +1,17 @@ +setViewScale(1.00) +window size: [980, 1678] +zoom scale: 0.33 + +setViewScale(0.50) +window size: [1960, 3357] +zoom scale: 0.16 + +setViewScale(2.00) +window size: [490, 839] +zoom scale: 0.65 + +setViewScale(1.00) +window size: [980, 1678] +zoom scale: 0.33 + + diff --git a/LayoutTests/fast/viewport/ios/non-responsive-viewport-after-changing-view-scale.html b/LayoutTests/fast/viewport/ios/non-responsive-viewport-after-changing-view-scale.html new file mode 100644 index 000000000000..1f9e4b33591d --- /dev/null +++ b/LayoutTests/fast/viewport/ios/non-responsive-viewport-after-changing-view-scale.html @@ -0,0 +1,54 @@ + + + + + + + + + +
    +
    
    +
    +
    diff --git a/LayoutTests/fast/viewport/ios/responsive-viewport-with-minimum-width-after-changing-view-scale-expected.txt b/LayoutTests/fast/viewport/ios/responsive-viewport-with-minimum-width-after-changing-view-scale-expected.txt
    new file mode 100644
    index 000000000000..852d9cd232f5
    --- /dev/null
    +++ b/LayoutTests/fast/viewport/ios/responsive-viewport-with-minimum-width-after-changing-view-scale-expected.txt
    @@ -0,0 +1,17 @@
    +setViewScale(1.00)
    +window size: [320, 548]
    +zoom scale: 1.00
    +
    +setViewScale(2.00)
    +window size: [160, 274]
    +zoom scale: 2.00
    +
    +setViewScale(2.50)
    +window size: [128, 219]
    +zoom scale: 2.50
    +
    +setViewScale(1.00)
    +window size: [320, 548]
    +zoom scale: 1.00
    +
    +
    diff --git a/LayoutTests/fast/viewport/ios/responsive-viewport-with-minimum-width-after-changing-view-scale.html b/LayoutTests/fast/viewport/ios/responsive-viewport-with-minimum-width-after-changing-view-scale.html
    new file mode 100644
    index 000000000000..0448be705bec
    --- /dev/null
    +++ b/LayoutTests/fast/viewport/ios/responsive-viewport-with-minimum-width-after-changing-view-scale.html
    @@ -0,0 +1,55 @@
    + 
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +    
    +
    
    +
    +
    diff --git a/LayoutTests/fast/viewport/ios/shrink-to-fit-content-large-constant-width-expected.txt b/LayoutTests/fast/viewport/ios/shrink-to-fit-content-large-constant-width-expected.txt
    new file mode 100644
    index 000000000000..f106291ee552
    --- /dev/null
    +++ b/LayoutTests/fast/viewport/ios/shrink-to-fit-content-large-constant-width-expected.txt
    @@ -0,0 +1,11 @@
    +This test verifies that a page with a constant width viewport smaller than the actual view width is scaled to fit the view. To test manually, load the page and verify that the bar spans the full width of the page.
    +
    +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
    +
    +
    +PASS minScale is expectedScale
    +PASS innerWidth is 1000
    +PASS successfullyParsed is true
    +
    +TEST COMPLETE
    +
    diff --git a/LayoutTests/fast/viewport/ios/shrink-to-fit-content-large-constant-width.html b/LayoutTests/fast/viewport/ios/shrink-to-fit-content-large-constant-width.html
    new file mode 100644
    index 000000000000..b588d33a683a
    --- /dev/null
    +++ b/LayoutTests/fast/viewport/ios/shrink-to-fit-content-large-constant-width.html
    @@ -0,0 +1,45 @@
    + 
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/fast/viewport/ios/shrink-to-fit-large-content-width-expected.txt b/LayoutTests/fast/viewport/ios/shrink-to-fit-large-content-width-expected.txt new file mode 100644 index 000000000000..085740de2746 --- /dev/null +++ b/LayoutTests/fast/viewport/ios/shrink-to-fit-large-content-width-expected.txt @@ -0,0 +1,10 @@ +This test verifies that a page with a constant width viewport and a very large content width, the page is scaled such that the constant viewport width spans the width of the viewport. To test manually, load the page and verify that only the top bar spans the full width of the page. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS innerWidth is 1000 +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/fast/viewport/ios/shrink-to-fit-large-content-width.html b/LayoutTests/fast/viewport/ios/shrink-to-fit-large-content-width.html new file mode 100644 index 000000000000..caba6ab5b16a --- /dev/null +++ b/LayoutTests/fast/viewport/ios/shrink-to-fit-large-content-width.html @@ -0,0 +1,49 @@ + + + + + + + + + + +
    +
    +
    + + diff --git a/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-expected.txt b/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-expected.txt index e88ccf0fb702..fa08671d52eb 100644 --- a/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-expected.txt +++ b/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-expected.txt @@ -18,6 +18,7 @@ (min layout viewport origin (0,0)) (max layout viewport origin (1223,1436)) (behavior for fixed 0) + (visual viewport smaller than layout viewport 1) (children 4 (Fixed node (anchor edges: AnchorEdgeLeft AnchorEdgeTop) diff --git a/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-then-up-expected.txt b/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-then-up-expected.txt index 38f3fdf79db7..2aebecefe777 100644 --- a/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-then-up-expected.txt +++ b/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolled-down-then-up-expected.txt @@ -18,6 +18,7 @@ (min layout viewport origin (0,0)) (max layout viewport origin (1223,1436)) (behavior for fixed 0) + (visual viewport smaller than layout viewport 1) (children 4 (Fixed node (anchor edges: AnchorEdgeLeft AnchorEdgeTop) diff --git a/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolling-layers-state-expected.txt b/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolling-layers-state-expected.txt index 21250df1fbd9..537925fd8d75 100644 --- a/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolling-layers-state-expected.txt +++ b/LayoutTests/fast/visual-viewport/tiled-drawing/zoomed-fixed-scrolling-layers-state-expected.txt @@ -15,6 +15,7 @@ (min layout viewport origin (0,0)) (max layout viewport origin (1223,1436)) (behavior for fixed 0) + (visual viewport smaller than layout viewport 1) (children 4 (Fixed node (anchor edges: AnchorEdgeLeft AnchorEdgeTop) diff --git a/LayoutTests/fullscreen/full-screen-request-removed-with-raf-expected.txt b/LayoutTests/fullscreen/full-screen-request-removed-with-raf-expected.txt new file mode 100644 index 000000000000..aa1c7147ae4d --- /dev/null +++ b/LayoutTests/fullscreen/full-screen-request-removed-with-raf-expected.txt @@ -0,0 +1,7 @@ +Tests that fullscreen is not entered if the fullscreen element ancestor is removed with rAF while entering fullscreen. + +Removed child element. + +SUCCESS +END OF TEST + diff --git a/LayoutTests/fullscreen/full-screen-request-removed-with-raf.html b/LayoutTests/fullscreen/full-screen-request-removed-with-raf.html new file mode 100644 index 000000000000..f1a1d0888ac5 --- /dev/null +++ b/LayoutTests/fullscreen/full-screen-request-removed-with-raf.html @@ -0,0 +1,43 @@ + + + + +

    Tests that fullscreen is not entered if the fullscreen element ancestor is removed with rAF while entering fullscreen.

    + +
    + Fullscreen target! +
    + diff --git a/LayoutTests/fullscreen/fullscreen-restore-scroll-position-expected.txt b/LayoutTests/fullscreen/fullscreen-restore-scroll-position-expected.txt new file mode 100644 index 000000000000..692fca257edc --- /dev/null +++ b/LayoutTests/fullscreen/fullscreen-restore-scroll-position-expected.txt @@ -0,0 +1,6 @@ +This tests that page scroll is restored after fullscreen. Press any key to start the test. + + +EVENT(load) +EXPECTED ((document.scrollingElement.scrollTop === originalScroll) == 'true') OK + diff --git a/LayoutTests/fullscreen/fullscreen-restore-scroll-position.html b/LayoutTests/fullscreen/fullscreen-restore-scroll-position.html new file mode 100644 index 000000000000..07ab44f630cc --- /dev/null +++ b/LayoutTests/fullscreen/fullscreen-restore-scroll-position.html @@ -0,0 +1,61 @@ + + + + fullscreen-restore-scroll-position + + + + + + +

    This tests that page scroll is restored after fullscreen. Press any key to start the test.

    +
    +
    +
    + + diff --git a/LayoutTests/http/conf/flatpak-httpd.conf b/LayoutTests/http/conf/flatpak-httpd.conf index c04c4ef31955..3c03e4239c24 100644 --- a/LayoutTests/http/conf/flatpak-httpd.conf +++ b/LayoutTests/http/conf/flatpak-httpd.conf @@ -33,6 +33,9 @@ LoadModule log_config_module modules/mod_log_config.so LoadModule ssl_module modules/mod_ssl.so LoadModule php7_module modules/libphp7.so LoadModule asis_module modules/mod_asis.so +LoadModule env_module modules/mod_env.so + +SetEnv PERL5LIB /app/lib/perl ServerName 127.0.0.1 diff --git a/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation-expected.txt b/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation-expected.txt index 32368b0ad787..7ae41e53e3ad 100644 --- a/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation-expected.txt +++ b/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation-expected.txt @@ -1,14 +1,14 @@ -CONSOLE MESSAGE: line 165: adcampaignid must have a non-negative value less than or equal to 63 for Ad Click Attribution. -CONSOLE MESSAGE: line 165: adcampaignid must have a non-negative value less than or equal to 63 for Ad Click Attribution. -CONSOLE MESSAGE: line 165: adcampaignid can not be converted to a non-negative integer which is required for Ad Click Attribution. -CONSOLE MESSAGE: line 165: adcampaignid can not be converted to a non-negative integer which is required for Ad Click Attribution. -CONSOLE MESSAGE: line 165: adcampaignid can not be converted to a non-negative integer which is required for Ad Click Attribution. -CONSOLE MESSAGE: line 165: addestination could not be converted to a valid HTTP-family URL. -CONSOLE MESSAGE: line 165: addestination could not be converted to a valid HTTP-family URL. -CONSOLE MESSAGE: line 165: addestination could not be converted to a valid HTTP-family URL. -CONSOLE MESSAGE: line 165: Both adcampaignid and addestination need to be set for Ad Click Attribution to work. -CONSOLE MESSAGE: line 165: Both adcampaignid and addestination need to be set for Ad Click Attribution to work. -CONSOLE MESSAGE: line 165: addestination can not be the same site as the current website. +CONSOLE MESSAGE: line 192: adcampaignid must have a non-negative value less than or equal to 63 for Ad Click Attribution. +CONSOLE MESSAGE: line 192: adcampaignid must have a non-negative value less than or equal to 63 for Ad Click Attribution. +CONSOLE MESSAGE: line 192: adcampaignid can not be converted to a non-negative integer which is required for Ad Click Attribution. +CONSOLE MESSAGE: line 192: adcampaignid can not be converted to a non-negative integer which is required for Ad Click Attribution. +CONSOLE MESSAGE: line 192: adcampaignid can not be converted to a non-negative integer which is required for Ad Click Attribution. +CONSOLE MESSAGE: line 192: addestination could not be converted to a valid HTTP-family URL. +CONSOLE MESSAGE: line 192: addestination could not be converted to a valid HTTP-family URL. +CONSOLE MESSAGE: line 192: addestination could not be converted to a valid HTTP-family URL. +CONSOLE MESSAGE: line 192: Both adcampaignid and addestination need to be set for Ad Click Attribution to work. +CONSOLE MESSAGE: line 192: Both adcampaignid and addestination need to be set for Ad Click Attribution to work. +CONSOLE MESSAGE: line 192: addestination can not be the same site as the current website. Test for validity of ad click attribution attributes on anchor tags. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". diff --git a/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation.html b/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation.html index 8324309d4abf..79b9c496f354 100644 --- a/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation.html +++ b/LayoutTests/http/tests/adClickAttribution/anchor-tag-attributes-validation.html @@ -25,10 +25,7 @@ } function activateElement(elementID, callback) { - var element = document.getElementById(elementID); - var centerX = element.offsetLeft + element.offsetWidth / 2; - var centerY = element.offsetTop + element.offsetHeight / 2; - UIHelper.activateAt(centerX, centerY).then( + UIHelper.activateElementAtHumanSpeed(document.getElementById(elementID)).then( function () { callback(); }, diff --git a/LayoutTests/http/tests/blink/sendbeacon/beacon-cross-origin-expected.txt b/LayoutTests/http/tests/blink/sendbeacon/beacon-cross-origin-expected.txt index 76c01a5e9bca..a899827895b3 100644 --- a/LayoutTests/http/tests/blink/sendbeacon/beacon-cross-origin-expected.txt +++ b/LayoutTests/http/tests/blink/sendbeacon/beacon-cross-origin-expected.txt @@ -7,7 +7,7 @@ PASS navigator.sendBeacon("http://localhost:8000/blink/sendbeacon/resources/save PASS Beacon sent successfully PASS Content-Type: text/plain;charset=UTF-8 PASS Origin: http://127.0.0.1:8000 -PASS Referer: http://127.0.0.1:8000/blink/sendbeacon/beacon-cross-origin.html +PASS Referer: http://127.0.0.1:8000/ PASS Request-Method: POST PASS Length: 11 PASS Body: CrossOrigin diff --git a/LayoutTests/http/tests/contentextensions/resources/fetch-worker.js b/LayoutTests/http/tests/contentextensions/resources/fetch-worker.js new file mode 100644 index 000000000000..586965d7ca52 --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/resources/fetch-worker.js @@ -0,0 +1,11 @@ +self.addEventListener("message", (event) => { + fetch("/resources/dummy.js").then(() => { + event.source.postMessage("FAIL - should have blocked dummy.js"); + }).catch(() => { + fetch("/resources/dummy.css").then(() => { + event.source.postMessage("PASS - blocked dummy.js, allowed dummy.css"); + }).catch(() => { + event.source.postMessage("FAIL - should have allowed dummy.css"); + }); + }); +}); diff --git a/LayoutTests/http/tests/contentextensions/resources/serviceworkertest.js b/LayoutTests/http/tests/contentextensions/resources/serviceworkertest.js new file mode 100644 index 000000000000..def3c96cfd77 --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/resources/serviceworkertest.js @@ -0,0 +1,44 @@ +if (window.testRunner) { + testRunner.dumpAsText(); + testRunner.waitUntilDone(); +} + +function testServiceWorker() { + navigator.serviceWorker.addEventListener("message", function(event) { + alert("Message from worker: " + event.data); + if (window.testRunner) + testRunner.notifyDone(); + }); + + try { + navigator.serviceWorker.register('resources/fetch-worker.js').then(function(reg) { + worker = reg.installing ? reg.installing : reg.active; + worker.postMessage("Hello from the web page"); + }).catch(function(error) { + alert("Registration failed with: " + error); + if (window.testRunner) + testRunner.notifyDone(); + }); + } catch(e) { + alert("Exception: " + e); + if (window.testRunner) + testRunner.notifyDone(); + } +} + +function test() { + fetch("/resources/dummy.js").then(() => { + alert("FAIL - should have blocked request to dummy.js"); + if (window.testRunner) + testRunner.notifyDone(); + }).catch(() => { + alert("PASS - blocked request to dummy.js"); + fetch("/resources/dummy.css").then(() => { + testServiceWorker(); + }).catch(() => { + alert("FAIL - should have allowed request to dummy.css"); + if (window.testRunner) + testRunner.notifyDone(); + }); + }); +} diff --git a/LayoutTests/http/tests/contentextensions/service-worker.https-expected.txt b/LayoutTests/http/tests/contentextensions/service-worker.https-expected.txt new file mode 100644 index 000000000000..f989b79d1150 --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/service-worker.https-expected.txt @@ -0,0 +1,6 @@ +CONSOLE MESSAGE: line 30: Content blocker prevented frame displaying https://127.0.0.1:8443/contentextensions/service-worker.https.html from loading a resource from https://127.0.0.1:8443/resources/dummy.js +CONSOLE MESSAGE: line 30: Resource blocked by content blocker +CONSOLE MESSAGE: line 30: Fetch API cannot load https://127.0.0.1:8443/resources/dummy.js due to access control checks. +ALERT: PASS - blocked request to dummy.js +ALERT: Message from worker: PASS - blocked dummy.js, allowed dummy.css + diff --git a/LayoutTests/http/tests/contentextensions/service-worker.https.html b/LayoutTests/http/tests/contentextensions/service-worker.https.html new file mode 100644 index 000000000000..58a23fc92dea --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/service-worker.https.html @@ -0,0 +1,4 @@ + + + + diff --git a/LayoutTests/http/tests/contentextensions/service-worker.https.html.json b/LayoutTests/http/tests/contentextensions/service-worker.https.html.json new file mode 100644 index 000000000000..c9dd46a708ef --- /dev/null +++ b/LayoutTests/http/tests/contentextensions/service-worker.https.html.json @@ -0,0 +1,10 @@ +[ + { + "action": { + "type": "block" + }, + "trigger": { + "url-filter": "dummy.js" + } + } +] diff --git a/LayoutTests/http/tests/dom/ready-state-on-javascript-replace-expected.txt b/LayoutTests/http/tests/dom/ready-state-on-javascript-replace-expected.txt new file mode 100644 index 000000000000..33fa5bb03a93 --- /dev/null +++ b/LayoutTests/http/tests/dom/ready-state-on-javascript-replace-expected.txt @@ -0,0 +1,3 @@ +This test makes sure an iframe whose document is being closed to be replaced by a javascript: url doesn't fire a readystatechange event. +You should see no alerts. + diff --git a/LayoutTests/http/tests/dom/ready-state-on-javascript-replace.html b/LayoutTests/http/tests/dom/ready-state-on-javascript-replace.html new file mode 100644 index 000000000000..5cf5e147e521 --- /dev/null +++ b/LayoutTests/http/tests/dom/ready-state-on-javascript-replace.html @@ -0,0 +1,26 @@ + + +This test makes sure an iframe whose document is being closed to be replaced by a javascript: url doesn't fire a readystatechange event.
    +You should see no alerts.
    + \ No newline at end of file diff --git a/LayoutTests/http/tests/events/touch/ios/click-after-handling-touch-in-cross-origin-frame.https-expected.txt b/LayoutTests/http/tests/events/touch/ios/click-after-handling-touch-in-cross-origin-frame.https-expected.txt new file mode 100644 index 000000000000..907e67ccafed --- /dev/null +++ b/LayoutTests/http/tests/events/touch/ios/click-after-handling-touch-in-cross-origin-frame.https-expected.txt @@ -0,0 +1,14 @@ +This test verifies that tap in the top document is recognized as a click after touching inside a cross-origin subframe. To manually test, touch anywhere in the top iframe, and then tap the green box on the bottom. The text 'Clicked' should appear. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS touchend +PASS Clicked +PASS successfullyParsed is true + +TEST COMPLETE + +Then click here. +Clicked + diff --git a/LayoutTests/http/tests/events/touch/ios/click-after-handling-touch-in-cross-origin-frame.https.html b/LayoutTests/http/tests/events/touch/ios/click-after-handling-touch-in-cross-origin-frame.https.html new file mode 100644 index 000000000000..5462e148a439 --- /dev/null +++ b/LayoutTests/http/tests/events/touch/ios/click-after-handling-touch-in-cross-origin-frame.https.html @@ -0,0 +1,57 @@ + + + + + + + + + + +

    + +
    Then click here.
    +
    
    +    
    
    +
    +
    \ No newline at end of file
    diff --git a/LayoutTests/http/tests/events/touch/ios/resources/touch-target.html b/LayoutTests/http/tests/events/touch/ios/resources/touch-target.html
    new file mode 100644
    index 000000000000..9452528ada1e
    --- /dev/null
    +++ b/LayoutTests/http/tests/events/touch/ios/resources/touch-target.html
    @@ -0,0 +1,15 @@
    +
    +
    +
    Touch this element.
    + diff --git a/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache-expected.txt b/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache-expected.txt index 8ee27104e27b..086ca68ff2ac 100644 --- a/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache-expected.txt +++ b/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache-expected.txt @@ -8,13 +8,13 @@ Test for Resource size values (transfer size, decoded size, header size, request PASS: statusCode should be 200. PASS: compressed should be false. PASS: responseSource should be Symbol(disk-cache). -PASS: estimatedNetworkEncodedSize should be exactly 0 bytes. +size: 12940 +requestBodyTransferSize: 0 +responseBodyTransferSize: 0 +estimatedNetworkEncodedSize: 0 +networkEncodedSize: 0 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 12940 bytes. -PASS: networkEncodedSize should be exactly 0 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 0 bytes. -PASS: responseBodyTransferSize should be exactly 0 bytes. PASS: requestHeadersTransferSize should be empty. PASS: responseHeadersTransferSize should be empty. diff --git a/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache.html b/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache.html index f3596bf7c41c..7948cb7cee75 100644 --- a/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache.html +++ b/LayoutTests/http/tests/inspector/network/resource-sizes-disk-cache.html @@ -38,9 +38,6 @@ compressed: false, responseSource: WI.Resource.ResponseSource.DiskCache, headers: false, - requestBodyTransferSize: 0, - responseBodyTransferSize: 0, - size: 12940, }); suite.runTestCasesAndFinish(); diff --git a/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache-expected.txt b/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache-expected.txt index 1623ba6ab1f4..363990c6baf8 100644 --- a/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache-expected.txt +++ b/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache-expected.txt @@ -6,13 +6,13 @@ Test for Resource size values (transfer size, decoded size, header size, request PASS: statusCode should be 304. PASS: compressed should be false. PASS: responseSource should be Symbol(memory-cache). -PASS: estimatedNetworkEncodedSize should be exactly 0 bytes. +size: 27 +requestBodyTransferSize: 0 +responseBodyTransferSize: 0 +estimatedNetworkEncodedSize: 0 +networkEncodedSize: 0 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 27 bytes. -PASS: networkEncodedSize should be exactly 0 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 0 bytes. -PASS: responseBodyTransferSize should be exactly 0 bytes. PASS: requestHeadersTransferSize should be non-empty. PASS: responseHeadersTransferSize should be non-empty. diff --git a/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache.html b/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache.html index d4290170200f..fc1d517a39e1 100644 --- a/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache.html +++ b/LayoutTests/http/tests/inspector/network/resource-sizes-memory-cache.html @@ -19,9 +19,6 @@ compressed: false, responseSource: WI.Resource.ResponseSource.MemoryCache, headers: true, - requestBodyTransferSize: 0, - responseBodyTransferSize: 0, - size: 27, resourceLoader() { const ignoreCache = false; const revalidateAllResources = true; diff --git a/LayoutTests/http/tests/inspector/network/resource-sizes-network-expected.txt b/LayoutTests/http/tests/inspector/network/resource-sizes-network-expected.txt index a00e044bf996..c41e67c814d6 100644 --- a/LayoutTests/http/tests/inspector/network/resource-sizes-network-expected.txt +++ b/LayoutTests/http/tests/inspector/network/resource-sizes-network-expected.txt @@ -6,13 +6,27 @@ Test for Resource size values (transfer size, decoded size, header size, request PASS: statusCode should be 200. PASS: compressed should be false. PASS: responseSource should be Symbol(network). -PASS: estimatedNetworkEncodedSize should be exactly 2955 bytes. +size: 2955 +requestBodyTransferSize: 0 +responseBodyTransferSize: 2955 +estimatedNetworkEncodedSize: 2955 +networkEncodedSize: 2955 +PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +PASS: networkTotalTransferSize should be >= (encoded body size + headers). +PASS: requestHeadersTransferSize should be non-empty. +PASS: responseHeadersTransferSize should be non-empty. + +-- Running test case: Resource.Size.Network.text.empty +PASS: statusCode should be 200. +PASS: compressed should be false. +PASS: responseSource should be Symbol(network). +size: 0 +requestBodyTransferSize: 0 +responseBodyTransferSize: 0 +estimatedNetworkEncodedSize: 0 +networkEncodedSize: 0 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 2955 bytes. -PASS: networkEncodedSize should be exactly 2955 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 0 bytes. -PASS: responseBodyTransferSize should be exactly 2955 bytes. PASS: requestHeadersTransferSize should be non-empty. PASS: responseHeadersTransferSize should be non-empty. @@ -20,13 +34,13 @@ PASS: responseHeadersTransferSize should be non-empty. PASS: statusCode should be 200. PASS: compressed should be true. PASS: responseSource should be Symbol(network). -PASS: estimatedNetworkEncodedSize should be exactly 1229 bytes. +size: 2955 +requestBodyTransferSize: 0 +responseBodyTransferSize: 1229 +estimatedNetworkEncodedSize: 1229 +networkEncodedSize: 1229 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 2955 bytes. -PASS: networkEncodedSize should be exactly 1229 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 0 bytes. -PASS: responseBodyTransferSize should be exactly 1229 bytes. PASS: requestHeadersTransferSize should be non-empty. PASS: responseHeadersTransferSize should be non-empty. @@ -34,13 +48,13 @@ PASS: responseHeadersTransferSize should be non-empty. PASS: statusCode should be 200. PASS: compressed should be true. PASS: responseSource should be Symbol(network). -PASS: estimatedNetworkEncodedSize should be exactly 1229 bytes. +size: 2955 +requestBodyTransferSize: 0 +responseBodyTransferSize: 1229 +estimatedNetworkEncodedSize: 1229 +networkEncodedSize: 1229 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 2955 bytes. -PASS: networkEncodedSize should be exactly 1229 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 0 bytes. -PASS: responseBodyTransferSize should be exactly 1229 bytes. PASS: requestHeadersTransferSize should be non-empty. PASS: responseHeadersTransferSize should be non-empty. @@ -48,13 +62,13 @@ PASS: responseHeadersTransferSize should be non-empty. PASS: statusCode should be 200. PASS: compressed should be false. PASS: responseSource should be Symbol(network). -PASS: estimatedNetworkEncodedSize should be exactly 12940 bytes. +size: 12940 +requestBodyTransferSize: 0 +responseBodyTransferSize: 12940 +estimatedNetworkEncodedSize: 12940 +networkEncodedSize: 12940 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 12940 bytes. -PASS: networkEncodedSize should be exactly 12940 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 0 bytes. -PASS: responseBodyTransferSize should be exactly 12940 bytes. PASS: requestHeadersTransferSize should be non-empty. PASS: responseHeadersTransferSize should be non-empty. @@ -62,13 +76,13 @@ PASS: responseHeadersTransferSize should be non-empty. PASS: statusCode should be 404. PASS: compressed should be false. PASS: responseSource should be Symbol(network). -PASS: estimatedNetworkEncodedSize should be exactly 512 bytes. +size: 512 +requestBodyTransferSize: 0 +responseBodyTransferSize: 512 +estimatedNetworkEncodedSize: 512 +networkEncodedSize: 512 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 512 bytes. -PASS: networkEncodedSize should be exactly 512 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 0 bytes. -PASS: responseBodyTransferSize should be exactly 512 bytes. PASS: requestHeadersTransferSize should be non-empty. PASS: responseHeadersTransferSize should be non-empty. @@ -76,13 +90,13 @@ PASS: responseHeadersTransferSize should be non-empty. PASS: statusCode should be 200. PASS: compressed should be false. PASS: responseSource should be Symbol(network). -PASS: estimatedNetworkEncodedSize should be exactly 28 bytes. +size: 28 +requestBodyTransferSize: 1027 +responseBodyTransferSize: 28 +estimatedNetworkEncodedSize: 28 +networkEncodedSize: 28 PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). -PASS: size should be exactly 28 bytes. -PASS: networkEncodedSize should be exactly 28 bytes. PASS: networkTotalTransferSize should be >= (encoded body size + headers). -PASS: requestBodyTransferSize should be exactly 1027 bytes. -PASS: responseBodyTransferSize should be exactly 28 bytes. PASS: requestHeadersTransferSize should be non-empty. PASS: responseHeadersTransferSize should be non-empty. PASS: requestHeadersTransferSize should be > 1060 bytes. diff --git a/LayoutTests/http/tests/inspector/network/resource-sizes-network.html b/LayoutTests/http/tests/inspector/network/resource-sizes-network.html index f9f269045caf..f5a59cbb0725 100644 --- a/LayoutTests/http/tests/inspector/network/resource-sizes-network.html +++ b/LayoutTests/http/tests/inspector/network/resource-sizes-network.html @@ -37,22 +37,16 @@ compressed: false, responseSource: WI.Resource.ResponseSource.Network, headers: true, - requestBodyTransferSize: 0, - responseBodyTransferSize: 2955, - size: 2955, }); addResourceSizeTest(suite, { - name: "Resource.Size.Network.text", + name: "Resource.Size.Network.text.empty", description: "Sizes of an empty text resource", url: "resources/empty.txt?" + Math.random(), statusCode: 200, compressed: false, responseSource: WI.Resource.ResponseSource.Network, headers: true, - requestBodyTransferSize: 0, - responseBodyTransferSize: 0, - size: 0, }); addResourceSizeTest(suite, { @@ -63,9 +57,6 @@ compressed: true, responseSource: WI.Resource.ResponseSource.Network, headers: true, - requestBodyTransferSize: 0, - responseBodyTransferSize: 1229, - size: 2955, }); addResourceSizeTest(suite, { @@ -76,9 +67,6 @@ compressed: true, responseSource: WI.Resource.ResponseSource.Network, headers: true, - requestBodyTransferSize: 0, - responseBodyTransferSize: 1229, - size: 2955, }); addResourceSizeTest(suite, { @@ -89,9 +77,6 @@ compressed: false, responseSource: WI.Resource.ResponseSource.Network, headers: true, - requestBodyTransferSize: 0, - responseBodyTransferSize: 12940, - size: 12940, }); addResourceSizeTest(suite, { @@ -102,9 +87,6 @@ compressed: false, responseSource: WI.Resource.ResponseSource.Network, headers: true, - requestBodyTransferSize: 0, - responseBodyTransferSize: 512, - size: 512, }); addResourceSizeTest(suite, { @@ -114,9 +96,6 @@ compressed: false, responseSource: WI.Resource.ResponseSource.Network, headers: true, - requestBodyTransferSize: 1027, - responseBodyTransferSize: 28, - size: 28, resourceLoader() { InspectorTest.evaluateInPage(`triggerNetworkLoadWithRequestData()`); return Promise.all([ diff --git a/LayoutTests/http/tests/inspector/network/resources/resource-size-test.js b/LayoutTests/http/tests/inspector/network/resources/resource-size-test.js index 75d07739f8d7..f0fcb2940853 100644 --- a/LayoutTests/http/tests/inspector/network/resources/resource-size-test.js +++ b/LayoutTests/http/tests/inspector/network/resources/resource-size-test.js @@ -29,7 +29,7 @@ TestPage.registerInitializer(function() { // - requestBodyTransferSize, responseBodyTransferSize: exact body transfer sizes // - size: exact decoded body size whether or not there was anything transferred // - extraChecks: extra checks to perform - window.addResourceSizeTest = function(suite, {name, description, debug, url, statusCode, compressed, responseSource, headers, requestBodyTransferSize, responseBodyTransferSize, size, resourceLoader, extraChecks}) { + window.addResourceSizeTest = function(suite, {name, description, debug, url, statusCode, compressed, responseSource, headers, resourceLoader, extraChecks}) { suite.addTestCase({ name, description, test(resolve, reject) { @@ -41,7 +41,10 @@ TestPage.registerInitializer(function() { promise = Promise.all([ WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded), WI.Resource.awaitEvent(WI.Resource.Event.LoadingDidFinish), - ]).then(([resourceWasAddedEvent, loadCompleteEvent]) => { + WI.Resource.awaitEvent(WI.Resource.Event.MetricsDidChange), + WI.Resource.awaitEvent(WI.Resource.Event.SizeDidChange), + WI.Resource.awaitEvent(WI.Resource.Event.TransferSizeDidChange), + ]).then(([resourceWasAddedEvent]) => { return resourceWasAddedEvent.data.resource; }); } @@ -56,31 +59,23 @@ TestPage.registerInitializer(function() { InspectorTest.log("----"); InspectorTest.log("resource.requestHeadersTransferSize: " + resource.requestHeadersTransferSize); InspectorTest.log("resource.responseHeadersTransferSize: " + resource.responseHeadersTransferSize); - InspectorTest.log("resource.requestBodyTransferSize: " + resource.requestBodyTransferSize); - InspectorTest.log("resource.responseBodyTransferSize: " + resource.responseBodyTransferSize); InspectorTest.log("resource.cachedResponseBodySize: " + resource.cachedResponseBodySize); - InspectorTest.log("----"); - InspectorTest.log("resource.size: " + resource.size); - InspectorTest.log("resource.networkEncodedSize: " + resource.networkEncodedSize); InspectorTest.log("resource.networkDecodedSize: " + resource.networkDecodedSize); - InspectorTest.log("resource.networkTotalTransferSize: " + resource.networkTotalTransferSize); - InspectorTest.log("resource.estimatedNetworkEncodedSize: " + resource.estimatedNetworkEncodedSize); InspectorTest.log("resource.estimatedTotalTransferSize: " + resource.estimatedTotalTransferSize); + InspectorTest.log("resource.networkTotalTransferSize: " + resource.networkTotalTransferSize); InspectorTest.log("----"); } - // Calculated values. Try to be graceful, if the size is expected to be zero but is non-zero don't log the actual value. - InspectorTest.gracefulExpectEquals(resource.estimatedNetworkEncodedSize, responseBodyTransferSize, "estimatedNetworkEncodedSize", `estimatedNetworkEncodedSize should be exactly ${responseBodyTransferSize} bytes.`); - InspectorTest.expectGreaterThanOrEqual(resource.estimatedTotalTransferSize, responseBodyTransferSize + (headers ? minimumHeadersSize : 0), `estimatedTotalTransferSize should be >= (encoded body size + headers).`); + InspectorTest.log("size: " + resource.size); + + InspectorTest.log("requestBodyTransferSize: " + resource.requestBodyTransferSize); + InspectorTest.log("responseBodyTransferSize: " + resource.responseBodyTransferSize); - // Exact decoded size should always be available. - InspectorTest.gracefulExpectEquals(resource.size, size, "size", `size should be exactly ${size} bytes.`); + InspectorTest.log("estimatedNetworkEncodedSize: " + resource.estimatedNetworkEncodedSize); + InspectorTest.log("networkEncodedSize: " + resource.networkEncodedSize); - // Exact transfer sizes if available. - InspectorTest.expectEqual(resource.networkEncodedSize, responseBodyTransferSize, `networkEncodedSize should be exactly ${responseBodyTransferSize} bytes.`); - InspectorTest.expectGreaterThanOrEqual(resource.networkTotalTransferSize, responseBodyTransferSize + (headers ? minimumHeadersSize : 0), `networkTotalTransferSize should be >= (encoded body size + headers).`); - InspectorTest.expectEqual(resource.requestBodyTransferSize, requestBodyTransferSize, `requestBodyTransferSize should be exactly ${requestBodyTransferSize} bytes.`); - InspectorTest.expectEqual(resource.responseBodyTransferSize, responseBodyTransferSize, `responseBodyTransferSize should be exactly ${responseBodyTransferSize} bytes.`); + InspectorTest.expectGreaterThanOrEqual(resource.estimatedTotalTransferSize, (resource.responseBodyTransferSize || 0) + (headers ? minimumHeadersSize : 0), `estimatedTotalTransferSize should be >= (encoded body size + headers).`); + InspectorTest.expectGreaterThanOrEqual(resource.networkTotalTransferSize, (resource.responseBodyTransferSize || 0) + (headers ? minimumHeadersSize : 0), `networkTotalTransferSize should be >= (encoded body size + headers).`); // Exact header sizes if available. May vary between implementations so we check if empty / non-empty. if (headers) { diff --git a/LayoutTests/http/tests/inspector/page/get-cookies-expected.txt b/LayoutTests/http/tests/inspector/page/get-cookies-expected.txt new file mode 100644 index 000000000000..bd7f3bfa3ad9 --- /dev/null +++ b/LayoutTests/http/tests/inspector/page/get-cookies-expected.txt @@ -0,0 +1,21 @@ +Test for the Page.getCookies + + +== Running test suite: Page.getCookies +-- Running test case: CheckNoCookies +PASS: Should be no cookies. + +-- Running test setup. +-- Running test case: Page.getCookies.OnlyMainResource +PASS: length should be one. +PASS: [Main] Name is 'Main' +PASS: [Main] Value is 'foo' +PASS: [Main] Domain is '127.0.0.1' + +-- Running test setup. +-- Running test case: Page.getCookies.SubResource +PASS: length should be two. +PASS: [Sub] Name is 'Sub' +PASS: [Sub] Value is 'bar' +PASS: [Sub] Domain is 'localhost' + diff --git a/LayoutTests/http/tests/inspector/page/get-cookies.html b/LayoutTests/http/tests/inspector/page/get-cookies.html new file mode 100644 index 000000000000..ff75ddc4dfb1 --- /dev/null +++ b/LayoutTests/http/tests/inspector/page/get-cookies.html @@ -0,0 +1,83 @@ + + + + + + + +

    Test for the Page.getCookies

    + + diff --git a/LayoutTests/http/tests/inspector/page/resources/set-cookie.php b/LayoutTests/http/tests/inspector/page/resources/set-cookie.php new file mode 100644 index 000000000000..1f8a22b3dcb3 --- /dev/null +++ b/LayoutTests/http/tests/inspector/page/resources/set-cookie.php @@ -0,0 +1,4 @@ + +Set = diff --git a/LayoutTests/http/tests/media/128kbps-44khz.mp3 b/LayoutTests/http/tests/media/128kbps-44khz.mp3 new file mode 100644 index 000000000000..43a8ac39526b Binary files /dev/null and b/LayoutTests/http/tests/media/128kbps-44khz.mp3 differ diff --git a/LayoutTests/http/tests/media/audio-volume-zero-expected.txt b/LayoutTests/http/tests/media/audio-volume-zero-expected.txt new file mode 100644 index 000000000000..b24e44f9ff8b --- /dev/null +++ b/LayoutTests/http/tests/media/audio-volume-zero-expected.txt @@ -0,0 +1,3 @@ + +PASS Verify audio internal volume stays at 0 + diff --git a/LayoutTests/http/tests/media/audio-volume-zero.html b/LayoutTests/http/tests/media/audio-volume-zero.html new file mode 100644 index 000000000000..549586bbc345 --- /dev/null +++ b/LayoutTests/http/tests/media/audio-volume-zero.html @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/LayoutTests/http/tests/misc/link-rel-prefetch-and-subresource.html b/LayoutTests/http/tests/misc/link-rel-prefetch-and-subresource.html deleted file mode 100644 index b724bbe5bc20..000000000000 --- a/LayoutTests/http/tests/misc/link-rel-prefetch-and-subresource.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - -
    - -

    Resource requests:

    -
    Request log goes here in DRT
    - - diff --git a/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-cross-origin-expected.txt b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-cross-origin-expected.txt new file mode 100644 index 000000000000..b4bb6c7b87d9 --- /dev/null +++ b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-cross-origin-expected.txt @@ -0,0 +1,13 @@ +Tests that a page with pending ping loads can enter PageCache. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +pageshow - not from cache +pagehide - entering cache +pageshow - from cache +PASS Page did enter and was restored from the page cache +PASS successfullyParsed is true + +TEST COMPLETE +Click me diff --git a/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-cross-origin.html b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-cross-origin.html new file mode 100644 index 000000000000..b73853834d5e --- /dev/null +++ b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-cross-origin.html @@ -0,0 +1,46 @@ + + + + + + + +Click me + + + diff --git a/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-same-origin-expected.txt b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-same-origin-expected.txt new file mode 100644 index 000000000000..b4bb6c7b87d9 --- /dev/null +++ b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-same-origin-expected.txt @@ -0,0 +1,13 @@ +Tests that a page with pending ping loads can enter PageCache. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +pageshow - not from cache +pagehide - entering cache +pageshow - from cache +PASS Page did enter and was restored from the page cache +PASS successfullyParsed is true + +TEST COMPLETE +Click me diff --git a/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-same-origin.html b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-same-origin.html new file mode 100644 index 000000000000..6832b1e049ad --- /dev/null +++ b/LayoutTests/http/tests/navigation/page-cache-pending-ping-load-same-origin.html @@ -0,0 +1,46 @@ + + + + + + + +Click me + + + diff --git a/LayoutTests/http/tests/navigation/ping-attribute/anchor-cross-origin.html b/LayoutTests/http/tests/navigation/ping-attribute/anchor-cross-origin.html index 700479884e1a..6dca8c17f841 100644 --- a/LayoutTests/http/tests/navigation/ping-attribute/anchor-cross-origin.html +++ b/LayoutTests/http/tests/navigation/ping-attribute/anchor-cross-origin.html @@ -10,6 +10,7 @@ function test() { if (!testCalled) { if (window.testRunner && window.internals) { + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { }); testRunner.dumpAsText(); internals.settings.setHyperlinkAuditingEnabled(true); testRunner.waitUntilDone(); diff --git a/LayoutTests/http/tests/navigation/ping-attribute/area-cross-origin.html b/LayoutTests/http/tests/navigation/ping-attribute/area-cross-origin.html index 4e53f1477f27..1891b3f48d2d 100644 --- a/LayoutTests/http/tests/navigation/ping-attribute/area-cross-origin.html +++ b/LayoutTests/http/tests/navigation/ping-attribute/area-cross-origin.html @@ -5,6 +5,7 @@ + +

    +
    + + diff --git a/LayoutTests/http/tests/notifications/resources/request-in-detached-frame-subframe.html b/LayoutTests/http/tests/notifications/resources/request-in-detached-frame-subframe.html new file mode 100644 index 000000000000..3b4e4c8ec8b7 --- /dev/null +++ b/LayoutTests/http/tests/notifications/resources/request-in-detached-frame-subframe.html @@ -0,0 +1,10 @@ + diff --git a/LayoutTests/http/tests/paymentrequest/payment-is-showing.https-expected.txt b/LayoutTests/http/tests/paymentrequest/payment-is-showing.https-expected.txt new file mode 100644 index 000000000000..8ece644db1fc --- /dev/null +++ b/LayoutTests/http/tests/paymentrequest/payment-is-showing.https-expected.txt @@ -0,0 +1,8 @@ + +PASS The top browsing context can only show one payment sheet at a time. +PASS If an iframe shows a payment request, the top-level browsing context can't also show one. +PASS An iframe cannot show a payment request if the top-level window is already showing one. +PASS Given multiple nested browsing contexts, and window calls show() first, other nested browsing contexts can't show a request. +PASS Given multiple nested browsing contexts, and an iframe calls show() first, other nested browsing contexts can't show a request. +PASS Navigating an iframe as a nested browsing context sets 'payment request is showing boolean' to false. + diff --git a/LayoutTests/http/tests/paymentrequest/payment-is-showing.https.html b/LayoutTests/http/tests/paymentrequest/payment-is-showing.https.html new file mode 100644 index 000000000000..2e9a24c8002d --- /dev/null +++ b/LayoutTests/http/tests/paymentrequest/payment-is-showing.https.html @@ -0,0 +1,290 @@ + +Test for PaymentRequest.show(optional promise) method + + + + + + + + diff --git a/LayoutTests/http/tests/paymentrequest/resources/blank.html b/LayoutTests/http/tests/paymentrequest/resources/blank.html new file mode 100644 index 000000000000..7852a427e861 --- /dev/null +++ b/LayoutTests/http/tests/paymentrequest/resources/blank.html @@ -0,0 +1 @@ + diff --git a/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http-http.html b/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http-http.html index 08086d0d6d43..4c94f1dea4dd 100644 --- a/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http-http.html +++ b/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http-http.html @@ -15,7 +15,14 @@ shouldBeEqualToString("referrer", "http://127.0.0.1:8000/referrer-policy/no-referrer-when-downgrade/cross-origin-http-http.html"); finishJSTest(); } + +if (window.testRunner) { + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + let iframeElement = document.createElement("iframe"); + iframeElement.src = "http://localhost:8000/referrer-policy/resources/document.html"; + document.body.appendChild(iframeElement); + }); +} - diff --git a/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http.https.html b/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http.https.html index ab4b2e2aa9cc..d6051ceadc2e 100644 --- a/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http.https.html +++ b/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/cross-origin-http.https.html @@ -18,7 +18,14 @@ shouldBeEqualToString("referrer", ""); finishJSTest(); } + +if (window.testRunner) { + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + let iframeElement = document.createElement("iframe"); + iframeElement.src = "http://localhost:8000/referrer-policy/resources/document.html"; + document.body.appendChild(iframeElement); + }); +} - diff --git a/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/same-origin.html b/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/same-origin.html index a39e691ad776..7a205d7395fc 100644 --- a/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/same-origin.html +++ b/LayoutTests/http/tests/referrer-policy/no-referrer-when-downgrade/same-origin.html @@ -15,7 +15,14 @@ shouldBeEqualToString("referrer", "http://127.0.0.1:8000/referrer-policy/no-referrer-when-downgrade/same-origin.html"); finishJSTest(); } + +if (window.testRunner) { + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + let iframeElement = document.createElement("iframe"); + iframeElement.src = "http://127.0.0.1:8000/referrer-policy/resources/document.html"; + document.body.appendChild(iframeElement); + }); +} - diff --git a/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http-http.html b/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http-http.html index 36eeb63960e9..bba42ba88b7a 100644 --- a/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http-http.html +++ b/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http-http.html @@ -15,7 +15,14 @@ shouldBeEqualToString("referrer", "http://127.0.0.1:8000/referrer-policy/unsafe-url/cross-origin-http-http.html"); finishJSTest(); } + +if (window.testRunner) { + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + let iframeElement = document.createElement("iframe"); + iframeElement.src = "http://localhost:8000/referrer-policy/resources/document.html"; + document.body.appendChild(iframeElement); + }); +} - diff --git a/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http.https.html b/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http.https.html index 4c391a391772..ffcd6e741ba3 100644 --- a/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http.https.html +++ b/LayoutTests/http/tests/referrer-policy/unsafe-url/cross-origin-http.https.html @@ -18,7 +18,14 @@ shouldBeEqualToString("referrer", "https://127.0.0.1:8443/referrer-policy/unsafe-url/cross-origin-http.https.html"); finishJSTest(); } + +if (window.testRunner) { + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + let iframeElement = document.createElement("iframe"); + iframeElement.src = "http://localhost:8000/referrer-policy/resources/document.html"; + document.body.appendChild(iframeElement); + }); +} - diff --git a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-expected.txt index 15e3ce063ddd..bae0033ffcca 100644 --- a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-expected.txt +++ b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-expected.txt @@ -1,6 +1,11 @@ -PASS successfullyParsed is true +Tests clearing of website data store. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + -TEST COMPLETE PASS Host classified as prevalent resource. PASS Host is no longer a prevalent resource after the store was cleared. +PASS successfullyParsed is true + +TEST COMPLETE diff --git a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour-expected.txt index 15e3ce063ddd..07f999c6feb3 100644 --- a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour-expected.txt +++ b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour-expected.txt @@ -1,6 +1,11 @@ -PASS successfullyParsed is true +Tests clearing of website data store (one hour). + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + -TEST COMPLETE PASS Host classified as prevalent resource. PASS Host is no longer a prevalent resource after the store was cleared. +PASS successfullyParsed is true + +TEST COMPLETE diff --git a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour.html b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour.html index 4d123c03d120..9f16717e817c 100644 --- a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour.html +++ b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store-one-hour.html @@ -2,11 +2,15 @@ - Test Cleared Store + + diff --git a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store.html b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store.html index 452f6e5bf5ee..702741a1ba76 100644 --- a/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store.html +++ b/LayoutTests/http/tests/resourceLoadStatistics/clear-in-memory-and-persistent-store.html @@ -4,9 +4,13 @@ Test Cleared Store + diff --git a/LayoutTests/http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off-expected.txt new file mode 100644 index 000000000000..70532d7c9fa3 --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off-expected.txt @@ -0,0 +1,16 @@ +Tests that existing third-party cookies are not blocked when ITP is off. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS successfullyParsed is true + +TEST COMPLETE + + +-------- +Frame: '' +-------- +Should receive its cookie. +Received cookie named 'firstPartyCookie'. +Client-side document.cookie: firstPartyCookie=value diff --git a/LayoutTests/http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off.html b/LayoutTests/http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off.html new file mode 100644 index 000000000000..0285e7bc49c1 --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/no-third-party-cookie-blocking-when-itp-is-off.html @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect-expected.txt index fea82320c2af..400a49e4460f 100644 --- a/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect-expected.txt +++ b/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect-expected.txt @@ -11,43 +11,41 @@ TEST COMPLETE -------- Frame: '' -------- -Set cookie. - +Should receive first-party cookie for localhost. +Did not receive cookie named 'firstPartyCookieIP'. +Received cookie named 'firstPartyCookieLocalhost'. +Did not receive cookie named 'thirdPartyCookie'. +Client-side document.cookie: firstPartyCookieLocalhost=localhost -------- Frame: '' -------- -Should receive first-party cookie. -Received cookie named 'firstPartyCookie'. -Did not receive cookie named 'partitionedCookie'. -Client-side document.cookie: firstPartyCookie=value - --------- -Frame: '' --------- Redirect case 1, should receive first-party cookie for 127.0.0.1. -Received cookie named 'firstPartyCookie'. -Did not receive cookie named 'partitionedCookie'. -Client-side document.cookie: firstPartyCookie=127.0.0.1 +Received cookie named 'firstPartyCookieIP'. +Did not receive cookie named 'firstPartyCookieLocalhost'. +Did not receive cookie named 'thirdPartyCookie'. +Client-side document.cookie: firstPartyCookieIP=127.0.0.1 -------- -Frame: '' +Frame: '' -------- -Try to set third-party cookie in blocked mode. +Try to set third-party cookie for localhost in blocked mode. -------- -Frame: '' +Frame: '' -------- Should receive no cookie. -Did not receive cookie named 'firstPartyCookie'. -Did not receive cookie named 'partitionedCookie'. +Did not receive cookie named 'firstPartyCookieIP'. +Did not receive cookie named 'firstPartyCookieLocalhost'. +Did not receive cookie named 'thirdPartyCookie'. Client-side document.cookie: -------- -Frame: '' +Frame: '' -------- Redirect case 2, should receive first-party cookie for 127.0.0.1. -Received cookie named 'firstPartyCookie'. -Did not receive cookie named 'partitionedCookie'. -Client-side document.cookie: firstPartyCookie=127.0.0.1 +Received cookie named 'firstPartyCookieIP'. +Did not receive cookie named 'firstPartyCookieLocalhost'. +Did not receive cookie named 'thirdPartyCookie'. +Client-side document.cookie: firstPartyCookieIP=127.0.0.1 diff --git a/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect.html b/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect.html index f103b7b6bbbf..e00ca36f8ed6 100644 --- a/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect.html +++ b/LayoutTests/http/tests/resourceLoadStatistics/remove-blocking-in-redirect.html @@ -14,11 +14,12 @@ const thirdPartyOrigin = "http://localhost:8000"; const resourcePath = "/resourceLoadStatistics/resources"; const thirdPartyBaseUrl = thirdPartyOrigin + resourcePath; - const firstPartyCookieName = "firstPartyCookie"; - const subPathToSetFirstPartyCookie = "/set-cookie.php?name=" + firstPartyCookieName + "&value=value"; - const partitionedCookieName = "partitionedCookie"; - const subPathToSetPartitionedCookie = "/set-cookie.php?name=" + partitionedCookieName + "&value=value"; - const subPathToGetCookies = "/get-cookies.php?name1=" + firstPartyCookieName + "&name2=" + partitionedCookieName; + const firstPartyCookieNamePrefix = "firstPartyCookie"; + const firstPartyCookieNameIP = firstPartyCookieNamePrefix + "IP"; + const firstPartyCookieNameLocalhost = firstPartyCookieNamePrefix + "Localhost"; + const thirdPartyCookieName = "thirdPartyCookie"; + const subPathToSetThirdPartyCookie = "/set-cookie.php?name=" + thirdPartyCookieName + "&value=value"; + const subPathToGetCookies = "/get-cookies.php?name1=" + firstPartyCookieNameIP + "&name2=" + firstPartyCookieNameLocalhost + "&name3=" + thirdPartyCookieName; const redirectChainUrl = thirdPartyOrigin + resourcePath + "/redirect.php?redirectTo=http://" + partitionHost + resourcePath + subPathToGetCookies; function openIframe(url, onLoadHandler) { @@ -34,18 +35,18 @@ switch (document.location.hash) { case "#step1": // Set first-party cookies for 127.0.0.1 and localhost. - document.location.hash = "step2"; - document.cookie = firstPartyCookieName + "=127.0.0.1;path='/'"; - if (window.testRunner) - testRunner.setAlwaysAcceptCookies(true); - openIframe(thirdPartyBaseUrl + subPathToSetFirstPartyCookie + "&message=Set cookie.", runTest); + if (document.location.origin === thirdPartyOrigin) { + document.cookie = firstPartyCookieNameLocalhost + "=localhost;path='/'"; + document.location.href = "http://127.0.0.1:8000/resourceLoadStatistics/remove-blocking-in-redirect.html#step2"; + } else { + document.cookie = firstPartyCookieNameIP + "=127.0.0.1;path='/'"; + document.location.href = "http://localhost:8000/resourceLoadStatistics/remove-blocking-in-redirect.html#step1"; + } break; case "#step2": // Check that the cookie gets sent for localhost under 127.0.0.1 since localhost is not prevalent. document.location.hash = "step3"; - if (window.testRunner) - testRunner.setAlwaysAcceptCookies(false); - openIframe(thirdPartyBaseUrl + subPathToGetCookies + "&message=Should receive first-party cookie.", runTest); + openIframe(thirdPartyBaseUrl + subPathToGetCookies + "&message=Should receive first-party cookie for localhost.", runTest); break; case "#step3": document.location.hash = "step4"; @@ -64,7 +65,7 @@ case "#step5": // Try to set partitioned cookie for localhost under 127.0.0.1. document.location.hash = "step6"; - openIframe(thirdPartyBaseUrl + subPathToSetPartitionedCookie + "&message=Try to set third-party cookie in blocked mode.", runTest); + openIframe(thirdPartyBaseUrl + subPathToSetThirdPartyCookie + "&message=Try to set third-party cookie for localhost in blocked mode.", runTest); break; case "#step6": // Check that no cookie gets sent for localhost under 127.0.0.1 since localhost's cookies are blocked. diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects-expected.txt deleted file mode 100644 index d3ca3b498f4e..000000000000 --- a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects-expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -Tests that only the origin is sent as referrer in redirects to prevalent resources without user interaction. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - - -PASS referrer is "http://127.0.0.1:8000/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects.html" -PASS successfullyParsed is true - -TEST COMPLETE - - --------- -Frame: '' --------- -http://127.0.0.1:8000/ diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects.html b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects.html deleted file mode 100644 index 5d7a3bc781c0..000000000000 --- a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-redirects.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests-expected.txt deleted file mode 100644 index 34776eaa1d27..000000000000 --- a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests-expected.txt +++ /dev/null @@ -1,16 +0,0 @@ -Tests that only the origin is sent as referrer for prevalent resources without user interaction. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - - -PASS referrer is "http://127.0.0.1:8000/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests.html" -PASS referrer is "http://127.0.0.1:8000/" -PASS successfullyParsed is true - -TEST COMPLETE - - --------- -Frame: '' --------- -http://127.0.0.1:8000/ diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests.html b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests.html deleted file mode 100644 index cd7c9ccf04cd..000000000000 --- a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-prevalent-subresource-requests.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects-expected.txt new file mode 100644 index 000000000000..59b455268e76 --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects-expected.txt @@ -0,0 +1,15 @@ +Tests that only the origin is sent as referrer in redirects to third-parties. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS referrer is "http://127.0.0.1:8000/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects.html" +PASS successfullyParsed is true + +TEST COMPLETE + + +-------- +Frame: '' +-------- +http://127.0.0.1:8000/ diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects.html b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects.html new file mode 100644 index 000000000000..24b557dbad77 --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-redirects.html @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests-expected.txt new file mode 100644 index 000000000000..591b39ee8526 --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests-expected.txt @@ -0,0 +1,16 @@ +Tests that only the origin is sent as referrer for third-party requests. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS referrer is "http://127.0.0.1:8000/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests.html" +PASS referrer is "http://127.0.0.1:8000/" +PASS successfullyParsed is true + +TEST COMPLETE + + +-------- +Frame: '' +-------- +http://127.0.0.1:8000/ diff --git a/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests.html b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests.html new file mode 100644 index 000000000000..49f87cb627af --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/strip-referrer-to-origin-for-third-party-requests.html @@ -0,0 +1,51 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction-expected.txt b/LayoutTests/http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction-expected.txt new file mode 100644 index 000000000000..a7fed3a5cdb0 --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction-expected.txt @@ -0,0 +1,25 @@ +Tests that all third-party cookies are blocked under websites that have not received user interaction. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS successfullyParsed is true + +TEST COMPLETE + + +-------- +Frame: '' +-------- +Before user interaction, should receive no cookies. +Did not receive cookie named 'firstPartyCookie'. +Did not receive cookie named 'partitionedCookie'. +Client-side document.cookie: + +-------- +Frame: '' +-------- +After user interaction, should receive first-party cookie. +Received cookie named 'firstPartyCookie'. +Did not receive cookie named 'partitionedCookie'. +Client-side document.cookie: firstPartyCookie=value diff --git a/LayoutTests/http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction.html b/LayoutTests/http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction.html new file mode 100644 index 000000000000..cdf732361139 --- /dev/null +++ b/LayoutTests/http/tests/resourceLoadStatistics/third-party-cookie-blocking-on-sites-without-user-interaction.html @@ -0,0 +1,76 @@ + + + + + + + + + + + diff --git a/LayoutTests/http/tests/resourceLoadStatistics/website-data-removal-for-site-navigated-to-with-link-decoration.html b/LayoutTests/http/tests/resourceLoadStatistics/website-data-removal-for-site-navigated-to-with-link-decoration.html index 1d08a9969627..bd3f663ab73d 100644 --- a/LayoutTests/http/tests/resourceLoadStatistics/website-data-removal-for-site-navigated-to-with-link-decoration.html +++ b/LayoutTests/http/tests/resourceLoadStatistics/website-data-removal-for-site-navigated-to-with-link-decoration.html @@ -75,35 +75,95 @@ } } + const maxIntervals = 20; + + let intervalCounterIDB; + let checkIDBCallback; + let checkIDBIntervalID; + let semaphoreIDBCheck = false; function checkIDBDataStoreExists(isAfterDeletion, callback) { - let request = indexedDB.open(dbName); - request.onerror = function() { - addOutput("Couldn't open indexedDB."); - finishTest(); - }; - request.onupgradeneeded = function () { - addOutput((isAfterDeletion ? "After" : "Before") + " deletion: IDB entry does not exist."); - callback(); - }; - request.onsuccess = function() { - addOutput((isAfterDeletion ? "After" : "Before") + " deletion: IDB entry does exist."); - callback(); - }; + let request; + intervalCounterIDB = 0; + checkIDBCallback = callback; + if (!isAfterDeletion) { + // Check until there is a IDB. + checkIDBIntervalID = setInterval(function() { + if (semaphoreIDBCheck) + return; + semaphoreIDBCheck = true; + + if (++intervalCounterIDB >= maxIntervals) { + clearInterval(checkIDBIntervalID); + addOutput("Before deletion: IDB entry does not exist."); + semaphoreIDBCheck = false; + checkIDBCallback(); + } else { + request = indexedDB.open(dbName); + request.onerror = function () { + clearInterval(checkIDBIntervalID); + addOutput("Couldn't open indexedDB."); + semaphoreIDBCheck = false; + finishTest(); + }; + request.onupgradeneeded = function () { + // Let the next interval check again. + semaphoreIDBCheck = false; + }; + request.onsuccess = function () { + clearInterval(checkIDBIntervalID); + addOutput("Before deletion: IDB entry does exist."); + semaphoreIDBCheck = false; + checkIDBCallback(); + }; + } + }, 200); + } else { + // Check until there is no IDB. + checkIDBIntervalID = setInterval(function () { + if (semaphoreIDBCheck) + return; + semaphoreIDBCheck = true; + + if (++intervalCounterIDB >= maxIntervals) { + clearInterval(checkIDBIntervalID); + addOutput("Before deletion: IDB entry does not exist."); + semaphoreIDBCheck = false; + checkIDBCallback(); + } else { + request = indexedDB.open(dbName); + request.onerror = function () { + clearInterval(checkIDBIntervalID); + addOutput("Couldn't open indexedDB."); + semaphoreIDBCheck = false; + finishTest(); + }; + request.onupgradeneeded = function () { + clearInterval(checkIDBIntervalID); + addOutput("After deletion: IDB entry does not exist."); + semaphoreIDBCheck = false; + checkIDBCallback(); + }; + request.onsuccess = function () { + // Let the next interval check again. + semaphoreIDBCheck = false; + }; + } + }, 200); + } } - const maxIntervals = 20; - let intervalCounter; + let intervalCounterLocalStorage; let checkLocalStorageCallback; let checkLocalStorageIntervalID; const localStorageName = "test"; const localStorageValue = "value"; function checkLocalStorageExists(isAfterDeletion, callback) { - intervalCounter = 0; + intervalCounterLocalStorage = 0; checkLocalStorageCallback = callback; if (!isAfterDeletion) { // Check until there is LocalStorage. checkLocalStorageIntervalID = setInterval(function() { - if (++intervalCounter === maxIntervals) { + if (++intervalCounterLocalStorage >= maxIntervals) { clearInterval(checkLocalStorageIntervalID); checkLocalStorageCallback(); } else if (testRunner.isStatisticsHasLocalStorage(destinationOrigin)) { @@ -116,7 +176,7 @@ } else { // Check until there is no LocalStorage. checkLocalStorageIntervalID = setInterval(function() { - if (++intervalCounter === maxIntervals) { + if (++intervalCounterLocalStorage >= maxIntervals) { clearInterval(checkLocalStorageIntervalID); checkLocalStorageCallback(); } else if (!testRunner.isStatisticsHasLocalStorage(destinationOrigin)) { diff --git a/LayoutTests/http/tests/resources/js-test-pre.js b/LayoutTests/http/tests/resources/js-test-pre.js index b488de948664..9a6dea32a22e 100644 --- a/LayoutTests/http/tests/resources/js-test-pre.js +++ b/LayoutTests/http/tests/resources/js-test-pre.js @@ -757,6 +757,16 @@ function isSuccessfullyParsed() debug('
    TEST COMPLETE'); } +function asyncTestStart() { + if (self.testRunner) + testRunner.waitUntilDone(); +} + +function asyncTestPassed() { + if (self.testRunner) + testRunner.notifyDone(); +} + // It's possible for an async test to call finishJSTest() before js-test-post.js // has been parsed. function finishJSTest() diff --git a/LayoutTests/http/tests/resources/payment-request.js b/LayoutTests/http/tests/resources/payment-request.js index 4d8b2b4a0654..c261813261f3 100644 --- a/LayoutTests/http/tests/resources/payment-request.js +++ b/LayoutTests/http/tests/resources/payment-request.js @@ -8,7 +8,7 @@ function activateThen(completion) resolve(completion()); }; document.body.insertBefore(button, document.body.firstChild); - UIHelper.activateElement(button); + UIHelper.activateElementAtHumanSpeed(button); }); } diff --git a/LayoutTests/http/tests/security/blob-null-url-location-origin-expected.txt b/LayoutTests/http/tests/security/blob-null-url-location-origin-expected.txt new file mode 100644 index 000000000000..d0eb4192c350 --- /dev/null +++ b/LayoutTests/http/tests/security/blob-null-url-location-origin-expected.txt @@ -0,0 +1,5 @@ +CONSOLE MESSAGE: line 1: data URL frame loaded +CONSOLE MESSAGE: line 1: blob popup opened +CONSOLE MESSAGE: line 1: blob popup loadednull +CONSOLE MESSAGE: line 1: blob popup message posted +PASS diff --git a/LayoutTests/http/tests/security/blob-null-url-location-origin.html b/LayoutTests/http/tests/security/blob-null-url-location-origin.html new file mode 100644 index 000000000000..43207c1eb926 --- /dev/null +++ b/LayoutTests/http/tests/security/blob-null-url-location-origin.html @@ -0,0 +1,36 @@ + + + + + diff --git a/LayoutTests/http/tests/security/clipboard/resources/copy-html.html b/LayoutTests/http/tests/security/clipboard/resources/copy-html.html index f51bb4c83075..7aa6ebdf75af 100644 --- a/LayoutTests/http/tests/security/clipboard/resources/copy-html.html +++ b/LayoutTests/http/tests/security/clipboard/resources/copy-html.html @@ -26,10 +26,12 @@ } function runTest() { - document.getElementById('source').focus(); + if (window.internals) + internals.withUserGesture(() => { document.getElementById('source').focus(); }); document.execCommand('selectAll'); document.execCommand('copy'); - document.getElementById('destination').focus(); + if (window.internals) + internals.withUserGesture(() => { document.getElementById('destination').focus(); }); if (window.testRunner) document.execCommand('paste'); } diff --git a/LayoutTests/http/tests/security/clipboard/resources/copy-mso-list.html b/LayoutTests/http/tests/security/clipboard/resources/copy-mso-list.html index be9a012e9715..8e537d7e46cf 100644 --- a/LayoutTests/http/tests/security/clipboard/resources/copy-mso-list.html +++ b/LayoutTests/http/tests/security/clipboard/resources/copy-mso-list.html @@ -52,10 +52,12 @@ } function runTest() { - document.getElementById('source').focus(); + if (window.internals) + internals.withUserGesture(() => { document.getElementById('source').focus(); }); document.execCommand('selectAll'); document.execCommand('copy'); - document.getElementById('destination').focus(); + if (window.internals) + internals.withUserGesture(() => { document.getElementById('destination').focus(); }); if (window.testRunner) document.execCommand('paste'); } diff --git a/LayoutTests/http/tests/security/clipboard/resources/copy-url.html b/LayoutTests/http/tests/security/clipboard/resources/copy-url.html index 23682474266e..e712a1e55a4c 100644 --- a/LayoutTests/http/tests/security/clipboard/resources/copy-url.html +++ b/LayoutTests/http/tests/security/clipboard/resources/copy-url.html @@ -23,10 +23,12 @@ } function runTest() { - document.getElementById('source').focus(); + if (window.internals) + internals.withUserGesture(() => { document.getElementById('source').focus(); }); document.execCommand('selectAll'); document.execCommand('copy'); - document.getElementById('destination').focus(); + if (window.internals) + internals.withUserGesture(() =>{ document.getElementById('destination').focus(); }); if (window.testRunner) document.execCommand('paste'); } diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url-expected.txt new file mode 100644 index 000000000000..889df3ba1fb2 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url-expected.txt @@ -0,0 +1,7 @@ +ALERT: PASS + + +-------- +Frame: '' +-------- + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url.html b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url.html new file mode 100644 index 000000000000..9cf9ee81df40 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-allowed-when-loaded-via-javascript-url.html @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url-expected.txt new file mode 100644 index 000000000000..65e964752f67 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url-expected.txt @@ -0,0 +1,7 @@ +CONSOLE MESSAGE: Refused to load http://localhost:8000/security/contentSecurityPolicy/resources/alert-fail.html because it appears in neither the child-src directive nor the default-src directive of the Content Security Policy. + + +-------- +Frame: '' +-------- + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url.html b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url.html new file mode 100644 index 000000000000..3ae44e144155 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url.html @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2-expected.txt new file mode 100644 index 000000000000..c73abafaaf63 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2-expected.txt @@ -0,0 +1,12 @@ +CONSOLE MESSAGE: Refused to load http://localhost:8000/security/contentSecurityPolicy/resources/alert-fail.html because it appears in neither the child-src directive nor the default-src directive of the Content Security Policy. + + +-------- +Frame: '' +-------- + + +-------- +Frame: '' +-------- + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2.html b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2.html new file mode 100644 index 000000000000..033dfbfb8c68 --- /dev/null +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/iframe-blocked-when-loaded-via-javascript-url2.html @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies-when-private-browsing-enabled.php b/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies-when-private-browsing-enabled.php index d091e4a724b3..782fa1f0433b 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies-when-private-browsing-enabled.php +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies-when-private-browsing-enabled.php @@ -5,18 +5,26 @@ - - - + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://localhost:8080/cookies/resources/setCookies.cgi", false); + xhr.setRequestHeader("SET-COOKIE", "hello=world;path=/"); + xhr.send(null); - + // This image will generate a CSP violation report. + let imgElement = document.createElement("img"); + imgElement.onload = imgElement.onerror = function () { + window.location = "/security/contentSecurityPolicy/resources/echo-report.php"; + }; + imgElement.src = "/security/resources/abe.png"; + document.body.appendChild(imgElement); + }); + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies.php b/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies.php index 62d3180819e9..a5a3f74a2fed 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies.php +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/report-cross-origin-no-cookies.php @@ -5,15 +5,25 @@ +if (window.testRunner) { + testRunner.waitUntilDone(); + testRunner.dumpAsText(); - - + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://localhost:8080/cookies/resources/setCookies.cgi", false); + xhr.setRequestHeader("SET-COOKIE", "hello=world;path=/"); + xhr.send(null); - + // This image will generate a CSP violation report. + let imgElement = document.createElement("img"); + imgElement.onload = imgElement.onerror = function () { + window.location = "/security/contentSecurityPolicy/resources/echo-report.php"; + }; + imgElement.src = "/security/resources/abe.png"; + document.body.appendChild(imgElement); + }); +} + diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt index 5b7176881ff7..4790dda7033f 100644 --- a/LayoutTests/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt +++ b/LayoutTests/http/tests/security/contentSecurityPolicy/user-style-sheet-font-crasher-expected.txt @@ -2,5 +2,7 @@ CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityP Blocked access to external URL http://webkit.org/report CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy/example_font.woff because it does not appear in the font-src directive of the Content Security Policy. Blocked access to external URL http://webkit.org/report +CONSOLE MESSAGE: Refused to load http://127.0.0.1:8000/security/contentSecurityPolicy/example_font.woff because it does not appear in the font-src directive of the Content Security Policy. +Blocked access to external URL http://webkit.org/report The iframe below triggers a violation report creating the initial empty document. It should not crash the web process. diff --git a/LayoutTests/http/tests/security/cross-frame-access-object-put-optimization-expected.txt b/LayoutTests/http/tests/security/cross-frame-access-object-put-optimization-expected.txt new file mode 100644 index 000000000000..8790e0363a2a --- /dev/null +++ b/LayoutTests/http/tests/security/cross-frame-access-object-put-optimization-expected.txt @@ -0,0 +1,10 @@ +This tests that you can't get cross-origin object during [[Put]] operation. + +PASS data is not "null" +PASS data is not "Cocoa" +PASS data is not "null" +PASS data is not "Cocoa" +PASS: successfullyParsed should be 'true' and is. + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/security/cross-frame-access-object-put-optimization.html b/LayoutTests/http/tests/security/cross-frame-access-object-put-optimization.html new file mode 100644 index 000000000000..af7d0e71591c --- /dev/null +++ b/LayoutTests/http/tests/security/cross-frame-access-object-put-optimization.html @@ -0,0 +1,54 @@ + + + + + + + +
    This tests that you can't get cross-origin object during [[Put]] operation.
    + +
    
    +    
    +
    +
    diff --git a/LayoutTests/http/tests/security/navigate-when-restoring-cached-page-expected.txt b/LayoutTests/http/tests/security/navigate-when-restoring-cached-page-expected.txt
    new file mode 100644
    index 000000000000..6ab4689e9ada
    --- /dev/null
    +++ b/LayoutTests/http/tests/security/navigate-when-restoring-cached-page-expected.txt
    @@ -0,0 +1 @@
    +This test passes if it does not print an ALERT with "secret data".
    diff --git a/LayoutTests/http/tests/security/navigate-when-restoring-cached-page.html b/LayoutTests/http/tests/security/navigate-when-restoring-cached-page.html
    new file mode 100644
    index 000000000000..96866597fc27
    --- /dev/null
    +++ b/LayoutTests/http/tests/security/navigate-when-restoring-cached-page.html
    @@ -0,0 +1,99 @@
    +
    +
    +
    +

    This test passes if it does not print an ALERT with "secret data".

    + + + diff --git a/LayoutTests/http/tests/security/referrer-policy-header.html b/LayoutTests/http/tests/security/referrer-policy-header.html index 95ad042e1678..0a14bc34d55a 100644 --- a/LayoutTests/http/tests/security/referrer-policy-header.html +++ b/LayoutTests/http/tests/security/referrer-policy-header.html @@ -82,7 +82,11 @@ document.body.appendChild(frame); } -runNextTest(); +if (window.testRunner) { + testRunner.setStatisticsShouldDowngradeReferrer(false, function () { + runNextTest(); + }); +} diff --git a/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-object-put-optimization-test.html b/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-object-put-optimization-test.html new file mode 100644 index 000000000000..abd2f6ac0e02 --- /dev/null +++ b/LayoutTests/http/tests/security/resources/cross-frame-iframe-for-object-put-optimization-test.html @@ -0,0 +1,9 @@ +

    Cocoa

    + diff --git a/LayoutTests/http/tests/security/resources/navigate-when-restoring-cached-page-frame.html b/LayoutTests/http/tests/security/resources/navigate-when-restoring-cached-page-frame.html new file mode 100644 index 000000000000..387ce3c92de0 --- /dev/null +++ b/LayoutTests/http/tests/security/resources/navigate-when-restoring-cached-page-frame.html @@ -0,0 +1,12 @@ + diff --git a/LayoutTests/http/tests/security/resources/navigate-when-restoring-cached-page-victim.html b/LayoutTests/http/tests/security/resources/navigate-when-restoring-cached-page-victim.html new file mode 100644 index 000000000000..e63e82f9d424 --- /dev/null +++ b/LayoutTests/http/tests/security/resources/navigate-when-restoring-cached-page-victim.html @@ -0,0 +1,2 @@ +

    secret data

    + diff --git a/LayoutTests/http/tests/security/top-level-unique-origin.https-expected.txt b/LayoutTests/http/tests/security/top-level-unique-origin.https-expected.txt new file mode 100644 index 000000000000..7ef22e9a431a --- /dev/null +++ b/LayoutTests/http/tests/security/top-level-unique-origin.https-expected.txt @@ -0,0 +1 @@ +PASS diff --git a/LayoutTests/http/tests/security/top-level-unique-origin.https.html b/LayoutTests/http/tests/security/top-level-unique-origin.https.html new file mode 100644 index 000000000000..ba39ad47110e --- /dev/null +++ b/LayoutTests/http/tests/security/top-level-unique-origin.https.html @@ -0,0 +1,21 @@ + + diff --git a/LayoutTests/http/tests/security/top-level-unique-origin2.https-expected.txt b/LayoutTests/http/tests/security/top-level-unique-origin2.https-expected.txt new file mode 100644 index 000000000000..0ad9348c3d8b --- /dev/null +++ b/LayoutTests/http/tests/security/top-level-unique-origin2.https-expected.txt @@ -0,0 +1,5 @@ +CONSOLE MESSAGE: line 1: data URL frame loaded +CONSOLE MESSAGE: line 1: blob popup opened +CONSOLE MESSAGE: line 1: blob popup loaded +CONSOLE MESSAGE: line 1: blob popup message posted +PASS diff --git a/LayoutTests/http/tests/security/top-level-unique-origin2.https.html b/LayoutTests/http/tests/security/top-level-unique-origin2.https.html new file mode 100644 index 000000000000..eb43ca484eda --- /dev/null +++ b/LayoutTests/http/tests/security/top-level-unique-origin2.https.html @@ -0,0 +1,21 @@ + + + + + diff --git a/LayoutTests/http/tests/ssl/applepay/ApplePayCancelEvent.https-expected.txt b/LayoutTests/http/tests/ssl/applepay/ApplePayCancelEvent.https-expected.txt new file mode 100644 index 000000000000..7cbcdadbe589 --- /dev/null +++ b/LayoutTests/http/tests/ssl/applepay/ApplePayCancelEvent.https-expected.txt @@ -0,0 +1,18 @@ +Test ApplePaySession's cancel event. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS event is non-null. +PASS typeof event is "object" +PASS event.sessionError is non-null. +PASS typeof event.sessionError is "object" +PASS event.sessionError.code is "unknown" +PASS typeof event.sessionError.code is "string" +PASS Object.keys(event.sessionError.info).length is 0 +PASS typeof event.sessionError.info is "object" +PASS cancel event received +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/ssl/applepay/ApplePayCancelEvent.https.html b/LayoutTests/http/tests/ssl/applepay/ApplePayCancelEvent.https.html new file mode 100644 index 000000000000..9e7221abd38c --- /dev/null +++ b/LayoutTests/http/tests/ssl/applepay/ApplePayCancelEvent.https.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-ephemeral-expected.txt b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-ephemeral-expected.txt new file mode 100644 index 000000000000..725e8145aa3e --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-ephemeral-expected.txt @@ -0,0 +1,10 @@ +Tests that document.hasStorageAccess() returns false for a 3rd-party iframe by default (ephemeral session). + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS No storage access. document.cookie == , cookies seen server-side == "No cookies" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-ephemeral.html b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-ephemeral.html new file mode 100644 index 000000000000..8f4e7e0298e1 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-ephemeral.html @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-expected.txt b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-expected.txt new file mode 100644 index 000000000000..289daa8cebb3 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default-expected.txt @@ -0,0 +1,10 @@ +Tests that document.hasStorageAccess() returns false for a 3rd-party iframe by default. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS No storage access. document.cookie == , cookies seen server-side == "No cookies" +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default.html b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default.html new file mode 100644 index 000000000000..823977cc8fcc --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-false-by-default.html @@ -0,0 +1,37 @@ + + + + + + + + + + diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html deleted file mode 100644 index acaf0528b61d..000000000000 --- a/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-feature-off.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral-expected.txt b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral-expected.txt new file mode 100644 index 000000000000..ee5404928778 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral-expected.txt @@ -0,0 +1,10 @@ +Tests that document.hasStorageAccess() returns true for a 3rd-party iframe if the 3rd-party has cookies set. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Has storage access. document.cookie == firstPartyCookie=value, cookies seen server-side == {"firstPartyCookie":"value"} +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral.html b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral.html new file mode 100644 index 000000000000..5b67c24f24b3 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-ephemeral.html @@ -0,0 +1,42 @@ + + + + + + + + + + \ No newline at end of file diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-expected.txt b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-expected.txt new file mode 100644 index 000000000000..ee5404928778 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies-expected.txt @@ -0,0 +1,10 @@ +Tests that document.hasStorageAccess() returns true for a 3rd-party iframe if the 3rd-party has cookies set. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS Has storage access. document.cookie == firstPartyCookie=value, cookies seen server-side == {"firstPartyCookie":"value"} +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies.html b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies.html new file mode 100644 index 000000000000..292de29dd1a1 --- /dev/null +++ b/LayoutTests/http/tests/storageAccess/has-storage-access-true-if-third-party-has-cookies.html @@ -0,0 +1,42 @@ + + + + + + + + + + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension-expected.txt new file mode 100644 index 000000000000..b9395479bbaf --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension-expected.txt @@ -0,0 +1,13 @@ +Test WebSocket deflate-frame extension. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS event.data is firstMessage +PASS event.data is secondMessage +PASS event.data is thirdMessage +onclose() was called. +PASS closeEvent.wasClean is true +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension.html b/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension.html new file mode 100644 index 000000000000..3e0e9a8345d6 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/deflate-extension.html @@ -0,0 +1,73 @@ + + + + + + +
    +
    + + + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-expected.txt new file mode 100644 index 000000000000..751e35dd8fe7 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-expected.txt @@ -0,0 +1,5 @@ +CONSOLE MESSAGE: WebSocket connection failed: The page at https://localhost:8443/websocket/tests/hybi/non-document-mixed-content-blocked.https.html was blocked from connecting insecurely to ws://127.0.0.1:8880/websocket/tests/hybi/simple either because the protocol is insecure or the page is embedded from an insecure page. + +Test topFrame http with embedded https blocks worker from iframe. + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http-expected.txt new file mode 100644 index 000000000000..4acaa5fa0721 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http-expected.txt @@ -0,0 +1,5 @@ +CONSOLE MESSAGE: WebSocket connection failed: The page at https://localhost:8443/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedded-http.https.html was blocked from connecting insecurely to ws://127.0.0.1:8880/websocket/tests/hybi/simple either because the protocol is insecure or the page is embedded from an insecure page. + +Test topFrame http with embedded https with embedded http blocks worker connecting to insecure webSocket. + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http.html b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http.html new file mode 100644 index 000000000000..0395359d9761 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https-with-embedded-http.html @@ -0,0 +1,12 @@ + + + + + +

    Test topFrame http with embedded https with embedded http blocks worker connecting to insecure webSocket. +

    +

    +
    +
    + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https.html b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https.html new file mode 100644 index 000000000000..b444e7182acd --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https.html @@ -0,0 +1,12 @@ + + + + + +

    Test topFrame http with embedded https blocks worker from iframe. +

    +

    +
    +
    + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https-expected.txt new file mode 100644 index 000000000000..a7508c41b7b4 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https-expected.txt @@ -0,0 +1,7 @@ +CONSOLE MESSAGE: The page at about:blank was allowed to display insecure content from http://localhost:8000/websocket/tests/hybi/non-document-mixed-content-blocked-http-with-embedded-https.html. + +CONSOLE MESSAGE: WebSocket connection failed: The page at https://localhost:8443/websocket/tests/hybi/non-document-mixed-content-blocked.https.html was blocked from connecting insecurely to ws://127.0.0.1:8880/websocket/tests/hybi/simple either because the protocol is insecure or the page is embedded from an insecure page. + +Test topFrame https with embedded http with embedded https blocks worker trying to connect with insecure webSocket. + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https.html b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https.html new file mode 100644 index 000000000000..f28cfff0201b --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked-https-with-embedded-http-with-embedded-https.https.html @@ -0,0 +1,23 @@ + + + + + + + +

    Test topFrame https with embedded http with embedded https blocks worker trying to connect with insecure webSocket. +

    +

    +
    +
    + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https-expected.txt b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https-expected.txt new file mode 100644 index 000000000000..22ab54dccc54 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https-expected.txt @@ -0,0 +1,9 @@ +CONSOLE MESSAGE: WebSocket connection failed: The page at https://127.0.0.1:8443/websocket/tests/hybi/non-document-mixed-content-blocked.https.html was blocked from connecting insecurely to ws://127.0.0.1:8880/websocket/tests/hybi/simple either because the protocol is insecure or the page is embedded from an insecure page. +Test mixed content from unsecure WebSocket within Worker blocked from secure page. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS worker onerror. readyState 3 +DONE +TEST COMPLETE + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https.html b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https.html new file mode 100644 index 000000000000..d893e1b2a2eb --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/non-document-mixed-content-blocked.https.html @@ -0,0 +1,44 @@ + + + + +

    Test mixed content from unsecure WebSocket within Worker blocked from secure page.

    +

    +

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

    +
    +
    + + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedded-http.https.html b/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedded-http.https.html new file mode 100644 index 000000000000..61277da8b0e8 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked-embedded-http.https.html @@ -0,0 +1,10 @@ + + + + + +

    Https page with embedded http

    +
    +
    + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.html b/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.html new file mode 100644 index 000000000000..06135f62427a --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.html @@ -0,0 +1,36 @@ + + + + +

    +

    Plain http page trying to connect to a worker.

    +
    +
    + + + diff --git a/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.js b/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.js new file mode 100644 index 000000000000..b802ba0887a0 --- /dev/null +++ b/LayoutTests/http/tests/websocket/tests/hybi/resources/non-document-mixed-content-blocked.js @@ -0,0 +1,29 @@ +if (self.postMessage) + runTests(); +else + onconnect = handleConnect; + +function handleConnect(event) +{ + // For shared workers, create a faux postMessage() API to send message back to the parent page. + self.postMessage = function (message) { event.ports[0].postMessage(message); }; + runTests(); +}; + +function runTests() +{ + var ws = new WebSocket('ws://127.0.0.1:8880/websocket/tests/hybi/simple'); + + ws.onopen = function() { + postMessage("FAIL: worker: Connected. readyState " + ws.readyState); + postMessage("DONE"); + }; + ws.onerror = function(error) { + postMessage("PASS worker onerror. readyState " + ws.readyState); + postMessage("DONE"); + }; + + setTimeout(function() { + postMessage("FAIL worker timeout"); + }, 3000); +} diff --git a/LayoutTests/http/tests/workers/service/resources/serviceworker-websocket-worker.js b/LayoutTests/http/tests/workers/service/resources/serviceworker-websocket-worker.js index d3c51b0ff442..d3b4288a2080 100644 --- a/LayoutTests/http/tests/workers/service/resources/serviceworker-websocket-worker.js +++ b/LayoutTests/http/tests/workers/service/resources/serviceworker-websocket-worker.js @@ -4,18 +4,20 @@ async function doTest(event) event.source.postMessage("FAIL: received unexpected message from client"); return; } - event.source.postMessage("PASS"); try { - var webSocket = new WebSocket('ws://localhost:8880/websocket/tests/hybi/workers/resources/echo'); - + var webSocket = new WebSocket('wss://localhost:9323/websocket/tests/hybi/workers/resources/echo'); webSocket.onerror = (e) => { event.source.postMessage("FAIL: websocket had an error: " + e); }; - webSocket.onopen = () => { + webSocket.onmessage = (e) => { event.source.postMessage("PASS"); }; + + webSocket.onopen = () => { + webSocket.send("PASS?"); + }; } catch (e) { event.source.postMessage("FAIL: exception was raised: " + e); } diff --git a/LayoutTests/http/wpt/credential-management/credentialscontainer-store-basics.https.html b/LayoutTests/http/wpt/credential-management/credentialscontainer-store-basics.https.html index 10d8356bf7e6..3110b00f3ca8 100644 --- a/LayoutTests/http/wpt/credential-management/credentialscontainer-store-basics.https.html +++ b/LayoutTests/http/wpt/credential-management/credentialscontainer-store-basics.https.html @@ -57,16 +57,8 @@ } }; // A mock attestation object - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ - local: { - acceptAuthentication: true, - acceptAttestation: true, - privateKeyBase64: testES256PrivateKeyBase64, - userCertificateBase64: testAttestationCertificateBase64, - intermediateCACertificateBase64: testAttestationIssuingCACertificateBase64 - } - }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "success", payloadBase64: [testCreationMessageBase64] } }); const credential = await navigator.credentials.create(options); return promise_rejects(t, "NotSupportedError", diff --git a/LayoutTests/http/wpt/fetch/disable-speculative-load-for-xhr-and-fetch-loads-expected.txt b/LayoutTests/http/wpt/fetch/disable-speculative-load-for-xhr-and-fetch-loads-expected.txt new file mode 100644 index 000000000000..ea5c8c7da7ec --- /dev/null +++ b/LayoutTests/http/wpt/fetch/disable-speculative-load-for-xhr-and-fetch-loads-expected.txt @@ -0,0 +1,4 @@ + +PASS Ensure fetch is not speculatively loaded +PASS Ensure XHR is not speculatively loaded + diff --git a/LayoutTests/http/wpt/fetch/disable-speculative-load-for-xhr-and-fetch-loads.html b/LayoutTests/http/wpt/fetch/disable-speculative-load-for-xhr-and-fetch-loads.html new file mode 100644 index 000000000000..7a7d1acd5c57 --- /dev/null +++ b/LayoutTests/http/wpt/fetch/disable-speculative-load-for-xhr-and-fetch-loads.html @@ -0,0 +1,73 @@ + + + + + diff --git a/LayoutTests/http/wpt/fetch/request-abort-expected.txt b/LayoutTests/http/wpt/fetch/request-abort-expected.txt index 4ce025e590f4..a487f1a23ad9 100644 --- a/LayoutTests/http/wpt/fetch/request-abort-expected.txt +++ b/LayoutTests/http/wpt/fetch/request-abort-expected.txt @@ -1,5 +1,5 @@ -CONSOLE MESSAGE: line 14: FetchRequestInit.signal should be undefined, null or an AbortSignal object. -CONSOLE MESSAGE: line 28: FetchRequestInit.signal should be undefined, null or an AbortSignal object. +CONSOLE MESSAGE: line 14: FetchRequestInit.signal should be undefined, null or an AbortSignal object. This will throw in a future release. +CONSOLE MESSAGE: line 28: FetchRequestInit.signal should be undefined, null or an AbortSignal object. This will throw in a future release. PASS Request from URL with signal PASS Request from request with signal diff --git a/LayoutTests/http/wpt/fetch/resources/fetch-xhr-load.py b/LayoutTests/http/wpt/fetch/resources/fetch-xhr-load.py new file mode 100644 index 000000000000..5d7cddf1ed03 --- /dev/null +++ b/LayoutTests/http/wpt/fetch/resources/fetch-xhr-load.py @@ -0,0 +1,24 @@ +ETAG = '"123abc"' + + +def main(request, response): + test_id = request.GET.first("uuid") + stashed_count = request.server.stash.take(test_id) + if stashed_count is not None: + stashed_count = stashed_count + 1 + else: + stashed_count = 0; + + request.server.stash.put(test_id, stashed_count) + etag = request.headers.get("If-None-Match", None) + if etag == ETAG: + response.headers.set("X-HTTP-STATUS", 304) + response.status = (304, "Not Modified") + return "" + + # cache miss, so respond with the actual content + response.status = (200, "OK") + response.headers.set("ETag", ETAG) + response.headers.set("Content-Type", 'text/plain') + response.headers.set("Cache-Control", "max-age=0"); + return str(stashed_count) diff --git a/LayoutTests/http/wpt/fetch/resources/xhr-and-fetch.html b/LayoutTests/http/wpt/fetch/resources/xhr-and-fetch.html new file mode 100644 index 000000000000..0833261b84b5 --- /dev/null +++ b/LayoutTests/http/wpt/fetch/resources/xhr-and-fetch.html @@ -0,0 +1,13 @@ + + diff --git a/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-element-focus-expected.txt b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-element-focus-expected.txt new file mode 100644 index 000000000000..be96d48486e2 --- /dev/null +++ b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-element-focus-expected.txt @@ -0,0 +1,6 @@ +Element.focus() shouldn't work in cross-origin iframe without user interaction. + + + +PASS Element.focus() shouldn't work in cross-origin iframe without user interaction + diff --git a/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-element-focus.html b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-element-focus.html new file mode 100644 index 000000000000..3e2f484fb7ab --- /dev/null +++ b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-element-focus.html @@ -0,0 +1,44 @@ + + + + + + + + + + +

    Element.focus() shouldn't work in cross-origin iframe without user interaction.

    + + + + + diff --git a/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-window-focus-expected.txt b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-window-focus-expected.txt new file mode 100644 index 000000000000..b7929642221c --- /dev/null +++ b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-window-focus-expected.txt @@ -0,0 +1,6 @@ +Window.focus() shouldn't work in cross-origin iframe without user interaction. + + + +PASS Window.focus() shouldn't work in cross-origin iframe without user interaction + diff --git a/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-window-focus.html b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-window-focus.html new file mode 100644 index 000000000000..799be3f6496f --- /dev/null +++ b/LayoutTests/http/wpt/html/interaction/focus/no-cross-origin-window-focus.html @@ -0,0 +1,44 @@ + + + + + + + + + + +

    Window.focus() shouldn't work in cross-origin iframe without user interaction.

    + + + + + diff --git a/LayoutTests/http/wpt/html/interaction/focus/resources/child-focus-element.html b/LayoutTests/http/wpt/html/interaction/focus/resources/child-focus-element.html new file mode 100644 index 000000000000..f41364947e42 --- /dev/null +++ b/LayoutTests/http/wpt/html/interaction/focus/resources/child-focus-element.html @@ -0,0 +1,21 @@ + + + + diff --git a/LayoutTests/http/wpt/html/interaction/focus/resources/child-focus-window.html b/LayoutTests/http/wpt/html/interaction/focus/resources/child-focus-window.html new file mode 100644 index 000000000000..e402b0693f6c --- /dev/null +++ b/LayoutTests/http/wpt/html/interaction/focus/resources/child-focus-window.html @@ -0,0 +1,20 @@ + +
    This frame should not be focused!
    + diff --git a/LayoutTests/http/wpt/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub-expected.txt b/LayoutTests/http/wpt/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub-expected.txt new file mode 100644 index 000000000000..f1329e39fe6e --- /dev/null +++ b/LayoutTests/http/wpt/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub-expected.txt @@ -0,0 +1,7 @@ +CONSOLE MESSAGE: Blocked autofocusing on a form control in a cross-origin subframe. +Autofocus shouldn't work in cross-origin iframe. + + + +PASS Autofocus shouldn't work in cross-origin iframe + diff --git a/LayoutTests/http/wpt/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html b/LayoutTests/http/wpt/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html new file mode 100644 index 000000000000..ffff16a7f387 --- /dev/null +++ b/LayoutTests/http/wpt/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html @@ -0,0 +1,44 @@ + + + + + + + + + + +

    Autofocus shouldn't work in cross-origin iframe.

    + + + + + diff --git a/LayoutTests/http/wpt/html/semantics/forms/autofocus/resources/child-autofocus.html b/LayoutTests/http/wpt/html/semantics/forms/autofocus/resources/child-autofocus.html new file mode 100644 index 000000000000..afd5601a523f --- /dev/null +++ b/LayoutTests/http/wpt/html/semantics/forms/autofocus/resources/child-autofocus.html @@ -0,0 +1,20 @@ + + + + diff --git a/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt new file mode 100644 index 000000000000..f61f4079086e --- /dev/null +++ b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect-expected.txt @@ -0,0 +1,3 @@ + +PASS Test navigating to prefetched redirects. + diff --git a/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html new file mode 100644 index 000000000000..d6d5a5bc3a0a --- /dev/null +++ b/LayoutTests/http/wpt/prefetch/link-prefetch-main-resource-redirect.html @@ -0,0 +1,22 @@ + + + + + diff --git a/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py b/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py new file mode 100644 index 000000000000..daa362ff2ef2 --- /dev/null +++ b/LayoutTests/http/wpt/prefetch/resources/main-resource-redirect-no-prefetch.py @@ -0,0 +1,11 @@ +def main(request, response): + headers = [("Content-Type", "text/html")] + + document = """ + + +""".format(result=request.headers.get("Purpose", "")) + + return headers, document diff --git a/LayoutTests/http/wpt/prefetch/resources/navigate.html b/LayoutTests/http/wpt/prefetch/resources/navigate.html new file mode 100644 index 000000000000..44d8bd1b27b0 --- /dev/null +++ b/LayoutTests/http/wpt/prefetch/resources/navigate.html @@ -0,0 +1,14 @@ + + + + + + diff --git a/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py b/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py new file mode 100644 index 000000000000..4c54c1722398 --- /dev/null +++ b/LayoutTests/http/wpt/prefetch/resources/prefetched-main-resource-redirect.py @@ -0,0 +1,5 @@ +def main(request, response): + if "prefetch" in request.headers.get("Purpose"): + headers = [("Cache-Control", "max-age=3600"), ("Location", "/WebKit/prefetch/resources/main-resource-redirect-no-prefetch.py")] + return 302, headers, "" + return 200, [], "FAIL" diff --git a/LayoutTests/http/wpt/webauthn/ctap-hid-failure.https.html b/LayoutTests/http/wpt/webauthn/ctap-hid-failure.https.html index 4f0fd6aa0660..9d53e1d44021 100644 --- a/LayoutTests/http/wpt/webauthn/ctap-hid-failure.https.html +++ b/LayoutTests/http/wpt/webauthn/ctap-hid-failure.https.html @@ -21,50 +21,50 @@ }; promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "data-not-sent" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "init", error: "data-not-sent" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out."); }, "CTAP HID with init sub stage data not sent error in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "empty-report" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "init", error: "empty-report" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out."); }, "CTAP HID with init sub stage empty report error in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-channel-id" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-channel-id" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out."); }, "CTAP HID with init sub stage wrong channel id error in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-nonce" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-nonce" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out."); }, "CTAP HID with init sub stage wrong nonce error in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "msg", error: "data-not-sent" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "msg", error: "data-not-sent" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out."); }, "CTAP HID with msg sub stage data not sent error in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "msg", error: "empty-report" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "msg", error: "empty-report" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out."); }, "CTAP HID with msg sub stage empty report error in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "msg", error: "wrong-channel-id" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "msg", error: "wrong-channel-id" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(defaultOptions), "Operation timed out."); }, "CTAP HID with msg sub stage wrong channel id error in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "wrong-channel-id", payloadBase64:[testDummyMessagePayloadBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "wrong-channel-id", payloadBase64:[testDummyMessagePayloadBase64] } }); return promiseRejects(t, "UnknownError", navigator.credentials.create(defaultOptions), "Unknown internal error. Error code: 18"); }, "CTAP HID with request::msg stage wrong channel id error in a mock hid authenticator."); diff --git a/LayoutTests/http/wpt/webauthn/ctap-hid-success.https.html b/LayoutTests/http/wpt/webauthn/ctap-hid-success.https.html index 8e5d095e5fd9..b6f91f8c3efa 100644 --- a/LayoutTests/http/wpt/webauthn/ctap-hid-success.https.html +++ b/LayoutTests/http/wpt/webauthn/ctap-hid-success.https.html @@ -20,8 +20,8 @@ }; promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "success", payloadBase64: [testCreationMessageBase64], keepAlive: true } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "success", payloadBase64: [testCreationMessageBase64], keepAlive: true } }); return navigator.credentials.create(defaultOptions).then(credential => { assert_not_equals(credential, undefined); assert_not_equals(credential, null); @@ -29,8 +29,8 @@ }, "CTAP HID with keep alive message in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "success", payloadBase64: [testCreationMessageBase64], fastDataArrival: true } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "success", payloadBase64: [testCreationMessageBase64], fastDataArrival: true } }); return navigator.credentials.create(defaultOptions).then(credential => { assert_not_equals(credential, undefined); assert_not_equals(credential, null); @@ -38,8 +38,8 @@ }, "CTAP HID with fast data arrival in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "empty-report", payloadBase64: [testCreationMessageBase64], continueAfterErrorData: true } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "init", error: "empty-report", payloadBase64: [testCreationMessageBase64], continueAfterErrorData: true } }); return navigator.credentials.create(defaultOptions).then(credential => { assert_not_equals(credential, undefined); assert_not_equals(credential, null); @@ -47,8 +47,8 @@ }, "CTAP HID with continue after empty report in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-channel-id", payloadBase64: [testCreationMessageBase64], continueAfterErrorData: true } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-channel-id", payloadBase64: [testCreationMessageBase64], continueAfterErrorData: true } }); return navigator.credentials.create(defaultOptions).then(credential => { assert_not_equals(credential, undefined); assert_not_equals(credential, null); @@ -56,8 +56,8 @@ }, "CTAP HID with continue after wrong channel id in a mock hid authenticator."); promise_test(function(t) { - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-nonce", payloadBase64: [testCreationMessageBase64], continueAfterErrorData: true } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "info", subStage: "init", error: "wrong-nonce", payloadBase64: [testCreationMessageBase64], continueAfterErrorData: true } }); return navigator.credentials.create(defaultOptions).then(credential => { assert_not_equals(credential, undefined); assert_not_equals(credential, null); diff --git a/LayoutTests/http/wpt/webauthn/ctap-nfc-failure.https-expected.txt b/LayoutTests/http/wpt/webauthn/ctap-nfc-failure.https-expected.txt new file mode 100644 index 000000000000..ad05b3cdc237 --- /dev/null +++ b/LayoutTests/http/wpt/webauthn/ctap-nfc-failure.https-expected.txt @@ -0,0 +1,4 @@ + +PASS CTAP NFC with empty apdu response in a mock nfc authenticator. +PASS CTAP NFC with wrong data error in a mock nfc authenticator. + diff --git a/LayoutTests/http/wpt/webauthn/ctap-nfc-failure.https.html b/LayoutTests/http/wpt/webauthn/ctap-nfc-failure.https.html new file mode 100644 index 000000000000..205060ac67f4 --- /dev/null +++ b/LayoutTests/http/wpt/webauthn/ctap-nfc-failure.https.html @@ -0,0 +1,34 @@ + +Web Authentication API: CTAP NFC failure cases with a mock nfc authenticator. + + + + diff --git a/LayoutTests/http/wpt/webauthn/idl.https.html b/LayoutTests/http/wpt/webauthn/idl.https.html index db63f6ccc75f..afcb4f1f56ad 100644 --- a/LayoutTests/http/wpt/webauthn/idl.https.html +++ b/LayoutTests/http/wpt/webauthn/idl.https.html @@ -19,17 +19,6 @@

    Description

    diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-hid.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-hid.https.html index 2f837c66326b..10cfeadfe562 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-hid.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-hid.https.html @@ -5,8 +5,8 @@ diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-local-silent.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-local-silent.https.html index 966c82632ae9..821693aa27a9 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-local-silent.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-local-silent.https.html @@ -5,8 +5,8 @@ diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-nfc.https-expected.txt b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-nfc.https-expected.txt new file mode 100644 index 000000000000..e725098af735 --- /dev/null +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-nfc.https-expected.txt @@ -0,0 +1,8 @@ + +PASS PublicKeyCredential's [[create]] with timeout in a mock nfc authenticator. +PASS PublicKeyCredential's [[create]] with no tags in a mock nfc authenticator. +PASS PublicKeyCredential's [[create]] with wrong tag type in a mock nfc authenticator. +PASS PublicKeyCredential's [[create]] with no connections in a mock nfc authenticator. +PASS PublicKeyCredential's [[create]] with null version in a mock nfc authenticator. +PASS PublicKeyCredential's [[create]] with wrong version in a mock nfc authenticator. + diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html new file mode 100644 index 000000000000..25353f09268a --- /dev/null +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-nfc.https.html @@ -0,0 +1,140 @@ + +Web Authentication API: PublicKeyCredential's [[create]] failure cases with a mock nfc authenticator. + + + + diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f-silent.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f-silent.https.html index 641c0ef7ca06..7d91a2b1a762 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f-silent.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f-silent.https.html @@ -21,8 +21,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: ["AQ=="] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: ["AQ=="] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "Operation timed out."); }, "PublicKeyCredential's [[create]] with malformed APDU payload in a mock hid authenticator."); @@ -43,8 +43,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "Operation timed out."); }, "PublicKeyCredential's [[create]] with malformed U2F register response in a mock hid authenticator."); @@ -65,8 +65,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduInsNotSupportedOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduInsNotSupportedOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "Operation timed out."); }, "PublicKeyCredential's [[create]] with register command error in a mock hid authenticator."); @@ -88,8 +88,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduInsNotSupportedOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduInsNotSupportedOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "Operation timed out."); }, "PublicKeyCredential's [[create]] with bogus command error in a mock hid authenticator."); @@ -111,8 +111,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "InvalidStateError", navigator.credentials.create(options), "At least one credential matches an entry of the excludeCredentials list in the authenticator."); }, "PublicKeyCredential's [[create]] with first exclude credential matched in a mock hid authenticator."); @@ -135,8 +135,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "InvalidStateError", navigator.credentials.create(options), "At least one credential matches an entry of the excludeCredentials list in the authenticator."); }, "PublicKeyCredential's [[create]] with second exclude credential matched in a mock hid authenticator."); @@ -158,8 +158,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.create(options), "Operation timed out."); }, "PublicKeyCredential's [[create]] with first exclude credential matched in a mock hid authenticator. Test of user presence."); diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f.https.html index 157d9e88a06b..947dcff2bf50 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure-u2f.https.html @@ -20,8 +20,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: ["AQ=="] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: ["AQ=="] } }); return promiseRejects(t, "UnknownError", navigator.credentials.create(options), "Couldn't parse the APDU response."); }, "PublicKeyCredential's [[create]] with malformed APDU payload in a mock hid authenticator."); @@ -41,8 +41,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "UnknownError", navigator.credentials.create(options), "Couldn't parse the U2F register response."); }, "PublicKeyCredential's [[create]] with malformed U2F register response in a mock hid authenticator."); @@ -62,8 +62,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduInsNotSupportedOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduInsNotSupportedOnlyResponseBase64] } }); return promiseRejects(t, "UnknownError", navigator.credentials.create(options), "Unknown internal error. Error code: 27904"); }, "PublicKeyCredential's [[create]] with register command error in a mock hid authenticator."); @@ -84,8 +84,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduInsNotSupportedOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduInsNotSupportedOnlyResponseBase64] } }); return promiseRejects(t, "UnknownError", navigator.credentials.create(options), "Unknown internal error. Error code: 27904"); }, "PublicKeyCredential's [[create]] with bogus command error in a mock hid authenticator."); @@ -106,8 +106,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "InvalidStateError", navigator.credentials.create(options), "At least one credential matches an entry of the excludeCredentials list in the authenticator."); }, "PublicKeyCredential's [[create]] with first exclude credential matched in a mock hid authenticator."); @@ -129,8 +129,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "InvalidStateError", navigator.credentials.create(options), "At least one credential matches an entry of the excludeCredentials list in the authenticator."); }, "PublicKeyCredential's [[create]] with second exclude credential matched in a mock hid authenticator."); @@ -151,8 +151,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduConditionsNotSatisfiedOnlyResponseBase64, testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "InvalidStateError", navigator.credentials.create(options), "At least one credential matches an entry of the excludeCredentials list in the authenticator."); }, "PublicKeyCredential's [[create]] with first exclude credential matched in a mock hid authenticator. Test of user presence."); diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure.https.html index 4642a5ba0fbe..1d6ed9054b83 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-failure.https.html @@ -5,8 +5,8 @@ diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-local.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-local.https.html index f155008c284b..1f89a0b69e38 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-local.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-local.https.html @@ -6,8 +6,8 @@ + + + + diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-u2f.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-u2f.https.html index 8fa1c3c48fa9..9989bc16da97 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-u2f.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-create-success-u2f.https.html @@ -5,36 +5,6 @@ diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid-silent.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid-silent.https.html index e85c2c84af72..38f40749e95a 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid-silent.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid-silent.https.html @@ -12,8 +12,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", payloadBase64: [testDummyMessagePayloadBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", payloadBase64: [testDummyMessagePayloadBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with malicious payload in a mock hid authenticator."); @@ -26,8 +26,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "unsupported-options" } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "unsupported-options" } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with unsupported options in a mock hid authenticator."); @@ -39,8 +39,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", payloadBase64: [testCtapErrInvalidCredentialResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", payloadBase64: [testCtapErrInvalidCredentialResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with invalid credential in a mock hid authenticator."); @@ -52,8 +52,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", canDowngrade: true, payloadBase64: [testCtapErrInvalidCredentialResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", canDowngrade: true, payloadBase64: [testCtapErrInvalidCredentialResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with authenticator downgrade in a mock hid authenticator."); @@ -66,8 +66,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", canDowngrade: true, payloadBase64: [testCtapErrInvalidCredentialResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", canDowngrade: true, payloadBase64: [testCtapErrInvalidCredentialResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with authenticator downgrade in a mock hid authenticator. 2"); diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https-expected.txt b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https-expected.txt index 61b3afaf1f2c..54bb50867c92 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https-expected.txt +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https-expected.txt @@ -3,5 +3,6 @@ PASS PublicKeyCredential's [[get]] with timeout in a mock hid authenticator. PASS PublicKeyCredential's [[get]] with malicious payload in a mock hid authenticator. PASS PublicKeyCredential's [[get]] with unsupported options in a mock hid authenticator. PASS PublicKeyCredential's [[get]] with authenticator downgrade failed in a mock hid authenticator. -PASS PublicKeyCredential's [[get]] with authenticator downgrade succeeded and then U2F failed in a mock hid authenticator. 2 +PASS PublicKeyCredential's [[get]] with authenticator downgrade failed in a mock hid authenticator. 2 +PASS PublicKeyCredential's [[get]] with authenticator downgrade succeeded and then U2F failed in a mock hid authenticator. diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https.html index 5485f370d679..68e3ce20a751 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-hid.https.html @@ -5,8 +5,8 @@ diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-local-silent.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-local-silent.https.html index 0507d45631de..d12e102c2ce6 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-local-silent.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-local-silent.https.html @@ -5,8 +5,8 @@ + + + diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f-silent.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f-silent.https.html index 8a7cd8a5bb91..ae5bbdd3e38b 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f-silent.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f-silent.https.html @@ -13,8 +13,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with malformed sign response in a mock hid authenticator."); @@ -27,8 +27,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with no matched allow credentials in a mock hid authenticator."); @@ -41,8 +41,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ silentFailure: true, hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "Operation timed out."); }, "PublicKeyCredential's [[get]] with no matched allow credentials in a mock hid authenticator. 2"); diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f.https.html index 6491378284eb..5d1d300e6885 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure-u2f.https.html @@ -12,8 +12,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduNoErrorOnlyResponseBase64] } }); return promiseRejects(t, "UnknownError", navigator.credentials.get(options), "Couldn't parse the U2F sign response."); }, "PublicKeyCredential's [[get]] with malformed sign response in a mock hid authenticator."); @@ -25,8 +25,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "No credentials from the allowCredentials list is found in the authenticator."); }, "PublicKeyCredential's [[get]] with no matched allow credentials in a mock hid authenticator."); @@ -38,8 +38,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "No credentials from the allowCredentials list is found in the authenticator."); }, "PublicKeyCredential's [[get]] with no matched allow credentials in a mock hid authenticator. 2"); @@ -53,8 +53,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "No credentials from the allowCredentials list is found in the authenticator."); }, "PublicKeyCredential's [[get]] with no matched allow credentials in a mock hid authenticator. (AppID)"); @@ -67,8 +67,8 @@ } }; - if (window.testRunner) - testRunner.setWebAuthenticationMockConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); + if (window.internals) + internals.setMockWebAuthenticationConfiguration({ hid: { stage: "request", subStage: "msg", error: "malicious-payload", isU2f: true, payloadBase64: [testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64, testU2fApduWrongDataOnlyResponseBase64] } }); return promiseRejects(t, "NotAllowedError", navigator.credentials.get(options), "No credentials from the allowCredentials list is found in the authenticator."); }, "PublicKeyCredential's [[get]] with no matched allow credentials in a mock hid authenticator. 2 (AppID)"); diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure.https.html index e2f95d67d8d8..36b41f76fe6a 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-failure.https.html @@ -5,8 +5,8 @@ diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-local.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-local.https.html index 73aeccf5ac88..d032fc67e820 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-local.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-local.https.html @@ -5,8 +5,8 @@ + + + diff --git a/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-u2f.https.html b/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-u2f.https.html index c857114f977f..0f0008ab543f 100644 --- a/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-u2f.https.html +++ b/LayoutTests/http/wpt/webauthn/public-key-credential-get-success-u2f.https.html @@ -4,31 +4,6 @@ - + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/MediaQueryList-with-empty-string.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/MediaQueryList-with-empty-string.html index 3d5a53165664..8b90d2367bd3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/MediaQueryList-with-empty-string.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/MediaQueryList-with-empty-string.html @@ -1,8 +1,8 @@ cssom-view - MediaQueryList with empty string - - + + - + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/cssom-getBoundingClientRect-001.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/cssom-getBoundingClientRect-001.html index 7d96540adfe9..f3430660573f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/cssom-getBoundingClientRect-001.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/cssom-getBoundingClientRect-001.html @@ -6,8 +6,8 @@ - - + + + + +
    +
    +
    +
    +
    +
    + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/elementFromPoint.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/elementFromPoint.html index 33de41e90f65..ceeb21c69d09 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/elementFromPoint.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/elementFromPoint.html @@ -1,7 +1,7 @@ cssom-view - elementFromPoint - - + + +

    There should be nothing below.

    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/historical.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/historical.html index bf82eac1157a..56cedf44e363 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/historical.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/historical.html @@ -1,8 +1,8 @@ Historical features - - + +
    - + +
    ...
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/inheritance-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/inheritance-expected.txt new file mode 100644 index 000000000000..875a727c9588 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/inheritance-expected.txt @@ -0,0 +1,4 @@ + +PASS Property scroll-behavior has initial value auto +PASS Property scroll-behavior does not inherit + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/inheritance.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/inheritance.html new file mode 100644 index 000000000000..2abbda83bacb --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/inheritance.html @@ -0,0 +1,21 @@ + + + + +Inheritance of CSSOM View properties + + + + + + + + +
    +
    +
    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/interfaces.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/interfaces.html index c5e83b826196..a0bb02e336e0 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/interfaces.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/interfaces.html @@ -4,8 +4,8 @@ CSSOM View automated IDL tests - - + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/long_scroll_composited-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/long_scroll_composited-expected.html new file mode 100644 index 000000000000..6914cba30972 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/long_scroll_composited-expected.html @@ -0,0 +1,41 @@ + + +Long scrolling should work properly + + + + + + +

    The number 7 should be visible in the scrolled window below.

    + +
    +
    +
    +
    +
    7
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/long_scroll_composited.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/long_scroll_composited.html new file mode 100644 index 000000000000..aa91023c1ac4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/long_scroll_composited.html @@ -0,0 +1,50 @@ + + +Long scrolling should work properly + + + + + + +

    The number 7 should be visible in the scrolled window below.

    + +
    +
    +
    +
    0
    +
    1
    +
    2
    +
    3
    +
    4
    +
    5
    +
    6
    +
    7
    +
    8
    +
    9
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia-display-none-iframe-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia-display-none-iframe-expected.txt new file mode 100644 index 000000000000..3ce409232137 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia-display-none-iframe-expected.txt @@ -0,0 +1,4 @@ + +PASS matchMedia should work in display: none iframes +PASS matchMedia should assume a 0x0 viewport in display: none iframes + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia-display-none-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia-display-none-iframe.html new file mode 100644 index 000000000000..8c598e198393 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia-display-none-iframe.html @@ -0,0 +1,19 @@ + +CSS Test: matchMedia works on display: none iframes + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia.xht b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia.xht index 7ac875c6aa96..1dfde7fe6f52 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia.xht +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/matchMedia.xht @@ -3,13 +3,14 @@ CSS Test: CSSOM View matchMedia and MediaQueryList + - - + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/mouseEvent.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/mouseEvent.html index 907a2b405e44..4d4b912fcb17 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/mouseEvent.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/mouseEvent.html @@ -2,8 +2,8 @@ CSSOM MouseEvent tests - - + + - + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetParent_element_test.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetParent_element_test.html index bb5686d41dae..1090ffbee7fd 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetParent_element_test.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetParent_element_test.html @@ -6,8 +6,8 @@ - - + + +
    + offset +
    offsetref +
    +
    + offset +
    offsetref +
    +
    + offset +
    offsetref +
    +
    + offset +
    offsetref +
    +
    + offset +
    offsetref +
    +
    + offset +
    offsetref +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline.html new file mode 100644 index 000000000000..b3954ef5eae8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-empty-inline.html @@ -0,0 +1,32 @@ + + + + + +
    +
    ref +
    +
    +
    ref +
    +
    +
    ref +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-inline-expected.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-inline-expected.html new file mode 100644 index 000000000000..98ee818a8468 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-inline-expected.html @@ -0,0 +1,4 @@ + +CSS Reftest Reference + +

    There should be nothing below.

    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-inline.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-inline.html new file mode 100644 index 000000000000..772cc34f05bf --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-inline.html @@ -0,0 +1,54 @@ + + + + + +

    There should be nothing below.

    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    +
    +
    FAIL +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline-expected.txt new file mode 100644 index 000000000000..aac398080dda --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline-expected.txt @@ -0,0 +1,11 @@ + +ref + +ref + +ref + +FAIL offsetTop/Left of empty inline elements should work as if they were not empty: 0 assert_equals: offsetLeft expected 16 but got 0 +FAIL offsetTop/Left of empty inline elements should work as if they were not empty: 1 assert_equals: offsetLeft expected 34 but got 0 +FAIL offsetTop/Left of empty inline elements should work as if they were not empty: 2 assert_equals: offsetLeft expected 34 but got 0 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline.html new file mode 100644 index 000000000000..f3c2c06d4ac6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-leading-space-inline.html @@ -0,0 +1,32 @@ + + + + + +
    +
    ref +
    +
    +
    ref +
    +
    +
    ref +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline-expected.txt new file mode 100644 index 000000000000..3b05620c7876 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline-expected.txt @@ -0,0 +1,11 @@ + +ref + +ref + +ref + +PASS offsetTop/Left of empty inline elements should work as if they were not empty: 0 +PASS offsetTop/Left of empty inline elements should work as if they were not empty: 1 +PASS offsetTop/Left of empty inline elements should work as if they were not empty: 2 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline.html new file mode 100644 index 000000000000..ebec51cb764e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeft-trailing-space-inline.html @@ -0,0 +1,36 @@ + + + + + +
    +
    ref +
    +
    +
    ref +
    +
    +
    ref +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeftInScrollableParent.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeftInScrollableParent.html index 8f4433795424..f38c2b155a1e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeftInScrollableParent.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/offsetTopLeftInScrollableParent.html @@ -1,8 +1,8 @@ - - + +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/outer-svg-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/outer-svg-expected.txt new file mode 100644 index 000000000000..4519122a7ec2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/outer-svg-expected.txt @@ -0,0 +1,4 @@ + +PASS clientWidth, clientHeight, clientTop and clientLeft work on outer svg element +PASS scrollWidth, scrollHeight, scrollTop and scrollLeft work on outer svg element + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/outer-svg.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/outer-svg.html new file mode 100644 index 000000000000..6ed8cccbb17c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/outer-svg.html @@ -0,0 +1,35 @@ + +CSS Tests: client* and scroll* APIs work as expected with outer SVG elements + + + + + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/resize-event-on-initial-layout-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/resize-event-on-initial-layout-expected.txt new file mode 100644 index 000000000000..ce89293a3f56 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/resize-event-on-initial-layout-expected.txt @@ -0,0 +1,3 @@ + +PASS resize events are not fired on the initial layout + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/resize-event-on-initial-layout.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/resize-event-on-initial-layout.html new file mode 100644 index 000000000000..7638536a9f3c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/resize-event-on-initial-layout.html @@ -0,0 +1,18 @@ + + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/screenLeftTop-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/screenLeftTop-expected.txt new file mode 100644 index 000000000000..d9318b1c3961 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/screenLeftTop-expected.txt @@ -0,0 +1,4 @@ + +PASS screenLeft +PASS screenTop + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/screenLeftTop.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/screenLeftTop.html new file mode 100644 index 000000000000..b87fde820267 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/screenLeftTop.html @@ -0,0 +1,16 @@ + + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scroll-behavior-default-css.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scroll-behavior-default-css.html index 8606b1f3ed40..6925cf092c6f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scroll-behavior-default-css.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scroll-behavior-default-css.html @@ -4,8 +4,8 @@ - - + + + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-horizontal-tb-writing-mode-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-horizontal-tb-writing-mode-expected.txt new file mode 100644 index 000000000000..7efe71b3bbd3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-horizontal-tb-writing-mode-expected.txt @@ -0,0 +1,11 @@ + +PASS scrollIntoView({"block":"start","inline":"start"}) +PASS scrollIntoView({"block":"start","inline":"center"}) +PASS scrollIntoView({"block":"start","inline":"end"}) +PASS scrollIntoView({"block":"center","inline":"start"}) +PASS scrollIntoView({"block":"center","inline":"center"}) +PASS scrollIntoView({"block":"center","inline":"end"}) +PASS scrollIntoView({"block":"end","inline":"start"}) +PASS scrollIntoView({"block":"end","inline":"center"}) +PASS scrollIntoView({"block":"end","inline":"end"}) + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-horizontal-tb-writing-mode.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-horizontal-tb-writing-mode.html new file mode 100644 index 000000000000..70d19f33eea6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-horizontal-tb-writing-mode.html @@ -0,0 +1,106 @@ + +CSSOM View - scrollIntoView considers horizontal-tb writing mode + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-scrollMargin.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-scrollMargin.html index 930702aa8792..99854d8c6bca 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-scrollMargin.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-scrollMargin.html @@ -4,8 +4,8 @@ - - + + + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-lr-writing-mode-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-lr-writing-mode-expected.txt new file mode 100644 index 000000000000..7efe71b3bbd3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-lr-writing-mode-expected.txt @@ -0,0 +1,11 @@ + +PASS scrollIntoView({"block":"start","inline":"start"}) +PASS scrollIntoView({"block":"start","inline":"center"}) +PASS scrollIntoView({"block":"start","inline":"end"}) +PASS scrollIntoView({"block":"center","inline":"start"}) +PASS scrollIntoView({"block":"center","inline":"center"}) +PASS scrollIntoView({"block":"center","inline":"end"}) +PASS scrollIntoView({"block":"end","inline":"start"}) +PASS scrollIntoView({"block":"end","inline":"center"}) +PASS scrollIntoView({"block":"end","inline":"end"}) + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-lr-writing-mode.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-lr-writing-mode.html new file mode 100644 index 000000000000..8ccfde66f554 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-lr-writing-mode.html @@ -0,0 +1,107 @@ + +CSSOM View - scrollIntoView considers vertical-lr writing mode + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode-expected.txt index b605c84842e8..7efe71b3bbd3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode-expected.txt @@ -1,11 +1,11 @@ -FAIL scrollIntoView({block: "start", inline: "start"}) assert_approx_equals: scrollX expected -200 +/- 0.5 but got -100 -FAIL scrollIntoView({block: "start", inline: "center"}) assert_approx_equals: scrollX expected -200 +/- 0.5 but got -143 -FAIL scrollIntoView({block: "start", inline: "end"}) assert_approx_equals: scrollX expected -200 +/- 0.5 but got -185 -FAIL scrollIntoView({block: "center", inline: "start"}) assert_approx_equals: scrollX expected -157.5 +/- 0.5 but got -100 -FAIL scrollIntoView({block: "center", inline: "center"}) assert_approx_equals: scrollX expected -157.5 +/- 0.5 but got -143 -FAIL scrollIntoView({block: "center", inline: "end"}) assert_approx_equals: scrollX expected -157.5 +/- 0.5 but got -185 -FAIL scrollIntoView({block: "end", inline: "start"}) assert_approx_equals: scrollX expected -115 +/- 0.5 but got -100 -FAIL scrollIntoView({block: "end", inline: "center"}) assert_approx_equals: scrollX expected -115 +/- 0.5 but got -143 -FAIL scrollIntoView({block: "end", inline: "end"}) assert_approx_equals: scrollX expected -115 +/- 0.5 but got -185 +PASS scrollIntoView({"block":"start","inline":"start"}) +PASS scrollIntoView({"block":"start","inline":"center"}) +PASS scrollIntoView({"block":"start","inline":"end"}) +PASS scrollIntoView({"block":"center","inline":"start"}) +PASS scrollIntoView({"block":"center","inline":"center"}) +PASS scrollIntoView({"block":"center","inline":"end"}) +PASS scrollIntoView({"block":"end","inline":"start"}) +PASS scrollIntoView({"block":"end","inline":"center"}) +PASS scrollIntoView({"block":"end","inline":"end"}) diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode.html index c404931f79b4..6a20e2f29148 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode.html +++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/scrollIntoView-vertical-rl-writing-mode.html @@ -3,8 +3,8 @@ - - + + + +
    +
    +
    +
    +
    +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt index 02f6a828305a..4fee7f2723a5 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt @@ -1,10 +1,8 @@ Pointer Event: Boundary event sequence at implicit capture release -Follow the test instructions with mouse. If you don't have the device skip it. - When a captured pointer is implicitly released after a click, the boundary events should follow the lostpointercapture event. Click on the black box with mouse and do not move the mouse after or during the click. -FAIL mouse Event sequence at implicit release on click assert_equals: expected "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target" but got "gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target" +PASS mouse Event sequence at implicit release on click diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-expected.txt new file mode 100644 index 000000000000..bd7a81c36cc8 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-expected.txt @@ -0,0 +1,18 @@ +Pointer Events capture test - lostpointercapture order + +Test Description: This test checks if lostpointercapture is handled asynchronously and prior to all subsequent events. Complete the following actions: +Press and hold left mouse button over "Set Capture" button and move a little. "gotpointercapture" should be logged inside of the black rectangle +"lostpointercapture" should be logged inside of the black rectangle after pointerup + +Test passes if lostpointercapture is dispatched after releasing the mouse button and before any additional pointer events. + + +Pointer Events Capture Test + +The following pointer types were detected: mouse. + +The following events were logged: gotpointercapture@target0, lostpointercapture@target0. + + +PASS lostpointercapture is dispatched prior to subsequent events + diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt index 8ae0fa221a49..199239c6611e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt @@ -1,5 +1,5 @@ -FAIL Mouse down and capture to green. assert_array_equals: Received events: green received pointerover,green received pointerenter,green received pointermove,green received pointerdown,green received gotpointercapture,green received pointermove,green received pointerout,green received pointerleave,green received pointerover,green received pointerenter,green received pointermove lengths differ, expected 7 got 11 -FAIL Mouse down at green and capture to blue. assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received pointermove,green received pointermove,green received pointermove lengths differ, expected 11 got 7 -FAIL Mouse down and capture to green, move to blue and release capture assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received lostpointercapture,green received pointermove,green received pointerout,green received pointerleave,blue received pointerover,blue received pointerenter,blue received pointermove,blue received pointermove property 0, expected "green received pointerover" but got "green received pointerout" +PASS Mouse down and capture to green. +PASS Mouse down at green and capture to blue. +PASS Mouse down and capture to green, move to blue and release capture diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer-expected.txt deleted file mode 100644 index 9995fdcfafbd..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer-expected.txt +++ /dev/null @@ -1,4 +0,0 @@ - - -FAIL setPointerCapture: outer frame capture pointer active in inner frame assert_unreached: It should not be possible to capture mouse pointer when it's activate in inner frame Reached unreachable code - diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer.html b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer.html deleted file mode 100644 index 524d19eecebf..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - -
    - -
    - - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt index db8c51d0cddf..36e040ea01bf 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt @@ -16,14 +16,11 @@ Test complete: Scroll to Summary to view Pass/Fail Results. The following pointer types were detected: mouse. -The following events were logged: pointerover@target1, gotpointercapture@target0, pointerover@target0, pointerover@target0, lostpointercapture@target0. +The following events were logged: pointerover@target1, pointerover@target0, gotpointercapture@target0, lostpointercapture@target0. Refresh the page to run the tests again with a different pointer type. -Harness Error (FAIL), message = 1 duplicate test name: "relatedTarget should not be null even when the capture is set." - PASS pointerover shouldn't trigger for the purple rectangle while the black rectangle has capture PASS relatedTarget should not be null even when the capture is set. -PASS relatedTarget should not be null even when the capture is set. diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_coordinates_when_locked-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_coordinates_when_locked-expected.txt new file mode 100644 index 000000000000..e3873e6a3be4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_coordinates_when_locked-expected.txt @@ -0,0 +1,13 @@ +Pointer Events movement in locked state test + +Follow the test instructions with mouse. If you don't have the device skip it. + +Test Description: This test checks the pointer event coordinates stays unchanged when pointer is locked. +Click left mouse button on the green rectangle. +Move the mouse around. +Click left mouse button again. +Test passes if the proper behavior of the events is observed. + + +FAIL mouse Test pointerevent coordinates when pointer is locked assert_equals: clientX expected 41 but got 183 + diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html index 9dfd5e1764d3..a79327252277 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html +++ b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html @@ -3,7 +3,7 @@ Pointer Events pointer lock tests - + @@ -36,21 +36,19 @@ var test_pointerEvent = setup_pointerevent_test("Test pointerevent coordinates when pointer is locked", ['mouse']); var div1 = document.getElementById("target"); - on_event(div1, 'pointerdown', function(event) { + on_event(div1, 'click', function(event) { if (test_state == kStateInit) div1.requestPointerLock(); - }); - on_event(div1, 'pointerup', function(event) { - if (test_state == kStateLocked) + else if (test_state == kStateLocked) document.exitPointerLock(); }); on_event(div1, 'pointermove', function(event) { if (test_state == kStateLocked) { test_pointerEvent.step(function() { - assert_equals(last_pointer_client_pos['x'], event.clientX) - assert_equals(last_pointer_client_pos['y'], event.clientY) - assert_equals(last_pointer_screen_pos['x'], event.screenX) - assert_equals(last_pointer_screen_pos['y'], event.screenY) + assert_equals(event.clientX, last_pointer_client_pos['x'], 'clientX') + assert_equals(event.clientY, last_pointer_client_pos['y'], 'clientY') + assert_equals(event.screenX, last_pointer_screen_pos['x'], 'screenX') + assert_equals(event.screenY, last_pointer_screen_pos['y'], 'screenY') }); } else { last_pointer_client_pos = {'x': event.clientX, 'y': event.clientY} @@ -63,6 +61,17 @@ test_pointerEvent.step(function() { assert_equals(document.pointerLockElement, div1, "document.pointerLockElement should be div1."); }); + + var actions = new test_driver.Actions(); + pos_x = div1.offsetWidth / 2; + pos_y = div1.offsetHeight / 2; + for (var i = 0; i < 10; i++) { + // Move left and up. + pos_x += 10; + pos_y -= 10; + actions.pointerMove(pos_x, pos_y, {origin: div1}); + } + actions.pointerDown().pointerUp().send(); } else if (test_state == kStateLocked) { test_state = kStateUnlocked; test_pointerEvent.step(function() { @@ -72,18 +81,7 @@ } }); - var actions = new test_driver.Actions(); - actions.pointerMove(/* x = */ 0, /* y = */ 0, {origin: div1}).pointerDown(); - - pos_x = div1.offsetWidth / 2; - pos_y = div1.offsetHeight / 2; - for (var i = 0; i < 10; i++) { - // Alternatively move left/right and up/down. - pos_x += ((-1)**i) * i * 10; - pos_y -= ((-1)**i) * i * 10; - actions.pointerMove(pos_x, pos_y, {origin: div1}); - } - actions.pointerUp().send(); + new test_driver.Actions().pointerMove(/* x = */ 0, /* y = */ 0, {origin: div1}).pointerDown().pointerUp().send(); } @@ -93,16 +91,16 @@

    Test Description: This test checks the pointer event coordinates stays unchanged when pointer is locked.
      -
    1. Press left button down on the green rectangle and hold it.
    2. -
    3. Move the mouse inside the green rectangle.
    4. -
    5. Release mouse button.
    6. +
    7. Click left mouse button on the green rectangle.
    8. +
    9. Move the mouse around.
    10. +
    11. Click left mouse button again.
    Test passes if the proper behavior of the events is observed.

    -
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/resources/pointerevent_mouse_pointercapture_inactivate_pointer-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/pointerevents/resources/pointerevent_mouse_pointercapture_inactivate_pointer-iframe.html deleted file mode 100644 index d4b4af1fba1d..000000000000 --- a/LayoutTests/imported/w3c/web-platform-tests/pointerevents/resources/pointerevent_mouse_pointercapture_inactivate_pointer-iframe.html +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/LayoutTests/imported/w3c/web-platform-tests/preload/dynamic-adding-preload-imagesrcset.html b/LayoutTests/imported/w3c/web-platform-tests/preload/dynamic-adding-preload-imagesrcset.html index e1b8431d7bca..6188355e26eb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/preload/dynamic-adding-preload-imagesrcset.html +++ b/LayoutTests/imported/w3c/web-platform-tests/preload/dynamic-adding-preload-imagesrcset.html @@ -9,6 +9,12 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/postmessage.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/postmessage.https.html index 17046eedc6bd..99dedebf2e56 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/postmessage.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/postmessage.https.html @@ -12,7 +12,12 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + registration = r; + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { @@ -28,7 +33,6 @@ }) .then(function(result) { assert_equals(result, 'OK'); - return service_worker_unregister_and_done(t, scope); }); }, 'Post loopback messages'); @@ -41,6 +45,10 @@ return service_worker_unregister_and_register(t, script1, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + registration = r; return wait_for_state(t, registration.installing, 'activated'); }) @@ -69,7 +77,6 @@ .then(function(result) { assert_equals(result, 'OK'); frame.remove(); - return service_worker_unregister_and_done(t, scope); }); }, 'Post messages among service workers'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html index 313309188071..1a124d727687 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/unregister.https.html @@ -11,6 +11,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'redundant'); }) .then(function() { @@ -21,7 +25,6 @@ result, undefined, 'After unregister(), the registration should not found'); - return service_worker_unregister_and_done(t, scope); }); }, 'Unregister on script evaluation'); @@ -31,6 +34,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'redundant'); }) .then(function() { @@ -41,7 +48,6 @@ result, undefined, 'After unregister(), the registration should not found'); - return service_worker_unregister_and_done(t, scope); }); }, 'Unregister on installing event'); @@ -51,6 +57,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'redundant'); }) .then(function() { @@ -61,7 +71,6 @@ result, undefined, 'After unregister(), the registration should not found'); - return service_worker_unregister_and_done(t, scope); }); }, 'Unregister on activate event'); @@ -74,6 +83,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { return with_iframe(scope); }) @@ -120,7 +133,6 @@ frame.remove(); new_frame.remove(); - return service_worker_unregister_and_done(t, scope); }) }, 'Unregister controlling service worker'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html index a9285a1c9e2d..a7dde2233972 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/update.https.html @@ -13,6 +13,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + registration = r; return wait_for_state(t, registration.installing, 'activated'); }) @@ -38,7 +42,6 @@ 'events seen by the worker'); frame1.remove(); frame2.remove(); - return service_worker_unregister_and_done(t, scope); }); }, 'Update a registration on ServiceWorkerGlobalScope'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/about-blank-replacement.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/about-blank-replacement.https.html index e1fefaf290fe..b6efe3ec5620 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/about-blank-replacement.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/about-blank-replacement.https.html @@ -60,6 +60,9 @@ async function doAsyncTest(t, scope) { let reg = await service_worker_unregister_and_register(t, worker, scope); + + t.add_cleanup(() => service_worker_unregister(t, scope)); + await wait_for_state(t, reg.installing, 'activated'); // Load the scope as a frame. We expect this in turn to have a nested @@ -96,7 +99,6 @@ } frame.remove(); - await service_worker_unregister_and_done(t, scope); } promise_test(async function(t) { @@ -126,6 +128,9 @@ const scope = 'resources/about-blank-replacement-uncontrolled-nested-frame.html'; let reg = await service_worker_unregister_and_register(t, worker, scope); + + t.add_cleanup(() => service_worker_unregister(t, scope)); + await wait_for_state(t, reg.installing, 'activated'); // Load the scope as a frame. We expect this in turn to have a nested @@ -147,7 +152,6 @@ 'nested frame should not be controlled'); frame.remove(); - await service_worker_unregister_and_done(t, scope); }, 'Initial about:blank is controlled, exposed to clients.matchAll(), and ' + 'final Client is not controlled by a service worker.'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/activate-event-after-install-state-change.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/activate-event-after-install-state-change.https.html index 57fccf13712d..016a52c13c82 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/activate-event-after-install-state-change.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/activate-event-after-install-state-change.https.html @@ -11,6 +11,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + var sw = registration.installing; return new Promise(t.step_func(function(resolve) { @@ -23,9 +27,6 @@ }); })); }) - .then(function() { - return service_worker_unregister_and_done(t, scope); - }) .catch(unreached_rejection(t)); }, 'installed event should be fired before activating service worker'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/appcache-ordering-main.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/appcache-ordering-main.https.html index 921dae015cb5..a86671c1fe4e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/appcache-ordering-main.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/appcache-ordering-main.https.html @@ -5,7 +5,6 @@ + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-fetch.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-fetch.https.html index 050c1ea92ef6..400b593ac961 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-fetch.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-fetch.https.html @@ -7,63 +7,80 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-not-using-registration.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-not-using-registration.https.html index 1138b7419cfa..fd61d05ba4ea 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-not-using-registration.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-not-using-registration.https.html @@ -15,6 +15,10 @@ return service_worker_unregister_and_register( t, init_worker_url, init_scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, init_scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { @@ -35,6 +39,10 @@ {scope: claim_scope}); }) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, claim_scope); + }); + claim_worker = registration.installing; claim_registration = registration; return wait_for_state(t, registration.installing, 'activated'); @@ -67,9 +75,6 @@ frame1.remove(); frame2.remove(); return claim_registration.unregister(); - }) - .then(function() { - return service_worker_unregister_and_done(t, init_scope); }); }, 'Test claim client which is not using registration'); @@ -86,6 +91,10 @@ claim_worker_url, {scope: claim_scope}); }) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, claim_scope); + }); + claim_worker = registration.installing; return wait_for_state(t, registration.installing, 'activated'); }) @@ -94,6 +103,10 @@ installing_worker_url, {scope: scope}); }) .then(function() { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + var channel = new MessageChannel(); var saw_message = new Promise(function(resolve) { channel.port1.onmessage = t.step_func(function(e) { @@ -111,10 +124,6 @@ 'Frame should not be claimed when a longer-matched ' + 'registration exists'); frame.remove(); - return service_worker_unregister(t, claim_scope); - }) - .then(function() { - return service_worker_unregister_and_done(t, scope); }); }, 'Test claim client when there\'s a longer-matched registration not ' + 'already used by the page'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html index a07db7b75c7a..f5f44886baa2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html @@ -30,9 +30,13 @@ 'fetch() should not be intercepted.')) // Register a service worker. .then(() => service_worker_unregister_and_register(t, script, scope)) - .then(r => worker = r.installing) - .then(() => wait_for_state(t, worker, 'activated')) + .then(r => { + t.add_cleanup(() => service_worker_unregister(t, scope)); + worker = r.installing; + + return wait_for_state(t, worker, 'activated') + }) // Let the service worker claim the iframe and the shared worker. .then(() => { var channel = new MessageChannel(); @@ -60,8 +64,7 @@ 'fetch() in the shared worker should be intercepted.')) // Cleanup this testcase. - .then(() => frame.remove()) - .then(() => service_worker_unregister_and_done(t, scope)); + .then(() => frame.remove()); }, 'fetch() in SharedWorker should be intercepted after the client is claimed.') diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-using-registration.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-using-registration.https.html index 7d77d384837d..8a2a6ff25c82 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-using-registration.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/claim-using-registration.https.html @@ -13,6 +13,10 @@ var worker, sw_registration, frame; return service_worker_unregister_and_register(t, url1, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { @@ -50,9 +54,6 @@ 'Frame1 controller scriptURL should be changed to url2'); frame.remove(); return sw_registration.unregister(); - }) - .then(function() { - return service_worker_unregister_and_done(t, scope); }); }, 'Test worker claims client which is using another registration'); @@ -63,6 +64,10 @@ var frame, worker; return service_worker_unregister_and_register(t, url1, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { @@ -91,7 +96,6 @@ }) .then(function() { frame.remove(); - return service_worker_unregister_and_done(t, scope); }); }, 'Test for the waiting worker claims a client which is using the the ' + 'same registration'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https-expected.txt new file mode 100644 index 000000000000..8274586e807f --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https-expected.txt @@ -0,0 +1,8 @@ + +PASS global setup +FAIL get(resultingClientId) for same-origin document assert_equals: promiseValue expected "client" but got "undefinedValue" +FAIL get(resultingClientId) on cross-origin redirect assert_equals: get(event.resultingClientId) in the fetch event should fulfill expected (string) "fulfilled" but got (undefined) undefined +FAIL get(resultingClientId) for document sandboxed by CSP header assert_equals: get(event.resultingClientId) in the fetch event should fulfill expected (string) "fulfilled" but got (undefined) undefined +FAIL get(resultingClientId) for document sandboxed by CSP header with allow-same-origin assert_equals: get(event.resultingClientId) in the fetch event should fulfill expected (string) "fulfilled" but got (undefined) undefined +PASS global cleanup + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https.html new file mode 100644 index 000000000000..3419cf14b523 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https.html @@ -0,0 +1,177 @@ + + +Test clients.get(resultingClientId) + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html index 24967172a84c..a2a56816a650 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html @@ -54,6 +54,10 @@ return service_worker_unregister_and_register( t, 'resources/clients-matchall-worker.js', scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { return with_iframe(iframe_url); }) @@ -66,9 +70,7 @@ }) .then(function() { frame.remove(); - return service_worker_unregister_and_done(t, scope); - }) - .catch(unreached_rejection(t)); + }); }, 'Verify matchAll() with window client type'); promise_test(function(t) { @@ -76,6 +78,10 @@ return service_worker_unregister_and_register( t, 'resources/clients-matchall-worker.js', scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { return with_iframe(iframe_url); }) @@ -112,7 +118,6 @@ }) .then(function() { frame.remove(); - return service_worker_unregister_and_done(t, scope); }); }, 'Verify matchAll() with {window, sharedworker, worker} client types'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-order.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-order.https.html index 0596050c24af..ec650f2264df 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-order.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/clients-matchall-order.https.html @@ -123,6 +123,8 @@ let frameResultList; let extraWindowResult; return service_worker_unregister_and_register(t, script, opts.scope).then(swr => { + t.add_cleanup(() => service_worker_unregister(t, opts.scope)); + worker = swr.installing; return wait_for_state(t, worker, 'activated'); }).then(_ => { @@ -143,8 +145,6 @@ }).then(_ => { frameResultList.forEach(result => result.top.remove()); extraWindowResult.top.remove(); - }).then(_ => { - return service_worker_unregister_and_done(t, opts.scope); }).catch(e => { if (frameResultList) { frameResultList.forEach(result => result.top.remove()); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/controller-on-reload.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/controller-on-reload.https.html index e0beb7260be1..2e966d425788 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/controller-on-reload.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/controller-on-reload.https.html @@ -13,6 +13,10 @@ var controller; return service_worker_unregister(t, scope) .then(function() { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return with_iframe(scope); }) .then(function(f) { @@ -48,7 +52,6 @@ .then(function(frameRegistration) { assert_equals(frameRegistration.active, controller); frame.remove(); - service_worker_unregister_and_done(t, scope); }); }, 'controller is set upon reload after registration'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/data-transfer-files.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/data-transfer-files.https-expected.txt new file mode 100644 index 000000000000..59340fc966c6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/data-transfer-files.https-expected.txt @@ -0,0 +1,5 @@ + + + +FAIL Posting a File in a navigation handled by a service worker promise_test: Unhandled rejection with value: object "TypeError: function is not a constructor (evaluating 'new DataTransfer()')" + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/data-transfer-files.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/data-transfer-files.https.html new file mode 100644 index 000000000000..cc8ab6e67272 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/data-transfer-files.https.html @@ -0,0 +1,41 @@ + + +Post a file in a navigation controlled by a service worker + + + + + +
    + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https-expected.txt index 3110d3eb3bb4..f757055484de 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https-expected.txt @@ -1,13 +1,17 @@ -PASS Test calling waitUntil in a different task without an existing extension throws -FAIL Test calling waitUntil in a different microtask without an existing extension throws assert_equals: expected "InvalidStateError" but got "OK" -PASS Test calling waitUntil in a different task with an existing extension succeeds -PASS Test calling waitUntil with an existing extension promise handler succeeds -FAIL Test calling waitUntil at the end of the microtask turn throws assert_equals: expected "InvalidStateError" but got "OK" +PASS Test calling waitUntil in a task at the end of the event handler without an existing extension throws +PASS Test calling waitUntil in a microtask at the end of the event handler without an existing extension suceeds +PASS Test calling waitUntil in a different task an existing extension succeeds +PASS Test calling waitUntil at the end of an existing extension promise handler succeeds (event is still being dispatched) +PASS Test calling waitUntil in a microtask at the end of an existing extension promise handler succeeds (event is still being dispatched) +PASS Test calling waitUntil in an existing extension promise handler succeeds (event is not being dispatched) +PASS Test calling waitUntil in a microtask at the end of an existing extension promise handler throws (event is not being dispatched) PASS Test calling waitUntil after the current extension expired in a different task fails PASS Test calling waitUntil on a script constructed ExtendableEvent throws exception PASS Test calling waitUntil asynchronously with pending respondWith promise. -PASS Test calling waitUntil synchronously inside microtask of respondWith promise. -FAIL Test calling waitUntil asynchronously inside microtask of respondWith promise. assert_equals: expected "InvalidStateError" but got "OK" +PASS Test calling waitUntil synchronously inside microtask of respondWith promise (event is being dispatched). +PASS Test calling waitUntil asynchronously inside microtask of respondWith promise (event is being dispatched). +PASS Test calling waitUntil synchronously inside microtask of respondWith promise (event is not being dispatched). +PASS Test calling waitUntil asynchronously inside microtask of respondWith promise (event is not being dispatched). diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https.html index cb4ed30a37fd..04e98266b4f1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/extendable-event-async-waituntil.https.html @@ -1,4 +1,5 @@ + @@ -56,21 +57,25 @@ } promise_test(msg_event_test.bind(this, 'no-current-extension-different-task'), - 'Test calling waitUntil in a different task without an existing extension throws'); + 'Test calling waitUntil in a task at the end of the event handler without an existing extension throws'); promise_test(msg_event_test.bind(this, 'no-current-extension-different-microtask'), - 'Test calling waitUntil in a different microtask without an existing extension throws'); + 'Test calling waitUntil in a microtask at the end of the event handler without an existing extension suceeds'); promise_test(msg_event_test.bind(this, 'current-extension-different-task'), - 'Test calling waitUntil in a different task with an existing extension succeeds'); + 'Test calling waitUntil in a different task an existing extension succeeds'); -promise_test(msg_event_test.bind(this, 'current-extension-expired-same-microtask-turn'), - 'Test calling waitUntil with an existing extension promise handler succeeds'); +promise_test(msg_event_test.bind(this, 'during-event-dispatch-current-extension-expired-same-microtask-turn'), + 'Test calling waitUntil at the end of an existing extension promise handler succeeds (event is still being dispatched)'); -// The promise handler will queue a new microtask after the check for new -// extensions was performed. -promise_test(msg_event_test.bind(this, 'current-extension-expired-same-microtask-turn-extra'), - 'Test calling waitUntil at the end of the microtask turn throws'); +promise_test(msg_event_test.bind(this, 'during-event-dispatch-current-extension-expired-same-microtask-turn-extra'), + 'Test calling waitUntil in a microtask at the end of an existing extension promise handler succeeds (event is still being dispatched)'); + +promise_test(msg_event_test.bind(this, 'after-event-dispatch-current-extension-expired-same-microtask-turn'), + 'Test calling waitUntil in an existing extension promise handler succeeds (event is not being dispatched)'); + +promise_test(msg_event_test.bind(this, 'after-event-dispatch-current-extension-expired-same-microtask-turn-extra'), + 'Test calling waitUntil in a microtask at the end of an existing extension promise handler throws (event is not being dispatched)'); promise_test(msg_event_test.bind(this, 'current-extension-expired-different-task'), 'Test calling waitUntil after the current extension expired in a different task fails'); @@ -80,24 +85,36 @@ promise_test(function(t) { var testBody = function(worker) { - return with_iframe('./resources/pending-respondwith-async-waituntil/dummy.html'); + return with_iframe('./resources/pending-respondwith-async-waituntil'); } return runTest(t, 'pending-respondwith-async-waituntil', testBody); }, 'Test calling waitUntil asynchronously with pending respondWith promise.'); promise_test(function(t) { var testBody = function(worker) { - return with_iframe('./resources/respondwith-microtask-sync-waituntil/dummy.html'); + return with_iframe('./resources/during-event-dispatch-respondwith-microtask-sync-waituntil'); } - return runTest(t, 'respondwith-microtask-sync-waituntil', testBody); - }, 'Test calling waitUntil synchronously inside microtask of respondWith promise.'); + return runTest(t, 'during-event-dispatch-respondwith-microtask-sync-waituntil', testBody); + }, 'Test calling waitUntil synchronously inside microtask of respondWith promise (event is being dispatched).'); promise_test(function(t) { var testBody = function(worker) { - return with_iframe('./resources/respondwith-microtask-async-waituntil/dummy.html'); + return with_iframe('./resources/during-event-dispatch-respondwith-microtask-async-waituntil'); } - return runTest(t, 'respondwith-microtask-async-waituntil', testBody); - }, 'Test calling waitUntil asynchronously inside microtask of respondWith promise.'); + return runTest(t, 'during-event-dispatch-respondwith-microtask-async-waituntil', testBody); + }, 'Test calling waitUntil asynchronously inside microtask of respondWith promise (event is being dispatched).'); +promise_test(function(t) { + var testBody = function(worker) { + return with_iframe('./resources/after-event-dispatch-respondwith-microtask-sync-waituntil'); + } + return runTest(t, 'after-event-dispatch-respondwith-microtask-sync-waituntil', testBody); + }, 'Test calling waitUntil synchronously inside microtask of respondWith promise (event is not being dispatched).'); +promise_test(function(t) { + var testBody = function(worker) { + return with_iframe('./resources/after-event-dispatch-respondwith-microtask-async-waituntil'); + } + return runTest(t, 'after-event-dispatch-respondwith-microtask-async-waituntil', testBody); + }, 'Test calling waitUntil asynchronously inside microtask of respondWith promise (event is not being dispatched).'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html index ef3d12bbe498..c37e8e562448 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html @@ -1,6 +1,7 @@ Service Worker: canvas tainting of the fetched video using cache responses + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video.https.html index 577650881c15..e8c23a2edd63 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-canvas-tainting-video.https.html @@ -1,6 +1,7 @@ Service Worker: canvas tainting of the fetched video + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-csp.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-csp.https.html index 91a774a133fd..4f176220d610 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-csp.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-csp.https.html @@ -32,6 +32,10 @@ return service_worker_unregister_and_register(t, SCRIPT, SCOPE) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, SCOPE); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { @@ -105,7 +109,6 @@ }) .then(function() { frame.remove(); - service_worker_unregister_and_done(t, SCOPE); }); }, 'Verify CSP control of fetch() in a Service Worker'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https.html index dce1f794fabe..4812d8a91551 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https.html @@ -15,6 +15,10 @@ return service_worker_unregister_and_register(t, worker, scope) .then(function(reg) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, reg.installing, 'activated'); }) .then(function() { return with_iframe(scope); }) @@ -30,7 +34,6 @@ .then(function(response) { assert_equals(response, 'intercepted by service worker'); frame.remove(); - return service_worker_unregister_and_done(t, scope); }) }, 'Service Worker should respond to fetch event after the hash changes'); @@ -43,6 +46,10 @@ return service_worker_unregister_and_register(t, worker, scope) .then(function(reg) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, reg.installing, 'activated'); }) .then(function() { return with_iframe(scope); }) @@ -58,7 +65,6 @@ .then(function(response) { assert_equals(response, 'intercepted by service worker'); frame.remove(); - return service_worker_unregister_and_done(t, scope); }) }, 'Service Worker should respond to fetch event after the pushState'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https-expected.txt index 7e11bced6f85..a78b90a67a85 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https-expected.txt @@ -1,3 +1,6 @@ -PASS Calling respondWith asynchronously throws an exception +PASS global setup +PASS respondWith in a task throws InvalidStateError +PASS respondWith in a microtask does not throw +PASS global cleanup diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https.html index a2b93acfc5b2..d9147f85494c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-async-respond-with.https.html @@ -1,33 +1,73 @@ + +respondWith cannot be called asynchronously + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-network-error.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-network-error.https.html index 254919e92327..fea2ad1e3c26 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-network-error.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-network-error.https.html @@ -22,6 +22,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { @@ -34,7 +38,6 @@ .then(function(result) { frame.remove(); assert_equals(result, 'PASS'); - return service_worker_unregister_and_done(t, scope); }); }, 'Rejecting the fetch event or using preventDefault() causes a network ' + 'error'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt index c33b7d9b2c37..82aa5e00e891 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt @@ -1,76 +1,10 @@ -CONSOLE MESSAGE: line 32: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. +CONSOLE MESSAGE: line 29: [blocked] The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was not allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. -CONSOLE MESSAGE: line 54: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. +CONSOLE MESSAGE: line 29: Not allowed to request resource +CONSOLE MESSAGE: line 29: Fetch API cannot load http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull due to access control checks. -CONSOLE MESSAGE: line 76: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. -CONSOLE MESSAGE: line 98: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 120: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 132: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 197: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 231: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 32: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 54: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 76: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 98: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 120: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 132: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 197: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - -CONSOLE MESSAGE: line 231: The page at https://localhost:9443/service-workers/service-worker/fetch-event-referrer-policy.https.html was allowed to display insecure content from http://localhost:8800/service-workers/service-worker//resources/simple.html?referrerFull. - - -PASS Service Worker responds to fetch event with the referrer policy +FAIL Service Worker responds to fetch event with the referrer policy promise_test: Unhandled rejection with value: object "TypeError: Not allowed to request resource" PASS Service Worker should respond to fetch with the default referrer policy PASS Service Worker should respond to fetch with the referrer URL when a member of RequestInit is present - Default Referrer -PASS Service Worker should respond to fetch with no referrer when a member of RequestInit is present with an HTTP request - Default Referrer -PASS Service Worker should respond to fetch with the referrer with "" - Default Referrer -PASS Service Worker should respond to fetch with no referrer with "" - Default Referrer -PASS Service Worker should respond to fetch with the referrer origin with "origin" and a same origin request - Default Referrer -PASS Service Worker should respond to fetch with the referrer origin with "origin" and a cross origin request - Default Referrer -PASS Service Worker should respond to fetch with the referrer URL with "origin-when-cross-origin" and a same origin request - Default Referrer -PASS Service Worker should respond to fetch with the referrer origin with "origin-when-cross-origin" and a cross origin request - Default Referrer -PASS Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and a same origin request - Default Referrer -PASS Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and an HTTP request - Default Referrer -PASS Service Worker should respond to fetch with no referrer with "unsafe-url" - Default Referrer -PASS Service Worker should respond to fetch with no referrer URL with "no-referrer" - Default Referrer -PASS Service Worker should respond to fetch with referrer URL with "same-origin" and a same origin request - Default Referrer -PASS Service Worker should respond to fetch with no referrer with "same-origin" and cross origin request - Default Referrer -PASS Service Worker should respond to fetch with the referrer origin with "strict-origin" and a HTTPS cross origin request - Default Referrer -PASS Service Worker should respond to fetch with the referrer origin with "strict-origin" and a same origin request - Default Referrer -PASS Service Worker should respond to fetch with no referrer with "strict-origin" and a HTTP request - Default Referrer -PASS Service Worker should respond to fetch with the referrer URL with "strict-origin-when-cross-origin" and a same origin request - Default Referrer -PASS Service Worker should respond to fetch with the referrer origin with "strict-origin-when-cross-origin" and a HTTPS cross origin request - Default Referrer -PASS Service Worker should respond to fetch with no referrer with "strict-origin-when-cross-origin" and a HTTP request - Default Referrer -PASS Service Worker should respond to fetch with the referrer URL when a member of RequestInit is present - Custom Referrer -PASS Service Worker should respond to fetch with no referrer when a member of RequestInit is present with an HTTP request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer with "" - Custom Referrer -PASS Service Worker should respond to fetch with no referrer with "" - Custom Referrer -PASS Service Worker should respond to fetch with the referrer origin with "origin" and a same origin request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer origin with "origin" and a cross origin request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer URL with "origin-when-cross-origin" and a same origin request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer origin with "origin-when-cross-origin" and a cross origin request - Custom Referrer -PASS Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and a same origin request - Custom Referrer -PASS Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and an HTTP request - Custom Referrer -PASS Service Worker should respond to fetch with no referrer with "unsafe-url" - Custom Referrer -PASS Service Worker should respond to fetch with no referrer URL with "no-referrer" - Custom Referrer -PASS Service Worker should respond to fetch with referrer URL with "same-origin" and a same origin request - Custom Referrer -PASS Service Worker should respond to fetch with no referrer with "same-origin" and cross origin request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer origin with "strict-origin" and a HTTPS cross origin request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer origin with "strict-origin" and a same origin request - Custom Referrer -PASS Service Worker should respond to fetch with no referrer with "strict-origin" and a HTTP request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer URL with "strict-origin-when-cross-origin" and a same origin request - Custom Referrer -PASS Service Worker should respond to fetch with the referrer origin with "strict-origin-when-cross-origin" and a HTTPS cross origin request - Custom Referrer -PASS Service Worker should respond to fetch with no referrer with "strict-origin-when-cross-origin" and a HTTP request - Custom Referrer diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html index 3846c5b1dde2..804fd9b4204c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html @@ -7,9 +7,6 @@ diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-stops-propagation.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-stops-propagation.https.html index cd6861a9d453..31fd616b6d6f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-stops-propagation.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-stops-propagation.https.html @@ -10,6 +10,10 @@ return service_worker_unregister_and_register(t, script, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, registration.installing, 'activated'); }) .then(function() { @@ -28,7 +32,6 @@ }) .then(function(message) { assert_equals(message, 'PASS'); - return service_worker_unregister_and_done(t, scope); }) }, 'respondWith() invokes stopImmediatePropagation()'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html index 969a3c9d08fb..d98fb22ff423 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-throws-after-respond-with.https.html @@ -12,6 +12,10 @@ var iframe; return service_worker_unregister_and_register(t, workerscript, scope) .then(function(reg) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, reg.installing, 'activated') .then(() => reg.active); }) @@ -27,7 +31,6 @@ }) .then(function(frame) { assert_true(frame.contentDocument.body.innerHTML.includes("intercepted")); - service_worker_unregister_and_done(t, scope); }) }, 'Fetch event handler throws after a successful respondWith()'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https-expected.txt index 62aea6618650..2a731e4e7879 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https-expected.txt @@ -1,4 +1,6 @@ - -FAIL CSS's base URL must be the request URL even when fetched from other URL. assert_equals: The base URL while loading the images referred from CSS must be the request URL of CSS. expected "https://localhost:9443/service-workers/service-worker/resources/dummy.png" but got "https://127.0.0.1:9443/service-workers/service-worker/resources/dummy.png" +PASS global setup +FAIL base URL when service worker does respondWith(fetch(responseUrl)). assert_equals: referrer expected "https://localhost:9443/service-workers/service-worker/resources/fetch-request-css-base-url-style.css?fetch" but got "https://localhost:9443/service-workers/service-worker/resources/fetch-request-css-base-url-iframe.html?fetch" +FAIL base URL when service worker does respondWith(new Response()). assert_equals: referrer expected "https://localhost:9443/service-workers/service-worker/resources/request-url-path/fetch-request-css-base-url-style.css?newResponse" but got "https://localhost:9443/service-workers/service-worker/resources/fetch-request-css-base-url-iframe.html?newResponse" +PASS cleanup global state diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https.html index 7feccfb98c56..a08e0c748813 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-base-url.https.html @@ -1,58 +1,87 @@ -Service Worker: CSS's base URL must be the request URL even when fetched from other URL +Service Worker: CSS's base URL must be the response URL - diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-redirect.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-redirect.https.html index e8e90cf1eb37..57fb8eb4c95d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-redirect.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-redirect.https.html @@ -74,6 +74,8 @@ var frame; return service_worker_unregister_and_register(t, SCRIPT, SCOPE) .then(function(registration) { + t.add_cleanup(() => service_worker_unregister(t, SCOPE)); + worker = registration.installing; return wait_for_state(t, worker, 'activated'); }) @@ -181,7 +183,6 @@ }) .then(function() { frame.remove(); - service_worker_unregister_and_done(t, SCOPE); }); }, 'Verify redirect mode of Fetch API and ServiceWorker FetchEvent.'); @@ -208,6 +209,8 @@ var frame; return service_worker_unregister_and_register(t, SCRIPT, SCOPE) .then(function(registration) { + t.add_cleanup(() => service_worker_unregister(t, SCOPE)); + worker = registration.installing; return wait_for_state(t, worker, 'activated'); }) @@ -275,7 +278,6 @@ }) .then(function() { frame.remove(); - service_worker_unregister_and_done(t, SCOPE); }); }, 'Verify redirected of Response(Fetch API) and ServiceWorker FetchEvent.'); @@ -302,6 +304,8 @@ var frame; return service_worker_unregister_and_register(t, SCRIPT, SCOPE) .then(function(registration) { + t.add_cleanup(() => service_worker_unregister(t, SCOPE)); + worker = registration.installing; return wait_for_state(t, worker, 'activated'); }) @@ -375,7 +379,6 @@ }) .then(function() { frame.remove(); - service_worker_unregister_and_done(t, SCOPE); }); }, 'Verify redirected of Response(Fetch API), Cache API and ServiceWorker ' + 'FetchEvent.'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https-expected.txt index 9396662e9417..25135dd19809 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https-expected.txt @@ -4,4 +4,5 @@ PASS Register then getRegistration PASS Register then getRegistration with a URL having a fragment PASS getRegistration with a cross origin URL PASS Register then Unregister then getRegistration +PASS Register then Unregister then getRegistration in controlled iframe diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https.html index 72a2c25379cd..634c2efa1246 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/getregistration.https.html @@ -88,4 +88,21 @@ .catch(unreached_rejection(t)); }, 'Register then Unregister then getRegistration'); + +promise_test(async function(t) { + const scope = 'resources/scope/getregistration/register-unregister'; + const registration = await service_worker_unregister_and_register( + t, 'resources/empty-worker.js', scope + ); + + const frame = await with_iframe(scope); + t.add_cleanup(() => frame.remove()); + + const frameNav = frame.contentWindow.navigator; + await registration.unregister(); + const value = await frameNav.serviceWorker.getRegistration(scope); + + assert_equals(value, undefined, 'getRegistration should resolve with undefined'); +}, 'Register then Unregister then getRegistration in controlled iframe'); + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https-expected.txt index 2d957f1db4f9..f831a8ed74de 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https-expected.txt @@ -1,3 +1,4 @@ PASS import the same script URL multiple times +PASS call importScripts() with multiple arguments diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https.html index a5e26785fac4..4742bd012683 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/import-scripts-resource-map.https.html @@ -1,23 +1,34 @@ - + Tests for importScripts: script resource map - + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/interfaces-window.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/interfaces-window.https.html index 2c131b3c93a6..f70cf40931db 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/interfaces-window.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/interfaces-window.https.html @@ -1,5 +1,6 @@ Service Worker: Interfaces + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/multiple-update.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/multiple-update.https.html index 84aac9583b90..6a83f73a054f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/multiple-update.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/multiple-update.https.html @@ -15,6 +15,10 @@ return service_worker_unregister_and_register(t, expected_url, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + registration = r; return wait_for_state(t, registration.installing, 'activated'); }) @@ -85,8 +89,6 @@ 'waiting should be null after activated.'); assert_equals(registration.active.scriptURL, expected_url, 'active should still exist after update found.'); - - return service_worker_unregister_and_done(t, scope); }); }, 'Trigger multiple updates.'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html index e8b8e9afd582..d7d3d5259a45 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-redirect.https.html @@ -668,6 +668,24 @@ 'SW-fetched redirect to other-origin in-scope.'); +// SW responds with a fetch from a different url. +// SW: event.respondWith(fetch(params['url'])); +url2 = SCOPE1; +url1 = SCOPE1 + 'sw=fetch-url&url=' + encodeURIComponent(url2); +redirect_test( + url1, + url1, + [ + [ + {url: url1, resultingClientIdTag: 'x'} + ], + [], + [] + ], + 'x', + 'SW-fetched response from different URL, same-origin same-scope.'); + + // Opaque redirect. // SW: event.respondWith(fetch( // new Request(event.request.url, {redirect: 'manual'}))); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/performance-timeline.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/performance-timeline.https.html index b66d4a821861..1fe19da53be6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/performance-timeline.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/performance-timeline.https.html @@ -17,7 +17,11 @@ let slowURL = url + '&slow'; let frame; return service_worker_unregister_and_register(t, script, scope) - .then(reg => wait_for_state(t, reg.installing, 'activated')) + .then(reg => { + t.add_cleanup(() => service_worker_unregister(t, scope)); + + return wait_for_state(t, reg.installing, 'activated'); + }) .then(_ => with_iframe(scope)) .then(f => { frame = f; @@ -39,7 +43,6 @@ assert_greater_than(slowURLTime, urlTime + 1000, 'Slow service worker request should measure increased delay.'); frame.remove(); - return service_worker_unregister_and_done(t, scope); }) }, 'empty service worker fetch event included in performance timings'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage-to-client-message-queue.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage-to-client-message-queue.https.html index caa4f9445d3d..83e5f4540d14 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage-to-client-message-queue.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage-to-client-message-queue.https.html @@ -141,12 +141,12 @@ earliest_dispatch, description) { - function later_state(state1, state2) { + function assert_state_less_than_equal(state1, state2, explanation) { const states = ['init', 'install', 'start', 'finish', 'loaded']; const index1 = states.indexOf(state1); const index2 = states.indexOf(state2); - const max_index = Math.max(index1, index2); - return states[max_index]; + if (index1 > index2) + assert_unreached(explanation); } client_message_queue_test('enable-client-message-queue.html', async t => { @@ -161,12 +161,13 @@ // Wait for all messages to get dispatched on the child's // ServiceWorkerContainer and then verify that each message - // was dispatched while the child was in the correct state. + // was dispatched after |earliest_dispatch|. const report = await t.frame.report; ['init', 'install', 'start'].forEach(state => { - const dispatch = later_state(state, earliest_dispatch); - assert_equals(report[state], dispatch, - `Message sent in state '${state}' dispatched in state '${dispatch}'`); + const explanation = `Message sent in state '${state}' was dispatched in '${report[state]}', should be dispatched no earlier than '${earliest_dispatch}'`; + assert_state_less_than_equal(earliest_dispatch, + report[state], + explanation); }); }, description); } diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https-expected.txt index 561541b677dc..79abe4227649 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https-expected.txt @@ -3,4 +3,5 @@ PASS postMessage to a ServiceWorker (and back via MessagePort) PASS postMessage a transferable ArrayBuffer between ServiceWorker and Client PASS postMessage a transferable ArrayBuffer between ServiceWorker and Client over MessagePort FAIL postMessage with dictionary a transferable ArrayBuffer between ServiceWorker and Client promise_test: Unhandled rejection with value: object "TypeError: Type error" +FAIL postMessage to a redundant worker promise_test: Unhandled rejection with value: object "InvalidStateError: Service Worker state is redundant" diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https.html index b1f3342a8c14..7abb3022f91a 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/postmessage.https.html @@ -39,15 +39,6 @@ .then(e => { assert_equals(e.data, 'quit'); return registration.unregister(scope); - }) - .then(() => { return wait_for_state(t, worker, 'redundant'); }) - .then(() => { - assert_equals(worker.state, 'redundant'); - assert_throws( - {name:'InvalidStateError'}, - function() { worker.postMessage(''); }, - 'Calling postMessage on a redundant ServiceWorker should ' + - 'throw InvalidStateError.'); }); }, 'postMessage to a ServiceWorker (and back via MessagePort)'); @@ -178,4 +169,34 @@ }); }, 'postMessage with dictionary a transferable ArrayBuffer between ServiceWorker and Client'); + promise_test(async t => { + const firstScript = 'resources/postmessage-echo-worker.js?one'; + const secondScript = 'resources/postmessage-echo-worker.js?two'; + const scope = 'resources/'; + + const registration = await service_worker_unregister_and_register(t, firstScript, scope); + t.add_cleanup(() => registration.unregister()); + const firstWorker = registration.installing; + + const messagePromise = new Promise(resolve => { + navigator.serviceWorker.addEventListener('message', (event) => { + resolve(event.data); + }, {once: true}); + }); + + await wait_for_state(t, firstWorker, 'activated'); + await navigator.serviceWorker.register(secondScript, {scope}); + const secondWorker = registration.installing; + await wait_for_state(t, firstWorker, 'redundant'); + + // postMessage() to a redundant worker should be dropped silently. + // Historically, this threw an exception. + firstWorker.postMessage('firstWorker'); + + // To test somewhat that it was not received, send a message to another + // worker and check that we get a reply for that one. + secondWorker.postMessage('secondWorker'); + const data = await messagePromise; + assert_equals(data, 'secondWorker'); + }, 'postMessage to a redundant worker'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https-expected.txt index aaee3de0a602..cd413633915e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https-expected.txt @@ -9,5 +9,6 @@ PASS ready on an iframe whose parent registers a new service worker PASS ready on an iframe that installs a new service worker PASS ready after a longer matched registration registered PASS access ready after it has been resolved -PASS access ready on uninstalling registration that is resurrected +FAIL resolve ready after unregistering and reregistering assert_not_equals: Registrations should be different got disallowed value object "[object ServiceWorkerRegistration]" +FAIL resolve ready before unregistering and reregistering assert_equals: Resolves with the first registration expected "https://localhost:9443/service-workers/service-worker/resources/empty-worker.js" but got "https://localhost:9443/service-workers/service-worker/resources/empty-worker.js?2" diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https.html index ff5c793f2c22..6c1ed822a877 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/ready.https.html @@ -250,51 +250,68 @@ }, 'access ready after it has been resolved'); promise_test(async function(t) { - var url = 'resources/empty-worker.js'; - var matched_scope = 'resources/blank.html?ready-after-resurrect'; - - let reg1 = await service_worker_unregister_and_register(t, url, matched_scope); - add_completion_callback(function() { - reg1.unregister(); - }); - await wait_for_state(t, reg1.installing, 'activated'); - - // Hold the worker alive with a controlled worker - let frame = await with_iframe(matched_scope); - add_completion_callback(function() { - frame.remove(); - }); - - // Doom the registration as uninstalling. - await reg1.unregister(); - - // Access the ready promise while the registration is doomed. - let readyPromise = frame.contentWindow.navigator.serviceWorker.ready; - - // Resurrect the doomed registration; - let reg2 = await service_worker_unregister_and_register(t, url, matched_scope); - assert_equals(reg1, reg2, 'existing registration should be resurrected'); - - // We are trying to test if the ready promise ever resolves here. Use - // an explicit timeout check here rather than forcing a full infrastructure - // level timeout. - let timeoutId; - let timeoutPromise = new Promise(resolve => { - timeoutId = setTimeout(_ => { - timeoutId = null; - resolve(); - }, 500); - }); - - // This should resolve immediately since there is an alive registration - // with an active promise for the matching scope. - await Promise.race([readyPromise, timeoutPromise]); - - assert_not_equals(timeoutId, null, - 'ready promise should resolve before timeout'); - clearTimeout(timeoutId); - - // We should get here and not time out. - - }, 'access ready on uninstalling registration that is resurrected'); + const url1 = 'resources/empty-worker.js'; + const url2 = url1 + '?2'; + const matched_scope = 'resources/blank.html?ready-after-unregister'; + + const reg1 = await service_worker_unregister_and_register(t, url1, matched_scope); + t.add_cleanup(() => reg1.unregister()); + + await wait_for_state(t, reg1.installing, 'activating'); + // This registration will resolve all ready promises in clients that match the scope. + // But there are no clients. + + const frame = await with_iframe(matched_scope); + t.add_cleanup(() => frame.remove()); + + await reg1.unregister(); + + // Access the ready promise while the registration is unregistering. + const readyPromise = frame.contentWindow.navigator.serviceWorker.ready; + + // Create a new registration. + const reg2 = await navigator.serviceWorker.register(url2, { scope: matched_scope }); + t.add_cleanup(() => reg2.unregister()); + // This registration will resolve all ready promises in clients that match the scope. + // That includes frame's client. + + const readyReg = await readyPromise; + + assert_equals(readyReg.active.scriptURL, reg2.active.scriptURL, 'Resolves with the second registration'); + assert_not_equals(reg1, reg2, 'Registrations should be different'); +}, 'resolve ready after unregistering and reregistering'); + +promise_test(async function(t) { + const url1 = 'resources/empty-worker.js'; + const url2 = url1 + '?2'; + const matched_scope = 'resources/blank.html?ready-after-unregister'; + + const frame = await with_iframe(matched_scope); + t.add_cleanup(() => frame.remove()); + + const reg1 = await service_worker_unregister_and_register(t, url1, matched_scope); + t.add_cleanup(() => reg1.unregister()); + + await wait_for_state(t, reg1.installing, 'activated'); + // This registration will resolve all ready promises in clients that match the scope. + // That includes frame's client. + + const reg1Active = reg1.active; + + await reg1.unregister(); + + // Access the ready promise while the registration is unregistering. + const readyPromise = frame.contentWindow.navigator.serviceWorker.ready; + + // Create a new registration. + const reg2 = await navigator.serviceWorker.register(url2, { scope: matched_scope }); + t.add_cleanup(() => reg2.unregister()); + // This registration will resolve all ready promises in clients that match the scope. + // That includes frame's client, but its ready promise has already resolved. + + const readyReg = await readyPromise; + + assert_equals(readyReg.active.scriptURL, reg1Active.scriptURL, 'Resolves with the first registration'); + assert_not_equals(reg1, reg2, 'Registrations should be different'); +}, 'resolve ready before unregistering and reregistering'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-default-scope.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-default-scope.https.html index dc136d4e8dd7..1d86548eb5ee 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-default-scope.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-default-scope.https.html @@ -52,8 +52,11 @@ }) .then( function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, registration.scope); + }); + assert_unreached('register should fail'); - service_worker_unregister_and_done(t, registration.scope); }, function(error) { assert_equals(error.name, 'SecurityError', diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-wait-forever-in-install-worker.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-wait-forever-in-install-worker.https.html index e23f9f4fc8e3..0920b5cb223d 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-wait-forever-in-install-worker.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/register-wait-forever-in-install-worker.https.html @@ -16,6 +16,10 @@ return navigator.serviceWorker.register(bad_script, {scope: scope}) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + registration = r; assert_equals(registration.installing.scriptURL, normalizeURL(bad_script)); @@ -47,9 +51,6 @@ normalizeURL(good_script)); return wait_for_state(t, registration.installing, 'activated'); }) - .then(function() { - return service_worker_unregister_and_done(t, scope); - }) }, 'register worker that calls waitUntil with a promise that never ' + 'resolves in oninstall'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-end-to-end.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-end-to-end.https.html index e92b6502f09b..1af4582d3874 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-end-to-end.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-end-to-end.https.html @@ -11,16 +11,11 @@ var serviceWorkerStates = []; var lastServiceWorkerState = ''; var receivedMessageFromPort = ''; - var currentChangeCount = 0; assert_true(navigator.serviceWorker instanceof ServiceWorkerContainer); assert_equals(typeof navigator.serviceWorker.register, 'function'); assert_equals(typeof navigator.serviceWorker.getRegistration, 'function'); - navigator.serviceWorker.oncurrentchange = function() { - ++currentChangeCount; - }; - service_worker_unregister_and_register( t, 'resources/end-to-end-worker.js', scope) .then(onRegister) @@ -75,9 +70,6 @@ ['installing', 'installed', 'activating', 'activated'], 'Service worker should pass through all states'); - assert_equals(currentChangeCount, 0, - 'Should not see current changes since document is out of scope'); - assert_equals(receivedMessageFromPort, 'Ack for: registering doc'); var sawRedundant = new Promise(t.step_func(function(resolve) { diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html index 9ae5f0956fba..aa9d38cedc98 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html @@ -1,5 +1,6 @@ Service Worker: Registration (MIME types) + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-schedule-job.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-schedule-job.https-expected.txt new file mode 100644 index 000000000000..b169bcf1dc86 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-schedule-job.https-expected.txt @@ -0,0 +1,4 @@ + +FAIL different scriptURL and updateViaCache promise_test: Unhandled rejection with value: object "TypeError: null is not an object (evaluating 'registration.installing.scriptURL')" +FAIL different type assert_equals: expected (string) "classic" but got (undefined) undefined + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-schedule-job.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-schedule-job.https.html new file mode 100644 index 000000000000..18589e0aa0b3 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-schedule-job.https.html @@ -0,0 +1,67 @@ + + +Service Worker: Schedule Job algorithm + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https-expected.txt index c90d0942d4d4..c6e86756c083 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https-expected.txt @@ -23,4 +23,5 @@ PASS access-updateViaCache-after-unregister-undefined PASS access-updateViaCache-after-unregister-imports PASS access-updateViaCache-after-unregister-all PASS access-updateViaCache-after-unregister-none +FAIL updateViaCache is not updated if register() rejects assert_equals: after update attempt expected "imports" but got "none" diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html index dbcc6eab1f82..423908db0e42 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html @@ -184,4 +184,21 @@ }, testName); } + promise_test(async t => { + await cleanup(); + t.add_cleanup(cleanup); + + const registration = await navigator.serviceWorker.register( + 'resources/empty.js', + {scope: SCOPE}); + assert_equals(registration.updateViaCache, 'imports', + 'before update attempt'); + + const fail = navigator.serviceWorker.register( + 'resources/malformed-worker.py?parse-error', + {scope: SCOPE, updateViaCache: 'none'}); + await promise_rejects(t, new TypeError(), fail); + assert_equals(registration.updateViaCache, 'imports', + 'after update attempt'); + }, 'updateViaCache is not updated if register() rejects'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resource-timing.sub.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resource-timing.sub.https.html index a9f89d300d5d..f0502cac7278 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resource-timing.sub.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resource-timing.sub.https.html @@ -14,7 +14,7 @@ function verify(options) { const url = options.mode === 'cross-origin' ? crossOriginUrl(options.resource) : resourceUrl(options.resource); - const entryList = options.performance.getEntriesByName(url); + const entryList = options.performance.getEntriesByName(url, 'resource'); if (options.should_no_performance_entry) { // The performance timeline may not have an entry for a resource // which failed to load. @@ -136,7 +136,7 @@ test(() => { const url = resourceUrl('resources/test-helpers.sub.js'); - const entry = window.performance.getEntriesByName(url)[0]; + const entry = window.performance.getEntriesByName(url, 'resource')[0]; assert_equals(entry.workerStart, 0, 'Non-controlled'); }, 'Non-controlled resource loads'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/appcache-ordering.manifest b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/appcache-ordering.manifest index 0deed0e91a80..e6597ccb8acb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/appcache-ordering.manifest +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/appcache-ordering.manifest @@ -1,6 +1,7 @@ CACHE MANIFEST appcache-ordering.is-appcached.html +blank.html FALLBACK: appcache-ordering.is-appcached404.js appcache-ordering.is-appcached.js diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/claim-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/claim-worker.js index 53f210cf7634..18004079475e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/claim-worker.js +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/claim-worker.js @@ -14,5 +14,6 @@ self.addEventListener('message', function(event) { }); self.addEventListener('fetch', function(event) { - event.respondWith(new Response('Intercepted!')); -}); + if (!/404/.test(event.request.url)) + event.respondWith(new Response('Intercepted!')); + }); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js index abf54934a3b4..8a975b0d2e9b 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js @@ -1,4 +1,12 @@ -// controlled by 'init'/'done' messages. +// This worker calls waitUntil() and respondWith() asynchronously and +// reports back to the test whether they threw. +// +// These test cases are confusing. Bear in mind that the event is active +// (calling waitUntil() is allowed) if: +// * The pending promise count is not 0, or +// * The event dispatch flag is set. + +// Controlled by 'init'/'done' messages. var resolveLockPromise; var port; @@ -14,34 +22,72 @@ self.addEventListener('message', function(event) { case 'done': resolveLockPromise(); break; + + // Throws because waitUntil() is called in a task after event dispatch + // finishes. case 'no-current-extension-different-task': async_task_waituntil(event).then(reportResultExpecting('InvalidStateError')); break; + + // OK because waitUntil() is called in a microtask that runs after the + // event handler runs, while the event dispatch flag is still set. case 'no-current-extension-different-microtask': - async_microtask_waituntil(event).then(reportResultExpecting('InvalidStateError')); + async_microtask_waituntil(event).then(reportResultExpecting('OK')); break; + + // OK because the second waitUntil() is called while the first waitUntil() + // promise is still pending. case 'current-extension-different-task': event.waitUntil(new Promise((res) => { resolveTestPromise = res; })); async_task_waituntil(event).then(reportResultExpecting('OK')).then(resolveTestPromise); break; - case 'current-extension-expired-same-microtask-turn': + + // OK because all promises involved resolve "immediately", so the second + // waitUntil() is called during the microtask checkpoint at the end of + // event dispatching, when the event dispatch flag is still set. + case 'during-event-dispatch-current-extension-expired-same-microtask-turn': waitPromise = Promise.resolve(); event.waitUntil(waitPromise); waitPromise.then(() => { return sync_waituntil(event); }) .then(reportResultExpecting('OK')) break; - case 'current-extension-expired-same-microtask-turn-extra': - // The promise handler queues a new microtask *after* the check for new - // extensions was performed. + + // OK for the same reason as above. + case 'during-event-dispatch-current-extension-expired-same-microtask-turn-extra': waitPromise = Promise.resolve(); event.waitUntil(waitPromise); + waitPromise.then(() => { return async_microtask_waituntil(event); }) + .then(reportResultExpecting('OK')) + break; + + + // OK because the pending promise count is decremented in a microtask + // queued upon fulfillment of the first waitUntil() promise, so the second + // waitUntil() is called while the pending promise count is still + // positive. + case 'after-event-dispatch-current-extension-expired-same-microtask-turn': + waitPromise = makeNewTaskPromise(); + event.waitUntil(waitPromise); + waitPromise.then(() => { return sync_waituntil(event); }) + .then(reportResultExpecting('OK')) + break; + + // Throws because the second waitUntil() is called after the pending + // promise count was decremented to 0. + case 'after-event-dispatch-current-extension-expired-same-microtask-turn-extra': + waitPromise = makeNewTaskPromise(); + event.waitUntil(waitPromise); waitPromise.then(() => { return async_microtask_waituntil(event); }) .then(reportResultExpecting('InvalidStateError')) break; + + // Throws because the second waitUntil() is called in a new task, after + // first waitUntil() promise settled and the event dispatch flag is unset. case 'current-extension-expired-different-task': event.waitUntil(Promise.resolve()); async_task_waituntil(event).then(reportResultExpecting('InvalidStateError')); break; + case 'script-extendable-event': self.dispatchEvent(new ExtendableEvent('nontrustedevent')); break; @@ -51,25 +97,62 @@ self.addEventListener('message', function(event) { }); self.addEventListener('fetch', function(event) { - if (event.request.url.indexOf('pending-respondwith-async-waituntil') != -1) { + const path = new URL(event.request.url).pathname; + const step = path.substring(path.lastIndexOf('/') + 1); + let response; + switch (step) { + // OK because waitUntil() is called while the respondWith() promise is still + // unsettled, so the pending promise count is positive. + case 'pending-respondwith-async-waituntil': var resolveFetch; - let response = new Promise((res) => { resolveFetch = res; }); + response = new Promise((res) => { resolveFetch = res; }); event.respondWith(response); async_task_waituntil(event) .then(reportResultExpecting('OK')) .then(() => { resolveFetch(new Response('OK')); }); - } else if (event.request.url.indexOf('respondwith-microtask-sync-waituntil') != -1) { + break; + + // OK because all promises involved resolve "immediately", so waitUntil() is + // called during the microtask checkpoint at the end of event dispatching, + // when the event dispatch flag is still set. + case 'during-event-dispatch-respondwith-microtask-sync-waituntil': response = Promise.resolve(new Response('RESP')); event.respondWith(response); response.then(() => { return sync_waituntil(event); }) - .then(reportResultExpecting('OK')) - } else if (event.request.url.indexOf('respondwith-microtask-async-waituntil') != -1) { + .then(reportResultExpecting('OK')); + break; + + // OK because all promises involved resolve "immediately", so waitUntil() is + // called during the microtask checkpoint at the end of event dispatching, + // when the event dispatch flag is still set. + case 'during-event-dispatch-respondwith-microtask-async-waituntil': response = Promise.resolve(new Response('RESP')); event.respondWith(response); + response.then(() => { return async_microtask_waituntil(event); }) + .then(reportResultExpecting('OK')); + break; + + // OK because the pending promise count is decremented in a microtask queued + // upon fulfillment of the respondWith() promise, so waitUntil() is called + // while the pending promise count is still positive. + case 'after-event-dispatch-respondwith-microtask-sync-waituntil': + response = makeNewTaskPromise().then(() => {return new Response('RESP');}); + event.respondWith(response); + response.then(() => { return sync_waituntil(event); }) + .then(reportResultExpecting('OK')); + break; + + + // Throws because waitUntil() is called after the pending promise count was + // decremented to 0. + case 'after-event-dispatch-respondwith-microtask-async-waituntil': + response = makeNewTaskPromise().then(() => {return new Response('RESP');}); + event.respondWith(response); response.then(() => { return async_microtask_waituntil(event); }) .then(reportResultExpecting('InvalidStateError')) - } - }); + break; + } +}); self.addEventListener('nontrustedevent', function(event) { sync_waituntil(event).then(reportResultExpecting('InvalidStateError')); @@ -118,3 +201,10 @@ function async_task_waituntil(event) { }, 0); }); } + +// Returns a promise that settles in a separate task. +function makeNewTaskPromise() { + return new Promise(resolve => { + setTimeout(resolve, 0); + }); +} diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-async-respond-with-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-async-respond-with-worker.js index 7f66d20dfc2d..dc3f1a1e9856 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-async-respond-with-worker.js +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-async-respond-with-worker.js @@ -1,19 +1,66 @@ -var result; +// This worker attempts to call respondWith() asynchronously after the +// fetch event handler finished. It reports back to the test whether +// an exception was thrown. -self.addEventListener('message', function(event) { - event.data.port.postMessage(result); +// These get reset at the start of a test case. +let reportResult; + +// The test page sends a message to tell us that a new test case is starting. +// We expect a fetch event after this. +self.addEventListener('message', (event) => { + // Ensure tests run mutually exclusive. + if (reportResult) { + event.source.postMessage('testAlreadyRunning'); + return; + } + + const resultPromise = new Promise((resolve) => { + reportResult = resolve; + // Tell the client that everything is initialized and that it's safe to + // proceed with the test without relying on the order of events (which some + // browsers like Chrome may not guarantee). + event.source.postMessage('messageHandlerInitialized'); }); -self.addEventListener('fetch', function(event) { - setTimeout(function() { - try { - event.respondWith(new Response()); - result = 'FAIL: did not throw'; - } catch (error) { - if (error.name == 'InvalidStateError') - result = 'PASS'; - else - result = 'FAIL: Unexpected exception: ' + error; - } - }, 0); + // Keep the worker alive until the test case finishes, and report + // back the result to the test page. + event.waitUntil(resultPromise.then(result => { + reportResult = null; + event.source.postMessage(result); + })); +}); + +// Calls respondWith() and reports back whether an exception occurred. +function tryRespondWith(event) { + try { + event.respondWith(new Response()); + reportResult({didThrow: false}); + } catch (error) { + reportResult({didThrow: true, error: error.name}); + } +} + +function respondWithInTask(event) { + setTimeout(() => { + tryRespondWith(event); + }, 0); +} + +function respondWithInMicrotask(event) { + Promise.resolve().then(() => { + tryRespondWith(event); }); +} + +self.addEventListener('fetch', function(event) { + const path = new URL(event.request.url).pathname; + const test = path.substring(path.lastIndexOf('/') + 1); + + // If this is a test case, try respondWith() and report back to the test page + // the result. + if (test == 'respondWith-in-task') { + respondWithInTask(event); + } else if (test == 'respondWith-in-microtask') { + respondWithInMicrotask(event); + } +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-network-fallback-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-network-fallback-worker.js index daa200c2badb..376bdbed05e1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-network-fallback-worker.js +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-network-fallback-worker.js @@ -1,3 +1,3 @@ self.addEventListener('fetch', () => { - // Do nothing. - }); + // Do nothing. +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-iframe.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-iframe.html index 0edf2e7f9659..504e10435642 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-iframe.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-iframe.html @@ -1 +1,20 @@ - + + +iframe for css base url test + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-worker.js index 91c325998a3b..e8dbd2725c68 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-worker.js +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-request-css-base-url-worker.js @@ -1,27 +1,45 @@ -importScripts('/common/get-host-info.sub.js'); -importScripts('test-helpers.sub.js'); +let source; +let resolveDone; +let done = new Promise(resolve => resolveDone = resolve); -var port = undefined; +// The page messages this worker to ask for the result. Keep the worker alive +// via waitUntil() until the result is sent. +self.addEventListener('message', event => { + source = event.data.port; + source.postMessage('pong'); + event.waitUntil(done); +}); -self.onmessage = function(e) { - var message = e.data; - if ('port' in message) { - port = message.port; - port.postMessage({ready: true}); - } -}; +self.addEventListener('fetch', event => { + const url = new URL(event.request.url); -self.addEventListener('fetch', function(event) { - var url = event.request.url; - if (url.indexOf('fetch-request-css-base-url-style.css') != -1) { - event.respondWith(fetch( - get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() + - 'fetch-request-css-base-url-style.css', - {mode: 'no-cors'})); - } else if (url.indexOf('dummy.png') != -1) { - port.postMessage({ - url: event.request.url, - referrer: event.request.referrer - }); + // For the CSS file, respond in a way that may change the response URL, + // depending on |url.search|. + const cssPath = 'request-url-path/fetch-request-css-base-url-style.css'; + if (url.pathname.indexOf(cssPath) != -1) { + // Respond with a different URL, deleting "request-url-path/". + if (url.search == '?fetch') { + event.respondWith(fetch('fetch-request-css-base-url-style.css')); + } + // Respond with new Response(). + else if (url.search == '?newResponse') { + const styleString = 'body { background-image: url("./dummy.png");}'; + const headers = {'content-type': 'text/css'}; + event.respondWith(new Response(styleString, headers)); } - }); + } + + // The image request indicates what the base URL of the CSS was. Message the + // result back to the test page. + else if (url.pathname.indexOf('dummy.png') != -1) { + // For some reason |source| is undefined here when running the test manually + // in Firefox. The test author experimented with both using Client + // (event.source) and MessagePort to try to get the test to pass, but + // failed. + source.postMessage({ + url: event.request.url, + referrer: event.request.referrer + }); + resolveDone(); + } +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js new file mode 100644 index 000000000000..f0e6c7becab6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js @@ -0,0 +1,107 @@ +// This worker expects a fetch event for a navigation and messages back the +// result of clients.get(event.resultingClientId). + +// Resolves when the test finishes. +let testFinishPromise; +let resolveTestFinishPromise; +let rejectTestFinishPromise; + +// Resolves to clients.get(event.resultingClientId) from the fetch event. +let getPromise; +let resolveGetPromise; +let rejectGetPromise; + +let resultingClientId; + +function startTest() { + testFinishPromise = new Promise((resolve, reject) => { + resolveTestFinishPromise = resolve; + rejectTestFinishPromise = reject; + }); + + getPromise = new Promise((resolve, reject) => { + resolveGetPromise = resolve; + rejectGetPromise = reject; + }); +} + +async function describeGetPromiseResult(promise) { + const result = {}; + + await promise.then( + (client) => { + result.promiseState = 'fulfilled'; + if (client === undefined) { + result.promiseValue = 'undefinedValue'; + } else if (client instanceof Client) { + result.promiseValue = 'client'; + result.client = { + id: client.id, + url: client.url + }; + } else { + result.promiseValue = 'unknown'; + } + }, + (error) => { + result.promiseState = 'rejected'; + }); + + return result; +} + +async function handleGetResultingClient(event) { + // Note that this message can arrive before |resultingClientId| is populated. + const result = await describeGetPromiseResult(getPromise); + // |resultingClientId| must be populated by now. + result.queriedId = resultingClientId; + event.source.postMessage(result); +}; + +async function handleGetClient(event) { + const id = event.data.id; + const result = await describeGetPromiseResult(self.clients.get(id)); + result.queriedId = id; + event.source.postMessage(result); +}; + +self.addEventListener('message', (event) => { + if (event.data.command == 'startTest') { + startTest(); + event.waitUntil(testFinishPromise); + event.source.postMessage('ok'); + return; + } + + if (event.data.command == 'finishTest') { + resolveTestFinishPromise(); + event.source.postMessage('ok'); + return; + } + + if (event.data.command == 'getResultingClient') { + event.waitUntil(handleGetResultingClient(event)); + return; + } + + if (event.data.command == 'getClient') { + event.waitUntil(handleGetClient(event)); + return; + } +}); + +async function handleFetch(event) { + try { + resultingClientId = event.resultingClientId; + const client = await self.clients.get(resultingClientId); + resolveGetPromise(client); + } catch (error) { + rejectGetPromise(error); + } +} + +self.addEventListener('fetch', (event) => { + if (event.request.mode != 'navigate') + return; + event.waitUntil(handleFetch(event)); +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-relative.xsl b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-relative.xsl new file mode 100644 index 000000000000..063a62d03143 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-relative.xsl @@ -0,0 +1,5 @@ + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-diff-resource-map-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-diff-resource-map-worker.js new file mode 100644 index 000000000000..0fdcb0fcf80a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-diff-resource-map-worker.js @@ -0,0 +1,10 @@ +importScripts('/resources/testharness.js'); + +let echo1 = null; +let echo2 = null; +let arg1 = 'import-scripts-get.py?output=echo1&msg=test1'; +let arg2 = 'import-scripts-get.py?output=echo2&msg=test2'; + +importScripts(arg1, arg2); +assert_equals(echo1, 'test1'); +assert_equals(echo2, 'test2'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py new file mode 100644 index 000000000000..9e376bc09288 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py @@ -0,0 +1,6 @@ +def main(req, res): + return ([ + ('Cache-Control', 'no-cache, must-revalidate'), + ('Pragma', 'no-cache'), + ('Content-Type', 'application/javascript')], + '%s = "%s";\n' % (req.GET['output'], req.GET['msg'])) diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-echo-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-echo-worker.js new file mode 100644 index 000000000000..f088ad127804 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-echo-worker.js @@ -0,0 +1,3 @@ +self.addEventListener('message', event => { + event.source.postMessage(event.data); +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/service-worker-csp-worker.py b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/service-worker-csp-worker.py index 5f06454f144d..9d2b1f2d834f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/service-worker-csp-worker.py +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/service-worker-csp-worker.py @@ -17,6 +17,15 @@ 'Importing the other origins script should fail.'); }, 'importScripts test for default-src'); +test(function() { + assert_throws(EvalError(), + function() { eval('1 + 1'); }, + 'eval() should throw EvalError.') + assert_throws(EvalError(), + function() { new Function('1 + 1'); }, + 'new Function() should throw EvalError.') + }, 'eval test for default-src'); + async_test(function(t) { fetch(host_info.HTTPS_REMOTE_ORIGIN + base_path() + 'fetch-access-control.py?ACAOrigin=*', @@ -63,6 +72,15 @@ 'Importing the other origins script should fail.'); }, 'importScripts test for script-src'); +test(function() { + assert_throws(EvalError(), + function() { eval('1 + 1'); }, + 'eval() should throw EvalError.') + assert_throws(EvalError(), + function() { new Function('1 + 1'); }, + 'new Function() should throw EvalError.') + }, 'eval test for script-src'); + async_test(function(t) { fetch(host_info.HTTPS_REMOTE_ORIGIN + base_path() + 'fetch-access-control.py?ACAOrigin=*', @@ -109,6 +127,18 @@ 'Importing the other origins script should not fail.'); }, 'importScripts test for connect-src'); +test(function() { + var eval_failed = false; + try { + eval('1 + 1'); + new Function('1 + 1'); + } catch(e) { + eval_failed = true; + } + assert_false(eval_failed, + 'connect-src without unsafe-eval should not block eval().'); + }, 'eval test for connect-src'); + async_test(function(t) { fetch(host_info.HTTPS_REMOTE_ORIGIN + base_path() + 'fetch-access-control.py?ACAOrigin=*', diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js index 7efde354a8f9..af8dad3a5be8 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js @@ -75,9 +75,11 @@ function wait_for_update(test, registration) { } return new Promise(test.step_func(function(resolve) { - registration.addEventListener('updatefound', test.step_func(function() { - resolve(registration.installing); - })); + var handler = test.step_func(function() { + registration.removeEventListener('updatefound', handler); + resolve(registration.installing); + }); + registration.addEventListener('updatefound', handler); })); } @@ -276,3 +278,33 @@ async function wait_for_activation_on_dummy_scope(t, window_or_workerglobalscope await wait_for_state(t, registration.installing, 'activated'); await registration.unregister(); } + +// This installs resources/appcache-ordering.manifest. +function install_appcache_ordering_manifest() { + let resolve_install_appcache; + let reject_install_appcache; + + // This is notified by the child iframe, i.e. appcache-ordering.install.html, + // that's to be created below. + window.notify_appcache_installed = success => { + if (success) + resolve_install_appcache(); + else + reject_install_appcache(); + }; + + return new Promise((resolve, reject) => { + const frame = document.createElement('iframe'); + frame.src = 'resources/appcache-ordering.install.html'; + document.body.appendChild(frame); + resolve_install_appcache = function() { + document.body.removeChild(frame); + resolve(); + }; + reject_install_appcache = function() { + document.body.removeChild(frame); + reject(); + }; + }); +} + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.js new file mode 100644 index 000000000000..71aff5e50374 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.js @@ -0,0 +1,7 @@ +// The server injects the request headers here as a JSON string. +const headersAsJson = `%HEADERS%`; +const headers = JSON.parse(headersAsJson); + +self.addEventListener('message', async (e) => { + e.source.postMessage(headers); +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.py b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.py new file mode 100644 index 000000000000..5666f19e7904 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.py @@ -0,0 +1,16 @@ +import json +import os + +def main(request, response): + path = os.path.join(os.path.dirname(__file__), + "test-request-headers-worker.js") + body = open(path, "rb").read() + + data = {key:request.headers[key] for key,value in request.headers.iteritems()} + body = body.replace("%HEADERS%", json.dumps(data)) + + headers = [] + headers.append(("ETag", "etag")) + headers.append(("Content-Type", 'text/javascript')) + + return headers, body diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.js index dabeec077f77..3f89881c0438 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.js +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.js @@ -1,23 +1,57 @@ 'use strict'; -const installMayFinish = new Promise(resolve => { - self.finishInstall = resolve; +const installEventFired = new Promise(resolve => { + self.fireInstallEvent = resolve; }); -let report = { installEventFired: false }; +const installFinished = new Promise(resolve => { + self.finishInstall = resolve; +}); addEventListener('install', event => { - report.installEventFired = true; - let attemptUpdate = registration.update().catch(exception => { - report.exception = exception.name; - }); - event.waitUntil(Promise.all([installMayFinish, attemptUpdate])); + fireInstallEvent(); + event.waitUntil(installFinished); }); addEventListener('message', event => { - if (event.data === 'finishInstall') { + // Use a dedicated MessageChannel for every request so senders can wait for + // individual requests to finish, and concurrent requests (to different + // workers) don't cause race conditions. + const port = event.data; + port.onmessage = (event) => { + switch (event.data) { + case 'awaitInstallEvent': + installEventFired.then(() => { + port.postMessage('installEventFired'); + }); + break; + + case 'finishInstall': + installFinished.then(() => { + port.postMessage('installFinished'); + }); finishInstall(); - } else { - event.source.postMessage(report); + break; + + case 'callUpdate': { + const channel = new MessageChannel(); + registration.update().then(() => { + channel.port2.postMessage({ + success: true, + }); + }).catch((exception) => { + channel.port2.postMessage({ + success: false, + exception: exception.name, + }); + }); + port.postMessage(channel.port1, [channel.port1]); + break; + } + + default: + port.postMessage('Unexpected command ' + event.data); + break; } + }; }); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.py b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.py new file mode 100644 index 000000000000..95e4522007c1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.py @@ -0,0 +1,11 @@ +import time + +def main(request, response): + headers = [('Content-Type', 'application/javascript'), + ('Cache-Control', 'max-age=0')] + # Add timestamp to the worker so update() finds a new worker every time. + body = ''' +// %s +importScripts('update-during-installation-worker.js'); + '''.strip() % time.clock() + return headers, body diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/w3c-import.log index c4028ea07f70..9ebc8bc31ffc 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/w3c-import.log +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/w3c-import.log @@ -146,11 +146,15 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-rewrite-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-waits-for-activate-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/frame-for-getregistrations.html +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/iframe-with-image.html /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/immutable-prototype-serviceworker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-mime-type-worker.py +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-relative.xsl +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-diff-resource-map-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-echo.py +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-mime-types-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-import.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-worker.js @@ -221,6 +225,7 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/performance-timeline-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-blob-url.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-dictionary-transferables-worker.js +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-echo-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-msgport-to-client-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-to-client-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/postmessage-transferables-worker.js @@ -274,10 +279,15 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/stalling-service-worker.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/success.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.js +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/test-request-headers-worker.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/testharness-helpers.js +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/trickle.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/unregister-controller-page.html /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-claim-worker.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.js +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-during-installation-worker.py +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-fetch-worker.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker-imported-script.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker.py /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/update-missing-import-scripts-imported-worker.py @@ -300,3 +310,8 @@ List of files: /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/worker-load-interceptor.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/worker-testharness.js /LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/worker_interception_redirect_webworker.py +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xhr-iframe.html +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xhr-response-url-worker.js +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-iframe.xml +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-worker.js +/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xslt-pass.xsl diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/worker-interception-iframe.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/worker-interception-iframe.https.html index ab10a078f3d6..84204a3ee5df 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/worker-interception-iframe.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/worker-interception-iframe.https.html @@ -1,4 +1,5 @@ + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xhr-response-url-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xhr-response-url-worker.js new file mode 100644 index 000000000000..906ad5005b59 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xhr-response-url-worker.js @@ -0,0 +1,32 @@ +// Service worker for the xhr-response-url test. + +self.addEventListener('fetch', event => { + const url = new URL(event.request.url); + const respondWith = url.searchParams.get('respondWith'); + if (!respondWith) + return; + + if (respondWith == 'fetch') { + const target = url.searchParams.get('url'); + event.respondWith(fetch(target)); + return; + } + + if (respondWith == 'string') { + const headers = {'content-type': 'text/plain'}; + event.respondWith(new Response('hello', {headers})); + return; + } + + if (respondWith == 'document') { + const doc = ` + + + hi + hello + `; + const headers = {'content-type': 'text/html'}; + event.respondWith(new Response(doc, {headers})); + return; + } +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-iframe.xml b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-iframe.xml new file mode 100644 index 000000000000..065a07acb284 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-iframe.xml @@ -0,0 +1,5 @@ + + + +This tests a stylesheet which has a xsl:import with a relative URL. + diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-worker.js b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-worker.js new file mode 100644 index 000000000000..50e2b1842ffc --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xsl-base-url-worker.js @@ -0,0 +1,12 @@ +self.addEventListener('fetch', event => { + const url = new URL(event.request.url); + + // For the import-relative.xsl file, respond in a way that changes the + // response URL. This is expected to change the base URL and allow the import + // from the file to succeed. + const path = 'request-url-path/import-relative.xsl'; + if (url.pathname.indexOf(path) != -1) { + // Respond with a different URL, deleting "request-url-path/". + event.respondWith(fetch('import-relative.xsl')); + } +}); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xslt-pass.xsl b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xslt-pass.xsl new file mode 100644 index 000000000000..2cd7f2f8f86a --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/xslt-pass.xsl @@ -0,0 +1,11 @@ + + + + + + +

    PASS

    + + +
    +
    diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-connect.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-connect.https-expected.txt index f61d26270b36..e6f5a5244313 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-connect.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-connect.https-expected.txt @@ -1,6 +1,7 @@ PASS CSP test for connect-src in ServiceWorkerGlobalScope PASS importScripts test for connect-src +PASS eval test for connect-src PASS Fetch test for connect-src PASS Redirected fetch test for connect-src diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-default.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-default.https-expected.txt index f418cb835bca..76f9186cf9be 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-default.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-default.https-expected.txt @@ -1,6 +1,7 @@ PASS CSP test for default-src in ServiceWorkerGlobalScope PASS importScripts test for default-src +PASS eval test for default-src PASS Fetch test for default-src PASS Redirected fetch test for default-src diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-script.https-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-script.https-expected.txt index d37a7b5d7b3e..153388a80cbf 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-script.https-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/service-worker-csp-script.https-expected.txt @@ -1,6 +1,7 @@ PASS CSP test for script-src in ServiceWorkerGlobalScope PASS importScripts test for script-src +PASS eval test for script-src PASS Fetch test for script-src PASS Redirected fetch test for script-src diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html index 2f780a604282..fac8f2076fb6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html @@ -10,6 +10,10 @@ var url = 'resources/postmessage-to-client-worker.js'; return service_worker_unregister_and_register(t, url, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, r.installing, 'activated'); }) .then(function() { @@ -35,9 +39,6 @@ }); worker.postMessage('PING'); }); - }) - .then(function() { - return service_worker_unregister_and_done(t, scope); }); }, 'Test MessageEvent supplants ServiceWorkerMessageEvent.'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/shared-worker-controlled.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/shared-worker-controlled.https.html index 33d52e01199c..0320c02a4fa2 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/shared-worker-controlled.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/shared-worker-controlled.https.html @@ -12,6 +12,10 @@ return service_worker_unregister_and_register(t, service_worker, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, r.installing, 'activated'); }) .then(function() { @@ -24,7 +28,6 @@ }) .then(function(data) { assert_equals(data, 'intercepted by service worker'); - service_worker_unregister_and_done(t, scope); }); }, 'Verify subresource loads in SharedWorker are controlled by a Service Worker'); @@ -35,6 +38,10 @@ return service_worker_unregister_and_register(t, service_worker, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, r.installing, 'activated'); }) .then(function() { @@ -47,7 +54,6 @@ }) .then(function(data) { assert_equals(data, 'worker loading intercepted by service worker'); - service_worker_unregister_and_done(t, scope); }); }, 'Verify SharedWorker construction is controlled by a Service Worker'); @@ -58,6 +64,10 @@ return service_worker_unregister_and_register(t, service_worker, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, r.installing, 'activated'); }) .then(function() { @@ -70,7 +80,6 @@ }) .then(function(data) { assert_equals(data, 'worker loading intercepted by service worker'); - service_worker_unregister_and_done(t, scope); }); }, 'Verify importScripts from SharedWorker is controlled by a Service Worker'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html index 21e26be51284..b604f651b3c1 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html @@ -33,6 +33,10 @@ }); return service_worker_unregister_and_register(t, url1, scope) .then(function(r) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + return wait_for_state(t, r.installing, 'activated'); }) .then(function() { @@ -60,7 +64,6 @@ }) .then(function() { frame.remove(); - return service_worker_unregister_and_done(t, scope); }); }, 'Test skipWaiting when a installed worker is waiting'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-using-registration.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-using-registration.https.html index 67838acff466..412ee2a4438e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-using-registration.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-using-registration.https.html @@ -1,5 +1,6 @@ Service Worker: Skip waiting using registration + @@ -58,7 +59,7 @@ .then(function() { assert_not_equals(sw_registration.active, null, 'Registration active worker should not be null'); - fetch_tests_from_worker(sw_registration.active); + return fetch_tests_from_worker(sw_registration.active); }); }, 'Test skipWaiting while a client is using the registration'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-without-using-registration.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-without-using-registration.https.html index 705fe8355e12..ced64e5f67fb 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-without-using-registration.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting-without-using-registration.https.html @@ -1,5 +1,6 @@ Service Worker: Skip waiting without using registration + @@ -36,7 +37,7 @@ 'Document controller should still be null'); assert_not_equals(sw_registration.active, null, 'Registration active worker should not be null'); - fetch_tests_from_worker(sw_registration.active); + return fetch_tests_from_worker(sw_registration.active); }); }, 'Test skipWaiting while a client is not being controlled'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting.https.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting.https.html index 48b5a8c9aeeb..f8392fc955b4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting.https.html +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/skip-waiting.https.html @@ -14,6 +14,10 @@ var sw_registration, activated_worker, waiting_worker; return service_worker_unregister_and_register(t, url1, scope) .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + sw_registration = registration; return wait_for_state(t, registration.installing, 'activated'); }) @@ -48,7 +52,6 @@ 'Worker with url2 should be redundant'); assert_equals(sw_registration.active.scriptURL, normalizeURL(url3), 'Worker with url3 should be activated'); - return service_worker_unregister_and_done(t, scope); }); }, 'Test skipWaiting with both active and waiting workers'); diff --git a/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/svg-target-reftest.https-expected.html b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/svg-target-reftest.https-expected.html new file mode 100644 index 000000000000..9a93d3b37047 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/svg-target-reftest.https-expected.html @@ -0,0 +1,5 @@ + + +Green svg box reference file +

    Pass if you see a green box below.

    + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html new file mode 100644 index 000000000000..a138b7023572 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html @@ -0,0 +1,24 @@ + +Incumbent page used as a test helper + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/relevant.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/relevant.html new file mode 100644 index 000000000000..44f42eda493c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/relevant.html @@ -0,0 +1,2 @@ + +Relevant page used as a test helper diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/w3c-import.log new file mode 100644 index 000000000000..6bed11a60c9e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/w3c-import.log @@ -0,0 +1,18 @@ +The tests in this directory were imported from the W3C repository. +Do NOT modify these tests directly in WebKit. +Instead, create a pull request on the WPT github: + https://github.com/web-platform-tests/wpt + +Then run the Tools/Scripts/import-w3c-tests in WebKit to reimport + +Do NOT modify or remove this file. + +------------------------------------------------------------------------ +Properties requiring vendor prefixes: +None +Property values requiring vendor prefixes: +None +------------------------------------------------------------------------ +List of files: +/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/support/relevant.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/w3c-import.log new file mode 100644 index 000000000000..8cda2a5afeea --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/multi-globals/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/websockets/multi-globals/message-received.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/001-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/001-expected.txt new file mode 100644 index 000000000000..928f0e2cf5ab --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/001-expected.txt @@ -0,0 +1,4 @@ +CONSOLE MESSAGE: WebSocket connection to 'ws://localhost:49001/invalid' failed: Invalid HTTP version string: FOO + +PASS WebSockets: invalid handshake + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/001.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/001.html new file mode 100644 index 000000000000..e0e9b4e2eab4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/001.html @@ -0,0 +1,19 @@ + +WebSockets: invalid handshake + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/002-expected.txt new file mode 100644 index 000000000000..4460aced24e4 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/002-expected.txt @@ -0,0 +1,3 @@ + +PASS WebSockets: valid handshake + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/002.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/002.html new file mode 100644 index 000000000000..95139e199eb9 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/002.html @@ -0,0 +1,23 @@ + +WebSockets: valid handshake + + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-expected.txt new file mode 100644 index 000000000000..e88cc88cd071 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-expected.txt @@ -0,0 +1,3 @@ + +FAIL WebSockets: origin assert_unreached: Reached unreachable code + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker-expected.txt new file mode 100644 index 000000000000..99ff60a42f2b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker-expected.txt @@ -0,0 +1,3 @@ + +PASS origin set in a Worker + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker.js b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker.js new file mode 100644 index 000000000000..cc54f2b88416 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker.js @@ -0,0 +1,18 @@ +importScripts("/resources/testharness.js"); +importScripts('../constants.js?pipe=sub'); +importScripts('../websocket.sub.js'); + +async_test(function(t) { + var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/origin'); + ws.onmessage = t.step_func(function(e) { + assert_equals(e.data, location.protocol+'//'+location.host); + ws.onclose = t.step_func(function(e) { + assert_equals(e.wasClean, true); + ws.onclose = t.unreached_func(); + t.step_timeout(() => t.done(), 50); + }) + ws.close(); + }) + ws.onerror = ws.onclose = t.unreached_func(); +}, "origin set in a Worker"); +done(); diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003.html new file mode 100644 index 000000000000..bc8a9e51d19c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003.html @@ -0,0 +1,27 @@ + + +WebSockets: origin + + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/005-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/005-expected.txt new file mode 100644 index 000000000000..35dcc2738577 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/005-expected.txt @@ -0,0 +1,3 @@ + +PASS WebSockets: proper first line + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/005.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/005.html new file mode 100644 index 000000000000..c55cd655cfec --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/005.html @@ -0,0 +1,22 @@ + +WebSockets: proper first line + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/w3c-import.log new file mode 100644 index 000000000000..4fbb39ca8f09 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/w3c-import.log @@ -0,0 +1,21 @@ +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/websockets/opening-handshake/001.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/002.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003-sets-origin.worker.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/003.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/opening-handshake/005.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any-expected.txt new file mode 100644 index 000000000000..d5c98930ebe5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any-expected.txt @@ -0,0 +1,3 @@ + +PASS Ensure no Referer header is included + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.js b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.js new file mode 100644 index 000000000000..914af77e6780 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.js @@ -0,0 +1,13 @@ +// META: script=constants.js?pipe=sub + +async_test(t => { + const ws = new WebSocket(SCHEME_DOMAIN_PORT + "/referrer"); + ws.onmessage = t.step_func_done(e => { + assert_equals(e.data, "MISSING AS PER FETCH"); + ws.close(); + }); + + // Avoid timeouts in case of failure + ws.onclose = t.unreached_func("close"); + ws.onerror = t.unreached_func("error"); +}, "Ensure no Referer header is included"); diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.worker-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.worker-expected.txt new file mode 100644 index 000000000000..d5c98930ebe5 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.worker-expected.txt @@ -0,0 +1,3 @@ + +PASS Ensure no Referer header is included + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.worker.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.worker.html new file mode 100644 index 000000000000..2382913528e6 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.worker.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/security/001-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/001-expected.txt new file mode 100644 index 000000000000..344a000add82 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/001-expected.txt @@ -0,0 +1,4 @@ +CONSOLE MESSAGE: WebSocket connection to 'ws://localhost:49001/wrong_accept_key' failed: Error during WebSocket handshake: Sec-WebSocket-Accept mismatch + +PASS WebSockets: wrong accept key + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/security/001.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/001.html new file mode 100644 index 000000000000..4cc24598bd31 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/001.html @@ -0,0 +1,16 @@ + +WebSockets: wrong accept key + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/security/002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/002-expected.txt new file mode 100644 index 000000000000..e4c3f5ca6ab7 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/002-expected.txt @@ -0,0 +1,4 @@ +CONSOLE MESSAGE: line 17: Refused to set unsafe header "Sec-WebSocket-Key" + +PASS WebSockets: check Sec-WebSocket-Key + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/security/002.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/002.html new file mode 100644 index 000000000000..2bdc133ec239 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/002.html @@ -0,0 +1,20 @@ + +WebSockets: check Sec-WebSocket-Key + + + + + +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/security/check.py b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/check.py new file mode 100644 index 000000000000..f1414376dcf1 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/check.py @@ -0,0 +1,2 @@ +def main(request, response): + return "FAIL" if 'Sec-WebSocket-Key' in request.headers else "PASS" diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/security/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/w3c-import.log new file mode 100644 index 000000000000..2d4b87c4466e --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/security/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/websockets/security/001.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/security/002.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/security/check.py diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-1.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-1.html new file mode 100644 index 000000000000..bd0c36686954 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-1.html @@ -0,0 +1,28 @@ + +WebSockets: navigating top-level browsing context + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-2.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-2.html new file mode 100644 index 000000000000..24c419ce1855 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-2.html @@ -0,0 +1,4 @@ + +WebSockets: navigating top-level browsing context + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-expected.txt new file mode 100644 index 000000000000..74411cb84152 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-expected.txt @@ -0,0 +1,5 @@ +Test requires popup blocker disabled + + +PASS WebSockets: navigating top-level browsing context + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001.html new file mode 100644 index 000000000000..56e883c6492b --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001.html @@ -0,0 +1,25 @@ + +WebSockets: navigating top-level browsing context + + + + + + +

    Test requires popup blocker disabled

    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-1.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-1.html new file mode 100644 index 000000000000..d151b231f250 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-1.html @@ -0,0 +1,34 @@ + +WebSockets: navigating top-level browsing context with closed websocket + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-2.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-2.html new file mode 100644 index 000000000000..9a246a1dd8dd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-2.html @@ -0,0 +1,4 @@ + +WebSockets: navigating top-level browsing context with closed websocket + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-expected.txt new file mode 100644 index 000000000000..9273a0aff829 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-expected.txt @@ -0,0 +1,5 @@ +Test requires popup blocker disabled + + +FAIL WebSockets: navigating top-level browsing context with closed websocket assert_unreached: document was discarded Reached unreachable code + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002.html new file mode 100644 index 000000000000..94028e703863 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002.html @@ -0,0 +1,26 @@ + +WebSockets: navigating top-level browsing context with closed websocket + + + + + + + +

    Test requires popup blocker disabled

    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/003-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/003-expected.txt new file mode 100644 index 000000000000..1221449173dd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/003-expected.txt @@ -0,0 +1,3 @@ + +PASS WebSockets: navigating nested browsing context + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/003.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/003.html new file mode 100644 index 000000000000..554daf458a90 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/003.html @@ -0,0 +1,14 @@ + +WebSockets: navigating nested browsing context + + + +
    + + \ No newline at end of file diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/004-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/004-expected.txt new file mode 100644 index 000000000000..e1b2adad9468 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/004-expected.txt @@ -0,0 +1,3 @@ + +FAIL WebSockets: navigating nested browsing context with closed websocket assert_unreached: document was discarded Reached unreachable code + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/004.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/004.html new file mode 100644 index 000000000000..bb15cd8ef924 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/004.html @@ -0,0 +1,16 @@ + +WebSockets: navigating nested browsing context with closed websocket + + + + +
    + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005-1.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005-1.html new file mode 100644 index 000000000000..fd70fc5bddee --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005-1.html @@ -0,0 +1,24 @@ + +WebSockets: navigating nested browsing context with a websocket in top-level + + + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005-expected.txt new file mode 100644 index 000000000000..6456dc68754c --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005-expected.txt @@ -0,0 +1,5 @@ + +PASS WebSockets: navigating nested browsing context with a websocket in top-level +Test requires popup blocker disabled + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005.html b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005.html new file mode 100644 index 000000000000..81a05f48ead2 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005.html @@ -0,0 +1,20 @@ + +WebSockets: navigating nested browsing context with a websocket in top-level + + + + + + +
    +

    Test requires popup blocker disabled

    +
    + diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/w3c-import.log new file mode 100644 index 000000000000..1bd5d117e6cd --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/w3c-import.log @@ -0,0 +1,26 @@ +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/websockets/unload-a-document/001-1.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001-2.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/001.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-1.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002-2.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/002.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/003.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/004.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005-1.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/unload-a-document/005.html diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/w3c-import.log b/LayoutTests/imported/w3c/web-platform-tests/websockets/w3c-import.log new file mode 100644 index 000000000000..2f53eee9c904 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/w3c-import.log @@ -0,0 +1,102 @@ +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/websockets/Close-1000-reason.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Close-1000.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Close-Reason-124Bytes.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Close-reason-unpaired-surrogates.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Close-undefined.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-extensions-empty.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-url-with-space.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-valid-url-array-protocols.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-valid-url-binaryType-blob.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-valid-url-protocol-setCorrectly.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-valid-url-protocol-string.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-valid-url.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-Secure-verify-url-set-non-default-port.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-asciiSep-protocol-string.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-blocked-port.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-invalid-urls.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-non-absolute-url.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-nonAscii-protocol-string.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-on-worker-shutdown.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-protocol-with-space.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-protocols-repeated-case-insensitive.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-protocols-repeated.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-valid-url-array-protocols.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-valid-url-protocol-empty.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-valid-url-protocol.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-valid-url.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-verify-url-set-non-default-port.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Create-wrong-scheme.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/META.yml +/LayoutTests/imported/w3c/web-platform-tests/websockets/README.md +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-1000-reason.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-1000-verify-code.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-1000.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-1005-verify-code.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-1005.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-2999-reason.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-3000-reason.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-3000-verify-code.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-4999-reason.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-Reason-124Bytes.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-Reason-Unpaired-surrogates.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-onlyReason.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-readyState-Closed.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-readyState-Closing.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-server-initiated-close.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Close-undefined.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-65K-data.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-65K-arraybuffer.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybuffer.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybufferview-float32.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybufferview-float64.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybufferview-int32.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybufferview-uint16-offset-length.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybufferview-uint32-offset.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybufferview-uint8-offset-length.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-arraybufferview-uint8-offset.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-binary-blob.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-data.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-null.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-paired-surrogates.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-unicode-data.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Secure-Send-unpaired-surrogates.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-0byte-data.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-65K-data.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-Unpaired-Surrogates.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-before-open.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-binary-65K-arraybuffer.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-binary-arraybuffer.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-binary-arraybufferview-int16-offset.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-binary-arraybufferview-int8.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-binary-blob.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-data.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-data.worker.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-null.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-paired-surrogates.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/Send-unicode-data.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/basic-auth.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/binaryType-wrong-value.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/bufferedAmount-unchanged-by-sync-xhr.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/close-invalid.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/constants.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/constructor.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/eventhandlers.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/extended-payload-length.html +/LayoutTests/imported/w3c/web-platform-tests/websockets/referrer.any.js +/LayoutTests/imported/w3c/web-platform-tests/websockets/websocket.sub.js diff --git a/LayoutTests/imported/w3c/web-platform-tests/websockets/websocket.sub.js b/LayoutTests/imported/w3c/web-platform-tests/websockets/websocket.sub.js new file mode 100644 index 000000000000..651024eea655 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/websockets/websocket.sub.js @@ -0,0 +1,107 @@ +var __SERVER__NAME = "{{host}}"; +var __PORT = {{ports[ws][0]}}; +var __SECURE__PORT = {{ports[wss][0]}}; +var __NEW__PORT = __PORT; //All ports are non-default for now +var __NEW__SECURE__PORT = __SECURE__PORT; //All ports are non-default for now +var __PATH = "echo"; +var wsocket; +var data; + +function IsWebSocket() { + if (!self.WebSocket) { + assert_true(false, "Browser does not support WebSocket"); + } +} + +function CreateWebSocketNonAbsolute() { + IsWebSocket(); + var url = __SERVER__NAME; + wsocket = new WebSocket(url); +} + +function CreateWebSocketNonWsScheme() { + IsWebSocket(); + var url = "http://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH; + wsocket = new WebSocket(url); +} + +function CreateWebSocketNonAsciiProtocol(nonAsciiProtocol) { + IsWebSocket(); + var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH; + wsocket = new WebSocket(url, nonAsciiProtocol); +} + +function CreateWebSocketWithAsciiSep(asciiWithSep) { + IsWebSocket(); + var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH; + wsocket = new WebSocket(url, asciiWithSep); +} + +function CreateWebSocketWithBlockedPort(blockedPort) { + IsWebSocket(); + var url = "ws://" + __SERVER__NAME + ":" + blockedPort + "/" + __PATH; + return new WebSocket(url); +} + +function CreateWebSocketWithSpaceInUrl(urlWithSpace) { + IsWebSocket(); + var url = "ws://" + urlWithSpace + ":" + __PORT + "/" + __PATH; + wsocket = new WebSocket(url); +} + +function CreateWebSocketWithSpaceInProtocol(protocolWithSpace) { + IsWebSocket(); + var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH; + wsocket = new WebSocket(url, protocolWithSpace); +} + +function CreateWebSocketWithRepeatedProtocols() { + IsWebSocket(); + var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH; + wsocket = new WebSocket(url, ["echo", "echo"]); +} + +function CreateWebSocketWithRepeatedProtocolsCaseInsensitive() { + IsWebSocket(); + var url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH; + wsocket = new WebSocket(url, ["echo", "eCho"]); +} + +function CreateWebSocket(isSecure, isProtocol, isProtocols) { + IsWebSocket(); + var url; + if (isSecure) { + if (__SECURE__PORT === null) { + throw new Error("wss not yet supported"); + } + url = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/" + __PATH; + } + else { + url = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH; + } + + if (isProtocol) { + wsocket = new WebSocket(url, "echo"); + } + else if (isProtocols) { + wsocket = new WebSocket(url, ["echo", "chat"]); + } + else { + wsocket = new WebSocket(url); + } + return wsocket; +} + +function CreateControlWebSocket(isSecure) { + IsWebSocket(); + var url; + if (isSecure) { + url = "wss://" + __SERVER__NAME + ":" + __SECURE__PORT + "/control"; + } + else { + url = "ws://" + __SERVER__NAME + ":" + __PORT + "/control"; + } + + return new WebSocket(url); +} + diff --git a/LayoutTests/inspector/console/console-api-expected.txt b/LayoutTests/inspector/console/console-api-expected.txt index 836e81424635..2dcd9e69c524 100644 --- a/LayoutTests/inspector/console/console-api-expected.txt +++ b/LayoutTests/inspector/console/console-api-expected.txt @@ -585,7 +585,7 @@ STEP: console.count() { "_source": "console-api", "_level": "debug", - "_messageText": "Global: 1", + "_messageText": "default: 1", "_type": "log", "_url": null, "_line": 3, @@ -599,7 +599,21 @@ STEP: console.count() { "_source": "console-api", "_level": "debug", - "_messageText": "Global: 2", + "_messageText": "default: 2", + "_type": "log", + "_url": null, + "_line": 3, + "_column": 14, + "_repeatCount": 1, + "_stackTrace": "", + "_request": null +} + +STEP: console.count("default") +{ + "_source": "console-api", + "_level": "debug", + "_messageText": "default: 3", "_type": "log", "_url": null, "_line": 3, diff --git a/LayoutTests/inspector/console/console-api.html b/LayoutTests/inspector/console/console-api.html index d5f1df829c88..25a72a4f2b81 100644 --- a/LayoutTests/inspector/console/console-api.html +++ b/LayoutTests/inspector/console/console-api.html @@ -34,6 +34,7 @@ "console.groupEnd('collapsedGroupName')", "console.count()", "console.count()", + "console.count(\"default\")", "console.count('')", "console.count(' ')", "console.count('')", diff --git a/LayoutTests/inspector/console/console-count-expected.txt b/LayoutTests/inspector/console/console-count-expected.txt index 1b3834daea12..ad84d58763d8 100644 --- a/LayoutTests/inspector/console/console-count-expected.txt +++ b/LayoutTests/inspector/console/console-count-expected.txt @@ -1,26 +1,26 @@ -Tests for the console.count API. +Tests for the console.count and console.countReset APIs. == Running test suite: console.count --- Running test case: NoArguments -Global: 1 -Global: 2 -Global: 3 -Global: 4 -Global: 5 -Global: 6 -Global: 7 -Global: 8 -Global: 9 -Global: 10 -Global: 11 -Global: 12 -Global: 13 -Global: 14 -Global: 15 -Global: 16 +-- Running test case: console.count.NoArguments +default: 1 +default: 2 +default: 3 +default: 4 +default: 5 +default: 6 +default: 7 +default: 8 +default: 9 +default: 10 +default: 11 +default: 12 +default: 13 +default: 14 +default: 15 +default: 16 --- Running test case: WithLabel +-- Running test case: console.count.WithLabel alpha: 1 alpha: 2 beta: 1 @@ -42,3 +42,21 @@ alpha: 14 beta: 5 alpha: 15 +-- Running test case: console.countReset.NoCounter +PASS: Should produce a warning console message. +Counter "missing-label-1" does not exist +PASS: Should produce a warning console message. +Counter "missing-label-2" does not exist + +-- Running test case: console.countReset.Basic +reset-label: 1 +reset-label: 2 +reset-label: 3 +reset-label: 4 +reset-label: 5 +reset-label: 6 +reset-label: 1 +reset-label: 2 +reset-label: 1 +reset-label: 2 + diff --git a/LayoutTests/inspector/console/console-count.html b/LayoutTests/inspector/console/console-count.html index d648adbbf208..4f057a8ca395 100644 --- a/LayoutTests/inspector/console/console-count.html +++ b/LayoutTests/inspector/console/console-count.html @@ -21,13 +21,26 @@ } } +function triggerConsoleResetWarnings() { + console.countReset("missing-label-1"); + console.countReset("missing-label-2"); +} + +function triggerConsoleResetBasic() { + for (let i = 1; i <= 10; ++i) { + console.count("reset-label"); + if (i === 6 || i === 8) + console.countReset("reset-label"); + } +} + function test() { let suite = InspectorTest.createAsyncSuite("console.count"); suite.addTestCase({ - name: "NoArguments", - description: "No arguments increments a shared global counter.", + name: "console.count.NoArguments", + description: "No arguments uses the default label.", test(resolve, reject) { let seen = 0; const expected = 16; @@ -41,13 +54,13 @@ } } - InspectorTest.evaluateInPage("triggerCountNoArguments()"); // 15 - InspectorTest.evaluateInPage("console.count()"); // 1 + InspectorTest.evaluateInPage(`triggerCountNoArguments()`); // 15 + InspectorTest.evaluateInPage(`console.count("default")`); // 16 } }); suite.addTestCase({ - name: "WithLabel", + name: "console.count.WithLabel", description: "Labeled counters increment the label.", test(resolve, reject) { let seen = 0; @@ -62,7 +75,48 @@ } } - InspectorTest.evaluateInPage("triggerLabeledCounters()"); + InspectorTest.evaluateInPage(`triggerLabeledCounters()`); + } + }); + + suite.addTestCase({ + name: "console.countReset.NoCounter", + description: "A reset of a non-existing counter should warn.", + test(resolve, reject) { + let seen = 0; + const expected = 2; + WI.consoleManager.addEventListener(WI.ConsoleManager.Event.MessageAdded, handler); + function handler(event) { + let message = event.data.message; + InspectorTest.expectEqual(message.level, WI.ConsoleMessage.MessageLevel.Warning, "Should produce a warning console message."); + InspectorTest.log(message.messageText); + if (++seen === expected) { + WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, handler); + resolve(); + } + } + + InspectorTest.evaluateInPage(`triggerConsoleResetWarnings()`); + } + }); + + suite.addTestCase({ + name: "console.countReset.Basic", + description: "A reset of a non-existing counter should warn.", + test(resolve, reject) { + let seen = 0; + const expected = 10; + WI.consoleManager.addEventListener(WI.ConsoleManager.Event.MessageAdded, handler); + function handler(event) { + let message = event.data.message; + InspectorTest.log(message.messageText); + if (++seen === expected) { + WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, handler); + resolve(); + } + } + + InspectorTest.evaluateInPage(`triggerConsoleResetBasic()`); } }); @@ -71,6 +125,6 @@ -

    Tests for the console.count API.

    +

    Tests for the console.count and console.countReset APIs.

    diff --git a/LayoutTests/inspector/console/console-time-expected.txt b/LayoutTests/inspector/console/console-time-expected.txt index 640d7aeba0ae..dbe691709ee9 100644 --- a/LayoutTests/inspector/console/console-time-expected.txt +++ b/LayoutTests/inspector/console/console-time-expected.txt @@ -1,8 +1,14 @@ -Tests for the console.time and console.timeEnd APIs. +Tests for the console.time, console.timeLog, and console.timeEnd APIs. -== Running test suite: console.time and console.timeEnd --- Running test case: DefaultLabel +== Running test suite: console.time +-- Running test case: console.time.DefaultLabel +PASS: Should receive a Timing type message. +PASS: Message should contain the 'default' label name somewhere. +PASS: Should receive a Timing type message. +PASS: Message should contain the 'default' label name somewhere. +PASS: Should receive a Timing type message. +PASS: Message should contain the 'default' label name somewhere. PASS: Should receive a Timing type message. PASS: Message should contain the 'default' label name somewhere. PASS: Should receive a Timing type message. @@ -10,23 +16,52 @@ PASS: Message should contain the 'default' label name somewhere. PASS: Should receive a Timing type message. PASS: Message should contain the 'default' label name somewhere. --- Running test case: UserLabels +-- Running test case: console.time.UserLabels +PASS: Should receive a Timing type message. +PASS: Message should contain the 'my-label' label name somewhere. PASS: Should receive a Timing type message. PASS: Message should contain the 'my-label' label name somewhere. --- Running test case: MultipleTimers +-- Running test case: console.time.MultipleTimers PASS: Should receive a Timing type message. PASS: Message should contain the 'my-label-2' label name somewhere. PASS: Should receive a Timing type message. PASS: Message should contain the 'my-label-1' label name somewhere. --- Running test case: WarnWhenExisting +-- Running test case: console.time.WarnWhenExisting PASS: Should receive a Timing type message. PASS: Should receive a Warning level message PASS: Message should contain the 'default' label name somewhere. --- Running test case: WarnWhenNotExisting +-- Running test case: console.time.WarnWhenNotExisting +PASS: Should receive a Timing type message. +PASS: Should receive a Warning level message. +PASS: Message should contain the 'default' label name somewhere. PASS: Should receive a Timing type message. PASS: Should receive a Warning level message. PASS: Message should contain the 'default' label name somewhere. +-- Running test case: console.time.TimeLogIncreasing +PASS: Should receive a Timing type message. +PASS: Message should contain the 'my-timelog-label' label name somewhere. +PASS: + Initial timer time seen. +PASS: Should receive a Timing type message. +PASS: Message should contain the 'my-timelog-label' label name somewhere. +PASS: + Timer time should be increasing. +PASS: Should receive a Timing type message. +PASS: Message should contain the 'my-timelog-label' label name somewhere. +PASS: + Timer time should be increasing. +PASS: Should receive a Timing type message. +PASS: Message should contain the 'my-timelog-label' label name somewhere. +PASS: + Timer time should be increasing. + +-- Running test case: console.time.TimeLogArguments +PASS: Should receive a Timing type message. +PASS: timeLog should contain no parameters +PASS: Should receive a Timing type message. +PASS: timeLog should contain 1 parameters +PASS: Should receive a Timing type message. +PASS: timeLog should contain 2 parameters +PASS: Should receive a Timing type message. +PASS: timeEnd should contain no parameters + diff --git a/LayoutTests/inspector/console/console-time.html b/LayoutTests/inspector/console/console-time.html index 05f44ca9c03e..93dcede71f0f 100644 --- a/LayoutTests/inspector/console/console-time.html +++ b/LayoutTests/inspector/console/console-time.html @@ -3,16 +3,22 @@ -

    Tests for the console.time and console.timeEnd APIs.

    +

    Tests for the console.time, console.timeLog, and console.timeEnd APIs.

    diff --git a/LayoutTests/inspector/css/modify-css-property.html b/LayoutTests/inspector/css/modify-css-property.html index 69fc80815bc3..32ffd9a7aa3b 100644 --- a/LayoutTests/inspector/css/modify-css-property.html +++ b/LayoutTests/inspector/css/modify-css-property.html @@ -117,7 +117,7 @@ let styleDeclaration = getInlineStyleDeclaration(); - WI.CSSStyleDeclaration.awaitEvent(WI.CSSStyleDeclaration.Event.PropertiesChanged).then((event) => { + styleDeclaration.awaitEvent(WI.CSSStyleDeclaration.Event.PropertiesChanged).then((event) => { InspectorTest.expectThat(!styleDeclaration.locked, `Style declaration is unlocked.`); InspectorTest.expectEqual(getProperty("width").rawValue, "200px", `"width" property value should update to "200px".`); InspectorTest.expectEqual(styleDeclaration.text, `width: 200px;`, `Inline style declaration text should update when not locked.`); diff --git a/LayoutTests/inspector/css/pseudo-element-matches-for-pseudo-element-node.html b/LayoutTests/inspector/css/pseudo-element-matches-for-pseudo-element-node.html index 3189f2af0a03..1ca26d06a206 100644 --- a/LayoutTests/inspector/css/pseudo-element-matches-for-pseudo-element-node.html +++ b/LayoutTests/inspector/css/pseudo-element-matches-for-pseudo-element-node.html @@ -34,7 +34,7 @@ } } - InspectorTest.completeTest(); + InspectorTest.completeTest(); } WI.domManager.requestDocument(function(documentNode) { diff --git a/LayoutTests/inspector/dom/getAccessibilityPropertiesForNode-expected.txt b/LayoutTests/inspector/dom/getAccessibilityPropertiesForNode-expected.txt index 9efa3ee924f0..5f3f8a4aab0a 100644 --- a/LayoutTests/inspector/dom/getAccessibilityPropertiesForNode-expected.txt +++ b/LayoutTests/inspector/dom/getAccessibilityPropertiesForNode-expected.txt @@ -326,7 +326,7 @@ Total elements to be tested: 122. exists: true label: x - role: img + role: presentation ignored: true ignoredByDefault: true hidden: true @@ -339,7 +339,7 @@ Total elements to be tested: 122. exists: true label: - role: img + role: presentation ignored: true @@ -350,7 +350,7 @@ Total elements to be tested: 122. exists: true label: - role: img + role: presentation ignored: true diff --git a/LayoutTests/inspector/formatting/resources/css-tests/keyframes-expected.css b/LayoutTests/inspector/formatting/resources/css-tests/keyframes-expected.css index e7106720447f..ca38fa083ebc 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/keyframes-expected.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/keyframes-expected.css @@ -8,3 +8,13 @@ } } +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(-180deg) translate(0px, 0px); + } + + 100% { + -webkit-transform: rotate(180deg) translate(10px, 75px); + } +} + diff --git a/LayoutTests/inspector/formatting/resources/css-tests/keyframes.css b/LayoutTests/inspector/formatting/resources/css-tests/keyframes.css index bd88b56cc496..669aab55feb0 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/keyframes.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/keyframes.css @@ -1 +1,2 @@ @-webkit-keyframes spin{0%{-webkit-transform:rotate(-180deg)translate(0px,0px);}100%{-webkit-transform:rotate(180deg)translate(10px,75px);}} +@-webkit-keyframes spin { 0% { -webkit-transform : rotate ( -180deg ) translate ( 0px , 0px ) ; } 100% { -webkit-transform : rotate ( 180deg ) translate ( 10px , 75px ) ; } } diff --git a/LayoutTests/inspector/formatting/resources/css-tests/media-query-expected.css b/LayoutTests/inspector/formatting/resources/css-tests/media-query-expected.css index 02ebe939e1ce..d49c1236442f 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/media-query-expected.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/media-query-expected.css @@ -20,7 +20,13 @@ } /* MEDIA QUERY */ -@media screen and (max-device-width:480px) { +@media screen and (max-device-width: 480px) { + html { + -webkit-text-size-adjust: none; + } +} + +@media screen and (max-device-width: 480px) { html { -webkit-text-size-adjust: none; } @@ -32,3 +38,49 @@ } } +@media not ((screen) and (print)), (print) { + body { + color: red + } +} + +/* font-face */ +@font-face { + font-family: "MyWebFont"; + src: url("myfont.woff2") format("woff2"), url("myfont.woff") format("woff"); +} + +/* page */ +@page :first { + margin: 1in; +} + +@page :first { + margin: 1in; +} + +/* supports */ +@supports (display: flex) { + .module { + display: flex; + } +} + +@supports (display: flex) { + .module { + display: flex; + } +} + +@supports (-webkit-backdrop-filter: blur(10px)) { + .home header { + -webkit-backdrop-filter: blur(10px); + } +} + +@supports (-webkit-backdrop-filter: blur(10px)) { + .home header { + -webkit-backdrop-filter: blur(10px); + } +} + diff --git a/LayoutTests/inspector/formatting/resources/css-tests/media-query.css b/LayoutTests/inspector/formatting/resources/css-tests/media-query.css index b86bcffc09a2..a740d3deadf6 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/media-query.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/media-query.css @@ -3,4 +3,23 @@ /* MEDIA QUERY */ @media screen and(max-device-width:480px){html{-webkit-text-size-adjust:none;}} +@media screen and ( max-device-width : 480px ) { html { -webkit-text-size-adjust : none ; } } @media not((screen)and(print)),(print){body{color:red}} +@media not ( ( screen ) and ( print ) ) , ( print ) { body { color : red } } + +/* font-face */ +@font-face { + font-family: "MyWebFont"; + src: url("myfont.woff2") format("woff2"), + url("myfont.woff") format("woff"); +} + +/* page */ +@page :first{margin:1in;} +@page :first { margin : 1in ; } + +/* supports */ +@supports(display:flex){.module{display:flex;}} +@supports ( display : flex ) { .module { display : flex ; } } +@supports(-webkit-backdrop-filter:blur(10px)){.home header{-webkit-backdrop-filter:blur(10px);}} +@supports ( -webkit-backdrop-filter : blur ( 10px ) ) { .home header { -webkit-backdrop-filter : blur ( 10px ) ; } } diff --git a/LayoutTests/inspector/formatting/resources/css-tests/selectors-expected.css b/LayoutTests/inspector/formatting/resources/css-tests/selectors-expected.css index 04201811fc68..f3b745e3e1c6 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/selectors-expected.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/selectors-expected.css @@ -3,7 +3,35 @@ a { } /* COMPLEX SELECTOR */ +div div > div#id.foo.bar:hover .something > .child ~ .sibling + .sibling:after { + color: red; +} + +div div > div#id.foo.bar:hover .something > .child ~ .sibling + .sibling:after { + color: red; +} + div div > div#id.foo.bar:hover .something > .child ~ .sibling + .sibling::after { color: red; } +div div > div#id.foo.bar:hover .something > .child ~ .sibling + .sibling::after { + color: red; +} + +div div > div#id.foo.bar:hover .something > .child ~ .sibling + :matches(.sibling):after { + color: red; +} + +div div > div#id.foo.bar:hover .something > .child ~ .sibling + :matches(.sibling):after { + color: red; +} + +div div > div#id.foo.bar:hover .something > .child ~ .sibling + :matches(.sibling)::after { + color: red; +} + +div div > div#id.foo.bar:hover .something > .child ~ .sibling + :matches(.sibling)::after { + color: red; +} + diff --git a/LayoutTests/inspector/formatting/resources/css-tests/selectors.css b/LayoutTests/inspector/formatting/resources/css-tests/selectors.css index 5a3ef7c4b47a..252a91bcd2a1 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/selectors.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/selectors.css @@ -2,4 +2,11 @@ a{} /* COMPLEX SELECTOR */ +div div>div#id.foo.bar:hover .something>.child~.sibling+.sibling:after{color:red;} +div div > div#id.foo.bar:hover .something > .child ~ .sibling + .sibling:after { color : red ; } div div>div#id.foo.bar:hover .something>.child~.sibling+.sibling::after{color:red;} +div div > div#id.foo.bar:hover .something > .child ~ .sibling + .sibling::after { color : red ; } +div div>div#id.foo.bar:hover .something>.child~.sibling+:matches(.sibling):after{color:red;} +div div > div#id.foo.bar:hover .something > .child ~ .sibling + :matches(.sibling):after { color : red ; } +div div>div#id.foo.bar:hover .something>.child~.sibling+:matches(.sibling)::after{color:red;} +div div > div#id.foo.bar:hover .something > .child ~ .sibling + :matches(.sibling)::after { color : red ; } diff --git a/LayoutTests/inspector/formatting/resources/css-tests/wrapping-expected.css b/LayoutTests/inspector/formatting/resources/css-tests/wrapping-expected.css index 795d5dc9eb3a..ccdf7133ddc4 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/wrapping-expected.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/wrapping-expected.css @@ -7,3 +7,8 @@ a.browsewebappss:hover, a.businessstores:hover, a.buyiphones:hover, a.buynows:ho color: red } +/* NEWLINE-SEPARATED SELECTORS SHOULD COMBINE */ +h1, h2, h3, h4, h5, h6 { + font-size: 1em +} + diff --git a/LayoutTests/inspector/formatting/resources/css-tests/wrapping.css b/LayoutTests/inspector/formatting/resources/css-tests/wrapping.css index be6bf9d2aa84..d601db3a1cb2 100644 --- a/LayoutTests/inspector/formatting/resources/css-tests/wrapping.css +++ b/LayoutTests/inspector/formatting/resources/css-tests/wrapping.css @@ -1,3 +1,11 @@ /* LONG LISTS SHOULDN'T WRAP */ a.browsewebappss,a.businessstores,a.buyiphones,a.buynows,a.buynows-arrow,a.comingsoons,p::before,a.descargarahoras,a.downloadituness,a.downloadnows,a.finds,a.freetrials,a.getstarteds,a.gos,a.howtoapplys,a.howtobuys,a.joinnows,a.learnmores,a.nikebuynows,a.notifymes,a.ordernows,a.preordernows,a.preorders,a.reserves,a.startyoursearchs,a.submits,a.tryamacs,a.upgradenows {color:red} a.browsewebappss:hover,a.businessstores:hover,a.buyiphones:hover,a.buynows:hover,a.buynows-arrow:hover,a.comingsoons:hover,p::before,a.descargarahoras:hover,a.downloadituness:hover,a.downloadnows:hover,a.finds:hover,a.freetrials:hover,a.getstarteds:hover,a.gos:hover,a.howtoapplys:hover,a.howtobuys:hover,a.joinnows:hover,a.learnmores:hover,a.nikebuynows:hover,a.notifymes:hover,a.ordernows:hover,a.preordernows:hover,a.preorders:hover,a.reserves:hover,a.startyoursearchs:hover,a.submits:hover,a.tryamacs:hover,a.upgradenows:hover {color:red} + +/* NEWLINE-SEPARATED SELECTORS SHOULD COMBINE */ +h1, +h2, +h3, +h4, +h5, +h6 {font-size:1em} diff --git a/LayoutTests/inspector/unit-tests/set-utilities-expected.txt b/LayoutTests/inspector/unit-tests/set-utilities-expected.txt index d2e7d226590c..c127acbc91d3 100644 --- a/LayoutTests/inspector/unit-tests/set-utilities-expected.txt +++ b/LayoutTests/inspector/unit-tests/set-utilities-expected.txt @@ -1,5 +1,11 @@ == Running test suite: Set +-- Running test case: Set.prototype.take +PASS: Set can take `key`. +PASS: Set no longer has `key`. +PASS: Set can NOT take `key`. +PASS: Set can NOT take `DNE`, as it does NOT exist. + -- Running test case: Set.prototype.intersects PASS: an empty set should not intersect another empty set. PASS: a non-empty set should not intersect an empty set. diff --git a/LayoutTests/inspector/unit-tests/set-utilities.html b/LayoutTests/inspector/unit-tests/set-utilities.html index 5905e2f6adc0..c708aa0f1d83 100644 --- a/LayoutTests/inspector/unit-tests/set-utilities.html +++ b/LayoutTests/inspector/unit-tests/set-utilities.html @@ -7,6 +7,20 @@ { let suite = InspectorTest.createSyncSuite("Set"); + suite.addTestCase({ + name: "Set.prototype.take", + test() { + const key = "key"; + + let set = new Set; + set.add(key); + InspectorTest.expectTrue(set.take(key), "Set can take `key`."); + InspectorTest.expectFalse(set.has(key), "Set no longer has `key`."); + InspectorTest.expectFalse(set.take(key), "Set can NOT take `key`."); + InspectorTest.expectFalse(set.take("DNE"), "Set can NOT take `DNE`, as it does NOT exist."); + } + }); + suite.addTestCase({ name: "Set.prototype.intersects", test() { diff --git a/LayoutTests/inspector/unit-tests/url-utilities-expected.txt b/LayoutTests/inspector/unit-tests/url-utilities-expected.txt index 8d3674a7c399..e50ca8fa7587 100644 --- a/LayoutTests/inspector/unit-tests/url-utilities-expected.txt +++ b/LayoutTests/inspector/unit-tests/url-utilities-expected.txt @@ -335,6 +335,22 @@ PASS: charset should be: 'US-ASCII' PASS: base64 should be: 'true' PASS: data should be: 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==' +-- Running test case: parseQueryString +PASS: The query 'a' was parsed successfully. +PASS: The query 'a&b' was parsed successfully. +PASS: The query 'a=' was parsed successfully. +PASS: The query 'a=&b=' was parsed successfully. +PASS: The query 'a=1' was parsed successfully. +PASS: The query 'a=1&b=2' was parsed successfully. +PASS: The query 'a==1' was parsed successfully. +PASS: The query 'a==1&b==2' was parsed successfully. +PASS: The query 'a=1=' was parsed successfully. +PASS: The query 'a=1=&b=2=' was parsed successfully. +PASS: The query 'a==1=' was parsed successfully. +PASS: The query 'a==1=&b==2=' was parsed successfully. +PASS: The query 'a&b=1&c==2=&d&e=3&f==4=' was parsed successfully. +PASS: The query 'a=foo%20bar&b=123%3A456' was parsed successfully. + -- Running test case: WI.h2Authority PASS: HTTP/2 :authority of 'http://example.com' should be 'example.com'. PASS: HTTP/2 :authority of 'https://example.com' should be 'example.com'. diff --git a/LayoutTests/inspector/unit-tests/url-utilities.html b/LayoutTests/inspector/unit-tests/url-utilities.html index 6325557a457f..6f7a369e8e59 100644 --- a/LayoutTests/inspector/unit-tests/url-utilities.html +++ b/LayoutTests/inspector/unit-tests/url-utilities.html @@ -385,6 +385,39 @@ } }); + suite.addTestCase({ + name: "parseQueryString", + test() { + function test(queryString, expected) { + InspectorTest.expectShallowEqual(parseQueryString(queryString), expected, `The query '${queryString}' was parsed successfully.`); + } + + test("a", {a: ""}); + test("a&b", {a: "", b: ""}); + + test("a=", {a: ""}); + test("a=&b=", {a: "", b: ""}); + + test("a=1", {a: "1"}); + test("a=1&b=2", {a: "1", b: "2"}); + + test("a==1", {a: "=1"}); + test("a==1&b==2", {a: "=1", b: "=2"}); + + test("a=1=", {a: "1="}); + test("a=1=&b=2=", {a: "1=", b: "2="}); + + test("a==1=", {a: "=1="}); + test("a==1=&b==2=", {a: "=1=", b: "=2="}); + + test("a&b=1&c==2=&d&e=3&f==4=", {a: "", b: "1", c: "=2=", d: "", e: "3", f: "=4="}); + + test("a=foo%20bar&b=123%3A456", {a: "foo bar", b: "123:456"}); + + return true; + } + }); + suite.addTestCase({ name: "WI.h2Authority", test() { diff --git a/LayoutTests/inspector/worker/console-basic-expected.txt b/LayoutTests/inspector/worker/console-basic-expected.txt index 5d57d3a98828..8caf1a29e661 100644 --- a/LayoutTests/inspector/worker/console-basic-expected.txt +++ b/LayoutTests/inspector/worker/console-basic-expected.txt @@ -148,7 +148,7 @@ PASS: ConsoleMessage parameter RemoteObjects should be from the Worker target. { "_source": "console-api", "_level": "debug", - "_messageText": "Global: 1", + "_messageText": "default: 1", "_type": "log", "_url": "inspector/worker/resources/worker-console.js", "_line": 21, diff --git a/LayoutTests/js/Object-getOwnPropertyNames-expected.txt b/LayoutTests/js/Object-getOwnPropertyNames-expected.txt index 565258e04361..91c26206e7be 100644 --- a/LayoutTests/js/Object-getOwnPropertyNames-expected.txt +++ b/LayoutTests/js/Object-getOwnPropertyNames-expected.txt @@ -49,7 +49,7 @@ PASS getSortedOwnPropertyNames(Function.prototype) is ['apply', 'arguments', 'bi PASS getSortedOwnPropertyNames(Array) is ['from', 'isArray', 'length', 'name', 'of', 'prototype'] PASS getSortedOwnPropertyNames(Array.prototype) is ['concat', 'constructor', 'copyWithin', 'entries', 'every', 'fill', 'filter', 'find', 'findIndex', 'flat', 'flatMap', 'forEach', 'includes', 'indexOf', 'join', 'keys', 'lastIndexOf', 'length', 'map', 'pop', 'push', 'reduce', 'reduceRight', 'reverse', 'shift', 'slice', 'some', 'sort', 'splice', 'toLocaleString', 'toString', 'unshift', 'values'] PASS getSortedOwnPropertyNames(String) is ['fromCharCode', 'fromCodePoint', 'length', 'name', 'prototype', 'raw'] -PASS getSortedOwnPropertyNames(String.prototype) is ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'codePointAt', 'concat', 'constructor', 'endsWith', 'fixed', 'fontcolor', 'fontsize', 'includes', 'indexOf', 'italics', 'lastIndexOf', 'length', 'link', 'localeCompare', 'match', 'normalize', 'padEnd', 'padStart', 'repeat', 'replace', 'search', 'slice', 'small', 'split', 'startsWith', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toString', 'toUpperCase', 'trim', 'trimEnd', 'trimLeft', 'trimRight', 'trimStart', 'valueOf'] +PASS getSortedOwnPropertyNames(String.prototype) is ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'codePointAt', 'concat', 'constructor', 'endsWith', 'fixed', 'fontcolor', 'fontsize', 'includes', 'indexOf', 'italics', 'lastIndexOf', 'length', 'link', 'localeCompare', 'match', 'matchAll', 'normalize', 'padEnd', 'padStart', 'repeat', 'replace', 'search', 'slice', 'small', 'split', 'startsWith', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toString', 'toUpperCase', 'trim', 'trimEnd', 'trimLeft', 'trimRight', 'trimStart', 'valueOf'] PASS getSortedOwnPropertyNames(Boolean) is ['length', 'name', 'prototype'] PASS getSortedOwnPropertyNames(Boolean.prototype) is ['constructor', 'toString', 'valueOf'] PASS getSortedOwnPropertyNames(Number) is ['EPSILON', 'MAX_SAFE_INTEGER', 'MAX_VALUE', 'MIN_SAFE_INTEGER', 'MIN_VALUE', 'NEGATIVE_INFINITY', 'NaN', 'POSITIVE_INFINITY', 'isFinite', 'isInteger', 'isNaN', 'isSafeInteger', 'length', 'name', 'parseFloat', 'parseInt', 'prototype'] @@ -62,7 +62,7 @@ PASS getSortedOwnPropertyNames(Error) is ['length', 'name', 'prototype', 'stackT PASS getSortedOwnPropertyNames(Error.prototype) is ['constructor', 'message', 'name', 'toString'] PASS getSortedOwnPropertyNames(Math) is ['E','LN10','LN2','LOG10E','LOG2E','PI','SQRT1_2','SQRT2','abs','acos','acosh','asin','asinh','atan','atan2','atanh','cbrt','ceil','clz32','cos','cosh','exp','expm1','floor','fround','hypot','imul','log','log10','log1p','log2','max','min','pow','random','round','sign','sin','sinh','sqrt','tan','tanh','trunc'] PASS getSortedOwnPropertyNames(JSON) is ['parse', 'stringify'] -PASS getSortedOwnPropertyNames(Symbol) is ['asyncIterator','for', 'hasInstance', 'isConcatSpreadable', 'iterator', 'keyFor', 'length', 'match', 'name', 'prototype', 'replace', 'search', 'species', 'split', 'toPrimitive', 'toStringTag', 'unscopables'] +PASS getSortedOwnPropertyNames(Symbol) is ['asyncIterator','for', 'hasInstance', 'isConcatSpreadable', 'iterator', 'keyFor', 'length', 'match', 'matchAll', 'name', 'prototype', 'replace', 'search', 'species', 'split', 'toPrimitive', 'toStringTag', 'unscopables'] PASS getSortedOwnPropertyNames(Symbol.prototype) is ['constructor', 'description', 'toString', 'valueOf'] PASS getSortedOwnPropertyNames(Map) is ['length', 'name', 'prototype'] PASS getSortedOwnPropertyNames(Map.prototype) is ['clear', 'constructor', 'delete', 'entries', 'forEach', 'get', 'has', 'keys', 'set', 'size', 'values'] diff --git a/LayoutTests/js/array-unscopables-properties-expected.txt b/LayoutTests/js/array-unscopables-properties-expected.txt index ad217e9535cc..ffa6bb17e2c4 100644 --- a/LayoutTests/js/array-unscopables-properties-expected.txt +++ b/LayoutTests/js/array-unscopables-properties-expected.txt @@ -30,6 +30,14 @@ PASS Array.prototype[Symbol.unscopables]["findIndex"] is true PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "findIndex").writable is true PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "findIndex").enumerable is true PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "findIndex").configurable is true +PASS Array.prototype[Symbol.unscopables]["flat"] is true +PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "flat").writable is true +PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "flat").enumerable is true +PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "flat").configurable is true +PASS Array.prototype[Symbol.unscopables]["flatMap"] is true +PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "flatMap").writable is true +PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "flatMap").enumerable is true +PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "flatMap").configurable is true PASS Array.prototype[Symbol.unscopables]["includes"] is true PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "includes").writable is true PASS Object.getOwnPropertyDescriptor(Array.prototype[Symbol.unscopables], "includes").enumerable is true diff --git a/LayoutTests/js/console-expected.txt b/LayoutTests/js/console-expected.txt index b6bf724ea6de..aa3b0638910f 100644 --- a/LayoutTests/js/console-expected.txt +++ b/LayoutTests/js/console-expected.txt @@ -100,6 +100,13 @@ PASS descriptor.configurable is true PASS descriptor.writable is true PASS descriptor.enumerable is true +console.countReset +PASS typeof console.countReset is "function" +PASS console.countReset.length is 0 +PASS descriptor.configurable is true +PASS descriptor.writable is true +PASS descriptor.enumerable is true + console.profile PASS typeof console.profile is "function" PASS console.profile.length is 0 @@ -121,6 +128,13 @@ PASS descriptor.configurable is true PASS descriptor.writable is true PASS descriptor.enumerable is true +console.timeLog +PASS typeof console.timeLog is "function" +PASS console.timeLog.length is 0 +PASS descriptor.configurable is true +PASS descriptor.writable is true +PASS descriptor.enumerable is true + console.timeEnd PASS typeof console.timeEnd is "function" PASS console.timeEnd.length is 0 diff --git a/LayoutTests/js/dom/global-function-resolve-expected.txt b/LayoutTests/js/dom/global-function-resolve-expected.txt index 734bcc5f7cb4..b37e5fb70ed5 100644 --- a/LayoutTests/js/dom/global-function-resolve-expected.txt +++ b/LayoutTests/js/dom/global-function-resolve-expected.txt @@ -61,62 +61,60 @@ PASS cachedFunctions[27]() is navigator PASS cachedFunctions[27]() is navigator PASS cachedFunctions[28]() is open PASS cachedFunctions[28]() is open -PASS cachedFunctions[29]() is openDatabase -PASS cachedFunctions[29]() is openDatabase -PASS cachedFunctions[30]() is opener -PASS cachedFunctions[30]() is opener -PASS cachedFunctions[31]() is outerHeight -PASS cachedFunctions[31]() is outerHeight -PASS cachedFunctions[32]() is outerWidth -PASS cachedFunctions[32]() is outerWidth -PASS cachedFunctions[33]() is pageXOffset -PASS cachedFunctions[33]() is pageXOffset -PASS cachedFunctions[34]() is pageYOffset -PASS cachedFunctions[34]() is pageYOffset -PASS cachedFunctions[35]() is parent -PASS cachedFunctions[35]() is parent -PASS cachedFunctions[36]() is prompt -PASS cachedFunctions[36]() is prompt -PASS cachedFunctions[37]() is releaseEvents -PASS cachedFunctions[37]() is releaseEvents -PASS cachedFunctions[38]() is removeEventListener -PASS cachedFunctions[38]() is removeEventListener -PASS cachedFunctions[39]() is resizeBy -PASS cachedFunctions[39]() is resizeBy -PASS cachedFunctions[40]() is resizeTo -PASS cachedFunctions[40]() is resizeTo -PASS cachedFunctions[41]() is screen -PASS cachedFunctions[41]() is screen -PASS cachedFunctions[42]() is screenLeft -PASS cachedFunctions[42]() is screenLeft -PASS cachedFunctions[43]() is screenTop -PASS cachedFunctions[43]() is screenTop -PASS cachedFunctions[44]() is screenX -PASS cachedFunctions[44]() is screenX -PASS cachedFunctions[45]() is screenY -PASS cachedFunctions[45]() is screenY -PASS cachedFunctions[46]() is scroll -PASS cachedFunctions[46]() is scroll -PASS cachedFunctions[47]() is scrollBy -PASS cachedFunctions[47]() is scrollBy -PASS cachedFunctions[48]() is scrollTo -PASS cachedFunctions[48]() is scrollTo -PASS cachedFunctions[49]() is scrollX -PASS cachedFunctions[49]() is scrollX -PASS cachedFunctions[50]() is scrollY -PASS cachedFunctions[50]() is scrollY -PASS cachedFunctions[51]() is setInterval -PASS cachedFunctions[51]() is setInterval -PASS cachedFunctions[52]() is setTimeout -PASS cachedFunctions[52]() is setTimeout -PASS cachedFunctions[53]() is showModalDialog -PASS cachedFunctions[53]() is showModalDialog -PASS cachedFunctions[54]() is status -PASS cachedFunctions[54]() is status -PASS cachedFunctions[55]() is stop -PASS cachedFunctions[55]() is stop -PASS cachedFunctions[56]() is window -PASS cachedFunctions[56]() is window +PASS cachedFunctions[29]() is opener +PASS cachedFunctions[29]() is opener +PASS cachedFunctions[30]() is outerHeight +PASS cachedFunctions[30]() is outerHeight +PASS cachedFunctions[31]() is outerWidth +PASS cachedFunctions[31]() is outerWidth +PASS cachedFunctions[32]() is pageXOffset +PASS cachedFunctions[32]() is pageXOffset +PASS cachedFunctions[33]() is pageYOffset +PASS cachedFunctions[33]() is pageYOffset +PASS cachedFunctions[34]() is parent +PASS cachedFunctions[34]() is parent +PASS cachedFunctions[35]() is prompt +PASS cachedFunctions[35]() is prompt +PASS cachedFunctions[36]() is releaseEvents +PASS cachedFunctions[36]() is releaseEvents +PASS cachedFunctions[37]() is removeEventListener +PASS cachedFunctions[37]() is removeEventListener +PASS cachedFunctions[38]() is resizeBy +PASS cachedFunctions[38]() is resizeBy +PASS cachedFunctions[39]() is resizeTo +PASS cachedFunctions[39]() is resizeTo +PASS cachedFunctions[40]() is screen +PASS cachedFunctions[40]() is screen +PASS cachedFunctions[41]() is screenLeft +PASS cachedFunctions[41]() is screenLeft +PASS cachedFunctions[42]() is screenTop +PASS cachedFunctions[42]() is screenTop +PASS cachedFunctions[43]() is screenX +PASS cachedFunctions[43]() is screenX +PASS cachedFunctions[44]() is screenY +PASS cachedFunctions[44]() is screenY +PASS cachedFunctions[45]() is scroll +PASS cachedFunctions[45]() is scroll +PASS cachedFunctions[46]() is scrollBy +PASS cachedFunctions[46]() is scrollBy +PASS cachedFunctions[47]() is scrollTo +PASS cachedFunctions[47]() is scrollTo +PASS cachedFunctions[48]() is scrollX +PASS cachedFunctions[48]() is scrollX +PASS cachedFunctions[49]() is scrollY +PASS cachedFunctions[49]() is scrollY +PASS cachedFunctions[50]() is setInterval +PASS cachedFunctions[50]() is setInterval +PASS cachedFunctions[51]() is setTimeout +PASS cachedFunctions[51]() is setTimeout +PASS cachedFunctions[52]() is showModalDialog +PASS cachedFunctions[52]() is showModalDialog +PASS cachedFunctions[53]() is status +PASS cachedFunctions[53]() is status +PASS cachedFunctions[54]() is stop +PASS cachedFunctions[54]() is stop +PASS cachedFunctions[55]() is window +PASS cachedFunctions[55]() is window PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/js/dom/navigator-maxtouchpoints-expected.txt b/LayoutTests/js/dom/navigator-maxtouchpoints-expected.txt index 3d064ef6d54f..872776024511 100644 --- a/LayoutTests/js/dom/navigator-maxtouchpoints-expected.txt +++ b/LayoutTests/js/dom/navigator-maxtouchpoints-expected.txt @@ -3,7 +3,7 @@ Check return value of navigator.maxTouchPoints. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -navigator.maxTouchPoints = 0 +navigator.maxTouchPoints = undefined PASS successfullyParsed is true TEST COMPLETE diff --git a/LayoutTests/js/dom/script-tests/global-function-resolve.js b/LayoutTests/js/dom/script-tests/global-function-resolve.js index 5c89394f5514..315b9742d942 100644 --- a/LayoutTests/js/dom/script-tests/global-function-resolve.js +++ b/LayoutTests/js/dom/script-tests/global-function-resolve.js @@ -30,7 +30,6 @@ var functionNames = [ 'name', 'navigator', 'open', - 'openDatabase', 'opener', 'outerHeight', 'outerWidth', diff --git a/LayoutTests/js/dopey-rope-with-16-bit-propertyname-expected.txt b/LayoutTests/js/dopey-rope-with-16-bit-propertyname-expected.txt index 6f25f197bd59..eb708bc9bc84 100644 --- a/LayoutTests/js/dopey-rope-with-16-bit-propertyname-expected.txt +++ b/LayoutTests/js/dopey-rope-with-16-bit-propertyname-expected.txt @@ -1,4 +1,4 @@ -Test that a 16-bit AtomicString containing only 8-bit characters doesn't confuse the JIT into thinking it's an 8-bit AtomicString. +Test that a 16-bit AtomString containing only 8-bit characters doesn't confuse the JIT into thinking it's an 8-bit AtomString. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". diff --git a/LayoutTests/js/dopey-rope-with-16-bit-propertyname.html b/LayoutTests/js/dopey-rope-with-16-bit-propertyname.html index d94b4b599985..1b2d4f0feb75 100644 --- a/LayoutTests/js/dopey-rope-with-16-bit-propertyname.html +++ b/LayoutTests/js/dopey-rope-with-16-bit-propertyname.html @@ -7,14 +7,14 @@ + + + + + + diff --git a/LayoutTests/js/weakref-eventually-collects-values-expected.txt b/LayoutTests/js/weakref-eventually-collects-values-expected.txt new file mode 100644 index 000000000000..43e5eeedbf1b --- /dev/null +++ b/LayoutTests/js/weakref-eventually-collects-values-expected.txt @@ -0,0 +1,4 @@ +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/js/weakref-eventually-collects-values.html b/LayoutTests/js/weakref-eventually-collects-values.html new file mode 100644 index 000000000000..90dcdaa72e8e --- /dev/null +++ b/LayoutTests/js/weakref-eventually-collects-values.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/LayoutTests/js/weakref-microtasks-dont-collect-expected.txt b/LayoutTests/js/weakref-microtasks-dont-collect-expected.txt new file mode 100644 index 000000000000..43e5eeedbf1b --- /dev/null +++ b/LayoutTests/js/weakref-microtasks-dont-collect-expected.txt @@ -0,0 +1,4 @@ +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/js/weakref-microtasks-dont-collect.html b/LayoutTests/js/weakref-microtasks-dont-collect.html new file mode 100644 index 000000000000..b7b9b9d0078a --- /dev/null +++ b/LayoutTests/js/weakref-microtasks-dont-collect.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/LayoutTests/js/weakref-weakset-consistency-expected.txt b/LayoutTests/js/weakref-weakset-consistency-expected.txt new file mode 100644 index 000000000000..43e5eeedbf1b --- /dev/null +++ b/LayoutTests/js/weakref-weakset-consistency-expected.txt @@ -0,0 +1,4 @@ +PASS successfullyParsed is true + +TEST COMPLETE + diff --git a/LayoutTests/js/weakref-weakset-consistency.html b/LayoutTests/js/weakref-weakset-consistency.html new file mode 100644 index 000000000000..04f2303d755c --- /dev/null +++ b/LayoutTests/js/weakref-weakset-consistency.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/LayoutTests/legacy-animation-engine/compositing/backing/backing-store-attachment-empty-keyframe-expected.txt b/LayoutTests/legacy-animation-engine/compositing/backing/backing-store-attachment-empty-keyframe-expected.txt index e44d70180742..e62e90bb62d2 100644 --- a/LayoutTests/legacy-animation-engine/compositing/backing/backing-store-attachment-empty-keyframe-expected.txt +++ b/LayoutTests/legacy-animation-engine/compositing/backing/backing-store-attachment-empty-keyframe-expected.txt @@ -9,7 +9,6 @@ (backingStoreAttached 1) (children 1 (GraphicsLayer - (offsetFromRenderer width=-501 height=0) (position 9.00 101.00) (bounds 501.00 150.00) (backingStoreAttached 1) diff --git a/LayoutTests/legacy-animation-engine/compositing/transitions/add-remove-transition-expected.html b/LayoutTests/legacy-animation-engine/compositing/transitions/add-remove-transition-expected.html new file mode 100644 index 000000000000..8a3458e4e0b0 --- /dev/null +++ b/LayoutTests/legacy-animation-engine/compositing/transitions/add-remove-transition-expected.html @@ -0,0 +1,21 @@ + + + + + + +

    This box should end up with opacity 1

    +
    +
    + + diff --git a/LayoutTests/legacy-animation-engine/compositing/transitions/add-remove-transition.html b/LayoutTests/legacy-animation-engine/compositing/transitions/add-remove-transition.html new file mode 100644 index 000000000000..e303ef5f157c --- /dev/null +++ b/LayoutTests/legacy-animation-engine/compositing/transitions/add-remove-transition.html @@ -0,0 +1,47 @@ + + + + + + + + +

    This box should end up with opacity 1

    +
    + + diff --git a/LayoutTests/legacy-animation-engine/imported/blink/animations/display-inline-style-adjust-expected.html b/LayoutTests/legacy-animation-engine/imported/blink/animations/display-inline-style-adjust-expected.html deleted file mode 100644 index 6a80d4445cd9..000000000000 --- a/LayoutTests/legacy-animation-engine/imported/blink/animations/display-inline-style-adjust-expected.html +++ /dev/null @@ -1,12 +0,0 @@ - - - -
    - This sentence should span a single line. -
    diff --git a/LayoutTests/legacy-animation-engine/imported/blink/animations/display-inline-style-adjust.html b/LayoutTests/legacy-animation-engine/imported/blink/animations/display-inline-style-adjust.html deleted file mode 100644 index 16a4d0bb76b4..000000000000 --- a/LayoutTests/legacy-animation-engine/imported/blink/animations/display-inline-style-adjust.html +++ /dev/null @@ -1,21 +0,0 @@ - - - -
    - This sentence shoul - d span a single line. -
    diff --git a/LayoutTests/media/content/no-rotation.mp4 b/LayoutTests/media/content/no-rotation.mp4 index f435352e9771..6d2d82ef4ea6 100644 Binary files a/LayoutTests/media/content/no-rotation.mp4 and b/LayoutTests/media/content/no-rotation.mp4 differ diff --git a/LayoutTests/media/media-fragments/TC0004-expected.txt b/LayoutTests/media/media-fragments/TC0004-expected.txt index 3a4977715dcd..2bf497e226fe 100644 --- a/LayoutTests/media/media-fragments/TC0004-expected.txt +++ b/LayoutTests/media/media-fragments/TC0004-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '0') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0005-expected.txt b/LayoutTests/media/media-fragments/TC0005-expected.txt index 27aed6503dd7..2dceadd4768a 100644 --- a/LayoutTests/media/media-fragments/TC0005-expected.txt +++ b/LayoutTests/media/media-fragments/TC0005-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0006-expected.txt b/LayoutTests/media/media-fragments/TC0006-expected.txt index 02eccda725d0..9bae39e5b178 100644 --- a/LayoutTests/media/media-fragments/TC0006-expected.txt +++ b/LayoutTests/media/media-fragments/TC0006-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0011-expected.txt b/LayoutTests/media/media-fragments/TC0011-expected.txt index 2cf805eb4665..dd4aaa9d52ca 100644 --- a/LayoutTests/media/media-fragments/TC0011-expected.txt +++ b/LayoutTests/media/media-fragments/TC0011-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0015-expected.txt b/LayoutTests/media/media-fragments/TC0015-expected.txt index be07bdef3d08..6aecc8d2aa42 100644 --- a/LayoutTests/media/media-fragments/TC0015-expected.txt +++ b/LayoutTests/media/media-fragments/TC0015-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '0') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0017-expected.txt b/LayoutTests/media/media-fragments/TC0017-expected.txt index 524b845f4110..73fb71ecd8a9 100644 --- a/LayoutTests/media/media-fragments/TC0017-expected.txt +++ b/LayoutTests/media/media-fragments/TC0017-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '0') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0024-expected.txt b/LayoutTests/media/media-fragments/TC0024-expected.txt index 57560494b16a..fcddef859af4 100644 --- a/LayoutTests/media/media-fragments/TC0024-expected.txt +++ b/LayoutTests/media/media-fragments/TC0024-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0035-expected.txt b/LayoutTests/media/media-fragments/TC0035-expected.txt index 4a6416bcac47..13adc26473c8 100644 --- a/LayoutTests/media/media-fragments/TC0035-expected.txt +++ b/LayoutTests/media/media-fragments/TC0035-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0036-expected.txt b/LayoutTests/media/media-fragments/TC0036-expected.txt index 27305ef9df66..6c9f5b53e592 100644 --- a/LayoutTests/media/media-fragments/TC0036-expected.txt +++ b/LayoutTests/media/media-fragments/TC0036-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0037-expected.txt b/LayoutTests/media/media-fragments/TC0037-expected.txt index 8da14fb9aa16..fd23363ba256 100644 --- a/LayoutTests/media/media-fragments/TC0037-expected.txt +++ b/LayoutTests/media/media-fragments/TC0037-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0038-expected.txt b/LayoutTests/media/media-fragments/TC0038-expected.txt index 629163755c22..226a64a861eb 100644 --- a/LayoutTests/media/media-fragments/TC0038-expected.txt +++ b/LayoutTests/media/media-fragments/TC0038-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0039-expected.txt b/LayoutTests/media/media-fragments/TC0039-expected.txt index a7f561de4b6c..65a4e7d65bac 100644 --- a/LayoutTests/media/media-fragments/TC0039-expected.txt +++ b/LayoutTests/media/media-fragments/TC0039-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0051-expected.txt b/LayoutTests/media/media-fragments/TC0051-expected.txt index 54dc51622bb4..7dbc0271a61d 100644 --- a/LayoutTests/media/media-fragments/TC0051-expected.txt +++ b/LayoutTests/media/media-fragments/TC0051-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0052-expected.txt b/LayoutTests/media/media-fragments/TC0052-expected.txt index cf537ebac373..1d46ed3c61d7 100644 --- a/LayoutTests/media/media-fragments/TC0052-expected.txt +++ b/LayoutTests/media/media-fragments/TC0052-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0053-expected.txt b/LayoutTests/media/media-fragments/TC0053-expected.txt index 0c02e74eccf3..f793378e5a90 100644 --- a/LayoutTests/media/media-fragments/TC0053-expected.txt +++ b/LayoutTests/media/media-fragments/TC0053-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0054-expected.txt b/LayoutTests/media/media-fragments/TC0054-expected.txt index 33d29028670e..8abd2146c90e 100644 --- a/LayoutTests/media/media-fragments/TC0054-expected.txt +++ b/LayoutTests/media/media-fragments/TC0054-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0055-expected.txt b/LayoutTests/media/media-fragments/TC0055-expected.txt index 8367e8e6a781..f60d88442ecd 100644 --- a/LayoutTests/media/media-fragments/TC0055-expected.txt +++ b/LayoutTests/media/media-fragments/TC0055-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0059-expected.txt b/LayoutTests/media/media-fragments/TC0059-expected.txt index 3611a815dc38..fed7a233fbe8 100644 --- a/LayoutTests/media/media-fragments/TC0059-expected.txt +++ b/LayoutTests/media/media-fragments/TC0059-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0072-expected.txt b/LayoutTests/media/media-fragments/TC0072-expected.txt index 5850017f45b9..520b606f1d4c 100644 --- a/LayoutTests/media/media-fragments/TC0072-expected.txt +++ b/LayoutTests/media/media-fragments/TC0072-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0078-expected.txt b/LayoutTests/media/media-fragments/TC0078-expected.txt index 0d061373a27f..5ed001529cfc 100644 --- a/LayoutTests/media/media-fragments/TC0078-expected.txt +++ b/LayoutTests/media/media-fragments/TC0078-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0079-expected.txt b/LayoutTests/media/media-fragments/TC0079-expected.txt index e34e2ab8a2a6..ffc405d60d28 100644 --- a/LayoutTests/media/media-fragments/TC0079-expected.txt +++ b/LayoutTests/media/media-fragments/TC0079-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0080-expected.txt b/LayoutTests/media/media-fragments/TC0080-expected.txt index 5fc08aa41563..aa05afeda78b 100644 --- a/LayoutTests/media/media-fragments/TC0080-expected.txt +++ b/LayoutTests/media/media-fragments/TC0080-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '0') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0081-expected.txt b/LayoutTests/media/media-fragments/TC0081-expected.txt index c3b69976bc2a..30350f8212e5 100644 --- a/LayoutTests/media/media-fragments/TC0081-expected.txt +++ b/LayoutTests/media/media-fragments/TC0081-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '0') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0085-expected.txt b/LayoutTests/media/media-fragments/TC0085-expected.txt index 2d9fcebf7ff3..e0838a5ae26c 100644 --- a/LayoutTests/media/media-fragments/TC0085-expected.txt +++ b/LayoutTests/media/media-fragments/TC0085-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0086-expected.txt b/LayoutTests/media/media-fragments/TC0086-expected.txt index c32458ab8b26..8259fbca7fa9 100644 --- a/LayoutTests/media/media-fragments/TC0086-expected.txt +++ b/LayoutTests/media/media-fragments/TC0086-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0087-expected.txt b/LayoutTests/media/media-fragments/TC0087-expected.txt index a210c277e84c..3914d2f63d1d 100644 --- a/LayoutTests/media/media-fragments/TC0087-expected.txt +++ b/LayoutTests/media/media-fragments/TC0087-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0088-expected.txt b/LayoutTests/media/media-fragments/TC0088-expected.txt index 059afd1894c4..00f689c199ff 100644 --- a/LayoutTests/media/media-fragments/TC0088-expected.txt +++ b/LayoutTests/media/media-fragments/TC0088-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0089-expected.txt b/LayoutTests/media/media-fragments/TC0089-expected.txt index 89d632ea21f6..05a63763a533 100644 --- a/LayoutTests/media/media-fragments/TC0089-expected.txt +++ b/LayoutTests/media/media-fragments/TC0089-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0090-expected.txt b/LayoutTests/media/media-fragments/TC0090-expected.txt index 3a6e139f67a5..2f0f7059528d 100644 --- a/LayoutTests/media/media-fragments/TC0090-expected.txt +++ b/LayoutTests/media/media-fragments/TC0090-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/TC0091-expected.txt b/LayoutTests/media/media-fragments/TC0091-expected.txt index 3a77edcc1a96..9e71b8f36a71 100644 --- a/LayoutTests/media/media-fragments/TC0091-expected.txt +++ b/LayoutTests/media/media-fragments/TC0091-expected.txt @@ -7,6 +7,6 @@ EVENT(canplaythrough) EXPECTED (video.currentTime == '3') OK RUN(video.play()) EVENT(pause) -EXPECTED (video.currentTime - fragmentEndTime <= '0.5') OK +EXPECTED (video.currentTime - fragmentEndTime <= '0.75') OK END OF TEST diff --git a/LayoutTests/media/media-fragments/media-fragments.js b/LayoutTests/media/media-fragments/media-fragments.js index bc72d8db083b..d7120a53363e 100644 --- a/LayoutTests/media/media-fragments/media-fragments.js +++ b/LayoutTests/media/media-fragments/media-fragments.js @@ -77,7 +77,7 @@ function pause() { - const maximumStopDelta = 0.5; + const maximumStopDelta = 0.75; var delta = Math.abs(video.currentTime - fragmentEndTime).toFixed(2); reportExpected((delta <= maximumStopDelta), ("video.currentTime - fragmentEndTime"), "<=", maximumStopDelta, delta); diff --git a/LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime-expected.txt b/LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime-expected.txt new file mode 100644 index 000000000000..427d974bc4dc --- /dev/null +++ b/LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime-expected.txt @@ -0,0 +1,18 @@ + +RUN(video.src = URL.createObjectURL(source)) +EVENT(sourceopen) +RUN(sourceBuffer = source.addSourceBuffer("video/mock; codecs=mock")) +RUN(sourceBuffer.appendBuffer(initSegment)) +EVENT(updateend) +RUN(internals.setMaximumQueueDepthForTrackID(sourceBuffer, 1, 3)) +RUN(sourceBuffer.appendBuffer(samples)) +EVENT(updateend) +EXPECTED (internals.minimumUpcomingPresentationTimeForTrackID(sourceBuffer, 1) == '1') OK +RUN(video.currentTime = 4) +EVENT(seeked) +EXPECTED (internals.minimumUpcomingPresentationTimeForTrackID(sourceBuffer, 1) == '8') OK +RUN(sourceBuffer.appendBuffer(samples)) +EVENT(updateend) +EXPECTED (internals.minimumUpcomingPresentationTimeForTrackID(sourceBuffer, 1) == '7') OK +END OF TEST + diff --git a/LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime.html b/LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime.html new file mode 100644 index 000000000000..fd3264e134ef --- /dev/null +++ b/LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime.html @@ -0,0 +1,65 @@ + + + + mock-media-source + + + + + + + + diff --git a/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt b/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt index 54a6e483b894..aaa3a756433d 100644 --- a/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt +++ b/LayoutTests/media/media-source/only-bcp47-language-tags-accepted-as-valid-expected.txt @@ -1,48 +1,48 @@ -CONSOLE MESSAGE: line 221: The language 'a' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'a' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'a' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'a' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language '1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'a' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language '1' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language '1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language '1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language '1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language '1a' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language '1a' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language '1a' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language '1a' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language '-a' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language '1a' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language '-a' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language '-a' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language '-a' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'a-' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language '-a' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'a-' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'a-' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'a-' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'a1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'a-' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'a1' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'a1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'a1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'aa1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'a1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'aa1' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'aa1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'aa1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'aaaa' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'aa1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'aaaa' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'aaaa' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'aaaa' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'aaa1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'aaaa' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'aaa1' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'aaa1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'aaa1' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char space' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'aaa1' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char space' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'inv-alid-char space' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char space' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char–longDash' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char space' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char–longDash' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'inv-alid-char–longDash' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char–longDash' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char-Pålska' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char–longDash' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char-Pålska' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'inv-alid-char-Pålska' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char-Pålska' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char-Pålska' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char-' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char-*' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char-' is not a valid BCP 47 language tag. CONSOLE MESSAGE: line 106: The language 'inv-alid-char-' is not a valid BCP 47 language tag. -CONSOLE MESSAGE: line 221: The language 'inv-alid-char-' is not a valid BCP 47 language tag. +CONSOLE MESSAGE: line 222: The language 'inv-alid-char-' is not a valid BCP 47 language tag. Test that only BCP47 language tags are accepted as valid but still reflected. diff --git a/LayoutTests/media/modern-media-controls/media-controller/ios/media-controller-allows-click-over-video-with-no-controls-expected.txt b/LayoutTests/media/modern-media-controls/media-controller/ios/media-controller-allows-click-over-video-with-no-controls-expected.txt new file mode 100644 index 000000000000..7ec4d8f4fd60 --- /dev/null +++ b/LayoutTests/media/modern-media-controls/media-controller/ios/media-controller-allows-click-over-video-with-no-controls-expected.txt @@ -0,0 +1,13 @@ +Testing that a click event is correctly dispatched when tapping over a