Chromium web IDL
我还没有实践成功,只是单纯记录下
参考文档:
https://github.com/oceanlantern/chrome-blink
https://www.chromium.org/developers/web-idl-interfaces/
https://www.chromium.org/blink/webidl/
在Chromium里的Blink中添加API
我的目标导出js的接口使得可以在页面通过js调用C++的一些方法完成任务
前言
关于导出C++接口方法
1 在extension api导出接口方便extension调用
2 在Blink内核中导出接口
我使用方法2完成导出,阅读一下内容可能需要了解Web IDL,Blink GC,Chromium Task等方面的知识,相关的一些资料在最后给出
环境
chroumium版本 70.0.3538.513
过程
在C++中定义Example类,该类会执行一个耗时操作,完成后调用回调将结果返回
在js里需要构造Example类,添加一个回调函数,然后调用将结果输出
添加目录
在third_party/blink/renderer/modules添加example目录,idl及对应的C++的实现统一放在这个目录
编写IDL文件
1 WebIDL是一种接口描述规范,可以用来生成一些C++和js之间的转换代码
2 inishedCallback为回调限制的类型,编译时会自动生成一个C++对象V8FinishedCallback与之对应
3 [Constructor]表明该interface可以再js中使用new构造,该属性可以有参数,对应的C++方法为static Example* Create(),Example实例被blink GC管理不需要对应的delete
4 Example需要编写blink::Example与之对应
1
|
callback FinishedCallback = void(DOMString msg);
|
编写C++代码
1 继承ScriptWrappable类可以提供类型描述,并且该类继承GarbageCollectedFinalized,所以Example是一个blink GC对象.类Example声明的方法与idl是对应的,除了构造函数比较特别以外.
2 #include “third_party/blink/renderer/bindings/modules/v8/v8_finished_callback.h”这个文件是根据idl里面callback自动生成的文件,编译后才会有.
3 不要再别的线程里调用js注册的回调函数
以上说明在代码注释里面也有对应
example.h
1
|
#ifndef __EXAMPLE_H__
|
example.cc
1
|
#include "example.h"
|
编写编译文件
修改的地方比较杂,但是不难理解
1 在third_party/blink/renderer/modules/example里添加以下文件来说明example模块编译的规则
BUILD.gn
1
|
|
2 在third_party\blink\renderer\modules\BUILD.gn文件的deps变量里添加以下内容确保example模块被编译
1
|
"//third_party/blink/renderer/modules/example",
|
3 在third_party\blink\renderer\modules\modules_idl_files.gni文件的modules_idl_files里的get_path_info传入参数中添加以下内容确保idl文件被编译
1
|
"example/example.idl",
|
4 在third_party\blink\renderer\bindings\modules\v8\generated.gni文件的generated_modules_callback_function_files变量里添加以下内容确保idl生成的C++文件被编译
1
|
"$bindings_modules_v8_output_dir/v8_finished_callback.cc",
|
验证
chromium编译成功后在console输入以下语句成功后会在10秒后弹出消息
1
|
example = new Example()
|
参考资料
https://heycam.github.io/webidl/#idl-types
https://www.chromium.org/developers/web-idl-interfaces
https://www.chromium.org/blink/webidl#TOC-Style