Mojo JavaScript 綁定 API
01 為 mojom 編譯js腳本
官網說明:
https://chromium.googlesource.com/chromium/src/+/refs/heads/main/mojo/public/js/README.md
src\services\test\echo
有一個echo_service demo。可以結合使用。
注意編譯生成 mojom 的 js 接口檔案的指令生成c++的指令
ninja -C out\Debug services\test\echo\public\mojom:mojom_js
ninja -C out\Debug services\test\echo\public\mojom:mojom
// js mojo 接口需要的依賴檔案在
gen\mojo\public\js\
目錄下:
gen\mojo\public\js\ mojo_bindings.js
gen\mojo\public\js\ mojo_bindings_lite.js
02 Mojo js的綁定權限
Mojo的js功能,并不是哪裡都可以用的。可以通過指令行增加參數啟用,還有就是預設的新标簽頁。
預設renderer和擴充程序是不能使用js的Mojo功能的。
可以通過注釋掉子程序的限制條件,來對所有情況開啟js的mojo功能。
void RenderFrameImpl::DidCreateScriptContext(v8::Local<v8::Context> context,
int world_id) {
v8::MicrotasksScope microtasks(blink::MainThreadIsolate(),
v8::MicrotasksScope::kDoNotRunMicrotasks);
//if (((enabled_bindings_ & BINDINGS_POLICY_MOJO_WEB_UI) ||
// enable_mojo_js_bindings_) &&
// IsMainFrame() && world_id == ISOLATED_WORLD_ID_GLOBAL) {
// // We only allow these bindings to be installed when creating the main
// // world context of the main frame.
// blink::WebV8Features::EnableMojoJS(context, true);
//}
if (IsMainFrame()) {
blink::WebV8Features::EnableMojoJS(context, true);
}
for (auto& observer : observers_)
observer.DidCreateScriptContext(context, world_id);
}
其他相關代碼:
void RenderFrameHostImpl::EnableMojoJsBindings()
void RenderFrameImpl::EnableMojoJsBindings()
js要導出的接口在
src\third_party\blink\renderer\core\mojo\mojo.idl
裡面定義的。
03 給擴充增加一些js接口
chrome/browser/resources/extensions/BUILD.gn
添加
excludes = [ "chrome://resources/js/cr.m.js",
"chrome://resources/mojo/mojo/public/js/bindings.js",
"chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js",
"chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js",
"chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js",
"chrome://resources/mojo/url/mojom/origin.mojom-lite.js",
"chrome://resources/mojo/url/mojom/url.mojom-lite.js",
]
chrome/browser/resources/extensions/extensions.js
添加
import 'chrome://resources/mojo/mojo/public/js/bindings.js';
import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
import 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js';
import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
添加如下内容後,可以看到chrome中,增加了
mojo
和
mojoBase
(小寫的
mojo
)
參考
chrome sandbox escape case study and plaidctf2020 mojo writeup
Chrome Extension 通信常用 API 說明
添加chromium mojom調用
Chromium C++與JS之間互調
雜記(3)chrome擴充程式開發之在目标頁面執行JS腳本
chromium 添加 javascript 擴充 即 C++與javascript互操作
chrome sandbox escape case study and plaidctf2020 mojo writeup (推薦)