当前位置: 首页 > news >正文

Chrome/360 浏览器 WebUI 资源底层机制解析:共享资源与专属资源的奥秘

在 Chromium 和 360 浏览器源码中,我们会发现 WebUI 页面不仅有 C++ 逻辑处理(如 WebUIMessageHandler),还伴随着大量 HTML、CSS 和 JS 文件。尤其是 src/ui/webui/resourcessrc/chrome/browser/360/webui 这两个目录,它们各自存放的资源类型、使用范围和底层加载机制完全不同。理解它们的设计理念和底层实现机制,有助于浏览器开发者掌握模块化、性能优化和安全策略。

本文将从底层机制入手,结合具体案例,解析 WebUI 资源加载流程、模块化管理、pak 文件映射、前后端交互以及 Chromium 和 360 浏览器的差异。


1. WebUI 的定位与资源分类

1.1 WebUI 的概念

WebUI(Web-based User Interface)是浏览器内部的一类特殊页面,它使用 Web 技术栈(HTML、CSS、JS)来展示浏览器功能,同时具有高权限,可以直接访问浏览器内部 API,例如:

  • chrome://settings/ —— 设置页面

  • chrome://downloads/ —— 下载管理

  • chrome://flags/ —— 实验功能

与普通网页相比,WebUI 页面具有以下特点:

  1. 资源来源内置:资源来自浏览器 pak 文件或源码目录,而非网络。

  2. 高权限:可以修改浏览器内部状态,因此安全性要求高。

  3. 模块化:每个 WebUI 页面可以拥有专属资源,也可复用全局共享资源。

1.2 资源分类

Chromium/360 浏览器的 WebUI 资源大致分为两类:

目录所属层级类型用途
src/ui/webui/resourcesUI 框架层通用 JS/CSS/HTML供所有 WebUI 页面复用的基础资源,例如 cr.js、typography.css、load_time_data.js
src/chrome/browser/360/webui浏览器功能层专属 HTML/JS/CSS360 浏览器特定功能或页面的资源,例如 settings_360.js、downloads_360.css,只在对应 WebUI 页面使用

2. 底层加载机制概览

WebUI 资源的底层机制核心包括:

  1. 资源注册:C++ 层通过 WebUIDataSource 将 URL 与资源 ID 映射。

  2. 资源存储:编译时将 HTML/JS/CSS/图片打包进 pak 文件,通过 IDR 资源 ID 访问。

  3. 前端加载:浏览器渲染引擎根据 HTML 中的 <script><link>import 访问资源。

2.1 资源注册(C++ 层)

在 Chromium 内核中,每个 WebUI 页面都有对应的 C++ handler 类,负责注册资源路径和处理消息交互。

以 Settings 页面为例:

auto* source = content::WebUIDataSource::Create("settings"); source->AddResourcePath("settings_main.js", IDR_SETTINGS_MAIN_JS); source->AddResourcePath("settings_main.css", IDR_SETTINGS_MAIN_CSS); source->SetDefaultResource(IDR_SETTINGS_MAIN_HTML); web_ui->AddMessageHandler(std::make_unique<SettingsUIHandler>());

解释:

  • WebUIDataSource::Create("settings")
    chrome://settings/ 创建数据源。

  • AddResourcePath
    将 URL 路径(如 settings_main.js)映射到内置资源 ID(IDR_XXX)。

  • SetDefaultResource
    指定默认 HTML 页面。

  • WebUIMessageHandler
    处理前端 JS 与 C++ 后端的消息交互。

同理,360 浏览器在 chrome/browser/360/webui 下的每个页面都会有自己的 WebUIDataSource 注册和 handler,实现模块化加载。


2.2 资源存储(pak 文件)

  • Chromium 编译时,将资源打包进 pak 文件,例如:

resources.pak chrome_100_percent.pak

  • pak 文件特点:

  1. 高效:使用内存映射(mmap)访问,减少文件 I/O 延迟。

  2. 安全:防止高权限 WebUI 页面资源被外部篡改。

  3. 模块化:每个资源有唯一 ID(IDR_XXX),可按需加载。

  • 资源访问流程:

浏览器请求 chrome://downloads/downloads.js ↓ WebUIDataSource 查找 URL 映射 ↓ 根据 IDR_DOWNLOADS_JS 从 pak 文件读取内容 ↓ 渲染进 WebContents


2.3 前端加载机制

WebUI 页面通过 HTML 引入资源:

<link rel="stylesheet" href="downloads.css"> <script src="downloads.js"></script>

底层流程:

  1. Chromium 渲染引擎(Blink)接收到资源请求。

  2. 调用 WebUIDataSource 提供的资源。

  3. 将资源注入到 WebContents 的 DOM 中。

  4. 前端 JS 可以通过 chrome.sendaddWebUIListener 与 C++ handler 交互。


3. src/ui/webui/resources vs src/chrome/browser/360/webui 的底层机制区别

维度ui/webui/resourceschrome/browser/360/webui
所属层Chromium UI 框架浏览器功能层(360 定制)
使用范围全局共享,基础框架单模块专属资源
注册方式可直接被任意 WebUI 页面复用每个页面独立注册 WebUIDataSource
pak 映射共享资源 IDR_XXX专属资源 IDR_XXX_360
修改频率稳定,基础库高,快速迭代页面功能
前端交互提供通用工具函数、组件页面逻辑、C++ 消息交互绑定

3.1 底层资源访问流程对比

全局共享资源(ui/webui/resources):

浏览器请求 chrome://downloads/cr.js ↓ WebUIDataSource 全局映射查找 ↓ 从 pak 文件中读取 cr.js ↓ 渲染进 WebContents

专属资源(chrome/browser/360/webui):

浏览器请求 chrome://downloads_360/downloads.js ↓ WebUIDataSource(Downloads360UI) 查找 URL 映射 ↓ 从 pak 文件或目录读取 downloads.js ↓ 渲染进 WebContents


4. 模块化和安全性分析

  1. 模块化管理

    • 每个 WebUI 页面独立注册资源和 handler

    • 避免全局膨胀,便于局部调试

  2. 安全性

    • 内置资源防止篡改

    • 高权限页面不会通过网络加载 JS/CSS

  3. 性能

    • pak 文件内存映射加载,启动和渲染更快

    • 专属资源按需加载,减少内存占用


5. 案例分析

5.1 Downloads 页面

目录结构:

chrome/browser/resources/downloads/ ├── downloads.html ├── downloads.js ├── downloads.css

加载流程:

  1. 访问 chrome://downloads/

  2. DownloadsUI::Create 注册资源路径

  3. 渲染 HTML,加载 CSS/JS

  4. JS 与 C++ handler 通信,展示下载列表

5.2 360 定制 WebUI 页面

目录结构:

chrome/browser/360/webui/settings_360/ ├── settings_360.html ├── settings_360.js ├── settings_360.css

  • 每个页面独立注册 WebUIDataSource

  • JS 绑定 360 专属功能

  • 可快速迭代而不影响 Chromium 原生 WebUI


6. 总结

  1. 资源分类明确

    • ui/webui/resources → 通用基础库

    • chrome/browser/360/webui → 360 专属页面

  2. 底层机制核心

    • C++ 层 WebUIDataSource 注册 URL 与 ID

    • pak 文件高效、安全存储资源

    • 前端加载通过 DOM 注入,并可与 C++ handler 交互

  3. 设计价值

    • 模块化:页面独立管理资源

    • 安全可控:防止高权限页面被篡改

    • 高性能:按需加载,pak 内存映射

    • 开发高效:专属目录便于快速调试

理解了这个机制,开发者可以:

  • 快速定位 WebUI 资源

  • 判断资源放在哪个目录合适

  • 优化浏览器模块化和安全策略

http://www.dtcms.com/a/342538.html

相关文章:

  • 一、部署LNMP
  • mac的m3芯片安装JDK8、JDK17
  • 【CDA干货】金融App产品AB测试与指标体系搭建
  • 数据结构之排序大全(3)
  • 31、工业网络异常行为检测与OT协议深度分析 (核电站DCS模拟) - /安全与维护组件/network-anomaly-detection-nuclear
  • “码” 上安全:轻量级加密的硬件实现与侧信道攻击防御
  • Java实现一个简单的LRU缓存对象
  • 【SpringBoot】16 核心功能 - Web开发原理 - 请求参数 - 源码分析
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析七
  • 如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
  • CTFshow系列——命令执行web41-44
  • YOLOv8 原理与跨领域应用全景分析
  • CVPR | 2025 | MAP:通过掩码自回归预训练释放混合 Mamba - Transformer 视觉骨干网络的潜力
  • 【C++】仿函数和回调函数
  • Python数值取整完全指南:从基础到金融工程实践
  • uniapp实现分页,效果如图
  • 自然语言处理——04 注意力机制
  • npm全局安装后,cmd命令行可以访问,vscode访问报错
  • HTTP 403 错误:后端权限校验机制深度解析
  • 长尾关键词优化SEO核心策略
  • JeeSite 快速开发平台:全能企业级快速开发解决方案
  • 自己动手,在Mac开发机上利用ollama部署一款轻量级的大模型Phi-3:mini
  • ElasticSearch——常用命令
  • VSCode Import Cost:5 分钟学会依赖瘦身
  • java16学习笔记
  • uniapp 全局弹窗
  • 力扣1005:k次取反后最大化的数组和
  • pycharm编译器如何快速掌握一个新模块的使用方法
  • K-means 聚类算法学习
  • matplotlib 6 - Gallery Images