深入解析 Chromium/360 浏览器 WebUI 页面加载机制与资源扩展实战

AionUi:开源离线AI办公工具的跨平台架构解析 AI办公工具正从云端依赖转向本地可控,其核心在于如何平衡模型轻量化、跨平台一致性与数据主权保障。基于Llama.cpp的本地推理引擎和Avalonia UI框架,实现了CPU低负载、内存确定性与多端渲染统一;结合魔改unstructured的文档结构化解析能力,支持PDF/DOCX等格式的坐标级文本还原与审计留痕。这类技术组合不仅规避了Electron高内存占用与Ollama黑盒推理缺陷,更在法务、审计、教育等对隐私与可验证性有硬性要求的场景中形成差异化价值。AionUi正是这一演进路径下的典型实践。 阅读详情

正文

一、引言

在现代浏览器中,除了普通网页之外,还有大量的内部管理页面,例如 chrome://settings、chrome://version 等。这些页面通常被称为 WebUI 页面。与普通网页相比,WebUI 页面拥有更高的权限,可以直接访问浏览器内部数据,并且对资源加载有更严格的安全控制。

本文将从 Chromium/360 浏览器源码角度,深入解析 WebUI 的加载机制,重点关注 WebUIController → DataSource → HTML/JS 的完整流程,并结合实际案例说明资源文件如何从源码打包到 ZIP 文件,最后讨论如何扩展 WebUI 页面。


二、WebUI 页面整体架构概览

在 Chromium/360 浏览器中,WebUI 页面加载流程主要可以拆分为三个核心环节:

  1. WebUIController:页面逻辑控制器,负责初始化数据源、注册消息接口。

  2. DataSource:资源提供者,负责提供 HTML/JS/CSS 以及动态 JSON 数据。

  3. HTML/JS:前端展示层,加载 DataSource 提供的资源,通过消息接口与浏览器内部交互。

完整流程可以抽象为:

浏览器 URL 导航 (chrome://xxx) ↓ WebUIController 创建/初始化 ↓ 注册 DataSource 与 MessageHandler ↓ 浏览器请求 URL → DataSource 提供 HTML/JS/CSS ↓ 渲染进程解析 HTML → 执行 JS ↓ JS 调用 WebUIController 接口 (chrome.send) ↓ Controller 处理逻辑 → 返回 JSON 数据给 JS 

核心理解

  • Controller:负责业务逻辑和数据接口。

  • DataSource:负责资源提供和请求分发。

  • HTML/JS:负责页面渲染和用户交互,安全沙箱内执行,依赖 Controller 提供的数据。


三、WebUIController 深度解析

WebUIController 是 WebUI 页面背后的逻辑核心,每个 WebUI 页面都有一个对应的 Controller 类。例如:

  • Chromium 中 AboutUIController 对应 chrome://version。

  • 360 浏览器可能有 SeWebUIController。

3.1 Controller 的职责

  1. 初始化页面数据源

    • Controller 在构造函数中,会通过 content::WebUI::AddDataSource 注册页面资源的 DataSource。

    • 例如:

      content::WebUIDataSource* html_source = content::WebUIDataSource::Create("my_page"); web_ui->AddDataSource(html_source);

  2. 注册消息接口

    • Controller 通过 AddMessageHandler 注册 JS 消息处理器:

      web_ui->AddMessageHandler(std::make_unique<MyPageHandler>());

    • JS 页面可以通过 chrome.send('handlerName', args) 调用 Controller 提供的接口。

  3. 处理生命周期事件

    • 包括页面初始化、渲染完成通知、数据刷新等。


四、DataSource 深度解析

DataSource 是 WebUI 页面资源的核心提供者,它封装了资源映射、动态生成和拦截机制。

4.1 DataSource 的类型

  1. 静态资源 DataSource

    • HTML、JS、CSS 直接打包在浏览器源码中。

    • 通过 ResourceBundle 或 chrome/grit 系统管理。

    • 示例:

      html_source->AddResourcePath("my_page.js", IDR_MY_PAGE_JS); html_source->SetDefaultResource(IDR_MY_PAGE_HTML);

  2. 动态资源 DataSource

    • 支持生成 JSON、HTML 片段,供前端请求。

    • 常见方法:

      void StartDataRequest( const std::string& path, const content::WebUIDataSource::GotDataCallback& callback) override;

4.2 DataSource 流程

  • 当浏览器导航到 chrome://my_page 时:

    1. 渲染进程请求 URL。

    2. DataSource 拦截请求,根据路径返回资源。

    3. 渲染进程接收资源,解析 HTML,执行 JS。


五、HTML/JS 加载与渲染

HTML/JS 层负责展示与交互,通过 Controller 提供的消息接口访问浏览器内部数据。

5.1 HTML/JS 加载机制

  1. HTML 解析

    • 渲染进程通过 Blink 引擎解析 HTML。

    • 支持内联 CSS,也可以通过 DataSource 提供的外部 CSS。

  2. JS 执行

    • JS 在 V8 引擎中运行。

    • 可以通过 chrome.send 或 sendMessage 调用 Controller 的接口:

      chrome.send('getVersionInfo', [], function(response) { console.log(response.version); });

  3. 页面渲染完成

    • 页面渲染完成后触发 DOMContentLoaded 或 WebUI 特有事件。

    • Controller 可以在此时发送初始数据。


六、资源文件管理与 ZIP 打包

在 Chromium/360 浏览器中,WebUI 页面资源通常通过 grit / ResourceBundle 打包到二进制文件中,或者在开发阶段存放在独立文件中。

6.1 资源到二进制的流程

  1. 源码资源文件

    • HTML/JS/CSS 放在 chrome/browser/resources/ 或 360browser/resources/ 下。

  2. GRIT 编译

    • grit 会将资源文件生成 .h 和 .cc 文件:

      #define IDR_MY_PAGE_HTML 1000 const unsigned char kMyPageHtml[] = { ... };

    • 编译器将这些文件打包到浏览器可执行文件或 DLL 中。

  3. 渲染进程访问

    • DataSource 通过 AddResourcePath 或 SetDefaultResource 映射 ID,渲染进程通过 URL 请求获得资源。

6.2 ZIP 资源管理(可选)

  • 为了减少文件数或加快加载,可以将 HTML/JS/CSS 打包成 ZIP:

    1. 开发阶段使用 Python/Node 工具将文件压缩:

      import zipfile zipf = zipfile.ZipFile('webui_resources.zip', 'w') zipf.write('my_page.html') zipf.write('my_page.js') zipf.close()

    2. DataSource 在 StartDataRequest 中读取 ZIP:

      std::string data = ReadFromZip("webui_resources.zip", path); callback.Run(base::RefCountedString::TakeString(&data));

  • 优势:

    • 减少文件数量,提高 I/O 效率。

    • 可方便做版本管理和动态更新。


七、WebUI 页面扩展机制

WebUI 的设计允许灵活扩展新页面或功能。

7.1 新增页面步骤

  1. 创建 Controller

    • 继承 WebUIController,初始化 DataSource 与消息接口。

  2. 注册 DataSource

    • 指定 URL 和资源映射:

      web_ui->AddDataSource(html_source);

  3. 新增 HTML/JS

    • 可直接写文件,也可以通过 GRIT 打包成资源 ID。

  4. 消息交互

    • JS 调用 Controller 接口:

      chrome.send('myAction', [param1, param2]);

    • Controller 返回处理结果:

      web_ui()->CallJavascriptFunction("myCallback", response_value);

7.2 动态扩展 DataSource

  • 可以在运行时注册新的路径或 API:

    html_source->AddResourcePath("new_module.js", IDR_NEW_MODULE_JS);

  • 动态 JSON 接口支持前端按需拉取数据:

    void MyHandler::HandleRequest(const base::ListValue* args) { base::Value result(base::Value::Type::DICTIONARY); result.SetStringKey("key", "value"); web_ui()->CallJavascriptFunction("onDataReady", result); }


八、实践经验与注意事项

  1. 资源安全

    • WebUI 页面资源只允许内部访问,避免被外部网页请求。

    • DataSource 可以拦截非法路径请求。

  2. 性能优化

    • 尽量使用 ZIP 或二进制打包,减少文件 I/O。

    • JS 逻辑尽量在渲染完成后按需加载。

  3. 可维护性

    • Controller 与 DataSource 分层清晰,方便后期新增功能。

    • HTML/JS 与 Controller 消息接口保持一致,避免接口混乱。

  4. 调试技巧

    • Chromium 提供 chrome://inspect/#pages 进行 WebUI 页面调试。

    • 可在 DataSource 中添加日志打印请求路径,便于排查问题。


九、总结

本文从源码角度深入解析了 Chromium/360 浏览器的 WebUI 页面加载机制:

  1. WebUIController 负责页面逻辑和消息接口。

  2. DataSource 提供资源映射与动态数据生成。

  3. HTML/JS 渲染展示层,依赖 Controller 数据交互。

  4. 资源文件管理:支持 GRIT 打包、ZIP 压缩,提高加载效率。

  5. 扩展机制:可新增 Controller、DataSource、HTML/JS,实现新页面或功能。

通过本文的分析,读者可以对 WebUI 页面从 URL 到渲染的完整链路有清晰认识,并能实现资源管理、性能优化和页面扩展实践。

C++中的Thunk技术和它的使用场景 阅读详情

相关推荐

深入解析 Chromium Mojo IPC:跨进程通信原理与源码实战

本文深入解析Chromium浏览器中的Mojo IPC机制,这一高性能跨进程通信框架支撑着现代浏览器多进程架构的运行。文章从Mojo的五个核心概念(MessagePipe、Handle、Interface、Receiver/Remote、Bindings)切入,详细剖析了其数据流、线程模型和异步机制。通过源码分析展示了MessagePipe的底层实现、SimpleWatcher的事件监听机制,以及接口自动生成类的运作原理。最后提供了实战示例和性能优化建议,包括使用SharedBuffer减少拷贝、合理绑定线

John_ToStr的博客 2043

Chrome浏览器扩展深度解析:内置扩展与普通扩展的实现机制对比

浏览器扩展分为内置扩展和普通扩展两种类型。内置扩展是浏览器核心功能模块,随浏览器启动自动加载,资源打包进浏览器文件,具有高权限可访问内部API;普通扩展由用户安装,存储在用户目录,权限受manifest.json限制,采用沙箱隔离机制。两者在加载方式、权限管理、资源存储和安全策略上存在明显差异,共同构成了浏览器模块化功能体系。理解这种差异对浏览器开发者的性能优化、权限管理和安全设计至关重要。

John_ToStr的博客 1268

深入理解浏览器渲染引擎:底层机制与性能优化实战

本文深入探讨了现代浏览器渲染引擎的工作原理,特别是Blink和V8引擎的协作机制。文章首先概述了浏览器的多进程架构,包括浏览器进程、渲染进程、GPU进程和网络进程的功能。接着,详细解析了渲染引擎的核心步骤,从HTML和CSS的解析到DOM和CSSOM的构建,再到渲染树的形成、布局、绘制和最终的合成阶段。文章还探讨了JavaScript引擎与渲染引擎的交互方式,以及如何通过优化策略减少重排和重绘,提升页面渲染性能。最后,提供了Chromium源码的调试路径和实用建议,帮助开发者更好地理解和优化渲染流程。

John_ToStr的博客 1777

IronClaw E2E 测试套件实战:用 Python + Playwright 驱动真实 IronClaw 实例与 Provider 世界

本文基于仓库中 `tests/e2e/CLAUDE.md` 这份 E2E 测试目录说明,结合 `tests/e2e/` 下的真实源码(`conftest.py`、`helpers.py`、`pyproject.toml`)与 CI 工作流,完整讲解 IronClaw 的端到端测试体系:如何搭建环境、如何驱动 Reborn `ironclaw serve` WebChat v2 SPA、会话/函数两

gitblog_00612的博客 863

基于jquery实现的仿360浏览器猜你喜欢代码

一款jquery仿360浏览器猜你喜欢悬浮的更多图片列表查看代码

易语言高仿360手机浏览器源码

本源码高仿360手机浏览器,做工精细,非常逼真。

自己动手:一段代码完全屏蔽360浏览器的广告

360浏览器再国内可以说用户现在非常多了,但是360和北京电视台合弄了一个北京时间新闻网,霸屏了新闻网,通过360浏览器引流,各种吸引人的知音体标题,当你打开一个网页打不开的时候就弹出来,让你忍不住去点击的,什么80岁老人爱上保姆,谁谁谁又被潜规则了,让你好奇心忍不住去点击,无法聚精会神的工作, 或者是月入十万、一夜七次郎微商卖药等等的广告,如下图所示,特别无语。 下面教大家用一段代码非常简单的就...

weixin_tt564的博客 2636

浏览器 源码 仿360 C# 个人项目

浏览器 源码 仿360 C# 个人项目 浏览器 源码 仿360 C# 个人项目 浏览器 源码 仿360 C# 个人项目

360浏览器内核切换原理及代码优化方案

自定义切核功能说明 ...

cocplay的博客 7239

360浏览器

360浏览器

易语言仿360浏览器源码

易语言仿360浏览器源码

贪心算法——最大整数问题详解

贪心算法——最大整数问题详解: [最大整数]设有n个正整数,将它们连接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。 又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。 输入:n N个数 输出:连成的多位数 算法分析:此题很容易想到使用贪心法,在考试时有很多

John_ToStr的博客 7773

UE5 Mass交通规则设计指南:从Stop Sign到智能红绿灯的进阶配置

本文详细解析了UE5 Mass框架下的交通规则设计,从基础Stop Sign到智能红绿灯的进阶配置。通过UMassTrafficIntersectionSpawnDataGenerator等核心组件,实现动态响应、自然流畅的交通行为系统,提升虚拟城市的真实感与游戏性。

weixin_30500105的博客 501

Windows Hook案例分析与技术探索

Hook是Windows中提供的一种用以替换DOS下“中断“的系统机制,中文译为“挂钩”或“钩子”。在对 特定的系统事件进行Hook后,一旦发生已Hook事件,对该事件进行Hook的程序就会收到系统的通知, 这时程序就能在第一时间对该事件做出响应。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有 到达目的程序前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理 (改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。..

John_ToStr的博客 7128

VS2022离线安装总闪退?可能是这个--noWeb参数没加对(完整参数指南)

本文深入解析了VS2022离线安装过程中常见的闪退问题,指出核心原因往往在于命令行参数使用不当,特别是`--noWeb`参数。文章提供了完整的参数使用指南和实战解决方案,包括证书处理、安装器文件修复及自动化脚本,帮助用户彻底解决离线部署中的验证失败与闪退难题。

weixin_28842269的博客 755

Mplus实战:如何用交叉滞后面板模型(CLPM)分析心理学纵向数据?

本文提供了在Mplus软件中应用交叉滞后面板模型(CLPM)分析心理学纵向数据的实战指南。文章详细拆解了CLPM的核心概念、Mplus语法框架,并涵盖从基础的两变量模型到多变量、潜变量建模的扩展,以及结果解读与常见陷阱规避,旨在帮助研究者利用这一经典工具有效探索变量间的动态预测关系。

weixin_29253711的博客 402

浏览器无痕模式机制解析:它与正常模式究竟有何不同?

在日常浏览网页时,很多用户会注意到浏览器提供了“无痕模式”、“隐私窗口”或“InPrivate模式”等选项。这个功能常常被认为是“匿名上网”,但从技术实现角度来看,无痕模式到底和普通浏览模式有什么不同?它真的能完全不留痕迹吗?又有哪些场景下开发者要注意两种模式的行为差异? 本文将从浏览器实现机制出发,系统地讲解无痕模式的原理、与普通模式的区别、以及它在开发调试中的表现差异和典型使用场景。

John_ToStr的博客 6026

CPU 占用升高 ≠ 卡顿:浏览器硬件加速的真正价值

浏览器开启硬件加速后CPU占用升高但运行更流畅的现象属于正常优化:硬件加速将图形任务从CPU主线程转移到GPU处理,虽然GPU调度会消耗部分CPU资源,但显著减轻了主线程负担,带来更流畅的体验。建议多数设备开启该功能,仅在驱动不兼容或低功耗场景下关闭。通过chrome://gpu可验证加速是否生效,开发者还能追踪关键渲染事件进行深度优化。

John_ToStr的博客 2134

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5941

【面试经验】大疆笔试-计算机视觉算法B卷

3、a=np.random.randn(3,3) b=np.random.randn(3,1) ,那么c=a*b的维度应该是:*是元素乘法或者torch.mul,@才是矩阵乘法或者torch.matmul,不会触发广播机制;8、将分辨率降低一半时,精标定内参(fx、fy、cx、cy、k1、k2、k3)焦距、光心、畸变系数将分别变成(fx、fy、cx/2、cy/2、k1、k2、k3),只能搜到光心变成一半,畸变系数不变。12、KLT算法在频闪光源、重复纹理、高速机动、环境照度低的情况下效果显著下降。

litterfinger的博客 1444

揭秘浏览器中 Cookie 的真正作用与性能影响

本文深入解析了Cookie在Web开发中的真实作用与性能影响。文章首先澄清了"Cookie能加速请求"的常见误解,指出Cookie不仅不会提升性能,反而可能因增加请求体积和降低缓存命中率而拖慢加载速度。通过分析Cookie的定义、核心作用(状态保持、个性化、行为跟踪)和现代浏览器对其的限制(SameSite、分区存储等),作者强调Cookie是状态管理工具而非性能优化手段。文章提供了实用建议:合理设置作用域、避免存储大数据、为静态资源使用独立域名等,并推荐采用现代缓存策略替代过度依赖Co

John_ToStr的博客 1627

用一个稳定的 Deep Link,直接打开 SAP CRM WebClient 里的 Sales Order 创建界面

本文详细介绍了如何在SAP CRM WebClient UI中构建直接进入销售订单创建页面的Deep Link URL。关键步骤包括:1) 通过SMICM和SICF确认系统入口路径及端口;2) 使用BSP_DLC_SDESIGN或F2功能获取Sales Order的对象类型;3) 确保创建动作(D)能正确映射到目标页面;4) 按规范拼接包含sap-client、saprole等参数的完整URL。文章还提供了ABAP代码示例自动生成URL,并提醒注意浏览器缓存问题。通过这种标准化导航方式,可以实现稳定的页面直

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 208

关于回调函数跟this指针的一些理解

在C里面,经常需要提供一个函数地址,注册到结构里,然后在程序执行到特定阶段时,回调该函数。创建线程,注册线程运行的主函数就是一个典型的例子。这里以简单的回调实例,说明C++中回调函数为成员函数时有关this指针的问题。由于C++对C的继承关系,C++没有自己的线程封装技术,一般而言我们创建线程时,还是用C的回调函数机制。类似的例子也挺多的。在Java等纯粹的面向对象语言,则不一样,不光有自己的独立

John_ToStr的博客 1543

从 ABAP 后端到 AEX,Local Integration Engine 下的 Business System 配置全景

本文围绕SAP PI AEX配置中ABAP后端系统与AEX的连接问题,梳理了关键概念和技术脉络。重点指出基于ABAP 6.20及更高版本的业务系统内置了本地集成引擎(Local Integration Engine),负责与AEX的消息交互。配置要点包括:1)在SM59中创建HTTP类型RFC目标连接AEX;2)配置SAP_PROXY_ESR供设计时代理生成;3)通过SXMB_ADM设置业务系统角色为应用系统;4)确保SLD注册和SICF服务激活。文章特别强调运行时代理消息传递与设计时代理生成的区分,以及H

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 97

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 写给程序员的一条工作方法论:独立思考 vs 高效提问(附案例对比)
下一篇: 深入理解 depot_tools:Chromium 源码开发全流程(fetch/gclient/git cl 使用详解与踩坑经验)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ปรัชญา แค้วคำมูล

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值