Chrome/360 浏览器扩展深度解析:内置扩展与普通扩展的实现机制对比
在浏览器开发中,扩展(Extension)是功能模块化、增强用户体验的重要手段。Chrome 和基于 Chromium 内核的 360 浏览器都支持扩展,但它们内部存在 内置扩展(Built-in Extension) 与 普通扩展(用户安装扩展) 两种不同类型。
理解它们的实现机制,有助于浏览器开发者掌握资源管理、权限控制、安全策略以及模块化架构设计。
1. 扩展的概念与分类
1.1 扩展的基本概念
扩展是浏览器的附加功能模块,它可以:
改变浏览器行为
增强用户体验
与 Web 页面交互
在 Chromium 内核中,扩展依赖以下几个核心组件:
Manifest.json:声明扩展名称、ID、权限、资源路径
Background page / Service Worker:后台逻辑处理
Content script:注入网页 DOM
Web Accessible Resources:可被页面访问的资源
1.2 扩展分类
类型 | 来源 | 安装方式 | 更新方式 | 权限特点 |
---|---|---|---|---|
内置扩展 | 浏览器自带 | 编译进浏览器,随浏览器安装 | 浏览器更新 | 高权限,可访问内部 API |
普通扩展 | 用户安装 / Web Store | 用户安装或拖拽 | Web Store 或自动更新 | 权限受 manifest.json 限制,隔离性强 |
核心区别:内置扩展是浏览器功能的一部分,而普通扩展是用户可增删的可选模块。
2. 内置扩展实现机制
2.1 资源存放与打包
内置扩展的文件通常放在源码目录或打包资源中,例如:
chrome/browser/resources/downloads/ ├── downloads.html ├── downloads.js ├── downloads.css
HTML/JS/CSS 打包进浏览器 pak 文件
pak 文件特点:
内存映射加载(mmap)提高启动速度
防止被外部篡改,保证高权限 WebUI 页面安全
每个资源有唯一 ID(IDR_DOWNLOADS_JS)
2.2 扩展注册流程(C++ 层)
内置扩展随浏览器启动自动加载,通过 ExtensionService
或 ExtensionRegistry
注册。例如 Downloads 内置扩展:
auto* source = content::WebUIDataSource::Create("downloads"); source->AddResourcePath("downloads.js", IDR_DOWNLOADS_JS); source->AddResourcePath("downloads.css", IDR_DOWNLOADS_CSS); source->SetDefaultResource(IDR_DOWNLOADS_HTML); web_ui->AddMessageHandler(std::make_unique<DownloadsUIHandler>());
WebUIDataSource
:URL 与资源 ID 映射WebUIMessageHandler
:处理 JS 与 C++ 消息交互自动注册,无需用户操作
2.3 权限与功能
内置扩展具有高权限
可访问浏览器内部 API
可操作标签页、下载管理、浏览器设置
安全策略:内置资源不可被替换
2.4 加载流程
浏览器启动 → 内核扫描内置扩展列表
调用
LoadExtension()
将扩展注册到ExtensionRegistry
渲染 WebUI 或注入 content script
前端 JS 与 C++ handler 通信完成页面功能
3. 普通扩展实现机制
3.1 存储与目录结构
普通扩展安装在用户 profile 下的 Extensions 目录,例如:
C:\Users\<User>\AppData\Local\Google\Chrome\User Data\Default\Extensions\<EXT_ID>\ ├── manifest.json ├── background.js ├── content.js ├── style.css
3.2 加载流程
浏览器启动或用户安装时扫描 profile 目录
解析
manifest.json
:background
:后台逻辑content_scripts
:注入网页 DOMweb_accessible_resources
:可访问资源
加载 background page / service worker
注入 content script 与页面交互
3.3 权限与隔离
权限通过 manifest.json 声明,例如
tabs
、webRequest
沙箱化:
Content script 仅能操作网页 DOM
Background page 可调用受限 API
CSP 限制资源加载和执行
3.4 升级与卸载
支持 Web Store 自动更新
用户可卸载或禁用
不影响浏览器核心功能
4. 内置扩展与普通扩展对比
维度 | 内置扩展 | 普通扩展 |
---|---|---|
存放位置 | 浏览器源码目录 / pak 文件 | 用户 profile/Extensions/<ID> |
加载时机 | 浏览器启动自动加载 | 浏览器启动或用户安装后扫描 |
权限 | 高,可操作内部 API | 沙箱化,受 manifest.json + CSP 限制 |
资源映射 | C++ + WebUIDataSource 映射 URL → pak | 直接从 profile 目录读取文件 |
更新方式 | 随浏览器更新 | Web Store 或自动更新 |
安全策略 | 内置资源不可篡改,高权限 | 沙箱隔离,防止核心被破坏 |
核心理解:内置扩展是浏览器功能的一部分,高权限、高安全;普通扩展是可选模块,用户可管理,沙箱隔离。
5. 案例分析
5.1 内置扩展示例:Downloads WebUI
功能:显示浏览器下载列表
目录:
chrome/browser/resources/downloads/
C++ handler:
DownloadsUIHandler
加载方式:
浏览器启动,注册 Downloads 内置扩展
WebUIDataSource 映射 HTML/JS/CSS
浏览器渲染页面,JS 与 C++ 通信
5.2 普通扩展示例:广告拦截器
功能:拦截网页广告
安装路径:
User Data/Default/Extensions/<ID>
权限:
tabs
、webRequest
加载方式:
用户安装或启动浏览器扫描
background.js 运行,注入 content script
页面 DOM 操作,有限 API 调用
6. 底层加载流程示意
内置扩展流程图:
浏览器启动 ↓ ExtensionService 加载内置扩展 ↓ WebUIDataSource 注册 URL → pak 文件映射 ↓ C++ handler 绑定前端消息 ↓ WebContents 渲染 HTML/JS/CSS ↓ 前端 JS 调用 C++ 内核 API 完成功能
普通扩展流程图:
浏览器启动或用户安装 ↓ 扫描 profile 目录 ↓ 解析 manifest.json ↓ 注册 background page / content script ↓ 注入页面或监听事件 ↓ 与受限 API 通信
7. 安全与性能设计分析
7.1 安全性
内置扩展:
资源不可篡改
高权限 WebUI 页面安全
普通扩展:
沙箱隔离
CSP 限制资源和脚本执行
7.2 性能
内置扩展:
pak 文件内存映射加载
按需加载模块化资源
普通扩展:
用户目录文件加载
Background script 常驻,影响内存占用
7.3 模块化与开发效率
内置扩展可快速迭代,不影响浏览器核心
普通扩展独立开发,可卸载,易于测试和发布
8. 总结
加载方式:内置扩展自动加载,普通扩展动态扫描
权限差异:内置扩展高权限,普通扩展沙箱化
资源管理:内置扩展内置于 pak 文件,普通扩展存储在 profile
安全策略:内置扩展不可篡改,普通扩展隔离保护核心
开发维护:模块化设计,内置与普通扩展互不干扰
理解内置扩展和普通扩展的机制,有助于浏览器开发者:
优化扩展加载性能
管理权限和安全策略
模块化维护浏览器功能