Merge branch 'main' into zig-0.17

# Conflicts:
#	src/browser/StyleManager.zig
This commit is contained in:
Adrià Arrufat committed 2026-10-03 16:12:46 +02:00
commit 01a703f7e2
48 files changed
+3917 -3040

No files matched your search

+2503 -2435
View File
File diff suppressed because it is too large. Load diff
+122 -143
View File
@@ -1,7 +1,4 @@
__clang_call_terminate
_ZSt9terminatev
_ZSt13get_terminatev
_ZSt11__terminatePFvvE
_ZSt15get_new_handlerv
__cxa_get_globals
__cxa_get_globals_fast
@@ -83,16 +80,6 @@ _ZNSt10bad_typeidD1Ev
_ZNSt10bad_typeidD0Ev
_ZNKSt10bad_typeid4whatEv
__cxa_pure_virtual
_ZNSt11logic_errorD0Ev
_ZNKSt11logic_error4whatEv
_ZNSt15underflow_errorD2Ev
_ZNSt15underflow_errorD1Ev
_ZNSt14overflow_errorD2Ev
_ZNSt14overflow_errorD1Ev
_ZNSt13runtime_errorD2Ev
_ZNSt13runtime_errorD1Ev
_ZNSt11range_errorD2Ev
_ZNSt11range_errorD1Ev
_ZNSt13runtime_errorD0Ev
_ZNKSt13runtime_error4whatEv
_ZNSt16invalid_argumentD0Ev
@@ -717,7 +704,8 @@ _ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEED0Ev
_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE15__make_mdstringEj
_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE9underflowEv
_ZNSt4__Cr16__throw_bad_castB9sqe240000Ev
_ZTv0_n24_NSt4__Cr19basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev
_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE9pbackfailEi
_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE8overflowEi
_ZNSt4__Cr14basic_ifstreamIcNS_11char_traitsIcEEED1Ev
_ZNSt4__Cr14basic_ifstreamIcNS_11char_traitsIcEEED0Ev
_ZTv0_n24_NSt4__Cr14basic_ifstreamIcNS_11char_traitsIcEEED1Ev
@@ -812,6 +800,7 @@ _ZNSt4__Cr7collateIcED1Ev
_ZNSt4__Cr7collateIcED0Ev
_ZNKSt4__Cr7collateIcE10do_compareEPKcS3_S3_S3_
_ZNKSt4__Cr7collateIcE12do_transformEPKcS3_
_ZNKSt4__Cr7collateIcE7do_hashEPKcS3_
_ZNKSt4__Cr7num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_get_floating_pointIeEES4_S4_S4_RNS_8ios_baseERjRT_
_ZNKSt4__Cr7num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRPv
_ZNSt4__Cr9__num_getIcE19__stage2_float_prepERNS_8ios_baseEPcRcS5_
@@ -835,7 +824,6 @@ _ZNKSt4__Cr7num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4
_ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwb
_ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwl
_ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_put_integralIlEES4_S4_RNS_8ios_baseEwT_
_ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_put_integralIyEES4_S4_RNS_8ios_baseEwT_
_ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwd
_ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_put_floating_pointIdEES4_S4_RNS_8ios_baseEwT_PKc
_ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwe
@@ -959,8 +947,6 @@ _ZNKSt4__Cr20__time_get_c_storageIwE7__weeksEv
_ZNSt4__CrL11init_wweeksEv
_ZNKSt4__Cr20__time_get_c_storageIcE8__monthsEv
_ZNSt4__CrL11init_monthsEv
_ZNSt4__Cr7codecvtIwc11__mbstate_tED2Ev
_ZNSt4__Cr7codecvtIwc11__mbstate_tED1Ev
_ZNSt4__Cr7num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEED0Ev
_ZNSt4__Cr7num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEED0Ev
_ZNSt4__Cr7num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEED0Ev
@@ -1426,6 +1412,7 @@ _ZN2v84base2OS18SignalCodeMovingGCEv
_ZN2v84base2OS22AdjustSchedulingParamsEv
_ZN2v84base2OS11RemapSharedEPvS2_m
_ZN2v84base20SignalSafeMapsParser4NextEv
_ZN2v84base25GetSharedLibraryAddressesEP8_IO_FILE
_ZNSt4__Cr6vectorIN2v84base2OS20SharedLibraryAddressENS_9allocatorIS4_EEE24__emplace_back_slow_pathB9sqn240000IJRA128_KcRmRKmEEEPS4_DpOT_
_ZNSt4__Cr6vectorIN2v84base2OS20SharedLibraryAddressENS_9allocatorIS4_EEE20__throw_length_errorB9sqn240000Ev
_ZZN2v84base12_GLOBAL__N_128KernelSupportsRemapDontUnmapEvENK3$_0clEv
@@ -2627,7 +2614,7 @@ _ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE31NewSharedFunctionInfoForLiter
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE21NewSharedFunctionInfoENS0_17MaybeDirectHandleINS0_6StringEEENS4_INS0_10HeapObjectEEENS0_7BuiltinEiNS_4base11StrongAliasINS0_17AdaptArgumentsTagEbEENS0_12FunctionKindE
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE23CloneSharedFunctionInfoENS0_12DirectHandleINS0_18SharedFunctionInfoEEE
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE28NewSharedFunctionInfoWrapperENS0_12DirectHandleINS0_18SharedFunctionInfoEEE
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE19NewRawOneByteStringEjNS0_14AllocationTypeENS0_14AllocationHintE
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE15NewPreparseDataEii
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE19NewRawTwoByteStringEjNS0_14AllocationTypeENS0_14AllocationHintE
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE13NewConsStringENS0_12DirectHandleINS0_6StringEEES6_ibNS0_14AllocationTypeE
_ZN2v88internal11FactoryBaseINS0_12LocalFactoryEE11SmiToStringENS0_6TaggedINS0_3SmiEEENS0_15NumberCacheModeE
@@ -3558,6 +3545,7 @@ _ZN4absl18container_internal14DestructNonSooERNS0_12CommonFieldsEmmPFvPvS3_EPFvS
_ZN4absl18container_internal24PrepareInsertSmallNonSooERNS0_12CommonFieldsERKNS0_15PolicyFunctionsENS_11FunctionRefIFmmEEE
_ZN4absl18container_internal19GetRefForEmptyClassERNS0_12CommonFieldsE
_ZN4absl18container_internal34ResizeAllocatedTableWithSeedChangeERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEm
_ZN4absl18container_internal12_GLOBAL__N_132ResizeEmptyNonAllocatedTableImplERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEmmb
_ZNSt4__Cr6vectorIN5cppgc14HeapStatistics14PageStatisticsENS_9allocatorIS3_EEE24__emplace_back_slow_pathB9sqn240000IJEEEPS3_DpOT_
_ZNSt4__Cr6vectorIN5cppgc14HeapStatistics14PageStatisticsENS_9allocatorIS3_EEE20__throw_length_errorB9sqn240000Ev
_ZNSt4__Cr34__uninitialized_allocator_relocateB9sqn240000INS_9allocatorIN5cppgc14HeapStatistics14PageStatisticsEEEPS4_EEvRT_T0_S9_S9_
@@ -3864,8 +3852,7 @@ _ZN2v88internal9Assembler5testwENS0_8RegisterENS0_9ImmediateE
_ZN2v88internal9Assembler5testwENS0_7OperandENS0_9ImmediateE
_ZN2v88internal9Assembler5testwENS0_7OperandENS0_8RegisterE
_ZN2v88internal9Assembler5fld_dENS0_7OperandE
_ZN2v88internal9Assembler7popcntlENS0_8RegisterENS0_7OperandE
_ZN2v88internal9Assembler5pauseEv
_ZN2v88internal9Assembler6fstp_dENS0_7OperandE
_ZN2v88internal9Assembler6movupsENS0_11XMMRegisterES2_
_ZN2v88internal9Assembler6movupsENS0_11XMMRegisterENS0_7OperandE
_ZN2v88internal9Assembler6movupsENS0_7OperandENS0_11XMMRegisterE
@@ -4025,7 +4012,6 @@ _ZNSt4__Cr6vectorIN2v88internal13VirtualMemoryENS_9allocatorIS3_EEE12emplace_bac
_ZN2v88internal21DelayedCounterUpdates9AddSampleEMNS0_8CountersEFPNS0_9HistogramEvEi
_ZN2v88internal8Counters27wasm_module_num_code_spacesEv
_ZN2v88internal4wasm17WasmCodeAllocator23AllocateForCodeInRegionEPNS1_12NativeModuleEmNS_4base13AddressRegionE
_ZN2v88internal4wasm12NativeModule12SetWireBytesENS_4base11OwnedVectorIKhEE
_ZNK2v88internal4wasm12NativeModule6LookupEm
_ZN2v88internal4wasm12NativeModuleD2Ev
_ZN2v88internal4wasm12NativeModuleD1Ev
@@ -4040,7 +4026,6 @@ _ZN2v88internal4wasm15WasmCodeManager32EstimateNativeModuleMetaDataSizeEPKNS1_10
_ZN2v88internal4wasm15WasmCodeManager29HasMemoryProtectionKeySupportEv
_ZN2v88internal4wasm15WasmCodeManager15NewNativeModuleENS1_19WasmEnabledFeaturesENS1_20WasmDetectedFeaturesENS1_18CompileTimeImportsEmNSt4__Cr10shared_ptrIKNS1_10WasmModuleEEE
_ZNK2v88internal4wasm12NativeModule14SampleCodeSizeEPNS0_8CountersE
_ZN2v88internal4wasm12NativeModule8FreeCodeENS_4base6VectorIKPNS1_8WasmCodeEEE
_ZNK2v88internal4wasm12NativeModule31GetNumberOfCodeSpacesForTestingEv
_ZN2v88internal4wasm12NativeModule16GetNamesProviderEv
_ZNK2v88internal4wasm15WasmCodeManager10LookupCodeEm
@@ -4073,6 +4058,7 @@ _ZNSt4__Cr6__treeIN2v84base13AddressRegionENS3_16StartAddressLessENS_9allocatorI
_ZNSt4__Cr25__try_key_extraction_implB9sqn240000IN2v84base13AddressRegionENS_4pairINS_15__tree_iteratorIS3_PNS_11__tree_nodeIS3_PvEElEEbEEZNS_6__treeIS3_NS3_16StartAddressLessENS_9allocatorIS3_EEE21__emplace_hint_uniqueB9sqn240000IJS3_EEESB_NS_21__tree_const_iteratorIS3_S9_lEEDpOT_EUlRKS3_OS3_E_ZNSH_IJS3_EEESB_SJ_SM_EUlSP_E_S3_TnNS_9enable_ifIXsr7is_sameIT_u14__remove_constIu20__remove_reference_tIT3_EEEE5valueEiE4typeELi0EEET0_NS_14__priority_tagILm1EEET1_T2_OSU_
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal4wasm12NativeModuleENS_6vectorIPNS4_8WasmCodeENS_9allocatorIS9_EEEEEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_SC_EENS_4hashIS6_EENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SH_SL_SJ_EENSA_ISH_EEED2B9sqn240000Ev
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal4wasm12NativeModuleENS_6vectorIPNS4_8WasmCodeENS_9allocatorIS9_EEEEEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_SC_EENS_4hashIS6_EENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SH_SL_SJ_EENSA_ISH_EEE16__emplace_uniqueB9sqn240000IJRKNS_21piecewise_construct_tENS_5tupleIJRSG_EEENSV_IJEEEEEENSF_INS_15__hash_iteratorIPNS_11__hash_nodeISD_PvEEEEbEEDpOT_ENKUlSW_SU_OSX_OSY_E_clB9sqn240000ESW_SU_S19_S1A_
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal4wasm12NativeModuleENS_6vectorIPNS4_8WasmCodeENS_9allocatorIS9_EEEEEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_SC_EENS_4hashIS6_EENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SH_SL_SJ_EENSA_ISH_EEE11__do_rehashB9sqn240000ILb1EEEvm
_ZN2v88internal12trap_handler19RegisterHandlerDataEmmmPKNS1_23TrappingInstructionDataE
_ZN2v88internal12trap_handler18ReleaseHandlerDataEi
_ZN2v88internal12trap_handler21RegisterCoveredMemoryEmm
@@ -4141,7 +4127,6 @@ _ZN2v88internal4wasm29GetWasmStackEntryWrapperCacheEv
_ZN2v88internal4wasm10WasmEngine13RemoveIsolateEPNS0_7IsolateE
_ZN2v88internal4wasm10WasmEngine26RemoveIsolateFromCurrentGCEPNS0_7IsolateE
_ZN2v88internal4wasm10WasmEngine26PotentiallyFinishCurrentGCEv
_ZN2v88internal4wasm10WasmEngine22NewUnownedNativeModuleENS1_19WasmEnabledFeaturesENS1_20WasmDetectedFeaturesENS1_18CompileTimeImportsENSt4__Cr10shared_ptrIKNS1_10WasmModuleEEEm
_ZN2v88internal4wasm10WasmEngine24UseNativeModuleInIsolateEPNS1_12NativeModuleEPNS0_7IsolateE
_ZN2v88internal4wasm18GetWasmCodeManagerEv
_ZNSt4__Cr6vectorINS_10shared_ptrIN2v88internal4wasm12NativeModuleEEENS_9allocatorIS6_EEE12emplace_backB9sqn240000IJRS6_EEESB_DpOT_
@@ -4247,6 +4232,7 @@ _ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal7IsolateENS_10uniq
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal4wasm12NativeModuleENS4_12_GLOBAL__N_116WeakScriptHandleEEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_S8_EENS_4hashIS6_EENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SD_SH_SF_EENS_9allocatorISD_EEE4findB9sqn240000IS6_EENS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal4wasm10WasmEngine11IsolateInfo18CodeToLogPerScriptEEENS_22__unordered_map_hasherIiNS_4pairIKiS7_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSC_SG_SE_EENS_9allocatorISC_EEE16__emplace_uniqueB9sqn240000IJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSR_IJEEEEEENSA_INS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEEDpOT_ENKUlRSB_SQ_OST_OSU_E_clB9sqn240000ES15_SQ_S16_S17_
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal4wasm10WasmEngine11IsolateInfo18CodeToLogPerScriptEEENS_22__unordered_map_hasherIiNS_4pairIKiS7_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSC_SG_SE_EENS_9allocatorISC_EEE11__do_rehashB9sqn240000ILb1EEEvm
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal4wasm10WasmEngine11IsolateInfo18CodeToLogPerScriptEEENS_22__unordered_map_hasherIiNS_4pairIKiS7_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSC_SG_SE_EENS_9allocatorISC_EEE16__emplace_uniqueB9sqn240000IJRKNS_21piecewise_construct_tENS_5tupleIJRSB_EEENSR_IJEEEEEENSA_INS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEEDpOT_ENKUlSS_SQ_OST_OSU_E_clB9sqn240000ESS_SQ_S15_S16_
_ZNSt4__Cr12__hash_tableIPN2v88internal4wasm8WasmCodeENS_4hashIS5_EENS_8equal_toIS5_EENS_9allocatorIS5_EEE6removeB9sqn240000ENS_21__hash_const_iteratorIPNS_11__hash_nodeIS5_PvEEEE
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal4wasm12NativeModuleENS_10unique_ptrINS4_10WasmEngine16NativeModuleInfoENS_14default_deleteIS9_EEEEEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_SC_EENS_4hashIS6_EENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SH_SL_SJ_EENS_9allocatorISH_EEE6removeB9sqn240000ENS_21__hash_const_iteratorIPNS_11__hash_nodeISD_PvEEEE
_ZNSt4__Cr12__hash_tableIPN2v88internal4wasm8WasmCodeENS_4hashIS5_EENS_8equal_toIS5_EENS_9allocatorIS5_EEE4findB9sqn240000IS5_EENS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEERKT_
@@ -4341,6 +4327,7 @@ _ZN2v88internal15CodeEventLoggerD1Ev
_ZN2v88internal15CodeEventLoggerD0Ev
_ZN2v88internal15CodeEventLogger15CodeCreateEventENS0_16LogEventListener7CodeTagENS0_12DirectHandleINS0_12AbstractCodeEEEPKc
_ZN2v88internal15CodeEventLogger15CodeCreateEventENS0_16LogEventListener7CodeTagENS0_12DirectHandleINS0_12AbstractCodeEEENS4_INS0_4NameEEE
_ZN2v88internal15CodeEventLogger10NameBuffer10AppendNameENS0_6TaggedINS0_4NameEEE
_ZN2v88internal12V8FileLogger20UncheckedStringEventEPKcS3_
_ZN2v88internal8Profiler3RunEv
_ZN2v88internal12V8FileLogger9TickEventEPNS0_10TickSampleEb
@@ -4430,7 +4417,6 @@ _ZN2v88internal6String11WriteToFlatItEEvNS0_6TaggedIS1_EEPT_jjRKNS0_31SharedStri
_ZN2v88internal6String11WriteToFlatIhEEvNS0_6TaggedIS1_EEPT_jjRKNS0_31SharedStringAccessGuardIfNeededE
_ZN2v88internal6String12WriteToFlat2IhEEvPT_NS0_6TaggedINS0_10ConsStringEEEjjRKNS0_31SharedStringAccessGuardIfNeededERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELSC_2EEEE
_ZN2v88internal6String12WriteToFlat2ItEEvPT_NS0_6TaggedINS0_10ConsStringEEEjjRKNS0_31SharedStringAccessGuardIfNeededERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELSC_2EEEE
_ZN2v88internal6String9PrintUC16EPNS0_12StringStreamEii
_ZN2v88internal6String9PrintUC16ERNSt4__Cr13basic_ostreamIcNS2_11char_traitsIcEEEEii
_ZN2v88internal6String12ToArrayIndexEm
_ZN2v88internal6String18SlowGetFlatContentERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELS3_2EEEERKNS0_31SharedStringAccessGuardIfNeededE
@@ -4479,7 +4465,7 @@ _ZNK2v88internal21ExternalTwoByteString8GetCharsEv
_ZN2v88internal6String9VisitFlatINS0_21StringCharacterStreamEEENS0_6TaggedINS0_10ConsStringEEEPT_NS4_IS1_EEjRKNS0_31SharedStringAccessGuardIfNeededE
_ZN2v88internal11RelocatableD0Ev
_ZN2v88internal11Relocatable21PostGarbageCollectionEv
_ZN2v88internal12StringSearchIttE13InitialSearchEPS2_NS_4base6VectorIKtEEi
_ZN2v84base11SmallVectorIiLm32ENSt4__Cr9allocatorIiEEE11FreeStorageEv
_ZN2v88internal12StringSearchIttE24BoyerMooreHorspoolSearchEPS2_NS_4base6VectorIKtEEi
_ZN2v88internal12StringSearchIttE23PopulateBoyerMooreTableEv
_ZN2v88internal12StringSearchIttE16BoyerMooreSearchEPS2_NS_4base6VectorIKtEEi
@@ -4857,7 +4843,7 @@ _ZN2v88internal24UnreachableObjectsFilter14MarkingVisitorD2Ev
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitorD0Ev
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotES6_
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotES6_
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal8BasePageENS_10unique_ptrINS_13unordered_setINS3_6TaggedINS3_10HeapObjectEEENS3_6Object6HasherENS_8equal_toISA_EENS_9allocatorISA_EEEENS_14default_deleteISH_EEEEEENS_22__unordered_map_hasherIS5_NS_4pairIKS5_SK_EENS2_4base4hashIS5_EENSD_IS5_EEEENS_21__unordered_map_equalIS5_SP_ST_SS_EENSF_ISP_EEE11__do_rehashB9sqn240000ILb1EEEvm
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor29VisitInstructionStreamPointerENS0_6TaggedINS0_4CodeEEENS0_27OffHeapCompressedObjectSlotINS0_29ExternalCodeCompressionSchemeEEE
_ZNSt4__Cr12__destroy_atB9sqn240000INS_4pairIKPN2v88internal8BasePageENS_10unique_ptrINS_13unordered_setINS3_6TaggedINS3_10HeapObjectEEENS3_6Object6HasherENS_8equal_toISB_EENS_9allocatorISB_EEEENS_14default_deleteISI_EEEEEEEEvPT_
_ZZNSt4__Cr12__hash_tableIN2v88internal6TaggedINS2_10HeapObjectEEENS2_6Object6HasherENS_8equal_toIS5_EENS_9allocatorIS5_EEE16__emplace_uniqueB9sqn240000IJRKS5_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEEDpOT_ENKUlSF_SF_E_clB9sqn240000ESF_SF_
_ZNSt4__Cr12__hash_tableIN2v88internal6TaggedINS2_10HeapObjectEEENS2_6Object6HasherENS_8equal_toIS5_EENS_9allocatorIS5_EEE11__do_rehashB9sqn240000ILb1EEEvm
@@ -4961,6 +4947,7 @@ _ZN2v88internal23FixedWeakBodyDescriptorILi4ELi8ELi8EE11IterateBodyINS0_12_GLOBA
_ZN2v88internal11CodeWrapper14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_
_ZN2v88internal24FixedRangeBodyDescriptorILi12ELi20EE11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_
_ZN2v88internal24FixedRangeBodyDescriptorILi12ELi16EE11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_
_ZN2v88internal25SuffixRangeBodyDescriptorILi8EE11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_
_ZN2v88internal12IrRegExpData14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_
_ZN2v88internal10RegExpData14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_
_ZN2v88internal14WasmImportData14BodyDescriptor11IterateBodyINS0_12_GLOBAL__N_137PromotedPageRecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS6_INS0_10HeapObjectEEEiPT_
@@ -5222,6 +5209,8 @@ _ZN2v84base30EmulatedVirtualAddressSubspaceC2EPNS_19VirtualAddressSpaceEmmm
_ZN2v84base30EmulatedVirtualAddressSubspaceC1EPNS_19VirtualAddressSpaceEmmm
_ZN2v84base30EmulatedVirtualAddressSubspaceD2Ev
_ZN2v84base30EmulatedVirtualAddressSubspaceD1Ev
_ZN2v84base30EmulatedVirtualAddressSubspaceD0Ev
_ZN2v84base30EmulatedVirtualAddressSubspace13SetRandomSeedEl
_ZNSt4__Cr31__partition_with_equals_on_leftB9sqe240000INS_17_ClassicAlgPolicyEPdRNS_6ranges4lessEEET0_S6_S6_T1_
_ZNSt4__Cr18__bitset_partitionB9sqe240000INS_17_ClassicAlgPolicyEPdNS_6ranges4lessEEENS_4pairIT0_bEES6_S6_T1_
_ZNSt4__Cr27__insertion_sort_incompleteB9sqe240000INS_17_ClassicAlgPolicyENS_6ranges4lessEPdEEbT1_S5_T0_
@@ -5261,7 +5250,6 @@ _ZNK2v88internal29OptimizingCompileTaskExecutor11CompileTask17GetMaxConcurrencyE
_ZN4heap4base5Stack24SetMarkerAndCallbackImplIZN2v88internal9LocalHeap28ExecuteMainThreadWhileParkedIZNS4_27OptimizingCompileDispatcher28WaitUntilCompilationJobsDoneEvE3$_0EEvT_EUlvE_EEvPS1_PvPKv
_ZNSt4__Cr5dequeIPN2v88internal22TurbofanCompilationJobENS_9allocatorIS4_EEE5eraseB9sqn240000ENS_16__deque_iteratorIS4_PKS4_RS9_PKSA_lLl0EEESE_
_ZNSt4__Cr27__for_each_segment_backwardB9sqn240000INS_16__deque_iteratorIPN2v88internal22TurbofanCompilationJobEPS5_RS5_PS6_lLl0EEEZNKS_20__move_backward_implINS_17_ClassicAlgPolicyEEclB9sqn240000IS9_S9_TnNS_9enable_ifIX25__is_segmented_iterator_vIT_EEiE4typeELi0EEENS_15__in_out_resultISF_T0_EESF_SF_SJ_EUlS6_S6_E_EEvSF_SF_SJ_
_ZNSt4__Cr14__split_bufferIPPN2v88internal22TurbofanCompilationJobENS_9allocatorIS5_EENS_29__split_buffer_pointer_layoutEE13emplace_frontB9sqn240000IJS5_EEEvDpOT_
_ZNSt4__Cr14__split_bufferIPPN2v88internal22TurbofanCompilationJobENS_9allocatorIS5_EENS_29__split_buffer_pointer_layoutEE13emplace_frontB9sqn240000IJRS5_EEEvDpOT_
_ZN2v88internal8Compiler21GetSharedFunctionInfoINS0_7IsolateEEENS0_12DirectHandleINS0_18SharedFunctionInfoEEEPNS0_15FunctionLiteralENS4_INS0_6ScriptEEEPT_
_ZN2v88internal8Compiler21GetSharedFunctionInfoINS0_12LocalIsolateEEENS0_12DirectHandleINS0_18SharedFunctionInfoEEEPNS0_15FunctionLiteralENS4_INS0_6ScriptEEEPT_
@@ -5327,6 +5315,7 @@ _ZN2v88internal12_GLOBAL__N_123ScriptCompileTimerScopeC2EPNS0_7IsolateENS_14Scri
_ZN2v88internal12_GLOBAL__N_123ScriptCompileTimerScopeD2Ev
_ZN2v88internal8Compiler38GetSharedFunctionInfoForStreamedScriptEPNS0_7IsolateENS0_6HandleINS0_6StringEEERKNS0_13ScriptDetailsEPNS0_19ScriptStreamingDataEPNS0_15IsCompiledScopeEPNS_14ScriptCompiler18CompilationDetailsE
_ZN2v88internal8Compiler19CompileOptimizedOSREPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEENS0_14BytecodeOffsetENS0_15ConcurrencyModeENS0_8CodeKindE
_ZN2v88internal8Compiler29DisposeTurbofanCompilationJobEPNS0_7IsolateEPNS0_22TurbofanCompilationJobE
_ZN2v88internal8Compiler28FinalizeMaglevCompilationJobEPNS0_6maglev20MaglevCompilationJobEPNS0_7IsolateE
_ZN2v88internal12_GLOBAL__N_125AbortMaglevCompilationJobEPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEENS0_14BytecodeOffsetENS0_13BailoutReasonE
_ZN2v88internal8Compiler17PostInstantiationEPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEEPNS0_15IsCompiledScopeE
@@ -5343,6 +5332,7 @@ _ZN2v88internal7ScannerD2Ev
_ZN2v88internal10ParserBaseINS0_6ParserEED2Ev
_ZN2v84base11SmallVectorINS_8internal16FuncNameInferrer4NameELm8ENSt4__Cr9allocatorIS4_EEE11FreeStorageEv
_ZNKSt4__Cr19__hash_map_iteratorINS_15__hash_iteratorIPNS_11__hash_nodeINS_17__hash_value_typeIiN2v88internal6TaggedINS5_9ScopeInfoEEEEEPvEEEEEptB9sqn240000Ev
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal6TaggedINS3_9ScopeInfoEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS6_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSB_SF_SD_EENS_9allocatorISB_EEE16__emplace_uniqueB9sqn240000IJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSQ_IJEEEEEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SP_OSS_OST_E_clB9sqn240000ES14_SP_S15_S16_
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal6HandleINS3_9ScopeInfoEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS6_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSB_SF_SD_EENS_9allocatorISB_EEE16__emplace_uniqueB9sqn240000IJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSQ_IJEEEEEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SP_OSS_OST_E_clB9sqn240000ES14_SP_S15_S16_
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal6HandleINS3_9ScopeInfoEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS6_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSB_SF_SD_EENS_9allocatorISB_EEE11__do_rehashB9sqn240000ILb1EEEvm
_ZN2v88internal28ConstantPoolPointerForwarder15VerifyScopeInfoENS0_6TaggedINS0_9ScopeInfoEEES4_
@@ -5877,7 +5867,7 @@ _ZN4heap4base8WorklistIN2v88internal6TaggedINS3_18SharedFunctionInfoEEELt64EE5Lo
_ZNK4heap4base8WorklistIN2v88internal6TaggedINS3_18SharedFunctionInfoEEELt64EE5Local10NewSegmentEv
_ZN2v88internal18SharedFunctionInfo14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal25SmallOrderedHashTableImplINS0_19SmallOrderedHashMapEE14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS7_INS0_10HeapObjectEEEiPT_
_ZN2v88internal33UncompiledDataWithoutPreparseData14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal25SmallOrderedHashTableImplINS0_19SmallOrderedHashSetEE14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS7_INS0_10HeapObjectEEEiPT_
_ZN2v88internal36UncompiledDataWithPreparseDataAndJob14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal40UncompiledDataWithoutPreparseDataWithJob14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal19ProtectedFixedArray14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
@@ -5976,7 +5966,6 @@ _ZN2v88internal13JSArrayBuffer14BodyDescriptor11IterateBodyINS0_25RecordMigrated
_ZN2v88internal27JSDataViewOrRabGsabDataView14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal6JSDate14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal18BodyDescriptorBase23IterateJSObjectBodyImplINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS4_INS0_10HeapObjectEEEiiPT_
_ZN2v88internal12IrRegExpData14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal10RegExpData14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal14WasmImportData14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal20WasmCapiFunctionData14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
@@ -6246,6 +6235,7 @@ _ZN2v88internal6Object15ConvertToStringINS0_6HandleEQsr3stdE16is_convertible_vIT
_ZN2v88internal6Object14ConvertToIndexINS0_12DirectHandleEQsr3stdE16is_convertible_vIT_IS1_ENS3_IS1_EEEEENS4_INS0_5UnionIJNS0_3SmiENS0_10HeapNumberEEEEE9MaybeTypeEPNS0_7IsolateES5_NS0_15MessageTemplateE
_ZN2v88internal6Object14ConvertToIndexINS0_6HandleEQsr3stdE16is_convertible_vIT_IS1_ENS0_12DirectHandleIS1_EEEEENS4_INS0_5UnionIJNS0_3SmiENS0_10HeapNumberEEEEE9MaybeTypeEPNS0_7IsolateES5_NS0_15MessageTemplateE
_ZN2v88internal6Object12BooleanValueINS0_7IsolateEEEbNS0_6TaggedIS1_EEPT_
_ZN2v88internal6Object12BooleanValueINS0_12LocalIsolateEEEbNS0_6TaggedIS1_EEPT_
_ZN2v88internal10HeapObject16RehashBasedOnMapINS0_12LocalIsolateEEEvPT_
_ZN2v88internal6Object9ShareSlowINS0_12DirectHandleEQsr3stdE16is_convertible_vIT_IS1_ENS3_IS1_EEEEENS5_9MaybeTypeEPNS0_7IsolateES4_INS0_10HeapObjectEENS0_11ShouldThrowE
_ZN2v88internal6Object9ShareSlowINS0_6HandleEQsr3stdE16is_convertible_vIT_IS1_ENS0_12DirectHandleIS1_EEEEENS5_9MaybeTypeEPNS0_7IsolateES4_INS0_10HeapObjectEENS0_11ShouldThrowE
@@ -6688,6 +6678,7 @@ _ZN2v88internal14JSGlobalObject22InvalidatePropertyCellENS0_12DirectHandleIS1_EE
_ZN2v88internal14JSGlobalObject27HasRestrictedGlobalPropertyEPNS0_7IsolateENS0_12DirectHandleIS1_EENS4_INS0_4NameEEE
_ZN2v88internal6JSDate3NewEPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEENS4_INS0_10JSReceiverEEEd
_ZN2v88internal6JSDate8SetValueEPNS0_7IsolateEd
_ZN2v88internal6JSDate11SetNanValueEv
_ZN2v88internal25PropertyCallbackArguments21CallIndexedDescriptorEPNS0_7IsolateENS0_12DirectHandleINS0_15InterceptorInfoEEEj
_ZN2v88internal25PropertyCallbackArguments19CallNamedDescriptorEPNS0_7IsolateENS0_12DirectHandleINS0_15InterceptorInfoEEENS4_INS0_4NameEEE
_ZN2v88internal25PropertyCallbackArguments17CallIndexedGetterEPNS0_7IsolateENS0_12DirectHandleINS0_15InterceptorInfoEEEj
@@ -6717,7 +6708,6 @@ _ZN2v88internal9ScopeInfo6CreateINS0_7IsolateEEENS0_6HandleIS1_EEPT_PNS0_4ZoneEP
_ZN2v88internal20SourceTextModuleInfo3NewINS0_7IsolateEEENS0_12DirectHandleIS1_EEPT_PNS0_4ZoneEPNS0_26SourceTextModuleDescriptorE
_ZN2v88internal20NameToIndexHashTable3AddINS0_7IsolateEEENS0_6HandleIS1_EEPT_S5_NS0_12DirectHandleINS0_4NameEEEi
_ZN2v88internal9ScopeInfo6CreateINS0_12LocalIsolateEEENS0_6HandleIS1_EEPT_PNS0_4ZoneEPNS0_5ScopeENS0_17MaybeDirectHandleIS1_EENS0_12FunctionKindE
_ZN2v88internal12_GLOBAL__N_126NameToIndexHashTableEqualsENS0_6TaggedINS0_20NameToIndexHashTableEEES4_
_ZN2v88internal9ScopeInfo18CreateForWithScopeEPNS0_7IsolateENS0_17MaybeDirectHandleIS1_EE
_ZNK2v88internal9ScopeInfo7IsEmptyEv
_ZNK2v88internal9ScopeInfo10scope_typeEv
@@ -7307,6 +7297,14 @@ _ZN2v88internal10WasmStruct14BodyDescriptor11IterateBodyINS0_24ConcurrentMarking
_ZN2v88internal13JSArrayBuffer14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal59JSAPIObjectWithEmbedderSlotsOrJSSpecialObjectBodyDescriptor41IterateJSAPIObjectWithEmbedderSlotsHeaderINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS4_INS0_10HeapObjectEEEiPT_
_ZN2v88internal18BodyDescriptorBase23IterateJSObjectBodyImplINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS4_INS0_10HeapObjectEEEiiPT_
_ZNK2v88internal18MarkingVisitorBaseINS0_24ConcurrentMarkingVisitorEE23ShouldFlushBaselineCodeENS0_6TaggedINS0_10JSFunctionEEE
_ZN2v88internal10JSFunction14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal8JSRegExp14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal26JSSynchronizationPrimitive14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal12JSTypedArray14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal16WasmGlobalObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal18WasmInstanceObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal15WasmTableObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal4Code14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal23ProtectedWeakFixedArray14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
_ZN2v88internal14AtomRegExpData14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
@@ -7491,6 +7489,7 @@ _ZN2v88internal16WasmModuleObject3NewEPNS0_7IsolateENSt4__Cr10shared_ptrINS0_4wa
_ZN2v88internal16WasmModuleObject32ExtractUtf8StringFromModuleBytesEPNS0_7IsolateENS_4base6VectorIKhEENS0_4wasm12WireBytesRefENS0_17InternalizeStringENS4_11StrongAliasINS0_13SharedFlagTagEbEE
_ZN2v88internal16WasmModuleObject19GetModuleNameOrNullEPNS0_7IsolateENS0_12DirectHandleIS1_EE
_ZN2v88internal16WasmModuleObject21GetFunctionNameOrNullEPNS0_7IsolateENS0_12DirectHandleIS1_EEj
_ZN2v88internal16WasmModuleObject18GetRawFunctionNameEi
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiNS_10shared_ptrIN2v88internal4wasm17WasmWrapperHandleEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS7_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSC_SG_SE_EENS_9allocatorISC_EEE13__move_assignB9sqn240000ERSM_NS_17integral_constantIbLb1EEE
_ZN2v88internal6detail10DestructorINS0_12BackingStoreEEEvPv
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiNS_10shared_ptrIN2v88internal4wasm17WasmWrapperHandleEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS7_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSC_SG_SE_EENS_9allocatorISC_EEE16__emplace_uniqueB9sqn240000IJRiS7_EEENSA_INS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEEDpOT_ENKUlRSB_SO_OS7_E_clB9sqn240000ESZ_SO_S10_
@@ -7506,6 +7505,17 @@ _ZNSt4__Cr6vectorIN2v88internal6HandleINS2_5UnionIJNS2_8JSObjectENS2_21CppHeapEx
_ZN2v88internal6BigInt4ZeroINS0_7IsolateEEENS0_6HandleIS1_EEPT_NS0_14AllocationTypeE
_ZN2v88internal6BigInt4ZeroINS0_12LocalIsolateEEENS0_6HandleIS1_EEPT_NS0_14AllocationTypeE
_ZN2v88internal6BigInt10FromObjectINS0_12DirectHandleEQsr3stdE16is_convertible_vIT_INS0_6ObjectEENS3_IS5_EEEEENS4_IS1_E9MaybeTypeEPNS0_7IsolateES6_
_ZN2v88internal45MutableBigInt_BitwiseXorNegNegAndCanonicalizeEmmm
_ZN2v88internal45MutableBigInt_BitwiseXorPosNegAndCanonicalizeEmmm
_ZN2v88internal38MutableBigInt_LeftShiftAndCanonicalizeEmml
_ZN2v88internal22RightShiftResultLengthEmjl
_ZN2v88internal39MutableBigInt_RightShiftAndCanonicalizeEmmlj
_ZN2v86bigint18MultiplySchoolbookENS0_8RWDigitsENS0_6DigitsES2_
_ZN2v88internal13BigIntLiteralINS0_7IsolateEEENS0_11MaybeHandleINS0_6BigIntEEEPT_PKc
_ZN2v88internal20StringToBigIntHelperINS0_7IsolateEE9GetResultEv
_ZN2v88internal20StringToBigIntHelperINS0_7IsolateEED2Ev
_ZN2v88internal13BigIntLiteralINS0_12LocalIsolateEEENS0_11MaybeHandleINS0_6BigIntEEEPT_PKc
_ZN2v88internal20StringToBigIntHelperINS0_12LocalIsolateEE9GetResultEv
_ZN2v88internal20StringToBigIntHelperINS0_12LocalIsolateEED2Ev
_ZN2v88internal18ConvertUpTo9DigitsEjPc
_ZN2v88internal17StringToIntHelper8ParseIntEv
@@ -7820,7 +7830,7 @@ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE13ReadNewObjectINS0_21SlotAcce
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE11ReadBackrefINS0_21SlotAccessorForHandleIS2_EEEEihT_
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE19ReadReadOnlyHeapRefINS0_21SlotAccessorForHandleIS2_EEEEihT_
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE13ReadRootArrayINS0_21SlotAccessorForHandleIS2_EEEEihT_
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE25ReadSharedHeapObjectCacheINS0_24SlotAccessorForRootSlotsEEEihT_
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE22ReadStartupObjectCacheINS0_21SlotAccessorForHandleIS2_EEEEihT_
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE14ReadNewMetaMapINS0_24SlotAccessorForRootSlotsEEEihT_
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE25ReadExtendedMapBitfieldExINS0_24SlotAccessorForRootSlotsEEEihT_
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE21ReadExternalReferenceINS0_24SlotAccessorForRootSlotsEEEihT_
@@ -7926,7 +7936,6 @@ _ZN2v88internal13JSArrayBuffer5SetupENS_4base11StrongAliasINS0_13SharedFlagTagEb
_ZN2v88internal13JSArrayBuffer15CreateExtensionEPNS0_7IsolateENSt4__Cr10shared_ptrINS0_12BackingStoreEEE
_ZN2v88internal13JSArrayBuffer6DetachENS0_12DirectHandleIS1_EEbNS2_INS0_6ObjectEEE
_ZN2v88internal13JSArrayBuffer14DetachInternalENS0_12DirectHandleIS1_EEbPNS0_7IsolateE
_ZN2v88internal12JSTypedArray17DefineOwnPropertyEPNS0_7IsolateENS0_12DirectHandleIS1_EENS4_INS0_6ObjectEEEPNS0_18PropertyDescriptorENS_5MaybeINS0_11ShouldThrowEEE
_ZNK2v88internal12JSTypedArray22GetLengthOrOutOfBoundsERb
_ZNK2v88internal12JSTypedArray4typeEv
_ZNK2v88internal12JSTypedArray12element_sizeEv
@@ -8111,6 +8120,7 @@ _ZN2v88internal19TransitionsAccessor19NumberOfTransitionsEv
_ZN2v88internal19TransitionsAccessor23HasPrototypeTransitionsEv
_ZN2v88internal19TransitionsAccessor28EnsureHasFullTransitionArrayEPNS0_7IsolateENS0_12DirectHandleINS0_3MapEEE
_ZN2v88internal19TransitionsAccessor30TraverseTransitionTreeInternalERKNSt4__Cr8functionIFvNS0_6TaggedINS0_3MapEEEEEEPNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELSC_2EEEE
_ZN2v88internal19TransitionsAccessor29HasIntegrityLevelTransitionToENS0_6TaggedINS0_3MapEEEPNS2_INS0_6SymbolEEEPNS0_18PropertyAttributesE
_ZN2v88internal13DependentCode14InsertWeakCodeEPNS0_7IsolateENS0_6HandleIS1_EENS_4base5FlagsINS1_15DependencyGroupEjjEENS0_12DirectHandleINS0_4CodeEEE
_ZN2v88internal13DependentCode25MarkCodeForDeoptimizationEPNS0_7IsolateENS_4base5FlagsINS1_15DependencyGroupEjjEE
_ZN2v88internal13DependentCode26DeoptimizeDependencyGroupsEPNS0_7IsolateENS_4base5FlagsINS1_15DependencyGroupEjjEE
@@ -8818,6 +8828,7 @@ _ZN2v88internal5Debug5BreakEPNS0_15JavaScriptFrameENS0_12DirectHandleINS0_10JSFu
_ZN2v88internal5Debug15EnsureBreakInfoENS0_6HandleINS0_18SharedFunctionInfoEEE
_ZN2v88internal5Debug32PrepareFunctionForDebugExecutionENS0_12DirectHandleINS0_18SharedFunctionInfoEEE
_ZN2v88internal5Debug15TryGetDebugInfoENS0_6TaggedINS0_18SharedFunctionInfoEEE
_ZN2v88internal5Debug24IsBreakOnInstrumentationENS0_6HandleINS0_9DebugInfoEEERKNS0_13BreakLocationE
_ZN2v88internal5Debug22SetBreakPointForScriptENS0_6HandleINS0_6ScriptEEENS0_12DirectHandleINS0_6StringEEEPiS8_
_ZN2v88internal5Debug31RecordWasmScriptWithBreakpointsENS0_12DirectHandleINS0_6ScriptEEE
_ZN2v88internal5Debug35FindInnermostContainingFunctionInfoENS0_6HandleINS0_6ScriptEEEi
@@ -8831,17 +8842,6 @@ _ZN2v88internal5Debug41SetInstrumentationBreakpointForWasmScriptENS0_12DirectHan
_ZN2v88internal5Debug29RemoveBreakpointForWasmScriptENS0_12DirectHandleINS0_6ScriptEEEi
_ZN2v88internal5Debug18ClearAllDebugInfosERKNSt4__Cr8functionIFvNS0_6HandleINS0_9DebugInfoEEEEEE
_ZN2v88internal5Debug16FloodWithOneShotENS0_6HandleINS0_18SharedFunctionInfoEEEb
_ZN2v88internal5Debug12IsBlackboxedENS0_12DirectHandleINS0_18SharedFunctionInfoEEE
_ZN2v88internal5Debug22ChangeBreakOnExceptionENS0_18ExceptionBreakTypeEb
_ZN2v88internal5Debug18IsBreakOnExceptionENS0_18ExceptionBreakTypeE
_ZN2v88internal5Debug26SetBreakOnNextFunctionCallEv
_ZN2v88internal5Debug28ClearBreakOnNextFunctionCallEv
_ZN2v88internal5Debug13PrepareStepInENS0_12DirectHandleINS0_10JSFunctionEEE
_ZN2v88internal5Debug31PrepareStepInSuspendedGeneratorEv
_ZN2v88internal5Debug18PrepareStepOnThrowEv
_ZN2v88internal5Debug23GetSourceBreakLocationsEPNS0_7IsolateENS0_12DirectHandleINS0_18SharedFunctionInfoEEE
_ZN2v88internal5Debug19DiscardBaselineCodeENS0_6TaggedINS0_18SharedFunctionInfoEEE
_ZN2v88internal5Debug12BreakAtEntryENS0_6TaggedINS0_18SharedFunctionInfoEEE
_ZN2v88internal5Debug7OnThrowENS0_12DirectHandleINS0_6ObjectEEEb
_ZN2v88internal5Debug11OnExceptionENS0_12DirectHandleINS0_6ObjectEEENS0_17MaybeDirectHandleINS0_9JSPromiseEEENS_5debug13ExceptionTypeEb
_ZN2v88internal5Debug15OnPromiseRejectENS0_12DirectHandleINS0_6ObjectEEES4_
@@ -9053,6 +9053,7 @@ _ZNK2v88internal9WasmFrame25GetInnermostFunctionIndexEv
_ZNK2v88internal9WasmFrame14is_inspectableEv
_ZNK2v88internal9WasmFrame7contextEv
_ZNK2v88internal9WasmFrame9SummarizeENS_4base11StrongAliasINS0_18AllowAllocationTagEbEE
_ZN2v88internal9WasmFrame29LookupExceptionHandlerInTableEv
_ZN2v88internal12_GLOBAL__N_119PrintFunctionSourceEPNS0_12StringStreamENS0_6TaggedINS0_18SharedFunctionInfoEEE
_ZNK2v88internal10EntryFrame7IterateEPNS0_11RootVisitorE
_ZNK2v88internal15JavaScriptFrame7IterateEPNS0_11RootVisitorE
@@ -9118,6 +9119,8 @@ _ZN2v84base16LazyInstanceImplINS_8internal7ICStatsENS0_32StaticallyAllocatedInst
_ZN2v84base11SmallVectorINS_8internal15TranslatedFrameELm3ENSt4__Cr9allocatorIS3_EEE11FreeStorageEv
_ZN2v84base11SmallVectorINS_8internal15TranslatedValueELm8ENSt4__Cr9allocatorIS3_EEE11FreeStorageEv
_ZN2v88internal4Code30GetBaselinePCForBytecodeOffsetEiNS1_20BytecodeToPCPositionENS0_6TaggedINS0_13BytecodeArrayEEE
_ZN2v84base11SmallVectorINS_8internal12FrameSummaryELm3ENSt4__Cr9allocatorIS3_EEE18grow_and_push_backES3_
_ZN2v84base11SmallVectorINS_8internal12FrameSummaryELm3ENSt4__Cr9allocatorIS3_EEE4GrowEv
_ZN2v88internal24DeoptTranslationIterator10NextOpcodeEv
_ZN2v88internal24DeoptTranslationIterator16EnterBeginOpcodeEv
_ZN2v88internal24DeoptTranslationIterator15SeekNextJSFrameEv
@@ -9158,8 +9161,6 @@ _ZN2v88internal12AbstractCode10osr_offsetEv
_ZNK2v88internal13BytecodeArray14SourcePositionEi
_ZNK2v88internal13BytecodeArray23SourceStatementPositionEi
_ZN2v88internal13BytecodeArray9PrintJsonERNSt4__Cr13basic_ostreamIcNS2_11char_traitsIcEEEE
_ZN2v84base11JSONEscapedC2INS_8internal6TaggedINS3_6ObjectEEEEERKT_
_ZN2v88internal13BytecodeArray11DisassembleERNSt4__Cr13basic_ostreamIcNS2_11char_traitsIcEEEE
_ZN2v88internal13BytecodeArray11DisassembleENS0_6HandleIS1_EERNSt4__Cr13basic_ostreamIcNS4_11char_traitsIcEEEE
_ZN2v88internal13BytecodeArray15CopyBytecodesToENS0_6TaggedIS1_EE
_ZN2v88internal11interpreter21BytecodeArrayIterator24GetEmbeddedOperationHintINS0_24CompareOperationFeedbackEEENS1_26EmbeddedFeedbackHintTraitsIT_E4HintEv
@@ -9239,8 +9240,6 @@ _ZN2v88internallsERNSt4__Cr13basic_ostreamIcNS1_11char_traitsIcEEEENS0_7Runtime1
_ZN2v88internal12_GLOBAL__N_127IntrinsicFunctionIdentifier5MatchEPvS3_
_ZN2v84base19TemplateHashMapImplIPvS2_NS0_26HashEqualityThenKeyMatcherIS2_PFbS2_S2_EEENS0_23DefaultAllocationPolicyEE9InsertNewERKS2_j
_ZN2v84base19TemplateHashMapImplIPvS2_NS0_26HashEqualityThenKeyMatcherIS2_PFbS2_S2_EEENS0_23DefaultAllocationPolicyEE6ResizeEv
_ZZNSt4__Cr6vectorIN2v88internal13CoverageBlockENS_9allocatorIS3_EEE12emplace_backB9sqn240000IJRKiS9_RKjEEERS3_DpOT_ENKUlvE0_clB9sqn240000Ev
_ZNSt4__Cr6vectorIN2v88internal13CoverageBlockENS_9allocatorIS3_EEE20__throw_length_errorB9sqn240000Ev
_ZZNSt4__Cr6vectorIN2v88internal13CoverageBlockENS_9allocatorIS3_EEE12emplace_backB9sqn240000IJjjRKjEEERS3_DpOT_ENKUlvE0_clB9sqn240000Ev
_ZN2v88internal14LookupIterator5StartILb1EEEvv
_ZNK2v88internal14LookupIterator23GetRootForNonJSReceiverEv
@@ -9307,6 +9306,7 @@ _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsA
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE12HasAccessorsENS0_6TaggedINS0_8JSObjectEEE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE16NumberOfElementsEPNS0_7IsolateENS0_6TaggedINS0_8JSObjectEEE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE9SetLengthEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEEj
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE21CollectElementIndicesENS0_12DirectHandleINS0_8JSObjectEEENS8_INS0_14FixedArrayBaseEEEPNS0_14KeyAccumulatorE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE3PopEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE5ShiftEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE9NormalizeEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEE
@@ -9325,6 +9325,7 @@ _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsA
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE11ReconfigureEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_14FixedArrayBaseEEENS0_13InternalIndexENSA_INS0_6ObjectEEENS0_18PropertyAttributesE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE6DeleteEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS0_13InternalIndexE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE12CopyElementsEPNS0_7IsolateENS0_6TaggedINS0_8JSObjectEEEjS5_NS0_12DirectHandleINS0_14FixedArrayBaseEEEjj
_ZN2v88internal8JSObject19initialize_elementsEv
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_28FastHoleySmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE1EEEE11ReconfigureEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_14FixedArrayBaseEEENS0_13InternalIndexENSA_INS0_6ObjectEEENS0_18PropertyAttributesE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_28FastHoleySmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE1EEEE6DeleteEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS0_13InternalIndexE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_28FastHoleySmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE1EEEE12CopyElementsEPNS0_7IsolateENS0_6TaggedINS0_8JSObjectEEEjS5_NS0_12DirectHandleINS0_14FixedArrayBaseEEEjj
@@ -9390,7 +9391,6 @@ _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElement
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE3EEEE9SetLengthEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEEj
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE3EEEE21CollectElementIndicesENS0_12DirectHandleINS0_8JSObjectEEENS8_INS0_14FixedArrayBaseEEEPNS0_14KeyAccumulatorE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE3EEEE22CollectValuesOrEntriesEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_10FixedArrayEEEjbPjNS0_14PropertyFilterE
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE3EEEE4FillEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_6ObjectEEEmm
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE3EEEE13IncludesValueEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_6ObjectEEEmm
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE3EEEE12IndexOfValueEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_6ObjectEEEmm
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_31FastHoleyObjectElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE3EEEE16LastIndexOfValueENS0_12DirectHandleINS0_8JSObjectEEENS8_INS0_6ObjectEEEm
@@ -9488,7 +9488,7 @@ _ZN2v88internal6Module13ResolveExportEPNS0_7IsolateENS0_6HandleIS1_EENS0_12Direc
_ZN2v88internal6Module11InstantiateEPNS0_7IsolateENS0_6HandleIS1_EENS_5LocalINS_7ContextEEERKNS1_20UserResolveCallbacksE
_ZN2v88internal6Module18PrepareInstantiateEPNS0_7IsolateENS0_12DirectHandleIS1_EENS_5LocalINS_7ContextEEERKNS1_20UserResolveCallbacksE
_ZN2v88internal6Module17FinishInstantiateEPNS0_7IsolateENS0_6HandleIS1_EEPNS0_15ZoneForwardListINS4_INS0_16SourceTextModuleEEEEEPjPNS0_4ZoneEjSB_
_ZN2v88internal10ErrorUtils30HasErrorStackSymbolOwnPropertyEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEE
_ZN2v88internal6Module8EvaluateEPNS0_7IsolateENS0_6HandleIS1_EE
_ZN2v88internal10ErrorUtils21GetErrorStackPropertyEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEE
_ZN2v88internal10ErrorUtils17SetFormattedStackEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS4_INS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEE
_ZN2v88internal10ErrorUtils17CaptureStackTraceEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS0_13FrameSkipModeENS0_6HandleINS0_6ObjectEEE
@@ -9516,20 +9516,6 @@ _ZN2v88internal24IncrementalStringBuilder6ExtendEv
_ZN2v88internal24IncrementalStringBuilder6FinishEv
_ZN2v88internal24IncrementalStringBuilder12AppendStringENS0_12DirectHandleINS0_6StringEEE
_ZN2v88internal24IncrementalStringBuilder18AppendStringCappedENS0_12DirectHandleINS0_6StringEEEj
_ZN2v88internal8baseline22BytecodeOffsetIteratorC2ENS0_6HandleINS0_16TrustedByteArrayEEENS3_INS0_13BytecodeArrayEEE
_ZN2v88internal8baseline22BytecodeOffsetIteratorC1ENS0_6HandleINS0_16TrustedByteArrayEEENS3_INS0_13BytecodeArrayEEE
_ZN2v88internal8baseline22BytecodeOffsetIterator22UpdatePointersCallbackEPv
_ZN2v88internal8baseline22BytecodeOffsetIteratorC2ENS0_6TaggedINS0_16TrustedByteArrayEEENS3_INS0_13BytecodeArrayEEE
_ZN2v88internal8baseline22BytecodeOffsetIteratorC1ENS0_6TaggedINS0_16TrustedByteArrayEEENS3_INS0_13BytecodeArrayEEE
_ZN2v88internal8baseline22BytecodeOffsetIteratorD2Ev
_ZN2v88internal8baseline22BytecodeOffsetIteratorD1Ev
_ZN2v88internal15WasmValueObject3NewEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEENS4_INS0_6ObjectEEE
_ZN2v88internal12_GLOBAL__N_120GetOrCreateDebugMapsEPNS0_7IsolateE
_ZN2v88internal15WasmValueObject3NewEPNS0_7IsolateERKNS0_4wasm9WasmValueE
_ZN2v88internal12_GLOBAL__N_114GetRefTypeNameEPNS0_7IsolateENS0_4wasm18CanonicalValueTypeE
_ZN2v88internal11StructProxy6CreateEPNS0_7IsolateENS0_12DirectHandleINS0_10WasmStructEEE
_ZN2v88internal10ArrayProxy6CreateEPNS0_7IsolateENS0_12DirectHandleINS0_9WasmArrayEEE
_ZN2v88internal4wasm17value_type_reader16ValidateHeapTypeINS1_7Decoder17FullValidationTagEEEbPS4_PKhPKNS1_10WasmModuleENS1_8HeapTypeE
_ZN2v88internal4wasm26WasmModuleSignatureStorage17ExpandAndAllocateEmm
_ZN2v88internal4wasm26WasmModuleSignatureStorage19AllocateMoreStorageEm
_ZNSt4__Cr6vectorIhNS_9allocatorIhEEE20__throw_length_errorB9sqn240000Ev
@@ -9588,6 +9574,7 @@ _ZNK7simdutf7haswell14implementation23utf8_length_from_latin1EPKcm
_ZNK7simdutf7haswell14implementation22utf8_length_from_utf32EPKDim
_ZNK7simdutf7haswell14implementation23utf16_length_from_utf32EPKDim
_ZNK7simdutf7haswell14implementation22utf32_length_from_utf8EPKcm
_ZNK7simdutf7haswell14implementation16base64_to_binaryEPKcmPcNS_14base64_optionsENS_27last_chunk_handling_optionsE
_ZNK7simdutf8westmere14implementation27binary_to_base64_with_linesEPKcmPcmNS_14base64_optionsE
_ZNK7simdutf8westmere14implementation4findEPKcS3_c
_ZNK7simdutf8westmere14implementation4findEPKDsS3_Ds
@@ -9791,6 +9778,7 @@ u_getUnicodeProperties_78
u_isalnumPOSIX_78
u_isJavaSpaceChar_78
u_isWhitespace_78
u_isblank_78
utrie2_openFromSerialized_78
utrie2_close_78
utrie2_isFrozen_78
@@ -9866,8 +9854,6 @@ _ZN2v88internal4wasm12CanonicalSigC1EmmPKNS1_18CanonicalValueTypeENS1_18Canonica
_ZNK2v88internal4wasm12CanonicalSig7Builder3GetENS1_18CanonicalTypeIndexE
_ZN2v88internal4wasm9WasmError11FormatErrorEPKcP13__va_list_tag
_ZN2v88internal4wasm12_GLOBAL__N_115VPrintFToStringEPNSt4__Cr12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEmPKcP13__va_list_tag
_ZN2v88internal22ManagedObjectFinalizerERKNS_16WeakCallbackInfoIvEE
_ZN2v88internal12_GLOBAL__N_132ManagedObjectFinalizerSecondPassERKNS_16WeakCallbackInfoIvEE
_ZN2v88internal19CppGCManagedWrapper19UpdateEstimatedSizeEmPNS0_7IsolateE
_ZN2v88internal15Utf8DecoderBaseINS0_11Utf8DecoderEEC2ENS_4base6VectorIKhEE
_ZN2v88internal15Utf8DecoderBaseINS0_11Utf8DecoderEEC1ENS_4base6VectorIKhEE
@@ -9899,7 +9885,6 @@ _ZN2v88internal4wasm9DebugInfo13GetStackDepthEmPNS0_7IsolateE
_ZN2v88internal4wasm9DebugInfo13GetStackValueEimmmPNS0_7IsolateE
_ZN2v88internal4wasm9DebugInfo20GetFunctionAtAddressEmPNS0_7IsolateE
_ZN2v88internal4wasm13DebugInfoImpl13SetBreakpointEiiPNS0_7IsolateE
_ZN2v88internal4wasm13DebugInfoImpl19UpdateReturnAddressEPNS0_9WasmFrameEPNS1_8WasmCodeENS1_12_GLOBAL__N_114ReturnLocationE
_ZN2v88internal4wasm13DebugInfoImpl10IsAtReturnEPNS0_9WasmFrameE
_ZN2v88internal4wasm13DebugInfoImpl20FloodWithBreakpointsEPNS0_9WasmFrameENS1_12_GLOBAL__N_114ReturnLocationE
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal7IsolateENS3_4wasm13DebugInfoImpl19PerIsolateDebugDataEEENS_22__unordered_map_hasherIS5_NS_4pairIKS5_S8_EENS_4hashIS5_EENS_8equal_toIS5_EEEENS_21__unordered_map_equalIS5_SD_SH_SF_EENS_9allocatorISD_EEE16__emplace_uniqueB9sqn240000IJRKNS_21piecewise_construct_tENS_5tupleIJOS5_EEENSS_IJEEEEEENSB_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEEDpOT_ENKUlRSC_SR_OSU_OSV_E_clB9sqn240000ES16_SR_S17_S18_
@@ -9917,7 +9902,7 @@ _ZN2v85debug20GetBigIntStringValueEPNS_7IsolateENS_5LocalINS_6BigIntEEE
_ZN2v85debug12_GLOBAL__N_133GetBigIntStringPresentationHandleEPNS_8internal7IsolateENS2_12DirectHandleINS2_6BigIntEEE
_ZN2v85debug20GetBigIntDescriptionEPNS_7IsolateENS_5LocalINS_6BigIntEEE
_ZN2v85debug18GetDateDescriptionENS_5LocalINS_4DateEEE
_ZNK2v85debug6Script13SetBreakpointENS_5LocalINS_6StringEEEPNS0_8LocationEPi
_ZN2v85debug22GetFunctionDescriptionENS_5LocalINS_8FunctionEEE
_ZNK2v85debug6Script28SetInstrumentationBreakpointEPi
_ZN2v85debug6Script20RemoveWasmBreakpointEi
_ZN2v85debug16RemoveBreakpointEPNS_7IsolateEi
@@ -10008,8 +9993,6 @@ _ZN2v85debug12SetIsolateIdEPNS_7IsolateEm
_ZN2v85debug16PropertyIterator6CreateENS_5LocalINS_7ContextEEENS2_INS_6ObjectEEEb
_ZN2v88internal21DebugPropertyIterator7AdvanceEv
_ZNSt4__Cr11__introsortB9sqn240000INS_17_ClassicAlgPolicyERPFbRKN2v88internal13BreakLocationES6_EPS4_Lb0EEEvT1_SB_T0_NS_15iterator_traitsISB_E15difference_typeEb
_ZZNSt4__Cr6vectorIN2v85debug10WasmScript12DebugSymbolsENS_9allocatorIS4_EEE12emplace_backB9sqn240000IJS4_EEERS4_DpOT_ENKUlvE0_clB9sqn240000Ev
_ZNSt4__Cr6vectorIN2v85debug10WasmScript12DebugSymbolsENS_9allocatorIS4_EEE20__throw_length_errorB9sqn240000Ev
_ZNSt4__Cr6vectorIN2v86GlobalINS1_5debug6ScriptEEENS_9allocatorIS5_EEE24__emplace_back_slow_pathB9sqn240000IJRPNS1_7IsolateENS1_5LocalIS4_EEEEEPS5_DpOT_
_ZNSt4__Cr6vectorIN2v86GlobalINS1_5debug6ScriptEEENS_9allocatorIS5_EEE20__throw_length_errorB9sqn240000Ev
_ZNSt4__Cr26__split_buffer_size_layoutINS_14__split_bufferIN2v86GlobalINS2_5debug6ScriptEEENS_9allocatorIS6_EES0_EES6_S8_E10__relocateB9sqn240000ERPS6_RmSD_
@@ -10040,6 +10023,8 @@ _ZN2v88internal9DateCacheD2Ev
_ZN2v88internal9DateCacheD0Ev
_ZN2v88internal9DateCache30GetDaylightSavingsOffsetFromOSEl
_ZN2v88internal9DateCache14EquivalentTimeEl
_ZN2v88internal29SmallStringOptimizedAllocatorILm128EED0Ev
_ZN2v88internal29SmallStringOptimizedAllocatorILm128EE8allocateEj
_ZNK2v88internal6String9IsEqualToILNS1_12EqualityTypeE0EcEEbNS_4base6VectorIKT0_EEPNS0_12LocalIsolateE
_ZN2v88internal24IcuBreakIteratorWithTextC2ENSt4__Cr10unique_ptrIN6icu_7813BreakIteratorENS2_14default_deleteIS5_EEEE
_ZN2v88internal24IcuBreakIteratorWithTextC1ENSt4__Cr10unique_ptrIN6icu_7813BreakIteratorENS2_14default_deleteIS5_EEEE
@@ -10062,9 +10047,6 @@ _ZN2v88internal4Intl14BuildLocaleSetERKNSt4__Cr6vectorINS2_12basic_stringIcNS2_1
_ZN2v88internal12_GLOBAL__N_116ValidateResourceEN6icu_786LocaleEPKcS5_
_ZN2v88internal4Intl13ToLanguageTagERKN6icu_786LocaleE
_ZN2v88internal4Intl20LegacyUnwrapReceiverEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS4_INS0_10JSFunctionEEEb
_ZN2v88internal4Intl38ValidateAndCanonicalizeUnicodeLocaleIdEPNS0_7IsolateENSt4__Cr17basic_string_viewIcNS4_11char_traitsIcEEEE
_ZNSt4__Cr12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2INS_17basic_string_viewIcS2_EETnNS_9enable_ifIXaa35__can_be_converted_to_string_view_vIcS2_T_Entsr7is_sameIu14__remove_cvrefISA_ES5_EE5valueEiE4typeELi0EEERKSA_RKS4_
_ZN2v88internal4Intl22CanonicalizeLocaleListEPNS0_7IsolateENS0_12DirectHandleINS0_6ObjectEEEb
_ZN2v88internal4Intl14CompareStringsEPNS0_7IsolateERKN6icu_788CollatorENS0_12DirectHandleINS0_6StringEEESA_NS1_21CompareStringsOptionsE
_ZN2v88internal4Intl23AsciiCollationWeightsL1Ev
_ZN2v88internal4Intl23AsciiCollationWeightsL3Ev
@@ -10077,6 +10059,7 @@ _ZN2v88internal12_GLOBAL__N_118AvailableTimeZonesEPNS0_7IsolateE
_ZN2v88internal12_GLOBAL__N_114AvailableUnitsEPNS0_7IsolateE
_ZN2v88internal7Factory24NewStringFromStaticCharsILm4EEENS0_6HandleINS0_6StringEEERAT__KcNS0_14AllocationTypeE
_ZN2v88internal4Intl18SupportedLocalesOfEPNS0_7IsolateEPKcRKNSt4__Cr3setINS6_12basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS6_4lessISD_EENSB_ISD_EEEENS0_12DirectHandleINS0_6ObjectEEESM_
_ZN2v88internal4Intl16IsValidCollationERKN6icu_786LocaleERKNSt4__Cr12basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE
_ZN2v88internal4Intl13ResolveLocaleEPNS0_7IsolateERKNSt4__Cr3setINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS4_4lessISB_EENS9_ISB_EEEERKNS4_6vectorISB_SE_EENS1_13MatcherOptionESH_
_ZN2v88internal4Intl9NormalizeEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEENS4_INS0_6ObjectEEE
_ZN2v88internal7Factory24NewStringFromStaticCharsILm21EEENS0_6HandleINS0_6StringEEERAT__KcNS0_14AllocationTypeE
@@ -10114,7 +10097,7 @@ _ZNSt4__Cr10__function13__policy_funcIFbPKcEE11__call_funcB9sqn240000IZN2v88inte
_ZNSt4__Cr10__function13__policy_funcIFNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPKcEE12__empty_funcB9sqn240000EPKNS0_16__policy_storageES9_
_ZNSt4__Cr10__function13__policy_funcIFbPKcEE12__empty_funcB9sqn240000EPKNS0_16__policy_storageES3_
_ZN2v88internal12_GLOBAL__N_118BuildLocaleMatcherEPNS0_7IsolateERKNSt4__Cr3setINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS4_4lessISB_EENS9_ISB_EEEEP10UErrorCode
_ZZNSt4__Cr6__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE16__emplace_uniqueB9sqn240000IJRKS6_EEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEbEEDpOT_ENKUlSD_SD_E_clB9sqn240000ESD_SD_
_ZN2v88internal12_GLOBAL__N_116ParseBCP47LocaleERKNSt4__Cr12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE
_ZNSt4__Cr6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE18__assign_with_sizeB9sqn240000INS_17_ClassicAlgPolicyEPKS6_SC_EEvT0_T1_l
_ZNSt4__Cr20__shared_ptr_emplaceB9sqn240000IN6icu_786number24LocalizedNumberFormatterENS_9allocatorIS3_EEED0Ev
_ZNSt4__Cr20__shared_ptr_emplaceB9sqn240000IN6icu_786number24LocalizedNumberFormatterENS_9allocatorIS3_EEE16__on_zero_sharedEv
@@ -10174,7 +10157,6 @@ uprv_tzset_78
uprv_timezone_78
uprv_tzname_clear_cache_78
uprv_tzname_78
u_versionFromString_78
_ZN6icu_7810CharStringC2EOS0_
_ZN6icu_7810CharStringC1EOS0_
_ZN6icu_7810CharStringaSEOS0_
@@ -10238,6 +10220,8 @@ _ZN6icu_7811StringPieceC1ERKS0_ii
_ZN6icu_7811StringPiece3setEPKc
_ZN6icu_7811StringPiece4findES0_i
_ZN6icu_7811StringPiece7compareES0_
_ZN6icu_78eqERKNS_11StringPieceES2_
u_strToUTF32WithSub_78
_ZL14toUpperOrTitleiPFiPvaES_PPKDsia
ucase_toFullTitle_78
ucase_fold_78
@@ -10393,7 +10377,6 @@ _ZN6icu_786Locale14createFromNameEPKc
_ZN6icu_786Locale15createCanonicalEPKc
_ZN6icu_786Locale7getRootEv
_ZN6icu_786Locale14getLocaleCacheEv
_ZN6icu_7812_GLOBAL__N_113AliasReplacer28replaceTransformedExtensionsERNS_10CharStringES3_R10UErrorCode
_ZN6icu_7812_GLOBAL__N_19AliasData7cleanupEv
_ZN6icu_7817UniqueCharStringsD2Ev
_ZN6icu_7817UniqueCharStrings3addEPKDsR10UErrorCode
@@ -10454,6 +10437,7 @@ _ZN6icu_787UVectorC2EPFvPvEPFa8UElementS4_ER10UErrorCode
_ZN6icu_787UVectorC1EPFvPvEPFa8UElementS4_ER10UErrorCode
_ZN6icu_787UVectorD2Ev
_ZN6icu_787UVectorD1Ev
_ZN6icu_787UVector17removeAllElementsEv
_ZL20doLoadFromCommonDataaPKcS0_S0_S0_S0_S0_S0_PFaPvS0_S0_PK9UDataInfoES1_P10UErrorCodeS8_
_ZN6icu_7817UDataPathIteratorD2Ev
_ZL14openCommonDataPKciP10UErrorCode
@@ -10521,6 +10505,7 @@ _ZN6icu_7813LocaleBuilder9setRegionENS_11StringPieceE
_ZN6icu_7813LocaleBuilder10setVariantENS_11StringPieceE
_ZN6icu_7813LocaleBuilder14setLanguageTagENS_11StringPieceE
_ZN6icu_7813LocaleBuilder23setUnicodeLocaleKeywordENS_11StringPieceES1_
_ZN6icu_7813LocaleBuilder15clearExtensionsEv
_ZN6icu_7821RuleCharacterIterator11skipIgnoredEi
_ZN6icu_7819CharacterProperties24getInclusionsForPropertyE9UPropertyR10UErrorCode
_ZN12_GLOBAL__N_122getInclusionsForSourceE15UPropertySourceR10UErrorCode
@@ -10540,6 +10525,9 @@ _ZL15defaultContainsRK14BinaryPropertyi9UProperty
_ZL13isBidiControlRK14BinaryPropertyi9UProperty
_ZL10isMirroredRK14BinaryPropertyi9UProperty
_ZL27hasFullCompositionExclusionRK14BinaryPropertyi9UProperty
_ZL13isJoinControlRK14BinaryPropertyi9UProperty
_ZL26caseBinaryPropertyContainsRK14BinaryPropertyi9UProperty
_ZL11isNormInertRK14BinaryPropertyi9UProperty
_ZN6icu_7822FormattedStringBuilder6spliceEiiRKNS_13UnicodeStringEiiNS0_5FieldER10UErrorCode
_ZN6icu_7822FormattedStringBuilder6insertEiRKS0_R10UErrorCode
_ZN6icu_7822FormattedStringBuilder15writeTerminatorER10UErrorCode
@@ -10574,6 +10562,8 @@ _ZNK6icu_786number4impl15CurrencySymbols21getIntlCurrencySymbolER10UErrorCode
_ZNK6icu_786number4impl15CurrencySymbols13getPluralNameENS_14StandardPlural4FormER10UErrorCode
_ZNK6icu_786number4impl15CurrencySymbols22hasEmptyCurrencySymbolEv
_ZN6icu_786number4impl15resolveCurrencyERKNS1_23DecimalFormatPropertiesERKNS_6LocaleER10UErrorCode
_ZN6icu_786number4impl13PatternParser18parseToPatternInfoERKNS_13UnicodeStringERNS1_17ParsedPatternInfoER10UErrorCode
_ZN6icu_786number4impl17ParsedPatternInfo14consumePatternERKNS_13UnicodeStringER10UErrorCode
_ZNK6icu_786number4impl24NumberRangeFormatterImpl11formatRangeERNS1_25UFormattedNumberRangeDataERNS1_10MicroPropsES6_R10UErrorCode
_ZNK6icu_786number4impl24NumberRangeFormatterImpl19formatApproximatelyERNS1_25UFormattedNumberRangeDataENS1_15DecimalQuantityERNS1_10MicroPropsES7_R10UErrorCode
_ZNK6icu_786number4impl24NumberRangeFormatterImpl17formatSingleValueERNS1_25UFormattedNumberRangeDataERNS1_10MicroPropsES6_R10UErrorCode
@@ -10619,7 +10609,6 @@ _ZNK2v88internal27Utf8ExternalStreamingStream5CloneEv
_ZNK2v88internal27Utf8ExternalStreamingStream15can_access_heapEv
_ZN14Utf8DfaDecoder6DecodeEhPNS_5StateEPj
_ZNSt4__Cr6vectorIN2v88internal27Utf8ExternalStreamingStream5ChunkENS_9allocatorIS4_EEE24__emplace_back_slow_pathB9sqn240000IJRPKhRmRNS3_14StreamPositionEEEEPS4_DpOT_
_ZZNSt4__Cr6vectorIN2v814ScriptCompiler28FlexibleExternalSourceStream5ChunkENS_9allocatorIS4_EEE12emplace_backB9sqn240000IJS4_EEERS4_DpOT_ENKUlvE0_clB9sqn240000Ev
_ZNSt4__Cr6vectorIN2v814ScriptCompiler28FlexibleExternalSourceStream5ChunkENS_9allocatorIS4_EEE20__throw_length_errorB9sqn240000Ev
_ZN2v88internal23BufferedCharacterStreamINS0_20ExternalStringStreamEED2Ev
_ZN2v88internal23BufferedCharacterStreamINS0_20ExternalStringStreamEED0Ev
@@ -11127,7 +11116,7 @@ _ZN2v88internal21SourceRangeAstVisitorC1EmPNS0_10ExpressionEPNS0_14SourceRangeMa
_ZN2v88internal21SourceRangeAstVisitor10VisitBlockEPNS0_5BlockE
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE10VisitBlockEPNS0_5BlockE
_ZN2v88internal21SourceRangeAstVisitor32MaybeRemoveLastContinuationRangeEPNS0_8ZoneListIPNS0_9StatementEEE
_ZN2v88internal19AstTraversalVisitorINS0_29AstFunctionLiteralIdReindexerEE12VisitCallNewEPNS0_7CallNewE
_ZN2v88internal21SourceRangeAstVisitor20VisitSwitchStatementEPNS0_15SwitchStatementE
_ZN2v88internal19AstTraversalVisitorINS0_29AstFunctionLiteralIdReindexerEE21VisitConditionalChainEPNS0_16ConditionalChainE
_ZN2v88internal19AstTraversalVisitorINS0_29AstFunctionLiteralIdReindexerEE16VisitConditionalEPNS0_11ConditionalE
_ZNK2v88internal9PreParser13GetIdentifierEv
@@ -11372,6 +11361,8 @@ _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE17ParseOcta
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE28TryParseCharacterClassEscapeEjNS2_18InClassEscapeStateEPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_7ZoneMapINS_4base6VectorIKjEEPNS1_4TreeENS1_24CharacterClassStringLessEEEPNS0_4ZoneEb
_ZN2v88internal4Zone3NewINS0_6regexp15ClassSetOperandEJRPNS0_8ZoneListINS3_14CharacterRangeEEERPNS0_7ZoneMapINS_4base6VectorIKjEEPNS3_4TreeENS3_24CharacterClassStringLessEEEEEEPT_DpOT0_
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE23ParseNamedBackReferenceEPNS2_7BuilderILS4_0EEEPNS2_11ParserStateILS4_0EEE
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE20ParseCharacterEscapeENS2_18InClassEscapeStateEPb
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE23ParseIntervalQuantifierEPiS6_
_ZN2v88internal6regexp12_GLOBAL__N_17BuilderILNS2_9ParseModeE0EE19AddQuantifierToAtomEiiiNS1_10Quantifier14QuantifierTypeE
_ZN2v88internal6regexp12_GLOBAL__N_17BuilderILNS2_9ParseModeE0EE10FlushTermsEv
_ZN2v88internal6regexp12_GLOBAL__N_111TextBuilderILNS2_9ParseModeE0EE9FlushTextEv
@@ -11390,18 +11381,6 @@ _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE14ParseHexE
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE20ParseClassSetOperandEPKNS2_7BuilderILS4_0EEEPNS2_19ClassSetOperandTypeEPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_7ZoneMapINS_4base6VectorIKjEEPNS1_4TreeENS1_24CharacterClassStringLessEEEPj
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE29AddMaybeSimpleCaseFoldedRangeEPNS0_8ZoneListINS1_14CharacterRangeEEES7_
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE16ParseClassEscapeEPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_4ZoneEbPjPb
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE22ParseClassSetCharacterEv
_ZN2v88internal6regexp12_GLOBAL__N_111TextBuilderILNS2_9ParseModeE0EE8ToRegExpEv
_ZN2v88internal6regexp12_GLOBAL__N_111TextBuilderILNS2_9ParseModeE0EE19AddUnicodeCharacterEj
_ZZNSt4__Cr6__treeINS_12__value_typeIN2v84base6VectorIKjEEPNS2_8internal6regexp4TreeEEENS_19__map_value_compareIS6_NS_4pairIKS6_SA_EENS8_24CharacterClassStringLessEEENS7_13ZoneAllocatorISF_EEE16__emplace_uniqueB9sqn240000IJNS4_IjEERSA_EEENSD_INS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEElEEbEEDpOT_ENKUlOSM_SN_E_clB9sqn240000ESY_SN_
_ZNSt4__Cr6__treeINS_12__value_typeIN2v84base6VectorIKjEEPNS2_8internal6regexp4TreeEEENS_19__map_value_compareIS6_NS_4pairIKS6_SA_EENS8_24CharacterClassStringLessEEENS7_13ZoneAllocatorISF_EEE12__find_equalB9sqn240000ISF_EENSD_IPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSQ_EERKT_
_ZN2v88internal6regexp12_GLOBAL__N_111TextBuilderILNS2_9ParseModeE0EE17AddTrailSurrogateEt
_ZN2v88internal6regexp12_GLOBAL__N_111TextBuilderILNS2_9ParseModeE0EE12AddCharacterEt
_ZN2v88internal8ZoneListINS0_6regexp14CharacterRangeEE6AddAllENS_4base6VectorIKS3_EEPNS0_4ZoneE
_ZN2v88internal4Zone3NewINS0_8ZoneListIPNS0_6regexp4TreeEEEJiPS1_EEEPT_DpOT0_
_ZN2v88internal8ZoneListIPNS0_6regexp4TreeEE3AddERKS4_PNS0_4ZoneE
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE20ParseClassSetOperandEPKNS2_7BuilderILS4_0EEEPNS2_19ClassSetOperandTypeE
_ZN2v88internal4Zone3NewINS0_6regexp18ClassSetExpressionEJNS4_13OperationTypeERbRKbRPNS0_8ZoneListIPNS3_4TreeEEEEEEPT_DpOT0_
_ZN2v88internal4Zone3NewINS0_6regexp18ClassSetExpressionEJNS4_13OperationTypeERbS6_RPNS0_8ZoneListIPNS3_4TreeEEEEEEPT_DpOT0_
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhLNS2_9ParseModeE0EE15ScanForCapturesENS2_18InClassEscapeStateE
_ZN2v88internal6regexp12_GLOBAL__N_112_GLOBAL__N_123LookupPropertyValueNameILNS2_9ParseModeE0EEENS2_14ClassSetResultIXT_EEE9UPropertyPKcbPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_7ZoneMapINS_4base6VectorIKjEEPNS1_4TreeENS1_24CharacterClassStringLessEEENSG_5FlagsINS1_4FlagEiiEEPNS0_4ZoneE
@@ -11578,6 +11557,7 @@ _ZN2v88internal6regexp20UnicodeRangeSplitter8AddRangeENS1_14CharacterRangeE
_ZN2v88internal6regexp14CharacterRange25AddUnicodeCaseEquivalentsEPNS0_8ZoneListIS2_EEPNS0_4ZoneE
_ZN2v88internal6regexp14CharacterRange12CanonicalizeEPNS0_8ZoneListIS2_EE
_ZN2v88internal6regexp11ClassRanges10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE
_ZN2v88internal6regexp14CharacterRange6NegateEPKNS0_8ZoneListIS2_EEPS4_PNS0_4ZoneE
_ZN2v88internal6regexp9Assertion10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE
_ZN2v88internal6regexp12_GLOBAL__N_129BoundaryAssertionAsLookaroundEPNS1_8CompilerEPNS1_4NodeENS1_9Assertion4TypeE
_ZN2v88internal4Zone3NewINS0_6regexp10ChoiceNodeEJiNS_4base5FlagsINS3_4FlagEiiEERPS1_EEEPT_DpOT0_
@@ -11614,6 +11594,8 @@ _ZN2v88internal6regexp8AnalysisIJNS1_12_GLOBAL__N_119AssertionPropagatorENS3_21E
_ZN2v88internal6regexp8AnalysisIJNS1_12_GLOBAL__N_119AssertionPropagatorENS3_21EatsAtLeastPropagatorEEE14VisitAssertionEPNS1_13AssertionNodeE
_ZN2v88internal6regexp8AnalysisIJNS1_12_GLOBAL__N_119AssertionPropagatorENS3_21EatsAtLeastPropagatorEEE9VisitTextEPNS1_8TextNodeE
_ZN2v88internal6regexp8AnalysisIJNS1_12_GLOBAL__N_119AssertionPropagatorENS3_21EatsAtLeastPropagatorEEE22VisitUnanchoredAdvanceEPNS1_21UnanchoredAdvanceNodeE
_ZN2v88internal6regexp20RegExpMacroAssemblerC2EPNS0_7IsolateEPNS0_4ZoneENS2_4ModeE
_ZN2v88internal6regexp20RegExpMacroAssembler7LogCodeEPNS0_7IsolateENS0_12DirectHandleINS0_4CodeEEENS5_INS0_10RegExpDataEEENS_4base5FlagsINS1_4FlagEiiEE
_ZN2v88internal6regexp20RegExpMacroAssembler21SkipUntilOneOfMasked3ERKNS2_25SkipUntilOneOfMasked3ArgsE
_ZN2v88internal6regexp26NativeRegExpMacroAssembler20CheckStackGuardStateEPNS0_7IsolateEiNS0_6RegExp10CallOriginEPmNS0_6TaggedINS0_17InstructionStreamEEES7_PPKhSD_m
_ZN2v88internal6regexp26NativeRegExpMacroAssembler5MatchENS0_12DirectHandleINS0_12IrRegExpDataEEENS3_INS0_6StringEEEbPiiiPNS0_7IsolateE
@@ -11654,18 +11636,6 @@ _ZN2v88internal6regexp5StackD1Ev
_ZN2v88internal6regexp5Stack3NewEv
_ZN2v88internal6regexp5Stack6DeleteEPS2_
_ZN2v88internal6regexp5Stack14EnsureCapacityEm
_ZN2v88internal6regexp14BuildIgnoreSetEv
_ZN2v88internal6regexp11CaseFolding9IgnoreSetEv
_ZN2v88internal6regexp18BuildSpecialAddSetEv
_ZN2v88internal6regexp11CaseFolding13SpecialAddSetEv
_ZN2v84base16LazyInstanceImplINS_8internal6regexp13IgnoreSetDataENS0_32StaticallyAllocatedInstanceTraitIS4_EENS0_21DefaultConstructTraitIS4_EENS0_23ThreadSafeInitOnceTraitENS0_18LeakyInstanceTraitIS4_EEE12InitInstanceEPv
_ZN2v84base16LazyInstanceImplINS_8internal6regexp17SpecialAddSetDataENS0_32StaticallyAllocatedInstanceTraitIS4_EENS0_21DefaultConstructTraitIS4_EENS0_23ThreadSafeInitOnceTraitENS0_18LeakyInstanceTraitIS4_EEE12InitInstanceEPv
_ZN6icu_7810UnicodeSet9closeOverEi
_ZN6icu_7810UnicodeSet24closeOverCaseInsensitiveEb
_ZN6icu_7810UnicodeSet24closeOverAddCaseMappingsEv
_ZN6icu_78L8_set_addEP4USeti
_ZN6icu_78L13_set_addRangeEP4USetii
_ZN6icu_78L14_set_addStringEP4USetPKDsi
_ZN6icu_7812_GLOBAL__N_122maybeOnlyCaseSensitiveERKNS_10UnicodeSetERS1_
_ZN2v88internal6regexp11ErrorStringENS1_5ErrorE
_ZN2v88internal21JSRegExpResultIndices12BuildIndicesEPNS0_7IsolateENS0_12DirectHandleINS0_15RegExpMatchInfoEEENS4_INS0_10RegExpDataEEE
@@ -11739,7 +11709,6 @@ _ZN2v88internal6regexp18ExperimentalRegExp10IsCompiledENS0_12DirectHandleINS0_12
_ZN2v88internal6regexp18ExperimentalRegExp7CompileEPNS0_7IsolateENS0_12DirectHandleINS0_12IrRegExpDataEEE
_ZN2v88internal6regexp12_GLOBAL__N_111CompileImplEPNS0_7IsolateENS0_12DirectHandleINS0_12IrRegExpDataEEE
_ZN2v88internal6regexp18ExperimentalRegExp7ExecRawEPNS0_7IsolateENS0_6RegExp10CallOriginENS0_6TaggedINS0_12IrRegExpDataEEENS7_INS0_6StringEEEPiii
_ZN4absl19functional_internal12InvokeObjectIRKZN2v88internal6regexp23RegExpMacroAssemblerX6421SkipUntilOneOfMasked3ERKNS4_20RegExpMacroAssembler25SkipUntilOneOfMasked3ArgsEE3$_0vJNS3_8RegisterESD_EEET0_NS0_7VoidPtrEDpNS0_8ForwardTIT1_E4typeE
_ZN2v88internal18MacroAssemblerBaseC2EPNS0_7IsolateERKNS0_16AssemblerOptionsENS_4base11StrongAliasINS0_21CodeObjectRequiredTagEbEENSt4__Cr10unique_ptrINS0_15AssemblerBufferENSB_14default_deleteISD_EEEE
_ZN2v88internal18MacroAssemblerBaseC2EPNS0_7IsolateENSt4__Cr7variantIJPNS0_4ZoneEPNS0_19AccountingAllocatorEEEENS0_16AssemblerOptionsENS_4base11StrongAliasINS0_21CodeObjectRequiredTagEbEENS4_10unique_ptrINS0_15AssemblerBufferENS4_14default_deleteISH_EEEE
_ZN2v88internal18MacroAssemblerBase12BuiltinEntryENS0_7BuiltinE
@@ -12259,6 +12228,7 @@ _ZN2v88internal12_GLOBAL__N_120SimpleCreateFunctionEPNS0_7IsolateENS0_12DirectHa
_ZN2v88internal7Genesis18CreateIteratorMapsENS0_12DirectHandleINS0_10JSFunctionEEE
_ZN2v88internal12_GLOBAL__N_123InstallFunctionAtSymbolEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS4_INS0_6SymbolEEEPKcNS0_7BuiltinEiNS_4base11StrongAliasINS0_17AdaptArgumentsTagEbEENS0_18PropertyAttributesE
_ZN2v88internal12_GLOBAL__N_123CreateNonConstructorMapEPNS0_7IsolateENS0_12DirectHandleINS0_3MapEEENS4_INS0_8JSObjectEEEPKc
_ZN2v88internal7Genesis23CreateAsyncIteratorMapsENS0_12DirectHandleINS0_10JSFunctionEEE
_ZN2v88internal7Genesis16CreateNewGlobalsENS_5LocalINS_14ObjectTemplateEEENS0_12DirectHandleINS0_13JSGlobalProxyEEE
_ZN2v88internal12_GLOBAL__N_137CreateFunctionForBuiltinWithPrototypeEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEENS0_7BuiltinENS4_INS0_5UnionIJNS0_10JSReceiverENS0_4NullENS0_4HoleEEEEEENS0_12InstanceTypeEiiNS0_11MutableModeEiNS_4base11StrongAliasINS0_17AdaptArgumentsTagEbEE
_ZN2v88internal7Genesis17HookUpGlobalProxyENS0_12DirectHandleINS0_13JSGlobalProxyEEE
@@ -12269,8 +12239,6 @@ _ZN2v88internal12_GLOBAL__N_115InstallFunctionEPNS0_7IsolateENS0_12DirectHandleI
_ZN2v88internalL32InstallWithIntrinsicDefaultProtoEPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEEi
_ZN2v88internal12Bootstrapper27InitializeLazyPartOfContextENS0_12DirectHandleINS0_13NativeContextEEENS0_7Context5FieldE
_ZN2v88internal7Genesis16InitializeGlobalENS0_12DirectHandleINS0_14JSGlobalObjectEEENS2_INS0_10JSFunctionEEE
_ZN2v88internal12_GLOBAL__N_121InitializeJSArrayMapsEPNS0_7IsolateENS0_12DirectHandleINS0_7ContextEEENS4_INS0_3MapEEE
_ZN2v88internal12_GLOBAL__N_126SetConstructorInstanceTypeEPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEENS0_12InstanceTypeE
_ZN2v88internal12_GLOBAL__N_128InstallFunctionWithBuiltinIdEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEEPKcNS0_7BuiltinEiNS_4base11StrongAliasINS0_17AdaptArgumentsTagEbEE
_ZN2v88internal12_GLOBAL__N_125InstallTrueValuedPropertyEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEEPKc
_ZN2v88internal12_GLOBAL__N_118InstallToStringTagEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS4_INS0_6StringEEE
@@ -12309,7 +12277,6 @@ _ZN2v88internal12_GLOBAL__N_119SimpleInstallGetterEPNS0_7IsolateENS0_12DirectHan
_ZN2v84base19TemplateHashMapImplIPvS2_NS0_18KeyEqualityMatcherIS2_EENS0_23DefaultAllocationPolicyEE6ResizeEv
_ZN2v88internal11GCExtension25GetNativeFunctionTemplateEPNS_7IsolateENS_5LocalINS_6StringEEE
_ZN2v88internal11GCExtension2GCERKNS_20FunctionCallbackInfoINS_5ValueEEE
_ZN2v88internal12_GLOBAL__N_17AsyncGC11RunInternalEv
_ZThn32_N2v88internal12_GLOBAL__N_17AsyncGCD1Ev
_ZThn32_N2v88internal12_GLOBAL__N_17AsyncGCD0Ev
_ZN2v88internal12HeapProfilerC2EPNS0_4HeapE
@@ -12416,8 +12383,6 @@ _ZN2v88internal19AllocationTraceTreeC1Ev
_ZN2v88internal17AllocationTracker12FunctionInfoC2Ev
_ZN2v88internal17AllocationTracker12FunctionInfoC1Ev
_ZN2v88internal17AddressToTraceMap11RemoveRangeEmm
_ZNK2v88internal19CppGraphBuilderImpl20IsReachableFromStackERKN5cppgc8internal16HeapObjectHeaderE
_ZN2v88internal20GraphBuildingVisitorD2Ev
_ZN2v88internal20GraphBuildingVisitorD0Ev
_ZN2v88internal20GraphBuildingVisitor5VisitEPKvN5cppgc15TraceDescriptorE
_ZN2v88internal20GraphBuildingVisitor9VisitWeakEPKvN5cppgc15TraceDescriptorEPFvRKNS4_14LivenessBrokerES3_ES3_
@@ -12473,7 +12438,6 @@ _ZN2v84base11SmallVectorIPNS_8internal9LocalHeapELm4ENSt4__Cr9allocatorIS4_EEE4G
_ZN2v84base11SmallVectorIPNS_8internal9LocalHeapELm4ENSt4__Cr9allocatorIS4_EEE4GrowEm
_ZN4heap4base5Stack24SetMarkerAndCallbackImplIZN2v88internal9LocalHeap18ExecuteWhileParkedIZNS4_16IsolateSafepoint9LockMutexEPS5_E3$_0EEvT_EUlvE_EEvPS1_PvPKv
_ZN4heap4base5Stack43SetMarkerForBackgroundThreadAndCallbackImplIZN2v88internal9LocalHeap18ExecuteWhileParkedIZNS4_16IsolateSafepoint9LockMutexEPS5_E3$_0EEvT_EUlvE_EEvPS1_PvPKv
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPN2v88internal20SamplingHeapProfiler6SampleENS_10unique_ptrIS5_NS_14default_deleteIS5_EEEEEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_SA_EENS_4hashIS6_EENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SF_SJ_SH_EENS_9allocatorISF_EEE6removeB9sqn240000ENS_21__hash_const_iteratorIPNS_11__hash_nodeISB_PvEEEE
_ZNSt4__Cr5dequeIN2v817AllocationProfile4NodeENS_9allocatorIS3_EEE19__add_back_capacityB9sqn240000Ev
_ZNSt4__Cr14__split_bufferIPN2v817AllocationProfile4NodeENS_9allocatorIS4_EENS_29__split_buffer_pointer_layoutEE12emplace_backB9sqn240000IJRS4_EEEvDpOT_
_ZNSt4__Cr14__split_bufferIPN2v817AllocationProfile4NodeENS_9allocatorIS4_EENS_29__split_buffer_pointer_layoutEE12emplace_backB9sqn240000IJS4_EEEvDpOT_
@@ -12488,6 +12452,7 @@ _ZN2v88internal16FileOutputStreamD0Ev
_ZN2v812OutputStream12GetChunkSizeEv
_ZN2v88internal26ExternalizeStringExtension11BuildSourceEPcm
_ZN2v88internal26ExternalizeStringExtension25GetNativeFunctionTemplateEPNS_7IsolateENS_5LocalINS_6StringEEE
_ZN2v88internal26ExternalizeStringExtension11ExternalizeERKNS_20FunctionCallbackInfoINS_5ValueEEE
_ZN2v88internal19StatisticsExtension11GetCountersERKNS_20FunctionCallbackInfoINS_5ValueEEE
_ZN2v88internal19StatisticsExtensionD0Ev
_ZN2v88internal23TriggerFailureExtension25GetNativeFunctionTemplateEPNS_7IsolateENS_5LocalINS_6StringEEE
@@ -12503,12 +12468,6 @@ _ZN2v88internal18ScriptContextTable3AddEPNS0_7IsolateENS0_6HandleIS1_EENS0_12Dir
_ZN2v88internal7Context10InitializeEPNS0_7IsolateE
_ZN2v88internal18ScriptContextTable6LookupENS0_12DirectHandleINS0_6StringEEEPNS0_20VariableLookupResultE
_ZNK2v88internal7Context22is_declaration_contextEv
_ZNK2v88internal7Context19declaration_contextEv
_ZNK2v88internal7Context15closure_contextEv
_ZNK2v88internal7Context16extension_objectEv
_ZNK2v88internal7Context18extension_receiverEv
_ZNK2v88internal7Context6moduleEv
_ZN2v88internal7Context6LookupENS0_6HandleIS1_EENS2_INS0_6StringEEENS0_18ContextLookupFlagsEPiPNS0_18PropertyAttributesEPNS0_18InitializationFlagEPNS0_12VariableModeEPb
_ZN2v88internal7Context3GetENS0_12DirectHandleIS1_EEiPNS0_7IsolateE
_ZN2v88internal7Context3SetENS0_12DirectHandleIS1_EEiNS2_INS0_6ObjectEEEPNS0_7IsolateE
_ZN2v88internal11ContextCell13set_smi_valueENS0_6TaggedINS0_3SmiEEE
@@ -12542,13 +12501,6 @@ _ZN2v812_GLOBAL__N_131WebAssemblyInstantiateStreamingERKNS_20FunctionCallbackInf
_ZN2v88internal6WasmJs20InstallMemoryControlEPNS0_7IsolateENS0_12DirectHandleINS0_13NativeContextEEENS4_INS0_8JSObjectEEE
_ZN2v88internal6WasmJs27InstallJSPromiseIntegrationEPNS0_7IsolateENS0_12DirectHandleINS0_13NativeContextEEENS4_INS0_8JSObjectEEE
_ZN2v812_GLOBAL__N_120WebAssemblyPromisingERKNS_20FunctionCallbackInfoINS_5ValueEEE
_ZN2v88internal6WasmJs30CompileTimeImportsFromArgumentENS0_12DirectHandleINS0_6ObjectEEEPNS0_7IsolateENS0_4wasm19WasmEnabledFeaturesE
_ZNSt4__Cr10shared_ptrIN2v88internal4wasm25CompilationResultResolverEED2Ev
_ZN2v812_GLOBAL__N_112_GLOBAL__N_124AsyncCompilationResolverC2EPNS_7IsolateENS_5LocalINS_7ContextEEENS5_INS_7Promise8ResolverEEE
_ZN2v88internal7Isolate14native_contextEv
_ZN2v812_GLOBAL__N_130GetAndCopyFirstArgumentAsBytesERKNS_20FunctionCallbackInfoINS_5ValueEEEmPNS_8internal4wasm12ErrorThrowerE
_ZN2v812_GLOBAL__N_112_GLOBAL__N_124AsyncCompilationResolver22OnCompilationSucceededENS_8internal12DirectHandleINS3_16WasmModuleObjectEEE
_ZN2v812_GLOBAL__N_112_GLOBAL__N_124AsyncCompilationResolver19OnCompilationFailedENS_8internal12DirectHandleINS3_5UnionIJNS3_3SmiENS3_10HeapNumberENS3_6BigIntENS3_6StringENS3_6SymbolENS3_7BooleanENS3_4NullENS3_9UndefinedENS3_10JSReceiverEEEEEE
_ZNSt4__Cr19__partial_sort_implB9sqn240000INS_17_ClassicAlgPolicyERZN2v88internal4wasm17LiftoffStackSlots15SortInPushOrderEvEUlRKNS5_4SlotES8_E_PS6_SB_EET1_SC_SC_T2_OT0_
_ZN2v88internal4wasm12ParallelMove15TransferToStackEiRKNS1_15LiftoffVarStateE
_ZN2v88internal4wasm12ParallelMove12ExecuteMovesEv
@@ -12639,6 +12591,7 @@ _ZN2v88internal14MacroAssembler9Cvtlsi2ssENS0_11XMMRegisterENS0_7OperandE
_ZN2v88internal14MacroAssembler9Cvtqsi2ssENS0_11XMMRegisterENS0_8RegisterE
_ZN2v88internal14MacroAssembler9Cvtqsi2ssENS0_11XMMRegisterENS0_7OperandE
_ZN2v88internal14MacroAssembler9Cvtqsi2sdENS0_11XMMRegisterENS0_8RegisterE
_ZN2v88internal14MacroAssembler9Cvtqsi2sdENS0_11XMMRegisterENS0_7OperandE
_ZN2v88internal14MacroAssembler10Cvttsd2uiqENS0_8RegisterENS0_7OperandEPNS0_5LabelE
_ZN2v88internal14MacroAssembler10Cvttsd2uiqENS0_8RegisterENS0_11XMMRegisterEPNS0_5LabelE
_ZN2v88internal14MacroAssembler9Cvttsd2uiENS0_8RegisterENS0_7OperandEPNS0_5LabelE
@@ -12658,7 +12611,6 @@ _ZN2v88internal14MacroAssembler9I64x2ShrSENS0_11XMMRegisterES2_NS0_8RegisterES2_
_ZN2v88internal14MacroAssembler8I64x2MulENS0_11XMMRegisterES2_S2_S2_S2_
_ZN2v88internal14MacroAssembler11I8x16PopcntENS0_11XMMRegisterES2_NS0_8RegisterES2_S2_
_ZN2v88internal20SharedMacroAssemblerINS0_14MacroAssemblerEE19I8x16PopcntPreAvx10ENS0_11XMMRegisterES4_S4_S4_NS0_8RegisterE
_ZN2v88internal14MacroAssembler9F64x4QfmsENS0_11YMMRegisterES2_S2_S2_S2_
_ZN2v88internal14MacroAssembler22I32x8DotI8x32I7x32AddSENS0_11YMMRegisterES2_S2_S2_S2_S2_
_ZN2v88internal14MacroAssembler16I32x8TruncF32x8UENS0_11YMMRegisterES2_S2_S2_
_ZN2v88internal14MacroAssembler5NegpdENS0_11YMMRegisterES2_S2_
@@ -12757,7 +12709,6 @@ _ZN2v88internal9Accessors20FunctionGetArgumentsEPNS0_15JavaScriptFrameEi
_ZN2v88internal12_GLOBAL__N_117GetFrameArgumentsEPNS0_7IsolateEPNS0_28JavaScriptStackFrameIteratorEi
_ZN2v88internal9Accessors26GetLegacyFunctionArgumentsEPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEE
_ZN2v88internal9Accessors23GetLegacyFunctionCallerEPNS0_7IsolateENS0_12DirectHandleINS0_10JSFunctionEEE
_ZN2v88internal8compiler10turboshaft10OperationTINS2_22NewArgumentsElementsOpEE18PrintOptionsHelperIJNS0_19CreateArgumentsTypeEiEJLm0ELm1EEEEvRNSt4__Cr13basic_ostreamIcNS8_11char_traitsIcEEEERKNS8_5tupleIJDpT_EEENS8_16integer_sequenceImJXspT0_EEEE
_ZN2v88internal8compiler10turboshaft10OperationTINS2_10NewArrayOpEE18PrintOptionsHelperIJNS4_4KindENS0_14AllocationTypeEEJLm0ELm1EEEEvRNSt4__Cr13basic_ostreamIcNS9_11char_traitsIcEEEERKNS9_5tupleIJDpT_EEENS9_16integer_sequenceImJXspT0_EEEE
_ZN2v88internal8compiler10turboshaft10OperationTINS2_18StringComparisonOpEE18PrintOptionsHelperIJNS4_4KindEEJLm0EEEEvRNSt4__Cr13basic_ostreamIcNS8_11char_traitsIcEEEERKNS8_5tupleIJDpT_EEENS8_16integer_sequenceImJXspT0_EEEE
_ZN2v88internal8compiler10turboshaft10OperationTINS2_32TransitionAndStoreArrayElementOpEE18PrintOptionsHelperIJNS4_4KindENS0_11MaybeHandleINS0_3MapEEESA_EJLm0ELm1ELm2EEEEvRNSt4__Cr13basic_ostreamIcNSB_11char_traitsIcEEEERKNSB_5tupleIJDpT_EEENSB_16integer_sequenceImJXspT0_EEEE
@@ -12800,7 +12751,6 @@ _GLOBAL__I_000100
_ZN2v88internal8compiler10turboshaftlsERNSt4__Cr13basic_ostreamIcNS3_11char_traitsIcEEEENS2_27MaybeRegisterRepresentationE
_ZN2v88internal8compiler10turboshaftlsERNSt4__Cr13basic_ostreamIcNS3_11char_traitsIcEEEENS2_20MemoryRepresentationE
_ZN2v88internal8compiler10turboshaft8WordTypeILm32EE5RangeEjjPNS0_4ZoneE
_ZNK2v88internal8compiler10turboshaft4Type14AllocateOnHeapEPNS0_7FactoryE
_ZN2v84base11SmallVectorIjLm8ENSt4__Cr9allocatorIjEEE11FreeStorageEv
_ZN2v84base11SmallVectorIjLm8ENSt4__Cr9allocatorIjEEE18grow_and_push_backEj
_ZN2v84base11SmallVectorIjLm8ENSt4__Cr9allocatorIjEEE4GrowEv
@@ -12850,6 +12800,7 @@ _ZN2v88internal8compiler18WasmGraphAssembler6IsNullEPNS1_4NodeENS0_4wasm9ValueTy
_ZN2v88internal8compiler18WasmGraphAssembler9IsNotNullEPNS1_4NodeENS0_4wasm9ValueTypeE
_ZN2v88internal8compiler18WasmGraphAssembler13AssertNotNullEPNS1_4NodeENS0_4wasm9ValueTypeENS1_6TrapIdE
_ZN2v88internal8compiler18WasmGraphAssembler20WasmAnyConvertExternEPNS1_4NodeE
_ZN2v88internal8compiler18WasmGraphAssembler20WasmExternConvertAnyEPNS1_4NodeE
_ZZN2v88internal6maglev12_GLOBAL__N_130GenerateTransitionElementsKindINS1_32TransitionElementsKindOrCheckMapEEEvPNS1_15MaglevAssemblerEPT_NS0_8RegisterES9_NS_4base6VectorIKNS0_8compiler6MapRefEEESD_NS1_12ZoneLabelRefENSt4__Cr8optionalIS9_EEENUlS6_S9_S9_NS1_16RegisterSnapshotESD_bSG_SJ_E_8__invokeES6_S9_S9_SK_SD_bSG_SJ_
_ZN2v88internal6maglev6detail20DeferredCodeInfoImplIZNS1_12_GLOBAL__N_130GenerateTransitionElementsKindINS1_32TransitionElementsKindOrCheckMapEEEvPNS1_15MaglevAssemblerEPT_NS0_8RegisterESB_NS_4base6VectorIKNS0_8compiler6MapRefEEESF_NS1_12ZoneLabelRefENSt4__Cr8optionalISB_EEEUlS8_SB_SB_NS1_16RegisterSnapshotESF_bSI_SL_E_E8GenerateES8_
_ZN2v88internal6maglev15MaglevAssembler13GetDeoptLabelINS1_32TransitionElementsKindOrCheckMapEEEPNS0_5LabelEPT_NS0_16DeoptimizeReasonE
@@ -12872,7 +12823,6 @@ _ZN2v88internal11interpreter20StoreLookupSlotFlags15GetLanguageModeEh
_ZN2v88internal11interpreter20StoreLookupSlotFlags20IsLookupHoistingModeEh
_ZN2v88internal6maglev15MaglevAssembler8AllocateENS1_16RegisterSnapshotENS0_8RegisterEiNS0_14AllocationTypeENS0_19AllocationAlignmentE
_ZN2v88internal6maglev15MaglevAssembler8AllocateENS1_16RegisterSnapshotENS0_8RegisterES4_NS0_14AllocationTypeENS0_19AllocationAlignmentE
_ZNSt4__Cr6vectorIhNS_9allocatorIhEEE18__insert_with_sizeB9sqn240000INS_17_ClassicAlgPolicyEPhS6_EENS_11__wrap_iterIS6_EENS7_IPKhEET0_T1_l
_ZN2v84base11SmallVectorIhLm32ENSt4__Cr9allocatorIhEEE4GrowEm
_ZN2v84base11SmallVectorIhLm32ENSt4__Cr9allocatorIhEEE11FreeStorageEv
_ZN2v88internal7Version9GetStringENS_4base6VectorIcEE
@@ -12899,6 +12849,7 @@ _ZN5cppgc8internal9NameTraitIN2v88internal4wasm23WasmMemoryMapDescriptorEE7GetNa
_ZN2v88internal26Runtime_WasmWasmToJSObjectEiPmPNS0_7IsolateE
_ZN2v88internal26Runtime_WasmJSToWasmObjectEiPmPNS0_7IsolateE
_ZN2v88internal22Runtime_WasmMemoryGrowEiPmPNS0_7IsolateE
_ZN2v88internal33Runtime_TrapHandlerThrowWasmErrorEiPmPNS0_7IsolateE
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIiN2v88internal6HandleINS3_6ObjectEEEEENS_22__unordered_map_hasherIiNS_4pairIKiS6_EENS_4hashIiEENS_8equal_toIiEEEENS_21__unordered_map_equalIiSB_SF_SD_EENS_9allocatorISB_EEE11__do_rehashB9sqn240000ILb1EEEvm
_ZN2v88internal4wasm11StackMemory19GetCentralStackViewEPNS0_7IsolateE
_ZN2v88internal4wasm11StackMemory23UpdateCentralStackLimitEPNS0_7IsolateE
@@ -13082,7 +13033,6 @@ _ZN2v88internal30Runtime_CreateIterResultObjectEiPmPNS0_7IsolateE
_ZN2v88internal26Runtime_CreateDataPropertyEiPmPNS0_7IsolateE
_ZN2v88internal38Runtime_SetOwnPropertyIgnoreAttributesEiPmPNS0_7IsolateE
_ZN2v88internal38Runtime_GetOwnPropertyDescriptorObjectEiPmPNS0_7IsolateE
_ZN2v88internal27Runtime_SwissTableFindEntryEiPmPNS0_7IsolateE
_ZN2v88internal24Runtime_SwissTableUpdateEiPmPNS0_7IsolateE
_ZN2v88internal24Runtime_SwissTableDeleteEiPmPNS0_7IsolateE
_ZN2v88internal24Runtime_SwissTableEqualsEiPmPNS0_7IsolateE
@@ -13095,7 +13045,6 @@ _ZN2v88internal40Runtime_CheckFastIterableToListPrototypeEiPmPNS0_7IsolateE
_ZN2v88internal11PropertyKeyC2INS0_6ObjectENS0_6HandleEQsr3stdE16is_convertible_vIT0_IT_ENS0_12DirectHandleIS6_EEEEEPNS0_7IsolateES7_
_ZN2v88internal12_GLOBAL__N_144CollectPrivateMethodsAndAccessorsFromContextEPNS0_7IsolateENS0_12DirectHandleINS0_7ContextEEENS4_INS0_6StringEEENS0_6HandleINS0_6ObjectEEENS0_12IsStaticFlagEPNSt4__Cr6vectorINS0_13PrivateMemberENSD_9allocatorISF_EEEE
_ZZNSt4__Cr6vectorIN2v88internal13PrivateMemberENS_9allocatorIS3_EEE12emplace_backB9sqn240000IJS3_EEERS3_DpOT_ENKUlvE0_clB9sqn240000Ev
_ZN2v88internal12BackingStore21GrowWasmMemoryInPlaceEPNS0_7IsolateEmm
_ZNK2v88internal12BackingStore29BroadcastSharedWasmMemoryGrowEPNS0_7IsolateE
_ZN2v88internal26GlobalBackingStoreRegistry29BroadcastSharedWasmMemoryGrowEPNS0_7IsolateEPKNS0_12BackingStoreE
_ZN2v88internal12BackingStore29RemoveSharedWasmMemoryObjectsEPNS0_7IsolateE
@@ -13115,6 +13064,8 @@ _ZNSt4__Cr10__function8__policy13__large_cloneB9sqn240000IZN2v88internal12Backin
_ZNSt4__Cr10__function8__policy15__large_destroyB9sqn240000IZN2v88internal12BackingStore35TryAllocateAndPartiallyCommitMemoryEPNS4_7IsolateEmmmmmNS4_14WasmMemoryFlagENS3_4base11StrongAliasINS4_13SharedFlagTagEbEENSA_INS4_18HasGuardRegionsTagEbEEE3$_0EEvPv
_ZNSt4__Cr10__function13__policy_funcIFbvEE11__call_funcB9sqn240000IZN2v88internal12BackingStore35TryAllocateAndPartiallyCommitMemoryEPNS6_7IsolateEmmmmmNS6_14WasmMemoryFlagENS5_4base11StrongAliasINS6_13SharedFlagTagEbEENSC_INS6_18HasGuardRegionsTagEbEEE3$_1EEbPKNS0_16__policy_storageE
_ZNSt4__Cr10__function8__policy13__large_cloneB9sqn240000IZN2v88internal12BackingStore35TryAllocateAndPartiallyCommitMemoryEPNS4_7IsolateEmmmmmNS4_14WasmMemoryFlagENS3_4base11StrongAliasINS4_13SharedFlagTagEbEENSA_INS4_18HasGuardRegionsTagEbEEE3$_1EEPvPKv
_ZNSt4__Cr10__function8__policy15__large_destroyB9sqn240000IZN2v88internal12BackingStore35TryAllocateAndPartiallyCommitMemoryEPNS4_7IsolateEmmmmmNS4_14WasmMemoryFlagENS3_4base11StrongAliasINS4_13SharedFlagTagEbEENSA_INS4_18HasGuardRegionsTagEbEEE3$_1EEvPv
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPKvNS_8weak_ptrIN2v88internal12BackingStoreEEEEENS_22__unordered_map_hasherIS3_NS_4pairIKS3_S8_EENS_4hashIS3_EENS_8equal_toIS3_EEEENS_21__unordered_map_equalIS3_SD_SH_SF_EENS_9allocatorISD_EEE4findB9sqn240000IS3_EENS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_
_ZN2v88internal42Builtin_AsyncDisposableStackPrototypeAdoptEiPmPNS0_7IsolateE
_ZN2v88internal42Builtin_AsyncDisposableStackPrototypeDeferEiPmPNS0_7IsolateE
_ZN2v88internal41Builtin_AsyncDisposableStackPrototypeMoveEiPmPNS0_7IsolateE
@@ -13189,6 +13140,7 @@ _ZN2v88internal10JsonParserIhE14BuildJsonArrayEm
_ZN2v84base11SmallVectorINS_8internal6HandleINS2_6ObjectEEELm16ENSt4__Cr9allocatorIS5_EEE6resizeEmQsr3stdE21default_initializableIT_E
_ZN2v88internal11HandleScope14CloseAndEscapeINS0_6ObjectENS0_6HandleEQsr3stdE16is_convertible_vIT0_IT_ENS0_12DirectHandleIS6_EEEEES7_S7_
_ZN2v88internal10JsonParserIhE15BuildJsonObjectILb0EEENS0_6HandleINS0_8JSObjectEEERKNS2_16JsonContinuationENS0_12DirectHandleINS0_3MapEEE
_ZN2v84base11SmallVectorINS_8internal12JsonPropertyELm16ENSt4__Cr9allocatorIS3_EEE6resizeEmQsr3stdE21default_initializableIT_E
_ZN2v88internal21JsonParseInternalizer23InternalizeJsonPropertyILNS1_11ReviverModeE1EEENS0_11MaybeHandleINS0_6ObjectEEENS0_12DirectHandleINS0_10JSReceiverEEENS7_INS0_6StringEEES6_NS7_IS5_EE
_ZN2v88internal21JsonParseInternalizer15RecurseAndApplyILNS1_11ReviverModeE0EEEbNS0_6HandleINS0_10JSReceiverEEENS4_INS0_6StringEEENS4_INS0_6ObjectEEESA_
_ZN2v84base11SmallVectorINS_8internal6HandleINS2_6ObjectEEELm16ENSt4__Cr9allocatorIS5_EEE11FreeStorageEv
@@ -13231,7 +13183,6 @@ _ZN2v88internal15JsonStringifierC2EPNS0_7IsolateE
_ZN2v88internal15JsonStringifierC1EPNS0_7IsolateE
_ZN2v88internal15JsonStringifier9StringifyENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEESE_NS2_INS0_6ObjectEEE
_ZN2v88internal15JsonStringifier18InitializeReplacerENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEE
_ZN2v88internal43Builtin_ObjectPrototypePropertyIsEnumerableEiPmPNS0_7IsolateE
_ZN2v88internal30Builtin_ObjectDefinePropertiesEiPmPNS0_7IsolateE
_ZN2v88internal28Builtin_ObjectDefinePropertyEiPmPNS0_7IsolateE
_ZN2v88internal26Builtin_ObjectDefineGetterEiPmPNS0_7IsolateE
@@ -13246,7 +13197,6 @@ _ZN2v88internal22Builtin_ObjectIsFrozenEiPmPNS0_7IsolateE
_ZN2v88internal22Builtin_ObjectIsSealedEiPmPNS0_7IsolateE
_ZN2v88internal39Builtin_ObjectGetOwnPropertyDescriptorsEiPmPNS0_7IsolateE
_ZN2v88internal18Builtin_ObjectSealEiPmPNS0_7IsolateE
_ZN2v88internal12CppGCManagedIN6icu_7813BreakIteratorEE6CreateEPNS0_7IsolateEmNSt4__Cr10shared_ptrIS3_EENS0_14AllocationTypeE
_ZN2v88internal11JSSegmenter15ResolvedOptionsEPNS0_7IsolateENS0_12DirectHandleIS1_EE
_ZN2v88internal6detail10DestructorIN6icu_7813BreakIteratorEEEvPv
_ZNSt4__Cr20__shared_ptr_pointerB9sqn240000IPN6icu_7813BreakIteratorENS_14default_deleteIS2_EENS_9allocatorIS2_EEED0Ev
@@ -13281,6 +13231,7 @@ _ZN2v88internal17StartupSerializerC1EPNS0_7IsolateENS_4base5FlagsINS0_8Snapshot1
_ZN2v88internal17StartupSerializerD2Ev
_ZN2v88internal17StartupSerializerD1Ev
_ZN2v88internal17StartupSerializerD0Ev
_ZN2v88internal17StartupSerializer19SerializeObjectImplENS0_6HandleINS0_10HeapObjectEEENS0_22SerializerDeserializer8SlotTypeE
_ZN2v88internal17ContextSerializer33SerializeObjectWithEmbedderFieldsINS0_17EmbedderDataArrayEPFNS_11StartupDataEibNS_28SerializeContextDataCallbackENS_5LocalINS_7ContextEEEES5_S8_EEvNS0_6HandleIT_EEiT0_T1_T2_
_ZNSt4__Cr6vectorIbNS_9allocatorIbEEE9push_backB9sqn240000ERKb
_ZZNSt4__Cr6vectorIN2v811StartupDataENS_9allocatorIS2_EEE12emplace_backB9sqn240000IJS2_EEERS2_DpOT_ENKUlvE0_clB9sqn240000Ev
@@ -13291,8 +13242,6 @@ _ZN2v88internal10MathRandom12ResetContextENS0_6TaggedINS0_7ContextEEE
_ZN2v88internal10MathRandom29InitializeAndMaybeRefillCacheEPNS0_7IsolateEm
_ZN2v88internal21DescriptorLookupCache5ClearEv
_ZN2v88internal17ReadOnlyPromotion7PromoteEPNS0_7IsolateERKNS0_14SafepointScopeERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELS8_2EEEE
_ZN2v88internal12_GLOBAL__N_121ReadOnlyPromotionImpl21UpdatePointersVisitorD0Ev
_ZN2v88internal12_GLOBAL__N_121ReadOnlyPromotionImpl21UpdatePointersVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotES7_
_ZN2v88internal12_GLOBAL__N_121ReadOnlyPromotionImpl21UpdatePointersVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotES7_
_ZN2v88internal12_GLOBAL__N_121ReadOnlyPromotionImpl21UpdatePointersVisitor29VisitInstructionStreamPointerENS0_6TaggedINS0_4CodeEEENS0_27OffHeapCompressedObjectSlotINS0_29ExternalCodeCompressionSchemeEEE
_ZN2v88internal12_GLOBAL__N_121ReadOnlyPromotionImpl21UpdatePointersVisitor20VisitExternalPointerENS0_6TaggedINS0_10HeapObjectEEENS0_19ExternalPointerSlotE
@@ -13486,7 +13435,6 @@ _ZN2v88internal8baseline16BaselineCompiler21VisitTestUndetectableEv
_ZN2v88internal8baseline16BaselineCompiler13VisitTestNullEv
_ZN2v88internal8baseline16BaselineCompiler18VisitTestUndefinedEv
_ZN2v88internal8baseline16BaselineCompiler15VisitTestTypeOfEv
_ZN2v88internal8baseline16BaselineCompiler21VisitGetNamedPropertyEv
_ZN2v88internal8baseline16BaselineCompiler30VisitGetNamedPropertyFromSuperEv
_ZN2v88internal8baseline16BaselineCompiler21VisitGetKeyedPropertyEv
_ZN2v88internal8baseline16BaselineCompiler31VisitGetEnumeratedKeyedPropertyEv
@@ -13501,6 +13449,7 @@ _ZN2v88internal8baseline16BaselineCompiler22VisitStaInArrayLiteralEv
_ZN2v88internal8baseline16BaselineCompiler36VisitDefineKeyedOwnPropertyInLiteralEv
_ZN2v88internal8baseline16BaselineCompiler27VisitSetPrototypePropertiesEv
_ZN2v88internal8baseline16BaselineCompiler20VisitSetPrivateFieldEv
_ZN2v88internal8baseline16BaselineCompiler8VisitAddEv
_ZN2v88internal8baseline16BaselineCompiler41VisitFindNonDefaultConstructorOrConstructEv
_ZN2v88internal8baseline16BaselineCompiler20VisitCallAnyReceiverEv
_ZN2v88internal8baseline16BaselineCompiler17VisitCallPropertyEv
@@ -13594,6 +13543,7 @@ _ZN2v88internal8baseline17BaselineAssembler17LdaModuleVariableENS0_8RegisterEij
_ZN2v88internal8baseline16BaselineCompiler11CallRuntimeIJNS0_6TaggedINS0_3SmiEEEEEEvNS0_7Runtime10FunctionIdEDpT_
_ZN2v88internal8baseline17BaselineAssembler17StaModuleVariableENS0_8RegisterES3_ij
_ZN2v88internal8baseline16BaselineCompiler11CallRuntimeIJNS0_11interpreter8RegisterES5_NS0_8RegisterENS0_6TaggedINS0_3SmiEEENS0_7OperandENS7_INS0_11TaggedIndexEEEEEEvNS0_7Runtime10FunctionIdEDpT_
_ZN2v88internal8baseline16BaselineCompiler11CallBuiltinILNS0_7BuiltinE545EJNS0_8RegisterENS0_6TaggedINS0_3SmiEEEiEEEvDpT0_
_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter8RegisterES6_EEEvjjDpT0_
_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter8RegisterES6_S6_EEEvjjDpT0_
_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE0EJNS0_9RootIndexENS0_11interpreter12RegisterListEEEEvjjDpT0_
@@ -14313,8 +14263,6 @@ _ZN2v88internal21LazyCompileDispatcherD1Ev
_ZN2v88internal21LazyCompileDispatcher7EnqueueEPNS0_12LocalIsolateENS0_6HandleINS0_18SharedFunctionInfoEEENSt4__Cr10unique_ptrINS0_20Utf16CharacterStreamENS7_14default_deleteIS9_EEEE
_ZNK2v88internal21LazyCompileDispatcher10IsEnqueuedENS0_12DirectHandleINS0_18SharedFunctionInfoEEE
_ZN2v88internal21LazyCompileDispatcher31WaitForJobIfRunningOnBackgroundEPNS1_3JobERKNS_4base9LockGuardINS4_5MutexEEE
_ZN2v88internal21LazyCompileDispatcher7JobTask3RunEPNS_11JobDelegateE
_ZNK2v88internal21LazyCompileDispatcher7JobTask17GetMaxConcurrencyEm
_ZZNSt4__Cr6vectorIPN2v88internal21LazyCompileDispatcher3JobENS_9allocatorIS5_EEE12emplace_backB9sqn240000IJRKS5_EEERS5_DpOT_ENKUlvE0_clB9sqn240000Ev
_ZNSt4__Cr6vectorIPN2v88internal21LazyCompileDispatcher3JobENS_9allocatorIS5_EEE20__throw_length_errorB9sqn240000Ev
_ZNSt4__Cr10__function13__policy_funcIFvdEE11__call_funcB9sqn240000IZN2v88internal21LazyCompileDispatcher29ScheduleIdleTaskFromAnyThreadERKNS5_4base9LockGuardINS8_5MutexEEEE3$_0EEvPKNS0_16__policy_storageEd
@@ -14350,11 +14298,6 @@ _ZN2v88internal38Runtime_StoreLookupSlot_SloppyHoistingEiPmPNS0_7IsolateE
_ZN2v88internal47Runtime_StoreGlobalNoHoleCheckForReplLetOrConstEiPmPNS0_7IsolateE
_ZN2v88internal12_GLOBAL__N_113DeclareGlobalEPNS0_7IsolateENS0_12DirectHandleINS0_14JSGlobalObjectEEENS0_6HandleINS0_6StringEEENS7_INS0_6ObjectEEENS0_18PropertyAttributesEbNS1_17RedeclarationTypeE
_ZN2v88internal12_GLOBAL__N_117DeclareEvalHelperEPNS0_7IsolateENS0_6HandleINS0_6StringEEENS4_INS0_6ObjectEEE
_ZN2v88internal13DependentCode26DeoptimizeDependencyGroupsINS0_9ScopeInfoEEEvPNS0_7IsolateENS0_6TaggedIT_EENS_4base5FlagsINS1_15DependencyGroupEjjEE
_ZN2v88internal12_GLOBAL__N_118GetCallerArgumentsEPNS0_7IsolateE
_ZN2v88internal12_GLOBAL__N_114LoadLookupSlotEPNS0_7IsolateENS0_6HandleINS0_6StringEEENS0_11ShouldThrowEPNS4_INS0_6ObjectEEE
_ZN2v88internal12_GLOBAL__N_115StoreLookupSlotEPNS0_7IsolateENS0_6HandleINS0_7ContextEEENS4_INS0_6StringEEENS0_12DirectHandleINS0_6ObjectEEENS0_12LanguageModeENS0_18ContextLookupFlagsE
_ZN2v88internal12StderrStreamD1Ev
_ZN2v88internal12StderrStreamD0Ev
_ZTv0_n24_N2v88internal12StderrStreamD1Ev
_ZTv0_n24_N2v88internal12StderrStreamD0Ev
@@ -14454,6 +14397,23 @@ _ZN2v88internal18PretenuringHandler39PretenureAllocationSiteOnNextCollectionENS0
_ZN2v88internal18PretenuringHandler5resetEv
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal6TaggedINS3_14AllocationSiteEEEmEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_mEENS3_6Object6HasherENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SB_SF_SD_EENS_9allocatorISB_EEE16__emplace_uniqueB9sqn240000IJNS9_IS6_iEEEEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_OSN_E_clB9sqn240000ESY_SZ_
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal6TaggedINS3_14AllocationSiteEEEmEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_mEENS3_6Object6HasherENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SB_SF_SD_EENS_9allocatorISB_EEE14__erase_uniqueB9sqn240000IS6_EEmRKT_
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal6TaggedINS3_14AllocationSiteEEEmEENS_22__unordered_map_hasherIS6_NS_4pairIKS6_mEENS3_6Object6HasherENS_8equal_toIS6_EEEENS_21__unordered_map_equalIS6_SB_SF_SD_EENS_9allocatorISB_EEE6removeB9sqn240000ENS_21__hash_const_iteratorIPNS_11__hash_nodeIS7_PvEEEE
_ZNSt4__Cr10__function13__policy_funcIFvN2v88internal6TaggedINS3_14AllocationSiteEEEEE11__call_funcB9sqn240000IZNS3_18PretenuringHandler26ProcessPretenuringFeedbackEmE3$_0EEvPKNS0_16__policy_storageEOS6_
_ZN2v88internal29Runtime_BigIntCompareToNumberEiPmPNS0_7IsolateE
_ZN2v88internal29Runtime_BigIntCompareToStringEiPmPNS0_7IsolateE
_ZN2v88internal27Runtime_BigIntEqualToBigIntEiPmPNS0_7IsolateE
_ZN2v88internal27Runtime_BigIntEqualToNumberEiPmPNS0_7IsolateE
_ZN2v88internal27Runtime_BigIntEqualToStringEiPmPNS0_7IsolateE
_ZN2v88internal22Runtime_BigIntToNumberEiPmPNS0_7IsolateE
_ZN2v88internal16Runtime_ToBigIntEiPmPNS0_7IsolateE
_ZN2v88internal29Runtime_ToBigIntConvertNumberEiPmPNS0_7IsolateE
_ZN2v88internal26Runtime_BigIntExponentiateEiPmPNS0_7IsolateE
_ZN2v88internal21Runtime_BigIntUnaryOpEiPmPNS0_7IsolateE
_ZN2v88internal34Runtime_ThrowUnsupportedSuperErrorEiPmPNS0_7IsolateE
_ZN2v88internal40Runtime_ThrowConstructorNonCallableErrorEiPmPNS0_7IsolateE
_ZN2v88internal33Runtime_ThrowStaticPrototypeErrorEiPmPNS0_7IsolateE
_ZN2v88internal36Runtime_ThrowSuperAlreadyCalledErrorEiPmPNS0_7IsolateE
_ZN2v88internal27Runtime_ThrowSuperNotCalledEiPmPNS0_7IsolateE
_ZN2v88internal32Runtime_ThrowNotSuperConstructorEiPmPNS0_7IsolateE
_ZN2v88internal19Runtime_DefineClassEiPmPNS0_7IsolateE
_ZN2v88internal21Runtime_LoadFromSuperEiPmPNS0_7IsolateE
@@ -14547,7 +14507,6 @@ _ZN2v88internal2IC22UpdateMegamorphicCacheENS0_12DirectHandleINS0_3MapEEENS2_INS
_ZN2v88internal2IC20TryHealMonomorphicICERKNS0_17MaybeObjectHandleE
_ZN2v88internal2IC8SetCacheENS0_12DirectHandleINS0_4NameEEERKNS0_17MaybeObjectHandleE
_ZN2v88internal6LoadIC14ComputeHandlerEPNS0_14LookupIteratorE
_ZN2v88internal11KeyedLoadIC17UpdateLoadElementENS0_12DirectHandleINS0_10HeapObjectEEENS0_19KeyedAccessLoadModeE
_ZN2v88internal11KeyedLoadIC18LoadElementHandlerENS0_12DirectHandleINS0_3MapEEENS0_19KeyedAccessLoadModeENS0_17MaybeDirectHandleIS3_EE
_ZN2v88internal12_GLOBAL__N_126AddOneReceiverMapIfMissingEPNS0_15MapsAndHandlersENS0_6HandleINS0_3MapEEE
_ZN2v88internal11KeyedLoadIC30LoadElementPolymorphicHandlersEPNS0_15MapsAndHandlersES3_NS0_19KeyedAccessLoadModeE
@@ -14574,7 +14533,6 @@ _ZN2v88internal12KeyedStoreIC18UpdateStoreElementENS0_6HandleINS0_3MapEEENS0_20K
_ZN2v88internal12KeyedStoreIC19StoreElementHandlerENS0_12DirectHandleINS0_3MapEEENS0_20KeyedAccessStoreModeENS0_17MaybeDirectHandleINS0_5UnionIJNS0_3SmiENS0_4CellEEEEEE
_ZN2v88internal12KeyedStoreIC31StoreElementPolymorphicHandlersEPNS0_15MapsAndHandlersENS0_20KeyedAccessStoreModeE
_ZN2v88internal12KeyedStoreIC5StoreENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEENS2_INS0_6ObjectEEENS0_12DirectHandleISF_EE
_ZN2v88internal19Runtime_LoadIC_MissEiPmPNS0_7IsolateE
_ZN2v88internal32Runtime_LoadIC_Miss_FromBaselineEiPmPNS0_7IsolateE
_ZN2v88internal40Runtime_PatchLoadICUninitializedBaselineEiPmPNS0_7IsolateE
_ZN2v88internal40Runtime_GetStringLengthAndUpdateFeedbackEiPmPNS0_7IsolateE
@@ -14634,6 +14592,26 @@ _ZN2v88internal7ICStats5BeginEv
_ZN2v88internal7ICStats3EndEv
_ZN2v88internal7ICStats4DumpEv
_ZNK2v88internal6ICInfo19AppendToTracedValueEPNS_7tracing11TracedValueE
_ZN2v88internal27Runtime_VarargStackOverflowEiPmPNS0_7IsolateE
_ZN2v88internal39Runtime_ThrowSymbolAsyncIteratorInvalidEiPmPNS0_7IsolateE
_ZN2v88internal26Runtime_TerminateExecutionEiPmPNS0_7IsolateE
_ZN2v88internal23Runtime_ThrowRangeErrorEiPmPNS0_7IsolateE
_ZN2v88internal22Runtime_ThrowTypeErrorEiPmPNS0_7IsolateE
_ZN2v88internal30Runtime_ThrowTypeErrorIfStrictEiPmPNS0_7IsolateE
_ZN2v88internal39Runtime_ThrowInvalidTypedArrayAlignmentEiPmPNS0_7IsolateE
_ZN2v88internal37Runtime_UnwindAndFindExceptionHandlerEiPmPNS0_7IsolateE
_ZN2v88internal26Runtime_PropagateExceptionEiPmPNS0_7IsolateE
_ZN2v88internal27Runtime_ThrowReferenceErrorEiPmPNS0_7IsolateE
_ZN2v88internal42Runtime_ThrowAccessedUninitializedVariableEiPmPNS0_7IsolateE
_ZN2v88internal16Runtime_NewErrorEiPmPNS0_7IsolateE
_ZN2v88internal20Runtime_NewTypeErrorEiPmPNS0_7IsolateE
_ZN2v88internal25Runtime_NewReferenceErrorEiPmPNS0_7IsolateE
_ZN2v88internal32Runtime_ThrowInvalidStringLengthEiPmPNS0_7IsolateE
_ZN2v88internal38Runtime_ThrowIteratorResultNotAnObjectEiPmPNS0_7IsolateE
_ZN2v88internal31Runtime_ThrowThrowMethodMissingEiPmPNS0_7IsolateE
_ZN2v88internal34Runtime_ThrowSymbolIteratorInvalidEiPmPNS0_7IsolateE
_ZN2v88internal21Runtime_ThrowNoAccessEiPmPNS0_7IsolateE
_ZN2v88internal27Runtime_ThrowNotConstructorEiPmPNS0_7IsolateE
_ZN2v88internal30Runtime_ThrowTargetNonFunctionEiPmPNS0_7IsolateE
_ZN2v88internal18Runtime_StackGuardEiPmPNS0_7IsolateE
_ZN2v88internal36Runtime_HandleNoHeapWritesInterruptsEiPmPNS0_7IsolateE
@@ -14771,7 +14749,6 @@ _ZN2v88internal27Runtime_CreatePrivateSymbolEiPmPNS0_7IsolateE
_ZN2v88internal32Runtime_CreatePrivateBrandSymbolEiPmPNS0_7IsolateE
_ZN2v88internal31Runtime_CreatePrivateNameSymbolEiPmPNS0_7IsolateE
_ZN2v88internal31Runtime_SymbolDescriptiveStringEiPmPNS0_7IsolateE
_ZN2v88internal65Runtime_JSFinalizationRegistryRegisterWeakCellWithUnregisterTokenEiPmPNS0_7IsolateE
_ZN2v88internal33Runtime_JSWeakRefAddToKeptObjectsEiPmPNS0_7IsolateE
_ZN2v88internal22JSFinalizationRegistry35RegisterWeakCellWithUnregisterTokenENS0_12DirectHandleIS1_EENS2_INS0_8WeakCellEEEPNS0_7IsolateE
_ZN2v86bigint13ProcessorImpl20get_and_clear_statusEv
@@ -14784,7 +14761,6 @@ _ZN2v86bigint9Processor11ModuloLargeERNS0_8RWDigitsERNS0_6DigitsES5_
_ZN2v86bigint13ProcessorImpl21CachedMod_MakeInverseERNS0_6DigitsE
_ZN2v86bigint9Processor21CachedMod_MakeInverseERNS0_6DigitsE
_ZN2v86bigint13ProcessorImpl17MultiplyKaratsubaENS0_8RWDigitsENS0_6DigitsES3_
_ZN2v84base6Bignum17AssignPowerUInt16Eti
_ZN2v84base6Bignum21DivideModuloIntBignumERKS1_
_ZN2v84base6Bignum13SubtractTimesERKS1_i
_ZN2v84base6Bignum7CompareERKS1_S3_
@@ -14968,6 +14944,7 @@ _ZN2v88internal9Scavenger25RememberPromotedEphemeronENS0_6TaggedINS0_18Ephemeron
_ZNSt4__Cr6vectorINS_13unordered_mapIN2v88internal6TaggedINS3_10HeapObjectEEENS4_INS3_3MapEEENS3_6Object6HasherENS_8equal_toIS6_EENS_9allocatorINS_4pairIKS6_S8_EEEEEENSD_ISI_EEE12emplace_backB9sqn240000IJSI_EEERSI_DpOT_
_ZN4heap4base8WorklistIPN2v88internal11MutablePageELt64EE5Local7PublishEv
_ZN4heap4base8WorklistIN2v88internal9Scavenger24ScavengedObjectListEntryELt256EE5Local7PublishEv
_ZN2v88internal9Scavenger20PromoteIfLargeObjectENS0_6TaggedINS0_10HeapObjectEEE
_ZN2v88internal9Scavenger25EvacuateShortcutCandidateINS0_18FullHeapObjectSlotEEEN4heap4base18SlotCallbackResultENS0_6TaggedINS0_3MapEEET_NS7_INS0_10ConsStringEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEE
_ZN2v88internal9Scavenger35EvacuateInPlaceInternalizableStringINS0_18FullHeapObjectSlotEEEN4heap4base18SlotCallbackResultENS0_6TaggedINS0_3MapEEET_NS7_INS0_6StringEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_12ObjectFieldsE
_ZN2v88internal12_GLOBAL__N_124RememberedSetEntryNeededINS0_18FullHeapObjectSlotEEEN4heap4base18SlotCallbackResultEPNS0_4HeapET_
@@ -15025,6 +15002,7 @@ _ZThn32_N2v88internal31FinalizationRegistryCleanupTaskD1Ev
_ZThn32_N2v88internal31FinalizationRegistryCleanupTaskD0Ev
_ZNSt4__Cr10__function13__policy_funcIFvN2v88internal6TaggedINS3_10HeapObjectEEENS3_20CompressedObjectSlotES6_EE11__call_funcB9sqn240000IZNS3_31FinalizationRegistryCleanupTask11RunInternalEvE3$_0EEvPKNS0_16__policy_storageEOS6_OS7_SG_
_ZN2v88internal6String9VisitFlatINS0_16StringComparator5StateEEENS0_6TaggedINS0_10ConsStringEEEPT_NS5_IS1_EEjRKNS0_31SharedStringAccessGuardIfNeededE
_ZN2v88internal16StringComparator6EqualsENS0_6TaggedINS0_6StringEEES4_RKNS0_31SharedStringAccessGuardIfNeededE
_ZNSt4__Cr6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__emplace_back_slow_pathB9sqn240000IJPcEEEPS6_DpOT_
_ZN2v88internal7LogFile18CreateOutputHandleENSt4__Cr12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE
_ZN2v88internal7LogFileC2EPNS0_12V8FileLoggerENSt4__Cr12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE
@@ -15065,6 +15043,7 @@ _ZN2v87sampler13SignalHandler20IncreaseSamplerCountEv
_ZN2v87sampler7Sampler4StopEv
_ZN2v87sampler7Sampler8DoSampleEv
_ZZNSt4__Cr6vectorIPN2v87sampler7SamplerENS_9allocatorIS4_EEE12emplace_backB9sqn240000IJRKS4_EEERS4_DpOT_ENKUlvE0_clB9sqn240000Ev
_ZNSt4__Cr6vectorIPN2v87sampler7SamplerENS_9allocatorIS4_EEE20__throw_length_errorB9sqn240000Ev
_ZN2v88internal13PerfJitLogger17LogWriteDebugInfoEPKNS0_4wasm8WasmCodeE
_ZNK2v88internal4Code19unwinding_info_sizeEv
_ZN2v88internal13PerfJitLogger13CodeMoveEventENS0_6TaggedINS0_17InstructionStreamEEES4_
+24 -11
View File
@@ -452,6 +452,20 @@ pub fn deinit(self: *Frame) void {
frame.deinit();
}
// The Page outlives an iframe or popup that re-navigates: don't leave its
// pointer state on this document's elements.
const page = self.page;
if (page.input_hover_target) |el| {
if (el.ownerFrame(self) == self) {
page.input_hover_target = null;
}
}
if (page.input_pointer.down_target) |el| {
if (el.ownerFrame(self) == self) {
page.input_pointer.reset();
}
}
if (comptime lp.IS_DEBUG) {
log.debug(.frame, "frame.deinit", .{ .url = self.url, .type = self._type });
}
@@ -479,8 +493,6 @@ pub fn deinit(self: *Frame) void {
container.detach();
}
const page = self.page;
if (self._queued_navigation) |qn| {
qn.arena.release();
}
@@ -2671,10 +2683,9 @@ pub fn notifyNetworkAlmostIdle(self: *Frame) void {
// called from the parser. Text-node merging is the parser's responsibility
// (see Parser.appendTextChunk in src/browser/parser/Parser.zig); this is the
// "insert this fully-formed node as a new last child of parent" entry point.
pub fn appendNew(self: *Frame, parent: *Node, child: *Node) !void {
pub fn appendNew(self: *Frame, parent: *Node, child: *Node, parent_root: ?*Node) !void {
lp.assert(child._parent == null, "Frame.appendNew", .{});
// opts is meaningless when from_parser (the first param) is true.
try self._insertNodeRelative(true, parent, child, .append, .{});
try self._insertNodeRelative(true, parent, child, .append, .{ .parser_root = parent_root });
}
// called from the parser when the node and all its children have been added
@@ -2994,6 +3005,8 @@ const InsertNodeOpts = struct {
// the ready work itself once every node is in place, so an earlier
// script observes its later siblings already inserted.
run_ready: bool = true,
// The parent's root (parser only, avoids having to look it up)
parser_root: ?*Node = null,
};
pub fn insertNodeRelative(self: *Frame, parent: *Node, child: *Node, relative: InsertNodeRelative, opts: InsertNodeOpts) !void {
return self._insertNodeRelative(false, parent, child, relative, opts);
@@ -3066,14 +3079,14 @@ fn _insertNodeRelative(self: *Frame, comptime from_parser: bool, parent: *Node,
}
if (child.is(Element)) |el| {
// Invoke connectedCallback for custom elements during parsing.
// For main document parsing we know nodes are connected (fast path);
// for fragment parsing (innerHTML) we check connectivity.
if (child.isConnected() or child.isInShadowTree()) {
const root = opts.parser_root orelse parent.getRootNode(.{});
if (idMapsForRoot(root)) |id_maps| {
if (el.getId()) |id| {
try self.addElementId(parent, el, id);
try self.addElementIdWithMaps(id_maps, el, id);
}
if (rootIsConnected(root)) {
try Element.Html.Custom.enqueueConnectedCallbackOnElement(true, el, self);
}
try Element.Html.Custom.enqueueConnectedCallbackOnElement(true, el, self);
}
}
return;
+222 -48
View File
@@ -622,19 +622,16 @@ fn rebuildIfDirty(self: *StyleManager) !void {
pub fn isHidden(self: *StyleManager, el: *Element, options: CheckVisibilityOptions) bool {
self.assertOwns(el);
self.rebuildIfDirty() catch return false;
if (!options.ancestors) {
return self.visibilityProps(el).probe(.hidden, options);
}
return self.anyInChain(el, .hidden, options);
return self.visibilityProps(el).isHidden(options);
}
/// Computed display:none for a single element (own property, no ancestor walk).
/// The element's own display:none. Use `isHidden` to see if it's hidden by an ancestor
/// Honors the UA stylesheet rules per HTML Rendering §15.3.1 "Hidden elements".
pub fn hasDisplayNone(self: *StyleManager, el: *Element) bool {
return self.display(el) == .none;
}
/// Own property, no ancestor walk; honors the UA hidden-element rules.
/// Own property, not inherited; honors the UA hidden-element rules.
pub fn display(self: *StyleManager, el: *Element) Display {
self.assertOwns(el);
self.rebuildIfDirty() catch return .other;
@@ -652,20 +649,19 @@ pub fn hasAuthorDisplayNone(self: *StyleManager, el: *Element) bool {
return p.author_display and p.display == .none;
}
/// Computed visibility:hidden for an element, considering only the `visibility`
/// chain (walks ancestors since `visibility` inherits by default). Ignores
/// Computed visibility:hidden, which inherits from the ancestors. Ignores
/// display:none: an ancestor with display:none means the element isn't
/// rendered, but its computed `visibility` still reflects inherited visibility.
pub fn hasVisibilityHiddenInherited(self: *StyleManager, el: *Element) bool {
self.assertOwns(el);
self.rebuildIfDirty() catch return false;
return self.anyInChain(el, .visibility, .{});
return self.visibilityProps(el).visibility_hidden;
}
pub fn hasPointerEventsNone(self: *StyleManager, el: *Element) bool {
self.assertOwns(el);
self.rebuildIfDirty() catch return false;
return self.anyInChain(el, .pointer_events, .{});
return self.visibilityProps(el).pointer_events_none;
}
/// The axes along which `el` is a scroll container: its own computed overflow
@@ -701,19 +697,68 @@ pub fn inlineSize(self: *StyleManager, el: *Element, comptime axis: Element.Axis
return length.resolve(self.frame.page.getViewport());
}
fn anyInChain(self: *StyleManager, el: *Element, comptime what: Visibility.Probe, options: CheckVisibilityOptions) bool {
fn visibilityProps(self: *StyleManager, el: *Element) Visibility.Computed {
const Inherited = std.meta.FieldEnum(Visibility.Computed);
const inherited = Visibility.Computed.inherited;
const group = &self.visibility;
const allocator = self.arena.allocator();
var base: Visibility.Computed = .{};
var reach: std.EnumArray(Inherited, u32) = .initFill(0);
var own: Visibility.Computed = .{};
var len: u32 = 0;
// Up to the first memoized ancestor
var current: ?*Element = el;
while (current) |elem| : (current = elem.parentElement()) {
if (self.visibilityProps(elem).probe(what, options)) {
return true;
const entry = group.memoEntry(allocator, elem, self.frame);
if (entry) |gop| {
if (gop.found_existing) {
base = gop.value_ptr.*;
break;
}
}
const props: Visibility.Computed = .fromOwn(group.compute(elem, self.frame));
if (entry) |gop| {
gop.value_ptr.* = props;
}
if (len == 0) {
own = props;
}
len += 1;
inline for (inherited) |field| {
if (@field(props, field)) {
reach.set(@field(Inherited, field), len);
}
}
}
return false;
}
if (len == 0) {
return base;
}
/// Callers must have run rebuildIfDirty, which resets the memo.
fn visibilityProps(self: *StyleManager, el: *Element) Visibility.Computed {
return self.visibility.ownProps(self.arena.allocator(), el, self.frame);
// The same path again, adding what each element inherits.
var result = own;
current = el;
for (0..len) |distance| {
const elem = current.?;
var above = base;
inline for (inherited) |field| {
if (reach.get(@field(Inherited, field)) > distance) {
@field(above, field) = true;
}
}
if (group.memo.getPtr(elem)) |entry| {
entry.* = entry.inherit(above);
if (distance == 0) {
result = entry.*;
}
} else if (distance == 0) {
result = own.inherit(above);
}
current = elem.parentElement();
}
return result;
}
/// Callers must have run rebuildIfDirty, which resets the memo.
@@ -736,14 +781,17 @@ fn Group(comptime Spec: type) type {
return struct {
const Self = @This();
const Declared = Spec.Declared;
// What we store in our memo
const Computed = Spec.Computed;
// The element's own value, only used while resolving, never stored
const Cascaded = if (@hasDecl(Spec, "Cascaded")) Spec.Cascaded else Computed;
const Field = std.meta.FieldEnum(Declared);
const fields = @typeInfo(Declared).@"struct".field_names;
comptime {
// compute copies each declared value into its Computed namesake
// compute copies each declared value into its Cascaded namesake
for (fields) |field| {
std.debug.assert(@FieldType(Computed, field) == @typeInfo(@FieldType(Declared, field)).optional.child);
std.debug.assert(@FieldType(Cascaded, field) == @typeInfo(@FieldType(Declared, field)).optional.child);
}
}
@@ -770,7 +818,7 @@ fn Group(comptime Spec: type) type {
// skip the cascade on the many pages without one.
has_important: bool = false,
// Own-element results, valid while Page.style_version == memo_version.
// Valid while Page.style_version == memo_version.
memo: std.AutoHashMapUnmanaged(*Element, Computed) = .empty,
memo_version: usize = 0,
@@ -832,25 +880,31 @@ fn Group(comptime Spec: type) type {
}
fn ownProps(self: *Self, allocator: Allocator, el: *Element, frame: *Frame) Computed {
comptime std.debug.assert(Cascaded == Computed);
const gop = self.memoEntry(allocator, el, frame) orelse return self.compute(el, frame);
if (gop.found_existing == false) {
gop.value_ptr.* = self.compute(el, frame);
}
return gop.value_ptr.*;
}
// Null when the memo can't grow. A new entry's value is undefined, and
// the pointer is invalidated by the next insert.
fn memoEntry(self: *Self, allocator: Allocator, el: *Element, frame: *Frame) ?std.AutoHashMapUnmanaged(*Element, Computed).GetOrPutResult {
const version = frame.page.style_version;
if (self.memo_version != version) {
self.memo.clearRetainingCapacity();
self.memo_version = version;
}
const gop = self.memo.getOrPut(allocator, el) catch |err| {
return self.memo.getOrPut(allocator, el) catch |err| {
log.warn(.browser, "StyleManager memo", .{ .err = err });
return self.compute(el, frame);
return null;
};
if (gop.found_existing) {
return gop.value_ptr.*;
}
gop.value_ptr.* = self.compute(el, frame);
return gop.value_ptr.*;
}
fn compute(self: *const Self, el: *Element, frame: *Frame) Computed {
var p: Computed = .{};
fn compute(self: *const Self, el: *Element, frame: *Frame) Cascaded {
var p: Cascaded = .{};
var priorities: Priorities(Declared) = .initFill(0);
const inline_style = inlineDeclared(Declared, el, frame);
@@ -879,7 +933,7 @@ fn Group(comptime Spec: type) type {
if (self.has_important == false or declaresAny(declared) == false) {
return false;
}
var p: Computed = .{};
var p: Cascaded = .{};
var priorities: Priorities(Declared) = .initFill(INLINE_IMPORTANT_PRIORITY);
inline for (fields) |field| {
if (@field(declared, field) != null) {
@@ -897,7 +951,7 @@ fn Group(comptime Spec: type) type {
return false;
}
fn applyRules(self: *const Self, p: *Computed, priorities: *Priorities(Declared), el: *Element, frame: *Frame) void {
fn applyRules(self: *const Self, p: *Cascaded, priorities: *Priorities(Declared), el: *Element, frame: *Frame) void {
if (el.getId()) |id| {
if (self.id_rules.get(id)) |rules| {
checkRules(&rules, p, priorities, el, frame);
@@ -920,7 +974,7 @@ fn Group(comptime Spec: type) type {
checkRules(&self.other_rules, p, priorities, el, frame);
}
fn checkRules(rules: *const RuleList, p: *Computed, priorities: *Priorities(Declared), el: *Element, frame: *Frame) void {
fn checkRules(rules: *const RuleList, p: *Cascaded, priorities: *Priorities(Declared), el: *Element, frame: *Frame) void {
for (rules.items(.priority), rules.items(.props), rules.items(.selector)) |priority, rule, selector| {
// Only rules that set a property nothing stronger has set yet are
// worth matching.
@@ -1255,7 +1309,8 @@ const Visibility = struct {
}
};
const Computed = packed struct(u6) {
// The element's own values, from the cascade.
pub const Cascaded = packed struct(u6) {
// Author value (inline or sheet). Without `author_display` it's the UA
// fallback: .none when matchesUaDisplayNoneRule, else .other.
display: Display = .other,
@@ -1263,26 +1318,51 @@ const Visibility = struct {
visibility_hidden: bool = false,
opacity_zero: bool = false,
pointer_events_none: bool = false,
fn probe(self: Computed, comptime what: Probe, options: CheckVisibilityOptions) bool {
return switch (what) {
.hidden => self.display == .none or
(options.check_visibility and self.visibility_hidden) or
(options.check_opacity and self.opacity_zero),
.visibility => self.visibility_hidden,
.pointer_events => self.pointer_events_none,
};
}
};
const Probe = enum { hidden, visibility, pointer_events };
const Computed = packed struct(u7) {
display: Display = .other,
author_display: bool = false,
visibility_hidden: bool = false, // inherited
pointer_events_none: bool = false, // inherited
in_display_none: bool = false, // This element or an ancestor
in_opacity_zero: bool = false, // This element or an ancestor
// Set on an element when set on its parent
const inherited = [_][]const u8{ "visibility_hidden", "pointer_events_none", "in_display_none", "in_opacity_zero" };
fn fromOwn(own: Cascaded) Computed {
return .{
.display = own.display,
.author_display = own.author_display,
.visibility_hidden = own.visibility_hidden,
.pointer_events_none = own.pointer_events_none,
.in_display_none = own.display == .none,
.in_opacity_zero = own.opacity_zero,
};
}
fn inherit(self: Computed, parent: Computed) Computed {
var result = self;
inline for (inherited) |field| {
@field(result, field) = @field(self, field) or @field(parent, field);
}
return result;
}
fn isHidden(self: Computed, options: CheckVisibilityOptions) bool {
return self.in_display_none or
(options.check_visibility and self.visibility_hidden) or
(options.check_opacity and self.in_opacity_zero);
}
};
// UA stylesheet display:none fallback (HTML Rendering §15.3.1 "Hidden
// elements"). Applied only when no author rule for `display` matched the
// element — per CSS Cascade §6.1 any normal-origin author rule beats UA
// origin regardless of specificity, so `.x { display: flex }` on a
// `<div class="x" hidden>` must report visible.
pub fn finish(p: *Computed, el: *Element, priorities: *const Priorities(Declared)) void {
pub fn finish(p: *Cascaded, el: *Element, priorities: *const Priorities(Declared)) void {
p.author_display = priorities.get(.display) != 0;
if (!p.author_display and matchesUaDisplayNoneRule(el)) {
p.display = .none;
@@ -1451,8 +1531,6 @@ const MAX_DOC_ORDER: u32 = std.math.maxInt(u22) - 1;
const CheckVisibilityOptions = struct {
check_visibility: bool = false,
check_opacity: bool = false,
// false is only sound when every ancestor is already known visible.
ancestors: bool = true,
};
// Inline styles win over the stylesheets of the same importance, and the
@@ -2047,6 +2125,102 @@ test "StyleManager: memo: reuse and invalidation" {
try testing.expectEqual(2, sm.visibility.memo.count());
}
test "StyleManager: memo: inherited values, any query order" {
const frame = try testing.createFrame();
defer testing.test_session.closeAllPages();
const sm = &frame._style_manager;
const div = try frame.window._document.createElement("div", null, frame);
try Frame.parse.htmlAsChildren(frame, div.asNode(),
\\<p><b style="pointer-events: none"><i style="visibility: hidden"><s style="opacity: 0"><u></u></s></i></b></p>
);
const p = div.asNode().firstChild().?.as(Element);
const b = p.asNode().firstChild().?.as(Element);
const i = b.asNode().firstChild().?.as(Element);
const s = i.asNode().firstChild().?.as(Element);
const u = s.asNode().firstChild().?.as(Element);
// The deepest first stores every ancestor, each resolved against its parent
try testing.expectEqual(true, sm.hasPointerEventsNone(u));
try testing.expectEqual(6, sm.visibility.memo.count());
try testing.expectEqual(Visibility.Computed{ .visibility_hidden = true, .pointer_events_none = true, .in_opacity_zero = true }, sm.visibility.memo.get(u).?);
try testing.expectEqual(Visibility.Computed{ .visibility_hidden = true, .pointer_events_none = true }, sm.visibility.memo.get(i).?);
try testing.expectEqual(Visibility.Computed{}, sm.visibility.memo.get(p).?);
try testing.expectEqual(false, sm.isHidden(u, .{}));
try testing.expectEqual(true, sm.isHidden(u, .{ .check_visibility = true }));
try testing.expectEqual(true, sm.isHidden(u, .{ .check_opacity = true }));
try testing.expectEqual(true, sm.isHidden(s, .{ .check_opacity = true }));
try testing.expectEqual(false, sm.isHidden(i, .{ .check_opacity = true }));
try testing.expectEqual(true, sm.hasVisibilityHiddenInherited(i));
try testing.expectEqual(false, sm.hasVisibilityHiddenInherited(b));
try testing.expectEqual(true, sm.hasPointerEventsNone(b));
try testing.expectEqual(false, sm.hasPointerEventsNone(p));
// A DOM change drops the memo; a middle element first, then below and above it
try p.setStyle("display: none", frame);
try testing.expectEqual(true, sm.isHidden(i, .{}));
try testing.expectEqual(true, sm.isHidden(u, .{}));
// display itself isn't inherited
try testing.expectEqual(false, sm.hasDisplayNone(u));
try testing.expectEqual(true, sm.hasDisplayNone(p));
try testing.expectEqual(true, sm.hasPointerEventsNone(u));
try testing.expectEqual(false, sm.hasPointerEventsNone(p));
try testing.expectEqual(true, sm.isHidden(p, .{}));
try testing.expectEqual(false, sm.isHidden(div, .{}));
try p.setStyle("", frame);
try testing.expectEqual(false, sm.isHidden(u, .{}));
try testing.expectEqual(true, sm.hasPointerEventsNone(s));
}
// Every element of a deep chain probed in document order, the shape of an
// interactivity pass. Walking all ancestors per probe is quadratic, which only
// the growth between two depths a factor of TIMES apart tells apart.
test "StyleManager: memo: probing a deep tree stays linear" {
const frame = try testing.createFrame();
defer testing.test_session.closeAllPages();
const SMALL = 1000;
const TIMES = 10;
// well above TIMES, well below TIMES squared
const LIMIT = TIMES * 3;
const small = try buildDivChain(frame, SMALL);
const large = try buildDivChain(frame, SMALL * TIMES);
const small_us = probeChain(frame, small);
const large_us = probeChain(frame, large);
const ratio = @as(f64, @floatFromInt(large_us)) / @as(f64, @floatFromInt(@max(small_us, 1)));
try testing.expect(ratio < LIMIT);
}
fn buildDivChain(frame: *Frame, depth: usize) !*Element {
const doc = frame.window._document;
// Bottom-up: appending under a deep parent walks its ancestors
var top = try doc.createElement("div", null, frame);
try top.setStyle("pointer-events: none", frame);
for (1..depth) |_| {
const div = try doc.createElement("div", null, frame);
_ = try div.asNode().appendChild(top.asNode(), frame);
top = div;
}
return top;
}
fn probeChain(frame: *Frame, top: *Element) u64 {
const sm = &frame._style_manager;
const start = lp.datetime.microTimestamp(.awake);
var current: ?*Element = top;
while (current) |el| {
const child = if (el.asNode().firstChild()) |c| c.as(Element) else null;
// only the deepest one declares it
std.debug.assert(sm.hasPointerEventsNone(el) == (child == null));
current = child;
}
return @intCast(lp.datetime.microTimestamp(.awake) - start);
}
test "StyleManager: ruleInserted: append joins the buckets without a rebuild" {
const frame = try testing.createFrame();
defer testing.test_session.closeAllPages();
-6
View File
@@ -41,12 +41,6 @@ pub fn dispatchInputAndChangeEvents(el: *Element, frame: *Frame) !void {
pub fn click(node: *DOMNode, frame: *Frame) !void {
const el = node.is(Element) orelse return error.InvalidNodeType;
if (el.isDisabled()) {
return;
}
Frame.user_input.updateHoverTarget(frame, el, .{ .with_pointer = true });
Frame.user_input.triggerClick(frame, el, .{}) catch |err| {
lp.log.debug(.app, "click failed", .{ .err = err });
return error.ActionFailed;
+4 -1
View File
@@ -24,6 +24,7 @@ const LimitedWriter = @import("../LimitedWriter.zig");
const Node = @import("webapi/Node.zig");
const Slot = @import("webapi/element/html/Slot.zig");
const IFrame = @import("webapi/element/html/IFrame.zig");
const Template = @import("webapi/element/html/Template.zig");
pub const Opts = struct {
with_base: bool = false,
@@ -307,7 +308,9 @@ const Walk = struct {
if (opts.with_frames and el.is(IFrame) != null) {
return self.open(end_tag, .{ .document = el.as(IFrame).getContentDocument() });
}
if (node.firstChild()) |first| {
// A template serializes its contents, not its own children.
const content_root = if (el.is(Template)) |template| template.getContent().asNode() else node;
if (content_root.firstChild()) |first| {
return self.open(end_tag, .{ .siblings = first });
}
// No children: skip the stack
+230 -192
View File
@@ -56,9 +56,6 @@ const HoverContext = struct {
y: f64 = 0,
buttons: u16 = 0,
modifiers: Modifiers = .{},
// WebDriver's pointer source also fires the pointerover/out/enter/leave
// twins; the CDP mouse path only synthesizes mouse events.
with_pointer: bool = false,
};
// Update the element being hovered. The page always tracks the currently
@@ -76,13 +73,7 @@ pub fn updateHoverTarget(frame: *Frame, to: ?*Element, ctx: HoverContext) void {
const pivot: ?*Node = blk: {
const a = from orelse break :blk null;
const b = to orelse break :blk null;
var current: ?*Node = a.asNode();
while (current) |node| : (current = node.parentNode()) {
if (node.contains(b.asNode())) {
break :blk node;
}
}
break :blk null;
break :blk commonAncestor(a.asNode(), b.asNode());
};
if (from) |old| {
@@ -134,30 +125,30 @@ fn dispatchBoundaryEvent(frame: *Frame, target: *Element, comptime mouse_typ: []
const modifiers = ctx.modifiers;
const related_target = if (related) |r| r.asEventTarget() else null;
if (ctx.with_pointer) {
const pointer_event = PointerEvent.initTrusted(pointer_typ, .{
.bubbles = bubbling,
.cancelable = bubbling,
.composed = bubbling,
.clientX = ctx.x,
.clientY = ctx.y,
.buttons = ctx.buttons,
.pointerId = 1,
.pointerType = "mouse",
.isPrimary = true,
.relatedTarget = related_target,
.ctrlKey = modifiers.ctrl,
.shiftKey = modifiers.shift,
.altKey = modifiers.alt,
.metaKey = modifiers.meta,
}, frame) catch |err| {
log.debug(.frame, "boundary pointer event", .{ .err = err, .type = pointer_typ });
return;
};
frame._event_manager.dispatch(target.asEventTarget(), pointer_event.asEvent()) catch |err| {
log.debug(.frame, "boundary pointer dispatch", .{ .err = err, .type = pointer_typ });
};
}
const pointer_event = PointerEvent.initTrusted(pointer_typ, .{
.bubbles = bubbling,
.cancelable = bubbling,
.composed = bubbling,
.clientX = ctx.x,
.clientY = ctx.y,
// No button changed state: https://www.w3.org/TR/pointerevents3/#the-button-property
.button = -1,
.buttons = ctx.buttons,
.pointerId = 1,
.pointerType = "mouse",
.isPrimary = true,
.relatedTarget = related_target,
.ctrlKey = modifiers.ctrl,
.shiftKey = modifiers.shift,
.altKey = modifiers.alt,
.metaKey = modifiers.meta,
}, frame) catch |err| {
log.debug(.frame, "boundary pointer event", .{ .err = err, .type = pointer_typ });
return;
};
frame._event_manager.dispatch(target.asEventTarget(), pointer_event.asEvent()) catch |err| {
log.debug(.frame, "boundary pointer dispatch", .{ .err = err, .type = pointer_typ });
};
const mouse_event = MouseEvent.initTrusted(comptime .wrap(mouse_typ), .{
.bubbles = bubbling,
@@ -180,63 +171,75 @@ fn dispatchBoundaryEvent(frame: *Frame, target: *Element, comptime mouse_typ: []
};
}
/// Event fields for the trusted mouse/pointer dispatchers, bundled so `button`
/// (which button changed) and `buttons` (the held mask) can't be transposed.
const PointerInput = struct {
x: f64,
y: f64,
const Gesture = struct {
button: i32 = mouse_button.main,
buttons: u16 = 0,
detail: u32 = 0,
buttons_down: u16 = 0,
click_count: u32 = 0,
x: f64 = 0,
y: f64 = 0,
modifiers: Modifiers = .{},
emit_mouse_compat: bool = true,
};
/// Dispatch a trusted mouse event; returns whether preventDefault() cancelled it.
fn dispatchMouseEventOn(frame: *Frame, target: *Element, comptime typ: []const u8, in: PointerInput) !bool {
const event: *MouseEvent = try .initTrusted(comptime .wrap(typ), .{
.bubbles = true,
.cancelable = true,
.composed = true,
.clientX = in.x,
.clientY = in.y,
.button = in.button,
.buttons = in.buttons,
.detail = in.detail,
.ctrlKey = in.modifiers.ctrl,
.shiftKey = in.modifiers.shift,
.altKey = in.modifiers.alt,
.metaKey = in.modifiers.meta,
}, frame);
return frame._event_manager.dispatchCancelable(target.asEventTarget(), event.asEvent());
}
/// Dispatch a trusted pointer event (always mouse-sourced: pointerType,
/// pointerId, isPrimary fixed); returns whether preventDefault() cancelled it.
fn dispatchPointerEventOn(frame: *Frame, target: *Element, comptime typ: []const u8, in: PointerInput) !bool {
/// Dispatch a trusted pointer event; returns whether preventDefault() cancelled it.
fn emitPointer(
frame: *Frame,
target: *Element,
typ: []const u8,
g: Gesture,
detail: u32,
) !bool {
const owner = target.ownerFrame(frame) orelse frame;
const event: *PointerEvent = try .initTrusted(typ, .{
.bubbles = true,
.cancelable = true,
.composed = true,
.clientX = in.x,
.clientY = in.y,
.button = in.button,
.buttons = in.buttons,
.detail = in.detail,
.clientX = g.x,
.clientY = g.y,
.button = g.button,
.buttons = g.buttons_down,
.detail = detail,
.pointerId = 1,
.pointerType = "mouse",
.isPrimary = true,
.pressure = if (in.buttons != 0) 0.5 else 0.0,
.ctrlKey = in.modifiers.ctrl,
.shiftKey = in.modifiers.shift,
.altKey = in.modifiers.alt,
.metaKey = in.modifiers.meta,
}, frame);
return frame._event_manager.dispatchCancelable(target.asEventTarget(), event.asEvent());
.pressure = if (g.buttons_down != 0) 0.5 else 0.0,
.ctrlKey = g.modifiers.ctrl,
.shiftKey = g.modifiers.shift,
.altKey = g.modifiers.alt,
.metaKey = g.modifiers.meta,
}, owner);
return owner._event_manager.dispatchCancelable(target.asEventTarget(), event.asEvent());
}
/// Dispatch a trusted mouse event; returns whether preventDefault() cancelled it.
fn emitMouse(
frame: *Frame,
target: *Element,
comptime typ: []const u8,
g: Gesture,
detail: u32,
) !bool {
const owner = target.ownerFrame(frame) orelse frame;
const event: *MouseEvent = try .initTrusted(comptime .wrap(typ), .{
.bubbles = true,
.cancelable = true,
.composed = true,
.clientX = g.x,
.clientY = g.y,
.button = g.button,
.buttons = g.buttons_down,
.detail = detail,
.ctrlKey = g.modifiers.ctrl,
.shiftKey = g.modifiers.shift,
.altKey = g.modifiers.alt,
.metaKey = g.modifiers.meta,
}, owner);
return owner._event_manager.dispatchCancelable(target.asEventTarget(), event.asEvent());
}
/// MouseEvent/PointerEvent.buttons bitmask for a MouseEvent.button value.
/// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
pub fn buttonsBitmask(button: i32) u16 {
fn buttonsBitmask(button: i32) u16 {
return switch (button) {
mouse_button.main => 1,
mouse_button.secondary => 2,
@@ -256,61 +259,142 @@ pub const PointerButtons = struct {
/// Whether the gesture's opening pointerdown suppressed the compat mouse
/// events; held for the whole gesture so each split message reads it here.
mousedown_suppressed: bool = false,
/// Where the gesture's pointerdown landed, until its first release fires
/// the gesture's one click.
down_target: ?*Element = null,
/// `starts_gesture` is false for a chorded press (another button held).
pub fn press(self: *PointerButtons, button: i32) struct { starts_gesture: bool, held: u16 } {
const bit = buttonsBitmask(button);
/// `g.buttons_down` is ignored: the held mask supplies it.
pub fn press(self: *PointerButtons, frame: *Frame, target: *Element, g: Gesture) !void {
const bit = buttonsBitmask(g.button);
const starts_gesture = self.held & ~bit == 0;
if (starts_gesture) {
self.down_target = target;
}
self.held |= bit;
return .{ .starts_gesture = starts_gesture, .held = self.held };
var pg = g;
pg.buttons_down = self.held;
const suppressed = try pressSequence(frame, target, pg, self.mousedown_suppressed);
if (starts_gesture) {
self.mousedown_suppressed = suppressed;
}
}
/// `ends_gesture` is the last held button releasing, which clears the
/// suppression flag; `was_suppressed` is that flag for this gesture.
pub fn release(self: *PointerButtons, button: i32) struct { ends_gesture: bool, held: u16, was_suppressed: bool } {
/// Returns the element the click fired at, if any. `g.buttons_down` is
/// ignored: the held mask supplies it.
pub fn release(self: *PointerButtons, frame: *Frame, target: *Element, g: Gesture) !?*Element {
const click_target = if (self.down_target) |down| commonClickTarget(down, target) else null;
const was_suppressed = self.mousedown_suppressed;
self.held &= ~buttonsBitmask(button);
const ends_gesture = self.held == 0;
if (ends_gesture) self.mousedown_suppressed = false;
return .{ .ends_gesture = ends_gesture, .held = self.held, .was_suppressed = was_suppressed };
self.down_target = null;
self.releaseButton(g.button);
var rg = g;
rg.buttons_down = self.held;
try releaseSequence(frame, target, rg, was_suppressed, click_target);
return click_target;
}
/// Discards an in-progress gesture (a press/release that hit no element).
/// The last held button releasing ends the gesture and clears its state.
fn releaseButton(self: *PointerButtons, button: i32) void {
self.held &= ~buttonsBitmask(button);
if (self.held == 0) {
self.mousedown_suppressed = false;
self.down_target = null;
}
}
/// Discards an in-progress gesture (a press that hit no element).
pub fn reset(self: *PointerButtons) void {
self.* = .{};
}
};
const PressResult = struct {
/// pointerdown's preventDefault() suppressed the compat mousedown here and
/// the paired mouseup on release.
suppress_mouse: bool,
/// mousedown's focus default action is suppressed (always when
/// suppress_mouse is).
suppress_focus: bool,
};
/// pointerdown, then mousedown unless pointerdown was cancelled. `in.detail`
/// applies to mousedown only.
fn dispatchPointerPress(frame: *Frame, target: *Element, in: PointerInput) !PressResult {
var pointer = in;
pointer.detail = 0;
const suppress_mouse = try dispatchPointerEventOn(frame, target, "pointerdown", pointer);
if (suppress_mouse) {
return .{ .suppress_mouse = true, .suppress_focus = true };
fn commonAncestor(a: *Node, b: *Node) ?*Node {
var current: ?*Node = a;
while (current) |node| : (current = node.parentNode()) {
if (node.contains(b)) {
return node;
}
}
const suppress_focus = try dispatchMouseEventOn(frame, target, "mousedown", in);
return .{ .suppress_mouse = false, .suppress_focus = suppress_focus };
return null;
}
/// pointerup, then mouseup unless the gesture's pointerdown was cancelled.
/// `in.detail` applies to mouseup only.
fn dispatchPointerRelease(frame: *Frame, target: *Element, in: PointerInput, suppress_mouse: bool) !void {
var pointer = in;
pointer.detail = 0;
_ = try dispatchPointerEventOn(frame, target, "pointerup", pointer);
if (suppress_mouse == false) {
_ = try dispatchMouseEventOn(frame, target, "mouseup", in);
/// A click whose mousedown and mouseup landed on different elements fires at
/// their nearest common inclusive ancestor element.
fn commonClickTarget(down: *Element, up: *Element) *Element {
if (down == up) {
return up;
}
const ancestor = commonAncestor(down.asNode(), up.asNode()) orelse return up;
return ancestor.is(Element) orelse up;
}
pub fn moveSequence(frame: *Frame, target: *Element, g: Gesture) !void {
if (g.emit_mouse_compat) {
updateHoverTarget(frame, target, .{ .x = g.x, .y = g.y, .buttons = g.buttons_down, .modifiers = g.modifiers });
}
// A move changes no button: https://www.w3.org/TR/pointerevents3/#the-button-property
var pg = g;
pg.button = -1;
_ = try emitPointer(frame, target, "pointermove", pg, 0);
if (g.emit_mouse_compat) {
_ = try emitMouse(frame, target, "mousemove", g, 0);
}
}
/// Returns whether the gesture's compat mouse events are suppressed: by the
/// opening pointerdown, or for a chorded press, `chord_suppressed` carried over.
fn pressSequence(frame: *Frame, target: *Element, g: Gesture, chord_suppressed: bool) !bool {
const starts_gesture = (g.buttons_down & ~buttonsBitmask(g.button)) == 0;
// A chorded press is a buttons-mask change (pointermove), not a second
// pointerdown: https://www.w3.org/TR/pointerevents3/#chorded-button-interactions
const suppressed = if (starts_gesture)
try emitPointer(frame, target, "pointerdown", g, 0)
else blk: {
_ = try emitPointer(frame, target, "pointermove", g, 0);
break :blk chord_suppressed;
};
if (!g.emit_mouse_compat) {
return suppressed;
}
// A disabled control gets the pointer events, contextmenu and auxclick,
// but no mouse events, click or focus, as in Chrome.
if (!suppressed and !target.isDisabled() and !try emitMouse(frame, target, "mousedown", g, g.click_count)) {
focusForMouseDown(frame, target) catch |err| log.debug(.app, "mousedown focus", .{ .err = err });
}
// Chrome on Linux and macOS fires contextmenu on press, even when the
// pointerdown was cancelled.
if (g.button == mouse_button.secondary) {
_ = try emitPointer(frame, target, "contextmenu", g, 0);
}
return suppressed;
}
/// A null `click_target` releases without a click, as for a later release in
/// a chord.
fn releaseSequence(frame: *Frame, up_target: *Element, g: Gesture, suppressed: bool, click_target: ?*Element) !void {
_ = try emitPointer(frame, up_target, if (g.buttons_down == 0) "pointerup" else "pointermove", g, 0);
if (g.emit_mouse_compat and !suppressed and !up_target.isDisabled()) {
_ = try emitMouse(frame, up_target, "mouseup", g, g.click_count);
}
// clickCount 0 releases without a click, as in Chrome.
const click_el = click_target orelse return;
if (!g.emit_mouse_compat or g.click_count == 0) {
return;
}
if (g.button == mouse_button.main) {
if (click_el.isDisabled()) {
return;
}
_ = try emitPointer(frame, click_el, "click", g, g.click_count);
if (g.click_count % 2 == 0) {
_ = try emitMouse(frame, click_el, "dblclick", g, g.click_count);
}
} else {
_ = try emitPointer(frame, click_el, "auxclick", g, g.click_count);
}
}
@@ -318,15 +402,12 @@ fn dispatchPointerRelease(frame: *Frame, target: *Element, in: PointerInput, sup
/// off pointerdown/mousedown, not click alone. A focus failure is logged, not
/// returned.
pub fn triggerClick(frame: *Frame, target: *Element, modifiers: Modifiers) !void {
const press = try dispatchPointerPress(frame, target, .{ .x = 0, .y = 0, .buttons = 1, .detail = 1, .modifiers = modifiers });
if (press.suppress_focus == false) {
focusForMouseDown(frame, target) catch |err| log.debug(.app, "click mousedown focus", .{ .err = err });
}
try moveSequence(frame, target, .{ .modifiers = modifiers });
const up: PointerInput = .{ .x = 0, .y = 0, .detail = 1, .modifiers = modifiers };
try dispatchPointerRelease(frame, target, up, press.suppress_mouse);
// click is a PointerEvent, matching HTMLElement.click().
_ = try dispatchPointerEventOn(frame, target, "click", up);
const g: Gesture = .{ .click_count = 1, .modifiers = modifiers };
var pointer: PointerButtons = .{};
try pointer.press(frame, target, g);
_ = try pointer.release(frame, target, g);
}
pub fn triggerMousePress(frame: *Frame, x: f64, y: f64, button: i32, click_count: i32) !void {
@@ -346,31 +427,14 @@ pub fn triggerMousePress(frame: *Frame, x: f64, y: f64, button: i32, click_count
});
}
const gesture = frame.page.input_pointer.press(button);
// clickCount 0 (omitted) stays 0, not forced to 1: Chrome and Firefox
// both fire mousedown with detail 0 in that case.
const detail: u32 = if (click_count > 0) @intCast(click_count) else 0;
const in: PointerInput = .{ .x = x, .y = y, .button = button, .buttons = gesture.held, .detail = detail };
if (gesture.starts_gesture) {
// Stash the pointerdown outcome before the fallible focus call: the
// release half is a separate message and can't observe it otherwise.
const press = try dispatchPointerPress(frame, target, in);
frame.page.input_pointer.mousedown_suppressed = press.suppress_mouse;
if (press.suppress_focus == false) {
try focusForMouseDown(frame, target);
}
} else {
// A chorded press is a buttons-mask change (pointermove), not a second
// pointerdown: https://www.w3.org/TR/pointerevents3/#chorded-button-interactions
_ = try dispatchPointerEventOn(frame, target, "pointermove", .{ .x = x, .y = y, .button = button, .buttons = gesture.held });
if (frame.page.input_pointer.mousedown_suppressed == false) {
const suppress_focus = try dispatchMouseEventOn(frame, target, "mousedown", in);
if (suppress_focus == false) {
try focusForMouseDown(frame, target);
}
}
}
try frame.page.input_pointer.press(frame, target, .{
.button = button,
// clickCount 0 (omitted) stays 0, not forced to 1: Chrome and Firefox
// both fire mousedown with detail 0 in that case.
.click_count = if (click_count > 0) @intCast(click_count) else 0,
.x = x,
.y = y,
});
}
pub fn triggerMouseMove(frame: *Frame, x: f64, y: f64) !void {
@@ -385,27 +449,21 @@ pub fn triggerMouseMove(frame: *Frame, x: f64, y: f64) !void {
});
}
updateHoverTarget(frame, target, .{ .x = x, .y = y });
const move_event: *MouseEvent = try .initTrusted(comptime .wrap("mousemove"), .{
.bubbles = true,
.cancelable = true,
.composed = true,
.clientX = x,
.clientY = y,
}, frame);
try frame._event_manager.dispatch(target.asEventTarget(), move_event.asEvent());
try moveSequence(frame, target, .{ .buttons_down = frame.page.input_pointer.held, .x = x, .y = y });
}
pub fn triggerMouseRelease(frame: *Frame, x: f64, y: f64, button: i32, click_count: i32) !void {
// Consume the state before any early return, so a release that misses
// every element can't leave it for the next message to misread.
const gesture = frame.page.input_pointer.release(button);
const remaining = gesture.held;
const ends_gesture = gesture.ends_gesture;
const was_suppressed = gesture.was_suppressed;
const target = (try frame.window._document.elementFromPoint(x, y, frame)) orelse return;
const pointer = &frame.page.input_pointer;
// A release that misses every element still lets go of the button, so
// the next message doesn't read it as held.
const hit = frame.window._document.elementFromPoint(x, y, frame) catch |err| {
pointer.releaseButton(button);
return err;
};
const target = hit orelse {
pointer.releaseButton(button);
return;
};
if (comptime lp.IS_DEBUG) {
log.debug(.frame, "frame mouse release", .{
.url = frame.url,
@@ -417,32 +475,12 @@ pub fn triggerMouseRelease(frame: *Frame, x: f64, y: f64, button: i32, click_cou
});
}
const detail: u32 = if (click_count > 0) @intCast(click_count) else 1;
if (ends_gesture) {
try dispatchPointerRelease(frame, target, .{ .x = x, .y = y, .button = button, .detail = detail }, was_suppressed);
} else {
// A chorded release (another button still held) is a buttons-mask
// change, not pointerup.
_ = try dispatchPointerEventOn(frame, target, "pointermove", .{ .x = x, .y = y, .button = button, .buttons = remaining });
if (!was_suppressed) {
_ = try dispatchMouseEventOn(frame, target, "mouseup", .{ .x = x, .y = y, .button = button, .buttons = remaining, .detail = detail });
}
}
// After mouseup, the activation event depends on the button.
switch (button) {
mouse_button.main => {
_ = try dispatchPointerEventOn(frame, target, "click", .{ .x = x, .y = y, .buttons = remaining, .detail = detail });
// A second click in quick succession also fires dblclick.
if (click_count == 2) {
_ = try dispatchMouseEventOn(frame, target, "dblclick", .{ .x = x, .y = y, .button = button, .buttons = remaining, .detail = detail });
}
},
mouse_button.auxiliary => _ = try dispatchMouseEventOn(frame, target, "auxclick", .{ .x = x, .y = y, .button = button, .buttons = remaining, .detail = detail }),
mouse_button.secondary => _ = try dispatchMouseEventOn(frame, target, "contextmenu", .{ .x = x, .y = y, .button = button, .buttons = remaining, .detail = detail }),
else => {},
}
_ = try pointer.release(frame, target, .{
.button = button,
.click_count = if (click_count > 0) @intCast(click_count) else 0,
.x = x,
.y = y,
});
}
pub fn triggerMouseWheel(frame: *Frame, x: f64, y: f64, delta_x: f64, delta_y: f64) !void {
+1 -1
View File
@@ -1375,7 +1375,7 @@ fn resolveT(comptime T: type, value: *T) Resolved {
const Meta = T.JsApi.Meta;
return .{
.ptr = value,
.class_id = Meta.class_id,
.class_id = if (@hasDecl(Meta, "wrap_as")) Meta.wrap_as.Meta.class_id else Meta.class_id,
.prototype_chain = &Meta.prototype_chain,
.finalizer = blk: {
const FT = (comptime findFinalizerType(T)) orelse break :blk null;
+50 -1
View File
@@ -66,6 +66,29 @@ fn getAnchorLabel(el: *Element) ?[]const u8 {
return el.getAttributeInterned("aria-label") orelse el.getAttributeInterned("title");
}
/// The fence info string for a `<pre>`: the `language-*` (or `lang-*`) class
/// on the `<pre>` itself or on a `<code>` that is its first element child.
fn codeLanguage(pre: *Element) ?[]const u8 {
if (classLanguage(pre)) |lang| return lang;
const child = pre.firstElementChild() orelse return null;
if (child.getTag() != .code) return null;
return classLanguage(child);
}
fn classLanguage(el: *Element) ?[]const u8 {
const class = el.getClassName() orelse return null;
var it = std.mem.tokenizeAny(u8, class, &std.ascii.whitespace);
while (it.next()) |token| {
for ([_][]const u8{ "language-", "lang-" }) |prefix| {
if (!std.mem.startsWith(u8, token, prefix)) continue;
const lang = token[prefix.len..];
// A backtick would end the fence's info string early.
if (lang.len > 0 and std.mem.findScalar(u8, lang, '`') == null) return lang;
}
}
return null;
}
// Iterative else large trees will stackoverflow
const Context = struct {
state: State,
@@ -209,7 +232,9 @@ const Context = struct {
self.state.last_char_was_newline = false;
},
.pre => {
try self.writer.writeAll("```\n");
try self.writer.writeAll("```");
if (codeLanguage(el)) |lang| try self.writer.writeAll(lang);
try self.writer.writeByte('\n');
self.state.pre_node = el.asNode();
self.state.last_char_was_newline = true;
},
@@ -629,6 +654,30 @@ test "browser.markdown: code" {
);
}
test "browser.markdown: code fence keeps the language" {
try testMarkdownHTML("<pre><code class=\"hljs language-zig\">const x = 1;</code></pre>",
\\
\\```zig
\\const x = 1;
\\```
\\
);
try testMarkdownHTML("<pre class=\"lang-sh\">ls</pre>",
\\
\\```sh
\\ls
\\```
\\
);
try testMarkdownHTML("<pre class=\"language-\">x</pre>",
\\
\\```
\\x
\\```
\\
);
}
test "browser.markdown: block link" {
try testMarkdownHTML(
\\<a href="https://example.com">
+26 -3
View File
@@ -46,6 +46,10 @@ pub const ParsedNode = extern struct {
// Set once html5ever has put the node in the tree or given it children.
// Until then the node is unobservable and its document is only a guess.
placed: bool = false,
// Memo of the node's root, valid while page.dom_version == root_version.
root: ?*Node = null,
root_version: usize = 0,
};
// Attributes of an element the parser rebuilds (see settleDocument): the ones
@@ -183,7 +187,7 @@ fn appendTextChunk(self: *Parser, parent: *Node, txt: []const u8) !void {
// Fresh text run: the first chunk lives on _data only. buf stays empty
// until (and unless) a second chunk arrives.
const new_text = try Frame.node_factory.createTextNode(parent.getDocument(self.frame), txt);
try self.frame.appendNew(parent, new_text);
try self.frame.appendNew(parent, new_text, null);
self.inserted_since_checkpoint +|= 1;
self.pending_text = .{
.parent = parent,
@@ -624,7 +628,7 @@ fn _appendDoctypeToDocument(self: *Parser, name: []const u8, public_id: []const
});
// Append it to the document
try frame.appendNew(self.container.node, doctype.asNode());
try frame.appendNew(self.container.node, doctype.asNode(), null);
}
fn addAttrsIfMissingCallback(ctx: *anyopaque, target_ref: *anyopaque, attributes: h5e.AttributeIterator) callconv(.c) void {
@@ -744,7 +748,10 @@ fn _appendCallback(self: *Parser, parent_pn: *ParsedNode, node_or_text: h5e.Node
return;
}
const child = try self.settleDocument(parent_pn, child_pn);
try self.frame.appendNew(parent, child);
const root = self.rootOf(parent_pn);
try self.frame.appendNew(parent, child, root);
child_pn.root = root;
child_pn.root_version = parent_pn.root_version;
},
.text => |txt| {
const parent = parent_pn.node;
@@ -755,6 +762,22 @@ fn _appendCallback(self: *Parser, parent_pn: *ParsedNode, node_or_text: h5e.Node
}
}
// Avoids walking to the root for every parsed element. When the parser inserts
// new node, the root node of existing nodes doesn't change and we don't bump
// dom_version, so we can cache this.
fn rootOf(self: *Parser, pn: *ParsedNode) *Node {
const version = self.frame.page.dom_version;
if (pn.root) |root| {
if (pn.root_version == version) {
return root;
}
}
const root = pn.node.getRootNode(.{});
pn.root = root;
pn.root_version = version;
return root;
}
fn settleDocument(self: *Parser, parent_pn: *ParsedNode, child_pn: *ParsedNode) !*Node {
const frame = self.frame;
const parent = parent_pn.node;
@@ -163,3 +163,39 @@
testing.expectEqual('initial', callbackCalls[1].newValue);
}
</script>
<script id="style_declaration">
{
let calls = [];
class StyleObserver extends HTMLElement {
static get observedAttributes() {
return ['style'];
}
attributeChangedCallback(name, oldValue, newValue) {
calls.push(newValue);
}
}
customElements.define('style-observer', StyleObserver);
const el = document.createElement('style-observer');
// each write runs the callback before returning
el.style.setProperty('color', 'red');
testing.expectEqual(['color: red;'], calls);
el.style.cssText = 'width: 1px;';
testing.expectEqual(2, calls.length);
el.style.borderWidth = '2px';
testing.expectEqual(3, calls.length);
el.style.cssFloat = 'left';
testing.expectEqual(4, calls.length);
el.style.removeProperty('width');
testing.expectEqual(5, calls.length);
testing.expectEqual(el.getAttribute('style'), calls[4]);
}
</script>
@@ -119,4 +119,57 @@
testing.expectEqual('value2', window.attrChangedCalls[1].newValue);
}
</script>
<script>
{
window.disconnectedParseCalls = [];
class DisconnectedParseElement extends HTMLElement {
constructor() {
super();
// No id yet when constructed synchronously by the parser.
window.disconnectedParseCalls.push('ctor');
}
connectedCallback() {
window.disconnectedParseCalls.push('connected ' + this.id);
}
}
customElements.define('disconnected-parse-element', DisconnectedParseElement);
}
</script>
<div id="detached-mid-parse"><script>document.getElementById('detached-mid-parse').remove();</script><disconnected-parse-element id="after-detach"></disconnected-parse-element></div>
<template id="parse-template"><disconnected-parse-element id="in-template"></disconnected-parse-element></template>
<script id="verify-disconnected-parse">
{
// The parser kept appending into a parent a script had detached: the
// element is constructed (synchronously, main-document parse) but never
// connected.
testing.expectEqual(null, document.getElementById('after-detach'));
testing.expectEqual('ctor', window.disconnectedParseCalls.join(','));
// Template contents are never connected (nor upgraded).
testing.expectEqual(null, document.getElementById('in-template'));
window.disconnectedParseCalls = [];
// A shadow root scopes ids even when its host is detached, but nothing in
// it is connected.
const host = document.createElement('div');
const shadow = host.attachShadow({mode: 'open'});
shadow.innerHTML = '<disconnected-parse-element id="in-detached-shadow"></disconnected-parse-element>';
testing.expectTrue(shadow.getElementById('in-detached-shadow') !== null);
// (Fragment-parse constructors still run synchronously, so only check
// that it isn't connected.)
testing.expectEqual(-1, window.disconnectedParseCalls.indexOf('connected in-detached-shadow'));
// Once the host is connected, so is the element.
document.body.appendChild(host);
testing.expectEqual('connected in-detached-shadow', window.disconnectedParseCalls.at(-1));
host.remove();
}
</script>
</body>
@@ -353,3 +353,25 @@
// testing.expectEqual('c', childCalls[0].newValue);
// }
</script>
<my-unresolved id="unresolved"></my-unresolved>
<script id="undefined_prototype">
{
const parsed = document.getElementById('unresolved');
testing.expectEqual(HTMLElement.prototype, Object.getPrototypeOf(parsed));
const created = document.createElement('my-unresolved');
testing.expectEqual(HTMLElement.prototype, Object.getPrototypeOf(created));
const windowless = document.implementation.createHTMLDocument('');
const imported = windowless.createElement('my-unresolved');
testing.expectEqual(HTMLElement.prototype, Object.getPrototypeOf(imported));
class MyUnresolved extends HTMLElement {}
customElements.define('my-unresolved', MyUnresolved);
testing.expectEqual(MyUnresolved.prototype, Object.getPrototypeOf(parsed));
// define() only upgrades connected elements
testing.expectEqual(HTMLElement.prototype, Object.getPrototypeOf(created));
testing.expectEqual(HTMLElement.prototype, Object.getPrototypeOf(imported));
}
</script>
+35
View File
@@ -429,3 +429,38 @@
testing.expectEqual('id', Object.getOwnPropertyDescriptor(attrs, 'id').value.name);
}
</script>
<script id=namespaced>
{
const XLINK = 'http://www.w3.org/1999/xlink';
const el = document.createElement('div');
el.setAttribute('xlink:href', '#a');
el.setAttribute('title', 't');
testing.expectEqual('#a', el.getAttributeNodeNS(XLINK, 'href').value);
testing.expectEqual('t', el.getAttributeNodeNS(null, 'title').value);
testing.expectEqual(null, el.getAttributeNodeNS(null, 'nope'));
el.removeAttributeNS(XLINK, 'href');
testing.expectEqual(false, el.hasAttribute('xlink:href'));
el.removeAttributeNS(null, 'title');
testing.expectEqual(false, el.hasAttribute('title'));
// removing a missing attribute is a no-op
el.removeAttributeNS(null, 'nope');
const attr = document.createAttribute('data-n');
attr.value = '1';
testing.expectEqual(null, el.setAttributeNodeNS(attr));
testing.expectEqual(el, attr.ownerElement);
const attrs = el.attributes;
testing.expectEqual(attr, attrs.getNamedItemNS(null, 'data-n'));
testing.expectEqual(null, attrs.getNamedItemNS(null, 'nope'));
testing.expectEqual(attr, attrs.removeNamedItemNS(null, 'data-n'));
testing.expectEqual(null, attr.ownerElement);
testing.expectEqual(0, attrs.length);
testing.expectEqual(null, attrs.setNamedItemNS(attr));
testing.expectEqual('1', el.getAttribute('data-n'));
}
</script>
@@ -284,3 +284,13 @@
testing.expectEqual('b', d.innerHTML);
}
</script>
<div id="tpl_parent"><template><b>x</b></template></div>
<script id="serialize_from_ancestor">
{
const parent = $('#tpl_parent');
testing.expectEqual('<template><b>x</b></template>', parent.innerHTML);
testing.expectEqual('<div id="tpl_parent"><template><b>x</b></template></div>', parent.outerHTML);
testing.expectEqual('<template><b>x</b></template>', parent.firstChild.outerHTML);
}
</script>
@@ -129,3 +129,38 @@
outer.remove();
}
</script>
<div id="rw">
<input id="rw_text">
<input id="rw_readonly" readonly>
<input id="rw_disabled" disabled>
<input id="rw_checkbox" type="checkbox">
<input id="rw_number" type="number">
<textarea id="rw_textarea"></textarea>
<textarea id="rw_textarea_ro" readonly></textarea>
<div id="rw_editable" contenteditable>
<p id="rw_editable_child"><b id="rw_editable_grandchild"></b></p>
<p id="rw_not_editable" contenteditable="false"><b id="rw_not_editable_child"></b></p>
</div>
<p id="rw_p"></p>
</div>
<script id="read_write">
{
const ids = (sel) => Array.from(document.querySelectorAll('#rw ' + sel)).map((e) => e.id).join();
testing.expectEqual('rw_text,rw_number,rw_textarea,rw_editable,rw_editable_child,rw_editable_grandchild', ids(':read-write'));
testing.expectEqual('rw_readonly,rw_disabled,rw_checkbox,rw_textarea_ro,rw_not_editable,rw_not_editable_child,rw_p', ids(':read-only'));
}
</script>
<ul id="nth_list"><li>1</li><li>2</li><li>3</li></ul>
<script id="nth_whitespace">
{
const texts = (sel) => Array.from(document.querySelectorAll(sel)).map((li) => li.textContent).join();
testing.expectEqual('1,3', texts('#nth_list li:nth-child(odd )'));
testing.expectEqual('1,3', texts('#nth_list li:nth-child( 2n+1 )'));
testing.expectEqual('2', texts('#nth_list li:nth-child( 2 )'));
testing.expectEqual('2', texts('#nth_list li:nth-last-child(even )'));
testing.expectEqual('3', texts('#nth_list li:nth-of-type( 3 )'));
testing.expectEqual('1', texts('#nth_list li:nth-last-of-type( 3 )'));
}
</script>
+1 -1
View File
@@ -61,7 +61,7 @@
window.disabledEvents = [];
const btnDisabled = document.getElementById('btnDisabled');
for (const t of ['pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click']) {
for (const t of ['pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click', 'contextmenu', 'auxclick']) {
btnDisabled.addEventListener(t, function(e) { window.disabledEvents.push(e.type); });
}
+33
View File
@@ -591,3 +591,36 @@
});
}
</script>
<script id=fetch_bad_content_encoding type=module>
{
const state = await testing.async();
const url = 'http://127.0.0.1:9582/xhr/bad_gzip';
const response = await fetch(url);
const errors = [];
for (const method of ['arrayBuffer', 'blob', 'bytes', 'formData', 'json', 'text']) {
const res = await fetch(url);
try {
await res[method]();
errors.push(null);
} catch (e) {
errors.push([e instanceof TypeError, res.bodyUsed]);
}
}
let stream_error = null;
try {
await response.body.getReader().read();
} catch (e) {
stream_error = e;
}
state.resolve();
await state.done(() => {
testing.expectEqual(200, response.status);
for (const err of errors) {
testing.expectEqual([true, true], err);
}
testing.expectEqual(true, stream_error !== null);
});
}
</script>
+15
View File
@@ -42,3 +42,18 @@
testing.expectEqual('attr2', attr.textContent);
testing.expectEqual(div, $('#attr2'));
</script>
<script id=null_and_undefined>
const p = document.createElement('p');
p.innerHTML = '<b>x</b>';
p.textContent = null;
testing.expectEqual('<p></p>', p.outerHTML);
p.innerHTML = '<b>x</b>';
p.textContent = undefined;
testing.expectEqual('<p></p>', p.outerHTML);
const text = document.createTextNode('abc');
text.textContent = null;
testing.expectEqual('', text.data);
</script>
+5
View File
@@ -604,3 +604,8 @@
});
}
</script>
<script id=timeOrigin_is_unix_epoch>
// timeOrigin + now() is the current wall-clock time, like Date.now().
testing.expectEqual(true, Math.abs(performance.timeOrigin + performance.now() - Date.now()) < 1000);
</script>
+4
View File
@@ -17,6 +17,10 @@
</form>
<script>
window.events = [];
window.over = [];
for (const type of ['pointerover', 'mouseover']) {
document.addEventListener(type, (e) => window.over.push(`${type}:${e.button}:${e.buttons}@${e.target.id}`));
}
for (const type of ['click', 'input', 'change', 'keydown', 'focus', 'blur']) {
document.addEventListener(type, (e) => {
const key = type === 'keydown' ? ':' + (e.shiftKey ? 'S-' : '') + e.key : '';
+14
View File
@@ -81,3 +81,17 @@
testing.expectEqual(true, threw);
</script>
<script id=negative_and_overflowing_delay type=module>
{
const state = await testing.async();
const fired = [];
window.setTimeout(() => fired.push('negative'), -10);
window.setTimeout(() => fired.push('overflow'), 2 ** 31);
window.setTimeout(() => state.resolve(), 20);
await state.done(() => {
testing.expectEqual('negative,overflow', fired.join());
});
}
</script>
+34 -5
View File
@@ -708,16 +708,21 @@ pub fn getAttributeNS(
local_name: String,
frame: *Frame,
) !?String {
return self.getAttribute(try self.attributeNameNS(namespace_, local_name, frame), frame);
}
// The stored name a namespaced lookup resolves to. We don't really support
// namespaces, but if the namespace has a fixed prefix and the prefixed
// attribute exists, that's the one.
pub fn attributeNameNS(self: *const Element, namespace_: ?[]const u8, local_name: String, frame: *Frame) !String {
if (namespace_) |namespace| {
// we don't really support namespaces, but if the namespace has a fixed
// prefix, we can try to fetch the attribute with it
if (try prefixedAttributeName(namespace, local_name.str(), frame)) |prefixed| {
if (try self.getAttribute(.wrap(prefixed), frame)) |value| {
return value;
if (try self.hasAttribute(.wrap(prefixed), frame)) {
return .wrap(prefixed);
}
}
}
return self.getAttribute(local_name, frame);
return local_name;
}
fn prefixedAttributeName(namespace: []const u8, local_name: []const u8, frame: *Frame) !?[]const u8 {
@@ -833,6 +838,10 @@ pub fn getAttributeNode(self: *Element, name: String, frame: *Frame) !?*Attribut
return self._attributes.getAttribute(name, self, frame);
}
pub fn getAttributeNodeNS(self: *Element, namespace_: ?[]const u8, local_name: String, frame: *Frame) !?*Attribute {
return self.getAttributeNode(try self.attributeNameNS(namespace_, local_name, frame), frame);
}
pub fn setAttribute(self: *Element, name: String, value: String, frame: *Frame) !void {
try Attribute.validateAttributeName(name);
_ = try self._attributes.put(name, value, self, frame);
@@ -977,6 +986,10 @@ pub fn removeAttribute(self: *Element, name: String, frame: *Frame) !void {
return self._attributes.delete(name, self, frame);
}
pub fn removeAttributeNS(self: *Element, namespace_: ?[]const u8, local_name: String, frame: *Frame) !void {
return self.removeAttribute(try self.attributeNameNS(namespace_, local_name, frame), frame);
}
pub fn removeAttributeSafe(self: *Element, name: String, frame: *Frame) void {
self._attributes.deleteSafe(name, self, frame);
}
@@ -1213,6 +1226,18 @@ pub fn isEditingHost(self: *Element) bool {
return std.ascii.eqlIgnoreCase(value, "false") == false;
}
// An editing host or a descendant of one: the nearest contenteditable
// attribute decides.
pub fn isEditable(self: *Element) bool {
var current: ?*Element = self;
while (current) |el| : (current = el.parentElement()) {
if (el.getAttributeSafe(.wrap("contenteditable")) != null) {
return el.isEditingHost();
}
}
return false;
}
/// Focusable without a tabindex attribute.
fn isNativelyFocusable(self: *Element) bool {
if (self.is(Html) == null) {
@@ -2694,8 +2719,12 @@ pub const JsApi = struct {
pub const getAttribute = bridge.function(Element.getAttribute, .{});
pub const getAttributeNS = bridge.function(Element.getAttributeNS, .{});
pub const getAttributeNode = bridge.function(Element.getAttributeNode, .{});
pub const getAttributeNodeNS = bridge.function(Element.getAttributeNodeNS, .{});
pub const setAttributeNode = bridge.function(Element.setAttributeNode, .{ .ce_reactions = true });
// Attributes don't carry a namespace, so this is setAttributeNode.
pub const setAttributeNodeNS = bridge.function(Element.setAttributeNode, .{ .ce_reactions = true });
pub const removeAttribute = bridge.function(Element.removeAttribute, .{ .ce_reactions = true });
pub const removeAttributeNS = bridge.function(Element.removeAttributeNS, .{ .ce_reactions = true });
pub const toggleAttribute = bridge.function(Element.toggleAttribute, .{ .ce_reactions = true });
pub const getAttributeNames = bridge.function(Element.getAttributeNames, .{});
pub const removeAttributeNode = bridge.function(Element.removeAttributeNode, .{ .ce_reactions = true });
+5 -1
View File
@@ -1792,7 +1792,11 @@ pub const JsApi = struct {
}.wrap, null, .{});
pub const nodeType = bridge.accessor(Node.getNodeType, null, .{});
pub const textContent = bridge.accessor(_textContext, Node.setTextContent, .{ .ce_reactions = true });
pub const textContent = bridge.accessor(_textContext, _setTextContent, .{ .ce_reactions = true });
// textContent is a nullable DOMString: null (and undefined) mean the empty string.
fn _setTextContent(self: *Node, data: ?[]const u8, frame: *Frame) !void {
return self.setTextContent(data orelse "", frame);
}
fn _textContext(self: *Node, frame: *const Frame) !?[]const u8 {
// cdata and attributes can return value directly, avoiding the copy
switch (self._type) {
+10 -5
View File
@@ -46,6 +46,8 @@ pub const Proto = EventTarget;
_proto: *EventTarget,
_time_origin: u64,
// Wall-clock (Unix epoch) microseconds at the same moment, exposed as timeOrigin.
_time_origin_unix: u64,
_arena: Allocator,
_factory: *Factory,
// Marks and measures. Kept in startTime order (see insertOrdered), as the
@@ -78,10 +80,12 @@ _delivering: bool = false,
/// Get high-resolution timestamp in microseconds, rounded to 5μs increments
/// to match browser behavior (prevents fingerprinting)
pub fn highResTimestamp() u64 {
const micros = lp.datetime.microTimestamp(.boot);
// Round to nearest 5 microseconds (like Firefox default)
const rounded = @divTrunc(micros + 2, 5) * 5;
return rounded;
return roundMicros(lp.datetime.microTimestamp(.boot));
}
// Round to nearest 5 microseconds (like Firefox default)
fn roundMicros(micros: u64) u64 {
return @divTrunc(micros + 2, 5) * 5;
}
pub fn init(factory: *Factory, arena: Allocator) !*Performance {
@@ -90,6 +94,7 @@ pub fn init(factory: *Factory, arena: Allocator) !*Performance {
._arena = arena,
._factory = factory,
._time_origin = highResTimestamp(),
._time_origin_unix = roundMicros(lp.datetime.microTimestamp(.real)),
});
}
@@ -115,7 +120,7 @@ pub fn now(self: *const Performance) f64 {
fn getTimeOrigin(self: *const Performance) f64 {
// Return as milliseconds
return @as(f64, @floatFromInt(self._time_origin)) / 1000.0;
return @as(f64, @floatFromInt(self._time_origin_unix)) / 1000.0;
}
fn getNavigation(self: *Performance) *PerformanceNavigation {
+5
View File
@@ -88,6 +88,11 @@ const ScheduleOpts = struct {
mode: Mode = .normal,
};
// setTimeout/setInterval take the delay as a WebIDL long: wrapped to 32 bits, negatives clamped to 0.
pub fn delayFromJs(delay_ms: ?i32) u32 {
return @intCast(@max(delay_ms orelse 0, 0));
}
pub fn schedule(
self: *Timers,
exec: *js.Execution,
+21 -120
View File
@@ -29,9 +29,7 @@ const Element = @import("Element.zig");
const EventTarget = @import("EventTarget.zig");
const Cookie = @import("storage/Cookie.zig");
const MouseEvent = @import("event/MouseEvent.zig");
const TouchEvent = @import("event/TouchEvent.zig");
const PointerEvent = @import("event/PointerEvent.zig");
const KeyboardEvent = @import("event/KeyboardEvent.zig");
const Label = @import("element/html/Label.zig");
@@ -60,13 +58,6 @@ fn getComputedLabel(_: *const WebDriver, element: *Element, frame: *Frame) ![]co
// synchronously so the events are observable when the testdriver promise
// resolves.
pub fn click(_: *const WebDriver, element: *Element, frame: *Frame) !void {
if (element.is(Element.Html)) |html| {
switch (html._type) {
.button, .input, .textarea, .select, .option, .optgroup => if (element.isDisabled()) return,
else => {},
}
}
// A dispatch error must never reject the testdriver command.
Frame.user_input.triggerClick(frame, element, frame.page.input_modifiers) catch |err| {
log.debug(.app, "webdriver click", .{ .err = err });
@@ -234,13 +225,7 @@ fn performPointerSource(source: js.Object, frame: *Frame) !void {
// The element the pointer is currently over, set by the last pointerMove
// whose origin resolved to an element.
var target: ?*Element = null;
var pressed = false;
// The buttons bitmask of the currently depressed button, carried on move
// and boundary events while dragging.
var pressed_mask: u16 = 0;
// Where the last pointerDown landed: the click fires at the nearest common
// inclusive ancestor of the down and up targets when they differ.
var down_target: ?*Element = null;
var pointer: Frame.user_input.PointerButtons = .{};
var click_count: u32 = 0;
var last_click_button: i32 = 0;
var last_click_target: ?*Element = null;
@@ -266,89 +251,50 @@ fn performPointerSource(source: js.Object, frame: *Frame) !void {
}
}
const el = target orelse continue;
if (is_touch) {
dispatchPointer(el, "pointermove", 0, pressed_mask, frame);
if (pressed) {
dispatchTouch(el, "touchmove", frame);
}
} else {
Frame.user_input.updateHoverTarget(frame, el, .{
.buttons = pressed_mask,
.modifiers = frame.page.input_modifiers,
.with_pointer = true,
});
dispatchPointer(el, "pointermove", 0, pressed_mask, frame);
_ = dispatchMouse(el, "mousemove", 0, pressed_mask, 0, frame);
Frame.user_input.moveSequence(frame, el, .{
.buttons_down = pointer.held,
.modifiers = frame.page.input_modifiers,
.emit_mouse_compat = !is_touch,
}) catch {};
if (is_touch and pointer.held != 0) {
dispatchTouch(el, "touchmove", frame);
}
} else if (action_type.eql(comptime .wrap("pointerDown"))) {
const el = target orelse continue;
const button = readI32(action, "button", 0);
pressed = true;
pressed_mask = Frame.user_input.buttonsBitmask(button);
down_target = el;
if (last_click_target == el and last_click_button == button) {
click_count += 1;
} else {
click_count = 1;
}
dispatchPointer(el, "pointerdown", button, Frame.user_input.buttonsBitmask(button), frame);
pointer.press(frame, el, .{
.button = button,
.click_count = click_count,
.modifiers = frame.page.input_modifiers,
.emit_mouse_compat = !is_touch,
}) catch {};
if (is_touch) {
dispatchTouch(el, "touchstart", frame);
} else {
const suppressed = dispatchMouse(el, "mousedown", button, Frame.user_input.buttonsBitmask(button), click_count, frame);
if (!suppressed) {
Frame.user_input.focusForMouseDown(frame, el) catch |err| {
log.debug(.app, "webdriver mousedown focus", .{ .err = err });
};
}
}
} else if (action_type.eql(comptime .wrap("pointerUp"))) {
const el = target orelse continue;
const button = readI32(action, "button", 0);
pressed = false;
pressed_mask = 0;
dispatchPointer(el, "pointerup", button, 0, frame);
last_click_button = button;
last_click_target = pointer.release(frame, el, .{
.button = button,
.click_count = click_count,
.modifiers = frame.page.input_modifiers,
.emit_mouse_compat = !is_touch,
}) catch null;
if (is_touch) {
dispatchTouch(el, "touchend", frame);
} else {
_ = dispatchMouse(el, "mouseup", button, 0, click_count, frame);
const click_target = commonClickTarget(down_target orelse el, el);
last_click_button = button;
last_click_target = click_target;
if (button == 0) {
_ = dispatchMouse(click_target, "click", button, 0, click_count, frame);
if (click_count % 2 == 0) {
_ = dispatchMouse(click_target, "dblclick", button, 0, click_count, frame);
}
} else {
if (button == 2) {
_ = dispatchMouse(click_target, "contextmenu", button, 0, click_count, frame);
}
_ = dispatchMouse(click_target, "auxclick", button, 0, click_count, frame);
}
}
down_target = null;
}
// "pause" carries timing only and is ignored. ("pointerCancel" is not
// emitted by the testdriver Actions builder.)
}
}
// A click whose mousedown and mouseup landed on different elements fires at
// their nearest common inclusive ancestor element.
fn commonClickTarget(down: *Element, up: *Element) *Element {
if (down == up) {
return up;
}
var current: ?*@import("Node.zig") = down.asNode();
while (current) |node| : (current = node.parentNode()) {
if (node.contains(up.asNode())) {
return node.is(Element) orelse break;
}
}
return up;
}
fn performWheelSource(source: js.Object, frame: *Frame) !void {
const actions_val = try source.get("actions");
if (!actions_val.isArray()) {
@@ -535,51 +481,6 @@ fn readI32(obj: js.Object, key: []const u8, default: i32) i32 {
return val.toI32() catch default;
}
fn dispatchPointer(el: *Element, comptime typ: []const u8, button: i32, buttons: u16, frame: *Frame) void {
const modifiers = frame.page.input_modifiers;
const event = PointerEvent.initTrusted(typ, .{
.bubbles = true,
.cancelable = true,
.composed = true,
.button = button,
.buttons = buttons,
.pointerId = 1,
.pointerType = "mouse",
.isPrimary = true,
.ctrlKey = modifiers.ctrl,
.shiftKey = modifiers.shift,
.altKey = modifiers.alt,
.metaKey = modifiers.meta,
}, frame) catch |err| {
log.debug(.app, "webdriver pointer event", .{ .err = err, .type = typ });
return;
};
dispatch(el.asEventTarget(), event.asEvent(), frame, typ);
}
fn dispatchMouse(el: *Element, comptime typ: []const u8, button: i32, buttons: u16, detail: u32, frame: *Frame) bool {
const modifiers = frame.page.input_modifiers;
const event = MouseEvent.initTrusted(comptime .wrap(typ), .{
.bubbles = true,
.cancelable = true,
.composed = true,
.button = button,
.buttons = buttons,
.detail = detail,
.ctrlKey = modifiers.ctrl,
.shiftKey = modifiers.shift,
.altKey = modifiers.alt,
.metaKey = modifiers.meta,
}, frame) catch |err| {
log.debug(.app, "webdriver mouse event", .{ .err = err, .type = typ });
return false;
};
return frame._event_manager.dispatchCancelable(el.asEventTarget(), event.asEvent()) catch |err| {
log.debug(.app, "webdriver dispatch", .{ .err = err, .type = typ });
return false;
};
}
// The action's x/y, which the caller already resolved the target from. An
// element origin makes them offsets from its center, but the faux layout has
// no center worth computing.
+4 -4
View File
@@ -521,18 +521,18 @@ pub fn fetch(_: *const Window, input: Fetch.Input, options: ?Fetch.InitOpts, exe
return Fetch.init(input, options, exec);
}
pub fn setTimeout(self: *Window, handler: Timers.LegacyHandler, delay_ms: ?u32, params: []js.Value.Global, exec: *js.Execution) !u32 {
pub fn setTimeout(self: *Window, handler: Timers.LegacyHandler, delay_ms: ?i32, params: []js.Value.Global, exec: *js.Execution) !u32 {
const cb = try handler.resolve(exec);
return self._timers.schedule(exec, cb, delay_ms orelse 0, .{
return self._timers.schedule(exec, cb, Timers.delayFromJs(delay_ms), .{
.repeat = false,
.params = params,
.name = "window.setTimeout",
});
}
pub fn setInterval(self: *Window, handler: Timers.LegacyHandler, delay_ms: ?u32, params: []js.Value.Global, exec: *js.Execution) !u32 {
pub fn setInterval(self: *Window, handler: Timers.LegacyHandler, delay_ms: ?i32, params: []js.Value.Global, exec: *js.Execution) !u32 {
const cb = try handler.resolve(exec);
return self._timers.schedule(exec, cb, delay_ms orelse 0, .{
return self._timers.schedule(exec, cb, Timers.delayFromJs(delay_ms), .{
.repeat = true,
.params = params,
.name = "window.setInterval",
+4 -4
View File
@@ -530,9 +530,9 @@ fn queueMicrotask(self: *WorkerGlobalScope, cb: JS.Function) void {
self.js.queueMicrotaskFunc(cb);
}
pub fn setTimeout(self: *WorkerGlobalScope, handler: Timers.LegacyHandler, delay_ms: ?u32, params: []JS.Value.Global, exec: *JS.Execution) !u32 {
pub fn setTimeout(self: *WorkerGlobalScope, handler: Timers.LegacyHandler, delay_ms: ?i32, params: []JS.Value.Global, exec: *JS.Execution) !u32 {
const cb = try handler.resolve(exec);
return self._timers.schedule(exec, cb, delay_ms orelse 0, .{
return self._timers.schedule(exec, cb, Timers.delayFromJs(delay_ms), .{
.repeat = false,
.params = params,
.name = "worker.setTimeout",
@@ -543,9 +543,9 @@ fn clearTimeout(self: *WorkerGlobalScope, id: u32) void {
self._timers.clear(id);
}
pub fn setInterval(self: *WorkerGlobalScope, handler: Timers.LegacyHandler, delay_ms: ?u32, params: []JS.Value.Global, exec: *JS.Execution) !u32 {
pub fn setInterval(self: *WorkerGlobalScope, handler: Timers.LegacyHandler, delay_ms: ?i32, params: []JS.Value.Global, exec: *JS.Execution) !u32 {
const cb = try handler.resolve(exec);
return self._timers.schedule(exec, cb, delay_ms orelse 0, .{
return self._timers.schedule(exec, cb, Timers.delayFromJs(delay_ms), .{
.repeat = true,
.params = params,
.name = "worker.setInterval",
+3
View File
@@ -299,6 +299,9 @@ fn unstorable(response: *const Response) ?[]const u8 {
if (response._body == .stream) {
return "Response with a ReadableStream body is unsupported";
}
if (response._body == .errored) {
return "Response body is errored";
}
for (response._headers._list._entries.items) |*header| {
if (std.ascii.eqlIgnoreCase(header.name.str(), "vary") == false) {
continue;
@@ -1061,7 +1061,7 @@ pub const JsApi = struct {
pub var class_id: bridge.ClassId = undefined;
};
pub const cssText = bridge.accessor(CSSStyleDeclaration.getCssText, CSSStyleDeclaration.setCssText, .{});
pub const cssText = bridge.accessor(CSSStyleDeclaration.getCssText, CSSStyleDeclaration.setCssText, .{ .ce_reactions = true });
pub const length = bridge.accessor(CSSStyleDeclaration.length, null, .{});
pub const item = bridge.function(_item, .{});
@@ -1074,9 +1074,9 @@ pub const JsApi = struct {
pub const getPropertyValue = bridge.function(CSSStyleDeclaration.getPropertyValue, .{});
pub const getPropertyPriority = bridge.function(CSSStyleDeclaration.getPropertyPriority, .{});
pub const setProperty = bridge.function(CSSStyleDeclaration.setProperty, .{});
pub const removeProperty = bridge.function(CSSStyleDeclaration.removeProperty, .{});
pub const cssFloat = bridge.accessor(CSSStyleDeclaration.getFloat, CSSStyleDeclaration.setFloat, .{});
pub const setProperty = bridge.function(CSSStyleDeclaration.setProperty, .{ .ce_reactions = true });
pub const removeProperty = bridge.function(CSSStyleDeclaration.removeProperty, .{ .ce_reactions = true });
pub const cssFloat = bridge.accessor(CSSStyleDeclaration.getFloat, CSSStyleDeclaration.setFloat, .{ .ce_reactions = true });
};
const testing = @import("../../../testing.zig");
@@ -405,5 +405,5 @@ pub const JsApi = struct {
pub var class_id: bridge.ClassId = undefined;
};
pub const @"[]" = bridge.namedIndexed(CSSStyleProperties.getNamed, CSSStyleProperties.setNamed, null, null, null, .{});
pub const @"[]" = bridge.namedIndexed(CSSStyleProperties.getNamed, CSSStyleProperties.setNamed, null, null, null, .{ .ce_reactions = true });
};
+12
View File
@@ -614,6 +614,10 @@ pub const NamedNodeMap = struct {
return self.list().getAttribute(name, self._element, frame);
}
fn getByNameNS(self: *const NamedNodeMap, namespace: ?[]const u8, local_name: String, frame: *Frame) !?*Attribute {
return self._element.getAttributeNodeNS(namespace, local_name, frame);
}
pub fn set(self: *const NamedNodeMap, attribute: *Attribute, frame: *Frame) !?*Attribute {
return self._element.setAttributeNode(attribute, frame);
}
@@ -626,6 +630,10 @@ pub const NamedNodeMap = struct {
return attr;
}
fn removeByNameNS(self: *const NamedNodeMap, namespace: ?[]const u8, local_name: String, frame: *Frame) !?*Attribute {
return self.removeByName(try self._element.attributeNameNS(namespace, local_name, frame), frame);
}
pub fn iterator(self: *const NamedNodeMap, frame: *Frame) !*Iterator {
return .init(.{ .list = self }, frame);
}
@@ -682,8 +690,12 @@ pub const NamedNodeMap = struct {
}.wrap, .{ .null_as_undefined = true });
pub const getNamedItem = bridge.function(NamedNodeMap.getByName, .{});
pub const getNamedItemNS = bridge.function(NamedNodeMap.getByNameNS, .{});
pub const setNamedItem = bridge.function(NamedNodeMap.set, .{ .ce_reactions = true });
// Attributes don't carry a namespace, so this is setNamedItem.
pub const setNamedItemNS = bridge.function(NamedNodeMap.set, .{ .ce_reactions = true });
pub const removeNamedItem = bridge.function(NamedNodeMap.removeByName, .{ .ce_reactions = true });
pub const removeNamedItemNS = bridge.function(NamedNodeMap.removeByNameNS, .{ .ce_reactions = true });
pub const item = bridge.function(_item, .{});
fn _item(self: *const NamedNodeMap, index: i32, frame: *Frame) !?*Attribute {
// the bridge.indexed handles this, so if we want
+2 -7
View File
@@ -643,13 +643,8 @@ pub fn setContentEditable(self: *HtmlElement, value: []const u8, frame: *Frame)
}
pub fn getIsContentEditable(self: *HtmlElement) bool {
var current: ?*Element = self.asElement();
while (current) |el| : (current = el.parentElement()) {
const raw = el.getAttributeSafe(.wrap("contenteditable")) orelse continue;
if (!std.ascii.eqlIgnoreCase(raw, "false")) {
log.info(.not_implemented, "IsContentEditable", .{});
}
break;
if (self.asElement().isEditable()) {
log.info(.not_implemented, "IsContentEditable", .{});
}
return false;
}
@@ -365,5 +365,9 @@ pub const JsApi = struct {
pub const Meta = struct {
pub const prototype_chain = bridge.prototypeChain();
pub var class_id: bridge.ClassId = undefined;
// The template only applies to wrappers created outside construction:
// undefined elements, or a defined one first seen by an isolated world.
// Both get HTMLElement.prototype.
pub const wrap_as = HtmlElement.JsApi;
};
};
+25 -1
View File
@@ -46,6 +46,7 @@ _signal: ?*AbortSignal,
_manual_redirect: bool,
_no_cors: bool,
_null_body: bool,
_headers_done: bool = false,
_sink: Sink,
pub const Input = Request.Input;
@@ -160,6 +161,7 @@ fn submit(request: *Request, body: ?[]const u8, sink: Sink, exec: *const Executi
.manual => .manual,
.@"error" => .@"error",
},
.header_before_body_error = true,
.header_callback = httpHeaderDoneCallback,
.data_callback = httpDataCallback,
.done_callback = httpDoneCallback,
@@ -249,6 +251,7 @@ fn httpHeaderDoneCallback(transfer: *Transfer) !Transfer.HeaderResult {
res._url = "";
res._type = .@"opaque";
res._is_redirected = false;
self._headers_done = true;
return .proceed;
}
@@ -260,6 +263,7 @@ fn httpHeaderDoneCallback(transfer: *Transfer) !Transfer.HeaderResult {
res._url = "";
res._type = .opaqueredirect;
res._is_redirected = false;
self._headers_done = true;
return .proceed;
}
@@ -286,6 +290,7 @@ fn httpHeaderDoneCallback(transfer: *Transfer) !Transfer.HeaderResult {
try res._headers.append(hdr.name, hdr.value, exec);
}
self._headers_done = true;
return .proceed;
}
@@ -354,7 +359,7 @@ fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {
// Capture this before we reject. Rejection could trigger httpShutdownCallback
// (via a microtask callback). But if we're here, then we'll take care of
// cleaning up when we're done.
const owns_response = self._owns_response;
var owns_response = self._owns_response;
self._owns_response = false;
// the response is only passed on v8 on success, if we're here, it's safe to
@@ -373,10 +378,29 @@ fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {
self._exec.js.localScope(&ls);
defer ls.deinit();
if (owns_response and self._headers_done and self.isAborted() == false) {
// Once we have the headers, the promise should resolve. A later error,
// like libcurl returning a BadContentEncoding errors at the body, not
// the fetch.
if (self._null_body == false) {
response._body = .errored;
}
if (ls.local.zigValueToJs(response, .{})) |js_val| {
owns_response = false;
response._arena.report();
return ls.toLocal(resolver).resolve("fetch done", js_val);
} else |_| {}
}
// fetch() must reject with a TypeError on network errors per spec
ls.toLocal(resolver).rejectError("fetch error", .{ .type_error = "fetch error" });
}
fn isAborted(self: *const Fetch) bool {
const signal = self._signal orelse return false;
return signal._aborted;
}
fn httpShutdownCallback(ctx: *anyopaque) void {
const self: *Fetch = @ptrCast(@alignCast(ctx));
+27 -7
View File
@@ -62,6 +62,7 @@ const Body = union(enum) {
empty,
bytes: []const u8,
stream: *ReadableStream,
errored,
};
const InitOpts = struct {
@@ -316,6 +317,18 @@ pub fn getBody(self: *Response, exec: *const Execution) !?*ReadableStream {
}
return stream;
},
.errored => {
if (self._body_stream) |stream| {
return stream;
}
const stream = try ReadableStream.init(null, null, exec);
try stream._controller.doError("Failed to read response body");
self._body_stream = stream;
if (self._body_used) {
try lockStream(stream, exec);
}
return stream;
},
};
}
@@ -334,7 +347,7 @@ fn getBodyUsed(self: *const Response) bool {
return switch (self._body) {
.empty => false,
.stream => |stream| stream._disturbed,
.bytes => self._body_used,
.bytes, .errored => self._body_used,
};
}
@@ -343,7 +356,7 @@ fn checkUnusable(self: *const Response, local: *const js.Local) !void {
const stream = switch (self._body) {
.empty => return,
.stream => |stream| stream,
.bytes => self._body_stream orelse {
.bytes, .errored => self._body_stream orelse {
if (self._body_used) {
return local.typeError("Body has already been read");
}
@@ -360,10 +373,11 @@ fn consume(self: *Response, exec: *const Execution) !void {
const local = exec.js.local.?;
try self.checkUnusable(local);
self._body_used = true;
if (self._body == .bytes) {
if (self._body_stream) |stream| {
switch (self._body) {
.bytes, .errored => if (self._body_stream) |stream| {
try lockStream(stream, exec);
}
},
.empty, .stream => {},
}
}
@@ -373,6 +387,7 @@ pub fn consumeBytes(self: *Response, exec: *const Execution) ![]const u8 {
.empty => "",
.bytes => |b| b,
.stream => exec.js.local.?.typeError("Response with a ReadableStream body is unsupported"),
.errored => exec.js.local.?.typeError("Failed to read response body"),
};
}
@@ -410,6 +425,11 @@ fn consumeAs(self: *Response, kind: Package, exec: *const Execution) !js.Promise
const content_type = try self._headers.get("content-type", exec);
switch (self._body) {
.stream => |stream| return StreamConsumer.start(stream, kind, content_type, exec),
.errored => {
var resolver = local.createPromiseResolver();
resolver.rejectError("response body", .{ .type_error = "Failed to read response body" });
return resolver.promise();
},
.bytes, .empty => {},
}
@@ -551,8 +571,7 @@ pub fn clone(self: *const Response, exec: *const Execution) !*Response {
const session = exec.session;
const body_len = switch (self._body) {
.bytes => |b| b.len,
.empty => 0,
.stream => 0,
.empty, .stream, .errored => 0,
};
const arena = try session.getPinnedArena(body_len + self._url.len + 256, "Response.clone");
errdefer arena.release();
@@ -561,6 +580,7 @@ pub fn clone(self: *const Response, exec: *const Execution) !*Response {
.bytes => |b| .{ .bytes = try arena.dupe(u8, b) },
.empty => .empty,
.stream => .empty, // TODO: implement stream tee for proper cloning
.errored => .errored,
};
const status_text = try arena.dupe(u8, self._status_text);
const url = try arena.dupeSentinel(u8, self._url, 0);
+18 -6
View File
@@ -505,6 +505,22 @@ fn attributeContainsWord(value: []const u8, word: []const u8) bool {
return false;
}
// https://html.spec.whatwg.org/multipage/semantics-other.html#selector-read-write
fn isReadWrite(el: *Node.Element) bool {
if (el.is(Node.Element.Html.Input)) |input| {
const readonly_applies = switch (input._input_type) {
.text, .password, .email, .url, .tel, .search, .number => true,
.date, .time, .@"datetime-local", .month, .week => true,
else => false,
};
return readonly_applies and !el.hasAttributeInterned("readonly") and !el.isDisabled();
}
if (el.is(Node.Element.Html.TextArea) != null) {
return !el.hasAttributeInterned("readonly") and !el.isDisabled();
}
return el.isEditable();
}
fn matchesPseudoClass(el: *Node.Element, pseudo: Selector.PseudoClass, scope: *Node, nth: ?*NthCache, frame: *Frame) bool {
const node = el.asNode();
switch (pseudo) {
@@ -569,12 +585,8 @@ fn matchesPseudoClass(el: *Node.Element, pseudo: Selector.PseudoClass, scope: *N
.in_range => return false,
.out_of_range => return false,
.placeholder_shown => return false,
.read_only => {
return el.hasAttributeInterned("readonly");
},
.read_write => {
return el.hasAttributeInterned("readonly") == false;
},
.read_only => return !isReadWrite(el),
.read_write => return isReadWrite(el),
.default => return false,
// User interaction
+4
View File
@@ -429,6 +429,7 @@ fn pseudoClass(self: *Parser, arena: Allocator) !Selector.PseudoClass {
if (std.mem.eql(u8, name, "nth-child")) {
const pattern = try self.parseNthPattern();
_ = self.skipSpaces();
if (self.peek() != ')') return error.InvalidPseudoClass;
self.input = self.input[1..];
return .{ .nth_child = pattern };
@@ -436,6 +437,7 @@ fn pseudoClass(self: *Parser, arena: Allocator) !Selector.PseudoClass {
if (std.mem.eql(u8, name, "nth-last-child")) {
const pattern = try self.parseNthPattern();
_ = self.skipSpaces();
if (self.peek() != ')') return error.InvalidPseudoClass;
self.input = self.input[1..];
return .{ .nth_last_child = pattern };
@@ -443,6 +445,7 @@ fn pseudoClass(self: *Parser, arena: Allocator) !Selector.PseudoClass {
if (std.mem.eql(u8, name, "nth-of-type")) {
const pattern = try self.parseNthPattern();
_ = self.skipSpaces();
if (self.peek() != ')') return error.InvalidPseudoClass;
self.input = self.input[1..];
return .{ .nth_of_type = pattern };
@@ -450,6 +453,7 @@ fn pseudoClass(self: *Parser, arena: Allocator) !Selector.PseudoClass {
if (std.mem.eql(u8, name, "nth-last-of-type")) {
const pattern = try self.parseNthPattern();
_ = self.skipSpaces();
if (self.peek() != ')') return error.InvalidPseudoClass;
self.input = self.input[1..];
return .{ .nth_last_of_type = pattern };
+1 -1
View File
@@ -1416,7 +1416,7 @@ test "MCP - Actions: click, fill, scroll, hover, press, selectOption, setChecked
\\ 'pointerup:0:0:0:mouse:true', 'mouseup:0:0:1::true', 'click:0:0:1:mouse:true'
\\ ]) &&
\\ JSON.stringify(window.seqPrevented) === JSON.stringify(['pointerdown', 'pointerup', 'click']) &&
\\ JSON.stringify(window.disabledEvents) === '[]' &&
\\ JSON.stringify(window.disabledEvents) === JSON.stringify(['pointerdown', 'pointerup']) &&
\\ window.focusTargetFocused === true && window.plainBlurred === true &&
\\ window.clicked === true && window.inputVal === 'hello' &&
\\ window.changed === true && window.selChanged === 'opt2' &&
+58 -1
View File
@@ -1901,9 +1901,20 @@ fn processOneMessage(self: *Client, msg: http.Handles.MultiMessage, transfer: *T
// callbacks run later, from dispatch(), never from here.
if (effective_err != null and !is_conn_close_recv) {
const err = transfer.res.callback_error orelse effective_err.?;
if (try transfer.deliversHeaderBeforeError(msg.conn)) {
try transfer.materializeResponse(msg.conn, .{ .check_content_length = false });
if (self.enforceCorsResponse(msg, transfer)) {
return true;
}
self.removeConn(msg.conn);
transfer._conn = null;
try transfer.bufferHeaderThenError(err);
return true;
}
self.removeConn(msg.conn);
transfer._conn = null;
transfer.failAsync(transfer.res.callback_error orelse effective_err.?);
transfer.failAsync(err);
return true;
}
@@ -2099,6 +2110,12 @@ pub const Request = struct {
// transfer, and thus we'll need to dupe it.
body_outlives_request: bool = false,
// Should an error after the header arives still call the header_callback.
// Most cases just want the error. But fetch() is considered resolved once
// we get the header, so where the error happens (before or after headers
// is important)
header_before_body_error: bool = false,
// arbitrary data that can be associated with this request
ctx: *anyopaque = undefined,
@@ -3277,6 +3294,33 @@ pub const Transfer = struct {
};
}
fn deliversHeaderBeforeError(self: *const Transfer, conn: *const http.Connection) !bool {
if (self.req.header_before_body_error == false or self.res.headers_complete == false) {
return false;
}
if (self.res.stream.started) {
// The header was already delivered.
return false;
}
const status = try conn.getResponseCode();
if (isRedirectStatus(status) and self.req.redirect != .manual and conn.getResponseHeader("location", 0) != null) {
// this isn't the final response.
return false;
}
return true;
}
// The header made it, the body didn't. Some cases (header_before_body_error = true)
// want the header delivered first. (By default though, we just deliver the
// error)
fn bufferHeaderThenError(self: *Transfer, err: anyerror) !void {
try self._events.ensureUnusedCapacity(self.arena.allocator(), 3);
self._events.appendAssumeCapacity(.start);
self._events.appendAssumeCapacity(.header);
self._events.appendAssumeCapacity(.{ .err = err });
self.scheduleDispatch();
}
// Buffer the standard success event sequence. `body` is either owned by
// transfer.arena OR, through some other mechanism, outlives the transfer.
fn bufferEvents(self: *Transfer, body: []const u8) !void {
@@ -3893,6 +3937,16 @@ pub const Transfer = struct {
return chunk_len;
}
if (std.mem.trim(u8, line, "\r\n").len == 0) {
// End of a header block. A 1xx is followed by another one.
const conn: *http.Connection = @ptrCast(@alignCast(data));
const status = conn.getResponseCode() catch return chunk_len;
if (status >= 200) {
conn.transport.http.res.headers_complete = true;
}
return chunk_len;
}
if (announcesBody(line) == false) {
return chunk_len;
}
@@ -4362,6 +4416,9 @@ const Response = struct {
skip_body: bool = false,
first_data_received: bool = false,
// The final (non-1xx) response's header block has been fully received.
headers_complete: bool = false,
// Set when dataCallback deliberately killed the transfer to satisfy
// `Request.partial`. processOneMessage uses it to tell our own abort
// apart from a real CURLE_WRITE_ERROR and deliver the response (headers,
+2
View File
@@ -50,6 +50,8 @@ struct ParsedNode {
_node: *const c_void,
data: *const ElementData,
_placed: bool,
_root: *const c_void,
_root_version: usize,
}
fn element_data<'a>(target: Ref) -> &'a ElementData {
+2
View File
@@ -2276,6 +2276,8 @@ test "server: HTTP element input" {
const btn = try findElement(&c, &session_id, "css selector", "#btn");
try testing.expectEqual("{\"value\":null}", responseBody(try elementPost(&c, &session_id, btn, "/click", "{}")));
try testing.expectEqual("{\"value\":\"focus@btn click@btn\"}", try executeSync(&c, &session_id, take_events, "[]"));
// The pointer arrives before the press: no button is held yet.
try testing.expectEqual("{\"value\":\"pointerover:-1:0@btn mouseover:0:0@btn\"}", try executeSync(&c, &session_id, "return window.over.join(' ');", "[]"));
{
const gone = try findElement(&c, &session_id, "css selector", "#gone");
+1 -3
View File
@@ -669,7 +669,6 @@ fn elementClick(cmd: *BiDi.Command, p: ElementId) !void {
break :blk;
}
Frame.user_input.updateHoverTarget(frame, element, .{ .with_pointer = true });
try Frame.user_input.triggerClick(frame, element, .{});
// a multiple <select> toggles the option, any other selects it
@@ -679,8 +678,7 @@ fn elementClick(cmd: *BiDi.Command, p: ElementId) !void {
}
try option.setSelected(selected, frame);
try lp.actions.dispatchInputAndChangeEvents(select_element, frame);
} else if (element.isDisabled() == false) {
Frame.user_input.updateHoverTarget(frame, element, .{ .with_pointer = true });
} else {
try Frame.user_input.triggerClick(frame, element, .{});
}
return browsing_context.answerAfterNavigation(cmd, ctx, frame);
+26 -2
View File
@@ -207,6 +207,7 @@ const Source = struct {
last_click_ms: u64 = 0,
last_click_x: f64 = 0,
last_click_y: f64 = 0,
last_click_button: u8 = 0,
click_count: i32 = 0,
};
@@ -579,10 +580,13 @@ fn dispatch(bidi: *BiDi, frame: *Frame, source: *Source, action: *const Action)
}
try pointer.pressed.append(allocator, button);
// A press near the last click, soon enough after it, counts up
// A press of the same button near the last click, soon enough
// after it, counts up
const now = lp.datetime.milliTimestamp(.boot);
const near = @abs(pointer.x - pointer.last_click_x) <= 2 and @abs(pointer.y - pointer.last_click_y) <= 2;
pointer.click_count = if (near and now - pointer.last_click_ms <= 500) pointer.click_count + 1 else 1;
const repeat = near and button == pointer.last_click_button and now - pointer.last_click_ms <= 500;
pointer.click_count = if (repeat) pointer.click_count + 1 else 1;
pointer.last_click_button = button;
pointer.last_click_ms = now;
pointer.last_click_x = pointer.x;
pointer.last_click_y = pointer.y;
@@ -988,6 +992,26 @@ test "bidi.input: click via element origin" {
.type = "string",
.value = "mousemove@btn mousedown:b2@btn mouseup:b2@btn",
} }, .{ .id = 7 });
// A left click right after the right one starts a new count: no dblclick.
try ctx.processMessage(.{
.id = 8,
.method = "input.performActions",
.params = .{ .context = context_id, .actions = .{.{
.type = "pointer",
.id = "mouse",
.actions = .{
.{ .type = "pointerDown", .button = 0 },
.{ .type = "pointerUp", .button = 0 },
},
}} },
});
try ctx.expectSentResult(null, .{ .id = 8 });
try evaluate(&ctx, 9, context_id, "window.events.slice(11).join(' ')");
try ctx.expectSentResult(.{ .type = "success", .result = .{
.type = "string",
.value = "mousedown@btn mouseup@btn click@btn",
} }, .{ .id = 9 });
}
test "bidi.input: keys and modifiers" {
+8 -13
View File
@@ -89,7 +89,7 @@ pub const Writer = struct {
try self.walkQuery(self.root.dom, &ignore_cache, w);
} else {
const root = AXNode.fromNode(self.root.dom);
const root_hidden = if (self.root.dom.is(DOMNode.Element)) |el| isHidden(el, self.frame, .{}) else false;
const root_hidden = if (self.root.dom.is(DOMNode.Element)) |el| isHidden(el, self.frame) else false;
try self.writeTree(root, root_hidden, &ignore_cache, w);
}
return w.endArray();
@@ -139,7 +139,7 @@ pub const Writer = struct {
// visibility:hidden, aria-hidden, hidden, inert). Matches
// Chromium: these elements aren't exposed to the AX tree.
const el = dom_node.as(DOMNode.Element);
if (walker.inAriaHidden() or isHidden(el, self.frame, .{ .ancestors = false })) {
if (walker.inAriaHidden() or isHidden(el, self.frame)) {
continue;
}
},
@@ -580,7 +580,7 @@ pub const Writer = struct {
// Skip hidden element children so childIds matches the
// subtree-pruning done in writeTree.
if (child.is(DOMNode.Element)) |child_el| {
if (child_in_aria_hidden or isHidden(child_el, self.frame, .{ .ancestors = false })) {
if (child_in_aria_hidden or isHidden(child_el, self.frame)) {
continue;
}
}
@@ -679,7 +679,7 @@ pub const Writer = struct {
}
const node = try self.registry.register(axn.dom);
const hidden = if (axn.dom.is(DOMNode.Element)) |el| isHidden(el, self.frame, .{}) else false;
const hidden = if (axn.dom.is(DOMNode.Element)) |el| isHidden(el, self.frame) else false;
const ignored = try axn.isIgnore(self.frame, in_aria_hidden, hidden, ignore_cache);
try w.beginObject();
@@ -1235,7 +1235,7 @@ fn labelPromotionTarget(
// Only promote when the control is hidden; otherwise it appears
// normally and the label stays as-is.
if (!isHidden(control, frame, .{})) return null;
if (!isHidden(control, frame)) return null;
if (control.getTag() != .input) return null;
const input = control.as(DOMNode.Element.Html.Input);
@@ -1291,18 +1291,13 @@ fn scratchAllocator(temp_arena: ?*lp.Arena, frame: *Frame) std.mem.Allocator {
return if (temp_arena) |a| a.allocator() else frame.call_arena;
}
const HiddenOptions = struct { ancestors: bool = true };
/// Chromium's AX tree prunes display:none and visibility:hidden alike.
fn isHidden(elt: *DOMNode.Element, frame: *Frame, options: HiddenOptions) bool {
fn isHidden(elt: *DOMNode.Element, frame: *Frame) bool {
if (hasHidingAttribute(elt)) {
return true;
}
const owner = elt.ownerFrame(frame) orelse return false;
return owner._style_manager.isHidden(elt, .{
.check_visibility = true,
.ancestors = options.ancestors,
});
return owner._style_manager.isHidden(elt, .{ .check_visibility = true });
}
fn hasHidingAttribute(elt: *DOMNode.Element) bool {
@@ -1367,7 +1362,7 @@ const IgnoreCache = struct {
var tw = TreeWalker.FullExcludeSelf.init(root, .{});
const exposed = while (tw.next()) |node| {
const node_hidden = if (node.is(DOMNode.Element)) |el| isHidden(el, frame, .{ .ancestors = false }) else false;
const node_hidden = if (node.is(DOMNode.Element)) |el| isHidden(el, frame) else false;
switch (AXNode.fromNode(node).ignoreSelf(false, node_hidden)) {
.ignored => tw.skipChildren(),
.exposed => break node,
+183 -13
View File
@@ -56,15 +56,14 @@ fn dispatchKeyEvent(cmd: *CDP.Command) !void {
try cmd.sendResult(null, .{});
// rawKeyDown is a Chrome-internal event type not used for JS dispatch
if (params.type == .rawKeyDown) return;
const bc = cmd.browser_context orelse return;
const frame = bc.mainFrame() orelse return;
// Chrome types text only for an event carrying it: a keyDown with `text`
// (Puppeteer, Playwright) or a `char` (chromedp, after a text-less keyDown).
const text: ?[]const u8 = if (params.text.len == 0) null else params.text;
// Puppeteer and Playwright send rawKeyDown, which never types text, for keys
// like Backspace, the arrows and Escape.
const text: ?[]const u8 = if (params.text.len == 0 or params.type == .rawKeyDown) null else params.text;
const KeyboardEvent = @import("../../../browser/webapi/event/KeyboardEvent.zig");
const opts: KeyboardEvent.Options = .{
.key = if (params.key.len > 0) params.key else params.text,
@@ -76,8 +75,7 @@ fn dispatchKeyEvent(cmd: *CDP.Command) !void {
};
switch (params.type) {
.rawKeyDown => unreachable,
.keyDown => {
.keyDown, .rawKeyDown => {
const event = try KeyboardEvent.initTrusted(comptime .wrap("keydown"), opts, frame);
const prevented = try Frame.user_input.triggerKeyDown(frame, event, text);
bc.suppress_next_char = prevented and text == null;
@@ -200,6 +198,36 @@ test "cdp.input: insertText is a user edit for tooLong" {
try testing.expect((try ls.local.compileAndRun("inp.validity.tooLong === false", null)).isTrue());
}
test "cdp.input: rawKeyDown dispatches keydown for keys without text" {
var ctx = try testing.context();
defer ctx.deinit();
const bc = try ctx.loadBrowserContext(.{});
const page = try bc.session.createPage();
const frame = page.frame().?;
try frame.navigate("http://localhost:9582/src/browser/tests/mcp_actions.html", .{ .reason = .address_bar, .kind = .{ .push = null } });
try testing.waitForPage(bc);
var ls: lp.js.Local.Scope = undefined;
frame.js.localScope(&ls);
defer ls.deinit();
_ = try ls.local.compileAndRun(
\\const inp = document.getElementById('inp');
\\inp.value = 'abc';
\\inp.focus();
\\inp.setSelectionRange(3, 3);
\\window.keys = [];
\\inp.addEventListener('keydown', (e) => keys.push(e.key));
, null);
// What Puppeteer and Playwright send for keyboard.press('Backspace').
try ctx.processMessage(.{ .id = 1, .method = "Input.dispatchKeyEvent", .params = .{ .type = "rawKeyDown", .key = "Backspace", .code = "Backspace" } });
try ctx.processMessage(.{ .id = 2, .method = "Input.dispatchKeyEvent", .params = .{ .type = "keyUp", .key = "Backspace", .code = "Backspace" } });
try testing.expect((try ls.local.compileAndRun("keys.join() === 'Backspace' && inp.value === 'ab'", null)).isTrue());
}
test "cdp.input: insertText replaces select()ed value of email and number inputs" {
var ctx = try testing.context();
defer ctx.deinit();
@@ -315,6 +343,65 @@ test "cdp.input: dispatchMouseEvent mouseReleased fires mouseup" {
try testing.expect(result.isTrue());
}
test "cdp.input: dispatchMouseEvent button activation events match Chrome" {
var ctx = try testing.context();
defer ctx.deinit();
const bc = try ctx.loadBrowserContext(.{});
const page = try bc.session.createPage();
const frame = page.frame().?;
const url = "http://localhost:9582/src/browser/tests/mcp_actions.html";
try frame.navigate(url, .{ .reason = .address_bar, .kind = .{ .push = null } });
try testing.waitForPage(bc);
var ls: lp.js.Local.Scope = undefined;
frame.js.localScope(&ls);
defer ls.deinit();
var try_catch: lp.js.TryCatch = undefined;
try_catch.init(&ls.local);
defer try_catch.deinit();
_ = try ls.local.compileAndRun(
\\window.clicks = [];
\\for (const t of ['mousedown', 'mouseup', 'click', 'auxclick', 'contextmenu']) {
\\ document.getElementById('hoverTarget')
\\ .addEventListener(t, (e) => { window.clicks.push(t + ':' + e.button); });
\\}
, null);
const rect_x = try (try ls.local.compileAndRun("document.getElementById('hoverTarget').getBoundingClientRect().x", null)).toF64();
const rect_y = try (try ls.local.compileAndRun("document.getElementById('hoverTarget').getBoundingClientRect().y", null)).toF64();
const presses = [_]struct { button: []const u8, click_count: i32, expected: []const u8 }{
.{ .button = "middle", .click_count = 1, .expected = "mousedown:1 mouseup:1 auxclick:1" },
.{ .button = "right", .click_count = 1, .expected = "mousedown:2 contextmenu:2 mouseup:2 auxclick:2" },
.{ .button = "back", .click_count = 1, .expected = "mousedown:3 mouseup:3 auxclick:3" },
.{ .button = "forward", .click_count = 1, .expected = "mousedown:4 mouseup:4 auxclick:4" },
.{ .button = "left", .click_count = 0, .expected = "mousedown:0 mouseup:0" },
.{ .button = "right", .click_count = 0, .expected = "mousedown:2 contextmenu:2 mouseup:2" },
};
var id: u32 = 1;
for (presses) |press| {
_ = try ls.local.compileAndRun("window.clicks = []", null);
try ctx.processMessage(.{
.id = id,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mousePressed", .x = rect_x, .y = rect_y, .button = press.button, .clickCount = press.click_count },
});
try ctx.processMessage(.{
.id = id + 1,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mouseReleased", .x = rect_x, .y = rect_y, .button = press.button, .clickCount = press.click_count },
});
id += 2;
const got = try (try ls.local.compileAndRun("window.clicks.join(' ')", null)).toStringSlice();
try testing.expectEqual(press.expected, got);
}
}
test "cdp.input: dispatchMouseEvent mousePressed honors preventDefault for focus" {
var ctx = try testing.context();
defer ctx.deinit();
@@ -687,7 +774,7 @@ test "cdp.input: dispatchMouseEvent right button fires contextmenu, double-click
_ = try ls.local.compileAndRun(
\\const t = document.getElementById('hoverTarget');
\\t.addEventListener('mousedown', (e) => { window.downButton = e.button; });
\\t.addEventListener('mousedown', (e) => { window.downButton ??= e.button; });
\\t.addEventListener('contextmenu', (e) => { window.ctxButton = e.button; });
\\t.addEventListener('dblclick', () => { window.dbl = true; });
, null);
@@ -695,7 +782,7 @@ test "cdp.input: dispatchMouseEvent right button fires contextmenu, double-click
const rect_x = try (try ls.local.compileAndRun("document.getElementById('hoverTarget').getBoundingClientRect().x", null)).toF64();
const rect_y = try (try ls.local.compileAndRun("document.getElementById('hoverTarget').getBoundingClientRect().y", null)).toF64();
// Right button: press carries button=2, release fires contextmenu (not click).
// Right button: press carries button=2 and fires contextmenu.
try ctx.processMessage(.{
.id = 1,
.method = "Input.dispatchMouseEvent",
@@ -711,6 +798,11 @@ test "cdp.input: dispatchMouseEvent right button fires contextmenu, double-click
try ctx.processMessage(.{
.id = 3,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mousePressed", .x = rect_x, .y = rect_y, .button = "left", .clickCount = 2 },
});
try ctx.processMessage(.{
.id = 4,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mouseReleased", .x = rect_x, .y = rect_y, .button = "left", .clickCount = 2 },
});
@@ -946,9 +1038,61 @@ test "cdp.input: a cancelled pointerdown suppresses mousedown and mouseup across
try testing.expect(result.isTrue());
}
// Asserts only the pointer events: pointerdown/pointerup fire at the mask's
// 0/nonzero transitions and a mid-gesture button change is a pointermove (the
// activation order below is a pre-existing, non-spec deviation from Chrome).
// A disabled control gets the pointer events, contextmenu and auxclick, but no
// mouse events or click. Matches Chrome.
test "cdp.input: a disabled button gets only pointer and context events" {
var ctx = try testing.context();
defer ctx.deinit();
const bc = try ctx.loadBrowserContext(.{});
const page = try bc.session.createPage();
const frame = page.frame().?;
const url = "http://localhost:9582/src/browser/tests/mcp_actions.html";
try frame.navigate(url, .{ .reason = .address_bar, .kind = .{ .push = null } });
try testing.waitForPage(bc);
var ls: lp.js.Local.Scope = undefined;
frame.js.localScope(&ls);
defer ls.deinit();
var try_catch: lp.js.TryCatch = undefined;
try_catch.init(&ls.local);
defer try_catch.deinit();
const rect_x = try (try ls.local.compileAndRun("document.getElementById('btnDisabled').getBoundingClientRect().x", null)).toF64();
const rect_y = try (try ls.local.compileAndRun("document.getElementById('btnDisabled').getBoundingClientRect().y", null)).toF64();
try ctx.processMessage(.{
.id = 1,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mousePressed", .x = rect_x, .y = rect_y, .button = "left", .clickCount = 1 },
});
try ctx.processMessage(.{
.id = 2,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mouseReleased", .x = rect_x, .y = rect_y, .button = "left", .clickCount = 1 },
});
try ctx.processMessage(.{
.id = 3,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mousePressed", .x = rect_x, .y = rect_y, .button = "right", .clickCount = 1 },
});
try ctx.processMessage(.{
.id = 4,
.method = "Input.dispatchMouseEvent",
.params = .{ .type = "mouseReleased", .x = rect_x, .y = rect_y, .button = "right", .clickCount = 1 },
});
const result = try ls.local.compileAndRun(
\\JSON.stringify(window.disabledEvents) === JSON.stringify([
\\ 'pointerdown', 'pointerup', 'pointerdown', 'contextmenu', 'pointerup', 'auxclick'
\\])
, null);
try testing.expect(result.isTrue());
}
// The pointerdown is cancelled, so no compat mouse events fire. Matches Chrome.
test "cdp.input: a mouse chord fires pointermove for the mid-gesture button change, not a second pointerdown/pointerup" {
var ctx = try testing.context();
defer ctx.deinit();
@@ -995,7 +1139,7 @@ test "cdp.input: a mouse chord fires pointermove for the mid-gesture button chan
const result = try ls.local.compileAndRun(
\\JSON.stringify(window.seqChord) === JSON.stringify([
\\ 'pointerdown:1', 'pointermove:3', 'pointermove:1', 'contextmenu:1', 'pointerup:0', 'click:0'
\\ 'pointerdown:1', 'pointermove:3', 'contextmenu:3', 'pointermove:1', 'auxclick:1', 'pointerup:0'
\\])
, null);
try testing.expect(result.isTrue());
@@ -1050,7 +1194,7 @@ test "cdp.input: a primary click fired mid-chord carries the still-held buttons
const result = try ls.local.compileAndRun(
\\JSON.stringify(window.seqChord) === JSON.stringify([
\\ 'pointerdown:1', 'pointermove:3', 'pointermove:2', 'click:2', 'pointerup:0', 'contextmenu:0'
\\ 'pointerdown:1', 'pointermove:3', 'contextmenu:3', 'pointermove:2', 'click:2', 'pointerup:0'
\\])
, null);
try testing.expect(result.isTrue());
@@ -1593,3 +1737,29 @@ test "cdp.input: dispatchKeyEvent Enter clicks buttons and submits once" {
try testing.expectEqualSlices(u8, c.expect, got);
}
}
test "cdp.input: re-navigating an iframe drops the pointer state on its elements" {
var ctx = try testing.context();
defer ctx.deinit();
const bc = try ctx.loadBrowserContext(.{ .url = "cdp/input_iframe.html" });
const main = bc.mainFrame().?;
const page = main.page;
const child = main.child_frames.items[0];
const text = child.document.getElementById("text", child) orelse unreachable;
try lp.actions.click(text.asNode(), child);
try page.input_pointer.press(child, text, .{});
try testing.expect(page.input_hover_target == text);
try testing.expect(page.input_pointer.down_target == text);
var ls: lp.js.Local.Scope = undefined;
main.js.localScope(&ls);
defer ls.deinit();
_ = try ls.local.compileAndRun("document.querySelector('iframe').src = 'iframe/input_child.html?again'", null);
_ = try bc.session.processQueuedNavigation();
try testing.expect(page.input_hover_target == null);
try testing.expect(page.input_pointer.down_target == null);
try testing.expectEqual(0, page.input_pointer.held);
}
+8
View File
@@ -927,6 +927,14 @@ fn testHTTPHandler(req: *std.http.Server.Request) !void {
});
}
if (std.mem.eql(u8, path, "/xhr/bad_gzip")) {
return req.respond("not actually gzip", .{
.extra_headers = &.{
.{ .name = "Content-Encoding", .value = "gzip" },
},
});
}
if (std.mem.eql(u8, path, "/xhr/no_content_type")) {
return req.respond("untyped", .{});
}