webkit js

dom相关:

https://w3c.github.io/uievents/

https://dom.spec.whatwg.org/

工作原理:

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/

自己添加更多dom函数用js而不是通过c++:https://www.chromium.org/blink/blink-in-js


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++


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