chrome.webstore.*是chrome平台实现的WebAPI之一,其主要功能就是从google的webstore应用商店安装web应用,本节主要从此webAPI的注册流程开始分析其实现原理,包括此API接口如何声明,如何绑定,以及如何触发,如何实现等过程。
1、WebAPI声明
实际上WebAPI的声明方式主要两种方式,即json方式和idl方式,这两种方式基本上等价,只不过idl方式更加简单清晰,json方式支持某些特有的扩展功能;此API的接口声明则是采用json方式(src/chrome/common/extensions/api/webstore.json):
[{为节省篇幅,这里仅列出了大体框架,可以看出该api调用方式应该为store.install(url, sucessCallback, failureCallback);
"namespace": "webstore",
"functions": [
{
"name": "install",
"parameters": [
{
"name": "url",
},
{
"name": "successCallback",
},
{
"name": "failureCallback",
}]
}]
}]
此外,在此目录下的_api_features.json文件中声明了此API的适用场合(此json文件及_manifest_features.json和_permission_feature.json文件会在renderer进程启动时被加载并解析,作为API可用性校验的已经):
"webstore": {这里的channel表示chrome的webAPI的演进阶段,extension_types和contexts表示此API可被何种类型的extension以及何种context下使用,matches则会在此API调用时根据指定的URL规则进行匹配校验。
"channel": "stable",
"extension_types": ["hosted_app"],
"contexts": ["blessed_extension", "web_page"],
"matches": ["http://*/*", "https://*/*"]
},
如果需要,还应该在api.gyp文件中加上此文件的声明,用于根据接口声明文件中定义的API规格自动生成native端的某些模板类,如Param,Result等;
最后,这里需要在extensions_api_resources.grd文件(src/chrome/common目录)中添加此声明文件,用于在此API调用时的参数合法性校验。
2、webstore对象绑定
这一步是在renderer进程启动后完成的,主要是根据当前renderer进程的context类型决定是否公开webstore对象,由于当前chrome平台已经开发了很多webapi,实际上每个webapi在运行期就相当于一个js对象,因此这里的类型检查主要是为了减少不必要的开销:
switch (context->context_type()) {上面的RegisterBinding方法则是调用V8接口创建webstore对象并绑定到js环境中,从而使得在web段的js代码中可以调用此对象的install方法,这一过程大致流程如下:
case Feature::UNSPECIFIED_CONTEXT:
case Feature::WEB_PAGE_CONTEXT:
case Feature::BLESSED_WEB_PAGE_CONTEXT: {
// Web page context; it's too expensive to run the full bindings code.
// Hard-code that the app and webstore APIs are available...
RegisterBinding("webstore", context);
其实在上述步骤之前还有一个操作就是加载(Dispatcher::PopulateSourceMap() )并注入一些内置的JS代码(通过ModuleSystem),用于注册一些钩子函数,在实际API调用之前进行一些可用性和合法性校验。
3、API调用
经过上面的步骤,在进入webstore页面后即可进行webapp的安装操作了,那么点击某个应用之后进行的操作就是后面所要进行的分析了。
这里先暂时忽略参数校验之类的操作,待以后专门进行分析,此处主要分析web应用的下载安装过程:
上图中运行于V8引擎的webstore_custom_binding.js通过Install方法调用至native的WebstoreBindings类,并通过IPC消息通知Browser进程开始webstore应用的安装。
4、Webstore应用安装
这一应用安装过程包括两个部分:manifest文件下载解析,资源文件下载安装。
其中前一个过程又包括创建网络连接获取数据(通过URLFetcher调用至net库)、调用JSON解析模块进行解析(由UtilityProcess进程完成),直接上图:
上图中通过URLFetcher::OnCompletedURLReques回调方法获取到从网络下载的manifest资源后,由WebstoreDataFecther类创建并启动JSON文件解析器进行manifest解析;上述动作完成后在WebstoreStandaloneInstaller::OnWebstoreResponseParseSuccess方法中就可以校验manifest文件中各个字段的合法性,之后通过创建WebstoreInstallHelper对象进行资源文件(主要是应用图标)的下载和安装,这一过程和上一个过程大体上相同,不过这里传入的是图标资源的URL,获取到的资源数据暂存入vector<char>中,并通过发送 ChromeUtilityMsg_DecodeImage消息进行图片解码,解码之后的数据保存在一个SKBitmap对象中。
上面两个过程完成之后通过WebstoreInstallHelper::ReportResultsIfComplete方法上报应用安装结果,上报的数据包括应用图标数据、解析后的manifest数据;当然,这个分析过程都是按照success的情况进行的,fail情况并没有过多的关注。