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

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++ 层)

内置扩展随浏览器启动自动加载,通过 ExtensionServiceExtensionRegistry 注册。例如 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 加载流程

  1. 浏览器启动 → 内核扫描内置扩展列表

  2. 调用 LoadExtension() 将扩展注册到 ExtensionRegistry

  3. 渲染 WebUI 或注入 content script

  4. 前端 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 加载流程

  1. 浏览器启动或用户安装时扫描 profile 目录

  2. 解析 manifest.json

    • background:后台逻辑

    • content_scripts:注入网页 DOM

    • web_accessible_resources:可访问资源

  3. 加载 background page / service worker

  4. 注入 content script 与页面交互

3.3 权限与隔离

  • 权限通过 manifest.json 声明,例如 tabswebRequest

  • 沙箱化:

    • 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

  • 加载方式:

    1. 浏览器启动,注册 Downloads 内置扩展

    2. WebUIDataSource 映射 HTML/JS/CSS

    3. 浏览器渲染页面,JS 与 C++ 通信

5.2 普通扩展示例:广告拦截器

  • 功能:拦截网页广告

  • 安装路径:User Data/Default/Extensions/<ID>

  • 权限:tabswebRequest

  • 加载方式:

    1. 用户安装或启动浏览器扫描

    2. background.js 运行,注入 content script

    3. 页面 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. 总结

  1. 加载方式:内置扩展自动加载,普通扩展动态扫描

  2. 权限差异:内置扩展高权限,普通扩展沙箱化

  3. 资源管理:内置扩展内置于 pak 文件,普通扩展存储在 profile

  4. 安全策略:内置扩展不可篡改,普通扩展隔离保护核心

  5. 开发维护:模块化设计,内置与普通扩展互不干扰

理解内置扩展和普通扩展的机制,有助于浏览器开发者:

  • 优化扩展加载性能

  • 管理权限和安全策略

  • 模块化维护浏览器功能

http://www.xdnf.cn/news/18313.html

相关文章:

  • (栈)Leetcode155最小栈+739每日温度
  • 力扣 30 天 JavaScript 挑战 第37天 第九题笔记 知识点: 剩余参数,拓展运算符
  • Spring Boot集成腾讯云人脸识别实现智能小区门禁系统
  • 【C++去除整数某一位数字求新数和倍数保留2位小数控制】2022-10-22
  • 人工智能 -- 循环神经网络day1 -- 自然语言基础、NLP基础概率、NLP基本流程、NLP特征工程、NLP特征输入
  • 打造医疗新质生产力
  • 如何用算力魔方4060安装PaddleOCR MCP 服务器
  • visual studio更改git提交的用户名和邮件
  • Seaborn数据可视化实战:Seaborn基础与实践-数据可视化的艺术
  • 高效处理NetCDF文件经纬度转换:一个纯CDO驱动的Bash脚本详解
  • [大模型微调]基于llama_factory用 LoRA 高效微调 Qwen3 医疗大模型:从原理到实现
  • WPF中UI线程频繁操作造成卡顿的处理
  • 中文房间悖论:人工智能理解力的哲学拷问
  • 深度解析游戏引擎中的相机:视图矩阵
  • 小体积晶振1610/2016/3225选型参数
  • 小游戏AssetBundle加密方案解析
  • 5.Shell脚本修炼手册---Linux正则表达式(Shell三剑客准备启动阶段)
  • 电能质量监测装置 分布式光伏安全并网“准入证”
  • 8.21 随机森林
  • conda create 报错:Unable to read repodata JSON(镜像 pkgs/free 导致)
  • Neovim clangd LSP 配置出现 “attempt to call field ‘ge‘”
  • C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述-下篇)
  • 鸿蒙中基础耗时分析:Time分析
  • 音视频面试题集锦第 29 期
  • JetBrains Mono字体
  • Vue3组件系统完全指南:从入门到面试通关
  • (第二十期下)超链接的更多分类
  • 血缘元数据采集开放标准:OpenLineage Dataset Facets
  • java开发面试题(提高篇)
  • 大数据毕业设计选题推荐-基于大数据的北京气象站数据可视化分析系统-Hadoop-Spark-数据可视化-BigData