本文示例说明了如何在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的问题。

本文出自李云的博客,请务必保留此出处:http://blog.csdn.net/hzliyun/article/details/9350971

【Chrome】如何在C++中增加给JavaScript调用的API的更多相关文章

  1. 详解如何在Laravel中增加自定义全局函数

    http://www.php.cn/php-weizijiaocheng-383928.html 如何在Laravel中增加自定义全局函数?在我们的应用里经常会有一些全局都可能会用的函数,我们应该怎么 ...

  2. 一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  3. 在Angular.js中的H5页面调用Web api时跨域问题处理

    /// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...

  4. 如何在BI中增加“路线地图”并进行数据分析?

    随着客户的需求越来越"百变",最近在做大屏设计的葡萄陷入了困境. 近期客户提出的需求是想在BI工具中增加 "路线地图"展示功能并进行数据分析. 不仅如此,这个& ...

  5. 如何在 FineUIMvc 中引用第三方 JavaScript 库

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...

  6. Xcode中c++&Object-C混编,详细介绍如何在cocos2dx中访问object函数以及Apple Api

    转自:http://www.himigame.com/iphone-cocos2dx/743.html Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Jav ...

  7. Android中Webview使用javascript调用事先定义好的Java函数

    1. 首先定义好一个类,专们用于给javascript调用 public class JavaScriptInterface { // share your news public void shar ...

  8. 【转】NativeScript的工作原理:用JavaScript调用原生API实现跨平台

    原文:https://blog.csdn.net/qq_21298703/article/details/44982547 -------------------------------------- ...

  9. 如何在OpenFOAM中增加边界条件【翻译】

    注:如有翻译不妥,还请见谅 翻译自:http://openfoamwiki.net/index.php/HowTo_Adding_a_new_boundary_condition 首先请看:http: ...

随机推荐

  1. java设计模式之九外观模式(Facade)

    外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...

  2. Android开发之Mediaplayer

    Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件 ...

  3. UiAutomator源码分析之获取控件信息

    根据上一篇文章<UiAutomator源码分析之注入事件>开始时提到的计划,这一篇文章我们要分析的是第二点: 如何获取控件信息 我们在测试脚本中初始化一个UiObject的时候通常是像以下 ...

  4. Oracle 11g 客户端的安装和配置。

    原文:Oracle 11g 客户端的安装和配置. 数据库和客户端在不同的机器之上. 在安装之前,在安装Oracle数据库的服务器上导航到下面的目录. 将listener.ora和tnsnames.or ...

  5. servlet请求转发与重定向的差别------用生活实例来形象说明两者的差别

    1,请求重定向:client行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保留,地址栏的URL地址会改变. 2,请求转发:server行为,req ...

  6. PL/SQL Developer 连接Oracle数据库详细配置方法

    PL/SQL Developer 连接Oracle数据库详细配置方法 近段时间很多网友提出监听配置相关问题,客户终端(Client)无法连接服务器端(Server).本文现对监听配置作一简单介绍,给出 ...

  7. Mysql 使用CMD 登陆

    1. 将mysql 的bin 目录加到 系统环境变量中: 这样的目的是为了可以直接在cmd中使用mysql命令,而不用先CD到mysql的bin目录中. 3. 连接目标数据库 . Syntax:   ...

  8. sbt公布assembly解决jar包冲突 deduplicate: different file contents found in the following

    一个.问题定义 近期使用sbt战斗assembly发生故障时,包,在package什么时候,发生jar包冲突/文件冲突,两个相同class来自不同jar包classpath内心冲突. 有关详细信息:我 ...

  9. .net中,控件(Name)属性或ID属性的常见命名规则

    控件名称 缩写 介绍 公共控件   Button btn 按钮 CheckBox chk 复选框 CheckedListBox ckl 显示一个项列表,其中每一项左侧都有一个复选框 ComboBox ...

  10. ASP.NET MVC IOC 之AutoFac

    ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...