webkit js
dom相关:
https://w3c.github.io/uievents/
工作原理:
https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/
自己添加更多dom函数用js而不是通过c++:https://www.chromium.org/blink/blink-in-js
void Document::SetShowBeforeUnloadDialog(bool show_dialog) { if (!mime_handler_view_before_unload_event_listener_) { if (!show_dialog) return; mime_handler_view_before_unload_event_listener_ = MakeGarbageCollected<BeforeUnloadEventListener>(this); domWindow()->addEventListener( event_type_names::kBeforeunload, mime_handler_view_before_unload_event_listener_, false); }
TEST_F(WebViewTest, SubframeBeforeUnloadUseCounter) { RegisterMockedHttpURLLoad("visible_iframe.html"); RegisterMockedHttpURLLoad("single_iframe.html"); WebViewImpl* web_view = web_view_helper_.InitializeAndLoad(base_url_ + "single_iframe.html"); WebLocalFrame* frame = web_view_helper_.LocalMainFrame(); Document* document = To<LocalFrame>(web_view_helper_.GetWebView()->GetPage()->MainFrame()) ->GetDocument(); // Add a beforeunload handler in the main frame. Make sure firing // beforeunload doesn't increment the subframe use counter. { frame->ExecuteScript( WebScriptSource("addEventListener('beforeunload', function() {});")); web_view->MainFrameImpl()->DispatchBeforeUnloadEvent(false); EXPECT_FALSE( document->IsUseCounted(WebFeature::kSubFrameBeforeUnloadFired)); } // Add a beforeunload handler in the iframe and dispatch. Make sure we do // increment the use counter for subframe beforeunloads. { frame->ExecuteScript(WebScriptSource( "document.getElementsByTagName('iframe')[0].contentWindow." "addEventListener('beforeunload', function() {});")); To<WebLocalFrameImpl>( web_view->MainFrame()->FirstChild()->ToWebLocalFrame()) ->DispatchBeforeUnloadEvent(false); Document* child_document = To<LocalFrame>(web_view_helper_.GetWebView() ->GetPage() ->MainFrame() ->Tree() .FirstChild()) ->GetDocument(); EXPECT_TRUE( child_document->IsUseCounted(WebFeature::kSubFrameBeforeUnloadFired)); } }
third_party/blink/renderer/bindings/templates/
// This file has been auto-generated from the Jinja2 template
// third_party/blink/renderer/bindings/templates/interface.cc.tmpl
// by the script code_generator_v8.py.
// This file has been auto-generated from the Jinja2 template
// third_party/blink/renderer/bindings/templates/interface.h.tmpl
// by the script code_generator_v8.py.
js AddEventListenerMethodCallback的方法实现在
\src\out\Testing\gen\third_party\blink\renderer\bindings\modules\v8\v8_context_snapshot_external_references.cc
reinterpret_cast<intptr_t>(V8Window::AlertMethodCallback),
D:\dev\electron7\src\out\Testing\gen\third_party\blink\renderer\bindings\core\v8\v8_window.cc
static constexpr V8DOMConfiguration::MethodConfiguration kV8WindowMethods[] = {
{"stop", V8Window::StopMethodCallback, 0, v8::None, V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kCheckAccess, V8DOMConfiguration::kHasSideEffect, V8DOMConfiguration::kAllWorlds},
{"open", V8Window::OpenMethodCallback, 0, v8::None, V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kCheckAccess, V8DOMConfiguration::kHasSideEffect, V8DOMConfiguration::kAllWorlds},
{"alert", V8Window::AlertMethodCallback, 0, v8::None, V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kCheckAccess, V8DOMConfiguration::kHasSideEffect, V8DOMConfiguration::kAllWorlds},
{"confirm", V8Window::ConfirmMethodCallback, 0, v8::None, V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kCheckAccess, V8DOMConfiguration::kHasSideEffect, V8DOMConfiguration::kAllWorlds},
{"prompt", V8Window::PromptMethodCallback, 0, v8::None, V8DOMConfiguration::kOnInstance, V8DOMConfiguration::kCheckHolder, V8DOMConfiguration::kCheckAccess, V8DOMConfiguration::kHasSideEffect, V8DOMConfiguration::kAllWorlds},
JS调用到alert的堆栈:
blink_core.dll!blink::LocalDOMWindow::alert(blink::ScriptState * script_state, const WTF::String & message) 行 664 C++
blink_core.dll!blink::dom_window_v8_internal::Alert2Method(const v8::FunctionCallbackInfo<v8::Value> & info) 行 5382 C++
blink_core.dll!blink::dom_window_v8_internal::AlertMethod(const v8::FunctionCallbackInfo<v8::Value> & info) 行 5404 C++
blink_core.dll!blink::V8Window::AlertMethodCallback(const v8::FunctionCallbackInfo<v8::Value> & info) 行 12441 C++
v8.dll!v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo handler) 行 159 C++
v8.dll!v8::internal::`anonymous namespace'::HandleApiCallHelper<0>(v8::internal::Isolate * isolate, v8::internal::Handle<v8::internal::HeapObject> function, v8::internal::Handle<v8::internal::HeapObject> new_target, v8::internal::Handle<v8::internal::FunctionTemplateInfo> fun_data, v8::internal::Handle<v8::internal::Object> receiver, v8::internal::BuiltinArguments args) 行 113 C++
v8.dll!v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments args, v8::internal::Isolate * isolate) 行 141 C++
v8.dll!v8::internal::Builtin_HandleApiCall(int args_length, unsigned __int64 * args_object, v8::internal::Isolate * isolate) 行 129 C++
[外部代码]
[内联框架] v8.dll!v8::internal::GeneratedCode<unsigned long long,unsigned long long,unsigned long long,unsigned long long,unsigned long long,long long,unsigned long long **>::Call(unsigned __int64 args, unsigned __int64 args, unsigned __int64 args, unsigned __int64 args, __int64 args, unsigned __int64 * * args) 行 138 C++
v8.dll!v8::internal::`anonymous namespace'::Invoke(v8::internal::Isolate * isolate, const v8::internal::`anonymous namespace'::InvokeParams & params) 行 266 C++
v8.dll!v8::internal::Execution::Call(v8::internal::Isolate * isolate, v8::internal::Handle<v8::internal::Object> callable, v8::internal::Handle<v8::internal::Object> receiver, int argc, v8::internal::Handle<v8::internal::Object> * argv) 行 358 C++
v8.dll!v8::Script::Run(v8::Local<v8::Context> context) 行 2159 C++
blink_core.dll!blink::V8ScriptRunner::RunCompiledScript(v8::Isolate * isolate, v8::Local<v8::Script> script, blink::ExecutionContext * context) 行 340 C++
blink_core.dll!blink::ScriptController::ExecuteScriptAndReturnValue(v8::Local<v8::Context> context, const blink::ScriptSourceCode & source, const blink::KURL & base_url, blink::SanitizeScriptErrors sanitize_script_errors, const blink::ScriptFetchOptions & fetch_options) 行 133 C++
blink_core.dll!blink::ScriptController::EvaluateScriptInMainWorld(const blink::ScriptSourceCode & source_code, const blink::KURL & base_url, blink::SanitizeScriptErrors sanitize_script_errors, const blink::ScriptFetchOptions & fetch_options, blink::ScriptController::ExecuteScriptPolicy policy) 行 353 C++
> blink_core.dll!blink::ScriptController::ExecuteScriptInMainWorld(const blink::ScriptSourceCode & source_code, const blink::KURL & base_url, blink::SanitizeScriptErrors sanitize_script_errors, const blink::ScriptFetchOptions & fetch_options) 行 321 C++
blink_core.dll!blink::ClassicScript::RunScript(blink::LocalFrame * frame, const blink::SecurityOrigin * security_origin) 行 26 C++
blink_core.dll!blink::PendingScript::ExecuteScriptBlockInternal(blink::Script * script, blink::ScriptElementBase * element, bool was_canceled, bool is_external, bool created_during_document_write, base::TimeTicks parser_blocking_load_start_time, bool is_controlled_by_script_runner) 行 265 C++
blink_core.dll!blink::PendingScript::ExecuteScriptBlock(const blink::KURL & document_url) 行 171 C++
blink_core.dll!blink::ScriptLoader::PrepareScript(const WTF::TextPosition & script_start_position, blink::ScriptLoader::LegacyTypeSupport support_legacy_types) 行 890 C++
blink_core.dll!blink::HTMLParserScriptRunner::ProcessScriptElementInternal(blink::Element * script, const WTF::TextPosition & script_start_position) 行 599 C++
blink_core.dll!blink::HTMLParserScriptRunner::ProcessScriptElement(blink::Element * script_element, const WTF::TextPosition & script_start_position) 行 333 C++
blink_core.dll!blink::HTMLDocumentParser::RunScriptsForPausedTreeBuilder() 行 299 C++
blink_core.dll!blink::HTMLDocumentParser::ProcessTokenizedChunkFromBackgroundParser(std::unique_ptr<blink::HTMLDocumentParser::TokenizedChunk,std::default_delete<blink::HTMLDocumentParser::TokenizedChunk>> pop_chunk) 行 539 C++
blink_core.dll!blink::HTMLDocumentParser::PumpPendingSpeculations() 行 595 C++
blink_core.dll!blink::HTMLDocumentParser::ResumeParsingAfterYield() 行 288 C++
blink_core.dll!blink::HTMLParserScheduler::ContinueParsing() 行 141 C++
void V8Window::AlertMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_DOMWindow_alert");
dom_window_v8_internal::AlertMethod(info);
}
void V8Window::ConfirmMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_DOMWindow_confirm");
ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate());
UseCounter::Count(execution_context_for_measurement, WebFeature::kV8Window_Confirm_Method);
dom_window_v8_internal::ConfirmMethod(info);
}
void V8Window::PromptMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_DOMWindow_prompt");
ExecutionContext* execution_context_for_measurement = CurrentExecutionContext(info.GetIsolate());
UseCounter::Count(execution_context_for_measurement, WebFeature::kV8Window_Prompt_Method);
dom_window_v8_internal::PromptMethod(info);
}
javascript的window::setInterval的内部实现
调用序列图如下:
javascript的setInterval
-->jsDOMWindowPrototypeFunctionSetInterval
-->JSDOMWindow::setInterval
-->DOMWindow::setInterval
-->DOMTimer::install(context, action, timeout, false);
#########################################################################################
附
WebCore的timer实现
最基本有几个类,
--TimerBase
--ThreadTimers
包含TimerBase的heap堆和SharedTimer的指针
--SharedTimer
--TimerBase有一些子类,如-->SuspendableTimer-->DOMTimer, Timer等
setNextFireTime() timer开始的时候,都要调用这个函数,这里把具体的timer更新或者插入到ThreadTimers的堆中
fired() 纯虚函数
--ThreadTimers
updateSharedTimer() start timer
sharedTimerFired() fired函数,设置为内部的SharedTimer的callback函数
--SharedTimer
实现依赖具体的平台,如mac, gtk, qt等
有两个具体的实现MainThreadSharedTimer和WorkerSharedTimer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-06-15 sql server 2000 个人版怎么在win7下安装