You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chromium二次开发新建文档时读取JS文件为字符串失败问题咨询

明显问题排查

你当前代码失败的核心原因有3个:

  1. 相对路径指向错误
    你使用了相对路径"jQuery.js",该路径是相对于Chromium进程的当前工作目录生效,而非你编译产出的二进制文件所在目录。从你给出的日志可以看到,你没有打印出FileExists::的日志,说明base::PathExists(path)直接返回了false,系统在Render进程的工作目录下完全找不到该文件。
  2. Render进程沙箱限制
    Chromium的Render进程默认运行在严格沙箱环境下,即使路径填写正确,默认也没有权限读取任意磁盘路径的自定义文件,沙箱会直接拦截文件读取请求。
  3. 隐藏风险:你当前在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:36:03