Chromium是否向V8传递URL与JS?及V8源码提取JS关联URL咨询
获取JS脚本关联URL的方法(V8/Chromium层面)
一、从V8的Parser/Scanner中提取URL
你可以直接在parsing.cc中通过当前解析上下文的ParseInfo对象获取关联的Script实例,进而拿到source_url:
- 在你添加打印源码的位置(比如
ParseProgram或ParseTopLevel函数内),先获取ParseInfo对象 - 通过
parse_info.script()拿到对应的Script实例 - 调用Script的
source_url()方法获取URL字符串,转成UTF8格式打印
示例代码:
// 确保你已经拿到ParseInfo实例(比如函数参数中的parse_info) v8::Isolate* isolate = parse_info.isolate(); v8::Handle<v8::Script> script = parse_info.script(); if (!script.IsEmpty()) { v8::Handle<v8::String> source_url = script->source_url(); if (!source_url.IsEmpty()) { v8::String::Utf8Value url_str(isolate, source_url); printf("关联URL: %s\n", *url_str); } else { printf("无关联URL\n"); } }
如果要在scanner.cc中获取,需要从Scanner关联的ParseInfo入手——Scanner的构造通常会传入ParseInfo或相关的源上下文,你可以通过scanner->parse_info()(如果已有该方法)获取实例,再按上面的流程提取URL。
二、V8内部无法获取时,Chromium层面的查找位置
如果V8的Parser/Scanner上下文没有保留URL(比如某些动态生成的脚本),可以在Chromium的以下模块查找:
- Blink层的ScriptLoader:负责加载外部脚本,会记录脚本的原始URL,在创建V8 Script时将URL传入。代码路径:
third_party/blink/renderer/core/script/script_loader.cc - V8脚本执行入口:Chromium中创建V8 Script的逻辑在
third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc,这里会处理脚本的URL参数,传递给V8的ScriptBuilder - 内联脚本的关联URL:对于页面内的内联脚本,其关联URL通常是当前页面的URL,可以从Blink的
Document对象获取,代码路径:third_party/blink/renderer/core/dom/document.cc,调用document->Url().GetString()即可拿到
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

