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

Chromium源码中动态添加自定义字体至browserleaks.com/font的技术求助

动态向Chromium添加自定义字体适配browserleaks.com/font页面的方案

核心代码文件定位

Chromium中负责字体加载、缓存和枚举的核心模块集中在third_party/blink/renderer/platform/fonts/目录下,关键文件包括:

  • font_cache.cc:全局字体缓存的管理中心,负责系统字体枚举、自定义字体注册和缓存命中逻辑。
  • font_face.cc:实现CSS Font Face的核心逻辑,处理字体的加载、解析和注册流程。
  • css_font_face_source.cc:管理字体数据源,支持从内存、网络或本地文件加载字体数据。

具体修改步骤

  1. 嵌入自定义字体数据
    将你的TTF字体文件转换为C++字节数组(可通过二进制转代码工具实现),或者直接在代码中以base::StringPiece的形式嵌入字体二进制数据。

  2. 在FontCache中注册自定义字体
    找到FontCache::Initialize()方法(位于font_cache.cc),在初始化流程末尾添加自定义字体的注册逻辑,示例代码如下:

    // 替换为你的自定义字体字节数组和名称
    const uint8_t my_custom_font[] = { /* TTF文件的二进制字节 */ };
    base::StringPiece font_buffer(reinterpret_cast<const char*>(my_custom_font), sizeof(my_custom_font));
    
    // 创建字体数据实例
    scoped_refptr<SimpleFontData> custom_font_data = 
        CreateSimpleFontDataFromBuffer(
            font_buffer, 
            "MyCustomFont",  // 字体名称,需与后续枚举逻辑匹配
            SkFontStyle::Normal(), 
            nullptr
        );
    
    // 将字体加入全局缓存
    if (custom_font_data) {
        AddFontToCache(custom_font_data.get());
    }
    
  3. 确保字体被枚举到
    browserleaks的字体检测依赖Chromium的字体枚举逻辑,需要修改FontCache::GetFontList()方法,将自定义字体加入返回的字体列表中:

    // 在GetFontList()的返回逻辑前添加
    FontListEntry custom_entry;
    custom_entry.family = "MyCustomFont";
    custom_entry.style = SkFontStyle::Normal();
    font_list.push_back(custom_entry);
    

与字体指标功能集成的要点

  • 页面触发式加载(可选):如果不需要全局添加字体,可在页面导航完成时触发注册逻辑。通过NavigationController的DidFinishLoad回调判断当前URL是否为browserleaks.com/font,再执行字体注册。
  • 适配JavaScript检测API:确保自定义字体能被document.fonts或window.queryLocalFonts()检测到,上述修改的GetFontList()逻辑即可满足枚举要求。

编译与测试

修改完成后重新编译Chromium,启动浏览器访问browserleaks.com/font,检查字体指标区域是否出现你的自定义字体名称和对应指标数据。

内容的提问来源于stack exchange,提问作者Harman singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:57:28