转自:http://www.cnblogs.com/cswuyg/archive/2013/03/13/2956863.html
"myapi": { "channel": "stable", "extension_types": ["extension", "packaged_app","platform_app","hosted_app"] },
[{ "namespace": "myapi", "functions": [ { "name": "helloWorld", "type": "function", "description": "Hello world by cswuyg", "parameters": [{ "name": "data", "type": "string", "description": "data is hello world by cswuyg" }, { "name": "callback", "type": "function", "parameters": [{ "name": "result", "type": "string", "description": "result of hello world by cswuyg." }] }] }] }]
'variables': { ...... 'management.json', 'myapi.json', ......
api.sln编译通过之后,产生的C++接口文件在src\build\Debug\obj\global_intermediate\chrome\common\extensions\api下。
...... <include name="IDR_EXTENSION_API_JSON_METRICSPRIVATE" file="extensions\api\metrics_private.json" type="BINDATA" /> <include name="IDR_EXTENSION_API_JSON_MYAPI" file="extensions\api\myapi.json" type="BINDATA" /> ......
void ExtensionAPI::InitDefaultConfiguration() { ...... RegisterSchema("myapi", ReadFromResource( IDR_EXTENSION_API_JSON_MYAPI)); ...... }
目前已经变为了在chrome/common/extensions/api/chrome_extensions_client.cc的ChromeExtensionsClient::RegisterAPISchemaResources函数中通过IDR_EXTENSION_API_JSON_MYAPI ID值加载myapi.json文件。
void ChromeExtensionsClient::RegisterAPISchemaResources(
ExtensionAPI* api) const {
#if defined(ENABLE_EXTENSIONS)
api->RegisterSchemaResource("accessibilityPrivate",
IDR_EXTENSION_API_JSON_MYAPI);
...........
6、在src\chrome\browser\extensions\api\myapi文件夹下完成扩展的C++响应。
//myapi_api.h #pragma once #include "chrome/browser/extensions/extension_function.h" namespace extensions { class HelloWorldFunction : public AsyncExtensionFunction{ public: HelloWorldFunction(); //ExtensionFunction: virtual bool RunImpl() OVERRIDE; protected: virtual ~HelloWorldFunction(){}; private: DECLARE_EXTENSION_FUNCTION_NAME("myapi.helloWorld") }; }
//myapi_api.cpp #include "myapi_api.h" #include "chrome/common/extensions/api/myapi.h" namespace extensions{ namespace myapi = api::myapi; HelloWorldFunction::HelloWorldFunction() {} bool HelloWorldFunction::RunImpl() { scoped_ptr<::extensions::myapi::HelloWorld::Params> params( ::extensions::myapi::HelloWorld::Params::Create(*args_)); results_ = myapi::HelloWorld::Results::Create(params->data + "helloWorldResult!!"); SendResponse(true); return true; } }
void ExtensionFunctionRegistry::ResetFunctions() { #if defined(ENABLE_EXTENSIONS) ...... RegisterFunction<extensions::HelloWorldFunction>(); ...... #endif // defined(ENABLE_EXTENSIONS) }
{ APIPermission::Kmyapi, "myapi", kFlagNone, IDS_EXTENSION_PROMPT_WARNING_MYAPI, PermissionMessage::kmyapi },
"myIdl": { "channel": "stable", "extension_types": ["extension", "packaged_app","platform_app","hosted_app"] },
[permissions=myIdl] namespace myIdl { callback HelloWorld2Callback = void (DOMString result); interface Functions { static void HelloWorld2(DOMString input, HelloWorld2Callback callback); }; };
api.gyp:
'media_galleries.idl', 'media_galleries_private.idl', 'my_idl.idl',
{ APIPermission::KmyIdl, "myIdl", kFlagNone, IDS_EXTENSION_PROMPT_WARNING_MYAPI, PermissionMessage::kmyIdl },
4、添加实现文件在\src\chrome\browser\extensions\api\下,需要注意DECLARE_EXTENSION_FUNCTION_NAME定义的函数名要跟idl里定义的接口名一样,否则会在output中提示不存在该函数。而类名,则要跟自动生成的src\build\Debug\obj\global_intermediate\chrome\common\extensions\api\generated_api.h里注册的名称一致。
my_idl.h文件:
#pragma once #include "chrome/browser/extensions/extension_function.h" namespace extensions { class MyIdlHelloWorld2Function : public AsyncExtensionFunction{ public: MyIdlHelloWorld2Function(); //ExtensionFunction: virtual bool RunImpl() OVERRIDE; protected: virtual ~MyIdlHelloWorld2Function(){}; private: DECLARE_EXTENSION_FUNCTION_NAME("myIdl.HelloWorld2") }; }
my_idl.cc文件:
#include "my_idl_api.h" #include "chrome/common/extensions/api/my_idl.h" namespace extensions{ namespace myIdl = api::my_idl; MyIdlHelloWorld2Function::MyIdlHelloWorld2Function() {} bool MyIdlHelloWorld2Function::RunImpl() { scoped_ptr<::extensions::myIdl::HelloWorld2::Params> params( ::extensions::myIdl::HelloWorld2::Params::Create(*args_)); results_ = myIdl::HelloWorld2::Results::Create(params->input + " result by cswuyg"); SendResponse(true); return true; } }
到这里就可以了,步骤明显比legacy方式简单多了。
{ "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi4h7GFx0NvfD3EhvKNf7bAp2/U+0Be92WDRgkkOG8l+73weIDb7/UpZ831JSFxnjtOoKj7PLTYk//tYd3ZYhIdnZfPap6M6s0v8nzibCkvqCbsChg7EbuJ6Cf3l4upU+0QTPHYKswcDBkMg6oNrRj3vhWeKUEBPktBu99/S2MKwIDAQAB", "name": "myapi_cswuyg", "version": "1.0", "manifest_version": 2, "description": "myapi", "permissions": ["myapi"], "chrome_url_overrides": { "cswuyg": "popup.html" }, "content_security_policy": "object-src 'self'; script-src chrome://resources 'self'" }
popup.html:
<html> <body> <p>Hello World</p> <script type="text/javascript" src="test.js"> </script> </body> </html>
test.js:
function myapi() { var input = {}; input.data = 'helloworld'; input.name = 'cswuyg'; var strInput = JSON.stringify(input); chrome.myapi.helloWorld((strInput), function(data){ alert('result = ' + data); }); } chrome.browserAction.onClicked.addListener(myapi); myapi();
<include name="IDR_MYAPI_MAIN" file="myapi/popup.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> <include name="IDR_MYAPI_COMMON_JS" file="myapi/test.js" type="BINDATA" />
<include name="IDR_MYAPI_MANIFEST" file="resources\myapi\manifest.json" type="BINDATA" />
Add(IDR_CLOUDPRINT_MANIFEST, FilePath(FILE_PATH_LITERAL("cloud_print"))); Add(IDR_MYAPI_MANIFEST, FilePath(FILE_PATH_LITERAL("myapi")));
// Restrict override pages to a list of supported URLs. bool is_override = (page != chrome::kChromeUINewTabHost && page != chrome::kChromeUIBookmarksHost && page != chrome::kChromeUIHistoryHost && page != "cswuyg" );