chrome如何添加一个extension的api

时间:2021-07-01 20:16:56

转自:http://blog.****.net/gensmusic/article/details/27089541

这里演示的是如何在chrome里添加一个extensions的api.
       先看下需求:
平时做过插件的人都用过 chrome.XXx  ,现在我们想自己来做个,让其在插件的js运行时候可以调用,并且在c++的代码里执行一些特殊的代码。


参考: http://dev.chromium.org/developers/design-documents/extensions/proposed-changes/creating-new-apis


其实按照google上面的文档就可以了,但是有些地方不详细,所以这里才会细致的一些来写一下步骤。
假设我们的api叫 egg,里面有一个函数 pain, 使用的时候 chrome.egg.pain()

1. 在 chrome/common/extensions/api/ 下面增加描述文件,这里有2种方式,一个是用IDL,另外一个是JSON的方式

    IDL方式:       egg.idl

[html] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. //  
  2. [permissions=egg]  
  3. namespace egg{  
  4.   callback eggCallback = void(DOMString result);  
  5.   interface Functions {  
  6.     static void post(DOMString input, eggCallback callback);  
  7.     };  
  8. };  

permissions=egg 意思是别人在使用你的时候,应该加的名字,比如,你在写插件的时候,在manifest.json 里面的 "permissions":["http://*/","storage"], 别人在用这个api的时候,就可以写 "permissions":["http://*/","storage", "egg"]

2. 在 chrome/common/extensions/api/api.gyp 里加上我们刚加的 文件    [html] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. 'dns.idl',  
  2. 'egg.idl',  
  3. 'downloads.idl',  

3. 要告诉 extension架构,我们加了一个 egg的api     3.1 chrome/common/extensions/api/_permission_features.json [html] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1.   "extension_types": ["extension", "legacy_packaged_app", "platform_app"],  
  2.   "min_manifest_version": 2  
  3. },  
  4. "egg": {  
  5.   "channel": "stable",  
  6.   "extension_types": ["extension", "platform_app"]   
  7. },  
  8. "alwaysOnTopWindows": [  
  9.   {  
  10.     "channel": "dev",  
 
   3.2  chrome/common/extensions/api/_api_features.json

[html] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1.   "contexts": ["blessed_extension"],  
  2.   "dependencies": ["permission:app.runtime"]  
  3. },  
  4. "egg": {  
  5.   "contexts": ["blessed_extension"],  
  6.   "dependencies": ["permission:egg"]  
  7. },  
  8. "app.window": {  
  9.   "noparent": true,  
  10.   "contexts": ["blessed_extension"],  


  3.3  extensions/common/permissions/api_permission.h  #注意目录目前是在 src/extensions,跟上面的不一样,跟下面也不一样
[html] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. kAdView,  
  2. kAlarms,  
  3. kEgg,  
  4. kAlwaysOnTopWindows,  
  5. kAppCurrentWindowInternal,  


    3.4   chrome/common/extensions/permissions/chrome_api_permissions.cc

[html] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. { APIPermission::kActiveTab, "activeTab" },  
  2.     { APIPermission::kAdView, "adview" },  
  3.     { APIPermission::kAlarms, "alarms" },  
  4.     { APIPermission::kEgg, "egg" },  
  5.     { APIPermission::kBookmark, "bookmarks", APIPermissionInfo::kFlagNone,  
  6.       IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,  
  7.       PermissionMessage::kBookmarks },  
4. 增加c++实现代码


chrome/browser/extensions/extension_function_histogram_value.h,目前该文件已经迁移到extensions\browser目录

[cpp] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. MEDIAGALLERIES_GETMETADATA,  
  2. INPUT_IME_SENDKEYEVENTS,  
  3. VIRTUALKEYBOARDPRIVATE_LOCKKEYBOARD,  
  4. EGG_PAIN,  
  5. ENUM_BOUNDARY // Last entry: Add new entries above.  

 chrome/browser/extensions/api/egg/egg_api.h

[cpp] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. #include "chrome/common/extensions/api/egg.h"  //这个自动生成的头文件,加上就行  
  2. #include "chrome/browser/extensions/chrome_extension_function.h"  
  3.   
  4. namespace extensions {  
  5.     class EggPainFunction : public AsyncExtensionFunction {  
  6.         public:  
  7.             EggPainFunction();  
  8.             virtual bool RunImpl() OVERRIDE;  
  9.         protected:  
  10.             virtual ~EggPainFunction() {}  
  11.   
  12.         private:  
  13.             DECLARE_EXTENSION_FUNCTION("egg.pain", DAFEI_POST);  
  14.     };  
  15. }  


chrome/browser/extensions/api/egg/egg_api.cc


[cpp] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. #include "egg_api.h"  
  2. #include "base/logging.h"  
  3. #include "sys/types.h"  
  4. #include "unistd.h"  
  5.   
  6. namespace extensions {  
  7.     namespace egg = api::egg;  
  8.     EggPainFunction::EggPainFunction() {}  
  9.   
  10.     bool EggPainFunction::RunImpl() {  
  11.         scoped_ptr<egg::Pain::Params> params(  
  12.                 egg::Pain::Params::Create(*args_));  
  13.         EXTENSION_FUNCTION_VALIDATE(params.get());  
  14.         std::string tmp = "egg in process:";  
  15.         char buf[20] = {0};  
  16.         sprintf(buf, "%d", getpid());  
  17.         tmp.append(std::string(buf));  
  18.         LOG(INFO) << tmp;  
  19.         WriteToConsole(content::CONSOLE_MESSAGE_LEVEL_WARNING, tmp);  
  20.         return true;  
  21.     }  
  22. }  

 加到gypi里  chrome/chrome_browser_extensions.gypi


[cpp] view plaincopychrome如何添加一个extension的apichrome如何添加一个extension的api
  1. 'browser/extensions/api/alarms/alarm_manager.h',  
  2.        'browser/extensions/api/alarms/alarms_api.cc',  
  3.        'browser/extensions/api/alarms/alarms_api.h',  
  4.       'browser/extensions/api/egg/egg_api.h',  
  5.        'browser/extensions/api/egg/egg_api.cc',  
  6.        'browser/extensions/api/app_current_window_internal/app_current_window_internal_api.cc',  
  7.        'browser/extensions/api/app_current_window_internal/app_current_window_internal_api.h',  
  8.        'browser/extensions/api/app_runtime/app_runtime_api.cc',  


5.好了,现在去编译就OK了