Chromium二次开发新建文档时读取JS文件为字符串失败问题咨询
明显问题排查
你当前代码失败的核心原因有3个:
- 相对路径指向错误
你使用了相对路径"jQuery.js",该路径是相对于Chromium进程的当前工作目录生效,而非你编译产出的二进制文件所在目录。从你给出的日志可以看到,你没有打印出FileExists::的日志,说明base::PathExists(path)直接返回了false,系统在Render进程的工作目录下完全找不到该文件。 - Render进程沙箱限制
Chromium的Render进程默认运行在严格沙箱环境下,即使路径填写正确,默认也没有权限读取任意磁盘路径的自定义文件,沙箱会直接拦截文件读取请求。 - 隐藏风险:你当前在Render主线程执行同步文件IO,属于阻塞操作,即使功能跑通也会导致页面渲染卡顿,不符合Chromium的线程规范。
修复方案
第一步 优先修复路径问题
不要使用相对路径,通过base::PathService获取二进制所在目录拼接绝对路径,示例代码:
#include "base/path_service.h" InjectionRenderFrameObserver::DidCreateNewDocument(){ std::string jq; base::FilePath exe_path; // 获取当前二进制所在目录 if (!base::PathService::Get(base::DIR_EXE, &exe_path)) { LOG(ERROR) << "Failed to get exe directory"; return; } base::FilePath jq_path = exe_path.AppendASCII("jQuery.js"); LOG(INFO) << "FilePath::" << jq_path.value(); if(base::PathExists(jq_path)){ LOG(INFO) << "FileExists::"; } // 临时关闭沙箱测试路径问题(仅本地调试用,不要上线) if(!base::ReadFileToString(jq_path, &jq)){ LOG(ERROR) << "Can't read content of '" << jq_path.value() << "'."; } }
第二步 适配Chromium沙箱规则(推荐方案)
不要在Render进程执行文件读取逻辑,将脚本读取逻辑迁移到无沙箱限制的Browser进程实现,通过自定义IPC将读取到的脚本内容传递到Render进程执行,既符合Chromium的多进程架构设计,也不会破坏沙箱安全机制。
第三步 注入时机优化
如果需要脚本在文档所有JS执行前运行,可以配合DidCommitProvisionalLoad时机,使用ExecuteJavaScriptInIsolatedWorld接口执行脚本,运行在隔离世界避免和页面原生JS产生上下文冲突。
内容的提问来源于stack exchange,提问作者elephino
相关产品推荐
相关产品推荐

