mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-10-08 20:32:00 -04:00
Merge branch 'main' into prompt-audit-cleanup
# Conflicts: # build.zig.zon # src/browser/tools.zig
This commit is contained in:
commit
ec31d4b711
48 files changed
+4980
-3177
No files matched your search
@@ -13,7 +13,7 @@ inputs:
|
||||
zig-v8:
|
||||
description: 'zig v8 version to install'
|
||||
required: false
|
||||
default: 'v0.5.6'
|
||||
default: 'v0.5.7'
|
||||
v8:
|
||||
description: 'v8 version to install'
|
||||
required: false
|
||||
|
||||
@@ -13,7 +13,7 @@ inputs:
|
||||
zig-v8:
|
||||
description: 'zig-v8 release tag the prebuilt lib came from'
|
||||
required: false
|
||||
default: 'v0.5.6'
|
||||
default: 'v0.5.7'
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ FROM debian:stable-slim
|
||||
ARG MINISIG=0.12
|
||||
ARG ZIG_MINISIG=RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U
|
||||
ARG V8=14.9.207.35
|
||||
ARG ZIG_V8=v0.5.6
|
||||
ARG ZIG_V8=v0.5.7
|
||||
ARG TARGETPLATFORM
|
||||
|
||||
RUN apt-get update -yq && \
|
||||
|
||||
+4
-4
@@ -5,8 +5,8 @@
|
||||
.minimum_zig_version = "0.16.0",
|
||||
.dependencies = .{
|
||||
.v8 = .{
|
||||
.url = "https://github.com/lightpanda-io/zig-v8-fork/archive/d3d7b41677a0015fdfa55a8b1caa4f214de6d209.tar.gz",
|
||||
.hash = "v8-0.0.0-xddH624yAwC5_H_8T303uTxiSAnAu2zrxv6MHLhvLo6t",
|
||||
.url = "https://github.com/lightpanda-io/zig-v8-fork/archive/ebd2fabfb001294ed43ef65286c7db17245416e9.tar.gz",
|
||||
.hash = "v8-0.0.0-xddH66lEAwB-5Ec92QAp19-aZ6-oB8UnnUm-w3fBUEaX",
|
||||
},
|
||||
// .v8 = .{ .path = "../zig-v8-fork" },
|
||||
.brotli = .{
|
||||
@@ -40,8 +40,8 @@
|
||||
.hash = "zenai-0.0.0-iOY_VKquBgBT36nAFRpM4tQki3JNZgFvTwQY6Pz-wiQx",
|
||||
},
|
||||
.isocline = .{
|
||||
.url = "git+https://github.com/arrufat/isocline#ec538faf435c616a6b38716f53980b5815c30f8a",
|
||||
.hash = "N-V-__8AAHhtEwBIqx5nOoiGo_FLAG8gpiVC6XzZn1teMKd0",
|
||||
.url = "git+https://github.com/arrufat/isocline#4a99434bee4a5ed04c1639514224d48cd55e1405",
|
||||
.hash = "N-V-__8AAHxtEwB16xj2Xz-zx_uklGdTP5C2-GHXDoSzah-8",
|
||||
},
|
||||
.pcre2 = .{
|
||||
.url = "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.48/pcre2-10.48.tar.gz",
|
||||
|
||||
+2285
-2316
File diff suppressed because it is too large.
Load diff
+157
-189
@@ -65,6 +65,7 @@ _ZN10__cxxabiv117__class_type_infoD0Ev
|
||||
_ZN10__cxxabiv120__si_class_type_infoD0Ev
|
||||
_ZN10__cxxabiv121__vmi_class_type_infoD0Ev
|
||||
_ZNK10__cxxabiv117__class_type_info9can_catchEPKNS_16__shim_type_infoERPv
|
||||
__dynamic_cast
|
||||
_ZN12v8_inspector8String16D2Ev
|
||||
v8__Platform__NewDefaultPlatform
|
||||
v8__Platform__DELETE
|
||||
@@ -642,8 +643,7 @@ _ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv
|
||||
_ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi
|
||||
_ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi
|
||||
_ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj
|
||||
_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE
|
||||
_ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev
|
||||
_ZNSt4__Cr13basic_filebufIcNS_11char_traitsIcEEE4openEPKcj
|
||||
_ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev
|
||||
_ZNSt4__Cr15basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj
|
||||
_ZNSt4__Cr18basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
|
||||
@@ -820,14 +820,6 @@ _ZNKSt4__Cr7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4
|
||||
_ZNSt4__Cr9__num_putIcE21__widen_and_group_intEPcS2_S2_S2_RS2_S3_RKNS_6localeE
|
||||
_ZNSt4__Cr9__num_putIcE23__widen_and_group_floatEPcS2_S2_S2_RS2_S3_RKNS_6localeE
|
||||
_ZNSt4__Cr9__num_putIwE21__widen_and_group_intEPcS2_S2_PwRS3_S4_RKNS_6localeE
|
||||
_ZNSt4__Cr9__num_putIwE23__widen_and_group_floatEPcS2_S2_PwRS3_S4_RKNS_6localeE
|
||||
_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKcSC_
|
||||
_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13do_date_orderEv
|
||||
_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm
|
||||
_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm
|
||||
_ZNKSt4__Cr8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm
|
||||
_ZNKSt4__Cr8messagesIcE6do_getEliiRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
|
||||
_ZNKSt4__Cr8messagesIcE8do_closeEl
|
||||
_ZNKSt4__Cr8messagesIwE7do_openERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_6localeE
|
||||
_ZNKSt4__Cr8messagesIwE6do_getEliiRKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEE
|
||||
_ZNKSt4__Cr16__narrow_to_utf8ILm32EEclINS_20back_insert_iteratorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEwEET_SB_PKT0_SE_
|
||||
@@ -1191,7 +1183,7 @@ _ZN2v84base21RandomNumberGenerator10NextDoubleEv
|
||||
_ZN2v84base21RandomNumberGenerator9NextInt64Ev
|
||||
_ZN2v84base21RandomNumberGenerator9NextBytesEPvm
|
||||
_ZN2v84base21RandomNumberGenerator10NextSampleEmm
|
||||
_ZNSt4__Cr12__hash_tableImNS_4hashImEENS_8equal_toImEENS_9allocatorImEEE11__do_rehashILb1EEEvm
|
||||
_ZN2v84baseL16ComplementSampleERKNSt4__Cr13unordered_setImNS1_4hashImEENS1_8equal_toImEENS1_9allocatorImEEEEm
|
||||
_ZZNSt4__Cr12__hash_tableImNS_4hashImEENS_8equal_toImEENS_9allocatorImEEE16__emplace_uniqueIJRmEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeImPvEEEEbEEDpOT_ENKUlRKmS9_E_clESM_S9_
|
||||
_ZNK2v84base9TimeDelta10InSecondsFEv
|
||||
_ZNK2v84base9TimeDelta9InSecondsEv
|
||||
@@ -2168,6 +2160,7 @@ _ZN2v88internal7Isolate22PrintCurrentStackTraceERNSt4__Cr13basic_ostreamIcNS2_11
|
||||
_ZNKRSt4__Cr19basic_ostringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv
|
||||
_ZN2v88internal7Isolate16IsOnCentralStackEv
|
||||
_ZN2v88internal7Isolate15ComputeLocationEPNS0_15MessageLocationE
|
||||
_ZN2v88internal7Isolate34NotifyExceptionPropagationCallbackEv
|
||||
_ZN2v88internal12_GLOBAL__N_124TryGetCurrentTaskPromiseEPNS0_7IsolateE
|
||||
_ZN2v88internal12_GLOBAL__N_123WalkPromiseTreeInternalEPNS0_7IsolateENS0_12DirectHandleINS0_9JSPromiseEEERKNSt4__Cr8functionIFvNS2_14PromiseHandlerEEEE
|
||||
_ZN2v88internal7Isolate41SetCaptureStackTraceForUncaughtExceptionsEbiNS_10StackTrace17StackTraceOptionsE
|
||||
@@ -2421,6 +2414,7 @@ _ZN2v88internal14FutexEmulation17NotifyAsyncWaiterEPNS0_17FutexWaitListNodeE
|
||||
_ZN2v88internal13FutexWaitList10RemoveNodeEPNS0_17FutexWaitListNodeE
|
||||
_ZN2v84base8SmallMapINSt4__Cr3mapIPNS_8internal7IsolateENS4_13FutexWaitList11HeadAndTailENS2_4lessIS6_EENS2_9allocatorINS2_4pairIKS6_S8_EEEEEELm4ENS0_8internal16select_equal_keyISG_Lb0EE9equal_keyENSH_19SmallMapDefaultInitISG_EEE6insertERKSE_
|
||||
_ZN2v84base8SmallMapINSt4__Cr3mapIPvNS_8internal13FutexWaitList11HeadAndTailENS2_4lessIS4_EENS2_9allocatorINS2_4pairIKS4_S7_EEEEEELm16ENS0_8internal16select_equal_keyISF_Lb0EE9equal_keyENSG_19SmallMapDefaultInitISF_EEE6insertERKSD_
|
||||
_ZN2v84base8SmallMapINSt4__Cr3mapIPvNS_8internal13FutexWaitList11HeadAndTailENS2_4lessIS4_EENS2_9allocatorINS2_4pairIKS4_S7_EEEEEELm16ENS0_8internal16select_equal_keyISF_Lb0EE9equal_keyENSG_19SmallMapDefaultInitISF_EEE4findERSC_
|
||||
_ZN2v88internal14FutexEmulation4WakeEPvj
|
||||
_ZN2v88internal14FutexEmulation4WakeEmj
|
||||
_ZN2v88internal14FutexEmulation25CleanupAsyncWaiterPromiseEPNS0_17FutexWaitListNodeE
|
||||
@@ -3119,7 +3113,7 @@ _ZN4absl18container_internal12_GLOBAL__N_132ResizeEmptyNonAllocatedTableImplERNS
|
||||
_ZN4absl18container_internal4CopyERNS0_12CommonFieldsERKNS0_15PolicyFunctionsERKS1_NS_11FunctionRefIFvPvPKvEEE
|
||||
_ZN4absl18container_internal24ReserveTableToFitNewSizeERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEm
|
||||
_ZN4absl18container_internal12_GLOBAL__N_121ReserveAllocatedTableERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEm
|
||||
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPKvmEENS_22__unordered_map_hasherIS3_NS_4pairIKS3_mEENS_4hashIS3_EENS_8equal_toIS3_EEEENS_21__unordered_map_equalIS3_S8_SC_SA_EENS_9allocatorIS8_EEE16__emplace_uniqueIJS8_EEENS6_INS_15__hash_iteratorIPNS_11__hash_nodeIS4_PvEEEEbEEDpOT_ENKUlRS7_OS8_E_clESU_SV_
|
||||
_ZN4absl18container_internal18PrepareInsertLargeERNS0_12CommonFieldsERKNS0_15PolicyFunctionsEmNS0_18NonIterableBitMaskIjLi16ELi0EEENS0_8FindInfoE
|
||||
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIPKvmEENS_22__unordered_map_hasherIS3_NS_4pairIKS3_mEENS_4hashIS3_EENS_8equal_toIS3_EEEENS_21__unordered_map_equalIS3_S8_SC_SA_EENS_9allocatorIS8_EEE11__do_rehashILb1EEEvm
|
||||
_ZNSt4__Cr6vectorIN5cppgc14HeapStatistics16ObjectStatsEntryENS_9allocatorIS3_EEE20__throw_length_errorEv
|
||||
_ZNK4heap4base5Stack26IteratePointersUntilMarkerEPNS0_12StackVisitorE
|
||||
@@ -3596,6 +3590,8 @@ _ZN2v88internal9Assembler4movlENS0_7OperandEPNS0_5LabelE
|
||||
_ZN2v88internal9Assembler7movsxblENS0_8RegisterES2_
|
||||
_ZN2v88internal9Assembler7movsxblENS0_8RegisterENS0_7OperandE
|
||||
_ZN2v88internal9Assembler7movsxbqENS0_8RegisterENS0_7OperandE
|
||||
_ZN2v88internal9Assembler7movsxbqENS0_8RegisterES2_
|
||||
_ZN2v88internal9Assembler7movsxwlENS0_8RegisterES2_
|
||||
_ZN2v88internal9Assembler22emit_trace_instructionENS0_9ImmediateE
|
||||
_ZN2v88internal9Assembler5pushqENS0_8RegisterE
|
||||
_ZN2v88internal9Assembler4popqENS0_8RegisterE
|
||||
@@ -3626,7 +3622,10 @@ _ZN2v88internal9Assembler5testwENS0_7OperandENS0_8RegisterE
|
||||
_ZN2v88internal9Assembler5fld_dENS0_7OperandE
|
||||
_ZN2v88internal9Assembler6fstp_dENS0_7OperandE
|
||||
_ZN2v88internal9Assembler4fstpEi
|
||||
_ZN2v88internal9Assembler6movupsENS0_11XMMRegisterENS0_7OperandE
|
||||
_ZN2v88internal9Assembler5fpremEv
|
||||
_ZN2v88internal9Assembler9fnstsw_axEv
|
||||
_ZN2v88internal9Assembler4sahfEv
|
||||
_ZN2v88internal9Assembler4movdENS0_11XMMRegisterENS0_8RegisterE
|
||||
_ZN2v88internal9Assembler6movupsENS0_7OperandENS0_11XMMRegisterE
|
||||
_ZN2v88internal9Assembler9sse_instrENS0_11XMMRegisterES2_hh
|
||||
_ZN2v88internal9Assembler9sse_instrENS0_11XMMRegisterENS0_7OperandEhh
|
||||
@@ -3720,7 +3719,7 @@ _ZNSt4__Cr6vectorIN2v88internal13VirtualMemoryENS_9allocatorIS3_EEE7reserveEm
|
||||
_ZN2v88internal4wasm17WasmCodeAllocatorD2Ev
|
||||
_ZN2v88internal4wasm17WasmCodeAllocatorD1Ev
|
||||
_ZN2v88internal4wasm17WasmCodeAllocator4InitENS0_13VirtualMemoryE
|
||||
_ZN2v88internal4wasm12NativeModule12SetWireBytesENS_4base11OwnedVectorIKhEE
|
||||
_ZNSt4__Cr6vectorIN2v88internal13VirtualMemoryENS_9allocatorIS3_EEE12emplace_backIJS3_EEERS3_DpOT_
|
||||
_ZNK2v88internal4wasm12NativeModule6LookupEm
|
||||
_ZN2v88internal4wasm12NativeModuleD2Ev
|
||||
_ZN2v88internal4wasm12NativeModuleD1Ev
|
||||
@@ -3766,7 +3765,7 @@ _ZN2v88internal14SegmentedTableINS0_4wasm25WasmCodePointerTableEntryELm134217728
|
||||
_ZZNSt4__Cr6vectorINS_10unique_ptrIN2v88internal4wasm8WasmCodeENS_14default_deleteIS5_EEEENS_9allocatorIS8_EEE12emplace_backIJS8_EEERS8_DpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6vectorINS_10unique_ptrIN2v88internal4wasm8WasmCodeENS_14default_deleteIS5_EEEENS_9allocatorIS8_EEE20__throw_length_errorEv
|
||||
_ZZNSt4__Cr6vectorIPN2v88internal4wasm8WasmCodeENS_9allocatorIS5_EEE12emplace_backIJS5_EEERS5_DpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6vectorIN2v88internal4wasm19UnpublishedWasmCodeENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJNS_10unique_ptrINS3_8WasmCodeENS_14default_deleteISA_EEEENS9_INS3_18AssumptionsJournalENSB_ISE_EEEEEEEPS4_DpOT_
|
||||
_ZN2v88internal4wasm19WasmModuleSourceMapD2Ev
|
||||
_ZNSt4__Cr25__try_key_extraction_implIN2v84base13AddressRegionENS_4pairINS_15__tree_iteratorIS3_PNS_11__tree_nodeIS3_PvEElEEbEEZNS_6__treeIS3_NS3_16StartAddressLessENS_9allocatorIS3_EEE21__emplace_hint_uniqueIJRKS3_EEESB_NS_21__tree_const_iteratorIS3_S9_lEEDpOT_EUlSJ_SJ_E_ZNSH_IJSJ_EEESB_SL_SO_EUlSJ_E_SJ_TnNS_9enable_ifIXsr7is_sameIT_u14__remove_constIu20__remove_reference_tIT3_EEEE5valueEiE4typeELi0EEET0_NS_14__priority_tagILm1EEET1_T2_OST_
|
||||
_ZNSt4__Cr6__treeIN2v84base13AddressRegionENS3_16StartAddressLessENS_9allocatorIS3_EEE12__find_equalIS3_EENS_4pairIPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSE_EENS_21__tree_const_iteratorIS3_PNS_11__tree_nodeIS3_SC_EElEESH_RKT_
|
||||
_ZNSt4__Cr25__try_key_extraction_implIN2v84base13AddressRegionENS_4pairINS_15__tree_iteratorIS3_PNS_11__tree_nodeIS3_PvEElEEbEEZNS_6__treeIS3_NS3_16StartAddressLessENS_9allocatorIS3_EEE21__emplace_hint_uniqueIJS3_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_
|
||||
@@ -3829,7 +3828,7 @@ _ZN2v88internal12trap_handler24CoveredMemoryRecordsLockC1Ev
|
||||
_ZN2v88internal12trap_handler24CoveredMemoryRecordsLockD2Ev
|
||||
_ZN2v88internal12trap_handler24CoveredMemoryRecordsLockD1Ev
|
||||
_ZN2v88internal4wasm11AdaptiveMapINS1_12WireBytesRefEE20FinishInitializationEv
|
||||
_ZN2v88internal12StringHasher20HashSequentialStringIcEEjPKT_jNS0_8HashSeedE
|
||||
_ZNSt4__Cr6vectorIN2v88internal4wasm12WireBytesRefENS_9allocatorIS4_EEE6resizeEm
|
||||
_ZN2v88internal4wasm16NumFeedbackSlotsEPKNS1_10WasmModuleEi
|
||||
_ZNSt4__Cr6vectorIN2v88internal4wasm12WireBytesRefENS_9allocatorIS4_EEE20__throw_length_errorEv
|
||||
_ZNSt4__Cr6__treeINS_12__value_typeIjN2v88internal4wasm12WireBytesRefEEENS_19__map_value_compareIjNS_4pairIKjS5_EENS_4lessIjEEEENS_9allocatorISA_EEE14__tree_deleterclEPNS_11__tree_nodeIS6_PvEE
|
||||
@@ -3857,6 +3856,7 @@ _ZN2v88internal4wasm10WasmEngineD1Ev
|
||||
_ZNK2v88internal4wasm10WasmEngine37PrintCurrentMemoryConsumptionEstimateEv
|
||||
_ZNSt4__Cr6vectorINS_10shared_ptrIN2v88internal4wasm12NativeModuleEEENS_9allocatorIS6_EEED2Ev
|
||||
_ZN2v88internal4wasm17TypeCanonicalizerD2Ev
|
||||
_ZN2v88internal4wasm10WasmEngine12SyncValidateEPNS0_7IsolateENS1_19WasmEnabledFeaturesENS1_18CompileTimeImportsENS_4base6VectorIKhEE
|
||||
_ZN2v88internal4wasm10WasmEngine24LeaveDebuggingForIsolateEPNS0_7IsolateE
|
||||
_ZN2v88internal4wasm10WasmEngine16FlushLiftoffCodeEv
|
||||
_ZN2v88internal4wasm10WasmEngine26GetOrCreateTurboStatisticsEv
|
||||
@@ -3940,7 +3940,6 @@ _ZN2v88internal4wasm10WasmEngine12LogCodesTask11RunInternalEv
|
||||
_ZThn32_N2v88internal4wasm10WasmEngine12LogCodesTaskD1Ev
|
||||
_ZThn32_N2v88internal4wasm10WasmEngine12LogCodesTaskD0Ev
|
||||
_ZNSt4__Cr6vectorIPN2v88internal4wasm8WasmCodeENS_9allocatorIS5_EEE18__insert_with_sizeINS_17_ClassicAlgPolicyEPS5_SB_EENS_11__wrap_iterISB_EENSC_IPKS5_EET0_T1_l
|
||||
_ZNK2v88internal4wasm17NativeModuleCache3KeyltERKS3_
|
||||
_ZZNSt4__Cr6__treeINS_12__value_typeIN2v88internal4wasm17NativeModuleCache3KeyENS_8optionalINS_8weak_ptrINS4_12NativeModuleEEEEEEENS_19__map_value_compareIS6_NS_4pairIKS6_SB_EENS_4lessIS6_EEEENS_9allocatorISG_EEE16__emplace_uniqueIJRS6_RKNS_9nullopt_tEEEENSE_INS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEEDpOT_ENKUlRSF_SO_SR_E_clES12_SO_SR_
|
||||
_ZNSt4__Cr6__treeINS_12__value_typeIN2v88internal4wasm17NativeModuleCache3KeyENS_8optionalINS_8weak_ptrINS4_12NativeModuleEEEEEEENS_19__map_value_compareIS6_NS_4pairIKS6_SB_EENS_4lessIS6_EEEENS_9allocatorISG_EEE5eraseENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEE
|
||||
_ZZNSt4__Cr6__treeINS_12__value_typeIN2v88internal4wasm17NativeModuleCache3KeyENS_8optionalINS_8weak_ptrINS4_12NativeModuleEEEEEEENS_19__map_value_compareIS6_NS_4pairIKS6_SB_EENS_4lessIS6_EEEENS_9allocatorISG_EEE16__emplace_uniqueIJRSF_SB_EEENSE_INS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEEDpOT_ENKUlSO_SO_OSB_E_clESO_SO_SZ_
|
||||
@@ -4182,33 +4181,6 @@ _ZN2v88internal4wasm20WasmCodePointerTable13SweepSegmentsEm
|
||||
_ZN2v88internal4wasm34GetProcessWideWasmCodePointerTableEv
|
||||
_ZN2v84base11LeakyObjectINS_8internal4wasm20WasmCodePointerTableEEC2IJEEEDpOT_
|
||||
_ZN2v88internal4wasm20WasmCodePointerTable16VectorToFreelistENSt4__Cr6vectorIjNS3_9allocatorIjEEEE
|
||||
_ZN2v88internal4wasm20WasmCodePointerTable17EntrypointEqualToENS0_15WasmCodePointerEm
|
||||
_ZNSt4__Cr6vectorIjNS_9allocatorIjEEE20__throw_length_errorEv
|
||||
_ZZNSt4__Cr6vectorIjNS_9allocatorIjEEE12emplace_backIJRKjEEERjDpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6__treeINS_12__value_typeImN2v88internal15WasmCodePointerEEENS_19__map_value_compareImNS_4pairIKmS4_EENS_4lessImEEEENS_9allocatorIS9_EEE14__tree_deleterclEPNS_11__tree_nodeIS5_PvEE
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspaceC2EPNS_19VirtualAddressSpaceEmmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspaceC1EPNS_19VirtualAddressSpaceEmmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspaceD2Ev
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspaceD1Ev
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspaceD0Ev
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace13SetRandomSeedEl
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace17RandomPageAddressEv
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace13AllocatePagesEmmmNS_15PagePermissionsE
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace9FreePagesEmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace19AllocateSharedPagesEmmNS_15PagePermissionsENS_18SharedMemoryHandleEm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace15FreeSharedPagesEmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace18SetPagePermissionsEmmNS_15PagePermissionsE
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace19AllocateGuardRegionEmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace15FreeGuardRegionEmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace20CanAllocateSubspacesEv
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace16AllocateSubspaceEmmmNS_15PagePermissionsENSt4__Cr8optionalIiEENS4_INS_18SharedMemoryHandleEEE
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace13RecommitPagesEmmNS_15PagePermissionsE
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace18DiscardSystemPagesEmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace13DecommitPagesEmm
|
||||
_ZN2v84base30EmulatedVirtualAddressSubspace25ActiveMemoryProtectionKeyEv
|
||||
_ZN2v819VirtualAddressSpace7SetNameERKNSt4__Cr12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE
|
||||
_ZNSt4__Cr6__sortIRNS_6__lessIaaEEPaEEvT0_S5_T_
|
||||
_ZNSt4__Cr11__introsortINS_17_ClassicAlgPolicyENS_6ranges4lessEPaLb1EEEvT1_S5_T0_NS_15iterator_traitsIS5_E15difference_typeEb
|
||||
_ZNSt4__Cr18__bitset_partitionINS_17_ClassicAlgPolicyEPdNS_6ranges4lessEEENS_4pairIT0_bEES6_S6_T1_
|
||||
_ZNSt4__Cr27__insertion_sort_incompleteINS_17_ClassicAlgPolicyENS_6ranges4lessEPdEEbT1_S5_T0_
|
||||
_ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERNS_6ranges4lessEPdS5_EET1_S6_S6_T2_OT0_
|
||||
@@ -4346,7 +4318,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
|
||||
_ZN2v88internal21StringCharacterStream14CountUtf8BytesEj
|
||||
_ZN2v88internal21StringCharacterStream14WriteUtf8BytesEjPcm
|
||||
_ZN2v88internal6String9ToCStringEPm
|
||||
_ZN2v88internal6String11ToStdStringEv
|
||||
@@ -4404,7 +4375,7 @@ _ZN2v84base11SmallVectorIiLm32ENSt4__Cr9allocatorIiEEE11FreeStorageEv
|
||||
_ZN2v84base11SmallVectorIiLm32ENSt4__Cr9allocatorIiEEE4GrowEm
|
||||
_ZN2v84base11SmallVectorIiLm32ENSt4__Cr9allocatorIiEEE4GrowEv
|
||||
_ZN2v88internal12StringSearchIhhE16SingleCharSearchEPS2_NS_4base6VectorIKhEEi
|
||||
_ZN2v88internal12StringSearchIttE24BoyerMooreHorspoolSearchEPS2_NS_4base6VectorIKtEEi
|
||||
_ZN2v88internal12StringSearchIhhE12LinearSearchEPS2_NS_4base6VectorIKhEEi
|
||||
_ZN2v88internal12StringSearchIttE23PopulateBoyerMooreTableEv
|
||||
_ZN2v88internal12StringSearchIttE16BoyerMooreSearchEPS2_NS_4base6VectorIKtEEi
|
||||
_ZN2v88internal12StringHasher20HashSequentialStringIhEEjPKT_jNS0_8HashSeedE
|
||||
@@ -4594,6 +4565,7 @@ _ZN2v88internal7Factory32NewJSArrayWithUnverifiedElementsENS0_12DirectHandleINS0
|
||||
_ZN2v88internal7Factory33NewJSArrayForTemplateLiteralArrayENS0_12DirectHandleINS0_10FixedArrayEEES4_ii
|
||||
_ZN2v88internal7Factory17NewJSArrayStorageENS0_12DirectHandleINS0_7JSArrayEEEjjNS0_26ArrayStorageAllocationModeE
|
||||
_ZN2v88internal7Factory20NewJSModuleNamespaceEv
|
||||
_ZN2v88internal7Factory28NewJSDeferredModuleNamespaceEv
|
||||
_ZN2v88internal7Factory28NewJSUint8ArraySetFromResultENS0_12DirectHandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberEEEEEES7_
|
||||
_ZN2v88internal7Factory18NewJSBoundFunctionENS0_12DirectHandleINS0_10JSReceiverEEENS2_INS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedES3_EEEEENS_4base6VectorINS2_INS0_6ObjectEEEEENS2_INS5_IJS3_SC_EEEEE
|
||||
_ZN2v88internal7Factory29NewUninitializedJSGlobalProxyEi
|
||||
@@ -5273,6 +5245,7 @@ _ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor15VisitCodeTargetENS0_6
|
||||
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor20VisitEmbeddedPointerENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE
|
||||
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor15VisitMapPointerENS0_6TaggedINS0_10HeapObjectEEE
|
||||
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor17VisitRootPointersENS0_4RootEPKcNS0_14FullObjectSlotES6_
|
||||
_ZN2v88internal24UnreachableObjectsFilter14MarkingVisitor27VisitCompressedRootPointersENS0_4RootEPKcNS0_27OffHeapCompressedObjectSlotINS0_27V8HeapCompressionSchemeImplINS0_8MainCageEEEEESA_
|
||||
_ZZNSt4__Cr12__hash_tableIN2v88internal6TaggedINS2_10HeapObjectEEENS2_6Object6HasherENS_8equal_toIS5_EENS_9allocatorIS5_EEE16__emplace_uniqueIJRKS5_EEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEEDpOT_ENKUlSF_SF_E_clESF_SF_
|
||||
_ZNSt4__Cr12__hash_tableIN2v88internal6TaggedINS2_10HeapObjectEEENS2_6Object6HasherENS_8equal_toIS5_EENS_9allocatorIS5_EEE11__do_rehashILb1EEEvm
|
||||
_ZZNSt4__Cr6vectorIN2v88internal6TaggedINS2_10HeapObjectEEENS_9allocatorIS5_EEE12emplace_backIJRKS5_EEERS5_DpOT_ENKUlvE0_clEv
|
||||
@@ -5375,6 +5348,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_
|
||||
@@ -5542,7 +5516,6 @@ _ZN2v88internal10HeapObject16RehashBasedOnMapINS0_7IsolateEEEvPT_
|
||||
_ZN2v88internal9HashTableINS0_15ObjectHashTableENS0_20ObjectHashTableShapeEE6RehashENS0_16PtrComprCageBaseE
|
||||
_ZN2v88internal9HashTableINS0_14NameDictionaryENS0_19NameDictionaryShapeEE6RehashENS0_16PtrComprCageBaseE
|
||||
_ZN2v88internal9HashTableINS0_20NameToIndexHashTableENS0_16NameToIndexShapeEE6RehashENS0_16PtrComprCageBaseE
|
||||
_ZN2v88internal9HashTableINS0_20SimpleNameDictionaryENS0_25SimpleNameDictionaryShapeEE6RehashENS0_16PtrComprCageBaseE
|
||||
_ZN2v88internal9HashTableINS0_22SimpleNumberDictionaryENS0_27SimpleNumberDictionaryShapeEE6RehashENS0_16PtrComprCageBaseE
|
||||
_ZN2v88internal5JSMap6RehashEPNS0_7IsolateE
|
||||
_ZN2v88internal5JSSet6RehashEPNS0_7IsolateE
|
||||
@@ -5604,7 +5577,6 @@ _ZN2v88internal19ObjectHashTableBaseINS0_18EphemeronHashTableENS0_23EphemeronHas
|
||||
_ZN2v88internal9HashTableINS0_18ObjectTwoHashTableENS0_25ObjectMultiHashTableShapeILi2EEEE6RehashENS0_16PtrComprCageBaseE
|
||||
_ZN2v88internal9HashTableINS0_18ObjectTwoHashTableENS0_25ObjectMultiHashTableShapeILi2EEEE4SwapENS0_13InternalIndexES6_NS0_16WriteBarrierModeE
|
||||
_ZN2v88internal9HashTableINS0_18ObjectTwoHashTableENS0_25ObjectMultiHashTableShapeILi2EEEE6RehashENS0_16PtrComprCageBaseENS0_6TaggedIS2_EE
|
||||
_ZN2v88internal10DictionaryINS0_22SimpleNumberDictionaryENS0_27SimpleNumberDictionaryShapeEE8SetEntryENS0_13InternalIndexENS0_6TaggedINS0_6ObjectEEES8_NS0_15PropertyDetailsE
|
||||
_ZN2v88internal10DictionaryINS0_22SimpleNumberDictionaryENS0_27SimpleNumberDictionaryShapeEE3AddINS0_7IsolateENS0_6HandleELNS0_14AllocationTypeE0EQsr3stdE16is_convertible_vITL0_0_IT_ENS0_12DirectHandleISA_EEEEET0_IS2_EPSA_SF_jNSC_INS0_6ObjectEEENS0_15PropertyDetailsEPNS0_13InternalIndexE
|
||||
_ZN2v88internal9HashTableINS0_16NumberDictionaryENS0_21NumberDictionaryShapeEE4SwapENS0_13InternalIndexES5_NS0_16WriteBarrierModeE
|
||||
_ZN2v88internal9HashTableINS0_16NumberDictionaryENS0_21NumberDictionaryShapeEE6RehashENS0_16PtrComprCageBaseENS0_6TaggedIS2_EE
|
||||
@@ -5677,7 +5649,6 @@ _ZN2v88internallsERNSt4__Cr13basic_ostreamIcNS1_11char_traitsIcEEEENS0_12Instanc
|
||||
_ZN2v88internal6Object11OptimalTypeENS0_6TaggedIS1_EEPNS0_7IsolateENS0_14RepresentationE
|
||||
_ZN2v88internal6Object13NewStorageForEPNS0_7IsolateENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverENS0_4HoleEEEEEENS0_14RepresentationE
|
||||
_ZN2v88internal6Object12ToObjectImplEPNS0_7IsolateENS0_12DirectHandleIS1_EEPKc
|
||||
_ZN2v88internal6Object23CreateListFromArrayLikeEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_12ElementTypesE
|
||||
_ZN2v88internal6Object22GetLengthFromArrayLikeEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEE
|
||||
_ZN2v88internal6Object24InstantiateIfLazyClosureEPNS0_14LookupIteratorENS0_12DirectHandleIS1_EE
|
||||
_ZN2v88internal6Object11SetPropertyEPNS0_14LookupIteratorENS0_12DirectHandleIS1_EENS0_11StoreOriginENS_5MaybeINS0_11ShouldThrowEEE
|
||||
@@ -5821,14 +5792,6 @@ _ZNSt4__Cr26__insertion_sort_unguardedINS_17_ClassicAlgPolicyERN2v88internal19En
|
||||
_ZNSt4__Cr31__partition_with_equals_on_leftINS_17_ClassicAlgPolicyEN2v88internal10AtomicSlotERNS3_19EnumIndexComparatorINS3_14NameDictionaryEEEEET0_S9_S9_T1_
|
||||
_ZNSt4__Cr32__partition_with_equals_on_rightINS_17_ClassicAlgPolicyEN2v88internal10AtomicSlotERNS3_19EnumIndexComparatorINS3_14NameDictionaryEEEEENS_4pairIT0_bEESA_SA_T1_
|
||||
_ZNSt4__Cr27__insertion_sort_incompleteINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEbT1_S9_T0_
|
||||
_ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotES8_EET1_S9_S9_T2_OT0_
|
||||
_ZNSt4__Cr11__make_heapINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT1_S9_OT0_
|
||||
_ZNSt4__Cr11__sift_downINS_17_ClassicAlgPolicyELb0ERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT2_OT1_NS_15iterator_traitsIS9_E15difference_typeESE_
|
||||
_ZNSt4__Cr11__sift_downINS_17_ClassicAlgPolicyELb1ERN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT2_OT1_NS_15iterator_traitsIS9_E15difference_typeESE_
|
||||
_ZNSt4__Cr10__pop_heapINS_17_ClassicAlgPolicyEN2v88internal19EnumIndexComparatorINS3_14NameDictionaryEEENS3_10AtomicSlotEEEvT1_S8_RT0_NS_15iterator_traitsIS8_E15difference_typeE
|
||||
_ZNSt4__Cr11__introsortINS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotELb0EEEvT1_S9_T0_NS_15iterator_traitsIS9_E15difference_typeEb
|
||||
_ZNSt4__Cr7__sort3INS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotETnNS_9enable_ifIXnt21__use_branchless_sortIT0_T1_EEiE4typeELi0EEEbSB_SB_SB_SA_
|
||||
_ZNSt4__Cr7__sort4INS_17_ClassicAlgPolicyERN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotETnNS_9enable_ifIXnt21__use_branchless_sortIT0_T1_EEiE4typeELi0EEEvSB_SB_SB_SB_SA_
|
||||
_ZNSt4__Cr10__pop_heapINS_17_ClassicAlgPolicyEN2v88internal19EnumIndexComparatorINS3_16GlobalDictionaryEEENS3_10AtomicSlotEEEvT1_S8_RT0_NS_15iterator_traitsIS8_E15difference_typeE
|
||||
_ZN2v88internal17PrototypeIterator23AdvanceFollowingProxiesEv
|
||||
_ZN2v88internal17PrototypeIterator43AdvanceFollowingProxiesIgnoringAccessChecksEv
|
||||
@@ -5900,6 +5863,11 @@ _ZN2v88internal10JSReceiver17SetIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleI
|
||||
_ZN2v88internal8JSObject18TestIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_18PropertyAttributesE
|
||||
_ZN2v88internal8JSObject31PreventExtensionsWithTransitionILNS0_18PropertyAttributesE4EEENS_5MaybeIbEEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE
|
||||
_ZN2v88internal8JSObject31PreventExtensionsWithTransitionILNS0_18PropertyAttributesE5EEENS_5MaybeIbEEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE
|
||||
_ZN2v88internal10JSReceiver17PreventExtensionsEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE
|
||||
_ZN2v88internal10JSReceiver18TestIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_18PropertyAttributesE
|
||||
_ZN2v88internal12_GLOBAL__N_125GenericTestIntegrityLevelEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS0_18PropertyAttributesE
|
||||
_ZN2v88internal8JSObject17PreventExtensionsEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_11ShouldThrowE
|
||||
_ZN2v88internal10JSReceiver12IsExtensibleEPNS0_7IsolateENS0_12DirectHandleIS1_EE
|
||||
_ZN2v88internal25FastGetOwnValuesOrEntriesEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEEbPNS0_6HandleINS0_10FixedArrayEEE
|
||||
_ZN2v88internal8JSObject14FastPropertyAtEPNS0_7IsolateENS0_12DirectHandleIS1_EENS0_14RepresentationENS0_10FieldIndexE
|
||||
_ZN2v88internal21GetOwnValuesOrEntriesEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS0_14PropertyFilterEbb
|
||||
@@ -6396,9 +6364,7 @@ _ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitorD0Ev
|
||||
_ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotES6_
|
||||
_ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotES6_
|
||||
_ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor29VisitInstructionStreamPointerENS0_6TaggedINS0_4CodeEEENS0_27OffHeapCompressedObjectSlotINS0_29ExternalCodeCompressionSchemeEEE
|
||||
_ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor12VisitPointerENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotE
|
||||
_ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor15VisitCodeTargetENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE
|
||||
_ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor20VisitEmbeddedPointerENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE
|
||||
_ZN2v88internal20MarkCompactCollector28CustomRootBodyMarkingVisitor12VisitPointerENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotE
|
||||
_ZN2v88internal20MarkCompactCollector23SharedHeapObjectVisitor15VisitMapPointerENS0_6TaggedINS0_10HeapObjectEEE
|
||||
_ZN2v88internal13RememberedSetILNS0_17RememberedSetTypeE3EE6InsertILNS0_10AccessModeE1EEEvPNS0_11MutablePageEm
|
||||
_ZNSt4__Cr26__throw_bad_variant_accessEv
|
||||
@@ -6433,6 +6399,8 @@ _ZN2v88internal13NativeContext14BodyDescriptor11IterateBodyINS0_18MainMarkingVis
|
||||
_ZN2v88internal24FixedRangeBodyDescriptorILi12ELi24EE11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal24FixedRangeBodyDescriptorILi4ELi32EE11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal12PreparseData14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal24FixedRangeBodyDescriptorILi4ELi20EE11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal7JSProxy14BodyDescriptor11IterateBodyINS0_18MainMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZNK2v88internal18MarkingVisitorBaseINS0_18MainMarkingVisitorEE23ShouldFlushBaselineCodeENS0_6TaggedINS0_10JSFunctionEEE
|
||||
_ZNK2v88internal10JSFunction8raw_codeENS0_17IsolateForSandboxENS_14AcquireLoadTagE
|
||||
_ZN2v88internal10JSFunction30NeedsResetDueToFlushedBytecodeEPNS0_7IsolateENS0_6TaggedINS0_18SharedFunctionInfoEEENS4_INS0_4CodeEEE
|
||||
@@ -6504,8 +6472,7 @@ _ZN2v88internal25RecordMigratedSlotVisitor15VisitMapPointerENS0_6TaggedINS0_10He
|
||||
_ZN2v88internal25RecordMigratedSlotVisitor12VisitPointerENS0_6TaggedINS0_10HeapObjectEEENS0_20CompressedObjectSlotE
|
||||
_ZN2v88internal25RecordMigratedSlotVisitor18RecordMigratedSlotENS0_6TaggedINS0_10HeapObjectEEENS2_INS0_5UnionIJNS0_3SmiES3_NS0_4WeakIS3_EEEEEEEm
|
||||
_ZN2v88internal13RememberedSetILNS0_17RememberedSetTypeE6EE6InsertILNS0_10AccessModeE1EEEvPNS0_11MutablePageEm
|
||||
_ZN2v88internal25SmallOrderedHashTableImplINS0_19SmallOrderedHashSetEE14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS7_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal25SmallOrderedHashTableImplINS0_26SmallOrderedNameDictionaryEE14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS7_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal13RememberedSetILNS0_17RememberedSetTypeE5EE6InsertILNS0_10AccessModeE1EEEvPNS0_11MutablePageEm
|
||||
_ZN2v88internal24FixedRangeBodyDescriptorILi4ELi56EE11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal22SubclassBodyDescriptorINS0_19FixedBodyDescriptorILi4ELi32ELi32EEENS2_ILi32ELi76ELi76EEEE11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS8_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal19SwissNameDictionary14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
@@ -6532,8 +6499,8 @@ _ZN2v88internal10JSFunction14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlo
|
||||
_ZN2v88internal8JSRegExp14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal26JSSynchronizationPrimitive14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal12JSTypedArray14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal23WasmTrustedInstanceData14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal19WasmSuspenderObject14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal9JSWeakRef14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal16WasmGlobalObject14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal8JSObject18FastBodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal28JSAPIObjectWithEmbedderSlots14BodyDescriptor11IterateBodyINS0_25RecordMigratedSlotVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal25PrecisePagePinningVisitorD0Ev
|
||||
@@ -6563,11 +6530,6 @@ _ZN2v88internal23EvacuateNewSpaceVisitor5VisitENS0_6TaggedINS0_10HeapObjectEEENS
|
||||
_ZN2v88internal19EvacuateVisitorBase16RawMigrateObjectILNS1_13MigrationModeE0EEEvPS1_NS0_6TaggedINS0_10HeapObjectEEES7_NS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_15AllocationSpaceE
|
||||
_ZN2v88internal19EvacuateVisitorBaseD0Ev
|
||||
_ZN2v88internal19EvacuateVisitorBase17TryEvacuateObjectENS0_15AllocationSpaceENS0_6TaggedINS0_10HeapObjectEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEEPS5_
|
||||
_ZN2v88internal19EvacuationAllocator8AllocateENS0_15AllocationSpaceENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_19AllocationAlignmentE
|
||||
_ZN2v88internal32EvacuateNewToOldSpacePageVisitorD0Ev
|
||||
_ZN2v88internal19EvacuateVisitorBaseD2Ev
|
||||
_ZN2v88internal23EvacuateOldSpaceVisitorD0Ev
|
||||
_ZN2v88internal23EvacuateOldSpaceVisitor5VisitENS0_6TaggedINS0_10HeapObjectEEENS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEE
|
||||
_ZN2v88internal19EvacuateVisitorBase16RawMigrateObjectILNS1_13MigrationModeE1EEEvPS1_NS0_6TaggedINS0_10HeapObjectEEES7_NS_4base11StrongAliasINS0_17HeapObjectSizeTagEjEENS0_15AllocationSpaceE
|
||||
_ZZNSt4__Cr6vectorIPN2v88internal17MigrationObserverENS_9allocatorIS4_EEE12emplace_backIJRKS4_EEERS4_DpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6vectorIPN2v88internal17MigrationObserverENS_9allocatorIS4_EEE20__throw_length_errorEv
|
||||
@@ -6618,6 +6580,7 @@ _ZN4absl18container_internal23TypeErasedApplyToSlotFnIN2v88internal6Object6Hashe
|
||||
_ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyIN2v88internal6TaggedINS4_10HeapObjectEEENS3_4base11SmallVectorIS7_Lm1ENSt4__Cr9allocatorIS7_EEEEEEJNS4_6Object6HasherENSF_12KeyEqualSafeEEE19transfer_n_slots_fnEPvSJ_SJ_m
|
||||
_ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyIN2v88internal6TaggedINS4_10HeapObjectEEENS3_4base11SmallVectorIS7_Lm1ENSt4__Cr9allocatorIS7_EEEEEEJNS4_6Object6HasherENSF_12KeyEqualSafeEEE46transfer_unprobed_elements_to_next_capacity_fnERNS0_12CommonFieldsEPKNS0_6ctrl_tEPvSO_PFvSO_hmmE
|
||||
_ZN4absl18container_internal15map_slot_policyIN2v88internal6TaggedINS3_10HeapObjectEEENS2_4base11SmallVectorIS6_Lm1ENSt4__Cr9allocatorIS6_EEEEE8transferINSA_INS9_4pairIKS6_SC_EEEEEEDaPT_PNS0_13map_slot_typeIS6_SC_EESN_
|
||||
_ZN4heap4base8WorklistIN2v88internal9EphemeronELt64EE5Local18PublishPushSegmentEv
|
||||
_ZN2v88internal20MarkCompactCollector22ProcessMarkingWorklistILNS1_29MarkingWorklistProcessingModeE1EEENSt4__Cr4pairImmEENS_4base9TimeDeltaEm
|
||||
_ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyIN2v88internal6TaggedINS4_10HeapObjectEEENS3_4base11SmallVectorIS7_Lm1ENSt4__Cr9allocatorIS7_EEEEEEJNS4_6Object6HasherENSF_12KeyEqualSafeEEE5eraseENSI_8iteratorE
|
||||
_ZNK4heap4base8WorklistIN2v88internal9EphemeronELt64EE5Local10NewSegmentEv
|
||||
@@ -6680,6 +6643,8 @@ _ZN2v88internal16MarkingWorklists5Local7IsEmptyEv
|
||||
_ZNK2v88internal16MarkingWorklists5Local14IsWrapperEmptyEv
|
||||
_ZN2v88internal16MarkingWorklists5Local9ShareWorkEv
|
||||
_ZNSt4__Cr8for_eachINS_11__wrap_iterIPN4heap4base8WorklistIN2v88internal6TaggedINS6_10HeapObjectEEELt64EE5LocalEEEZNS6_16MarkingWorklists5Local9ShareWorkEvE3$_0EET0_T_SI_SH_
|
||||
_ZN2v88internal16MarkingWorklists5Local11PublishWorkEv
|
||||
_ZN2v88internal16MarkingWorklists5Local11MergeOnHoldEv
|
||||
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeImjEENS_22__unordered_map_hasherImNS_4pairIKmjEEN2v88internal16MarkingWorklists11ContextHashENS_8equal_toImEEEENS_21__unordered_map_equalImS6_SC_SA_EENS_9allocatorIS6_EEE16__emplace_uniqueIJRmjEEENS4_INS_15__hash_iteratorIPNS_11__hash_nodeIS2_PvEEEEbEEDpOT_ENKUlRS5_SK_OjE_clESV_SK_SW_
|
||||
_ZN2v88internal11WeakObjects5LocalC2EPS1_
|
||||
_ZN2v88internal11WeakObjects5LocalC1EPS1_
|
||||
@@ -6967,6 +6932,7 @@ _ZN2v88internal18FlatStringToDoubleENS0_6TaggedINS0_6StringEEENS0_14ConversionFl
|
||||
_ZN2v88internal17TryStringToDoubleEPNS0_12LocalIsolateENS0_12DirectHandleINS0_6StringEEEj
|
||||
_ZN2v88internal14TryStringToIntEPNS0_12LocalIsolateENS0_12DirectHandleINS0_6StringEEEi
|
||||
_ZN2v88internal14IsSpecialIndexENS0_6TaggedINS0_6StringEEE
|
||||
_ZN2v88internal14IsSpecialIndexENS0_6TaggedINS0_6StringEEERNS0_31SharedStringAccessGuardIfNeededE
|
||||
_ZN2v88internal25InternalStringToIntDoubleILi1EtEEdPKT0_S4_bb
|
||||
_ZN2v88internal25InternalStringToIntDoubleILi2EtEEdPKT0_S4_bb
|
||||
_ZN2v88internal25InternalStringToIntDoubleILi3EtEEdPKT0_S4_bb
|
||||
@@ -7331,6 +7297,8 @@ _ZN2v88internal12DeserializerINS0_12LocalIsolateEE13ReadRootArrayINS0_21SlotAcce
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE22ReadStartupObjectCacheINS0_21SlotAccessorForHandleIS2_EEEEihT_
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE25ReadSharedHeapObjectCacheINS0_21SlotAccessorForHandleIS2_EEEEihT_
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE21ReadExternalReferenceINS0_21SlotAccessorForHandleIS2_EEEEihT_
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE24ReadRawExternalReferenceINS0_21SlotAccessorForHandleIS2_EEEEihT_
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE21ReadAttachedReferenceINS0_21SlotAccessorForHandleIS2_EEEEihT_
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE23ReadOffHeapBackingStoreINS0_24SlotAccessorForRootSlotsEEEihT_
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE16ReadApiReferenceINS0_24SlotAccessorForRootSlotsEEEihT_
|
||||
_ZN2v88internal12DeserializerINS0_12LocalIsolateEE13ReadHotObjectINS0_24SlotAccessorForRootSlotsEEEihT_
|
||||
@@ -7347,6 +7315,18 @@ _ZN2v88internal20FixedStringAllocator8allocateEj
|
||||
_ZN2v88internal20FixedStringAllocator4growEPj
|
||||
_ZN2v88internal12StringStream3PutEc
|
||||
_ZN2v88internal12StringStream3AddENS_4base6VectorIKcEENS3_INS1_6FmtElmEEE
|
||||
_ZN2v88internal12StringStream13PrintUsingMapEPNS0_7IsolateENS0_6TaggedINS0_8JSObjectEEE
|
||||
_ZN2v88internal12StringStream15PrintFixedArrayENS0_6TaggedINS0_10FixedArrayEEEj
|
||||
_ZN2v88internal12StringStream14PrintByteArrayENS0_6TaggedINS0_9ByteArrayEEE
|
||||
_ZN2v88internal12StringStream25PrintMentionedObjectCacheEPNS0_7IsolateE
|
||||
_ZN2v88internal12StringStream27PrintSecurityTokenIfChangedEPNS0_7IsolateENS0_6TaggedINS0_10JSFunctionEEE
|
||||
_ZN2v88internal12StringStream13PrintFunctionEPNS0_7IsolateENS0_6TaggedINS0_10JSFunctionEEENS4_INS0_6ObjectEEE
|
||||
_ZN2v88internal12StringStream14PrintPrototypeEPNS0_7IsolateENS0_6TaggedINS0_10JSFunctionEEENS4_INS0_6ObjectEEE
|
||||
_ZN2v88internal19HeapStringAllocator4growEPj
|
||||
_ZN2v88internal19HeapStringAllocatorD2Ev
|
||||
_ZN2v88internal19HeapStringAllocatorD0Ev
|
||||
_ZN2v88internal15StringAllocatorD2Ev
|
||||
_ZN2v88internal20FixedStringAllocatorD0Ev
|
||||
_ZZNSt4__Cr6vectorIN2v88internal6HandleINS2_10HeapObjectEEENS_9allocatorIS5_EEE12emplace_backIJS5_EEERS5_DpOT_ENKUlvE0_clEv
|
||||
_ZN2v88internal9ScopeInfo6CreateINS0_7IsolateEEENS0_6HandleIS1_EEPT_PNS0_4ZoneEPNS0_5ScopeENS0_17MaybeDirectHandleIS1_EENS0_12FunctionKindE
|
||||
_ZN2v88internal20SourceTextModuleInfo3NewINS0_7IsolateEEENS0_12DirectHandleIS1_EEPT_PNS0_4ZoneEPNS0_26SourceTextModuleDescriptorE
|
||||
@@ -7624,7 +7604,6 @@ _ZN2v88internal18BasicBlockProfiler11ResetCountsEPNS0_7IsolateE
|
||||
_ZN2v88internal18BasicBlockProfiler7HasDataEPNS0_7IsolateE
|
||||
_ZN2v88internal18BasicBlockProfiler5PrintEPNS0_7IsolateERNSt4__Cr13basic_ostreamIcNS4_11char_traitsIcEEEE
|
||||
_ZN2v88internallsERNSt4__Cr13basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_22BasicBlockProfilerDataE
|
||||
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinENS_13unordered_mapIS4_NS3_15CallProbabilityENS_4hashIS4_EENS_8equal_toIS4_EENS_9allocatorINS_4pairIKS4_S6_EEEEEEEENS_22__unordered_map_hasherIS4_NSC_ISD_SG_EES8_SA_EENS_21__unordered_map_equalIS4_SJ_SA_S8_EENSB_ISJ_EEE11__do_rehashILb1EEEvm
|
||||
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinENS3_15CallProbabilityEEENS_22__unordered_map_hasherIS4_NS_4pairIKS4_S5_EENS_4hashIS4_EENS_8equal_toIS4_EEEENS_21__unordered_map_equalIS4_SA_SE_SC_EENS_9allocatorISA_EEE16__emplace_uniqueIJRS9_RS5_EEENS8_INS_15__hash_iteratorIPNS_11__hash_nodeIS6_PvEEEEbEEDpOT_ENKUlSM_SM_SN_E_clESM_SM_SN_
|
||||
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinENS3_15CallProbabilityEEENS_22__unordered_map_hasherIS4_NS_4pairIKS4_S5_EENS_4hashIS4_EENS_8equal_toIS4_EEEENS_21__unordered_map_equalIS4_SA_SE_SC_EENS_9allocatorISA_EEE11__do_rehashILb1EEEvm
|
||||
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal7BuiltinEjEENS_22__unordered_map_hasherIS4_NS_4pairIKS4_jEENS_4hashIS4_EENS_8equal_toIS4_EEEENS_21__unordered_map_equalIS4_S9_SD_SB_EENS_9allocatorIS9_EEE16__emplace_uniqueIJRS4_RiEEENS7_INS_15__hash_iteratorIPNS_11__hash_nodeIS5_PvEEEEbEEDpOT_ENKUlRS8_SL_SM_E_clESX_SL_SM_
|
||||
@@ -8440,8 +8419,6 @@ _ZN2v88internal16InterpretedFrame19PatchBytecodeOffsetEi
|
||||
_ZN2v88internal16InterpretedFrame18PatchBytecodeArrayENS0_6TaggedINS0_13BytecodeArrayEEE
|
||||
_ZNK2v88internal13BaselineFrame17GetBytecodeOffsetEv
|
||||
_ZN2v88internal4Code30GetBytecodeOffsetForBaselinePCEmNS0_6TaggedINS0_13BytecodeArrayEEE
|
||||
_ZN2v88internal26FastConstructStubFrameInfoC2Eb
|
||||
_ZN2v88internal26FastConstructStubFrameInfoC1Eb
|
||||
_ZN2v88internal28BuiltinContinuationFrameInfoC2EiRKNS0_23CallInterfaceDescriptorEPKNS0_21RegisterConfigurationEbNS0_14DeoptimizeKindENS0_23BuiltinContinuationModeENS0_13FrameInfoKindE
|
||||
_ZN2v88internal28BuiltinContinuationFrameInfoC1EiRKNS0_23CallInterfaceDescriptorEPKNS0_21RegisterConfigurationEbNS0_14DeoptimizeKindENS0_23BuiltinContinuationModeENS0_13FrameInfoKindE
|
||||
_ZNK2v88internal10TypedFrame14unchecked_codeEv
|
||||
@@ -8716,6 +8693,15 @@ _ZN2v88internal5Debug19return_value_handleEv
|
||||
_ZN2v88internal16ReturnValueScopeD2Ev
|
||||
_ZN2v88internal16ReturnValueScopeD1Ev
|
||||
_ZN2v88internal5Debug32UpdateDebugInfosForExecutionModeEv
|
||||
_ZN2v88internal11StructProxy7GetNameEPNS0_7IsolateENS0_12DirectHandleINS0_10WasmStructEEEj
|
||||
_ZN2v88internal10ArrayProxy14CreateTemplateEPNS_7IsolateE
|
||||
_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE13IndexedGetterEjRKNS_20PropertyCallbackInfoINS_5ValueEEE
|
||||
_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE12IndexedQueryEjRKNS_20PropertyCallbackInfoINS_7IntegerEEE
|
||||
_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE17IndexedEnumeratorERKNS_20PropertyCallbackInfoINS_5ArrayEEE
|
||||
_ZN2v88internal12_GLOBAL__N_117IndexedDebugProxyINS0_10ArrayProxyELNS1_12DebugProxyIdE8ENS0_9WasmArrayEE17IndexedDescriptorEjRKNS_20PropertyCallbackInfoINS_5ValueEEE
|
||||
_ZN2v88internal12_GLOBAL__N_112ContextProxy14CreateTemplateEPNS_7IsolateE
|
||||
_ZN2v88internal12_GLOBAL__N_111LocalsProxy6CreateEPNS0_9WasmFrameE
|
||||
_ZN2v88internal12_GLOBAL__N_110StackProxy6CreateEPNS0_9WasmFrameE
|
||||
_ZN2v88internal12_GLOBAL__N_112ContextProxy11NamedGetterENS_5LocalINS_4NameEEERKNS_20PropertyCallbackInfoINS_5ValueEEE
|
||||
_ZN2v88internal10JSReceiver11GetPropertyEPNS0_7IsolateENS0_12DirectHandleIS1_EEPKc
|
||||
_ZN2v88internal12_GLOBAL__N_115NamedDebugProxyINS1_11LocalsProxyELNS1_12DebugProxyIdE5ENS0_10FixedArrayEE14CreateTemplateEPNS_7IsolateE
|
||||
@@ -8748,26 +8734,6 @@ _ZN2v88internal4wasm26WasmModuleSignatureStorage19AllocateMoreStorageEm
|
||||
_ZNSt4__Cr6vectorIhNS_9allocatorIhEEE6resizeEm
|
||||
_ZNSt4__Cr6vectorIhNS_9allocatorIhEEE20__throw_length_errorEv
|
||||
_ZNSt4__Cr6vectorINS0_IhNS_9allocatorIhEEEENS1_IS3_EEE24__emplace_back_slow_pathIJS3_EEEPS3_DpOT_
|
||||
_ZNSt4__Cr6vectorINS0_IhNS_9allocatorIhEEEENS1_IS3_EEE20__throw_length_errorEv
|
||||
_ZN2v88internal4wasm17ModuleDecoderImpl20consume_storage_typeEv
|
||||
_ZN2v88internal4wasm14StructTypeBase17InitializeOffsetsEv
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjPKcS5_jS5_EEEvPKhS5_DpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjjPKcEEEvPKhS5_DpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjjjjEEEvPKhPKcDpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjjEEEvPKhPKcDpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjPKcEEEvPKhS5_DpT_
|
||||
_ZNK2v88internal4wasm10WasmModule9heap_typeENS1_15ModuleTypeIndexE
|
||||
_ZNSt4__Cr6vectorIN2v88internal4wasm18CanonicalTypeIndexENS_9allocatorIS4_EEE6resizeEm
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjEEEvPKcDpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjjEEEvPKcDpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjPKcS5_jS5_EEEvjS5_DpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjjPKcEEEvjS5_DpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjjjjEEEvjPKcDpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjjEEEvjPKcDpT_
|
||||
_ZN2v88internal4wasm7Decoder6errorfIJjPKcEEEvjS5_DpT_
|
||||
_ZNSt4__Cr6vectorIN2v88internal4wasm18CanonicalTypeIndexENS_9allocatorIS4_EEE20__throw_length_errorEv
|
||||
_ZN2v88internal4wasm17ModuleDecoderImpl25DecodeSingleOrGroupImportENS1_12WireBytesRefES3_NS1_20ImportExportKindCodeEb
|
||||
_ZNSt4__Cr6vectorIN2v88internal4wasm26AsmJsOffsetFunctionEntriesENS_9allocatorIS4_EEE24__emplace_back_slow_pathIJS4_EEEPS4_DpOT_
|
||||
_ZZNSt4__Cr6vectorIN2v88internal4wasm19CustomSectionOffsetENS_9allocatorIS4_EEE12emplace_backIJS4_EEERS4_DpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6vectorIN2v88internal4wasm19CustomSectionOffsetENS_9allocatorIS4_EEE20__throw_length_errorEv
|
||||
_ZN2v88internal4wasm12_GLOBAL__N_121ValidateFunctionsTaskD2Ev
|
||||
@@ -8810,17 +8776,12 @@ _ZN7simdutf23atomic_binary_to_base64EPKcmPcNS_14base64_optionsE
|
||||
_ZN7simdutf16binary_to_base64EPKcmPcNS_14base64_optionsE
|
||||
_ZN7simdutf21base64_to_binary_safeEPKcmPcRmNS_14base64_optionsENS_27last_chunk_handling_optionsEb
|
||||
_ZN7simdutf26base64_to_binary_safe_implIcEENS_6resultEPKT_mPcRmNS_14base64_optionsENS_27last_chunk_handling_optionsEb
|
||||
_ZNK7simdutf7haswell14implementation25utf32_length_from_utf16leEPKDsm
|
||||
_ZNK7simdutf7haswell14implementation25utf32_length_from_utf16beEPKDsm
|
||||
_ZNK7simdutf7haswell14implementation22utf16_length_from_utf8EPKcm
|
||||
_ZNK7simdutf7haswell14implementation41utf8_length_from_utf16le_with_replacementEPKDsm
|
||||
_ZNK7simdutf7haswell14implementation41utf8_length_from_utf16be_with_replacementEPKDsm
|
||||
_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
|
||||
_ZN7simdutf7haswell12_GLOBAL__N_16base6422compress_decode_base64ILb0ELb1ELb1EcEENS_11full_resultEPcPKT2_mNS_14base64_optionsENS_27last_chunk_handling_optionsE
|
||||
_ZNK7simdutf7icelake14implementation25utf32_length_from_utf16beEPKDsm
|
||||
_ZNK7simdutf7icelake14implementation23utf8_length_from_latin1EPKcm
|
||||
_ZNK7simdutf7icelake14implementation22utf16_length_from_utf8EPKcm
|
||||
_ZNK7simdutf7icelake14implementation41utf8_length_from_utf16le_with_replacementEPKDsm
|
||||
_ZNK7simdutf7icelake14implementation41utf8_length_from_utf16be_with_replacementEPKDsm
|
||||
_ZNK7simdutf7icelake14implementation22utf8_length_from_utf32EPKDim
|
||||
_ZNK7simdutf8westmere14implementation4findEPKDsS3_Ds
|
||||
_ZNK7simdutf14implementation4nameEv
|
||||
_ZNK7simdutf14implementation11descriptionEv
|
||||
@@ -9038,6 +8999,19 @@ uscript_getScript_77
|
||||
uscript_hasScript_77
|
||||
ublock_getCode_77
|
||||
uchar_addPropertyStarts_77
|
||||
_ZL24_enumPropertyStartsRangePKviij
|
||||
upropsvec_addPropertyStarts_77
|
||||
ublock_addPropertyStarts_77
|
||||
utrie2_get32_77
|
||||
utrie2_openFromSerialized_77
|
||||
utrie2_close_77
|
||||
utrie2_isFrozen_77
|
||||
utrie2_enum_77
|
||||
_ZL14enumEitherTriePK6UTrie2iiPFjPKvjEPFaS3_iijES3_
|
||||
utrie2_enumForLeadSurrogate_77
|
||||
_ZL13enumSameValuePKvj
|
||||
utf8_nextCharSafeBody_77
|
||||
utf8_prevCharSafeBody_77
|
||||
utf8_back1SafeBody_77
|
||||
uprv_malloc_77
|
||||
uprv_realloc_77
|
||||
@@ -9091,9 +9065,6 @@ _ZNKSt4__Cr12__hash_tableIN2v88internal4wasm17TypeCanonicalizer14CanonicalGroupE
|
||||
_ZNKSt4__Cr12__hash_tableIN2v88internal4wasm17TypeCanonicalizer23CanonicalSingletonGroupENS1_4base4hashIS5_EENS_8equal_toIS5_EENS_9allocatorIS5_EEE4findIS5_EENS_21__hash_const_iteratorIPNS_11__hash_nodeIS5_PvEEEERKT_
|
||||
_ZNK2v88internal4wasm13ValueTypeBase23value_type_code_numericEv
|
||||
_ZNK2v88internal4wasm13ValueTypeBase23value_type_code_genericEv
|
||||
_ZNK2v88internal4wasm13ValueTypeBase21generic_heaptype_nameEv
|
||||
_ZNK2v88internal4wasm13ValueTypeBase4nameEv
|
||||
_ZN2v88internal4wasm27WasmReturnTypeFromSignatureEPKNS1_12CanonicalSigE
|
||||
_ZN2v88internal4wasm20EquivalentNumericSigEPKNS1_12CanonicalSigEPKNS0_9SignatureINS1_9ValueTypeEEE
|
||||
_ZN2v88internal4wasm12CanonicalSigC2EmmPKNS1_18CanonicalValueTypeENS1_18CanonicalTypeIndexE
|
||||
_ZN2v88internal4wasm12CanonicalSigC1EmmPKNS1_18CanonicalValueTypeENS1_18CanonicalTypeIndexE
|
||||
@@ -9113,7 +9084,6 @@ _ZN2v88internal4wasm12ErrorThrowerD1Ev
|
||||
_ZN2v88internal4wasm22ValidSubtypeDefinitionENS1_15ModuleTypeIndexES2_PKNS1_10WasmModuleE
|
||||
_ZN2v88internal4wasm15IsSubtypeOfImplENS1_8HeapTypeES2_PKNS1_10WasmModuleES5_
|
||||
_ZN2v88internal4wasm12_GLOBAL__N_122IsSubtypeOf_CommonImplENS1_13ValueTypeBaseES3_
|
||||
_ZNSt4__Cr32__partition_with_equals_on_rightINS_17_ClassicAlgPolicyEPN2v88internal4wasm17LiftoffStackSlots4SlotERZNS5_15SortInPushOrderEvEUlRKS6_S9_E_EENS_4pairIT0_bEESD_SD_T1_
|
||||
_ZNSt4__Cr27__insertion_sort_incompleteINS_17_ClassicAlgPolicyERZN2v88internal4wasm17LiftoffStackSlots15SortInPushOrderEvEUlRKNS5_4SlotES8_E_PS6_EEbT1_SC_T0_
|
||||
_ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERZN2v88internal4wasm17LiftoffStackSlots15SortInPushOrderEvEUlRKNS5_4SlotES8_E_PS6_SB_EET1_SC_SC_T2_OT0_
|
||||
_ZN2v88internal10ZoneVectorIiE4GrowEm
|
||||
@@ -9753,7 +9723,6 @@ _ZN2v84base19TemplateHashMapImplIPvS2_NS0_26HashEqualityThenKeyMatcherIS2_PFbS2_
|
||||
_ZNSt4__Cr10__function13__policy_funcIFvvEE11__call_funcIZN2v84base8CallOnceIJEEEvPNS_6atomicIhEENS6_16FunctionWithArgsIJDpT_EE4typeESD_Qsr3stdE13conjunction_vIDpNS_9is_scalarISC_EEEEUlvE_EEvPKNS0_16__policy_storageE
|
||||
_ZN2v88internal8HashSeed15InitializeRootsEPNS0_7IsolateE
|
||||
_ZN2v88internal23Runtime_IterableForEachEiPmPNS0_7IsolateE
|
||||
_ZNK2v88internal12JSTypedArray12element_sizeEv
|
||||
_ZNK2v88internal12JSTypedArray34GetVariableByteLengthOrOutOfBoundsERb
|
||||
_ZNK2v88internal12JSTypedArray30GetVariableLengthOrOutOfBoundsERb
|
||||
_ZN2v88internal10Protectors30InvalidateArrayBufferDetachingEPNS0_7IsolateE
|
||||
@@ -9878,6 +9847,7 @@ _ZN2v88internal14OrderedHashSet18ConvertToKeysArrayEPNS0_7IsolateENS0_6HandleIS1
|
||||
_ZN2v88internal14OrderedHashMap7GetHashEPNS0_7IsolateEm
|
||||
_ZN2v88internal32ArrayConstructInitializeElementsEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEEPNS0_9ArgumentsILNS0_13ArgumentsTypeE1EEE
|
||||
_ZN2v88internal41CopyFastNumberJSArrayElementsToTypedArrayEmmmmm
|
||||
_ZN2v88internal12_GLOBAL__N_121TypedElementsAccessorILNS0_12ElementsKindE18EE25TryCopyElementsFastNumberENS0_6TaggedINS0_7ContextEEENS5_INS0_7JSArrayEEENS5_INS0_12JSTypedArrayEEEmm
|
||||
_ZN2v88internal12_GLOBAL__N_121TypedElementsAccessorILNS0_12ElementsKindE41EE26CopyElementsFromTypedArrayENS0_6TaggedINS0_12JSTypedArrayEEES7_mm
|
||||
_ZN2v88internal27CopyTypedArrayElementsSliceEmmmm
|
||||
_ZN2v88internal16ElementsAccessor24InitializeOncePerProcessEv
|
||||
@@ -9893,6 +9863,7 @@ _ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsA
|
||||
_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_12ElementsKindE0EEEE22CollectValuesOrEntriesEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENSA_INS0_10FixedArrayEEEjbPjNS0_14PropertyFilterE
|
||||
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE5ShiftEPNS0_7IsolateENS0_12DirectHandleINS0_7JSArrayEEE
|
||||
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE9NormalizeEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEE
|
||||
_ZN2v88internal12_GLOBAL__N_120ElementsAccessorBaseINS1_29FastPackedSmiElementsAccessorENS1_18ElementsKindTraitsILNS0_12ElementsKindE0EEEE11GetCapacityENS0_6TaggedINS0_8JSObjectEEENS8_INS0_14FixedArrayBaseEEE
|
||||
@@ -10124,6 +10095,8 @@ _ZN2v88internal6Module11RecordErrorEPNS0_7IsolateENS0_6TaggedINS0_6ObjectEEE
|
||||
_ZN2v88internal6Module10ResetGraphEPNS0_7IsolateENS0_12DirectHandleIS1_EE
|
||||
_ZN2v88internal6Module5ResetEPNS0_7IsolateENS0_12DirectHandleIS1_EE
|
||||
_ZN2v88internal6Module12GetExceptionEv
|
||||
_ZN2v88internal6Module13ResolveExportEPNS0_7IsolateENS0_6HandleIS1_EENS0_12DirectHandleINS0_6StringEEENS4_IS7_EENS0_15MessageLocationEbPNS1_10ResolveSetE
|
||||
_ZN2v88internal6Module11InstantiateEPNS0_7IsolateENS0_6HandleIS1_EENS_5LocalINS_7ContextEEERKNS1_20UserResolveCallbacksE
|
||||
_ZZNSt4__Cr6__treeINS_12__value_typeIPKN2v88internal12AstRawStringEPNS3_26SourceTextModuleDescriptor5EntryEEENS_19__map_value_compareIS6_NS_4pairIKS6_S9_EENS7_20AstRawStringComparerEEENS3_13ZoneAllocatorISE_EEE16__emplace_uniqueIJRS6_RS9_EEENSC_INS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEElEEbEEDpOT_ENKUlRSD_SL_SM_E_clESX_SL_SM_
|
||||
_ZZNSt4__Cr6__treeINS_12__value_typeIPKN2v88internal12AstRawStringEPKNS3_26SourceTextModuleDescriptor5EntryEEENS_19__map_value_compareIS6_NS_4pairIKS6_SA_EENS7_20AstRawStringComparerEEENS3_13ZoneAllocatorISF_EEE16__emplace_uniqueIJRSE_RSA_EEENSD_INS_15__tree_iteratorISB_PNS_11__tree_nodeISB_PvEElEEbEEDpOT_ENKUlSM_SM_SN_E_clESM_SM_SN_
|
||||
_ZNSt4__Cr6__treeINS_12__value_typeIPKN2v88internal12AstRawStringEPNS3_26SourceTextModuleDescriptor5EntryEEENS_19__map_value_compareIS6_NS_4pairIKS6_S9_EENS7_20AstRawStringComparerEEENS3_13ZoneAllocatorISE_EEE15__emplace_multiIJRS6_RS9_EEENS_15__tree_iteratorISA_PNS_11__tree_nodeISA_PvEElEEDpOT_
|
||||
@@ -10171,7 +10144,6 @@ _ZN2v88internal14MessageHandler25ReportMessageNoExceptionsEPNS0_7IsolateEPKNS0_1
|
||||
_ZN2v88internal14MessageHandler10GetMessageEPNS0_7IsolateENS0_12DirectHandleINS0_6ObjectEEE
|
||||
_ZN2v88internal16MessageFormatter6FormatEPNS0_7IsolateENS0_15MessageTemplateENS_4base6VectorIKNS0_12DirectHandleINS0_6ObjectEEEEE
|
||||
_ZN2v88internal10ErrorUtils16FormatStackTraceEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS4_INS0_6ObjectEEE
|
||||
_ZN2v88internal10ErrorUtils17CaptureStackTraceEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEENS0_13FrameSkipModeENS0_6HandleINS0_6ObjectEEE
|
||||
_ZN2v88internal25StringBuilderConcatHelperIhEEvNS0_6TaggedINS0_6StringEEEPT_NS2_INS0_10FixedArrayEEEj
|
||||
_ZN2v88internal25StringBuilderConcatHelperItEEvNS0_6TaggedINS0_6StringEEEPT_NS2_INS0_10FixedArrayEEEj
|
||||
_ZN2v88internal25StringBuilderConcatLengthEiNS0_6TaggedINS0_10FixedArrayEEEiPb
|
||||
@@ -10198,15 +10170,15 @@ _ZN2v88internal24IncrementalStringBuilder12AppendStringENS0_12DirectHandleINS0_6
|
||||
_ZN2v88internal12CallSiteInfo20ConstructFromRawDataEPNS0_7IsolateENS0_12DirectHandleINS0_10FixedArrayEEEi
|
||||
_ZN2v88internal12CallSiteInfo20ExpandDeferredFramesEPNS0_7IsolateENS0_6HandleINS0_10FixedArrayEEE
|
||||
_ZNK2v88internal18SharedFunctionInfo16GetBytecodeArrayINS0_7IsolateEEENS0_6TaggedINS0_13BytecodeArrayEEEPT_
|
||||
_ZNK2v88internal12CallSiteInfo12IsPromiseAllEv
|
||||
_ZNK2v88internal12CallSiteInfo19IsPromiseAllSettledEv
|
||||
_ZNK2v88internal12CallSiteInfo12IsPromiseAnyEv
|
||||
_ZN2v88internal12CallSiteInfo15GetFunctionNameENS0_12DirectHandleIS1_EE
|
||||
_ZN2v88internal12CallSiteInfo20GetFunctionDebugNameENS0_12DirectHandleIS1_EE
|
||||
_ZN2v88internal12CallSiteInfo13GetMethodNameENS0_12DirectHandleIS1_EE
|
||||
_ZNK2v88internal18SharedFunctionInfo13inferred_nameEv
|
||||
_ZN2v88internal11PropertyKeyC2INS0_6HandleEQsr3stdE16is_convertible_vIT_INS0_4NameEENS0_12DirectHandleIS5_EEEEEPNS0_7IsolateES6_
|
||||
_ZN2v88internal12CallSiteInfo11GetTypeNameENS0_12DirectHandleIS1_EE
|
||||
_ZN2v88internal12CallSiteInfo21ComputeSourcePositionENS0_12DirectHandleIS1_EEi
|
||||
_ZN2v88internal12CallSiteInfo15ComputeLocationENS0_12DirectHandleIS1_EEPNS0_15MessageLocationE
|
||||
_ZN2v88internal21SerializeCallSiteInfoEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEEPNS0_24IncrementalStringBuilderE
|
||||
_ZN2v88internal12_GLOBAL__N_121SerializeJSStackFrameEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEEPNS0_24IncrementalStringBuilderE
|
||||
_ZN2v88internal21SerializeCallSiteInfoEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEE
|
||||
_ZN2v88internal12_GLOBAL__N_118AppendFileLocationEPNS0_7IsolateENS0_12DirectHandleINS0_12CallSiteInfoEEEPNS0_24IncrementalStringBuilderE
|
||||
@@ -10544,8 +10516,7 @@ _ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE19VisitForInSt
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE19VisitForOfStatementEPNS0_14ForOfStatementE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE24VisitExpressionStatementEPNS0_19ExpressionStatementE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE33VisitSloppyBlockFunctionStatementEPNS0_28SloppyBlockFunctionStatementE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE16VisitConditionalEPNS0_11ConditionalE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE19VisitCountOperationEPNS0_14CountOperationE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE16VisitIfStatementEPNS0_11IfStatementE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE25VisitImportCallExpressionEPNS0_20ImportCallExpressionE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE18VisitOptionalChainEPNS0_13OptionalChainE
|
||||
_ZN2v88internal19AstTraversalVisitorINS0_21SourceRangeAstVisitorEE13VisitPropertyEPNS0_8PropertyE
|
||||
@@ -10834,9 +10805,6 @@ _ZL13isPOSIX_graphRK14BinaryPropertyi9UProperty
|
||||
_ZL13isPOSIX_printRK14BinaryPropertyi9UProperty
|
||||
_ZL14isPOSIX_xdigitRK14BinaryPropertyi9UProperty
|
||||
_ZL21changesWhenCasefoldedRK14BinaryPropertyi9UProperty
|
||||
UDatamemory_assign_77
|
||||
UDataMemory_createNewInstance_77
|
||||
UDataMemory_normalizeDataPointer_77
|
||||
UDataMemory_setData_77
|
||||
udata_close_77
|
||||
udata_getMemory_77
|
||||
@@ -11027,6 +10995,9 @@ uprv_max_77
|
||||
uprv_min_77
|
||||
_ZN6icu_7721LoadedNormalizer2ImplD2Ev
|
||||
_ZN6icu_7721LoadedNormalizer2ImplD1Ev
|
||||
_ZN6icu_7721LoadedNormalizer2ImplD0Ev
|
||||
_ZN6icu_7721LoadedNormalizer2Impl12isAcceptableEPvPKcS3_PK9UDataInfo
|
||||
_ZN6icu_7721LoadedNormalizer2Impl4loadEPKcS2_R10UErrorCode
|
||||
_ZNK6icu_776BMPSet8spanUTF8EPKhi17USetSpanCondition
|
||||
_ZNK6icu_776BMPSet12spanBackUTF8EPKhi17USetSpanCondition
|
||||
_ZN6icu_7712ByteSinkUtil12appendChangeEiPKDsiRNS_8ByteSinkEPNS_5EditsER10UErrorCode
|
||||
@@ -11095,6 +11066,7 @@ _ZN6icu_7718Normalizer2Factory14getFCDInstanceER10UErrorCode
|
||||
_ZN6icu_7718Normalizer2Factory10getNFCImplER10UErrorCode
|
||||
u_getCombiningClass_77
|
||||
unorm_getFCD16_77
|
||||
_ZNK6icu_7719Normalizer2WithImpl9normalizeERKNS_13UnicodeStringERS1_R10UErrorCode
|
||||
_ZN2v84base7ieee7546legacy3powEdd
|
||||
_ZN2v84base7ieee7544sinhEd
|
||||
_ZN2v88internal16FuncNameInferrerC2EPNS0_15AstValueFactoryE
|
||||
@@ -11356,6 +11328,7 @@ _ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE20ParseClassSetOperandEPKNS2_
|
||||
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE29AddMaybeSimpleCaseFoldedRangeEPNS0_8ZoneListINS1_14CharacterRangeEEES6_
|
||||
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE16ParseClassEscapeEPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_4ZoneEbPjPb
|
||||
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE22ParseClassSetCharacterEv
|
||||
_ZN2v88internal6regexp12_GLOBAL__N_111TextBuilder8ToRegExpEv
|
||||
_ZN2v88internal6regexp12_GLOBAL__N_110ParserImplIhE15ScanForCapturesENS2_18InClassEscapeStateE
|
||||
_ZN2v88internal10ZoneVectorIcE4GrowEm
|
||||
_ZN2v88internal6regexp12_GLOBAL__N_112_GLOBAL__N_123LookupPropertyValueNameE9UPropertyPKcbPNS0_8ZoneListINS1_14CharacterRangeEEEPNS0_7ZoneMapINS_4base6VectorIKjEEPNS1_4TreeENS1_24CharacterClassStringLessEEENSC_5FlagsINS1_4FlagEiiEEPNS0_4ZoneE
|
||||
@@ -11549,6 +11522,7 @@ _ZN2v88internal6regexp10Lookaround10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE
|
||||
_ZN2v88internal6regexp7Capture10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE
|
||||
_ZN2v88internal6regexp7Capture6ToNodeEPNS1_4TreeEiPNS1_8CompilerEPNS1_4NodeE
|
||||
_ZN2v88internal6regexp11Alternative10ToNodeImplEPNS1_8CompilerEPNS1_4NodeE
|
||||
_ZN2v88internal6regexp14CharacterRange18AddCaseEquivalentsEPNS0_7IsolateEPNS0_4ZoneEPNS0_8ZoneListIS2_EEb
|
||||
_ZN2v88internal21FixedIntegerArrayBaseItNS0_9ByteArrayEE3NewIJEEENS0_6HandleIS3_EEPNS0_7IsolateEjDpOT_
|
||||
_ZNKSt4__Cr12__hash_tableINS_17__hash_value_typeIjN2v88internal6HandleINS3_21FixedIntegerArrayBaseItNS3_9ByteArrayEEEEEEENS_22__unordered_map_hasherIjNS_4pairIKjS8_EENS2_4base4hashIjEENS_8equal_toIjEEEENS_21__unordered_map_equalIjSD_SI_SG_EENS3_13ZoneAllocatorISD_EEE4findIjEENS_21__hash_const_iteratorIPNS_11__hash_nodeIS9_PvEEEERKT_
|
||||
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIjN2v88internal6HandleINS3_21FixedIntegerArrayBaseItNS3_9ByteArrayEEEEEEENS_22__unordered_map_hasherIjNS_4pairIKjS8_EENS2_4base4hashIjEENS_8equal_toIjEEEENS_21__unordered_map_equalIjSD_SI_SG_EENS3_13ZoneAllocatorISD_EEE16__emplace_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJRSC_EEENST_IJEEEEEENSB_INS_15__hash_iteratorIPNS_11__hash_nodeIS9_PvEEEEbEEDpOT_ENKUlSU_SS_OSV_OSW_E_clESU_SS_S17_S18_
|
||||
@@ -11564,6 +11538,7 @@ _Z22ulocimp_getKeywords_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEEcbR
|
||||
_Z22ulocimp_getKeywords_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEEcRN6icu_778ByteSinkEbR10UErrorCode
|
||||
_ZN12_GLOBAL__N_121compareKeywordStructsEPKvS1_S1_
|
||||
uloc_getKeywordValue_77
|
||||
_Z26ulocimp_getKeywordValue_77PKcNSt4__Cr17basic_string_viewIcNS1_11char_traitsIcEEEER10UErrorCode
|
||||
uloc_getCurrentCountryID_77
|
||||
uloc_getCurrentLanguageID_77
|
||||
_Z22ulocimp_getLanguage_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEER10UErrorCode
|
||||
@@ -11593,6 +11568,7 @@ _Z32ulocimp_toBcpTypeWithFallback_77NSt4__Cr17basic_string_viewIcNS_11char_trait
|
||||
uloc_toLegacyKey_77
|
||||
_Z34ulocimp_toLegacyKeyWithFallback_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEE
|
||||
uloc_toLegacyType_77
|
||||
_Z35ulocimp_toLegacyTypeWithFallback_77NSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEES3_
|
||||
_ZN12_GLOBAL__N_125_isUnicodeExtensionSubtagERiPKci
|
||||
_Z24ulocimp_toLanguageTag_77PKcRN6icu_778ByteSinkEbR10UErrorCode
|
||||
_ZNSt4__Cr17basic_string_viewIcNS_11char_traitsIcEEEC2EPKc
|
||||
@@ -11695,7 +11671,10 @@ _ZN6icu_7718UStringEnumerationC2EP12UEnumeration
|
||||
_ZN6icu_7718UStringEnumerationC1EP12UEnumeration
|
||||
_ZN6icu_7718UStringEnumerationD2Ev
|
||||
_ZN6icu_7718UStringEnumerationD1Ev
|
||||
_ZN6icu_7710MemoryPoolINS_10CharStringELi8EE6createIJEEEPS1_DpOT_
|
||||
_ZN6icu_7718UStringEnumerationD0Ev
|
||||
_ZNK6icu_7718UStringEnumeration5countER10UErrorCode
|
||||
_ZN6icu_7718UStringEnumeration4nextEPiR10UErrorCode
|
||||
_ZN6icu_7718UStringEnumeration5snextER10UErrorCode
|
||||
_ZN6icu_7710MemoryPoolINS_10CharStringELi8EE6createIJRPKcR10UErrorCodeEEEPS1_DpOT_
|
||||
_ZN6icu_7710MemoryPoolI10LocExtTypeLi8EE6createIJEEEPS1_DpOT_
|
||||
_ZN6icu_7710MemoryPoolI9TypeAliasLi8EE6createIJS1_EEEPS1_DpOT_
|
||||
@@ -11721,13 +11700,6 @@ _ZN6icu_7710UnicodeSet9closeOverEi
|
||||
_ZN6icu_7710UnicodeSet10setPatternERKNS_13UnicodeStringE
|
||||
_ZN6icu_7710UnicodeSet24closeOverCaseInsensitiveEb
|
||||
_ZN6icu_7710UnicodeSet24closeOverAddCaseMappingsEv
|
||||
_ZNK6icu_7724WholeStringBreakIterator7getTextEv
|
||||
_ZNK6icu_7724WholeStringBreakIterator8getUTextEP5UTextR10UErrorCode
|
||||
_ZN6icu_7724WholeStringBreakIterator7setTextERKNS_13UnicodeStringE
|
||||
_ZN6icu_7724WholeStringBreakIterator7setTextEP5UTextR10UErrorCode
|
||||
_ZN6icu_7724WholeStringBreakIterator9adoptTextEPNS_17CharacterIteratorE
|
||||
_ZN6icu_7724WholeStringBreakIterator5firstEv
|
||||
_ZN6icu_7724WholeStringBreakIterator4lastEv
|
||||
_ZN6icu_7724WholeStringBreakIterator8previousEv
|
||||
_ZN6icu_7724WholeStringBreakIterator4nextEv
|
||||
_ZNK6icu_7724WholeStringBreakIterator7currentEv
|
||||
@@ -11809,7 +11781,6 @@ _ZN2v88internal6regexp18ExperimentalRegExp12CanBeHandledEPNS1_4TreeENS0_12Direct
|
||||
_ZN2v88internal6regexp18ExperimentalRegExp10InitializeEPNS0_7IsolateENS0_12DirectHandleINS0_8JSRegExpEEENS5_INS0_6StringEEES9_NS_4base5FlagsINS1_4FlagEiiEEi
|
||||
_ZN2v88internal6regexp18ExperimentalRegExp10IsCompiledENS0_12DirectHandleINS0_12IrRegExpDataEEEPNS0_7IsolateE
|
||||
_ZN2v88internal6regexp18ExperimentalRegExp7CompileEPNS0_7IsolateENS0_12DirectHandleINS0_12IrRegExpDataEEE
|
||||
_ZN2v88internal12BackingStore35TryAllocateAndPartiallyCommitMemoryEPNS0_7IsolateEmmmmmNS0_14WasmMemoryFlagENS0_10SharedFlagEb
|
||||
_ZN2v88internal12BackingStore18AllocateWasmMemoryEPNS0_7IsolateEmmNS0_14WasmMemoryFlagENS0_10SharedFlagE
|
||||
_ZN2v88internal12BackingStore14CopyWasmMemoryEPNS0_7IsolateEmmNS0_14WasmMemoryFlagE
|
||||
_ZN2v88internal12BackingStore21GrowWasmMemoryInPlaceEPNS0_7IsolateEmm
|
||||
@@ -12363,15 +12334,6 @@ _ZN2v88internal8Compiler21GetSharedFunctionInfoINS0_7IsolateEEENS0_12DirectHandl
|
||||
_ZN2v88internal8Compiler21GetSharedFunctionInfoINS0_12LocalIsolateEEENS0_12DirectHandleINS0_18SharedFunctionInfoEEEPNS0_15FunctionLiteralENS4_INS0_6ScriptEEEPT_
|
||||
_ZN2v88internal8Compiler22LogFunctionCompilationEPNS0_7IsolateENS0_16LogEventListener7CodeTagENS0_12DirectHandleINS0_6ScriptEEENS6_INS0_18SharedFunctionInfoEEENS6_INS0_14FeedbackVectorEEENS6_INS0_12AbstractCodeEEENS0_8CodeKindEd
|
||||
_ZN2v88internal23OptimizedCompilationJob10ExecuteJobEPNS0_16RuntimeCallStatsEPNS0_12LocalIsolateE
|
||||
_ZN2v88internal23OptimizedCompilationJob11FinalizeJobEPNS0_7IsolateE
|
||||
_ZN2v88internal23OptimizedCompilationJob19CollectRetainedMapsEPNS0_7IsolateENS0_12DirectHandleINS0_4CodeEEE
|
||||
_ZN2v88internal23OptimizedCompilationJob34RegisterWeakObjectsInOptimizedCodeEPNS0_7IsolateENS0_12DirectHandleINS0_13NativeContextEEENS4_INS0_4CodeEEENS0_18GlobalHandleVectorINS0_3MapEEE
|
||||
_ZN2v88internal22TurbofanCompilationJobC2EPNS0_7IsolateEPNS0_24OptimizedCompilationInfoENS0_14CompilationJob5StateE
|
||||
_ZN2v88internal22TurbofanCompilationJob17RetryOptimizationENS0_13BailoutReasonE
|
||||
_ZN2v88internal22TurbofanCompilationJob17AbortOptimizationENS0_13BailoutReasonE
|
||||
_ZN2v88internal22TurbofanCompilationJob6CancelEv
|
||||
_ZNK2v88internal22TurbofanCompilationJob22RecordCompilationStatsENS0_15ConcurrencyModeEPNS0_7IsolateE
|
||||
_ZNK2v88internal22TurbofanCompilationJob25RecordFunctionCompilationENS0_16LogEventListener7CodeTagEPNS0_7IsolateE
|
||||
_ZN2v88internal8Compiler32InstallInterpreterTrampolineCopyEPNS0_7IsolateENS0_12DirectHandleINS0_18SharedFunctionInfoEEENS0_16LogEventListener7CodeTagE
|
||||
_ZN2v88internal22CompilationHandleScopeD2Ev
|
||||
_ZN2v88internal22CompilationHandleScopeD1Ev
|
||||
@@ -12437,6 +12399,7 @@ _ZNK2v88internal22TurbofanCompilationJob13FinalizeOrderEv
|
||||
_ZN2v88internal23OptimizedCompilationJobD0Ev
|
||||
_ZNKSt4__Cr19__hash_map_iteratorINS_15__hash_iteratorIPNS_11__hash_nodeINS_17__hash_value_typeIiN2v88internal6TaggedINS5_9ScopeInfoEEEEEPvEEEEEptEv
|
||||
_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_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSQ_IJEEEEEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SP_OSS_OST_E_clES14_SP_S15_S16_
|
||||
_ZNSt4__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_EEE11__do_rehashILb1EEEvm
|
||||
_ZN2v88internal28ConstantPoolPointerForwarder14VisitScopeInfoINS0_10FixedArrayEEEvNS0_6TaggedIT_EEjNS4_INS0_9ScopeInfoEEE
|
||||
_ZN2v88internal5PrintILNS0_23HeapObjectReferenceTypeE1EmEEvNS0_10TaggedImplIXT_ET0_EE
|
||||
_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_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSQ_IJEEEEEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SP_OSS_OST_E_clES14_SP_S15_S16_
|
||||
@@ -12468,6 +12431,8 @@ _ZNSt4__Cr6vectorIN2v88internal27DeferredFinalizationJobDataENS_9allocatorIS3_EE
|
||||
_ZZNSt4__Cr12__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE16__emplace_uniqueIJiEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIiPvEEEEbEEDpOT_ENKUlRKiOiE_clESL_SM_
|
||||
_ZN2v88internal24OptimizedCompilationInfoC2EPNS0_4ZoneEPNS0_7IsolateENS0_6HandleINS0_18SharedFunctionInfoEEENS6_INS0_10JSFunctionEEENS0_8CodeKindENS0_14BytecodeOffsetE
|
||||
_ZN2v88internal24OptimizedCompilationInfoC1EPNS0_4ZoneEPNS0_7IsolateENS0_6HandleINS0_18SharedFunctionInfoEEENS6_INS0_10JSFunctionEEENS0_8CodeKindENS0_14BytecodeOffsetE
|
||||
_ZN2v88internal24OptimizedCompilationInfoC2ENS_4base6VectorIKcEEPNS0_4ZoneENS0_8CodeKindENS0_7BuiltinE
|
||||
_ZN2v88internal24OptimizedCompilationInfoC1ENS_4base6VectorIKcEEPNS0_4ZoneENS0_8CodeKindENS0_7BuiltinE
|
||||
_ZN2v88internal10Serializer16ObjectSerializer13VisitPointersENS0_6TaggedINS0_10HeapObjectEEENS0_25CompressedMaybeObjectSlotES6_
|
||||
_ZN2v88internal10Serializer16ObjectSerializer29VisitInstructionStreamPointerENS0_6TaggedINS0_4CodeEEENS0_27OffHeapCompressedObjectSlotINS0_29ExternalCodeCompressionSchemeEEE
|
||||
_ZN2v88internal10Serializer16ObjectSerializer20VisitEmbeddedPointerENS0_6TaggedINS0_17InstructionStreamEEEPNS0_9RelocInfoE
|
||||
@@ -12491,6 +12456,7 @@ _ZN2v88internal10Serializer32SerializeReadOnlyObjectReferenceENS0_6TaggedINS0_10
|
||||
_ZN2v88internal10SerializerD0Ev
|
||||
_ZN2v88internal10Serializer16ObjectSerializerD0Ev
|
||||
_ZZNSt4__Cr6vectorIhNS_9allocatorIhEEE12emplace_backIJRKhEEERhDpOT_ENKUlvE0_clEv
|
||||
_ZN2v88internal14CodeAddressMapD2Ev
|
||||
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v84base11StrongAliasINS2_8internal24JSDispatchHandleAliasTagEjEEjEENS_22__unordered_map_hasherIS7_NS_4pairIKS7_jEENS_4hashIS7_EENS_8equal_toIS7_EEEENS_21__unordered_map_equalIS7_SC_SG_SE_EENS_9allocatorISC_EEE16__emplace_uniqueIJRKNS_21piecewise_construct_tENS_5tupleIJRSB_EEENSR_IJEEEEEENSA_INS_15__hash_iteratorIPNS_11__hash_nodeIS8_PvEEEEbEEDpOT_ENKUlSS_SQ_OST_OSU_E_clESS_SQ_S15_S16_
|
||||
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v84base11StrongAliasINS2_8internal24JSDispatchHandleAliasTagEjEEjEENS_22__unordered_map_hasherIS7_NS_4pairIKS7_jEENS_4hashIS7_EENS_8equal_toIS7_EEEENS_21__unordered_map_equalIS7_SC_SG_SE_EENS_9allocatorISC_EEE11__do_rehashILb1EEEvm
|
||||
_ZN2v88internal24ExternalReferenceEncoderC2EPNS0_7IsolateE
|
||||
@@ -12617,6 +12583,7 @@ _ZN2v88internal12_GLOBAL__N_144CollectPrivateMethodsAndAccessorsFromContextEPNS0
|
||||
_ZZNSt4__Cr6vectorIN2v88internal13PrivateMemberENS_9allocatorIS3_EEE12emplace_backIJS3_EEERS3_DpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6vectorIN2v88internal13PrivateMemberENS_9allocatorIS3_EEE20__throw_length_errorEv
|
||||
_ZN2v88internal19SwissNameDictionary3AddINS0_7IsolateENS0_12DirectHandleEQsr3stdE16is_convertible_vIT0_IS1_ENS4_IS1_EEEEES6_PT_S6_NS4_INS0_4NameEEENS4_INS0_6ObjectEEENS0_15PropertyDetailsEPNS0_13InternalIndexE
|
||||
_ZN2v88internal19SwissNameDictionary11AddInternalENS0_6TaggedINS0_4NameEEENS2_INS0_6ObjectEEENS0_15PropertyDetailsE
|
||||
_ZN2v88internal19SwissNameDictionary16EqualsForTestingENS0_6TaggedIS1_EE
|
||||
_ZNSt4__Cr6vectorIZN2v88internal19SwissNameDictionary6RehashINS2_12LocalIsolateEEEvPT_E5EntryNS_9allocatorIS8_EEE20__throw_length_errorEv
|
||||
_ZNSt4__Cr6vectorIZN2v88internal19SwissNameDictionary6RehashINS2_7IsolateEEEvPT_E5EntryNS_9allocatorIS8_EEE20__throw_length_errorEv
|
||||
@@ -12624,6 +12591,7 @@ _ZN2v88internal18PropertyDescriptor8ToObjectEPNS0_7IsolateE
|
||||
_ZN2v88internal18PropertyDescriptor20ToPropertyDescriptorEPNS0_7IsolateENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEEPS1_
|
||||
_ZN2v88internal12_GLOBAL__N_120GetPropertyIfPresentEPNS0_7IsolateENS0_12DirectHandleINS0_10JSReceiverEEENS4_INS0_6StringEEEPNS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntES7_NS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedES5_EEEEE
|
||||
_ZN2v88internal18PropertyDescriptor26CompletePropertyDescriptorEPNS0_7IsolateEPS1_
|
||||
_ZN2v88internal18PropertyDescriptor26ToPropertyDescriptorObjectEPNS0_7IsolateE
|
||||
_ZNK2v88internal6String9IsEqualToILNS1_12EqualityTypeE0EcEEbNS_4base6VectorIKT0_EEPNS0_12LocalIsolateE
|
||||
_ZN2v88internal24IcuBreakIteratorWithTextC2ENSt4__Cr10unique_ptrIN6icu_7713BreakIteratorENS2_14default_deleteIS5_EEEE
|
||||
_ZN2v88internal24IcuBreakIteratorWithTextC1ENSt4__Cr10unique_ptrIN6icu_7713BreakIteratorENS2_14default_deleteIS5_EEEE
|
||||
@@ -12636,14 +12604,13 @@ _ZN2v88internal4Intl18ToICUUnicodeStringEPNS0_7IsolateENS0_12DirectHandleINS0_6S
|
||||
_ZN2v88internal4Intl18ToLatin1LowerTableEv
|
||||
_ZN2v88internal9CopyCharsIhDsEEvPT0_PKT_m
|
||||
_ZN2v88internal12_GLOBAL__N_122GetUCharBufferFromFlatERKNS0_6String11FlatContentEPNSt4__Cr10unique_ptrIA_tNS6_14default_deleteIS8_EEEEj
|
||||
_ZN2v88internal4Intl14BuildLocaleSetERKNSt4__Cr6vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEEPKcSF_
|
||||
_ZN2v88internal4Intl21ConvertOneByteToLowerENS0_6TaggedINS0_6StringEEES4_
|
||||
_ZN2v88internal12_GLOBAL__N_116ValidateResourceEN6icu_776LocaleEPKcS5_
|
||||
_ZN2v88internal4Intl13ToLanguageTagERKN6icu_776LocaleE
|
||||
_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_
|
||||
_ZN2v88internal4Intl22CanonicalizeLocaleListEPNS0_7IsolateENS0_12DirectHandleINS0_6ObjectEEEb
|
||||
_ZN2v88internal4Intl19StringLocaleCompareEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEES6_NS4_INS0_6ObjectEEES8_PKc
|
||||
_ZN2v88internal4Intl14CompareStringsEPNS0_7IsolateERKN6icu_778CollatorENS0_12DirectHandleINS0_6StringEEESA_NS1_21CompareStringsOptionsE
|
||||
_ZN2v88internal4Intl23AsciiCollationWeightsL1Ev
|
||||
_ZN2v88internal4Intl23AsciiCollationWeightsL3Ev
|
||||
@@ -12671,7 +12638,9 @@ _ZN2v88internal16ICUTimezoneCacheD2Ev
|
||||
_ZN2v88internal16ICUTimezoneCacheD0Ev
|
||||
_ZNSt4__Cr6vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__emplace_back_slow_pathIJRKS6_EEEPS6_DpOT_
|
||||
_ZNSt4__Cr9__find_ifIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEES7_ZNS_14__find_genericIS7_S7_S6_NS_10__identityEEET_SA_T0_RKT1_RT2_EUlTyOSA_E_RS9_EESA_SA_SB_OSC_OSF_
|
||||
_ZNSt4__Cr10__pop_heapINS_17_ClassicAlgPolicyENS_6__lessIvvEEPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEvT1_SB_RT0_NS_15iterator_traitsISB_E15difference_typeE
|
||||
_ZNSt4__Cr10__function13__policy_funcIFNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPKcEE11__call_funcIZN2v88internal12_GLOBAL__N_119AvailableCollationsEPNSE_7IsolateEE3$_0EES7_PKNS0_16__policy_storageES9_
|
||||
_ZNSt4__Cr10__function13__policy_funcIFbPKcEE11__call_funcIPS4_EEbPKNS0_16__policy_storageES3_
|
||||
_ZN2v84base16LazyInstanceImplINS_8internal12_GLOBAL__N_112_GLOBAL__N_127ResourceAvailableCurrenciesENS0_32StaticallyAllocatedInstanceTraitIS5_EENS0_21DefaultConstructTraitIS5_EENS0_23ThreadSafeInitOnceTraitENS0_18LeakyInstanceTraitIS5_EEE12InitInstanceEPv
|
||||
_ZNSt4__Cr9__sift_upINS_17_ClassicAlgPolicyERNS_6__lessIvvEEPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEvT1_SC_OT0_NS_15iterator_traitsISC_E15difference_typeE
|
||||
_ZNSt4__Cr6__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE14__tree_deleterclEPNS_11__tree_nodeIS6_PvEE
|
||||
_ZZNSt4__Cr6__treeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEE16__emplace_uniqueIJRKS6_EEENS_4pairINS_15__tree_iteratorIS6_PNS_11__tree_nodeIS6_PvEElEEbEEDpOT_ENKUlSD_SD_E_clESD_SD_
|
||||
@@ -12686,7 +12655,6 @@ _ZN6icu_7714StringByteSinkINSt4__Cr12basic_stringIcNS1_11char_traitsIcEENS1_9all
|
||||
_ZN6icu_7714StringByteSinkINSt4__Cr12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEE6AppendEPKci
|
||||
_ZN2v84base16LazyInstanceImplINS_8internal4Intl16AvailableLocalesINS3_17SkipResourceCheckEEENS0_32StaticallyAllocatedInstanceTraitIS6_EENS0_21DefaultConstructTraitIS6_EENS0_23ThreadSafeInitOnceTraitENS0_18LeakyInstanceTraitIS6_EEE12InitInstanceEPv
|
||||
_ZN2v88internal4Intl16AvailableLocalesINS1_17SkipResourceCheckEEC2Ev
|
||||
_ZN6icu_7722FormattedStringBuilder6insertEiRKNS_13UnicodeStringENS0_5FieldER10UErrorCode
|
||||
_ZN6icu_7722FormattedStringBuilder6insertEiRKNS_13UnicodeStringEiiNS0_5FieldER10UErrorCode
|
||||
_ZN6icu_7722FormattedStringBuilder6spliceEiiRKNS_13UnicodeStringEiiNS0_5FieldER10UErrorCode
|
||||
_ZN6icu_7722FormattedStringBuilder6insertEiRKS0_R10UErrorCode
|
||||
@@ -12716,6 +12684,8 @@ _ZN6icu_776number4impl15CurrencySymbolsC1ENS_12CurrencyUnitERKNS_6LocaleERKNS_20
|
||||
_ZNK6icu_776number4impl15CurrencySymbols10getIsoCodeEv
|
||||
_ZNK6icu_776number4impl15CurrencySymbols23getNarrowCurrencySymbolER10UErrorCode
|
||||
_ZNK6icu_776number4impl15CurrencySymbols23getFormalCurrencySymbolER10UErrorCode
|
||||
_ZNK6icu_776number4impl15CurrencySymbols24getVariantCurrencySymbolER10UErrorCode
|
||||
_ZNK6icu_776number4impl15CurrencySymbols17getCurrencySymbolER10UErrorCode
|
||||
_ZN2v88internal12_GLOBAL__N_122InstallContextFunctionEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEEPKcNS0_7BuiltinENS4_INS0_7ContextEEE
|
||||
_ZN2v85debug12SetContextIdENS_5LocalINS_7ContextEEEi
|
||||
_ZN2v85debug12GetContextIdENS_5LocalINS_7ContextEEE
|
||||
@@ -12730,6 +12700,25 @@ _ZN2v85debug26SetBreakOnNextFunctionCallEPNS_7IsolateE
|
||||
_ZN2v85debug28ClearBreakOnNextFunctionCallEPNS_7IsolateE
|
||||
_ZN2v85debug21GetInternalPropertiesEPNS_7IsolateENS_5LocalINS_5ValueEEE
|
||||
_ZN2v85debug17GetPrivateMembersENS_5LocalINS_7ContextEEENS1_INS_6ObjectEEEiPNS_11LocalVectorINS_5ValueEEES9_
|
||||
_ZNK2v85debug8Location15GetColumnNumberEv
|
||||
_ZNK2v85debug6Script15SetScriptSourceENS_5LocalINS_6StringEEEbbPNS0_14LiveEditResultE
|
||||
_ZNK2v85debug6Script13SetBreakpointENS_5LocalINS_6StringEEEPNS0_8LocationEPi
|
||||
_ZNK2v85debug6Script28SetInstrumentationBreakpointEPi
|
||||
_ZN2v85debug6Script20RemoveWasmBreakpointEi
|
||||
_ZN2v85debug16RemoveBreakpointEPNS_7IsolateEi
|
||||
_ZN2v85debug18GetCurrentPlatformEv
|
||||
_ZN2v85debug22ForceGarbageCollectionEPNS_7IsolateEN5cppgc18EmbedderStackStateE
|
||||
_ZN2v85debug10WasmScript4CastEPNS0_6ScriptE
|
||||
_ZNK2v85debug10WasmScript15GetDebugSymbolsEv
|
||||
_ZN2v85debug10WasmScript11DisassembleEPNS0_20DisassemblyCollectorEPNSt4__Cr6vectorIiNS4_9allocatorIiEEEE
|
||||
_ZN2v85debug11DisassembleENS_4base6VectorIKhEEPNS0_20DisassemblyCollectorEPNSt4__Cr6vectorIiNS7_9allocatorIiEEEE
|
||||
_ZNK2v85debug10WasmScript16GetModuleBuildIdEv
|
||||
_ZNK2v85debug10WasmScript10CodeOffsetEv
|
||||
_ZN2v85debug8LocationC2Eii
|
||||
_ZN2v85debug8LocationC1Eii
|
||||
_ZN2v85debug8LocationC2Ev
|
||||
_ZN2v85debug8LocationC1Ev
|
||||
_ZN2v85debug16GetLoadedScriptsEPNS_7IsolateERNSt4__Cr6vectorINS_6GlobalINS0_6ScriptEEENS3_9allocatorIS7_EEEE
|
||||
_ZN2v85debug15GetScriptOriginEPNS_7IsolateEi
|
||||
_ZN2v85debug22CompileInspectorScriptEPNS_7IsolateENS_5LocalINS_6StringEEE
|
||||
_ZN2v85debug24EnterDebuggingForIsolateEPNS_7IsolateE
|
||||
@@ -12837,6 +12826,7 @@ _ZN2v88internal29SmallStringOptimizedAllocatorILm128EED0Ev
|
||||
_ZN2v88internal29SmallStringOptimizedAllocatorILm128EE8allocateEj
|
||||
_ZN2v88internal29SmallStringOptimizedAllocatorILm128EE4growEPj
|
||||
_ZN2v84base11SmallVectorIcLm128ENSt4__Cr9allocatorIcEEE4GrowEm
|
||||
_ZN2v88internal10DateParser16ParseES5DateTimeIKhEENS1_9DateTokenEPNS1_19DateStringTokenizerIT_EEPNS1_11DayComposerEPNS1_12TimeComposerEPNS1_16TimeZoneComposerE
|
||||
_ZNK2v88internal13ScopeIterator11VisitLocalsERKNSt4__Cr8functionIFbNS0_6HandleINS0_6StringEEENS4_INS0_6ObjectEEENS1_9ScopeTypeEEEENS1_4ModeES9_
|
||||
_ZN2v88internal12_GLOBAL__N_119ScopeChainRetriever20RetrieveClosureScopeEPNS0_5ScopeE
|
||||
_ZN2v88internal12_GLOBAL__N_119ScopeChainRetriever18RetrieveStartScopeEPNS0_5ScopeE
|
||||
@@ -12891,6 +12881,7 @@ _ZN2v88internal13DebugEvaluate14ContextBuilder12UpdateValuesEv
|
||||
_ZN2v88internal13DebugEvaluate20WithTopmostArgumentsEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEE
|
||||
_ZN2v88internal13DebugEvaluate14ContextBuilderC2EPNS0_7IsolateEPNS0_15JavaScriptFrameEi
|
||||
_ZN2v88internal13DebugEvaluate14ContextBuilderC1EPNS0_7IsolateEPNS0_15JavaScriptFrameEi
|
||||
_ZN2v88internal13DebugEvaluate25IsSideEffectFreeIntrinsicENS0_7Runtime10FunctionIdE
|
||||
_ZNSt4__Cr19__partial_sort_implINS_17_ClassicAlgPolicyERPFbRKN2v88internal13CoverageBlockES6_EPS4_SA_EET1_SB_SB_T2_OT0_
|
||||
_ZN2v88internal20TraceManualRecompileENS0_6TaggedINS0_10JSFunctionEEENS0_8CodeKindENS0_15ConcurrencyModeE
|
||||
_ZN2v88internal14TieringManager8OptimizeENS0_6TaggedINS0_10JSFunctionEEENS0_20OptimizationDecisionE
|
||||
@@ -12931,7 +12922,7 @@ _ZN2v88internal8baseline16BaselineCompiler26VisitLdaCurrentContextSlotEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler9VisitStarEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler8VisitMovEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler16VisitPushContextEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler19VisitStaContextSlotEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler15VisitPopContextEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler26VisitStaCurrentContextSlotEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler18VisitLdaLookupSlotEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler31VisitLdaLookupContextSlotNoCellEv
|
||||
@@ -12952,7 +12943,7 @@ _ZN2v88internal8baseline16BaselineCompiler22VisitStaModuleVariableEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler21VisitSetNamedPropertyEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler27VisitDefineNamedOwnPropertyEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler21VisitSetKeyedPropertyEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler8VisitIncEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler27VisitDefineKeyedOwnPropertyEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler8VisitDecEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler11VisitNegateEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler15VisitBitwiseNotEv
|
||||
@@ -12975,7 +12966,6 @@ _ZN2v88internal8baseline16BaselineCompiler27VisitCallUndefinedReceiver2Ev
|
||||
_ZN2v88internal8baseline16BaselineCompiler19VisitCallWithSpreadEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler16VisitCallRuntimeEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler23VisitCallRuntimeForPairEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler17VisitTestLessThanEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler20VisitTestGreaterThanEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler24VisitTestLessThanOrEqualEv
|
||||
_ZN2v88internal8baseline16BaselineCompiler27VisitTestGreaterThanOrEqualEv
|
||||
@@ -13043,7 +13033,6 @@ _ZN2v88internal8baseline16BaselineCompiler13JumpIfNotRootENS0_9RootIndexE
|
||||
_ZN2v88internal8baseline16BaselineCompiler15JumpIfToBooleanEbPNS0_5LabelENS3_8DistanceE
|
||||
_ZN2v88internal8baseline17BaselineAssembler20LdaContextSlotNoCellENS0_8RegisterEjjNS2_15CompressionModeES3_
|
||||
_ZN2v88internal8baseline17BaselineAssembler20StaContextSlotNoCellENS0_8RegisterES3_jj
|
||||
_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE2EJNS0_11interpreter12RegisterListEEEEvjjDpT0_
|
||||
_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter12RegisterListEEEEvjjDpT0_
|
||||
_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter8RegisterEEEEvjjDpT0_
|
||||
_ZN2v88internal8baseline16BaselineCompiler9BuildCallILNS0_19ConvertReceiverModeE1EJNS0_11interpreter8RegisterES6_EEEvjjDpT0_
|
||||
@@ -13169,7 +13158,6 @@ _ZN2v88internal21DebugPropertyIterator14is_array_indexEv
|
||||
_ZN2v85debug16PropertyIteratorD2Ev
|
||||
_ZN2v88internal21DebugPropertyIteratorD0Ev
|
||||
_ZN2v88internal27Builtin_DataViewConstructorEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal42Builtin_AsyncDisposableStackPrototypeDeferEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal41Builtin_AsyncDisposableStackPrototypeMoveEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal24Builtin_ErrorConstructorEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal30Builtin_ErrorCaptureStackTraceEiPmPNS0_7IsolateE
|
||||
@@ -13194,6 +13182,8 @@ _ZN2v88internal20Builtin_GlobalEscapeEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal22Builtin_GlobalUnescapeEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal18Builtin_GlobalEvalEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal3Uri6DecodeEPNS0_7IsolateENS0_12DirectHandleINS0_6StringEEEb
|
||||
_ZN2v88internal3Uri8UnescapeEPNS0_7IsolateENS0_6HandleINS0_6StringEEE
|
||||
_ZZNSt4__Cr6vectorItNS_9allocatorItEEE12emplace_backIJtEEERtDpOT_ENKUlvE0_clEv
|
||||
_ZZNSt4__Cr6vectorItNS_9allocatorItEEE12emplace_backIJRKtEEERtDpOT_ENKUlvE0_clEv
|
||||
_ZZNSt4__Cr6vectorIhNS_9allocatorIhEEE12emplace_backIJhEEERhDpOT_ENKUlvE0_clEv
|
||||
_ZN2v88internal12_GLOBAL__N_16EncodeEjPNS1_15ResizableBufferIhEE
|
||||
@@ -13259,6 +13249,7 @@ _ZN2v84base11SmallVectorIiLm16ENSt4__Cr9allocatorIiEEE11FreeStorageEv
|
||||
_ZNSt4__Cr6vectorIN2v88internal10JsonParserIhE16JsonContinuationENS_9allocatorIS5_EEE7reserveEm
|
||||
_ZN2v88internal10JsonParserIhE16JsonContinuationaSEOS3_
|
||||
_ZNSt4__Cr6vectorIN2v88internal10JsonParserIhE16JsonContinuationENS_9allocatorIS5_EEE8pop_backEv
|
||||
_ZN2v88internal10JsonParserIhE10ExpectNextILNS0_9JsonTokenE1EEEbNSt4__Cr8optionalINS0_15MessageTemplateEEE
|
||||
_ZN2v88internal10JsonParserIhE15BuildJsonObjectILb1EEENS0_6HandleINS0_8JSObjectEEERKNS2_16JsonContinuationENS0_12DirectHandleINS0_3MapEEE
|
||||
_ZN2v88internal11HandleScope14CloseAndEscapeINS0_18ObjectTwoHashTableENS0_6HandleEQsr3stdE16is_convertible_vIT0_IT_ENS0_12DirectHandleIS6_EEEEES7_S7_
|
||||
_ZN2v88internal11HandleScope14CloseAndEscapeINS0_10FixedArrayENS0_6HandleEQsr3stdE16is_convertible_vIT0_IT_ENS0_12DirectHandleIS6_EEEEES7_S7_
|
||||
@@ -13293,7 +13284,7 @@ _ZN2v88internal19JSDataObjectBuilder45RewindExpectedFinalMapFastPathToBeforeCurr
|
||||
_ZN2v88internal19JSDataObjectBuilder46RewindExpectedFinalMapFastPathToIncludeCurrentEv
|
||||
_ZN2v88internal15JsonStringifierC2EPNS0_7IsolateE
|
||||
_ZN2v88internal15JsonStringifierC1EPNS0_7IsolateE
|
||||
_ZN2v88internal43Builtin_ObjectPrototypePropertyIsEnumerableEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal15JsonStringifier9StringifyENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEESE_NS2_INS0_6ObjectEEE
|
||||
_ZN2v88internal30Builtin_ObjectDefinePropertiesEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal28Builtin_ObjectDefinePropertyEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal26Builtin_ObjectDefineGetterEiPmPNS0_7IsolateE
|
||||
@@ -13486,8 +13477,6 @@ _ZN2v88internal7Genesis31InitializeGlobal_harmony_structEv
|
||||
_ZN2v88internal7Genesis40InitializeGlobal_js_source_phase_importsEv
|
||||
_ZN2v88internal7Genesis35InitializeGlobal_regexp_linear_flagEv
|
||||
_ZN2v88internal7Genesis34InitializeGlobal_sharedarraybufferEv
|
||||
_ZN2v88internal7Genesis16CompileExtensionEPNS0_7IsolateEPNS_9ExtensionE
|
||||
_ZN2v88internal7Genesis27InitializeIteratorFunctionsEv
|
||||
_ZN2v88internal7Genesis32CreateInitialMapForArraySubclassEii
|
||||
_ZN2v88internal7Genesis21InstallExtrasBindingsEv
|
||||
_ZN2v88internal7Genesis19InitializeMapCachesEv
|
||||
@@ -13580,7 +13569,6 @@ _ZN2v88internal14V8HeapExplorerC2EPNS0_12HeapSnapshotEPNS0_38SnapshottingProgres
|
||||
_ZN2v88internal14V8HeapExplorerC1EPNS0_12HeapSnapshotEPNS0_38SnapshottingProgressReportingInterfaceEPNS_12HeapProfiler19ContextNameResolverE
|
||||
_ZN2v88internal14V8HeapExplorer13AllocateEntryEPv
|
||||
_ZN2v88internal14V8HeapExplorer8AddEntryENS0_6TaggedINS0_10HeapObjectEEE
|
||||
_ZN2v88internal18OutputStreamWriter9AddNumberIjEEvT_
|
||||
_ZN2v88internal18OutputStreamWriter9AddNumberImEEvT_
|
||||
_ZN2v88internal18OutputStreamWriter9AddNumberIhEEvT_
|
||||
_ZN2v88internal26HeapSnapshotJSONSerializer18SerializeTraceNodeEPNS0_19AllocationTraceNodeE
|
||||
@@ -13602,6 +13590,9 @@ _ZNSt4__Cr6vectorIN2v88internal14HeapObjectsMap12TimeIntervalENS_9allocatorIS4_E
|
||||
_ZNSt4__Cr6vectorIN2v815HeapStatsUpdateENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJjRjS7_EEEPS2_DpOT_
|
||||
_ZNSt4__Cr6vectorIN2v815HeapStatsUpdateENS_9allocatorIS2_EEE20__throw_length_errorEv
|
||||
_ZN2v88internal12_GLOBAL__N_122ExternalStringRecorder23RecordSharedMemoryUsageEPKvm
|
||||
_ZN2v88internal12_GLOBAL__N_126ExternalDataEntryAllocatorD0Ev
|
||||
_ZN2v88internal12_GLOBAL__N_126ExternalDataEntryAllocator13AllocateEntryEPv
|
||||
_ZN2v88internal12_GLOBAL__N_126ExternalDataEntryAllocator13AllocateEntryENS0_6TaggedINS0_3SmiEEE
|
||||
_ZN4absl18container_internal12raw_hash_setINS0_17FlatHashMapPolicyINSt4__Cr12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPN2v88internal9HeapEntryEEEJEE46transfer_unprobed_elements_to_next_capacity_fnERNS0_12CommonFieldsEPKNS0_6ctrl_tEPvSL_PFvSL_hmmE
|
||||
_ZN4absl13hash_internal15MixingHashState18combine_contiguousES1_PKhm
|
||||
_ZN4absl19functional_internal12InvokeObjectIRNS_18container_internal7HashKeyINS2_10StringHashEPKcLb1EEEmJmEEET0_NS0_7VoidPtrEDpNS0_8ForwardTIT1_E4typeE
|
||||
@@ -13629,6 +13620,7 @@ _ZN2v88internal19AllocationTraceNodeC2EPNS0_19AllocationTraceTreeEj
|
||||
_ZN2v88internal19AllocationTraceNodeC1EPNS0_19AllocationTraceTreeEj
|
||||
_ZN2v88internal19AllocationTraceNodeD2Ev
|
||||
_ZN2v88internal19AllocationTraceNodeD1Ev
|
||||
_ZN2v88internal19AllocationTraceNode14FindOrAddChildEj
|
||||
_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_EEE6removeENS_21__hash_const_iteratorIPNS_11__hash_nodeISB_PvEEEE
|
||||
_ZNSt4__Cr5dequeIN2v817AllocationProfile4NodeENS_9allocatorIS3_EEE19__add_back_capacityEv
|
||||
_ZNSt4__Cr14__split_bufferIPN2v817AllocationProfile4NodeENS_9allocatorIS4_EENS_29__split_buffer_pointer_layoutEE12emplace_backIJRS4_EEEvDpOT_
|
||||
@@ -13644,6 +13636,7 @@ _ZN2v88internal16FileOutputStreamD0Ev
|
||||
_ZN2v812OutputStream12GetChunkSizeEv
|
||||
_ZN2v88internal26ExternalizeStringExtension11BuildSourceEPcm
|
||||
_ZN2v88internal26ExternalizeStringExtension25GetNativeFunctionTemplateEPNS_7IsolateENS_5LocalINS_6StringEEE
|
||||
_ZN2v88internal26ExternalizeStringExtension11ExternalizeERKNS_20FunctionCallbackInfoINS_5ValueEEE
|
||||
_ZN2v88internal6WasmJs18PrepareForSnapshotEPNS0_7IsolateE
|
||||
_ZN2v88internal12_GLOBAL__N_111InstallFuncEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEEPKcPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEEibNS0_18PropertyAttributesENS_14SideEffectTypeE
|
||||
_ZN2v88internal6WasmJs13InstallModuleEPNS0_7IsolateENS0_12DirectHandleINS0_8JSObjectEEE
|
||||
@@ -13686,6 +13679,9 @@ _ZN2v88internal17ContextSerializerD2Ev
|
||||
_ZN2v88internal17ContextSerializerD1Ev
|
||||
_ZN2v88internal17ContextSerializerD0Ev
|
||||
_ZN2v88internal17ContextSerializer9SerializeEPNS0_6TaggedINS0_7ContextEEERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELS7_2EEEE
|
||||
_ZN2v88internal29InternalFieldSerializeWrapperEibNS_31SerializeInternalFieldsCallbackENS_5LocalINS_6ObjectEEE
|
||||
_ZN2v88internal27ContextDataSerializeWrapperEibNS_28SerializeContextDataCallbackENS_5LocalINS_7ContextEEE
|
||||
_ZN2v88internal17ContextSerializer19SerializeObjectImplENS0_6HandleINS0_10HeapObjectEEENS0_22SerializerDeserializer8SlotTypeE
|
||||
_ZN2v88internal17ContextSerializer33SerializeObjectWithEmbedderFieldsINS0_17EmbedderDataArrayEPFNS_11StartupDataEibNS_28SerializeContextDataCallbackENS_5LocalINS_7ContextEEEES5_S8_EEvNS0_6HandleIT_EEiT0_T1_T2_
|
||||
_ZNSt4__Cr6vectorIbNS_9allocatorIbEEE9push_backERKb
|
||||
_ZZNSt4__Cr6vectorIN2v811StartupDataENS_9allocatorIS2_EEE12emplace_backIJS2_EEERS2_DpOT_ENKUlvE0_clEv
|
||||
@@ -13693,7 +13689,6 @@ _ZNSt4__Cr6vectorIN2v811StartupDataENS_9allocatorIS2_EEE20__throw_length_errorEv
|
||||
_ZZNSt4__Cr6vectorIN2v811StartupDataENS_9allocatorIS2_EEE12emplace_backIJRKS2_EEERS2_DpOT_ENKUlvE0_clEv
|
||||
_ZN2v88internal21DescriptorLookupCache5ClearEv
|
||||
_ZN2v88internal17ReadOnlyPromotion7PromoteEPNS0_7IsolateERKNS0_14SafepointScopeERKNS0_25PerThreadAssertScopeEmptyILb0EJLNS0_19PerThreadAssertTypeE1ELS8_2EEEE
|
||||
_ZNSt4__Cr6vectorIN2v88internal6TaggedINS2_10HeapObjectEEENS_9allocatorIS5_EEE18__insert_with_sizeINS_17_ClassicAlgPolicyENS_11__wrap_iterIPS5_EESD_EESD_NSB_IPKS5_EET0_T1_l
|
||||
_ZN2v88internal12_GLOBAL__N_121ReadOnlyPromotionImpl17LogPromotedObjectENS0_6TaggedINS0_10HeapObjectEEES5_
|
||||
_ZZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal6TaggedINS3_10HeapObjectEEES6_EENS_22__unordered_map_hasherIS6_NS_4pairIKS6_S6_EENS3_6Object6HasherENSC_12KeyEqualSafeEEENS_21__unordered_map_equalIS6_SB_SE_SD_EENS_9allocatorISB_EEE16__emplace_uniqueIJRS6_SM_EEENS9_INS_15__hash_iteratorIPNS_11__hash_nodeIS7_PvEEEEbEEDpOT_ENKUlRSA_SM_SM_E_clESX_SM_SM_
|
||||
_ZNSt4__Cr12__hash_tableINS_17__hash_value_typeIN2v88internal6TaggedINS3_10HeapObjectEEES6_EENS_22__unordered_map_hasherIS6_NS_4pairIKS6_S6_EENS3_6Object6HasherENSC_12KeyEqualSafeEEENS_21__unordered_map_equalIS6_SB_SE_SD_EENS_9allocatorISB_EEE11__do_rehashILb1EEEvm
|
||||
@@ -13808,7 +13803,6 @@ _ZNK2v88internal8compiler7Linkage29GetParameterSecondaryLocationEi
|
||||
_ZZNSt4__Cr6vectorIN2v88internal11MachineTypeENS_9allocatorIS3_EEE12emplace_backIJRKS3_EEERS3_DpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6vectorIN2v88internal11MachineTypeENS_9allocatorIS3_EEE20__throw_length_errorEv
|
||||
_ZN2v88internal4wasm20IterateSignatureImplINS0_16SignatureBuilderINS0_9SignatureINS0_15LinkageLocationEEES5_EENS4_INS0_11MachineTypeEEEEEvPKT0_bRT_PiSF_SF_SF_
|
||||
_ZN2v88internal8compiler10turboshaft10OperationTINS2_18StringToCaseIntlOpEE18PrintOptionsHelperIJNS4_4KindENS1_16LazyDeoptOnThrowEEJLm0ELm1EEEEvRNSt4__Cr13basic_ostreamIcNS9_11char_traitsIcEEEERKNS9_5tupleIJDpT_EEENS9_16integer_sequenceImJXspT0_EEEE
|
||||
_ZN2v88internal8compiler10turboshaft10OperationTINS2_19ToNumberOrNumericOpEE18PrintOptionsHelperIJNS0_6Object10ConversionENS1_16LazyDeoptOnThrowEEJLm0ELm1EEEEvRNSt4__Cr13basic_ostreamIcNSA_11char_traitsIcEEEERKNSA_5tupleIJDpT_EEENSA_16integer_sequenceImJXspT0_EEEE
|
||||
_ZZNSt4__Cr12__hash_tableIiNS_4hashIiEENS_8equal_toIiEENS_9allocatorIiEEE16__emplace_uniqueIJRKiEEENS_4pairINS_15__hash_iteratorIPNS_11__hash_nodeIiPvEEEEbEEDpOT_ENKUlSA_SA_E_clESA_SA_
|
||||
_ZNKSt4__Cr6bitsetILm8EE9to_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EES8_S8_
|
||||
@@ -13816,9 +13810,6 @@ _ZNSt4__Cr7__countINS_17_ClassicAlgPolicyENS_8__bitsetILm1ELm8EEELb1EbNS_10__ide
|
||||
_ZN2v88internal8compiler10turboshaftlsERNSt4__Cr13basic_ostreamIcNS3_11char_traitsIcEEEENS2_27MaybeRegisterRepresentationE
|
||||
_ZN2v88internal8compiler10turboshaftlsERNSt4__Cr13basic_ostreamIcNS3_11char_traitsIcEEEENS2_20MemoryRepresentationE
|
||||
_ZN2v88internal8compiler10turboshaft8WordTypeILm32EE5RangeEjjPNS0_4ZoneE
|
||||
_ZNSt4__Cr6__treeINS_12__value_typeIN2v88internal8compiler10turboshaft7OpIndexEmEENS_19__map_value_compareIS6_NS_4pairIKS6_mEENS_4lessIS6_EEEENS3_13ZoneAllocatorISB_EEE14__tree_deleterclEPNS_11__tree_nodeIS7_PvEE
|
||||
_ZNSt4__Cr6__treeIN2v88internal8compiler10turboshaft7OpIndexENS_4lessIS5_EENS2_13ZoneAllocatorIS5_EEE14__tree_deleterclEPNS_11__tree_nodeIS5_PvEE
|
||||
_ZN4absl19functional_internal12InvokeObjectIRZNS_18container_internal12raw_hash_setINS2_17FlatHashMapPolicyINSt4__Cr4pairIN2v88internal8compiler10turboshaft7OpIndexEiEENSA_16SnapshotTableKeyINSA_18StoreObservabilityENSA_27MaybeRedundantStoresKeyDataEEEEEJNS_13hash_internal4HashISC_EENS5_8equal_toISC_EENS8_13ZoneAllocatorINS6_IKSC_SG_EEEEEE13destroy_slotsEvEUlPKNS2_6ctrl_tEPvE_vJSU_SV_EEET0_NS0_7VoidPtrEDpNS0_8ForwardTIT1_E4typeE
|
||||
_ZNSt4__Cr5dequeIN2v88internal8compiler10turboshaft13SnapshotTableINS4_18StoreObservabilityENS4_27MaybeRedundantStoresKeyDataEE12SnapshotDataENS2_22RecyclingZoneAllocatorIS9_EEED2Ev
|
||||
_ZNSt4__Cr5dequeIN2v88internal8compiler10turboshaft18SnapshotTableEntryINS4_18StoreObservabilityENS4_27MaybeRedundantStoresKeyDataEEENS2_22RecyclingZoneAllocatorIS8_EEED2Ev
|
||||
_ZN2v88internal8compiler24GetBuiltinCallDescriptorENS0_7BuiltinEPNS0_4ZoneENS0_12StubCallModeEbNS_4base5FlagsINS1_8Operator8PropertyEhhEE
|
||||
@@ -13844,7 +13835,8 @@ _ZN2v88internal8compiler18WasmGraphAssembler32LoadExportedFunctionInstanceDataEP
|
||||
_ZN2v88internal8compiler18WasmGraphAssembler11FieldOffsetEPKNS0_4wasm10StructTypeEj
|
||||
_ZN2v88internal8compiler18WasmGraphAssembler22WasmArrayElementOffsetEPNS1_4NodeENS0_4wasm9ValueTypeE
|
||||
_ZN2v88internal8compiler18WasmGraphAssembler12IsDataRefMapEPNS1_4NodeE
|
||||
_ZN2v88internal4wasm7AsmType18ElementSizeInBytesEv
|
||||
_ZN2v88internal8compiler18WasmGraphAssembler12WasmTypeCastEPNS1_4NodeES4_NS1_19WasmTypeCheckConfigE
|
||||
_ZN2v88internal8compiler18WasmGraphAssembler4NullENS0_4wasm9ValueTypeE
|
||||
_ZN2v88internal4wasm7AsmType8LoadTypeEv
|
||||
_ZN2v88internal4wasm7AsmType9StoreTypeEv
|
||||
_ZN2v88internal4wasm15AsmCallableType3IsAEPNS1_7AsmTypeE
|
||||
@@ -14298,8 +14290,6 @@ _ZN2v88internal2IC14MaybePatchCodeENS0_7BuiltinE
|
||||
_ZN2v88internal2IC24CopyICToMegamorphicCacheENS0_12DirectHandleINS0_4NameEEE
|
||||
_ZN2v88internal2IC8SetCacheENS0_12DirectHandleINS0_4NameEEERKNS0_17MaybeObjectHandleE
|
||||
_ZN2v88internal6LoadIC14ComputeHandlerEPNS0_14LookupIteratorE
|
||||
_ZN2v88internal11KeyedLoadIC30LoadElementPolymorphicHandlersEPNS0_15MapsAndHandlersES3_NS0_19KeyedAccessLoadModeE
|
||||
_ZN2v88internal11LoadHandler11LoadElementEPNS0_7IsolateENS0_12ElementsKindEbNS0_19KeyedAccessLoadModeE
|
||||
_ZN2v88internal11LoadHandler24TransitionAndLoadElementEPNS0_7IsolateENS0_12ElementsKindENS0_19KeyedAccessLoadModeE
|
||||
_ZN2v88internal12_GLOBAL__N_124GetUpdatedLoadModeForMapEPNS0_7IsolateENS0_12DirectHandleINS0_3MapEEENS0_19KeyedAccessLoadModeES7_
|
||||
_ZN2v88internal11KeyedLoadIC8LoadNameENS0_6HandleINS0_5UnionIJNS0_3SmiENS0_10HeapNumberENS0_6BigIntENS0_6StringENS0_6SymbolENS0_7BooleanENS0_4NullENS0_9UndefinedENS0_10JSReceiverEEEEEENS0_12DirectHandleINS0_6ObjectEEENS2_INS0_4NameEEE
|
||||
@@ -14319,6 +14309,11 @@ _ZN2v88internal12StoreHandler22StoreSharedStructFieldEPNS0_7IsolateENS0_13Intern
|
||||
_ZN2v88internal12StoreHandler10StoreFieldEPNS0_7IsolateENS0_13InternalIndexENS0_10FieldIndexENS0_17PropertyConstnessENS0_14RepresentationE
|
||||
_ZN2v88internal12KeyedStoreIC18UpdateStoreElementENS0_6HandleINS0_3MapEEENS0_20KeyedAccessStoreModeES4_
|
||||
_ZN2v88internal12KeyedStoreIC19StoreElementHandlerENS0_12DirectHandleINS0_3MapEEENS0_20KeyedAccessStoreModeENS0_17MaybeDirectHandleINS0_5UnionIJNS0_3SmiENS0_4CellEEEEEE
|
||||
_ZN2v88internal12KeyedStoreIC31StoreElementPolymorphicHandlersEPNS0_15MapsAndHandlersENS0_20KeyedAccessStoreModeE
|
||||
_ZN2v88internal21StoreInArrayLiteralIC5StoreENS0_12DirectHandleINS0_7JSArrayEEENS0_6HandleINS0_6ObjectEEENS2_IS6_EE
|
||||
_ZN2v88internal19Runtime_LoadIC_MissEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal32Runtime_LoadIC_Miss_FromBaselineEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal40Runtime_PatchLoadICUninitializedBaselineEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal40Runtime_GetStringLengthAndUpdateFeedbackEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal29Runtime_LoadNoFeedbackIC_MissEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal41Runtime_LoadWithReceiverNoFeedbackIC_MissEiPmPNS0_7IsolateE
|
||||
@@ -14374,7 +14369,6 @@ _ZN2v88internal7ICStats5BeginEv
|
||||
_ZN2v88internal7ICStats3EndEv
|
||||
_ZN2v88internal7ICStats4DumpEv
|
||||
_ZNK2v88internal6ICInfo19AppendToTracedValueEPNS_7tracing11TracedValueE
|
||||
_ZN2v88internal27Runtime_VarargStackOverflowEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal39Runtime_ThrowSymbolAsyncIteratorInvalidEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal26Runtime_TerminateExecutionEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal23Runtime_ThrowRangeErrorEiPmPNS0_7IsolateE
|
||||
@@ -14399,28 +14393,6 @@ _ZN2v88internal18Runtime_StackGuardEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal36Runtime_HandleNoHeapWritesInterruptsEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal25Runtime_StackGuardWithGapEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal54Runtime_BytecodeBudgetInterruptWithStackCheck_IgnitionEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal40Runtime_BytecodeBudgetInterrupt_IgnitionEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal55Runtime_BytecodeBudgetInterruptWithStackCheck_SparkplugEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal41Runtime_BytecodeBudgetInterrupt_SparkplugEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal38Runtime_BytecodeBudgetInterrupt_MaglevEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal52Runtime_BytecodeBudgetInterruptWithStackCheck_MaglevEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal33Runtime_AllocateInYoungGenerationEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal31Runtime_AllocateInOldGenerationEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal28Runtime_AllocateInSharedHeapEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal25Runtime_AllocateByteArrayEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal26Runtime_ThrowIteratorErrorEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal27Runtime_ThrowSpreadArgErrorEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal30Runtime_ThrowCalledNonCallableEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal40Runtime_ThrowConstructedNonConstructableEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal42Runtime_ThrowPatternAssignmentNonCoercibleEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal41Runtime_ThrowConstructorReturnedNonObjectEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal31Runtime_CreateListFromArrayLikeEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal27Runtime_IncrementUseCounterEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal37Runtime_GetAndResetTurboProfilingDataEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal35Runtime_GetAndResetRuntimeCallStatsEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal27Runtime_OrdinaryHasInstanceEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal14Runtime_TypeofEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal28Runtime_AllowDynamicFunctionEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal35Runtime_CreateAsyncFromSyncIteratorEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal25Runtime_GetTemplateObjectEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal34Runtime_ReportMessageFromMicrotaskEiPmPNS0_7IsolateE
|
||||
@@ -14534,6 +14506,7 @@ _ZN2v88internal18Runtime_RegExpExecEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal33Runtime_RegExpGrowRegExpMatchInfoEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal37Runtime_RegExpExperimentalOneshotExecEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal26Runtime_RegExpBuildIndicesEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal26Runtime_RegExpExecMultipleEiPmPNS0_7IsolateE
|
||||
_ZN2v84base11SmallVectorIiLm2ENSt4__Cr9allocatorIiEEE4GrowEm
|
||||
_ZN2v84base11SmallVectorIiLm2ENSt4__Cr9allocatorIiEEE4GrowEv
|
||||
_ZN2v88internal6String19IsWellFormedUnicodeEPNS0_7IsolateENS0_12DirectHandleIS1_EE
|
||||
@@ -14547,9 +14520,6 @@ _ZN2v88internal34Runtime_SetWasmInstantiateControlsEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal39Runtime_CountUnoptimizedWasmToJSWrapperEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal37Runtime_HasUnoptimizedWasmToJSWrapperEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal22Runtime_WasmTraceEnterEiPmPNS0_7IsolateE
|
||||
_ZN2v88internal4wasm17return_jspi_stackEPNS0_7IsolateEPNS1_11StackMemoryE
|
||||
_ZN2v88internal4wasm19return_wasmfx_stackEPNS0_7IsolateEPNS1_11StackMemoryE
|
||||
_ZN2v88internal4wasm12retire_stackEPNS0_7IsolateEPNS1_11StackMemoryE
|
||||
_ZN2v88internal4wasm27switch_to_the_central_stackEPNS0_7IsolateEm
|
||||
_ZN2v88internal4wasm29switch_from_the_central_stackEPNS0_7IsolateE
|
||||
_ZN2v88internal4wasm34switch_to_the_central_stack_for_jsEPNS0_7IsolateEm
|
||||
@@ -14585,7 +14555,7 @@ _ZN2v88internal15CheckObjectTypeEmmm
|
||||
_ZN2v88internal24CompareOperationFeedback23GetTransitionMapAddressEv
|
||||
_ZN2v88internal24CompareOperationFeedback29GetFeedbackEncodeTableAddressEv
|
||||
_ZN2v88internal8compiler10turboshaft32ExecuteTurboshaftWasmCompilationEPNS0_4wasm14CompilationEnvERNS1_19WasmCompilationDataEPNS3_20WasmDetectedFeaturesEPNS0_21DelayedCounterUpdatesE
|
||||
_ZN2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE4FreeERNSt4__Cr6vectorIPNS1_8WasmCodeENS5_9allocatorIS8_EEEE
|
||||
_ZN2v88internal4wasm22WasmExportWrapperCache3NewEPNS0_7IsolateEj
|
||||
_ZN2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE11GetCompiledEPNS0_7IsolateES3_
|
||||
_ZN2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE20CacheCompiledWrapperEPNS0_7IsolateENS1_21WasmCompilationResultENS1_8WasmCode4KindES3_NSt4__Cr10shared_ptrINS1_17WasmWrapperHandleEEE
|
||||
_ZNK2v88internal4wasm16WasmWrapperCacheINS1_25StackEntryWrapperCacheKeyEE6LookupEm
|
||||
@@ -14637,6 +14607,7 @@ _ZN2v86bigint9Processor11ModuloLargeERNS0_8RWDigitsERNS0_6DigitsES5_
|
||||
_ZN2v86bigint13ProcessorImpl21CachedMod_MakeInverseERNS0_6DigitsE
|
||||
_ZN2v86bigint9Processor21CachedMod_MakeInverseERNS0_6DigitsE
|
||||
_ZN2v86bigint13ProcessorImpl17MultiplyKaratsubaENS0_8RWDigitsENS0_6DigitsES3_
|
||||
_ZN2v86bigint13ProcessorImpl14KaratsubaStartENS0_8RWDigitsENS0_6DigitsES3_S2_j
|
||||
_ZN2v84base6Bignum21DivideModuloIntBignumERKS1_
|
||||
_ZN2v84base6Bignum13SubtractTimesERKS1_i
|
||||
_ZN2v84base6Bignum7CompareERKS1_S3_
|
||||
@@ -14708,7 +14679,6 @@ _ZN2v88internal17EmbedderDataArray14BodyDescriptor11IterateBodyINS0_24Concurrent
|
||||
_ZN2v88internal24ConcurrentMarkingVisitor10RecordSlotINS0_20CompressedObjectSlotELNS0_15RecordYoungSlotE1EEEvNS0_6TaggedINS0_10HeapObjectEEET_S7_
|
||||
_ZN2v88internal3Map14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedIS1_EENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal18BodyDescriptorBase23IterateJSObjectBodyImplINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS4_INS0_10HeapObjectEEEiiPT_
|
||||
_ZN2v88internal16WasmGlobalObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal18WasmInstanceObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal15WasmTableObject14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
_ZN2v88internal4Code14BodyDescriptor11IterateBodyINS0_24ConcurrentMarkingVisitorEEEvNS0_6TaggedINS0_3MapEEENS5_INS0_10HeapObjectEEEiPT_
|
||||
@@ -14841,11 +14811,7 @@ _ZN2v88internal19CppHeapPointerTable15SweepAndCompactEPNS0_30CompactibleExternal
|
||||
_ZZNSt4__Cr6vectorIN2v88internal14SegmentedTableINS2_24CppHeapPointerTableEntryELm536870912EE7SegmentENS_9allocatorIS6_EEE12emplace_backIJRKS6_EEERS6_DpOT_ENKUlvE0_clEv
|
||||
_ZNSt4__Cr6vectorIN2v88internal14SegmentedTableINS2_24CppHeapPointerTableEntryELm536870912EE7SegmentENS_9allocatorIS6_EEE20__throw_length_errorEv
|
||||
_ZNSt4__Cr6__treeIN2v88internal14SegmentedTableINS2_24CppHeapPointerTableEntryELm536870912EE7SegmentENS_4lessIS6_EENS_9allocatorIS6_EEE14__erase_uniqueIS6_EEmRKT_
|
||||
_v8_internal_Print_TransitionTree
|
||||
_v8_internal_Print_Object_MarkBit
|
||||
_v8_internal_Print_FunctionCallbackInfo
|
||||
_v8_internal_Print_PropertyCallbackInfo
|
||||
_ZN2v88internal7TryCastINS0_10HeapObjectENS0_6ObjectENS0_6TaggedEQ24HasTryCastImplementationIT1_T_T0_EEEbS5_IS7_EPS5_IS6_E
|
||||
_ZN2v88internal22EphemeronRememberedSet23RecordEphemeronKeyWriteENS0_6TaggedINS0_18EphemeronHashTableEEEm
|
||||
_ZNSt4__Cr6vectorIN22_v8_internal_debugonly22StackTraceDebugDetailsENS_9allocatorIS2_EEE24__emplace_back_slow_pathIJS2_EEEPS2_DpOT_
|
||||
_ZNSt4__Cr6vectorIN22_v8_internal_debugonly22StackTraceDebugDetailsENS_9allocatorIS2_EEE20__throw_length_errorEv
|
||||
_ZNSt4__Cr12__destroy_atIN22_v8_internal_debugonly22StackTraceDebugDetailsEEEvPT_
|
||||
@@ -14869,6 +14835,7 @@ _ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTaskC2EPNS0_4Heap
|
||||
_ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTaskC1EPNS0_4HeapEOKNSt4__Cr6vectorINS0_17PinnedObjectEntryENS6_9allocatorIS8_EEEE
|
||||
_ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTask3RunEPNS_11JobDelegateE
|
||||
_ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTask28CreateFillerFreeSpaceHandlerEPNS0_4HeapEmmb
|
||||
_ZN2v88internal18ScavengerCollector22QuarantinedPageSweeper7JobTask29AddToFreeListFreeSpaceHandlerEPNS0_4HeapEmmb
|
||||
_ZN2v88internal18ScavengerCollector14CollectGarbageEv
|
||||
_ZN2v88internal12_GLOBAL__N_122PinObjectsConservativeEPNS0_4HeapERNS0_9ScavengerERNSt4__Cr6vectorINS0_17PinnedObjectEntryENS6_9allocatorIS8_EEEENS2_13StackScanModeE
|
||||
_ZN2v88internal12_GLOBAL__N_117PinObjectsPreciseEPNS0_4HeapERNS0_9ScavengerERNSt4__Cr6vectorINS0_17PinnedObjectEntryENS6_9allocatorIS8_EEEE
|
||||
@@ -14882,6 +14849,7 @@ _ZN2v88internal18ScavengerCollector40CompleteSweepingQuarantinedPagesIfNeededEv
|
||||
_ZN2v88internal9ScavengerC2EPNS0_4HeapEbPN4heap4base8WorklistIPNS0_11MutablePageELt64EEEPNS6_INS1_24ScavengedObjectListEntryELt256EEESD_PNS6_INS0_6TaggedINS0_18EphemeronHashTableEEELt128EEEPNS6_INSE_INS0_9JSWeakRefEEELt64EEEPNS6_INSE_INS0_8WeakCellEEELt64EEEb
|
||||
_ZN2v88internal9ScavengerC1EPNS0_4HeapEbPN4heap4base8WorklistIPNS0_11MutablePageELt64EEEPNS6_INS1_24ScavengedObjectListEntryELt256EEESD_PNS6_INS0_6TaggedINS0_18EphemeronHashTableEEELt128EEEPNS6_INSE_INS0_9JSWeakRefEEELt64EEEPNS6_INSE_INS0_8WeakCellEEELt64EEEb
|
||||
_ZN2v88internal9Scavenger25RememberPromotedEphemeronENS0_6TaggedINS0_18EphemeronHashTableEEEi
|
||||
_ZN4heap4base8WorklistIPN2v88internal11MutablePageELt64EE5Local7PublishEv
|
||||
_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_
|
||||
|
||||
@@ -254,6 +254,7 @@ pub const ExperimentalFeatures = packed struct(u2) {
|
||||
const CommonOptions = .{
|
||||
.{ .name = "obey_robots", .type = bool },
|
||||
.{ .name = "robot_store_entry_limit", .type = ?u32, .default = 1000 },
|
||||
.{ .name = "cors_store_entry_limit", .type = ?u32, .default = 1000 },
|
||||
.{ .name = "proxy_bearer_token", .type = ?[:0]const u8 },
|
||||
.{ .name = "http_proxy", .type = ?[:0]const u8 },
|
||||
.{ .name = "http_max_concurrent", .type = ?u8 },
|
||||
@@ -348,6 +349,7 @@ pub const AiProvider = std.meta.Tag(zenai.provider.Client);
|
||||
/// in `Agent.init` (explicit flag > remembered > mode default), so there is
|
||||
/// no Config-level accessor like `agentVerbosity`.
|
||||
pub const Effort = zenai.provider.Effort;
|
||||
pub const SearchEngine = @import("browser/tools.zig").SearchEngine;
|
||||
|
||||
/// Controls how chatty `agent` mode is on stderr.
|
||||
pub const AgentVerbosity = enum {
|
||||
@@ -471,6 +473,8 @@ const Commands = cli.Builder(.{
|
||||
.{ .name = "attach", .short = 'a', .type = []const u8, .multiple = true },
|
||||
.{ .name = "verbosity", .type = ?AgentVerbosity },
|
||||
.{ .name = "effort", .type = ?Effort },
|
||||
.{ .name = "search_engine", .type = ?SearchEngine },
|
||||
.{ .name = "url", .type = ?[:0]const u8 },
|
||||
.{ .name = "list_models", .type = bool },
|
||||
.{ .name = "no_llm", .type = bool },
|
||||
},
|
||||
@@ -570,6 +574,13 @@ pub fn robotStoreEntryLimit(self: *const Config) u32 {
|
||||
};
|
||||
}
|
||||
|
||||
pub fn corsStoreEntryLimit(self: *const Config) u32 {
|
||||
return switch (self.mode) {
|
||||
inline .serve, .fetch, .mcp, .agent => |opts| opts.cors_store_entry_limit.?,
|
||||
else => 1000,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn httpVersion(self: *const Config) HttpVersion {
|
||||
return switch (self.mode) {
|
||||
inline .serve, .fetch, .mcp, .agent => |opts| opts.http_version,
|
||||
|
||||
+1
-1
@@ -93,7 +93,7 @@ http_navigation_delay_ms: Histogram(&.{
|
||||
robots_status: CounterEnum("category", @import("network/http.zig").StatusCategory) = .{},
|
||||
robots_access: CounterEnum("result", enum { allow, deny }) = .{},
|
||||
robots_evictions: Counter = .{},
|
||||
cors_check: CounterEnum("result", enum { same_origin, no_cors, simple, preflight }) = .{},
|
||||
cors_check: CounterEnum("result", enum { same_origin, no_cors, simple, preflight, cached }) = .{},
|
||||
cors_preflight: CounterEnum("result", enum { allowed, blocked }) = .{},
|
||||
cors_response: CounterEnum("result", enum { allowed, blocked }) = .{},
|
||||
adblock_verdicts: CounterEnum("verdict", @import("network/adblock/AdBlocker.zig").Verdict) = .{},
|
||||
|
||||
@@ -190,3 +190,20 @@ test "NodeRegistry: resetFrame" {
|
||||
try testing.expectEqual(rb, registry.lookup_by_id.get(rb.id).?);
|
||||
try testing.expectEqual(b_node, registry.lookup_by_node.get(b_node).?.dom);
|
||||
}
|
||||
|
||||
test "NodeRegistry: reset never reuses an id" {
|
||||
var registry = NodeRegistry.init(testing.allocator);
|
||||
defer registry.deinit();
|
||||
|
||||
var page = try testing.pageTest("cdp/registry1.html", .{});
|
||||
defer page.close();
|
||||
|
||||
const frame = page.frame().?;
|
||||
const dom_node = (try frame.window._document.querySelector(.wrap("#a1"), frame)).?.asNode();
|
||||
// The pool recycles the `Node` itself, so keep the id, not the pointer.
|
||||
const first_id = (try registry.register(dom_node)).id;
|
||||
|
||||
registry.reset();
|
||||
try testing.expectEqual(null, registry.lookup_by_id.get(first_id));
|
||||
try testing.expect((try registry.register(dom_node)).id != first_id);
|
||||
}
|
||||
+102
-53
@@ -66,8 +66,10 @@ pub fn init(arena: std.mem.Allocator, node: *Node, registry: *NodeRegistry, fram
|
||||
};
|
||||
}
|
||||
|
||||
pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}!void {
|
||||
var visitor = JsonVisitor{ .jw = jw, .tree = self };
|
||||
/// Walk the pruned tree with `visitor`: `visit(*Node, *NodeData) !bool`
|
||||
/// returns whether to descend into the children, `leave() !void` closes a
|
||||
/// visited node.
|
||||
fn visitAll(self: @This(), visitor: anytype) error{WriteFailed}!void {
|
||||
var xpath_buffer: std.ArrayList(u8) = .empty;
|
||||
const listener_targets = interactive.buildListenerTargetMap(self.frame, self.arena) catch |err| {
|
||||
log.err(.app, "listener map failed", .{ .err = err });
|
||||
@@ -79,29 +81,20 @@ pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}!
|
||||
.listener_targets = listener_targets,
|
||||
.label_index = &label_index,
|
||||
};
|
||||
self.walk(&ctx, self.dom_node, null, &visitor, 1, 0) catch |err| {
|
||||
log.err(.app, "semantic tree json dump failed", .{ .err = err });
|
||||
self.walk(&ctx, visitor) catch |err| {
|
||||
log.err(.app, "semantic tree walk failed", .{ .err = err });
|
||||
return error.WriteFailed;
|
||||
};
|
||||
}
|
||||
|
||||
pub fn jsonStringify(self: @This(), jw: *std.json.Stringify) error{WriteFailed}!void {
|
||||
var visitor = JsonVisitor{ .jw = jw, .tree = self };
|
||||
return self.visitAll(&visitor);
|
||||
}
|
||||
|
||||
pub fn textStringify(self: @This(), writer: *std.Io.Writer) error{WriteFailed}!void {
|
||||
var visitor = TextVisitor{ .writer = writer, .tree = self, .depth = 0 };
|
||||
var xpath_buffer: std.ArrayList(u8) = .empty;
|
||||
const listener_targets = interactive.buildListenerTargetMap(self.frame, self.arena) catch |err| {
|
||||
log.err(.app, "listener map failed", .{ .err = err });
|
||||
return error.WriteFailed;
|
||||
};
|
||||
var label_index: Label.LabelByForIndex = .{};
|
||||
var ctx: WalkContext = .{
|
||||
.xpath_buffer = &xpath_buffer,
|
||||
.listener_targets = listener_targets,
|
||||
.label_index = &label_index,
|
||||
};
|
||||
self.walk(&ctx, self.dom_node, null, &visitor, 1, 0) catch |err| {
|
||||
log.err(.app, "semantic tree text dump failed", .{ .err = err });
|
||||
return error.WriteFailed;
|
||||
};
|
||||
return self.visitAll(&visitor);
|
||||
}
|
||||
|
||||
const OptionData = struct {
|
||||
@@ -130,15 +123,60 @@ const WalkContext = struct {
|
||||
label_index: *Label.LabelByForIndex,
|
||||
};
|
||||
|
||||
fn walk(
|
||||
// A node whose children are still being walked
|
||||
const Open = struct {
|
||||
next_child: ?*Node,
|
||||
// for the children's xpath index
|
||||
tag_counts: std.StringArrayHashMapUnmanaged(usize) = .empty,
|
||||
name: ?[]const u8, // The children's parent_name
|
||||
xpath_len: usize,
|
||||
visited: bool,
|
||||
};
|
||||
|
||||
fn walk(self: @This(), ctx: *WalkContext, visitor: anytype) !void {
|
||||
var stack: std.ArrayList(Open) = .empty;
|
||||
defer stack.deinit(self.arena);
|
||||
|
||||
try self.visitNode(ctx, &stack, self.dom_node, null, visitor, 1);
|
||||
while (stack.items.len > 0) {
|
||||
// Everything read from `top` is read before visitNode, which can grow (move) the stack.
|
||||
const top = &stack.items[stack.items.len - 1];
|
||||
if (top.next_child) |child| {
|
||||
top.next_child = child._next;
|
||||
|
||||
var tag: []const u8 = "text()";
|
||||
if (child.is(Element)) |el| {
|
||||
tag = el.getTagNameLower();
|
||||
}
|
||||
const gop = try top.tag_counts.getOrPut(self.arena, tag);
|
||||
if (!gop.found_existing) {
|
||||
gop.value_ptr.* = 0;
|
||||
}
|
||||
gop.value_ptr.* += 1;
|
||||
|
||||
try self.visitNode(ctx, &stack, child, top.name, visitor, gop.value_ptr.*);
|
||||
continue;
|
||||
}
|
||||
|
||||
const done = stack.pop().?;
|
||||
if (done.visited) {
|
||||
try visitor.leave();
|
||||
}
|
||||
ctx.xpath_buffer.shrinkRetainingCapacity(done.xpath_len);
|
||||
}
|
||||
}
|
||||
|
||||
// Every ancestor of `node` below the root is open, so the stack's length is its depth.
|
||||
fn visitNode(
|
||||
self: @This(),
|
||||
ctx: *WalkContext,
|
||||
stack: *std.ArrayList(Open),
|
||||
node: *Node,
|
||||
parent_name: ?[]const u8,
|
||||
visitor: anytype,
|
||||
index: usize,
|
||||
current_depth: u32,
|
||||
) !void {
|
||||
const current_depth = stack.items.len;
|
||||
if (current_depth > self.max_depth) return;
|
||||
|
||||
// 1. Skip non-content nodes
|
||||
@@ -216,8 +254,6 @@ fn walk(
|
||||
try appendXPathSegment(node, ctx.xpath_buffer, self.arena, index);
|
||||
const xpath = ctx.xpath_buffer.items;
|
||||
|
||||
var name = try axn.getName(self.frame, self.arena, ctx.label_index);
|
||||
|
||||
const has_explicit_label = if (node.is(Element)) |el|
|
||||
el.getAttributeInterned("aria-label") != null or el.getAttributeInterned("title") != null
|
||||
else
|
||||
@@ -225,12 +261,14 @@ fn walk(
|
||||
|
||||
const structural = isStructuralRole(role);
|
||||
|
||||
// Filter out computed concatenated names for generic containers without explicit labels.
|
||||
// No computed concatenated names for generic containers without explicit labels.
|
||||
// This prevents token bloat and ensures their StaticText children aren't incorrectly pruned.
|
||||
// We ignore interactivity because a generic wrapper with an event listener still shouldn't hoist all text.
|
||||
if (name != null and structural and !has_explicit_label) {
|
||||
name = null;
|
||||
}
|
||||
// Not computing it also keeps a deep chain of containers from being O(depth²).
|
||||
const name = if (structural and !has_explicit_label)
|
||||
null
|
||||
else
|
||||
try axn.getName(self.frame, self.arena, ctx.label_index);
|
||||
|
||||
var should_visit = true;
|
||||
if (self.interactive_only) {
|
||||
@@ -285,32 +323,12 @@ fn walk(
|
||||
did_visit = false;
|
||||
}
|
||||
|
||||
if (should_walk_children) {
|
||||
// If we are printing this node normally OR skipping it and unrolling its children,
|
||||
// we walk the children iterator.
|
||||
var it = node.childrenIterator();
|
||||
var tag_counts: std.StringArrayHashMapUnmanaged(usize) = .empty;
|
||||
while (it.next()) |child| {
|
||||
var tag: []const u8 = "text()";
|
||||
if (child.is(Element)) |el| {
|
||||
tag = el.getTagNameLower();
|
||||
}
|
||||
|
||||
const gop = try tag_counts.getOrPut(self.arena, tag);
|
||||
if (!gop.found_existing) {
|
||||
gop.value_ptr.* = 0;
|
||||
}
|
||||
gop.value_ptr.* += 1;
|
||||
|
||||
try self.walk(ctx, child, name, visitor, gop.value_ptr.*, current_depth + 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (did_visit) {
|
||||
try visitor.leave();
|
||||
}
|
||||
|
||||
ctx.xpath_buffer.shrinkRetainingCapacity(initial_xpath_len);
|
||||
try stack.append(self.arena, .{
|
||||
.next_child = if (should_walk_children) node._first_child else null,
|
||||
.name = name,
|
||||
.xpath_len = initial_xpath_len,
|
||||
.visited = did_visit,
|
||||
});
|
||||
}
|
||||
|
||||
fn extractSelectOptions(node: *Node, frame: *Frame, arena: std.mem.Allocator) ![]OptionData {
|
||||
@@ -787,3 +805,34 @@ test "SemanticTree max_depth" {
|
||||
|
||||
try testing.expect(std.mem.indexOf(u8, text_str, "other") == null);
|
||||
}
|
||||
|
||||
test "SemanticTree: deep nesting doesn't overflow the native stack" {
|
||||
var registry: NodeRegistry = .init(testing.allocator);
|
||||
defer registry.deinit();
|
||||
|
||||
const frame = try testing.createFrame();
|
||||
defer testing.test_session.closeAllPages();
|
||||
|
||||
// The link's name comes from its content: the whole chain. The <g>s are
|
||||
// pruned, so the JSON only nests link > text. SVG, as an HTML element's
|
||||
// pointer-events lookup walks its ancestors: O(depth²).
|
||||
const depth = 50_000;
|
||||
const doc = frame.window._document;
|
||||
var top = try doc.createTextNode("deep");
|
||||
for (0..depth) |_| {
|
||||
const parent = (try doc.createElementNS("http://www.w3.org/2000/svg", "g", frame)).asNode();
|
||||
_ = try parent.appendChild(top, frame);
|
||||
top = parent;
|
||||
}
|
||||
const link = try doc.createElement("a", null, frame);
|
||||
try link.setAttribute(.wrap("href"), .wrap("#"), frame);
|
||||
_ = try link.asNode().appendChild(top, frame);
|
||||
|
||||
const st: Self = try .init(testing.arena_allocator, link.asNode(), ®istry, frame, .{});
|
||||
const json_str = try std.json.Stringify.valueAlloc(testing.allocator, st, .{});
|
||||
defer testing.allocator.free(json_str);
|
||||
|
||||
try testing.expect(std.mem.indexOf(u8, json_str, "\"role\":\"link\",\"name\":\"deep\"") != null);
|
||||
try testing.expectEqual(depth, std.mem.count(u8, json_str, "/g[1]"));
|
||||
try testing.expect(std.mem.endsWith(u8, json_str, "/text()[1]\",\"nodeType\":3,\"nodeValue\":\"deep\",\"children\":[]}]}"));
|
||||
}
|
||||
+89
-8
@@ -155,6 +155,9 @@ model: []u8,
|
||||
/// Per-turn reasoning budget for LLM turns. Mutable at runtime via `/effort`.
|
||||
effort: Config.Effort,
|
||||
script_file: ?[]const u8,
|
||||
/// `--url`: opened before the first turn, so a `--task` run does not spend a
|
||||
/// model turn navigating to its own start page.
|
||||
start_url: ?[:0]const u8,
|
||||
one_shot_task: ?[]const u8,
|
||||
one_shot_save: ?[]const u8,
|
||||
one_shot_attachments: ?[]const []const u8,
|
||||
@@ -163,6 +166,10 @@ cancel_requested: std.atomic.Value(bool) = .init(false),
|
||||
/// mid-request instead of blocking until the model's full response arrives.
|
||||
http_interrupt: zenai.http.Interrupt = .{},
|
||||
synthetic_tool_call_id: u32 = 0,
|
||||
/// Per-turn CSS selector for each tool call the model made, in call order, so
|
||||
/// `--save` can record a call that addressed its element by `backendNodeId`.
|
||||
save_selectors: std.ArrayListUnmanaged(?[]const u8) = .empty,
|
||||
capturing_for_save: bool = false,
|
||||
/// Aggregate Anthropic/OpenAI/Gemini token usage across every model call.
|
||||
/// Printed as a structured `$usage ...` line on stderr at the end of `--task`
|
||||
/// (one-shot) mode so wrappers can capture per-task cost.
|
||||
@@ -280,7 +287,14 @@ pub fn init(allocator: std.mem.Allocator, app: *App, opts: Config.Agent) !*Agent
|
||||
const effort = settings.resolveEffort(opts, remembered, will_repl, if (resolved) |r| r.credential.provider else null);
|
||||
const verbosity = settings.resolveVerbosity(opts, remembered);
|
||||
const stream_enabled = settings.resolveStream(remembered);
|
||||
browser_tools.search_engine = settings.resolveSearchEngine(remembered);
|
||||
browser_tools.search_engine = opts.search_engine orelse settings.resolveSearchEngine(remembered);
|
||||
// A keyless engine over its cap fails every search; silence reads as a bad
|
||||
// agent rather than a missing key.
|
||||
if (browser_tools.searchKeyStatus(browser_tools.search_engine)) |key| switch (key.state) {
|
||||
.set => {},
|
||||
.keyless => log.info(.app, "keyless search endpoint", .{ .env_var = key.env_var, .limit = "rate-limited per client IP" }),
|
||||
.missing => log.warn(.app, "search key missing", .{ .env_var = key.env_var, .engine = @tagName(browser_tools.search_engine) }),
|
||||
};
|
||||
|
||||
if (resolved) |r| {
|
||||
if (r.source == .picked) {
|
||||
@@ -316,6 +330,7 @@ pub fn init(allocator: std.mem.Allocator, app: *App, opts: Config.Agent) !*Agent
|
||||
.effort = effort,
|
||||
.stream_enabled = stream_enabled,
|
||||
.script_file = opts.script_file,
|
||||
.start_url = opts.url,
|
||||
.one_shot_task = opts.task,
|
||||
.one_shot_save = opts.save,
|
||||
.one_shot_attachments = if (opts.attach.items.len == 0) null else opts.attach.items,
|
||||
@@ -351,6 +366,7 @@ pub fn init(allocator: std.mem.Allocator, app: *App, opts: Config.Agent) !*Agent
|
||||
pub fn deinit(self: *Agent) void {
|
||||
self.terminal.uninstallLogSink();
|
||||
self.save_buffer.deinit();
|
||||
self.save_selectors.deinit(self.allocator);
|
||||
if (self.save_path) |p| self.allocator.free(p);
|
||||
self.terminal.deinit();
|
||||
self.conversation.deinit();
|
||||
@@ -495,6 +511,9 @@ const TurnInput = struct {
|
||||
|
||||
/// Returns true on success.
|
||||
pub fn run(self: *Agent) bool {
|
||||
if (self.start_url) |url| {
|
||||
if (!self.gotoStart(url)) return false;
|
||||
}
|
||||
if (self.one_shot_task) |task| {
|
||||
const saving = self.one_shot_save != null;
|
||||
const ok = self.runTurn(.{
|
||||
@@ -517,6 +536,29 @@ pub fn run(self: *Agent) bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Opens `--url` through the tool layer, so a bad URL fails like any other
|
||||
/// tool call and `/save` replays the opening navigation.
|
||||
fn gotoStart(self: *Agent, url: [:0]const u8) bool {
|
||||
var arena: std.heap.ArenaAllocator = .init(self.allocator);
|
||||
defer arena.deinit();
|
||||
const a = arena.allocator();
|
||||
|
||||
var object: std.json.ObjectMap = .empty;
|
||||
object.put(a, "url", .{ .string = url }) catch return false;
|
||||
const args: std.json.Value = .{ .object = object };
|
||||
const result = browser_tools.call(a, self.ts.session, &self.ts.registry, "goto", args, .{}) catch |err| {
|
||||
self.terminal.printError("could not open {s}: {s}", .{ url, browser_tools.errorMessage(err) });
|
||||
return false;
|
||||
};
|
||||
// `call` reports a failed navigation in-band, not as an error.
|
||||
if (result.is_error) {
|
||||
self.terminal.printError("could not open {s}: {s}", .{ url, result.text });
|
||||
return false;
|
||||
}
|
||||
self.recordSaveCommand(Command.fromToolCall(.goto, args));
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Print single-line cumulative token usage to stderr, so wrappers driving
|
||||
/// `lightpanda agent --task ...` can capture per-task cost by `grep`-ing the
|
||||
/// `$usage` prefix. Stable key=value format:
|
||||
@@ -667,7 +709,8 @@ fn runRepl(self: *Agent) void {
|
||||
self.terminal.endTool();
|
||||
self.printCommandResult(tc, result);
|
||||
if (!result.is_error) {
|
||||
self.recordSaveCommand(navigationGoto(aa, tc.tool, tc.args) orelse cmd);
|
||||
const replayable = Command.fromToolCall(tc.tool, withSelector(aa, tc.args, result.selector));
|
||||
self.recordSaveCommand(navigationGoto(aa, tc.tool, tc.args) orelse replayable);
|
||||
}
|
||||
self.recordSlashToolCall(command_text, tc.name(), tc.args, result) catch |err| {
|
||||
self.terminal.printWarning("LLM conversation out of sync (/{s}: {s}); next prompt may not see this action", .{ tc.name(), @errorName(err) });
|
||||
@@ -1267,6 +1310,12 @@ fn synthesizeSaveTo(self: *Agent, arena: std.mem.Allocator, path: []const u8, mo
|
||||
return;
|
||||
}
|
||||
|
||||
// `stripCodeFence` accepts an unclosed block, so a truncated script is
|
||||
// indistinguishable from a complete one once it is on disk.
|
||||
if (result.finish_reason == .max_tokens) {
|
||||
return self.abortSave(baseline, "the model ran out of output tokens mid-script");
|
||||
}
|
||||
|
||||
const raw = result.text orelse return self.abortSave(baseline, "the model returned no script");
|
||||
|
||||
// `result.text` lives in the conversation arena, freed by the rollback
|
||||
@@ -1324,6 +1373,20 @@ fn logSaveBufferError(self: *Agent, err: anyerror) void {
|
||||
self.terminal.printError("save buffer disabled: {s}", .{@errorName(err)});
|
||||
}
|
||||
|
||||
/// Swap a call's ephemeral `backendNodeId` for the selector the tool layer
|
||||
/// resolved, so the call can be replayed.
|
||||
fn withSelector(arena: std.mem.Allocator, args: ?std.json.Value, selector: ?[]const u8) ?std.json.Value {
|
||||
const sel = selector orelse return args;
|
||||
const original = args orelse return args;
|
||||
if (original != .object) return args;
|
||||
if (!original.object.contains("backendNodeId")) return args;
|
||||
|
||||
var rewritten = original.object.clone(arena) catch return args;
|
||||
_ = rewritten.swapRemove("backendNodeId");
|
||||
rewritten.put(arena, "selector", .{ .string = sel }) catch return args;
|
||||
return .{ .object = rewritten };
|
||||
}
|
||||
|
||||
fn recordSaveCommand(self: *Agent, cmd: Command) void {
|
||||
self.save_buffer.record(cmd) catch |err| self.logSaveBufferError(err);
|
||||
}
|
||||
@@ -1440,7 +1503,7 @@ fn printSlashHelp(self: *Agent, arena: std.mem.Allocator, target: []const u8) vo
|
||||
|
||||
fn runCommand(self: *Agent, arena: std.mem.Allocator, tc: Command.ToolCall) browser_tools.ToolResult {
|
||||
// The terminal can't show an image, but the conversation can.
|
||||
return browser_tools.call(arena, self.ts.session, &self.ts.registry, tc.name(), tc.args, .{ .inline_image = self.ai_client != null }) catch |err| .{
|
||||
return browser_tools.call(arena, self.ts.session, &self.ts.registry, tc.name(), tc.args, .{ .inline_image = self.ai_client != null, .record = true }) catch |err| .{
|
||||
.text = switch (err) {
|
||||
error.OutOfMemory => "out of memory",
|
||||
error.FrameNotLoaded => "no page loaded — run /goto <url> first",
|
||||
@@ -1667,6 +1730,10 @@ fn processUserMessage(self: *Agent, input: TurnInput) !?[]const u8 {
|
||||
const provider_client = self.ai_client orelse return error.NoAiClient;
|
||||
self.refreshAuthIfNeeded();
|
||||
|
||||
self.capturing_for_save = input.capture_for_save;
|
||||
defer self.capturing_for_save = false;
|
||||
self.save_selectors.clearRetainingCapacity();
|
||||
|
||||
self.terminal.spinner.start();
|
||||
var result = provider_client.runTools(
|
||||
self.model,
|
||||
@@ -1727,11 +1794,12 @@ fn processUserMessage(self: *Agent, input: TurnInput) !?[]const u8 {
|
||||
const args = browser_tools.normalizeArgKeys(ca, tool, tc.arguments) catch tc.arguments;
|
||||
// Fall back to the navigation a read tool performed, so a
|
||||
// markdown/tree-driven turn isn't lost from `/save`.
|
||||
const cmd = Command.fromToolCall(tool, args);
|
||||
const replayable = withSelector(ca, args, if (i < self.save_selectors.items.len) self.save_selectors.items[i] else null);
|
||||
const cmd = Command.fromToolCall(tool, replayable);
|
||||
const to_record = if (cmd.isRecorded())
|
||||
cmd
|
||||
else
|
||||
navigationGoto(ca, tool, args) orelse continue;
|
||||
navigationGoto(ca, tool, replayable) orelse continue;
|
||||
if (!recorded_any) {
|
||||
if (input.record_comment) |c| self.recordSaveComment(c);
|
||||
recorded_any = true;
|
||||
@@ -1884,10 +1952,19 @@ fn handleToolCall(ctx: *anyopaque, allocator: std.mem.Allocator, tool_name: []co
|
||||
self.terminal.spinner.setTool(tool_name, args_str);
|
||||
defer self.terminal.spinner.setThinking();
|
||||
|
||||
const outcome = self.toolOutcome(allocator, tool_name, arguments) catch |err| zenai.provider.Client.ToolHandler.Result{
|
||||
var selector: ?[]const u8 = null;
|
||||
const outcome = self.toolOutcome(allocator, tool_name, arguments, &selector) catch |err| zenai.provider.Client.ToolHandler.Result{
|
||||
.content = std.fmt.allocPrint(allocator, "Error: {s}", .{browser_tools.errorMessage(err)}) catch "Error: tool execution failed",
|
||||
.is_error = true,
|
||||
};
|
||||
if (self.capturing_for_save) {
|
||||
// One entry per call, errors included, so the index lines up with
|
||||
// `RunToolsResult.tool_calls_made`. The conversation arena outlives the
|
||||
// turn that reads them; `allocator` here is zenai's per-call arena.
|
||||
const ca = self.conversation.arena.allocator();
|
||||
const kept = if (selector) |sel| ca.dupe(u8, sel) catch null else null;
|
||||
self.save_selectors.append(self.allocator, kept) catch {};
|
||||
}
|
||||
|
||||
self.terminal.agentToolDone(tool_name, args_str, !outcome.is_error);
|
||||
if (self.terminal.verbosity == .high) self.terminal.printToolOutcome(tool_name, outcome.content, outcome.is_error);
|
||||
@@ -1895,8 +1972,12 @@ fn handleToolCall(ctx: *anyopaque, allocator: std.mem.Allocator, tool_name: []co
|
||||
}
|
||||
|
||||
/// The text plus the rendered PNG, for backends that can show the model an image.
|
||||
fn toolOutcome(self: *Agent, allocator: std.mem.Allocator, tool_name: []const u8, arguments: ?std.json.Value) browser_tools.ToolError!zenai.provider.Client.ToolHandler.Result {
|
||||
const result = try browser_tools.call(allocator, self.ts.session, &self.ts.registry, tool_name, arguments, .{ .inline_image = true });
|
||||
fn toolOutcome(self: *Agent, allocator: std.mem.Allocator, tool_name: []const u8, arguments: ?std.json.Value, selector: *?[]const u8) browser_tools.ToolError!zenai.provider.Client.ToolHandler.Result {
|
||||
const result = try browser_tools.call(allocator, self.ts.session, &self.ts.registry, tool_name, arguments, .{
|
||||
.inline_image = true,
|
||||
.record = self.capturing_for_save,
|
||||
});
|
||||
selector.* = result.selector;
|
||||
const content = capToolOutput(allocator, tool_name, result.text);
|
||||
return .{
|
||||
.content = content,
|
||||
|
||||
@@ -369,8 +369,8 @@ pub fn resolveStream(remembered: ?Remembered) bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Precedence: remembered `.lp-agent.zon` value > default (auto). No CLI
|
||||
/// flag — the REPL `/searchEngine` command sets and persists it.
|
||||
/// Precedence: `--search-engine` > remembered `.lp-agent.zon` value >
|
||||
/// default (auto). The REPL `/searchEngine` command also sets and persists it.
|
||||
pub fn resolveSearchEngine(remembered: ?Remembered) lp.tools.SearchEngine {
|
||||
if (remembered) |r| if (r.search_engine) |e| return e;
|
||||
return .auto;
|
||||
|
||||
@@ -199,7 +199,7 @@ fn waitForPreload(self: *ScriptManager, url: [:0]const u8) ?*Script {
|
||||
_ = client.tickSync(200) catch return null;
|
||||
continue;
|
||||
},
|
||||
.done => |script| {
|
||||
.done, .failed => |script| {
|
||||
// Preload scripts are single-use. We return it and it becomes
|
||||
// the caller's responsibility to free.
|
||||
_ = self.preloaded_scripts.remove(url);
|
||||
@@ -318,7 +318,7 @@ pub fn addFromElement(self: *ScriptManager, comptime from_parser: bool, script_e
|
||||
if (mode != .normal) {
|
||||
var preloaded = self.takePreload(remote_url);
|
||||
if (preloaded == null and kind == .module) {
|
||||
preloaded = self.base.takeModuleHint(remote_url);
|
||||
preloaded = try self.base.takeModuleHint(remote_url);
|
||||
}
|
||||
if (preloaded) |pre| {
|
||||
if (comptime lp.IS_DEBUG) {
|
||||
@@ -545,6 +545,7 @@ const PreloadedScript = struct {
|
||||
const State = union(enum) {
|
||||
loading: *Script,
|
||||
done: *Script,
|
||||
failed: *Script,
|
||||
};
|
||||
|
||||
pub fn deinit(self: PreloadedScript) void {
|
||||
@@ -583,10 +584,12 @@ const PreloadedScript = struct {
|
||||
log.warn(.http, "script fetch error", .{ .err = err, .req = script.url, .extra = "preload", .status = script.status });
|
||||
}
|
||||
|
||||
script.status = 0; // status == 0 is correctly treated as an error throughout
|
||||
script.complete = true;
|
||||
|
||||
const self: *ScriptManager = @fieldParentPtr("base", script.manager);
|
||||
_ = self.preloaded_scripts.remove(script.url);
|
||||
self.preloaded_scripts.getPtr(script.url).?.state = .{ .failed = script };
|
||||
script.queueHintEvent(.@"error");
|
||||
script.deinit();
|
||||
}
|
||||
|
||||
// Owner-driven teardown killed this preload fetch via Transfer.kill, which
|
||||
@@ -726,6 +729,52 @@ test "ScriptManager: preload whose submit fails synchronously releases its arena
|
||||
const url = "http://127.0.0.1:9582/fails-at-submit.js";
|
||||
// A fetch was started (and failed), so the hint's error event fires.
|
||||
try testing.expectEqual(true, try sm.preloadScript(null, url));
|
||||
// errorCallback consumed the entry; nothing dangles in the map.
|
||||
try testing.expectEqual(false, sm.preloaded_scripts.contains(url));
|
||||
// The failed entry stays for a <script> to consume; reset() frees it.
|
||||
try testing.expect(sm.preloaded_scripts.getPtr(url).?.state == .failed);
|
||||
}
|
||||
|
||||
// A failed preload used to be dropped, so the <script> consuming it fetched
|
||||
// again: a blocked script logged "blocked url" and counted in
|
||||
// adblock_verdicts twice. Unblocking before the <script>s and import() run
|
||||
// makes a refetch observable: it would succeed and run the script.
|
||||
test "ScriptManager: a failed preload is consumed, not refetched" {
|
||||
const client = &testing.test_session.browser.http_client;
|
||||
try client.setBlockedUrls(&.{ "*/preload_failed.js", "*/preload_failed_module.js" });
|
||||
defer client.setBlockedUrls(&.{}) catch unreachable;
|
||||
|
||||
// Both hints' fetch errors, and nothing else.
|
||||
testing.expectLog(&.{ .http, .http });
|
||||
|
||||
const page = try testing.pageTest("fixtures/preload_failed.html", .{});
|
||||
defer page.close();
|
||||
try client.setBlockedUrls(&.{});
|
||||
|
||||
{
|
||||
const frame = page.frame().?;
|
||||
var ls: js.Local.Scope = undefined;
|
||||
frame.js.localScope(&ls);
|
||||
defer ls.deinit();
|
||||
|
||||
try ls.local.eval(
|
||||
\\const classic = document.createElement('script');
|
||||
\\classic.src = 'preload_failed.js';
|
||||
\\classic.onerror = () => window.classic_error = true;
|
||||
\\document.head.appendChild(classic);
|
||||
\\const module = document.createElement('script');
|
||||
\\module.type = 'module';
|
||||
\\module.src = 'preload_failed_module.js';
|
||||
\\module.onerror = () => window.module_error = true;
|
||||
\\document.head.appendChild(module);
|
||||
\\const dynamic = document.createElement('script');
|
||||
\\dynamic.textContent = "import('./preload_failed_module.js').catch(() => window.import_error = true);";
|
||||
\\document.head.appendChild(dynamic);
|
||||
, null);
|
||||
}
|
||||
|
||||
var runner = testing.test_session.runner(.{});
|
||||
try runner.waitForScript(page.frame_id,
|
||||
\\window.classic_hint_error && window.module_hint_error &&
|
||||
\\window.classic_error && window.module_error && window.import_error &&
|
||||
\\!window.failed_classic_ran && !window.failed_module_ran
|
||||
, 2000);
|
||||
}
|
||||
@@ -253,8 +253,14 @@ pub fn preloadModuleHint(self: *ScriptManagerBase, element: ?*Element.Html, url:
|
||||
|
||||
// A <script type=module src=...> whose URL was hinted (modulepreload link or
|
||||
// prescan)
|
||||
pub fn takeModuleHint(self: *ScriptManagerBase, url: [:0]const u8) ?*Script {
|
||||
pub fn takeModuleHint(self: *ScriptManagerBase, url: [:0]const u8) !?*Script {
|
||||
const entry = self.imported_modules.getEntry(url) orelse return null;
|
||||
if (entry.value_ptr.state == .err) {
|
||||
// for loading/done, we'll remove the entry (because the script will
|
||||
// get consumed). For err, we can keep the failure in the map to
|
||||
// prevent a 2nd loader from needlessly trying to load this script
|
||||
return try self.failedScript(url, .import);
|
||||
}
|
||||
if (entry.value_ptr.hint == false) {
|
||||
// The script was preloaded, but not because of a hint. It came from v8
|
||||
// telling us to preload the module. We cannot take it here because we know
|
||||
@@ -268,15 +274,31 @@ pub fn takeModuleHint(self: *ScriptManagerBase, url: [:0]const u8) ?*Script {
|
||||
break :blk script;
|
||||
},
|
||||
.done => |script| script,
|
||||
// The hint's fetch failed; give the script its own attempt.
|
||||
// I'm not sure if this is the right behavior. Why would a preload fail
|
||||
// but the "real" load work? But it's definetly safer.
|
||||
.err => return null,
|
||||
.err => unreachable, // handled above
|
||||
};
|
||||
self.imported_modules.removeByPtr(entry.key_ptr);
|
||||
return script;
|
||||
}
|
||||
|
||||
// A dummy script for a module whose fetch already failed, to trigger the
|
||||
// consumer's failure path (Script.eval fails on status == 0)
|
||||
fn failedScript(self: *ScriptManagerBase, url: [:0]const u8, extra: Script.Extra) !*Script {
|
||||
const arena = try self.acquireArena(.tiny, "SM.failedScript");
|
||||
errdefer arena.release();
|
||||
const script = try arena.create(Script);
|
||||
script.* = .{
|
||||
.arena = arena,
|
||||
.url = url,
|
||||
.status = 0,
|
||||
.node = .{},
|
||||
.manager = self,
|
||||
.complete = true,
|
||||
.source = .{ .remote = .empty },
|
||||
.extra = extra,
|
||||
};
|
||||
return script;
|
||||
}
|
||||
|
||||
pub fn waitForImport(self: *ScriptManagerBase, url: [:0]const u8) !ModuleSource {
|
||||
const was_evaluating = self.is_evaluating;
|
||||
self.is_evaluating = true;
|
||||
@@ -354,6 +376,12 @@ pub fn releaseImport(self: *ScriptManagerBase, url: [:0]const u8) void {
|
||||
pub fn getAsyncImport(self: *ScriptManagerBase, url: [:0]const u8, cb: ImportAsync.Callback, cb_data: *anyopaque, referrer: []const u8) !void {
|
||||
// A <link rel=modulepreload> hint may already be fetching/fetched this module
|
||||
if (self.imported_modules.getEntry(url)) |entry| {
|
||||
if (entry.value_ptr.state == .err) {
|
||||
const script = try self.failedScript(url, .{ .import_async = .{ .callback = cb, .data = cb_data } });
|
||||
self.ready_scripts.append(&script.node);
|
||||
self.evaluate();
|
||||
return;
|
||||
}
|
||||
if (entry.value_ptr.hint) {
|
||||
switch (entry.value_ptr.state) {
|
||||
.loading => |script| {
|
||||
@@ -381,8 +409,7 @@ pub fn getAsyncImport(self: *ScriptManagerBase, url: [:0]const u8, cb: ImportAsy
|
||||
self.evaluate();
|
||||
return;
|
||||
},
|
||||
// The hint's fetch failed; give the import its own attempt.
|
||||
.err => {},
|
||||
.err => unreachable, // handled above
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -852,6 +879,12 @@ pub const Script = struct {
|
||||
return;
|
||||
}
|
||||
|
||||
if (self.source == .remote and (self.status < 200 or self.status > 299)) {
|
||||
// An adopted preload / module hint that had already failed.
|
||||
self.executeCallback(comptime .wrap("error"));
|
||||
return;
|
||||
}
|
||||
|
||||
const previous_script = frame.document._current_script;
|
||||
frame.document._current_script = fe.script_element;
|
||||
defer frame.document._current_script = previous_script;
|
||||
|
||||
+485
-319
File diff suppressed because it is too large.
Load diff
@@ -16,12 +16,15 @@
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
const std = @import("std");
|
||||
|
||||
const Frame = @import("../Frame.zig");
|
||||
const Parser = @import("../parser/Parser.zig");
|
||||
|
||||
const Node = @import("../webapi/Node.zig");
|
||||
const Element = @import("../webapi/Element.zig");
|
||||
const Document = @import("../webapi/Document.zig");
|
||||
const HTMLDocument = @import("../webapi/HTMLDocument.zig");
|
||||
const ShadowRoot = @import("../webapi/ShadowRoot.zig");
|
||||
const slotting = @import("../webapi/element/slotting.zig");
|
||||
|
||||
@@ -101,6 +104,44 @@ pub fn fragment(frame: *Frame, node: *Node, html: []const u8, opts: FragmentPars
|
||||
try Element.Html.Picture.childrenInserted(node, frame);
|
||||
}
|
||||
|
||||
pub const HtmlDocumentOpts = struct {
|
||||
allow_declarative_shadow: bool = false,
|
||||
};
|
||||
|
||||
// Build a detached HTMLDocument from `html` (DOMParser.parseFromString and
|
||||
// Document.parseHTML). The caller sets its URL.
|
||||
pub fn htmlDocument(frame: *Frame, html: []const u8, opts: HtmlDocumentOpts) !*HTMLDocument {
|
||||
const arena = try frame.getArena(.medium, "parse.htmlDocument");
|
||||
defer arena.release();
|
||||
|
||||
// Frame-side hooks triggered from `Build.created` / `nodeIsReady`
|
||||
// (external stylesheet fetches, script execution, mutation-observer
|
||||
// fan-out, default-script injection) treat the parsed nodes as detached
|
||||
// and skip side effects on the live document.
|
||||
const previous_parse_mode = frame._parse_mode;
|
||||
frame._parse_mode = .fragment;
|
||||
defer frame._parse_mode = previous_parse_mode;
|
||||
|
||||
const doc = try frame._factory.document(HTMLDocument{ ._proto = undefined });
|
||||
|
||||
var normalized = std.mem.trim(u8, html, &std.ascii.whitespace);
|
||||
if (normalized.len == 0) {
|
||||
normalized = "<html></html>";
|
||||
}
|
||||
|
||||
var parser = Parser.init(arena.allocator(), doc.asNode(), frame, .{
|
||||
.allow_declarative_shadow = opts.allow_declarative_shadow,
|
||||
});
|
||||
parser.parse(normalized);
|
||||
if (parser.terminated) {
|
||||
return error.ExecutionTerminated;
|
||||
}
|
||||
if (parser.err) |pe| {
|
||||
return pe.err;
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
|
||||
// Build a detached XMLDocument from `xml` (DOMParser.parseFromString and
|
||||
// XMLHttpRequest.responseXML). Returns null when the input isn't well-formed
|
||||
// XML.
|
||||
|
||||
@@ -30,18 +30,17 @@ pub const Options = struct {
|
||||
timezone: ?[:0]const u8 = null,
|
||||
};
|
||||
|
||||
/// ICU reads LC_ALL and TZ lazily on first use, so the environment must be
|
||||
/// set here, before InitializeICU and before the platform starts its thread
|
||||
/// pool (setenv is not safe once other threads may call getenv). ICU
|
||||
/// canonicalizes a BCP 47 tag itself, script subtag included.
|
||||
/// ICU reads TZ lazily on first use, so it must be set here, before
|
||||
/// InitializeICU and before the platform starts its thread pool (setenv is not
|
||||
/// safe once other threads may call getenv). The locale goes to ICU directly:
|
||||
/// a BCP 47 tag in LC_ALL is not a POSIX locale, so it broke setlocale for the
|
||||
/// rest of the process and for every child. ICU canonicalizes the tag itself,
|
||||
/// script subtag included.
|
||||
pub fn init(opts: Options) !Platform {
|
||||
if (opts.v8_flags) |flags| {
|
||||
v8.v8__V8__SetFlagsFromString(flags.ptr, flags.len);
|
||||
}
|
||||
|
||||
if (opts.locale) |tag| {
|
||||
_ = setenv("LC_ALL", tag, 1);
|
||||
}
|
||||
if (opts.timezone) |id| {
|
||||
_ = setenv("TZ", id, 1);
|
||||
}
|
||||
@@ -49,6 +48,9 @@ pub fn init(opts: Options) !Platform {
|
||||
if (v8.v8__V8__InitializeICU() == false) {
|
||||
return error.FailedToInitializeICU;
|
||||
}
|
||||
if (opts.locale) |tag| {
|
||||
if (!v8.v8__V8__SetDefaultLocale(tag)) return error.InvalidLocale;
|
||||
}
|
||||
// 0 - threadpool size, 0 == let v8 decide
|
||||
// 1 - idle_task_support, 1 == enabled
|
||||
const handle = v8.v8__Platform__NewDefaultPlatform(0, 1).?;
|
||||
|
||||
+46
-16
@@ -326,22 +326,18 @@ fn createSnapshotContext(
|
||||
const template_index = comptime bridge.JsApiLookup.getId(JsApi);
|
||||
const func = v8.v8__FunctionTemplate__GetFunction(templates[template_index], context);
|
||||
if (@hasDecl(JsApi.Meta, "name")) {
|
||||
const name = JsApi.Meta.name;
|
||||
const v8_class_name = v8.v8__String__NewFromUtf8(isolate, name.ptr, v8.kNormal, @intCast(name.len));
|
||||
var maybe_result: v8.MaybeBool = undefined;
|
||||
// Web IDL: interface objects on the global are non-enumerable.
|
||||
v8.v8__Object__DefineOwnProperty(global_obj, context, v8_class_name, func, v8.DontEnum, &maybe_result);
|
||||
|
||||
if (@hasDecl(JsApi.Meta, "constructor_alias")) {
|
||||
const alias = JsApi.Meta.constructor_alias;
|
||||
const v8_class_name = v8.v8__String__NewFromUtf8(isolate, alias.ptr, v8.kNormal, @intCast(alias.len));
|
||||
var maybe_result: v8.MaybeBool = undefined;
|
||||
v8.v8__Object__Set(global_obj, context, v8_class_name, func, &maybe_result);
|
||||
|
||||
const name = JsApi.Meta.name;
|
||||
const illegal_class_name = v8.v8__String__NewFromUtf8(isolate, name.ptr, v8.kNormal, @intCast(name.len));
|
||||
var maybe_result2: v8.MaybeBool = undefined;
|
||||
v8.v8__Object__DefineOwnProperty(global_obj, context, illegal_class_name, func, 0, &maybe_result2);
|
||||
} else {
|
||||
const name = JsApi.Meta.name;
|
||||
const v8_class_name = v8.v8__String__NewFromUtf8(isolate, name.ptr, v8.kNormal, @intCast(name.len));
|
||||
var maybe_result: v8.MaybeBool = undefined;
|
||||
// Web IDL: interface objects on the global are non-enumerable.
|
||||
v8.v8__Object__DefineOwnProperty(global_obj, context, v8_class_name, func, v8.DontEnum, &maybe_result);
|
||||
const alias_func = generateLegacyFactoryFunction(JsApi, isolate, templates[template_index], func.?, context.?);
|
||||
const v8_alias_name = v8.v8__String__NewFromUtf8(isolate, alias.ptr, v8.kNormal, @intCast(alias.len));
|
||||
var maybe_alias_result: v8.MaybeBool = undefined;
|
||||
v8.v8__Object__DefineOwnProperty(global_obj, context, v8_alias_name, @ptrCast(alias_func), v8.DontEnum, &maybe_alias_result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -672,7 +668,7 @@ fn illegalConstructorCallback(raw_info: ?*const v8.FunctionCallbackInfo) callcon
|
||||
if (v8.v8__Function__GetName(func)) |name_value| {
|
||||
if (v8.v8__Value__IsString(name_value)) {
|
||||
const str: *const v8.String = @ptrCast(name_value);
|
||||
const n = v8.v8__String__WriteUtf8(str, isolate, &name_buf, name_buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8);
|
||||
const n = v8.v8__String__WriteUtf8(str, isolate, &name_buf, name_buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null);
|
||||
name = name_buf[0..@intCast(n)];
|
||||
}
|
||||
}
|
||||
@@ -721,7 +717,9 @@ fn protoIndexLookup(comptime JsApi: type) ?u16 {
|
||||
// Generate a constructor template for a JsApi type (public for reuse)
|
||||
fn generateConstructor(comptime JsApi: type, isolate: *v8.Isolate) *const v8.FunctionTemplate {
|
||||
const callback, const arity = comptime blk: {
|
||||
if (@hasDecl(JsApi, "constructor")) {
|
||||
// The constructor belongs to the legacy factory function (`Image`),
|
||||
// see generateLegacyFactoryFunction.
|
||||
if (@hasDecl(JsApi, "constructor") and !@hasDecl(JsApi.Meta, "constructor_alias")) {
|
||||
break :blk .{ JsApi.constructor.func, JsApi.constructor.arity };
|
||||
}
|
||||
if (inheritsFromHtmlElement(JsApi)) {
|
||||
@@ -749,6 +747,38 @@ fn generateConstructor(comptime JsApi: type, isolate: *v8.Isolate) *const v8.Fun
|
||||
return template;
|
||||
}
|
||||
|
||||
// https://webidl.spec.whatwg.org/#legacy-factory-functions
|
||||
// `Image`, `Audio`, `Option`: a function distinct from the interface object
|
||||
// (so `new HTMLImageElement()` stays illegal and `Image.name` is "Image"),
|
||||
// whose `prototype` is the interface's prototype object.
|
||||
fn generateLegacyFactoryFunction(comptime JsApi: type, isolate: *v8.Isolate, interface_template: *const v8.FunctionTemplate, interface_func: *const v8.Function, context: *const v8.Context) *const v8.Function {
|
||||
const alias = JsApi.Meta.constructor_alias;
|
||||
const template = v8.v8__FunctionTemplate__New__Config(isolate, &.{
|
||||
.length = JsApi.constructor.arity,
|
||||
.callback = JsApi.constructor.func,
|
||||
.behavior = v8.kConstructorBehavior_Allow,
|
||||
}).?;
|
||||
// Inherit so that the objects we construct pass the interface's
|
||||
// accessor and method signature checks.
|
||||
v8.v8__FunctionTemplate__Inherit(template, interface_template);
|
||||
{
|
||||
const internal_field_count = comptime countInternalFields(JsApi);
|
||||
if (internal_field_count > 0) {
|
||||
const instance_template = v8.v8__FunctionTemplate__InstanceTemplate(template);
|
||||
v8.v8__ObjectTemplate__SetInternalFieldCount(instance_template, internal_field_count);
|
||||
}
|
||||
}
|
||||
const class_name = v8.v8__String__NewFromUtf8(isolate, alias.ptr, v8.kNormal, @intCast(alias.len));
|
||||
v8.v8__FunctionTemplate__SetClassName(template, class_name);
|
||||
|
||||
const func = v8.v8__FunctionTemplate__GetFunction(template, context).?;
|
||||
const prototype_key = v8.v8__String__NewFromUtf8(isolate, "prototype", v8.kNormal, 9);
|
||||
const interface_prototype = v8.v8__Object__Get(@ptrCast(interface_func), context, prototype_key).?;
|
||||
var maybe_result: v8.MaybeBool = undefined;
|
||||
v8.v8__Object__DefineOwnProperty(@ptrCast(func), context, prototype_key, interface_prototype, v8.ReadOnly + v8.DontEnum + v8.DontDelete, &maybe_result);
|
||||
return func;
|
||||
}
|
||||
|
||||
// hard-coded special case for HtmlElement which can be extended but not
|
||||
// instantiated.
|
||||
fn inheritsFromHtmlElement(comptime JsApi: type) bool {
|
||||
|
||||
@@ -65,7 +65,7 @@ fn _toSlice(self: String, comptime null_terminate: bool, allocator: Allocator) !
|
||||
|
||||
const l = v8.v8__String__Utf8Length(handle, isolate);
|
||||
const buf = try (if (comptime null_terminate) allocator.allocSentinel(u8, @intCast(l), 0) else allocator.alloc(u8, @intCast(l)));
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8);
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null);
|
||||
if (comptime lp.IS_DEBUG) {
|
||||
std.debug.assert(n == l);
|
||||
}
|
||||
@@ -87,7 +87,7 @@ pub fn toSSOWithAlloc(self: String, allocator: Allocator) !lp.String {
|
||||
|
||||
if (l <= 12) {
|
||||
var content: [12]u8 = undefined;
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, &content[0], content.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8);
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, &content[0], content.len, v8.WRITE_REPLACE_INVALID_UTF8, null);
|
||||
if (comptime lp.IS_DEBUG) {
|
||||
std.debug.assert(n == l);
|
||||
}
|
||||
@@ -103,7 +103,7 @@ pub fn toSSOWithAlloc(self: String, allocator: Allocator) !lp.String {
|
||||
}
|
||||
|
||||
const buf = try allocator.alloc(u8, l);
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8);
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null);
|
||||
if (comptime lp.IS_DEBUG) {
|
||||
std.debug.assert(n == l);
|
||||
}
|
||||
@@ -124,7 +124,7 @@ pub fn format(self: String, writer: *std.Io.Writer) !void {
|
||||
const l = v8.v8__String__Utf8Length(handle, isolate);
|
||||
var buf = if (l < 1024) &small else local.call_arena.alloc(u8, @intCast(l)) catch return error.WriteFailed;
|
||||
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8);
|
||||
const n = v8.v8__String__WriteUtf8(handle, isolate, buf.ptr, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null);
|
||||
return writer.writeAll(buf[0..n]);
|
||||
}
|
||||
|
||||
|
||||
@@ -598,7 +598,7 @@ pub fn writeStackTrace(isolate: *v8.Isolate, stack_handle: *const v8.StackTrace,
|
||||
const frame_handle = v8.v8__StackTrace__GetFrame(stack_handle, isolate, @intCast(i)).?;
|
||||
if (v8.v8__StackFrame__GetFunctionName(frame_handle)) |name| {
|
||||
var buf: [1024]u8 = undefined;
|
||||
const n = v8.v8__String__WriteUtf8(name, isolate, &buf, buf.len, v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8);
|
||||
const n = v8.v8__String__WriteUtf8(name, isolate, &buf, buf.len, v8.WRITE_REPLACE_INVALID_UTF8, null);
|
||||
try writer.print("{s}{s}:{d}", .{ separator, buf[0..n], v8.v8__StackFrame__GetLineNumber(frame_handle) });
|
||||
} else {
|
||||
try writer.print("{s}<anonymous>:{d}", .{ separator, v8.v8__StackFrame__GetLineNumber(frame_handle) });
|
||||
|
||||
@@ -952,7 +952,7 @@ test "browser.markdown: declarative shadow DOM renders through piercing" {
|
||||
const host = try doc.createElement("div", null, frame);
|
||||
try host.setHTMLUnsafe(
|
||||
\\<div><template shadowrootmode="open"><p>shadow content</p></template></div>
|
||||
, frame);
|
||||
, null, frame);
|
||||
|
||||
var aw: std.Io.Writer.Allocating = .init(testing.allocator);
|
||||
defer aw.deinit();
|
||||
|
||||
@@ -1468,7 +1468,7 @@ test "browser.screenshot: shadow dom and slots" {
|
||||
const div = try doc.createElement("div", null, frame);
|
||||
try div.setHTMLUnsafe(
|
||||
\\<x-host><template shadowrootmode="open"><p>shadow <slot></slot></p></template>light</x-host>
|
||||
, frame);
|
||||
, null, frame);
|
||||
|
||||
var builder: Builder = .{ .arena = testing.arena_allocator, .frame = frame, .tree = .{ .frame = frame, .state = .{ .root = div.asNode() } } };
|
||||
try builder.render(div.asNode());
|
||||
|
||||
@@ -179,3 +179,23 @@
|
||||
img.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACw=';
|
||||
testing.expectEqual(undefined, await img.decode());
|
||||
</script>
|
||||
|
||||
<script id="legacy_factory_function">
|
||||
// https://webidl.spec.whatwg.org/#legacy-factory-functions
|
||||
testing.expectEqual(true, Image !== HTMLImageElement)
|
||||
testing.expectEqual('Image', Image.name)
|
||||
testing.expectEqual(0, Image.length)
|
||||
testing.expectEqual(HTMLImageElement.prototype, Image.prototype)
|
||||
testing.expectEqual(HTMLImageElement, new Image().constructor)
|
||||
testing.expectEqual('img', new Image().localName)
|
||||
testing.expectError('TypeError', () => new HTMLImageElement())
|
||||
testing.expectError('TypeError', () => Image())
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(Image, 'prototype')
|
||||
testing.expectEqual(false, desc.writable)
|
||||
testing.expectEqual(false, desc.enumerable)
|
||||
testing.expectEqual(false, desc.configurable)
|
||||
|
||||
testing.expectEqual(false, Object.keys(window).includes('Image'))
|
||||
testing.expectEqual(false, Object.keys(window).includes('HTMLImageElement'))
|
||||
</script>
|
||||
@@ -308,3 +308,23 @@
|
||||
testing.expectEqual(true, video.paused);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id="legacy_factory_function">
|
||||
// https://webidl.spec.whatwg.org/#legacy-factory-functions
|
||||
testing.expectEqual(true, Audio !== HTMLAudioElement)
|
||||
testing.expectEqual('Audio', Audio.name)
|
||||
testing.expectEqual(0, Audio.length)
|
||||
testing.expectEqual(HTMLAudioElement.prototype, Audio.prototype)
|
||||
testing.expectEqual(HTMLAudioElement, new Audio().constructor)
|
||||
testing.expectEqual('audio', new Audio().localName)
|
||||
testing.expectError('TypeError', () => new HTMLAudioElement())
|
||||
testing.expectError('TypeError', () => Audio())
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(Audio, 'prototype')
|
||||
testing.expectEqual(false, desc.writable)
|
||||
testing.expectEqual(false, desc.enumerable)
|
||||
testing.expectEqual(false, desc.configurable)
|
||||
|
||||
testing.expectEqual(false, Object.keys(window).includes('Audio'))
|
||||
testing.expectEqual(false, Object.keys(window).includes('HTMLAudioElement'))
|
||||
</script>
|
||||
@@ -257,3 +257,23 @@
|
||||
testing.expectEqual(1, select.selectedIndex)
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id="legacy_factory_function">
|
||||
// https://webidl.spec.whatwg.org/#legacy-factory-functions
|
||||
testing.expectEqual(true, Option !== HTMLOptionElement)
|
||||
testing.expectEqual('Option', Option.name)
|
||||
testing.expectEqual(0, Option.length)
|
||||
testing.expectEqual(HTMLOptionElement.prototype, Option.prototype)
|
||||
testing.expectEqual(HTMLOptionElement, new Option().constructor)
|
||||
testing.expectEqual('option', new Option().localName)
|
||||
testing.expectError('TypeError', () => new HTMLOptionElement())
|
||||
testing.expectError('TypeError', () => Option())
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(Option, 'prototype')
|
||||
testing.expectEqual(false, desc.writable)
|
||||
testing.expectEqual(false, desc.enumerable)
|
||||
testing.expectEqual(false, desc.configurable)
|
||||
|
||||
testing.expectEqual(false, Object.keys(window).includes('Option'))
|
||||
testing.expectEqual(false, Object.keys(window).includes('HTMLOptionElement'))
|
||||
</script>
|
||||
@@ -629,3 +629,38 @@
|
||||
testing.expectEqual(0, box.scrollLeft);
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.sheetBox { height: 100px; overflow: auto; }
|
||||
#sheetAuto { height: auto; }
|
||||
.sheetVh { height: 10vh; }
|
||||
</style>
|
||||
<div id="sheetBox" class="sheetBox"><div style="height: 500px;">content</div></div>
|
||||
<div id="sheetAuto" class="sheetBox"><div style="height: 500px;">content</div></div>
|
||||
<div id="inlineAuto" class="sheetBox" style="height: 50%"><div style="height: 500px;">content</div></div>
|
||||
<div id="sheetVh" class="sheetVh"></div>
|
||||
|
||||
<script id="sheetSizedBox">
|
||||
{
|
||||
// A sheet size is as explicit as an inline one
|
||||
const box = $('#sheetBox');
|
||||
testing.expectEqual(100, box.clientHeight);
|
||||
testing.expectEqual(500, box.scrollHeight);
|
||||
testing.expectEqual('100px', getComputedStyle(box).height);
|
||||
|
||||
box.scrollTop = 9999;
|
||||
testing.expectEqual(400, box.scrollTop);
|
||||
|
||||
// A stronger rule's `auto` wins, leaving no size to clamp to. Chrome
|
||||
// clamps to 0; we can't tell auto from max-height, so we don't clamp.
|
||||
const auto = $('#sheetAuto');
|
||||
testing.expectEqual(500, auto.clientHeight);
|
||||
auto.scrollTop = 9999;
|
||||
testing.expectEqual(9999, auto.scrollTop);
|
||||
|
||||
// So does an unresolvable inline value
|
||||
testing.expectEqual(500, $('#inlineAuto').clientHeight);
|
||||
|
||||
testing.expectEqual(window.innerHeight / 10, $('#sheetVh').clientHeight);
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,8 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Driven by the "a failed preload is consumed, not refetched" test in
|
||||
ScriptManager.zig, which blocks these URLs while the hints fetch, then
|
||||
unblocks them and inserts the matching <script> elements.
|
||||
-->
|
||||
<link rel="preload" as="script" href="preload_failed.js" onerror="window.classic_hint_error = true">
|
||||
<link rel="modulepreload" href="preload_failed_module.js" onerror="window.module_hint_error = true">
|
||||
@@ -0,0 +1 @@
|
||||
window.failed_classic_ran = true;
|
||||
@@ -0,0 +1 @@
|
||||
window.failed_module_ran = true;
|
||||
@@ -368,3 +368,236 @@
|
||||
testing.expectEqual(false, config.javascriptURLs);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=setHTML>
|
||||
{
|
||||
const div = document.createElement('div');
|
||||
div.setHTML('<p id=a onclick="x()" title=t data-x=1>hi<script>boom()<\/script><!-- c --></p><iframe></iframe>');
|
||||
testing.expectEqual('<p title="t">hi</p>', div.innerHTML);
|
||||
|
||||
// an explicit "default" is the same thing
|
||||
div.setHTML('<b onclick="x()">b</b>', {sanitizer: 'default'});
|
||||
testing.expectEqual('<b>b</b>', div.innerHTML);
|
||||
|
||||
testing.expectError('TypeError', () => div.setHTML('x', {sanitizer: 'nope'}));
|
||||
testing.expectError('TypeError', () => div.setHTML('x', {sanitizer: {elements: [], removeElements: []}}));
|
||||
|
||||
div.setHTML('');
|
||||
testing.expectEqual('', div.innerHTML);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=setHTMLConfig>
|
||||
{
|
||||
const div = document.createElement('div');
|
||||
|
||||
// A dictionary on a safe method defaults to not keeping comments or data-*.
|
||||
div.setHTML('<p data-x=1 id=i>a<!--c--></p>', {sanitizer: {attributes: ['id']}});
|
||||
testing.expectEqual('<p id="i">a</p>', div.innerHTML);
|
||||
|
||||
// ... but unsafe methods, like the constructor, default to keeping them.
|
||||
div.setHTMLUnsafe('<p data-x=1 id=i>a<!--c--></p>', {sanitizer: {attributes: ['id']}});
|
||||
testing.expectEqual('<p data-x="1" id="i">a<!--c--></p>', div.innerHTML);
|
||||
|
||||
div.setHTML('<div><p>a<b>b</b></p><i>i</i></div>', {sanitizer: {elements: ['div', 'p']}});
|
||||
testing.expectEqual('<div><p>a</p></div>', div.innerHTML);
|
||||
|
||||
div.setHTML('<div><p>a<b>b<i>i</i></b>c</p></div>', {sanitizer: {replaceWithChildrenElements: ['b', 'p']}});
|
||||
testing.expectEqual('<div>ab<i>i</i>c</div>', div.innerHTML);
|
||||
|
||||
div.setHTML('<div><span>s</span><em>e</em></div>', {sanitizer: {removeElements: ['span']}});
|
||||
testing.expectEqual('<div><em>e</em></div>', div.innerHTML);
|
||||
|
||||
// per-element attribute lists
|
||||
div.setHTML('<p id=1 title=2>a</p><em id=3 title=4>b</em>', {sanitizer: {
|
||||
elements: [{name: 'p', attributes: ['id']}, {name: 'em', removeAttributes: ['title']}],
|
||||
attributes: ['title'],
|
||||
}});
|
||||
testing.expectEqual('<p id="1" title="2">a</p><em>b</em>', div.innerHTML);
|
||||
|
||||
// an element's removeAttributes must be a subset of the global attributes
|
||||
testing.expectError('TypeError', () => div.setHTML('x', {sanitizer: {
|
||||
elements: [{name: 'em', removeAttributes: ['id']}],
|
||||
attributes: ['title'],
|
||||
}}));
|
||||
|
||||
// A safe method still removes unsafe markup the config allows.
|
||||
div.setHTML('<script>x()<\/script><b onclick=x()>b</b>', {sanitizer: {elements: ['script', 'b'], attributes: ['onclick']}});
|
||||
testing.expectEqual('<b>b</b>', div.innerHTML);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=setHTMLUnsafe>
|
||||
{
|
||||
const div = document.createElement('div');
|
||||
div.setHTMLUnsafe('<b onclick="x()">b</b><script>x()<\/script><!--c-->');
|
||||
testing.expectEqual('<b onclick="x()">b</b><script>x()<\/script><!--c-->', div.innerHTML);
|
||||
|
||||
// The sanitizer's own configuration is used as-is.
|
||||
const sanitizer = new Sanitizer({removeElements: ['i']});
|
||||
const before = sanitizer.get();
|
||||
div.setHTMLUnsafe('<b onclick="x()">b</b><i>i</i>', {sanitizer});
|
||||
testing.expectEqual('<b onclick="x()">b</b>', div.innerHTML);
|
||||
|
||||
// A safe method must not remove unsafe from the caller's Sanitizer.
|
||||
div.setHTML('<b onclick="x()">b</b><i>i</i>', {sanitizer});
|
||||
testing.expectEqual('<b>b</b>', div.innerHTML);
|
||||
testing.expectEqual(before, sanitizer.get());
|
||||
|
||||
// The default configuration on an unsafe method is still the default one
|
||||
div.setHTMLUnsafe('<b onclick="x()">b</b><script><\/script>', {sanitizer: 'default'});
|
||||
testing.expectEqual('<b>b</b>', div.innerHTML);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=textMerge>
|
||||
{
|
||||
// Text left adjacent by a removal is merged, as it would be had the node
|
||||
// never been parsed.
|
||||
const div = document.createElement('div');
|
||||
div.setHTML('a <!-- c --> b');
|
||||
testing.expectEqual(1, div.childNodes.length);
|
||||
testing.expectEqual('a b', div.firstChild.data);
|
||||
|
||||
div.setHTML('<p>x<script>s<\/script>y<!--c-->z<b>b</b></p>');
|
||||
testing.expectEqual(2, div.firstChild.childNodes.length);
|
||||
testing.expectEqual('xyz', div.firstChild.firstChild.data);
|
||||
|
||||
// replaced elements merge at both edges
|
||||
div.setHTML('<p>x<span>y<i>i</i>z</span>w</p>', {sanitizer: {replaceWithChildrenElements: ['span']}});
|
||||
const p = div.firstChild;
|
||||
testing.expectEqual(3, p.childNodes.length);
|
||||
testing.expectEqual('xy', p.childNodes[0].data);
|
||||
testing.expectEqual('zw', p.childNodes[2].data);
|
||||
|
||||
div.setHTML('<p>x<b><i>y</i></b>z</p>', {sanitizer: {replaceWithChildrenElements: ['b', 'i']}});
|
||||
testing.expectEqual(1, div.firstChild.childNodes.length);
|
||||
testing.expectEqual('xyz', div.firstChild.firstChild.data);
|
||||
|
||||
// nothing removed: nothing touched
|
||||
div.setHTMLUnsafe('<p>x<!--c-->y</p>');
|
||||
testing.expectEqual(3, div.firstChild.childNodes.length);
|
||||
|
||||
// in the other trees too
|
||||
const doc = Document.parseHTML('a<!--c-->b<template>c<!--c-->d</template>', {sanitizer: {elements: ['html', 'head', 'body', 'template']}});
|
||||
testing.expectEqual(2, doc.body.childNodes.length);
|
||||
testing.expectEqual('ab', doc.body.firstChild.data);
|
||||
testing.expectEqual(1, doc.body.lastChild.content.childNodes.length);
|
||||
testing.expectEqual('cd', doc.body.lastChild.content.firstChild.data);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=scriptContext>
|
||||
{
|
||||
const script = document.createElement('script');
|
||||
script.textContent = 'untouched';
|
||||
script.setHTML('<b>b</b>');
|
||||
testing.expectEqual('untouched', script.textContent);
|
||||
|
||||
script.setHTMLUnsafe('<b>b</b>');
|
||||
testing.expectEqual('<b>b</b>', script.innerHTML);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=javascriptURLs>
|
||||
{
|
||||
const div = document.createElement('div');
|
||||
|
||||
// safe: always removed, whatever the config says
|
||||
div.setHTML('<a href="javascript:x()">a</a><a href="https://x/">b</a>', {sanitizer: {javascriptURLs: true}});
|
||||
testing.expectEqual('<a>a</a><a href="https://x/">b</a>', div.innerHTML);
|
||||
|
||||
// unsafe: removed only when the config says so
|
||||
div.setHTMLUnsafe('<a href="javascript:x()">a</a>', {sanitizer: {}});
|
||||
testing.expectEqual('<a href="javascript:x()">a</a>', div.innerHTML);
|
||||
|
||||
const off = {sanitizer: {javascriptURLs: false}};
|
||||
for (const url of ['javascript:x()', ' JaVaScRiPt:x()', '\x01java\nscript:x()', 'java\tscript:x()']) {
|
||||
const a = document.createElement('a');
|
||||
a.setAttribute('href', url);
|
||||
div.setHTMLUnsafe(a.outerHTML, off);
|
||||
testing.expectEqual(null, div.firstChild.getAttribute('href'), {script_id: 'javascriptURLs'});
|
||||
}
|
||||
div.setHTMLUnsafe('<a href="javascriptx:x()">a</a><a href="xjavascript:x()">b</a><p href="javascript:x()"></p>', off);
|
||||
testing.expectEqual('<a href="javascriptx:x()">a</a><a href="xjavascript:x()">b</a><p href="javascript:x()"></p>', div.innerHTML);
|
||||
|
||||
div.setHTMLUnsafe('<area href="javascript:x()"><form action="javascript:x()"><button formaction="javascript:x()"></button></form>', off);
|
||||
testing.expectEqual('<area><form><button></button></form>', div.innerHTML);
|
||||
|
||||
div.setHTMLUnsafe('<svg><a href="javascript:x()"></a><a xlink:href="javascript:x()"></a></svg>', off);
|
||||
testing.expectEqual('<svg><a></a><a></a></svg>', div.innerHTML);
|
||||
|
||||
div.setHTMLUnsafe('<math><mi href="javascript:x()"></mi></math>', off);
|
||||
testing.expectEqual('<math><mi></mi></math>', div.innerHTML);
|
||||
|
||||
div.setHTMLUnsafe('<svg><animate attributeName="href"></animate><set attributeName="xlink:href"></set><animate attributeName="x"></animate></svg>', off);
|
||||
testing.expectEqual('<svg><animate></animate><set></set><animate attributeName="x"></animate></svg>', div.innerHTML);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=nestedTrees>
|
||||
{
|
||||
const div = document.createElement('div');
|
||||
div.setHTML('<template><b onclick=x()>b</b><script><\/script></template>', {sanitizer: {elements: ['template', 'b', 'script']}});
|
||||
testing.expectEqual('<b>b</b>', div.firstChild.innerHTML);
|
||||
|
||||
const host = document.createElement('div');
|
||||
host.setHTMLUnsafe('<div><template shadowrootmode=open><i onclick=x()>i</i><script><\/script></template></div>', {sanitizer: {removeElements: ['script'], removeAttributes: ['onclick']}});
|
||||
testing.expectEqual('<i>i</i>', host.firstChild.shadowRoot.innerHTML);
|
||||
|
||||
// setHTML on a template sets its contents
|
||||
const template = document.createElement('template');
|
||||
template.setHTML('<b onclick=x()>b</b>');
|
||||
testing.expectEqual(0, template.childNodes.length);
|
||||
testing.expectEqual('<b>b</b>', template.content.firstChild.outerHTML);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=shadowRoot>
|
||||
{
|
||||
const host = document.createElement('div');
|
||||
const root = host.attachShadow({mode: 'open'});
|
||||
root.setHTML('<b onclick=x()>b</b><script><\/script>');
|
||||
testing.expectEqual('<b>b</b>', root.innerHTML);
|
||||
|
||||
root.setHTMLUnsafe('<b onclick=x()>b</b>');
|
||||
testing.expectEqual('<b onclick="x()">b</b>', root.innerHTML);
|
||||
|
||||
root.setHTMLUnsafe('<b onclick=x()>b</b>', {sanitizer: {}});
|
||||
testing.expectEqual('<b onclick="x()">b</b>', root.innerHTML);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=mutationRecord>
|
||||
{
|
||||
const div = document.createElement('div');
|
||||
div.innerHTML = '<p>old</p>';
|
||||
const observer = new MutationObserver(() => {});
|
||||
observer.observe(div, {childList: true});
|
||||
div.setHTML('<b>a</b><i>b</i><script><\/script>');
|
||||
const records = observer.takeRecords();
|
||||
testing.expectEqual(1, records.length);
|
||||
testing.expectEqual(1, records[0].removedNodes.length);
|
||||
testing.expectEqual(2, records[0].addedNodes.length);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script id=parseHTML>
|
||||
{
|
||||
const doc = Document.parseHTML('<title>t</title><p onclick=x() data-x=1>a<script>x()<\/script></p>');
|
||||
testing.expectEqual(true, doc instanceof Document);
|
||||
testing.expectEqual('about:blank', doc.URL);
|
||||
testing.expectEqual('<p>a</p>', doc.body.innerHTML);
|
||||
testing.expectEqual('t', doc.title);
|
||||
|
||||
const unsafe = Document.parseHTMLUnsafe('<p onclick=x()>a<script>x()<\/script></p>');
|
||||
testing.expectEqual('<p onclick="x()">a<script>x()<\/script></p>', unsafe.body.innerHTML);
|
||||
|
||||
const filtered = Document.parseHTMLUnsafe('<p>a<i>b</i></p>', {sanitizer: {removeElements: ['i']}});
|
||||
testing.expectEqual('<p>a</p>', filtered.body.innerHTML);
|
||||
|
||||
// html isn't allowed, so it all goes
|
||||
testing.expectEqual(null, Document.parseHTML('<div>text', {sanitizer: {elements: ['body', 'div']}}).documentElement);
|
||||
testing.expectError('TypeError', () => Document.parseHTML('x', {sanitizer: {replaceWithChildrenElements: ['html']}}));
|
||||
}
|
||||
</script>
|
||||
+208
-101
@@ -24,6 +24,8 @@ const NodeRegistry = @import("../NodeRegistry.zig");
|
||||
|
||||
const DOMNode = @import("webapi/Node.zig");
|
||||
const Selector = @import("webapi/selector/Selector.zig");
|
||||
const SelectorPath = @import("SelectorPath.zig");
|
||||
const Element = @import("webapi/Element.zig");
|
||||
|
||||
const log = lp.log;
|
||||
const tavily = zenai.search.tavily;
|
||||
@@ -557,13 +559,14 @@ pub const Tool = enum {
|
||||
),
|
||||
},
|
||||
.scroll => .{
|
||||
.description = "Scroll the window, or an element's scroll container, to an absolute position; an omitted axis keeps its current offset. Page scripts receive a `scroll` event, so content that loads on scroll (infinite feeds, lazy lists) may appear: read the page again afterwards, with `waitForState` if it is still loading. Returns the final scroll position and the current page URL and title.",
|
||||
.description = "Scroll the window, or an element's scroll container, to an absolute position; an omitted axis keeps its current offset. Target an element with a CSS selector (preferred for reproducibility) or a backendNodeId; omit both to scroll the window. Page scripts receive a `scroll` event, so content that loads on scroll (infinite feeds, lazy lists) may appear: read the page again afterwards, with `waitForState` if it is still loading. Returns the final scroll position and the current page URL and title.",
|
||||
.summary = "Scroll the page or an element",
|
||||
.input_schema = minify(
|
||||
\\{
|
||||
\\ "type": "object",
|
||||
\\ "properties": {
|
||||
\\ "backendNodeId": { "type": "integer", "description": "Optional: The backend node ID of the element to scroll. If the element is not itself a scroll container, its nearest scrollable ancestor is scrolled instead. If omitted (or 0), scrolls the window." },
|
||||
\\ "selector": { "type": "string", "description": "Optional: CSS selector of the element to scroll. Preferred over backendNodeId. If the element is not itself a scroll container, its nearest scrollable ancestor is scrolled instead." },
|
||||
\\ "backendNodeId": { "type": "integer", "description": "Optional: The backend node ID of the element to scroll. If the element is not itself a scroll container, its nearest scrollable ancestor is scrolled instead. If neither this nor selector is given (or it is 0), scrolls the window." },
|
||||
\\ "x": { "type": "integer", "description": "Optional: The horizontal scroll offset." },
|
||||
\\ "y": { "type": "integer", "description": "Optional: The vertical scroll offset." }
|
||||
\\ }
|
||||
@@ -820,6 +823,9 @@ pub const ToolResult = struct {
|
||||
is_error: bool = false,
|
||||
/// Only set when the caller passed `CallOpts.inline_image`.
|
||||
image: ?lp.screenshot.Prepared = null,
|
||||
/// Resolved before the action runs, because a navigation takes the node
|
||||
/// with it.
|
||||
selector: ?[]const u8 = null,
|
||||
};
|
||||
|
||||
const GotoParams = struct {
|
||||
@@ -851,6 +857,9 @@ const NodeAndPage = struct { node: *DOMNode, page: *lp.Frame, target: ActionTarg
|
||||
pub const CallOpts = struct {
|
||||
/// The caller can hand an image to a model.
|
||||
inline_image: bool = false,
|
||||
/// Fill in `ToolResult.selector`: a registry id means nothing in a later
|
||||
/// session, so `--save` cannot replay a call that used one.
|
||||
record: bool = false,
|
||||
};
|
||||
|
||||
// An inline screenshot is re-sent on every turn; keep it within what models
|
||||
@@ -883,13 +892,44 @@ pub fn call(
|
||||
};
|
||||
const substituted = try substituteStringArgs(arena, tool, normalized);
|
||||
|
||||
return dispatch(arena, session, registry, tool, substituted, opts) catch |err| {
|
||||
// Before dispatch, because a navigation takes the node with it. Gated on
|
||||
// `isRecorded` because `SelectorPath.build` is the expensive part of a tool
|
||||
// call and the read-only tools that take a `backendNodeId` -- tree,
|
||||
// markdown, html, nodeDetails -- would only have it thrown away.
|
||||
const selector = if (opts.record and tool.isRecorded())
|
||||
selectorForArgs(arena, session, registry, substituted)
|
||||
else
|
||||
null;
|
||||
|
||||
var result = dispatch(arena, session, registry, tool, substituted, opts) catch |err| {
|
||||
if (err == error.NavigationFailed) {
|
||||
if (formatNavigationError(arena, session)) |text|
|
||||
return .{ .text = text, .is_error = true };
|
||||
}
|
||||
return err;
|
||||
};
|
||||
result.selector = selector;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// The CSS selector for a call's `backendNodeId`, so the call can be recorded
|
||||
/// in a form that still resolves in a later session.
|
||||
fn selectorForArgs(
|
||||
arena: std.mem.Allocator,
|
||||
session: *lp.Session,
|
||||
registry: *NodeRegistry,
|
||||
arguments: ?std.json.Value,
|
||||
) ?[]const u8 {
|
||||
const args = arguments orelse return null;
|
||||
if (args != .object) return null;
|
||||
if (args.object.contains("selector")) return null;
|
||||
const id = args.object.get("backendNodeId") orelse return null;
|
||||
if (id != .integer) return null;
|
||||
|
||||
const node = registry.lookup_by_id.get(std.math.cast(NodeRegistry.Id, id.integer) orelse return null) orelse return null;
|
||||
const el = node.dom.is(Element) orelse return null;
|
||||
const frame = session.currentFrame() orelse return null;
|
||||
return SelectorPath.init(arena, frame).build(el) catch null;
|
||||
}
|
||||
|
||||
fn dispatch(
|
||||
@@ -1052,7 +1092,7 @@ const api_engines = .{
|
||||
.init_options = brave.Client.InitOptions{},
|
||||
// text_decorations=false: no <strong> markup in model-read snippets.
|
||||
.options = brave.types.SearchOptions{ .count = 10, .text_decorations = false },
|
||||
.format = formatBraveMarkdown,
|
||||
.collect = collectBrave,
|
||||
},
|
||||
.{
|
||||
.tag = SearchEngine.tavily,
|
||||
@@ -1060,7 +1100,7 @@ const api_engines = .{
|
||||
.Client = tavily.Client,
|
||||
.init_options = tavily.Client.InitOptions{},
|
||||
.options = tavily.types.SearchOptions{ .max_results = 10 },
|
||||
.format = formatTavilyMarkdown,
|
||||
.collect = collectTavily,
|
||||
},
|
||||
.{
|
||||
.tag = SearchEngine.exa,
|
||||
@@ -1070,7 +1110,7 @@ const api_engines = .{
|
||||
// highlights: Exa returns no snippet text unless contents is requested;
|
||||
// capped at 3 sentences since the default excerpts run long.
|
||||
.options = exa.types.SearchOptions{ .numResults = 10, .contents = .{ .highlights = .{ .numSentences = 3 } } },
|
||||
.format = formatExaMarkdown,
|
||||
.collect = collectExa,
|
||||
},
|
||||
.{
|
||||
.tag = SearchEngine.keenable,
|
||||
@@ -1080,7 +1120,7 @@ const api_engines = .{
|
||||
// snippet_max_length is a hint the API may round up to a word
|
||||
// boundary; 500 keeps ten results within a few KB of context.
|
||||
.options = keenable.types.SearchOptions{ .max_results = 10, .snippet_max_length = 500 },
|
||||
.format = formatKeenableMarkdown,
|
||||
.collect = collectKeenable,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1128,13 +1168,24 @@ const KeyStatus = struct {
|
||||
state: enum { set, keyless, missing },
|
||||
};
|
||||
|
||||
/// `null` for `.auto`, which has no key of its own.
|
||||
fn keyStatusOf(comptime e: anytype) KeyStatus {
|
||||
return .{
|
||||
.env_var = e.env_var,
|
||||
.state = if (engineKey(e)) |key| (if (key != null) .set else .keyless) else |_| .missing,
|
||||
};
|
||||
}
|
||||
|
||||
/// For `.auto`, the rung the cascade would actually land on -- it has no key of
|
||||
/// its own, but "which engine is about to serve, and on what terms" is the
|
||||
/// question worth answering, and `.auto` is the default.
|
||||
pub fn searchKeyStatus(engine: SearchEngine) ?KeyStatus {
|
||||
inline for (api_engines) |e| {
|
||||
if (engine == e.tag) return .{
|
||||
.env_var = e.env_var,
|
||||
.state = if (engineKey(e)) |key| (if (key != null) .set else .keyless) else |_| .missing,
|
||||
};
|
||||
if (engine == e.tag) return keyStatusOf(e);
|
||||
}
|
||||
if (engine != .auto) return null;
|
||||
inline for (api_engines) |e| {
|
||||
const status = keyStatusOf(e);
|
||||
if (status.state != .missing) return status;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -1147,19 +1198,25 @@ fn execSearch(arena: std.mem.Allocator, arguments: ?std.json.Value) ToolError!To
|
||||
switch (search_engine) {
|
||||
.auto => {
|
||||
var last_err: ?anyerror = null;
|
||||
var last_label: []const u8 = "web";
|
||||
var last_detail: Failure = .{};
|
||||
inline for (api_engines) |engine| {
|
||||
if (engineKey(engine)) |api_key| {
|
||||
// Fall through on any failure so one outage doesn't kill
|
||||
// a whole benchmark run.
|
||||
if (apiSearch(engine, arena, api_key, timeout_ms, args.query)) |markdown_| {
|
||||
var detail: Failure = .{};
|
||||
if (apiSearch(engine, arena, api_key, timeout_ms, args.query, &detail)) |markdown_| {
|
||||
return .{ .text = markdown_ };
|
||||
} else |err| {
|
||||
last_err = err;
|
||||
last_label = @tagName(engine.tag);
|
||||
last_detail = detail;
|
||||
log.warn(.browser, @tagName(engine.tag) ++ " fallback", .{ .err = err });
|
||||
}
|
||||
} else |_| {}
|
||||
}
|
||||
return searchFailed(arena, "web", last_err.?);
|
||||
// The last engine's reason, not a generic one -- the model can act on it.
|
||||
return searchFailed(arena, last_label, last_err.?, last_detail);
|
||||
},
|
||||
inline else => |tag| {
|
||||
inline for (api_engines) |engine| {
|
||||
@@ -1177,16 +1234,36 @@ fn searchExplicit(arena: std.mem.Allocator, comptime engine: anytype, timeout_ms
|
||||
.text = "web search engine is set to " ++ label ++ " but " ++ engine.env_var ++ " is not set in the environment",
|
||||
.is_error = true,
|
||||
};
|
||||
const markdown_ = apiSearch(engine, arena, api_key, timeout_ms, query) catch |err|
|
||||
return searchFailed(arena, label, err);
|
||||
var detail: Failure = .{};
|
||||
const markdown_ = apiSearch(engine, arena, api_key, timeout_ms, query, &detail) catch |err|
|
||||
return searchFailed(arena, label, err, detail);
|
||||
return .{ .text = markdown_ };
|
||||
}
|
||||
|
||||
fn searchFailed(arena: std.mem.Allocator, comptime label: []const u8, err: anyerror) ToolError!ToolResult {
|
||||
return .{
|
||||
.text = try std.fmt.allocPrint(arena, label ++ " search failed: {s}", .{@errorName(err)}),
|
||||
.is_error = true,
|
||||
};
|
||||
/// Duped out of the client before `deinit` takes it; otherwise the model sees
|
||||
/// only the error name.
|
||||
const Failure = struct {
|
||||
status: ?u10 = null,
|
||||
message: []const u8 = "",
|
||||
};
|
||||
|
||||
fn searchFailed(arena: std.mem.Allocator, label: []const u8, err: anyerror, detail: Failure) ToolError!ToolResult {
|
||||
var aw: std.Io.Writer.Allocating = .init(arena);
|
||||
writeFailure(&aw.writer, label, err, detail) catch return ToolError.OutOfMemory;
|
||||
return .{ .text = aw.written(), .is_error = true };
|
||||
}
|
||||
|
||||
fn writeFailure(w: *std.Io.Writer, label: []const u8, err: anyerror, detail: Failure) !void {
|
||||
try w.print("{s} search failed: {s}", .{ label, @errorName(err) });
|
||||
if (detail.status) |status| try w.print(" (HTTP {d})", .{status});
|
||||
if (detail.message.len > 0) {
|
||||
try w.writeAll(": ");
|
||||
try writeSingleLine(w, detail.message);
|
||||
}
|
||||
// The one failure where the right move is not "try another query".
|
||||
if (detail.status == 429) {
|
||||
try w.writeAll(". This engine is rate-limited right now; wait before retrying, or read the answer from a page instead.");
|
||||
}
|
||||
}
|
||||
|
||||
/// `arena` owns the returned slice.
|
||||
@@ -1196,6 +1273,7 @@ fn apiSearch(
|
||||
api_key: ?[]const u8,
|
||||
timeout_ms: u32,
|
||||
query: []const u8,
|
||||
detail: *Failure,
|
||||
) ![]const u8 {
|
||||
var init_options = engine.init_options;
|
||||
// The cascade (or the model) is the retry; honoring a Retry-After (60 s
|
||||
@@ -1216,59 +1294,76 @@ fn apiSearch(
|
||||
.status = status,
|
||||
.message = client.last_error.message,
|
||||
});
|
||||
detail.* = .{
|
||||
.status = status,
|
||||
.message = if (client.last_error.message) |m| (arena.dupe(u8, m) catch "") else "",
|
||||
};
|
||||
}
|
||||
return err;
|
||||
};
|
||||
defer response.deinit();
|
||||
|
||||
return renderResults(arena, try engine.collect(arena, response.value));
|
||||
}
|
||||
|
||||
pub const Hit = struct {
|
||||
title: []const u8,
|
||||
url: []const u8,
|
||||
snippet: []const u8,
|
||||
};
|
||||
|
||||
pub const SearchResults = struct {
|
||||
/// Tavily's synthesized answer; empty for the engines that have none.
|
||||
answer: []const u8 = "",
|
||||
hits: []const Hit = &.{},
|
||||
};
|
||||
|
||||
/// The engines agree on title and url and disagree only on which field holds
|
||||
/// the snippet.
|
||||
fn collectHits(arena: std.mem.Allocator, results: anytype, comptime snippet: []const u8) ![]Hit {
|
||||
const hits = try arena.alloc(Hit, results.len);
|
||||
for (results, hits) |r, *hit| hit.* = .{ .title = r.title, .url = r.url, .snippet = @field(r, snippet) };
|
||||
return hits;
|
||||
}
|
||||
|
||||
fn collectTavily(arena: std.mem.Allocator, resp: tavily.types.SearchResponse) !SearchResults {
|
||||
return .{ .answer = resp.answer orelse "", .hits = try collectHits(arena, resp.results, "content") };
|
||||
}
|
||||
|
||||
fn collectBrave(arena: std.mem.Allocator, resp: brave.types.SearchResponse) !SearchResults {
|
||||
const results: []const brave.types.Result = if (resp.web) |web| web.results else &.{};
|
||||
return .{ .hits = try collectHits(arena, results, "description") };
|
||||
}
|
||||
|
||||
fn collectExa(arena: std.mem.Allocator, resp: exa.types.SearchResponse) !SearchResults {
|
||||
const hits = try arena.alloc(Hit, resp.results.len);
|
||||
for (resp.results, hits) |r, *hit| {
|
||||
const highlights = r.highlights orelse &[_][]const u8{};
|
||||
hit.* = .{
|
||||
.title = r.title orelse "",
|
||||
.url = r.url,
|
||||
.snippet = if (highlights.len > 0) highlights[0] else "",
|
||||
};
|
||||
}
|
||||
return .{ .hits = hits };
|
||||
}
|
||||
|
||||
fn collectKeenable(arena: std.mem.Allocator, resp: keenable.types.SearchResponse) !SearchResults {
|
||||
// `snippet` carries the page text; the wire format's always-empty
|
||||
// `description` is deliberately not even mapped by the client.
|
||||
return .{ .hits = try collectHits(arena, resp.results, "snippet") };
|
||||
}
|
||||
|
||||
fn renderResults(arena: std.mem.Allocator, results: SearchResults) ToolError![]const u8 {
|
||||
if (results.answer.len == 0 and results.hits.len == 0) return "No results.";
|
||||
var aw: std.Io.Writer.Allocating = .init(arena);
|
||||
try engine.format(&aw.writer, response.value);
|
||||
writeResults(&aw.writer, results) catch return ToolError.OutOfMemory;
|
||||
return aw.written();
|
||||
}
|
||||
|
||||
fn formatTavilyMarkdown(w: *std.Io.Writer, resp: tavily.types.SearchResponse) !void {
|
||||
const answer = resp.answer orelse "";
|
||||
if (answer.len == 0 and resp.results.len == 0) {
|
||||
return w.writeAll("No results.");
|
||||
}
|
||||
if (answer.len > 0) {
|
||||
try w.print("**Answer:** {s}\n\n", .{answer});
|
||||
}
|
||||
for (resp.results, 0..) |r, i| {
|
||||
try writeResultItem(w, i, r.title, r.url, r.content);
|
||||
}
|
||||
}
|
||||
|
||||
fn formatBraveMarkdown(w: *std.Io.Writer, resp: brave.types.SearchResponse) !void {
|
||||
const results: []const brave.types.Result = if (resp.web) |web| web.results else &.{};
|
||||
if (results.len == 0) {
|
||||
return w.writeAll("No results.");
|
||||
}
|
||||
for (results, 0..) |r, i| {
|
||||
try writeResultItem(w, i, r.title, r.url, r.description);
|
||||
}
|
||||
}
|
||||
|
||||
fn formatExaMarkdown(w: *std.Io.Writer, resp: exa.types.SearchResponse) !void {
|
||||
if (resp.results.len == 0) {
|
||||
return w.writeAll("No results.");
|
||||
}
|
||||
for (resp.results, 0..) |r, i| {
|
||||
const highlights = r.highlights orelse &[_][]const u8{};
|
||||
const snippet = if (highlights.len > 0) highlights[0] else "";
|
||||
try writeResultItem(w, i, r.title orelse "", r.url, snippet);
|
||||
}
|
||||
}
|
||||
|
||||
fn formatKeenableMarkdown(w: *std.Io.Writer, resp: keenable.types.SearchResponse) !void {
|
||||
if (resp.results.len == 0) {
|
||||
return w.writeAll("No results.");
|
||||
}
|
||||
for (resp.results, 0..) |r, i| {
|
||||
// snippet carries the page text (the wire format's always-empty
|
||||
// `description` is deliberately not even mapped by the client).
|
||||
try writeResultItem(w, i, r.title, r.url, r.snippet);
|
||||
}
|
||||
fn writeResults(w: *std.Io.Writer, results: SearchResults) !void {
|
||||
if (results.answer.len > 0) try w.print("**Answer:** {s}\n\n", .{results.answer});
|
||||
for (results.hits, 0..) |hit, i| try writeResultItem(w, i, hit.title, hit.url, hit.snippet);
|
||||
}
|
||||
|
||||
/// An empty title (providers default it to "") would render as `****`.
|
||||
@@ -1867,20 +1962,24 @@ fn execFill(arena: std.mem.Allocator, session: *lp.Session, registry: *NodeRegis
|
||||
fn execScroll(arena: std.mem.Allocator, session: *lp.Session, registry: *NodeRegistry, arguments: ?std.json.Value) ToolError![]const u8 {
|
||||
const Params = struct {
|
||||
backendNodeId: ?NodeRegistry.Id = null,
|
||||
selector: ?[]const u8 = null,
|
||||
x: ?i32 = null,
|
||||
y: ?i32 = null,
|
||||
};
|
||||
const args = try parseArgsOrDefault(Params, arena, arguments);
|
||||
const scope = beginAction(session);
|
||||
const page = try requireFrame(session);
|
||||
const target_node = try resolveOptionalNode(registry, args.backendNodeId);
|
||||
const resolved: ?NodeAndPage = if (args.selector != null or args.backendNodeId != null)
|
||||
try resolveTarget(session, registry, args.selector, args.backendNodeId)
|
||||
else
|
||||
null;
|
||||
const page = if (resolved) |r| r.page else try requireFrame(session);
|
||||
|
||||
const result = lp.actions.scroll(target_node, args.x, args.y, page) catch |err| return mapActionError(err);
|
||||
const result = lp.actions.scroll(if (resolved) |r| r.node else null, args.x, args.y, page) catch |err| return mapActionError(err);
|
||||
|
||||
const body = (switch (result.target) {
|
||||
.window => std.fmt.allocPrint(arena, "Scrolled window to x: {d}, y: {d}", .{ result.x, result.y }),
|
||||
.node => std.fmt.allocPrint(arena, "Scrolled element ({f}) to x: {d}, y: {d}", .{
|
||||
ActionTarget{ .backend_node_id = args.backendNodeId.? },
|
||||
resolved.?.target,
|
||||
result.x,
|
||||
result.y,
|
||||
}),
|
||||
@@ -1888,7 +1987,7 @@ fn execScroll(arena: std.mem.Allocator, session: *lp.Session, registry: *NodeReg
|
||||
const registered = registry.register(container) catch return ToolError.InternalError;
|
||||
break :blk std.fmt.allocPrint(arena, "Scrolled scroll container ({f}) of element ({f}) to x: {d}, y: {d}", .{
|
||||
ActionTarget{ .backend_node_id = registered.id },
|
||||
ActionTarget{ .backend_node_id = args.backendNodeId.? },
|
||||
resolved.?.target,
|
||||
result.x,
|
||||
result.y,
|
||||
});
|
||||
@@ -2742,7 +2841,7 @@ test "formatLpEnvNames reports empty when no names" {
|
||||
try std.testing.expectEqualStrings("No LP_* environment variables are set.", r);
|
||||
}
|
||||
|
||||
test "formatTavilyMarkdown renders answer and results" {
|
||||
test "tavily results render as markdown" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
const aa = arena.allocator();
|
||||
@@ -2756,9 +2855,7 @@ test "formatTavilyMarkdown renders answer and results" {
|
||||
},
|
||||
};
|
||||
|
||||
var aw: std.Io.Writer.Allocating = .init(aa);
|
||||
try formatTavilyMarkdown(&aw.writer, resp);
|
||||
const md = aw.written();
|
||||
const md = try renderResults(aa, try collectTavily(aa, resp));
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "**Answer:** Paris") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "1. **Paris - Wikipedia**") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "https://en.wikipedia.org/wiki/Paris") != null);
|
||||
@@ -2766,17 +2863,15 @@ test "formatTavilyMarkdown renders answer and results" {
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "2. **France**") != null);
|
||||
}
|
||||
|
||||
test "formatTavilyMarkdown handles empty results" {
|
||||
test "tavily: no results render as a notice" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
const aa = arena.allocator();
|
||||
|
||||
var aw: std.Io.Writer.Allocating = .init(aa);
|
||||
try formatTavilyMarkdown(&aw.writer, .{});
|
||||
try std.testing.expectEqualStrings("No results.", aw.written());
|
||||
try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectTavily(aa, .{})));
|
||||
}
|
||||
|
||||
test "formatBraveMarkdown renders web results" {
|
||||
test "brave results render as markdown" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
const aa = arena.allocator();
|
||||
@@ -2790,30 +2885,24 @@ test "formatBraveMarkdown renders web results" {
|
||||
},
|
||||
};
|
||||
|
||||
var aw: std.Io.Writer.Allocating = .init(aa);
|
||||
try formatBraveMarkdown(&aw.writer, resp);
|
||||
const md = aw.written();
|
||||
const md = try renderResults(aa, try collectBrave(aa, resp));
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "1. **Paris - Wikipedia**") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "https://en.wikipedia.org/wiki/Paris") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "Paris is the capital of France.") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "2. **France**") != null);
|
||||
}
|
||||
|
||||
test "formatBraveMarkdown handles empty results" {
|
||||
test "brave: no results render as a notice" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
const aa = arena.allocator();
|
||||
|
||||
var no_web: std.Io.Writer.Allocating = .init(aa);
|
||||
try formatBraveMarkdown(&no_web.writer, .{});
|
||||
try std.testing.expectEqualStrings("No results.", no_web.written());
|
||||
try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectBrave(aa, .{})));
|
||||
|
||||
var empty_web: std.Io.Writer.Allocating = .init(aa);
|
||||
try formatBraveMarkdown(&empty_web.writer, .{ .web = .{} });
|
||||
try std.testing.expectEqualStrings("No results.", empty_web.written());
|
||||
try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectBrave(aa, .{ .web = .{} })));
|
||||
}
|
||||
|
||||
test "formatKeenableMarkdown reads snippet" {
|
||||
test "keenable results render the snippet as the body" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
const aa = arena.allocator();
|
||||
@@ -2826,9 +2915,7 @@ test "formatKeenableMarkdown reads snippet" {
|
||||
},
|
||||
};
|
||||
|
||||
var aw: std.Io.Writer.Allocating = .init(aa);
|
||||
try formatKeenableMarkdown(&aw.writer, resp);
|
||||
const md = aw.written();
|
||||
const md = try renderResults(aa, try collectKeenable(aa, resp));
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "1. **Zig (programming language)**") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "Zig is a system programming language.") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, md, "2. **Zig guide**") != null);
|
||||
@@ -2843,15 +2930,14 @@ test "writeResultItem uses the URL as title when the title is empty" {
|
||||
try std.testing.expectEqualStrings("1. **https://example.org/x.pdf** — https://example.org/x.pdf\n snippet\n\n", aw.written());
|
||||
}
|
||||
|
||||
test "formatKeenableMarkdown handles empty results" {
|
||||
test "keenable: no results render as a notice" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
var aw: std.Io.Writer.Allocating = .init(arena.allocator());
|
||||
try formatKeenableMarkdown(&aw.writer, .{});
|
||||
try std.testing.expectEqualStrings("No results.", aw.written());
|
||||
const aa = arena.allocator();
|
||||
try std.testing.expectEqualStrings("No results.", try renderResults(aa, try collectKeenable(aa, .{})));
|
||||
}
|
||||
|
||||
test "formatBraveMarkdown flattens newlines in titles and descriptions" {
|
||||
test "brave titles and descriptions render on one line" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
const aa = arena.allocator();
|
||||
@@ -2864,9 +2950,30 @@ test "formatBraveMarkdown flattens newlines in titles and descriptions" {
|
||||
},
|
||||
};
|
||||
|
||||
var aw: std.Io.Writer.Allocating = .init(aa);
|
||||
try formatBraveMarkdown(&aw.writer, resp);
|
||||
try std.testing.expectEqualStrings("1. **Multi line title** — https://example.org\n line one line two\n\n", aw.written());
|
||||
try std.testing.expectEqualStrings(
|
||||
"1. **Multi line title** — https://example.org\n line one line two\n\n",
|
||||
try renderResults(aa, try collectBrave(aa, resp)),
|
||||
);
|
||||
}
|
||||
|
||||
test "searchFailed: a rate limit says so, a bare failure stays short" {
|
||||
var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
|
||||
defer arena.deinit();
|
||||
const aa = arena.allocator();
|
||||
|
||||
const limited = try searchFailed(aa, "keenable", error.ApiError, .{
|
||||
.status = 429,
|
||||
.message = "Public API hourly limit reached.\nWait 2 minutes to continue.",
|
||||
});
|
||||
try std.testing.expect(limited.is_error);
|
||||
try std.testing.expect(std.mem.indexOf(u8, limited.text, "(HTTP 429)") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, limited.text, "Public API hourly limit reached.") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, limited.text, "rate-limited right now") != null);
|
||||
try std.testing.expect(std.mem.indexOf(u8, limited.text, "\n") == null);
|
||||
|
||||
const bare = try searchFailed(aa, "web", error.ConnectionRefused, .{});
|
||||
try std.testing.expectEqualStrings("web search failed: ConnectionRefused", bare.text);
|
||||
try std.testing.expect(bare.is_error);
|
||||
}
|
||||
|
||||
test "isPathSafe: relative paths without traversal are accepted" {
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
const std = @import("std");
|
||||
const js = @import("../js/js.zig");
|
||||
const Frame = @import("../Frame.zig");
|
||||
const units = @import("../css/units.zig");
|
||||
const Tokenizer = @import("../css/Tokenizer.zig");
|
||||
|
||||
const CSS = @This();
|
||||
@@ -27,18 +26,6 @@ _pad: bool = false,
|
||||
|
||||
pub const init: CSS = .{};
|
||||
|
||||
// parseDimension plus viewport-relative units, which the faux layout
|
||||
// resolves against the page viewport.
|
||||
pub fn parseDimensionViewport(value: []const u8, frame: *Frame) ?f64 {
|
||||
const parsed = units.parse(value) catch return null;
|
||||
return switch (parsed.unit) {
|
||||
.none, .px => parsed.value,
|
||||
.vh => parsed.value * @as(f64, @floatFromInt(frame.page.getViewport().height)) / 100.0,
|
||||
.vw => parsed.value * @as(f64, @floatFromInt(frame.page.getViewport().width)) / 100.0,
|
||||
else => null,
|
||||
};
|
||||
}
|
||||
|
||||
// Extract the X value from a transfrom. This could come from a translate,
|
||||
// translatex, translate3d or matrix function.
|
||||
pub fn parseTranslateX(value: []const u8) f64 {
|
||||
|
||||
@@ -21,11 +21,9 @@ const std = @import("std");
|
||||
const js = @import("../js/js.zig");
|
||||
|
||||
const Frame = @import("../Frame.zig");
|
||||
const Parser = @import("../parser/Parser.zig");
|
||||
|
||||
const Node = @import("Node.zig");
|
||||
const Document = @import("Document.zig");
|
||||
const HTMLDocument = @import("HTMLDocument.zig");
|
||||
|
||||
const DOMParser = @This();
|
||||
|
||||
@@ -45,42 +43,8 @@ pub fn parseFromString(
|
||||
|
||||
switch (target_mime) {
|
||||
.@"text/html" => {
|
||||
const arena = try frame.getArena(.medium, "DOMParser.parseFromString");
|
||||
defer arena.release();
|
||||
|
||||
// DOMParser builds a detached Document. Borrow the same fragment
|
||||
// parse-mode that `Frame.parse` uses so frame-side hooks
|
||||
// triggered from `Build.created` / `nodeIsReady` (external
|
||||
// stylesheet fetches, script execution, mutation-observer fan-out,
|
||||
// default-script injection) treat the parsed nodes as detached and
|
||||
// skip side effects on the live document. The frame's
|
||||
// `_parse_mode` is restored on exit.
|
||||
const previous_parse_mode = frame._parse_mode;
|
||||
frame._parse_mode = .fragment;
|
||||
defer frame._parse_mode = previous_parse_mode;
|
||||
|
||||
// Create a new HTMLDocument
|
||||
const doc = try frame._factory.document(HTMLDocument{
|
||||
._proto = undefined,
|
||||
});
|
||||
const doc = try Frame.parse.htmlDocument(frame, html, .{});
|
||||
doc.asDocument()._url = frame.url;
|
||||
|
||||
var normalized = std.mem.trim(u8, html, &std.ascii.whitespace);
|
||||
if (normalized.len == 0) {
|
||||
normalized = "<html></html>";
|
||||
}
|
||||
|
||||
// Parse HTML into the document
|
||||
var parser = Parser.init(arena.allocator(), doc.asNode(), frame, .{});
|
||||
parser.parse(normalized);
|
||||
if (parser.terminated) {
|
||||
return error.ExecutionTerminated;
|
||||
}
|
||||
|
||||
if (parser.err) |pe| {
|
||||
return pe.err;
|
||||
}
|
||||
|
||||
return doc.asDocument();
|
||||
},
|
||||
else => {
|
||||
|
||||
@@ -40,6 +40,7 @@ const DOMImplementation = @import("DOMImplementation.zig");
|
||||
const StyleSheetList = @import("css/StyleSheetList.zig");
|
||||
const FontFaceSet = @import("css/FontFaceSet.zig");
|
||||
const Selection = @import("Selection.zig");
|
||||
const Sanitizer = @import("Sanitizer.zig");
|
||||
const XPathResult = @import("XPathResult.zig");
|
||||
const XPathExpression = @import("XPathExpression.zig");
|
||||
|
||||
@@ -1551,6 +1552,16 @@ pub const JsApi = struct {
|
||||
return frame._factory.genericDocument(.{ .url = "about:blank", .charset = "UTF-8" });
|
||||
}
|
||||
|
||||
pub const parseHTML = bridge.function(_parseHTML, .{ .static = true });
|
||||
fn _parseHTML(html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !*Document {
|
||||
return Sanitizer.parseHTML(html, options, true, frame);
|
||||
}
|
||||
|
||||
pub const parseHTMLUnsafe = bridge.function(_parseHTMLUnsafe, .{ .static = true });
|
||||
fn _parseHTMLUnsafe(html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !*Document {
|
||||
return Sanitizer.parseHTML(html, options, false, frame);
|
||||
}
|
||||
|
||||
pub const onselectionchange = bridge.accessor(Document.getOnSelectionChange, Document.setOnSelectionChange, .{});
|
||||
pub const onclick = bridge.accessor(Document.getOnClick, Document.setOnClick, .{});
|
||||
pub const ontouchstart = bridge.accessor(handlerAccessor(.ontouchstart).get, handlerAccessor(.ontouchstart).set, .{});
|
||||
|
||||
@@ -165,12 +165,6 @@ pub fn setInnerHTML(self: *DocumentFragment, html: []const u8, frame: *Frame) !v
|
||||
return parent.setHTML(html, .{}, frame);
|
||||
}
|
||||
|
||||
/// allows declarative shadow dom
|
||||
pub fn setHTMLUnsafe(self: *DocumentFragment, html: []const u8, frame: *Frame) !void {
|
||||
const parent = self.asNode();
|
||||
return parent.setHTML(html, .{ .allow_declarative_shadow = true }, frame);
|
||||
}
|
||||
|
||||
pub fn cloneFragment(self: *DocumentFragment, deep: bool, document: *const Node.Document, frame: *Frame) !*Node {
|
||||
const fragment = try DocumentFragment.init(document, frame);
|
||||
const fragment_node = fragment.asNode();
|
||||
|
||||
@@ -29,6 +29,7 @@ const Node = @import("Node.zig");
|
||||
const ShadowRoot = @import("ShadowRoot.zig");
|
||||
const EventTarget = @import("EventTarget.zig");
|
||||
const collections = @import("collections.zig");
|
||||
const Sanitizer = @import("Sanitizer.zig");
|
||||
|
||||
const Selector = @import("selector/Selector.zig");
|
||||
const Animation = @import("animation/Animation.zig");
|
||||
@@ -627,10 +628,20 @@ pub fn setInnerHTML(self: *Element, html: []const u8, frame: *Frame) !void {
|
||||
return parent.setHTML(html, .{}, frame);
|
||||
}
|
||||
|
||||
pub fn setHTML(self: *Element, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void {
|
||||
return Sanitizer.setAndFilterHTML(self.htmlTarget(), self, html, options, true, frame);
|
||||
}
|
||||
|
||||
/// allows declarative shadow dom
|
||||
pub fn setHTMLUnsafe(self: *Element, html: []const u8, frame: *Frame) !void {
|
||||
const parent = self.asNode();
|
||||
return parent.setHTML(html, .{ .allow_declarative_shadow = true }, frame);
|
||||
pub fn setHTMLUnsafe(self: *Element, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void {
|
||||
return Sanitizer.setAndFilterHTML(self.htmlTarget(), self, html, options, false, frame);
|
||||
}
|
||||
|
||||
fn htmlTarget(self: *Element) *Node {
|
||||
if (self.is(Html.Template)) |template| {
|
||||
return template.getContent().asNode();
|
||||
}
|
||||
return self.asNode();
|
||||
}
|
||||
|
||||
pub fn getId(self: *const Element) ?[]const u8 {
|
||||
@@ -1486,27 +1497,34 @@ pub const Axis = enum {
|
||||
};
|
||||
|
||||
pub fn getElementAxis(self: *Element, frame: *Frame, comptime axis: Axis) Axis.State {
|
||||
if (self.inlineStyle(frame)) |style| {
|
||||
const decl = style.asCSSStyleDeclaration();
|
||||
if (CSS.parseDimensionViewport(decl.getPropertyValue(@tagName(axis), frame), frame)) |v| {
|
||||
const tag = self.getTag();
|
||||
const root = tag == .html or tag == .body;
|
||||
|
||||
if (self.ownerFrame(frame)) |owner| {
|
||||
const style_manager = &owner._style_manager;
|
||||
// Roots take only an inline size: a sheet's `height: 100vh` on body
|
||||
// would shrink the box every synthetic position must fit in.
|
||||
const size = if (root) style_manager.inlineSize(self, axis) else style_manager.declaredSize(self, axis);
|
||||
if (size) |v| {
|
||||
return .{ .value = v, .explicit = true };
|
||||
}
|
||||
}
|
||||
|
||||
switch (self.getTag()) {
|
||||
// Root containers get large default size to contain descendant positions.
|
||||
// With calculateDocumentPosition using linear depth scaling (100px per level),
|
||||
// even very deep trees (100 levels) stay within 10,000px.
|
||||
// 100M pixels is plausible for very long documents.
|
||||
.html, .body => return .{ .value = if (axis == .width) 1920.0 else 100_000_000.0 },
|
||||
.img, .iframe => {
|
||||
if (self.getAttributeSafe(comptime .wrap(@tagName(axis)))) |attr| {
|
||||
if (std.fmt.parseFloat(f64, attr)) |parsed| {
|
||||
return .{ .value = parsed, .explicit = true };
|
||||
} else |_| {}
|
||||
}
|
||||
},
|
||||
else => {},
|
||||
// Root containers get large default size to contain descendant positions.
|
||||
// With calculateDocumentPosition using linear depth scaling (100px per level),
|
||||
// even very deep trees (100 levels) stay within 10,000px.
|
||||
// 100M pixels is plausible for very long documents.
|
||||
if (root) {
|
||||
return .{ .value = if (axis == .width) 1920.0 else 100_000_000.0 };
|
||||
}
|
||||
|
||||
// Presentational attributes lose to CSS sizes.
|
||||
if (tag == .img or tag == .iframe) {
|
||||
if (self.getAttributeSafe(comptime .wrap(@tagName(axis)))) |attr| {
|
||||
if (std.fmt.parseFloat(f64, attr)) |parsed| {
|
||||
return .{ .value = parsed, .explicit = true };
|
||||
} else |_| {}
|
||||
}
|
||||
}
|
||||
|
||||
return .{ .value = 5.0 };
|
||||
@@ -2662,6 +2680,7 @@ pub const JsApi = struct {
|
||||
pub const assignedSlot = bridge.accessor(Element.getAssignedSlot, null, .{});
|
||||
pub const attachShadow = bridge.function(_attachShadow, .{});
|
||||
pub const insertAdjacentHTML = bridge.function(Element.insertAdjacentHTML, .{ .ce_reactions = true });
|
||||
pub const setHTML = bridge.function(Element.setHTML, .{ .ce_reactions = true });
|
||||
pub const setHTMLUnsafe = bridge.function(Element.setHTMLUnsafe, .{ .ce_reactions = true });
|
||||
pub const insertAdjacentElement = bridge.function(Element.insertAdjacentElement, .{ .ce_reactions = true });
|
||||
pub const insertAdjacentText = bridge.function(Element.insertAdjacentText, .{ .ce_reactions = true });
|
||||
|
||||
@@ -1613,6 +1613,28 @@ pub fn setHTML(self: *Node, html: []const u8, opts: Frame.parse.FragmentParseOpt
|
||||
}
|
||||
}
|
||||
|
||||
pub fn replaceAllWithFragment(self: *Node, fragment: *Node, frame: *Frame) !void {
|
||||
frame.domChanged();
|
||||
|
||||
const notify = Frame.observers.hasMutationObservers(frame);
|
||||
var added: std.ArrayList(*Node) = .empty;
|
||||
if (notify) {
|
||||
var it = fragment.childrenIterator();
|
||||
while (it.next()) |child| {
|
||||
try added.append(frame.call_arena, child);
|
||||
}
|
||||
}
|
||||
|
||||
const removed = try self.removeAllChildrenCollecting(notify, frame);
|
||||
try frame.moveAllChildren(fragment, self, null, .silent_parent);
|
||||
|
||||
if (notify and (removed.items.len > 0 or added.items.len > 0)) {
|
||||
// The point here is to batch all of the adds/remove and get a combined
|
||||
// mutation record
|
||||
Frame.observers.notifyChildListChange(frame, self, added.items, removed.items, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
// Writes a JSON representation of the node and its children
|
||||
pub fn jsonStringify(self: *const Node, writer: *std.json.Stringify) !void {
|
||||
// stupid json api requires this to be const,
|
||||
|
||||
@@ -30,7 +30,11 @@ const lp = @import("lightpanda");
|
||||
|
||||
const js = @import("../js/js.zig");
|
||||
const Page = @import("../Page.zig");
|
||||
const Frame = @import("../Frame.zig");
|
||||
|
||||
const Node = @import("Node.zig");
|
||||
const Element = @import("Element.zig");
|
||||
const TreeWalker = @import("TreeWalker.zig");
|
||||
const defaults = @import("sanitizer_defaults.zig");
|
||||
|
||||
const String = lp.String;
|
||||
@@ -221,6 +225,10 @@ const Config = struct {
|
||||
|
||||
// ?js.Value because not provided, undefined and null are all handled differently
|
||||
pub fn init(configuration_: ?js.Value, exec: *const Execution) !*Sanitizer {
|
||||
return create(configuration_, true, exec);
|
||||
}
|
||||
|
||||
fn create(configuration_: ?js.Value, permissive_defaults: bool, exec: *const Execution) !*Sanitizer {
|
||||
const arena = try exec.getPinnedArena(.small, "Sanitizer");
|
||||
errdefer arena.release();
|
||||
|
||||
@@ -247,7 +255,7 @@ pub fn init(configuration_: ?js.Value, exec: *const Execution) !*Sanitizer {
|
||||
}
|
||||
|
||||
const config: Config = if (configuration.isNull()) .{} else try configuration.toZig(Config);
|
||||
if (try self.setFromConfig(config) == false) {
|
||||
if (try self.setFromConfig(config, permissive_defaults) == false) {
|
||||
return exec.js.typeError("invalid Sanitizer configuration");
|
||||
}
|
||||
}
|
||||
@@ -301,7 +309,7 @@ fn setFromDefault(self: *Sanitizer) !void {
|
||||
self._javascript_urls = false;
|
||||
}
|
||||
|
||||
fn setFromConfig(self: *Sanitizer, config: Config) !bool {
|
||||
fn setFromConfig(self: *Sanitizer, config: Config, permissive_defaults: bool) !bool {
|
||||
var all_new = true;
|
||||
|
||||
const arena = self._arena;
|
||||
@@ -348,11 +356,11 @@ fn setFromConfig(self: *Sanitizer, config: Config) !bool {
|
||||
self._remove_processing_instructions = try self.targetSet(pis, &all_new);
|
||||
}
|
||||
|
||||
self._comments = Config.boolean(config.comments, true);
|
||||
self._comments = Config.boolean(config.comments, permissive_defaults);
|
||||
if (self._allow_attributes != null or config.dataAttributes != null) {
|
||||
self._data_attributes = Config.boolean(config.dataAttributes, true);
|
||||
self._data_attributes = Config.boolean(config.dataAttributes, permissive_defaults);
|
||||
}
|
||||
self._javascript_urls = Config.boolean(config.javascriptURLs, true);
|
||||
self._javascript_urls = Config.boolean(config.javascriptURLs, permissive_defaults);
|
||||
|
||||
if (config.elements == null and config.removeElements == null) {
|
||||
self._remove_elements = .empty;
|
||||
@@ -361,7 +369,11 @@ fn setFromConfig(self: *Sanitizer, config: Config) !bool {
|
||||
self._remove_attributes = .empty;
|
||||
}
|
||||
if (self._allow_processing_instructions == null and self._remove_processing_instructions == null) {
|
||||
self._remove_processing_instructions = .empty;
|
||||
if (permissive_defaults) {
|
||||
self._remove_processing_instructions = .empty;
|
||||
} else {
|
||||
self._allow_processing_instructions = .empty;
|
||||
}
|
||||
}
|
||||
|
||||
return all_new and self.isValid();
|
||||
@@ -992,6 +1004,379 @@ fn hasDataAttribute(set: NameSet) bool {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Like init: we need to tell the difference between not-set, null and undefined
|
||||
// AND, this can actually be a Sanitizer config already.
|
||||
pub const Options = struct {
|
||||
sanitizer: ?js.Value = null,
|
||||
};
|
||||
|
||||
const FromOptions = struct {
|
||||
owned: bool,
|
||||
sanitizer: *Sanitizer,
|
||||
|
||||
fn release(self: FromOptions, page: *Page) void {
|
||||
if (self.owned) {
|
||||
// We have to free a Sanitizer we created, versus a Sanitizer that
|
||||
// was passed to use from JS.
|
||||
self.sanitizer.deinit(page);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
fn fromOptions(options: ?Options, safe: bool, exec: *const Execution) !?FromOptions {
|
||||
const spec = blk: {
|
||||
const o = options orelse break :blk null;
|
||||
const spec = o.sanitizer orelse break :blk null;
|
||||
if (spec.isUndefined()) {
|
||||
break :blk null;
|
||||
}
|
||||
if (spec.toZig(*Sanitizer)) |sanitizer| {
|
||||
return .{ .sanitizer = sanitizer, .owned = false };
|
||||
} else |_| {}
|
||||
break :blk spec;
|
||||
};
|
||||
|
||||
if (spec == null and safe == false) {
|
||||
return null;
|
||||
}
|
||||
// A missing spec takes the "default" preset
|
||||
return .{ .sanitizer = try create(spec, safe == false, exec), .owned = true };
|
||||
}
|
||||
|
||||
pub fn setAndFilterHTML(target: *Node, context: *Element, html: []const u8, options: ?Options, safe: bool, frame: *Frame) !void {
|
||||
if (safe and std.mem.eql(u8, context.getLocalName(), "script")) {
|
||||
if (context._namespace == .html or context._namespace == .svg) {
|
||||
// hahaha, nice try!
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const resolved = try fromOptions(options, safe, &frame.js.execution);
|
||||
defer if (resolved) |r| r.release(frame.page);
|
||||
|
||||
// Parsed into a detached fragment, so that nothing is connected (no fetch,
|
||||
// no custom element reaction) until it's been sanitized.
|
||||
const fragment = (try Node.DocumentFragment.init(target.getDocument(frame), frame)).asNode();
|
||||
if (html.len > 0) {
|
||||
try Frame.parse.fragment(frame, fragment, html, .{ .context = context, .allow_declarative_shadow = true });
|
||||
}
|
||||
if (resolved) |r| {
|
||||
try r.sanitizer.sanitize(fragment, safe, frame);
|
||||
}
|
||||
try target.replaceAllWithFragment(fragment, frame);
|
||||
}
|
||||
|
||||
pub fn parseHTML(html: []const u8, options: ?Options, safe: bool, frame: *Frame) !*Node.Document {
|
||||
const resolved = try fromOptions(options, safe, &frame.js.execution);
|
||||
defer if (resolved) |r| r.release(frame.page);
|
||||
|
||||
const document = (try Frame.parse.htmlDocument(frame, html, .{ .allow_declarative_shadow = true })).asDocument();
|
||||
document._url = "about:blank";
|
||||
if (resolved) |r| {
|
||||
try r.sanitizer.sanitize(document.asNode(), safe, frame);
|
||||
}
|
||||
return document;
|
||||
}
|
||||
|
||||
fn sanitize(self: *const Sanitizer, root: *Node, safe: bool, frame: *Frame) !void {
|
||||
const arena = frame.call_arena;
|
||||
|
||||
// A template's contents and a shadow root are trees of their own
|
||||
var trees: std.ArrayList(*Node) = .empty;
|
||||
try trees.append(arena, root);
|
||||
|
||||
var remove_attributes: std.ArrayList([]const u8) = .empty;
|
||||
|
||||
// Parents that lost a child, whose text nodes might now be adjacent.
|
||||
var touched: std.ArrayList(*Node) = .empty;
|
||||
|
||||
while (trees.pop()) |tree| {
|
||||
var tw = TreeWalker.FullExcludeSelf.init(tree, .{});
|
||||
while (tw.next()) |node| {
|
||||
const parent = node._parent.?;
|
||||
const element = node.is(Element) orelse {
|
||||
if (self.keepNonElement(node) == false) {
|
||||
tw.skipChildren();
|
||||
frame.removeNode(parent, node, .{ .reconnect_to = null });
|
||||
try touch(&touched, parent, arena);
|
||||
}
|
||||
continue;
|
||||
};
|
||||
|
||||
const element_name: Name = .{ .name = .wrap(element.getLocalName()), .namespace = elementNamespace(element, frame) };
|
||||
switch (self.elementAction(element_name, safe)) {
|
||||
.keep => {},
|
||||
.remove => {
|
||||
tw.skipChildren();
|
||||
frame.removeNode(parent, node, .{ .reconnect_to = null });
|
||||
try touch(&touched, parent, arena);
|
||||
continue;
|
||||
},
|
||||
.replace => {
|
||||
// Move the children up; the walker's next node is the
|
||||
// first of them (or, if there are none, what follows).
|
||||
// run_ready = false: nothing gets to act on them until
|
||||
// they've been sanitized.
|
||||
if (node.firstChild() != null) {
|
||||
const previous_root = node.getRootNode(.{});
|
||||
while (node.firstChild()) |child| {
|
||||
frame.removeNode(node, child, .{ .reconnect_to = parent });
|
||||
try frame.insertNodeRelative(parent, child, .{ .before = node }, .{ .previous_root = previous_root, .run_ready = false });
|
||||
}
|
||||
}
|
||||
frame.removeNode(parent, node, .{ .reconnect_to = null });
|
||||
try touch(&touched, parent, arena);
|
||||
continue;
|
||||
},
|
||||
}
|
||||
|
||||
if (element.is(Element.Html.Template)) |template| {
|
||||
try trees.append(arena, template.getContent().asNode());
|
||||
}
|
||||
if (element.hostedShadowRoot(frame)) |shadow_root| {
|
||||
try trees.append(arena, shadow_root.asNode());
|
||||
}
|
||||
|
||||
// Collected first: removing one can run script (attributeChangedCallback)
|
||||
remove_attributes.clearRetainingCapacity();
|
||||
for (element.attributeEntries()) |*entry| {
|
||||
if (self.keepAttribute(element_name, entry.name(), entry.value(), safe) == false) {
|
||||
try remove_attributes.append(arena, entry.name());
|
||||
}
|
||||
}
|
||||
for (remove_attributes.items) |name| {
|
||||
element.removeAttributeSafe(.wrap(name), frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var buffer: std.ArrayList(u8) = .empty;
|
||||
for (touched.items) |parent| {
|
||||
try mergeAdjacentText(parent, &buffer, frame);
|
||||
}
|
||||
}
|
||||
|
||||
fn touch(touched: *std.ArrayList(*Node), parent: *Node, arena: Allocator) !void {
|
||||
// Siblings are removed one after another, so this catches most repeats.
|
||||
// Those it misses just get a second, no-op, merge.
|
||||
if (touched.getLastOrNull() != parent) {
|
||||
try touched.append(arena, parent);
|
||||
}
|
||||
}
|
||||
|
||||
// if we removed a node between two text nodes, we need to merge the text ndoes
|
||||
|
||||
fn mergeAdjacentText(parent: *Node, buffer: *std.ArrayList(u8), frame: *Frame) !void {
|
||||
var child = parent.firstChild();
|
||||
while (child) |node| {
|
||||
var next = node.nextSibling();
|
||||
const text = node.is(Node.CData.Text) orelse {
|
||||
child = next;
|
||||
continue;
|
||||
};
|
||||
if (next == null or next.?.is(Node.CData.Text) == null) {
|
||||
child = next;
|
||||
continue;
|
||||
}
|
||||
|
||||
buffer.clearRetainingCapacity();
|
||||
try buffer.appendSlice(frame.call_arena, text.ownData());
|
||||
while (next) |sibling| {
|
||||
const sibling_text = sibling.is(Node.CData.Text) orelse break;
|
||||
try buffer.appendSlice(frame.call_arena, sibling_text.ownData());
|
||||
next = sibling.nextSibling();
|
||||
frame.removeNode(parent, sibling, .{ .reconnect_to = null });
|
||||
}
|
||||
text.asCData()._data = try frame.dupeSSO(buffer.items);
|
||||
child = next;
|
||||
}
|
||||
}
|
||||
|
||||
fn keepNonElement(self: *const Sanitizer, node: *Node) bool {
|
||||
const cdata = node.is(Node.CData) orelse return true; // doctype
|
||||
return switch (cdata._type) {
|
||||
.text, .cdata_section => true,
|
||||
.comment => self._comments == true,
|
||||
.processing_instruction => {
|
||||
const target = cdata.subtype(Node.CData.ProcessingInstruction)._target;
|
||||
if (self._allow_processing_instructions) |allowed| {
|
||||
return allowed.contains(target);
|
||||
}
|
||||
return self._remove_processing_instructions.?.contains(target) == false;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
fn elementAction(self: *const Sanitizer, name: Name, safe: bool) enum { keep, remove, replace } {
|
||||
if (safe) {
|
||||
for (defaults.baseline_remove_elements) |unsafe| {
|
||||
if (staticName(unsafe).eql(name)) {
|
||||
return .remove;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (self._replace_elements) |replace| {
|
||||
if (replace.contains(name)) {
|
||||
return .replace;
|
||||
}
|
||||
}
|
||||
if (self._allow_elements) |allowed| {
|
||||
return if (allowed.contains(name)) .keep else .remove;
|
||||
}
|
||||
return if (self._remove_elements.?.contains(name)) .remove else .keep;
|
||||
}
|
||||
|
||||
fn keepAttribute(self: *const Sanitizer, element: Name, qualified_name: []const u8, value: []const u8, safe: bool) bool {
|
||||
const name = attributeName(element.namespace, qualified_name);
|
||||
|
||||
const element_allowed = self._element_allow_attributes.getPtr(element);
|
||||
if (self._element_remove_attributes.getPtr(element)) |removed| {
|
||||
if (removed.contains(name)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (self._allow_attributes) |allowed| {
|
||||
if (allowed.contains(name) == false and
|
||||
(element_allowed == null or element_allowed.?.contains(name) == false) and
|
||||
(self._data_attributes != true or name.isDataAttribute() == false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (element_allowed) |set| {
|
||||
if (set.contains(name) == false) {
|
||||
return false;
|
||||
}
|
||||
} else if (self._remove_attributes.?.contains(name)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (safe and name.namespace == .none and isEventHandler(qualified_name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (safe or self._javascript_urls != true) {
|
||||
if (isNavigatingURLAttribute(element, name) and isJavascriptURL(value)) {
|
||||
return false;
|
||||
}
|
||||
if (isAnimatingURLAttribute(element, name) and (std.mem.eql(u8, value, "href") or std.mem.eql(u8, value, "xlink:href"))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
fn elementNamespace(element: *Element, frame: *Frame) Namespace {
|
||||
return switch (element._namespace) {
|
||||
.html => .xhtml,
|
||||
.svg => .svg,
|
||||
.mathml => .mathml,
|
||||
.xml => .xml,
|
||||
.null => .none,
|
||||
.unknown => .intern(element.getNamespaceUri(frame)),
|
||||
};
|
||||
}
|
||||
|
||||
// Attributes' namespaces aren't tracked, but the HTML parser only ever gives a
|
||||
// namespace to these attributes of foreign (SVG/MathML) elements.
|
||||
// https://html.spec.whatwg.org/#adjust-foreign-attributes
|
||||
const foreign_attributes = std.StaticStringMap(defaults.Name).initComptime(.{
|
||||
.{ "xlink:actuate", defaults.Name{ .name = "actuate", .namespace = .xlink } },
|
||||
.{ "xlink:arcrole", defaults.Name{ .name = "arcrole", .namespace = .xlink } },
|
||||
.{ "xlink:href", defaults.Name{ .name = "href", .namespace = .xlink } },
|
||||
.{ "xlink:role", defaults.Name{ .name = "role", .namespace = .xlink } },
|
||||
.{ "xlink:show", defaults.Name{ .name = "show", .namespace = .xlink } },
|
||||
.{ "xlink:title", defaults.Name{ .name = "title", .namespace = .xlink } },
|
||||
.{ "xlink:type", defaults.Name{ .name = "type", .namespace = .xlink } },
|
||||
.{ "xml:lang", defaults.Name{ .name = "lang", .namespace = .xml } },
|
||||
.{ "xml:space", defaults.Name{ .name = "space", .namespace = .xml } },
|
||||
.{ "xmlns", defaults.Name{ .name = "xmlns", .namespace = .xmlns } },
|
||||
.{ "xmlns:xlink", defaults.Name{ .name = "xlink", .namespace = .xmlns } },
|
||||
});
|
||||
|
||||
fn attributeName(element_namespace: Namespace, qualified_name: []const u8) Name {
|
||||
if (element_namespace == .svg or element_namespace == .mathml) {
|
||||
if (foreign_attributes.get(qualified_name)) |name| {
|
||||
return staticName(name);
|
||||
}
|
||||
}
|
||||
return .{ .name = .wrap(qualified_name), .namespace = .none };
|
||||
}
|
||||
|
||||
fn isEventHandler(name: []const u8) bool {
|
||||
if (std.mem.startsWith(u8, name, "on") == false) {
|
||||
return false;
|
||||
}
|
||||
return std.sort.binarySearch([]const u8, defaults.event_handler_attributes, name, struct {
|
||||
fn order(key: []const u8, item: []const u8) std.math.Order {
|
||||
return std.mem.order(u8, key, item);
|
||||
}
|
||||
}.order) != null;
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/#built-in-navigating-url-attributes-list
|
||||
fn isNavigatingURLAttribute(element: Name, attribute: Name) bool {
|
||||
const local = attribute.name.str();
|
||||
switch (element.namespace) {
|
||||
.xhtml => {
|
||||
if (attribute.namespace != .none) {
|
||||
return false;
|
||||
}
|
||||
const tag = element.name.str();
|
||||
if (std.mem.eql(u8, tag, "a") or std.mem.eql(u8, tag, "area")) {
|
||||
return std.mem.eql(u8, local, "href");
|
||||
}
|
||||
if (std.mem.eql(u8, tag, "form")) {
|
||||
return std.mem.eql(u8, local, "action");
|
||||
}
|
||||
if (std.mem.eql(u8, tag, "button") or std.mem.eql(u8, tag, "input")) {
|
||||
return std.mem.eql(u8, local, "formaction");
|
||||
}
|
||||
return false;
|
||||
},
|
||||
// any MathML element, not just <a>
|
||||
.svg, .mathml => {
|
||||
if (element.namespace == .svg and std.mem.eql(u8, element.name.str(), "a") == false) {
|
||||
return false;
|
||||
}
|
||||
return (attribute.namespace == .none or attribute.namespace == .xlink) and std.mem.eql(u8, local, "href");
|
||||
},
|
||||
else => return false,
|
||||
}
|
||||
}
|
||||
|
||||
fn isAnimatingURLAttribute(element: Name, attribute: Name) bool {
|
||||
if (element.namespace != .svg or attribute.namespace != .none) {
|
||||
return false;
|
||||
}
|
||||
if (std.mem.eql(u8, attribute.name.str(), "attributeName") == false) {
|
||||
return false;
|
||||
}
|
||||
const tag = element.name.str();
|
||||
return std.mem.eql(u8, tag, "animate") or std.mem.eql(u8, tag, "animateTransform") or std.mem.eql(u8, tag, "set");
|
||||
}
|
||||
|
||||
fn isJavascriptURL(value: []const u8) bool {
|
||||
const trimmed = std.mem.trimStart(u8, value, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ");
|
||||
const scheme = "javascript:";
|
||||
var i: usize = 0;
|
||||
for (trimmed) |c| {
|
||||
if (c == '\t' or c == '\n' or c == '\r') {
|
||||
continue;
|
||||
}
|
||||
if (std.ascii.toLower(c) != scheme[i]) {
|
||||
return false;
|
||||
}
|
||||
i += 1;
|
||||
if (i == scheme.len) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
pub const JsApi = struct {
|
||||
pub const bridge = js.Bridge(Sanitizer);
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ const Frame = @import("../Frame.zig");
|
||||
|
||||
const Node = @import("Node.zig");
|
||||
const Element = @import("Element.zig");
|
||||
const Sanitizer = @import("Sanitizer.zig");
|
||||
const DocumentFragment = @import("DocumentFragment.zig");
|
||||
|
||||
const ShadowRoot = @This();
|
||||
@@ -110,8 +111,12 @@ fn getSerializable(self: *const ShadowRoot) bool {
|
||||
return self._serializable;
|
||||
}
|
||||
|
||||
pub fn setHTMLUnsafe(self: *ShadowRoot, html: []const u8, frame: *Frame) !void {
|
||||
return self.asDocumentFragment().setHTMLUnsafe(html, frame);
|
||||
pub fn setHTML(self: *ShadowRoot, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void {
|
||||
return Sanitizer.setAndFilterHTML(self.asNode(), self._host, html, options, true, frame);
|
||||
}
|
||||
|
||||
pub fn setHTMLUnsafe(self: *ShadowRoot, html: []const u8, options: ?Sanitizer.Options, frame: *Frame) !void {
|
||||
return Sanitizer.setAndFilterHTML(self.asNode(), self._host, html, options, false, frame);
|
||||
}
|
||||
|
||||
pub fn getHTML(self: *ShadowRoot, opts: dump.Opts.Shadow.Declarative, writer: *std.Io.Writer, frame: *Frame) !void {
|
||||
@@ -219,6 +224,7 @@ pub const JsApi = struct {
|
||||
return self.getElementById(try value.toZig([]const u8), frame);
|
||||
}
|
||||
pub const adoptedStyleSheets = bridge.accessor(ShadowRoot.getAdoptedStyleSheets, ShadowRoot.setAdoptedStyleSheets, .{});
|
||||
pub const setHTML = bridge.function(ShadowRoot.setHTML, .{ .ce_reactions = true });
|
||||
pub const setHTMLUnsafe = bridge.function(ShadowRoot.setHTMLUnsafe, .{ .ce_reactions = true });
|
||||
pub const getHTML = bridge.function(_getHTML, .{});
|
||||
const GetHTMLOpts = struct {
|
||||
|
||||
+16
-3
@@ -297,12 +297,22 @@
|
||||
\\ it to PATH, instead of printing the answer. Replay it later with
|
||||
\\ `run PATH` (no LLM calls). Overwrites PATH if it exists.
|
||||
\\ Requires --task.
|
||||
\\ --search-engine <ENGINE>
|
||||
\\ Which web search API the `search` tool uses. Default: auto,
|
||||
\\ which takes the first with a key in the environment, in the
|
||||
\\ order brave, tavily, exa, keenable. `keenable` also works with
|
||||
\\ no key at all, through a rate-limited public endpoint.
|
||||
\\ Allowed values: auto, brave, tavily, exa, keenable.
|
||||
\\ --system-prompt <STRING>
|
||||
\\ Override the default system prompt.
|
||||
\\ --task <STRING>
|
||||
\\ One-shot mode: run a single user turn, print the final answer
|
||||
\\ to stdout, and exit. Conflicts with the positional script. With
|
||||
\\ --save, the answer is suppressed and a script is written instead.
|
||||
\\ --url <URL>
|
||||
\\ Open this page before the first turn. With --task it saves the
|
||||
\\ model a turn spent navigating; with --save the opening
|
||||
\\ navigation is the first line of the script.
|
||||
\\ --verbosity <LEVEL>
|
||||
\\ Stderr chatter level. Default: high when --task captures stderr
|
||||
\\ to a pipe or file; low otherwise. low/medium also raise
|
||||
@@ -396,6 +406,9 @@
|
||||
\\ --cookie-jar <PATH>
|
||||
\\ Path to a JSON file to save cookies to on exit (write-only).
|
||||
\\ Defaults to no cookie saving.
|
||||
\\ --cors-store-entry-limit <INT>
|
||||
\\ Maximum number of entries kept in the CorsStore. 0 means no limit.
|
||||
\\ Defaults to 1000.
|
||||
\\ --experimental-features <FEATURE>
|
||||
\\ Enable an experimental, unstable feature. Can be passed multiple times.
|
||||
\\ Behavior may change or be removed without notice.
|
||||
@@ -502,12 +515,12 @@
|
||||
\\ --obey-robots
|
||||
\\ Fetches and obeys robots.txt of the target page.
|
||||
\\ Defaults to false.
|
||||
\\ --robot-store-entry-limit <INT>
|
||||
\\ Maximum number of entries kept in the RobotStore. 0 means no limit.
|
||||
\\ Defaults to 1000.
|
||||
\\ --proxy-bearer-token <TOKEN>
|
||||
\\ Token sent for bearer authentication with the proxy:
|
||||
\\ Proxy-Authorization: Bearer <token>.
|
||||
\\ --robot-store-entry-limit <INT>
|
||||
\\ Maximum number of entries kept in the RobotStore. 0 means no limit.
|
||||
\\ Defaults to 1000.
|
||||
\\ --timezone <IANA>
|
||||
\\ Time zone used by Date and Intl, e.g. Europe/Paris or UTC.
|
||||
\\ Defaults to the host time zone.
|
||||
|
||||
@@ -1196,6 +1196,18 @@ test "MCP - Actions: click, fill, scroll, hover, press, selectOption, setChecked
|
||||
out.clearRetainingCapacity();
|
||||
}
|
||||
|
||||
// A selector targets the element as a backendNodeId does.
|
||||
{
|
||||
const outer = frame.document.getElementById("outerscroll", frame).?.asNode();
|
||||
const outer_id = (try server.active_session.registry.register(outer)).id;
|
||||
try router.handleMessage(server, aa,
|
||||
\\{"jsonrpc":"2.0","id":41,"method":"tools/call","params":{"name":"scroll","arguments":{"selector":"#innerleaf","y":30}}}
|
||||
);
|
||||
const expected = try std.fmt.allocPrint(aa, "Scrolled scroll container (backendNodeId: {d}) of element (selector: #innerleaf) to x: 0, y: 30", .{outer_id});
|
||||
try testing.expect(std.mem.indexOf(u8, out.written(), expected) != null);
|
||||
out.clearRetainingCapacity();
|
||||
}
|
||||
|
||||
// The container may be declared in a stylesheet rather than inline.
|
||||
{
|
||||
const leaf = frame.document.getElementById("sheetleaf", frame).?.asNode();
|
||||
|
||||
@@ -64,6 +64,15 @@ pub fn ClockCache(comptime V: type) type {
|
||||
return &entry.value;
|
||||
}
|
||||
|
||||
pub fn remove(self: *Self, key: []const u8) ?V {
|
||||
const index = self.map.getIndex(key) orelse return null;
|
||||
const owned_key = self.map.keys()[index];
|
||||
const value = self.map.values()[index].value;
|
||||
self.map.swapRemoveAt(index);
|
||||
self.allocator.free(owned_key);
|
||||
return value;
|
||||
}
|
||||
|
||||
pub fn insert(self: *Self, key: []const u8, value: V) !InsertResult {
|
||||
const gop = try self.map.getOrPut(self.allocator, key);
|
||||
if (gop.found_existing) return .exists;
|
||||
|
||||
+119
-29
@@ -25,11 +25,15 @@ const http = @import("http.zig");
|
||||
const Transfer = @import("HttpClient.zig").Transfer;
|
||||
const SingleFlight = @import("SingleFlight.zig");
|
||||
const HttpClient = @import("HttpClient.zig");
|
||||
const Network = @import("Network.zig");
|
||||
|
||||
const CorsStore = @import("CorsStore.zig");
|
||||
|
||||
const log = lp.log;
|
||||
|
||||
const CorsGate = @This();
|
||||
|
||||
network: *Network,
|
||||
single_flight: SingleFlight,
|
||||
|
||||
// CORS Request Headers
|
||||
@@ -42,6 +46,7 @@ const ACCESS_CONTROL_ALLOW_ORIGIN = "access-control-allow-origin";
|
||||
const ACCESS_CONTROL_ALLOW_METHODS = "access-control-allow-methods";
|
||||
const ACCESS_CONTROL_ALLOW_HEADERS = "access-control-allow-headers";
|
||||
const ACCESS_CONTROL_ALLOW_CREDENTIALS = "access-control-allow-credentials";
|
||||
const ACCESS_CONTROL_MAX_AGE = "access-control-max-age";
|
||||
|
||||
pub fn deinit(self: *CorsGate) void {
|
||||
self.single_flight.deinit();
|
||||
@@ -72,7 +77,7 @@ fn flushPending(self: *CorsGate, key: []const u8, allowed: bool) void {
|
||||
}
|
||||
}
|
||||
|
||||
fn isSafelistedMethod(value: http.Method) bool {
|
||||
pub fn isSafelistedMethod(value: http.Method) bool {
|
||||
return switch (value) {
|
||||
.GET, .HEAD, .POST => true,
|
||||
else => false,
|
||||
@@ -212,6 +217,28 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result {
|
||||
return .allowed;
|
||||
}
|
||||
|
||||
const wants_credentials = req.credentials_mode == .include;
|
||||
|
||||
const authored = try collectAuthoredHeaders(transfer, transfer.arena.allocator());
|
||||
|
||||
const covered = try self.network.cors_store.coversRequest(
|
||||
transfer.arena.allocator(),
|
||||
.{ .origin = origin, .target = req.url, .credentials = wants_credentials },
|
||||
req.method,
|
||||
authored.items,
|
||||
);
|
||||
|
||||
if (covered) {
|
||||
log.debug(.cors, "cross origin", .{
|
||||
.url = req.url,
|
||||
.origin = origin,
|
||||
.preflight = false,
|
||||
.cached = true,
|
||||
});
|
||||
lp.metrics.cors_check.incr(.cached);
|
||||
return .allowed;
|
||||
}
|
||||
|
||||
log.debug(.cors, "cross origin", .{
|
||||
.url = req.url,
|
||||
.origin = origin,
|
||||
@@ -219,10 +246,25 @@ pub fn check(self: *CorsGate, transfer: *Transfer) !Result {
|
||||
});
|
||||
lp.metrics.cors_check.incr(.preflight);
|
||||
|
||||
try self.fetchThenResume(transfer);
|
||||
try self.fetchThenResume(transfer, authored.items);
|
||||
return .pending;
|
||||
}
|
||||
|
||||
fn collectAuthoredHeaders(transfer: *Transfer, allocator: std.mem.Allocator) !std.ArrayList([]const u8) {
|
||||
var header_names: std.ArrayList([]const u8) = .empty;
|
||||
for (transfer.req_headers.items) |hdr| {
|
||||
if (hdr.source != .author) continue;
|
||||
if (isSafelistedHeader(hdr.name, hdr.value)) continue;
|
||||
try header_names.append(allocator, try std.ascii.allocLowerString(allocator, hdr.name));
|
||||
}
|
||||
std.mem.sort([]const u8, header_names.items, {}, struct {
|
||||
fn lessThan(_: void, a: []const u8, b: []const u8) bool {
|
||||
return std.mem.lessThan(u8, a, b);
|
||||
}
|
||||
}.lessThan);
|
||||
return header_names;
|
||||
}
|
||||
|
||||
const CorsKey = struct {
|
||||
url: []const u8,
|
||||
origin: []const u8,
|
||||
@@ -264,6 +306,9 @@ const CorsPreflightContext = struct {
|
||||
wants_credentials: bool,
|
||||
|
||||
allowed: bool = false,
|
||||
acam: ?[]const u8 = null,
|
||||
acah: ?[]const u8 = null,
|
||||
acma: ?[]const u8 = null,
|
||||
|
||||
fn validateHeaders(
|
||||
self: *CorsPreflightContext,
|
||||
@@ -355,6 +400,57 @@ const CorsPreflightContext = struct {
|
||||
return true;
|
||||
}
|
||||
|
||||
fn cacheGrant(self: *CorsPreflightContext, acam: ?[]const u8, acah: ?[]const u8, acma: ?[]const u8) !void {
|
||||
if (self.url.len == 0) return;
|
||||
|
||||
const max_age_s: u64 = blk: {
|
||||
const v = acma orelse break :blk 5;
|
||||
if (v.len == 0) break :blk 5;
|
||||
break :blk std.fmt.parseUnsigned(u64, v, 10) catch return;
|
||||
};
|
||||
if (max_age_s == 0) return;
|
||||
|
||||
const capped_s: u64 = @min(max_age_s, 7200);
|
||||
const capped_ms = capped_s * 1000;
|
||||
|
||||
const methods_wildcard = acam != null and std.mem.eql(u8, acam.?, "*") and !self.wants_credentials;
|
||||
var methods = std.EnumSet(http.Method).initEmpty();
|
||||
if (!methods_wildcard) {
|
||||
if (acam) |list| {
|
||||
var it = std.mem.splitScalar(u8, list, ',');
|
||||
while (it.next()) |raw| {
|
||||
const token = std.mem.trim(u8, raw, &std.ascii.whitespace);
|
||||
if (std.meta.stringToEnum(http.Method, token)) |m| methods.insert(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const headers_wildcard = acah != null and std.mem.eql(u8, acah.?, "*") and !self.wants_credentials;
|
||||
|
||||
var allowed_headers: std.ArrayList([]const u8) = .empty;
|
||||
if (!headers_wildcard) {
|
||||
if (acah) |list| {
|
||||
var it = std.mem.splitScalar(u8, list, ',');
|
||||
while (it.next()) |raw| {
|
||||
const token = std.mem.trim(u8, raw, &std.ascii.whitespace);
|
||||
if (token.len == 0) continue;
|
||||
try allowed_headers.append(self.arena.allocator(), token);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try self.gate.network.cors_store.put(
|
||||
.{ .origin = self.origin, .target = self.url, .credentials = self.wants_credentials },
|
||||
.{
|
||||
.methods_wildcard = methods_wildcard,
|
||||
.methods = methods,
|
||||
.headers_wildcard = headers_wildcard,
|
||||
.headers = allowed_headers.items,
|
||||
.expires_at = lp.datetime.milliTimestamp(.real) + capped_ms,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
fn methodAllowed(list: []const u8, method: http.Method) bool {
|
||||
const method_name = @tagName(method);
|
||||
var it = std.mem.splitScalar(u8, list, ',');
|
||||
@@ -393,6 +489,7 @@ const CorsPreflightContext = struct {
|
||||
var acam: ?[]const u8 = null;
|
||||
var acah: ?[]const u8 = null;
|
||||
var acac: ?[]const u8 = null;
|
||||
var acma: ?[]const u8 = null;
|
||||
|
||||
var iter = transfer.responseHeaderIterator();
|
||||
while (iter.next()) |hdr| {
|
||||
@@ -404,15 +501,27 @@ const CorsPreflightContext = struct {
|
||||
acah = hdr.value;
|
||||
} else if (std.mem.eql(u8, hdr.name, ACCESS_CONTROL_ALLOW_CREDENTIALS)) {
|
||||
acac = hdr.value;
|
||||
} else if (std.ascii.eqlIgnoreCase(ACCESS_CONTROL_MAX_AGE, hdr.name)) {
|
||||
acma = hdr.value;
|
||||
}
|
||||
}
|
||||
|
||||
self.allowed = self.validateHeaders(acao, acam, acah, acac);
|
||||
if (self.allowed) {
|
||||
self.acam = acam;
|
||||
self.acah = acah;
|
||||
self.acma = acma;
|
||||
}
|
||||
return .proceed;
|
||||
}
|
||||
|
||||
fn doneCallback(ctx_ptr: *anyopaque) anyerror!void {
|
||||
const self: *CorsPreflightContext = @ptrCast(@alignCast(ctx_ptr));
|
||||
if (self.allowed) {
|
||||
self.cacheGrant(self.acam, self.acah, self.acma) catch |err| {
|
||||
log.warn(.cors, "preflight cache store failed", .{ .url = self.url, .err = err });
|
||||
};
|
||||
}
|
||||
self.resolve(self.allowed);
|
||||
}
|
||||
|
||||
@@ -441,31 +550,16 @@ const CorsPreflightContext = struct {
|
||||
}
|
||||
};
|
||||
|
||||
fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void {
|
||||
fn fetchThenResume(self: *CorsGate, transfer: *Transfer, authored_headers: []const []const u8) !void {
|
||||
const url = transfer.req.url;
|
||||
const origin = transfer.req.origin orelse "null";
|
||||
|
||||
var header_names: std.ArrayList([]const u8) = .empty;
|
||||
for (transfer.req_headers.items) |hdr| {
|
||||
if (hdr.source != .author) continue;
|
||||
if (isSafelistedHeader(hdr.name, hdr.value)) continue;
|
||||
try header_names.append(
|
||||
transfer.arena.allocator(),
|
||||
try std.ascii.allocLowerString(transfer.arena.allocator(), hdr.name),
|
||||
);
|
||||
}
|
||||
std.mem.sort([]const u8, header_names.items, {}, struct {
|
||||
fn lessThan(_: void, a: []const u8, b: []const u8) bool {
|
||||
return std.mem.lessThan(u8, a, b);
|
||||
}
|
||||
}.lessThan);
|
||||
const origin = transfer.effectiveOrigin();
|
||||
|
||||
const cors_key = CorsKey{
|
||||
.url = url,
|
||||
.origin = origin,
|
||||
.method = transfer.req.method,
|
||||
.wants_credentials = transfer.req.credentials_mode == .include,
|
||||
.authored_headers = header_names.items,
|
||||
.authored_headers = authored_headers,
|
||||
};
|
||||
const key = try cors_key.build(transfer.arena.allocator());
|
||||
|
||||
@@ -488,8 +582,8 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void {
|
||||
|
||||
const referer: ?[]const u8 = transfer.findRequestHeader("referer");
|
||||
|
||||
const owned_header_names = try arena.alloc([]const u8, header_names.items.len);
|
||||
for (header_names.items, 0..) |name, i| {
|
||||
const owned_header_names = try arena.alloc([]const u8, authored_headers.len);
|
||||
for (authored_headers, 0..) |name, i| {
|
||||
owned_header_names[i] = try arena.dupe(u8, name);
|
||||
}
|
||||
|
||||
@@ -527,11 +621,7 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void {
|
||||
errdefer fetch_transfer.deinit();
|
||||
|
||||
// Origin
|
||||
try fetch_transfer.setHeader(
|
||||
ORIGIN,
|
||||
transfer.req.origin orelse "null",
|
||||
.{},
|
||||
);
|
||||
try fetch_transfer.setHeader(ORIGIN, transfer.effectiveOrigin(), .{});
|
||||
|
||||
if (referer) |r| {
|
||||
try fetch_transfer.setHeader("Referer", r, .{});
|
||||
@@ -549,8 +639,8 @@ fn fetchThenResume(self: *CorsGate, transfer: *Transfer) !void {
|
||||
);
|
||||
|
||||
// Access-Control-Allow-Headers
|
||||
if (header_names.items.len > 0) {
|
||||
const request_headers_value = try std.mem.join(arena.allocator(), ",", header_names.items);
|
||||
if (authored_headers.len > 0) {
|
||||
const request_headers_value = try std.mem.join(arena.allocator(), ",", authored_headers);
|
||||
try fetch_transfer.setHeader(
|
||||
ACCESS_CONTROL_REQUEST_HEADERS,
|
||||
request_headers_value,
|
||||
|
||||
@@ -0,0 +1,418 @@
|
||||
// Copyright (C) 2023-2026 Lightpanda (Selecy SAS)
|
||||
//
|
||||
// Francis Bouvier <francis@lightpanda.io>
|
||||
// Pierre Tachoire <pierre@lightpanda.io>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
const std = @import("std");
|
||||
const lp = @import("lightpanda");
|
||||
|
||||
const http = @import("http.zig");
|
||||
const isSafelistedMethod = @import("CorsGate.zig").isSafelistedMethod;
|
||||
const ClockCache = @import("ClockCache.zig").ClockCache;
|
||||
|
||||
const CorsStore = @This();
|
||||
|
||||
pub const Key = struct {
|
||||
origin: []const u8,
|
||||
target: []const u8,
|
||||
credentials: bool,
|
||||
|
||||
/// Serializes into a single string suitable as a ClockCache key.
|
||||
fn build(self: Key, allocator: std.mem.Allocator) ![]const u8 {
|
||||
var buf: std.ArrayList(u8) = .empty;
|
||||
errdefer buf.deinit(allocator);
|
||||
|
||||
try buf.appendSlice(allocator, self.origin);
|
||||
try buf.append(allocator, 0);
|
||||
try buf.appendSlice(allocator, self.target);
|
||||
try buf.append(allocator, 0);
|
||||
try buf.append(allocator, @intFromBool(self.credentials));
|
||||
|
||||
return buf.toOwnedSlice(allocator);
|
||||
}
|
||||
};
|
||||
|
||||
pub const Entry = struct {
|
||||
methods_wildcard: bool,
|
||||
methods: std.EnumSet(http.Method),
|
||||
|
||||
headers_wildcard: bool,
|
||||
headers: []const []const u8,
|
||||
|
||||
expires_at: u64,
|
||||
|
||||
fn unionHeaders(
|
||||
allocator: std.mem.Allocator,
|
||||
a: []const []const u8,
|
||||
b: []const []const u8,
|
||||
) ![]const []const u8 {
|
||||
var list: std.ArrayList([]const u8) = .empty;
|
||||
errdefer {
|
||||
for (list.items) |s| allocator.free(s);
|
||||
list.deinit(allocator);
|
||||
}
|
||||
|
||||
outerA: for (a) |s| {
|
||||
for (list.items) |existing| {
|
||||
if (std.ascii.eqlIgnoreCase(existing, s)) continue :outerA;
|
||||
}
|
||||
try list.append(allocator, try allocator.dupe(u8, s));
|
||||
}
|
||||
outerB: for (b) |s| {
|
||||
for (list.items) |existing| {
|
||||
if (std.ascii.eqlIgnoreCase(existing, s)) continue :outerB;
|
||||
}
|
||||
try list.append(allocator, try allocator.dupe(u8, s));
|
||||
}
|
||||
|
||||
return list.toOwnedSlice(allocator);
|
||||
}
|
||||
|
||||
fn merge(self: Entry, allocator: std.mem.Allocator, new: Entry) !Entry {
|
||||
return .{
|
||||
.methods_wildcard = self.methods_wildcard or new.methods_wildcard,
|
||||
.methods = self.methods.unionWith(new.methods),
|
||||
.headers_wildcard = self.headers_wildcard or new.headers_wildcard,
|
||||
.headers = try unionHeaders(allocator, self.headers, new.headers),
|
||||
.expires_at = @min(self.expires_at, new.expires_at),
|
||||
};
|
||||
}
|
||||
|
||||
fn dupe(self: Entry, allocator: std.mem.Allocator) !Entry {
|
||||
var new_headers: std.ArrayList([]const u8) = try .initCapacity(allocator, self.headers.len);
|
||||
errdefer {
|
||||
for (new_headers.items) |hdr| allocator.free(hdr);
|
||||
new_headers.deinit(allocator);
|
||||
}
|
||||
|
||||
for (self.headers) |hdr| {
|
||||
new_headers.appendAssumeCapacity(try allocator.dupe(u8, hdr));
|
||||
}
|
||||
|
||||
return .{
|
||||
.methods_wildcard = self.methods_wildcard,
|
||||
.methods = self.methods,
|
||||
.headers_wildcard = self.headers_wildcard,
|
||||
.headers = new_headers.items,
|
||||
.expires_at = self.expires_at,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn deinit(self: Entry, allocator: std.mem.Allocator) void {
|
||||
for (self.headers) |h| allocator.free(h);
|
||||
allocator.free(self.headers);
|
||||
}
|
||||
};
|
||||
|
||||
allocator: std.mem.Allocator,
|
||||
map: ClockCache(Entry),
|
||||
mutex: std.Io.Mutex = .init,
|
||||
|
||||
pub fn init(allocator: std.mem.Allocator, capacity: usize) CorsStore {
|
||||
return .{ .allocator = allocator, .map = .init(allocator, capacity) };
|
||||
}
|
||||
|
||||
pub fn deinit(self: *CorsStore) void {
|
||||
self.mutex.lockUncancelable(lp.io);
|
||||
defer self.mutex.unlock(lp.io);
|
||||
|
||||
for (self.map.entries()) |*entry| {
|
||||
entry.value.deinit(self.allocator);
|
||||
}
|
||||
self.map.deinit();
|
||||
}
|
||||
|
||||
// Caller is expected to be holding mutex.
|
||||
fn getWithExpiration(self: *CorsStore, cache_key: []const u8) ?*Entry {
|
||||
const entry = self.map.get(cache_key) orelse return null;
|
||||
|
||||
if (entry.expires_at <= lp.datetime.milliTimestamp(.real)) {
|
||||
if (self.map.remove(cache_key)) |e| {
|
||||
e.deinit(self.allocator);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
fn matches(entry: Entry, method: http.Method, authored_headers: []const []const u8) bool {
|
||||
if (!isSafelistedMethod(method) and !entry.methods_wildcard and !entry.methods.contains(method)) {
|
||||
return false;
|
||||
}
|
||||
for (authored_headers) |name| {
|
||||
const is_authorization = std.ascii.eqlIgnoreCase(name, "authorization");
|
||||
if (entry.headers_wildcard and !is_authorization) continue;
|
||||
var found = false;
|
||||
for (entry.headers) |allowed| {
|
||||
if (std.ascii.eqlIgnoreCase(allowed, name)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
pub fn coversRequest(
|
||||
self: *CorsStore,
|
||||
allocator: std.mem.Allocator,
|
||||
key: Key,
|
||||
method: http.Method,
|
||||
authored_headers: []const []const u8,
|
||||
) !bool {
|
||||
const primary_key = try key.build(allocator);
|
||||
defer allocator.free(primary_key);
|
||||
|
||||
self.mutex.lockUncancelable(lp.io);
|
||||
defer self.mutex.unlock(lp.io);
|
||||
|
||||
if (self.getWithExpiration(primary_key)) |entry| {
|
||||
if (matches(entry.*, method, authored_headers)) return true;
|
||||
}
|
||||
|
||||
if (key.credentials) return false;
|
||||
|
||||
const cred_key = try (Key{ .origin = key.origin, .target = key.target, .credentials = true }).build(allocator);
|
||||
defer allocator.free(cred_key);
|
||||
|
||||
const entry = self.getWithExpiration(cred_key) orelse return false;
|
||||
return matches(entry.*, method, authored_headers);
|
||||
}
|
||||
|
||||
/// Insert or merge a CORS grant for (origin, target). `entry` is not
|
||||
/// consumed: `put` copies whatever it needs (via `dupe`/`merge`, which
|
||||
/// always allocate their own copies) and never takes ownership of
|
||||
/// `entry.headers` or its contents.
|
||||
///
|
||||
/// Callers remain responsible for
|
||||
/// freeing `entry.headers` after this call, on both the insert and
|
||||
/// the merge path.
|
||||
pub fn put(self: *CorsStore, key: Key, entry: Entry) !void {
|
||||
const cache_key = try key.build(self.allocator);
|
||||
defer self.allocator.free(cache_key);
|
||||
|
||||
self.mutex.lockUncancelable(lp.io);
|
||||
defer self.mutex.unlock(lp.io);
|
||||
|
||||
if (self.getWithExpiration(cache_key)) |existing| {
|
||||
const merged = try existing.merge(self.allocator, entry);
|
||||
existing.deinit(self.allocator);
|
||||
existing.* = merged;
|
||||
return;
|
||||
}
|
||||
|
||||
const owned_entry = try entry.dupe(self.allocator);
|
||||
errdefer owned_entry.deinit(self.allocator);
|
||||
|
||||
switch (try self.map.insert(cache_key, owned_entry)) {
|
||||
.exists => unreachable,
|
||||
.inserted => |evicted| {
|
||||
if (evicted) |v| {
|
||||
var e = v;
|
||||
e.deinit(self.allocator);
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const testing = @import("../testing.zig");
|
||||
|
||||
fn freeHeaders(allocator: std.mem.Allocator, headers: []const []const u8) void {
|
||||
for (headers) |h| allocator.free(h);
|
||||
allocator.free(headers);
|
||||
}
|
||||
|
||||
test "CorsStore: put then covers, miss on different origin/target/credentials" {
|
||||
const allocator = testing.allocator;
|
||||
var store = CorsStore.init(allocator, 10);
|
||||
defer store.deinit();
|
||||
|
||||
const headers = try allocator.alloc([]const u8, 1);
|
||||
headers[0] = try allocator.dupe(u8, "x-custom");
|
||||
defer freeHeaders(allocator, headers);
|
||||
|
||||
try store.put(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .{
|
||||
.methods_wildcard = false,
|
||||
.methods = std.EnumSet(http.Method).initOne(.POST),
|
||||
.headers_wildcard = false,
|
||||
.headers = headers,
|
||||
.expires_at = lp.datetime.milliTimestamp(.real) + 60_000,
|
||||
});
|
||||
|
||||
try testing.expect(try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false },
|
||||
.POST,
|
||||
&.{},
|
||||
));
|
||||
try testing.expect(!try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false },
|
||||
.PUT,
|
||||
&.{},
|
||||
));
|
||||
|
||||
try testing.expect(!try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = "https://b.example", .target = "https://api.example", .credentials = false },
|
||||
.POST,
|
||||
&.{},
|
||||
));
|
||||
try testing.expect(!try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = "https://a.example", .target = "https://other.example", .credentials = false },
|
||||
.POST,
|
||||
&.{},
|
||||
));
|
||||
|
||||
// Same origin/target but different credentials mode: separate entry, must miss.
|
||||
try testing.expect(!try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = "https://a.example", .target = "https://api.example", .credentials = true },
|
||||
.POST,
|
||||
&.{},
|
||||
));
|
||||
}
|
||||
|
||||
test "CorsStore: expired entries are treated as a miss on covers" {
|
||||
const allocator = testing.allocator;
|
||||
var store = CorsStore.init(allocator, 10);
|
||||
defer store.deinit();
|
||||
|
||||
try store.put(.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false }, .{
|
||||
.methods_wildcard = true,
|
||||
.methods = .initEmpty(),
|
||||
.headers_wildcard = true,
|
||||
.headers = &.{}, // empty slice, nothing to free
|
||||
.expires_at = lp.datetime.milliTimestamp(.real) - 1,
|
||||
});
|
||||
|
||||
try testing.expect(!try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = "https://a.example", .target = "https://api.example", .credentials = false },
|
||||
.GET,
|
||||
&.{},
|
||||
));
|
||||
}
|
||||
|
||||
test "CorsStore: put merges into existing entry rather than clobbering" {
|
||||
const allocator = testing.allocator;
|
||||
var store = CorsStore.init(allocator, 10);
|
||||
defer store.deinit();
|
||||
|
||||
const key = Key{ .origin = "https://a.example", .target = "https://api.example", .credentials = false };
|
||||
|
||||
const h1 = try allocator.alloc([]const u8, 1);
|
||||
h1[0] = try allocator.dupe(u8, "x-one");
|
||||
try store.put(key, .{
|
||||
.methods_wildcard = false,
|
||||
.methods = std.EnumSet(http.Method).initOne(.POST),
|
||||
.headers_wildcard = false,
|
||||
.headers = h1,
|
||||
.expires_at = lp.datetime.milliTimestamp(.real) + 60_000,
|
||||
});
|
||||
freeHeaders(allocator, h1);
|
||||
|
||||
const h2 = try allocator.alloc([]const u8, 1);
|
||||
h2[0] = try allocator.dupe(u8, "x-two");
|
||||
try store.put(key, .{
|
||||
.methods_wildcard = false,
|
||||
.methods = std.EnumSet(http.Method).initOne(.PUT),
|
||||
.headers_wildcard = false,
|
||||
.headers = h2,
|
||||
.expires_at = lp.datetime.milliTimestamp(.real) + 60_000,
|
||||
});
|
||||
freeHeaders(allocator, h2);
|
||||
|
||||
try testing.expect(try store.coversRequest(allocator, key, .POST, &.{"x-one"}));
|
||||
try testing.expect(try store.coversRequest(allocator, key, .PUT, &.{"x-two"}));
|
||||
try testing.expect(!try store.coversRequest(allocator, key, .DELETE, &.{}));
|
||||
}
|
||||
|
||||
test "CorsStore: credentialed and non-credentialed grants for same origin/target stay separate" {
|
||||
const allocator = testing.allocator;
|
||||
var store = CorsStore.init(allocator, 10);
|
||||
defer store.deinit();
|
||||
|
||||
const origin = "https://a.example";
|
||||
const target = "https://api.example";
|
||||
|
||||
// Non-credentialed grant: wildcard headers allowed (valid per spec for non-cred requests).
|
||||
try store.put(.{ .origin = origin, .target = target, .credentials = false }, .{
|
||||
.methods_wildcard = true,
|
||||
.methods = .initEmpty(),
|
||||
.headers_wildcard = true,
|
||||
.headers = &.{},
|
||||
.expires_at = lp.datetime.milliTimestamp(.real) + 60_000,
|
||||
});
|
||||
|
||||
// Credentialed grant: explicit methods/headers only, no wildcard.
|
||||
const h = try allocator.alloc([]const u8, 1);
|
||||
h[0] = try allocator.dupe(u8, "x-custom");
|
||||
try store.put(.{ .origin = origin, .target = target, .credentials = true }, .{
|
||||
.methods_wildcard = false,
|
||||
.methods = std.EnumSet(http.Method).initOne(.GET),
|
||||
.headers_wildcard = false,
|
||||
.headers = h,
|
||||
.expires_at = lp.datetime.milliTimestamp(.real) + 60_000,
|
||||
});
|
||||
freeHeaders(allocator, h);
|
||||
|
||||
// A credentialed request asking for an arbitrary header must be rejected
|
||||
// against the credentialed entry, even though the non-cred entry has a wildcard.
|
||||
try testing.expect(!try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = origin, .target = target, .credentials = true },
|
||||
.GET,
|
||||
&.{"x-anything"},
|
||||
));
|
||||
try testing.expect(try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = origin, .target = target, .credentials = true },
|
||||
.GET,
|
||||
&.{"x-custom"},
|
||||
));
|
||||
try testing.expect(!try store.coversRequest(
|
||||
allocator,
|
||||
.{ .origin = origin, .target = target, .credentials = true },
|
||||
.PUT,
|
||||
&.{},
|
||||
));
|
||||
|
||||
// The non-credentialed entry's wildcard still works for non-cred requests.
|
||||
try testing.expect(try store.coversRequest(allocator, .{ .origin = origin, .target = target, .credentials = false }, .GET, &.{"x-anything"}));
|
||||
}
|
||||
|
||||
test "CorsStore: covers never lets a wildcard cover Authorization" {
|
||||
const allocator = testing.allocator;
|
||||
var store = CorsStore.init(allocator, 10);
|
||||
defer store.deinit();
|
||||
|
||||
const key = Key{ .origin = "https://a.example", .target = "https://api.example", .credentials = false };
|
||||
try store.put(key, .{
|
||||
.methods_wildcard = true,
|
||||
.methods = .initEmpty(),
|
||||
.headers_wildcard = true,
|
||||
.headers = &.{},
|
||||
.expires_at = std.math.maxInt(u64),
|
||||
});
|
||||
|
||||
try testing.expect(!try store.coversRequest(allocator, key, .GET, &.{"authorization"}));
|
||||
try testing.expect(try store.coversRequest(allocator, key, .GET, &.{"x-anything"}));
|
||||
}
|
||||
@@ -243,7 +243,10 @@ pub fn init(self: *Client, app: *lp.App) !void {
|
||||
.network = network,
|
||||
.single_flight = .init(allocator),
|
||||
},
|
||||
.cors = .{ .single_flight = .init(allocator) },
|
||||
.cors = .{
|
||||
.network = network,
|
||||
.single_flight = .init(allocator),
|
||||
},
|
||||
.url_blocklist = url_blocklist,
|
||||
.arena_pool = &app.arena_pool,
|
||||
};
|
||||
|
||||
@@ -27,6 +27,7 @@ const libcurl = @import("../sys/libcurl.zig");
|
||||
const http = @import("http.zig");
|
||||
const IpFilter = @import("IpFilter.zig");
|
||||
const RobotStore = @import("Robots.zig").RobotStore;
|
||||
const CorsStore = @import("CorsStore.zig");
|
||||
const WebBotAuth = @import("WebBotAuth.zig");
|
||||
const RateLimiter = @import("RateLimiter.zig");
|
||||
const Certificates = @import("Certificates.zig");
|
||||
@@ -43,6 +44,7 @@ cache: Cache,
|
||||
allocator: Allocator,
|
||||
config: *const Config,
|
||||
robot_store: RobotStore,
|
||||
cors_store: CorsStore,
|
||||
web_bot_auth: ?WebBotAuth,
|
||||
rate_limiter: ?RateLimiter,
|
||||
certificates: Certificates,
|
||||
@@ -122,6 +124,7 @@ pub fn init(app: *App) !Network {
|
||||
|
||||
.cache = cache,
|
||||
.robot_store = RobotStore.init(allocator, config.robotStoreEntryLimit()),
|
||||
.cors_store = CorsStore.init(allocator, config.corsStoreEntryLimit()),
|
||||
.web_bot_auth = web_bot_auth,
|
||||
.rate_limiter = if (config.httpNavDelay()) |ms| RateLimiter.init(allocator, ms, config.httpNavBurst()) else null,
|
||||
.adblocker = adblocker,
|
||||
@@ -144,6 +147,8 @@ pub fn deinit(self: *Network) void {
|
||||
self.ws_pool.deinit(self.allocator);
|
||||
|
||||
self.robot_store.deinit();
|
||||
self.cors_store.deinit();
|
||||
|
||||
if (self.rate_limiter) |*rl| {
|
||||
rl.deinit();
|
||||
}
|
||||
|
||||
@@ -975,7 +975,8 @@ fn stringToOwned(
|
||||
self.env.isolate.handle,
|
||||
buf.ptr,
|
||||
buf.len,
|
||||
v8.NO_NULL_TERMINATION | v8.REPLACE_INVALID_UTF8,
|
||||
v8.WRITE_REPLACE_INVALID_UTF8,
|
||||
null,
|
||||
);
|
||||
return buf[0..written];
|
||||
}
|
||||
|
||||
+23
-20
@@ -22,6 +22,7 @@ const lp = @import("lightpanda");
|
||||
const Frame = @import("../../browser/Frame.zig");
|
||||
const DOMNode = @import("../../browser/webapi/Node.zig");
|
||||
const Label = @import("../../browser/webapi/element/html/Label.zig");
|
||||
const TreeWalker = @import("../../browser/webapi/TreeWalker.zig");
|
||||
const interactive = @import("../../browser/interactive.zig");
|
||||
|
||||
const NodeRegistry = @import("../../NodeRegistry.zig");
|
||||
@@ -1058,7 +1059,7 @@ fn writeName(
|
||||
|
||||
if (use_name_for_content) {
|
||||
var buf: std.Io.Writer.Allocating = .init(scratchAllocator(temp_arena, frame));
|
||||
try writeAccessibleNameFallback(node, &buf.writer, frame);
|
||||
try writeAccessibleNameFallback(node, &buf.writer);
|
||||
if (buf.written().len > 0) {
|
||||
try writeString(buf.written(), w);
|
||||
return .contents;
|
||||
@@ -1085,9 +1086,22 @@ fn writeName(
|
||||
};
|
||||
}
|
||||
|
||||
fn writeAccessibleNameFallback(node: *DOMNode, writer: *std.Io.Writer, frame: *Frame) !void {
|
||||
var it = node.childrenIterator();
|
||||
while (it.next()) |child| {
|
||||
fn writeAccessibleNameFallback(node: *DOMNode, writer: *std.Io.Writer) !void {
|
||||
var tw = TreeWalker.FullExcludeSelf.init(node, .{});
|
||||
while (tw.next()) |child| {
|
||||
const parent = child._parent.?;
|
||||
const in_svg = if (parent.is(DOMNode.Element)) |p| p.getTag() == .svg else false;
|
||||
if (in_svg and parent != node) {
|
||||
// Inside an SVG, only a <title> names it
|
||||
const is_title = if (child.is(DOMNode.Element)) |el| std.mem.eql(u8, el.getTagNameLower(), "title") else false;
|
||||
if (is_title) {
|
||||
try writer.writeByte(' ');
|
||||
} else {
|
||||
tw.skipChildren();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (child._type) {
|
||||
.cdata => {
|
||||
const cd = child.subtype(DOMNode.CData);
|
||||
@@ -1101,26 +1115,15 @@ fn writeAccessibleNameFallback(node: *DOMNode, writer: *std.Io.Writer, frame: *F
|
||||
},
|
||||
.element => {
|
||||
const el = child.subtype(DOMNode.Element);
|
||||
if (el.getTag() == .img) {
|
||||
const tag = el.getTag();
|
||||
if (tag == .img) {
|
||||
if (el.getAttributeSafe(.wrap("alt"))) |alt| {
|
||||
try writer.writeAll(alt);
|
||||
try writer.writeByte(' ');
|
||||
}
|
||||
} else if (el.getTag() == .svg) {
|
||||
// Try to find a <title> inside SVG
|
||||
var sit = child.childrenIterator();
|
||||
while (sit.next()) |s_child| {
|
||||
if (s_child.is(DOMNode.Element)) |s_el| {
|
||||
if (std.mem.eql(u8, s_el.getTagNameLower(), "title")) {
|
||||
try writeAccessibleNameFallback(s_child, writer, frame);
|
||||
try writer.writeByte(' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!el.getTag().isMetadata()) {
|
||||
try writeAccessibleNameFallback(child, writer, frame);
|
||||
}
|
||||
tw.skipChildren();
|
||||
} else if (tag != .svg and tag.isMetadata()) {
|
||||
tw.skipChildren();
|
||||
}
|
||||
},
|
||||
else => {},
|
||||
|
||||
Reference in new issue
Block a user