天天看點

chromium 40 Mojo JavaScript 綁定 APIMojo JavaScript 綁定 API

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 接口檔案的指令

ninja -C out\Debug services\test\echo\public\mojom:mojom_js

生成c++的指令

ninja -C out\Debug services\test\echo\public\mojom:mojom

chromium 40 Mojo JavaScript 綁定 APIMojo JavaScript 綁定 API

// 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

)

chromium 40 Mojo JavaScript 綁定 APIMojo JavaScript 綁定 API

參考

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 (推薦)