Chrome 瀏覽器前端與客戶端雙向通信實戰

????????Chrome 前端(即頁面 JS / Web UI)與客戶端(C++ 后端)的交互機制,是 Chromium 架構中非常核心的一環。下面我將按常見場景,從通道、流程、技術棧幾個角度做一套完整的分析,特別適合你這種在分析和改造瀏覽器底層的開發者。


🔧 典型交互場景分類

場景描述技術路徑
1?? WebUI 頁面與 C++ 后端交互如設置頁、擴展頁等WebUI <-> WebUIMessageHandler
2?? 頁面 JS 與 Extension 后端如插件調用 chrome.runtime.sendMessageJS <-> Mojo / native extension API
3?? 頁面 JS 與 Native 功能交互如調用瀏覽器硬件能力JS <-> Mojo / C++ Impl


📍 框架組件總覽圖


1?? WebUI 頁面交互機制詳解

? 構成組件

  • 前端:WebUI HTML + JS 頁面,嵌入在 chrome://browser://

  • 后端:繼承自 content::WebUIController + WebUIMessageHandler

? 流程詳解

  1. 前端 JS 發起調用

    chrome.send("MyFunctionName", [arg1, arg2]);
  2. 后端 C++ 注冊 handler

    void MyHandler::RegisterMessages() override {web_ui()->RegisterMessageCallback("MyFunctionName",base::BindRepeating(&MyHandler::OnMyFunction, base::Unretained(this)));
    }void MyHandler::OnMyFunction(const base::Value::List& args) {// 處理參數,回調 JSFireWebUIListener("on-data-ready", data);
    }
  3. 后端回調前端

    cr.addWebUIListener("on-data-ready", (data) => { ... });

? 應用場景

  • 設置頁 (chrome://settings)

  • 下載頁、擴展頁、歷史頁等


2?? Extension 與 Native 通信機制

? 構成組件

  • JS:使用 chrome.runtime.sendMessagechrome.extension.getBackgroundPage()

  • 后端:繼承 ExtensionFunction 并注冊到 ExtensionFunctionRegistry

? 流程示意

chrome.runtime.sendMessage({cmd: "doSomething"}, function(response) {console.log("Response:", response);
});// C++ Extension Function 實現
class DoSomethingFunction : public ExtensionFunction {public:ResponseAction Run() override {// 處理邏輯...return RespondNow(OneArgument(base::Value("OK")));}
};// 注冊宏
EXTENSION_FUNCTION_NAME("extensionInternal.doSomething")

? Chrome 擴展調用的是基于 IPC 和 Mojo 的通道,最終由瀏覽器進程分發請求到對應 ExtensionFunction。


3?? Mojo 通信機制(JS <-> Mojo <-> C++)

適用于較底層的交互,如性能數據、打印、系統 API 等。

? 構成組件

  • 前端:JS Binding(*.mojom-webui.js

  • 后端:C++ Mojo Impl(綁定接口實現)

  • 通道:RenderFrameHost->GetRemoteInterfaces() or WebUIDataSourceWithMojo

? 示例流程

// JS 側
mojo.bindInterface('my_namespace.MyInterface');
myInterface.doSomething().then((result) => { ... });// mojom 定義
interface MyInterface {DoSomething() => (string result);
}// C++ 實現并綁定
class MyInterfaceImpl : public mojom::MyInterface {public:void DoSomething(DoSomethingCallback callback) override {std::move(callback).Run("Done!");}
};web_ui()->BindInterface(std::make_unique<MyInterfaceImpl>());

🔄 JS 與 C++ 通信方式對比總結

通信方式特點適用場景
chrome.send()簡單、基于 WebUI Message內部頁面(如 chrome://*
chrome.runtime.sendMessage()基于擴展 IPC,功能強大插件調用瀏覽器能力
Mojo模塊化、高性能、支持多進程深層系統通信(如 Debug、音頻)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83875.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Server2003 B-1 Windows操作系統滲透

任務環境說明&#xff1a; 服務器場景&#xff1a;Server2003&#xff08;開放鏈接&#xff09; 服務器場景操作系統&#xff1a;Windows7 1.通過本地PC中滲透測試平臺Kali對服務器場景Windows進行系統服務及版本掃描滲透測試&#xff0c;并將該操作顯示結果中Telnet服務對應的…

滲透實戰PortSwigger靶場:lab13存儲型DOM XSS詳解

進來是需要留言的&#xff0c;先用做簡單的 html 標簽測試 發現面的</h1>不見了 數據包中找到了一個loadCommentsWithVulnerableEscapeHtml.js 他是把用戶輸入的<>進行 html 編碼&#xff0c;輸入的<>當成字符串處理回顯到頁面中&#xff0c;看來只是把用戶輸…

使用React+ant Table 實現 表格無限循環滾動播放

數據大屏表格數據&#xff0c;當表格內容超出&#xff08;出現滾動條&#xff09;時&#xff0c;無限循環滾動播放&#xff0c;鼠標移入暫停滾動&#xff0c;鼠標移除繼續滾動&#xff1b;數據量小沒有超出時不需要滾動。 *使用時應注意&#xff0c;滾動區域高度父元素高度 - 表…

機器人現可完全破解驗證碼:未來安全技術何去何從?

引言 隨著計算機視覺技術的飛速發展&#xff0c;機器學習模型現已能夠100%可靠地解決Google的視覺reCAPTCHAv2驗證碼。這標志著一個時代的結束——自2000年代初以來&#xff0c;CAPTCHA&#xff08;"全自動區分計算機與人類的圖靈測試"的縮寫&#xff09;一直是區分…

大模型安全測試報告:千問、GPT 全系列、豆包、Claude 表現優異,DeepSeek、Grok-3 與 Kimi 存在安全隱患

大模型安全測試報告&#xff1a;千問、GPT 全系列、豆包、Claude 表現優異&#xff0c;DeepSeek、Grok-3 與 Kimi 存在安全隱患 引言 隨著生成式人工智能技術的快速演進&#xff0c;大語言模型&#xff08;LLM&#xff09;正在廣泛應用于企業服務、政務系統、教育平臺、金融風…

docker 部署redis集群 配置

docker的網絡模式 網橋模式每次重啟容器都有可能導致容器ip地址變化&#xff0c;需要固定ip的自己自定義網絡&#xff0c;這里介紹的是默認網絡模式 docker創建容器 docker run --name redis6379 -p 6379:6379 -p 16379:16379 -v /etc/redis/redis6379:/etc/redis -d --r…

LabVIEW的AMC架構解析

此LabVIEW 程序基于消息隊列&#xff08;Message Queue&#xff09;機制構建 AMC 架構&#xff0c;核心包含消息生成&#xff08;MessageGenerator &#xff09;與消息處理&#xff08;Message Processor &#xff09;兩大循環&#xff0c;通過隊列傳遞事件與指令&#xff0c;實…

數據庫管理與高可用-MySQL主從復制與讀寫分離

目錄 #1.1MySQL主從復制原理 1.1.1MySQL支持的復制類型 1.1.2復制的工作過程 #2.1MySQL讀寫分離原理 2.1.1常見的MySQL讀寫分離為為兩種 #3.1主從復制讀寫分離的實驗案例 1.1MySQL主從復制的原理 MySQL 主從復制是一種常用的數據同步機制&#xff0c;用于將主數據庫&#xf…

Python60日基礎學習打卡Day45

之前的神經網絡訓練中&#xff0c;為了幫助理解借用了很多的組件&#xff0c;比如訓練進度條、可視化的loss下降曲線、權重分布圖&#xff0c;運行結束后還可以查看單張圖的推理效果。 如果現在有一個交互工具可以很簡單的通過按鈕完成這些輔助功能那就好了&#xff0c;他就是…

React項目的狀態管理:Redux Toolkit

目錄 1、搭建環境 2、Redux Toolkit 包含了什么 3、使用示例 &#xff08;1&#xff09;創建user切片 &#xff08;2&#xff09;合并切片得到store &#xff08;3&#xff09;配置store和使用store 使用js來編寫代碼&#xff0c;方便理解一些 1、搭建環境 首先&#xf…

父組件prop傳向子組件的值,被子組件直接v-model綁定 功能不生效

隱式修改組件屬性會導致功能異常 實際操作中發現&#xff0c;即便是父組件把簡單數據通過prop傳給了子組件&#xff0c;子組件再使用v-model綁定&#xff0c;也不行&#xff0c;響應式還是對異常 原vue2業務中存在組件定義某個類型為Object的屬性&#xff0c;然后將該屬性對象…

c#bitconverter操作,不同變量類型轉byte數組

緣起:串口數據傳輸的基礎是byte數組&#xff0c;write(buff,0,num)或者writeline(string)&#xff0c;如果是字符串傳輸就是string變量就可以了&#xff0c;但是在modbus這類hex傳遞時&#xff0c;就要遇到轉換了&#xff0c;拼湊byte數組時需要各種變量的值傳遞&#xff0c;解…

【Redis】set 類型

set 一. set 類型介紹二. set 命令sadd、smembers、sismemberscard、spop、srandmembersmove、srem集合間操作交集&#xff1a;sinter、sinterstore并集&#xff1a;sunion、sunionstore差集&#xff1a;sdiff、sdiffstore 三. set 命令小結四. set 內部編碼方式五. set 使用場…

02-Redis常見命令

02-Redis常見命令 Redis數據結構介紹 Redis是一個key-value的數據庫&#xff0c;key一般是String類型&#xff0c;不過value的類型多種多樣&#xff1a; 貼心小建議&#xff1a;命令不要死記&#xff0c;學會查詢就好啦 Redis為了方便學習&#xff0c;將操作不同數據類型的命…

Rk3568驅動開發_GPIO點亮LED_12

需求&#xff1a; 用配置寄存器方式控制點燈非常原始&#xff0c;現在采用更方便的Linux提供的pctrl和gpio子系統編寫字符驅動 1.設備樹配置&#xff1a; 現將開發板中呼吸燈關閉掉防止占用到我需要使用的引腳 /* Narnat 2025-5-29 RK3568 GPIO 無需設置pinctrl*/gpioled{co…

阿里云ACP云計算備考筆記 (3)——云存儲RDS

目錄 第一章 云存儲概覽 1、云存儲通用知識 ① 發展歷史 ② 云存儲的優勢 2、云存儲分類 3、文件存儲業務場景 第二章 塊存儲 1、塊存儲分類 2、云盤的優勢 3、創建云盤 4、管理數據盤 ① 格式化數據盤 ② 掛載數據盤 ③ 通過 API 掛載云盤 5、管理系統盤 ① 更…

亞矩陣云手機實測體驗:穩定流暢背后的技術邏輯?

最近在測試一款云手機服務時&#xff0c;發現亞矩陣的表現出乎意料地穩定。作為一個經常需要多設備協作的開發者&#xff0c;我對云手機的性能、延遲和穩定性要求比較高。經過一段時間的體驗&#xff0c;分享一下真實感受&#xff0c;避免大家踩坑。 ??1. 云手機能解決什么問…

STM32H562----------ADC外設詳解

1、ADC 簡介 STM32H5xx 系列有 2 個 ADC,都可以獨立工作,其中 ADC1 和 ADC2 還可以組成雙模式(提高采樣率)。每個 ADC 最多可以有 20 個復用通道。這些 ADC 外設與 AHB 總線相連。 STM32H5xx 的 ADC 模塊主要有如下幾個特性: 1、可配置 12 位、10 位、8 位、6 位分辨率,…

【Android】雙指旋轉手勢

一&#xff0c;概述 本文參考android.view.ScaleGestureDetector&#xff0c;對雙指旋轉手勢做了一層封裝&#xff0c;采用了向量計算法簡單實現&#xff0c;筆者在此分享下。 二&#xff0c;實例 如下&#xff0c;使用RotateGestureDetector即可委托&#xff0c;實現旋轉手…

B站的視頻怎么下載下來——Best Video下載器

B站&#xff08;嗶哩嗶哩&#xff09;作為國內最受歡迎的視頻平臺之一&#xff0c;聚集了無數優質內容&#xff1a;動漫番劇、游戲實況、學習課程、紀錄片、Vlog、鬼畜剪輯……總有那么些視頻讓人想反復觀看、離線觀看&#xff0c;甚至剪輯創作。 但你是否遇到過這樣的煩惱&am…