【Chrome】如何在C++中增加给JavaScript调用的API
本文示例说明了如何在Chrome浏览器中增加JavaScript API。为了简化,先假设是在已有的namespace中增加一个新的API,文章的最后将指出如果增加一下全新的namespace所需注意的事项。
在继续之前,请确保你的Chrome浏览器中已安装了一些扩展程序。可以在地址栏中输入chrome://extensions查看已安装的扩展程序。下图示例说明了我的浏览器中已安装了Google Mail Checker扩展程序,我们将使用它来测试新增的API(测试可以使用任何扩展程序,而不需指定这所示例的Google Mail checker)。
从上图也同时示例了如何打开Chrome网上商店,我们需要进入该页面查看已开发好的API。进入页面后按F12打开开发者工具,并将开发者工具切换到控制台。
在开发者工具的控制台中,输入“chrome.management.un”其将显示management namespace所支持的API。
下面我们要做的,就是在management中增加showButton API,用于显示或隐藏扩展栏上(某)扩展程序的Icon。增加showButton API大体上分成两大部骤。步骤一为变更C++代码,步骤二为变更management.json接口描述文件。下面逐步讲解基于Chrome R28源码的具体变更内容。
首先,在src\chrome\browser\extensions\api\management\management_api.h中增加一个新类的声明。当showButton在Javascript中被调用时,该类将负责进行后续处理,其RunImpl方法将会被调用。
|
1
2
3
4
5
6
|
class ManagementShowButtonFunction : public ManagementFunction {
public:
DECLARE_EXTENSION_FUNCTION("management.showButton", MANAGEMENT_UNINSTALL)
private:
virtual bool RunImpl() OVERRIDE;
};
|
接着,在src\chrome\browser\extensions\api\management\management_api.cc中增加新类的实现。RunImpl方法根据JavaScript所传入的两个参数调用SetBrowserActionVisibility函数,实现对扩展程序Icon的显示和隐藏。第一个参数为扩展程序的ID,第二个参数是一个布尔变量,用于指示是显示(true)抑或隐藏(false)扩展程序的Icon。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
bool ManagementShowButtonFunction::RunImpl() {
std::string extension_id;
EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &extension_id));
bool enable;
EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(1, &enable));
const Extension* extension = service()->GetExtensionById(extension_id, true);
if (!extension) {
error_ = ErrorUtils::FormatErrorMessage(
keys::kNoExtensionError, extension_id);
return false;
}
service()->extension_prefs()->SetBrowserActionVisibility(extension, enable);
return true;
}
|
最后,我们在src\chrome\common\api\management.json中增加showButton的描述。请注意,在该文件中存在functoins和events两大部分,一定要将新增内容放入functions部分。为了防止变更JSON文件时出错,可以使用Notepad++,并在其上安装JSLint和JSMin两个插件。在编辑完JSON文件后先调用Plugins->JSMin->JSFormat(Notepad++中的菜单命令),然后是Plugins->JSLint->JSLint Current File检查是否存在错误。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{
"name" : "showButton",
"description" : "Show/Hide extension icon on extension bar.",
"parameters" : [
{
"name" : "id",
"type" : "string",
"description" : "This should be the id from an item of $ref:ExtensionInfo."
},
{
"name" : "enabled",
"type" : "boolean",
"description" : "Whether this item should be enabled or disabled."
}
]
}
|
有了以上的变更后,在编译Chrome项目之前,需手动重新编译api项目,因为Chrome项目并不依赖于api项目。重新编译将使得在自动生成的GeneratedFunctionRegistry:: RegisterAll函数内增加对ManagementShowButtonFunction的注册。
程序编译完成后,我们可以在开发者工具的控制台上测试showButton函数。下图示例说明了通过调用该函数隐藏和显示Google Mail Checker扩展程序的Icon。
上面示例了如何在已存在的management namespace中增加一个API。在Chrome中,JavaScript API的使用存在权限的概念。如果新增API的同时也需新增namespace的话,需要注意在APIPermissionInfo::RegisterAllPermissions方法中注册新增namespace的权限,否则会出现页面无法访问新增API的问题。
【Chrome】如何在C++中增加给JavaScript调用的API的更多相关文章
- 详解如何在Laravel中增加自定义全局函数
http://www.php.cn/php-weizijiaocheng-383928.html 如何在Laravel中增加自定义全局函数?在我们的应用里经常会有一些全局都可能会用的函数,我们应该怎么 ...
- 一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 在Angular.js中的H5页面调用Web api时跨域问题处理
/// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...
- 如何在BI中增加“路线地图”并进行数据分析?
随着客户的需求越来越"百变",最近在做大屏设计的葡萄陷入了困境. 近期客户提出的需求是想在BI工具中增加 "路线地图"展示功能并进行数据分析. 不仅如此,这个& ...
- 如何在 FineUIMvc 中引用第三方 JavaScript 库
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...
- Xcode中c++&Object-C混编,详细介绍如何在cocos2dx中访问object函数以及Apple Api
转自:http://www.himigame.com/iphone-cocos2dx/743.html Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Jav ...
- Android中Webview使用javascript调用事先定义好的Java函数
1. 首先定义好一个类,专们用于给javascript调用 public class JavaScriptInterface { // share your news public void shar ...
- 【转】NativeScript的工作原理:用JavaScript调用原生API实现跨平台
原文:https://blog.csdn.net/qq_21298703/article/details/44982547 -------------------------------------- ...
- 如何在OpenFOAM中增加边界条件【翻译】
注:如有翻译不妥,还请见谅 翻译自:http://openfoamwiki.net/index.php/HowTo_Adding_a_new_boundary_condition 首先请看:http: ...
随机推荐
- C#获取远程计算机硬件信息实例(支持linux和windows)
原文:C#获取远程计算机硬件信息实例(支持linux和windows) 网上关于WMI的资料很多,但一直没有比较全的属性介绍.今天通过反射把所有属性都给弄出来了. 关于WMI的代码就不多说了. ...
- 删除Python UserWarning[已解决]
在使用MySQLdb包后,导入测试时发现一个警告. /usr/lib/python2.6/site-packages/setuptools-0.8-py2.6.egg/pkg_resources.py ...
- OSG(OpenSceneGraphcow.osg)配置笔记
OpenSceneGraph是一款高性能的3D图形开发库.广泛应用在可视化仿真.游戏.虚拟现实.高端技术研发以及建模等领域.使用标准的C++和OpenGL编写而成,可以运行在Windows系列.OSX ...
- 用HTML和javascript(JS)计算触屏手机手指滑动方向的演示
移动终端的流行,程序员希望通过HTML+JS完成触屏动作的识别.下面给出具体实现的例子,供大家参考. 将下面的代码复制并保存,用手机访问,现在的手机浏览器一般都支持触屏,针对本演示来讲就是支持三个js ...
- Castle扩展Ibatis.Net
使用Castle扩展Ibatis.Net,面向接口编程-更优雅的代码 使用Ibatis.Net做项目半年了,甚是喜欢,感觉确实是个简单.轻巧的O/R Mapping框架,特别是将Sql配置在Xml文件 ...
- 在Ubuntu上安装 nginx, MySQL, PHP (LEMP),phpmyadmin和WordPress
0)更新 Apt-Get 终端命令:sudo apt-get update 1) 安装php sudo apt-get install php5 2)安装MySql 终端命令: sudo apt-ge ...
- 数据访问层的改进以及测试DOM的发布
数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...
- python包
有个伟人说过: python的学习很大一部分取决与你对第三方包的熟悉和掌握程度! virtualenv virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够: ...
- Memcached快递上手之C#
Memcached快递上手之C# Memcached是开源高性能分布式缓存组件,目前已经广泛应用各类互联网领域. 具有多种语言的客户端开发包,包括:Perl/PHP/JAVA/C/Python/Rub ...
- 线程池python
原创博文,转载请注明出处 今天在学习python进程与线程时,无意间发现了线程池threadpool模块,见官方文档. 模块使用非常简单,前提是得需要熟悉线程池的工作原理. 我们知道系统处理任务时,需 ...