天天看点

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