轉自:http://blog.csdn.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
- //
- [permissions=egg]
- namespace egg{
- callback eggCallback = void(DOMString result);
- interface Functions {
- static void post(DOMString input, eggCallback callback);
- };
- };
permissions=egg 意思是別人在使用你的時候,應該加的名字,比如,你在寫插件的時候,在manifest.json 裏面的 "permissions":["http://*/","storage"], 別人在用這個api的時候,就可以寫 "permissions":["http://*/","storage", "egg"]
- 'dns.idl',
- 'egg.idl',
- 'downloads.idl',
- "extension_types": ["extension", "legacy_packaged_app", "platform_app"],
- "min_manifest_version": 2
- },
- "egg": {
- "channel": "stable",
- "extension_types": ["extension", "platform_app"]
- },
- "alwaysOnTopWindows": [
- {
- "channel": "dev",
- "contexts": ["blessed_extension"],
- "dependencies": ["permission:app.runtime"]
- },
- "egg": {
- "contexts": ["blessed_extension"],
- "dependencies": ["permission:egg"]
- },
- "app.window": {
- "noparent": true,
- "contexts": ["blessed_extension"],
- kAdView,
- kAlarms,
- kEgg,
- kAlwaysOnTopWindows,
- kAppCurrentWindowInternal,
3.4 chrome/common/extensions/permissions/chrome_api_permissions.cc
- { APIPermission::kActiveTab, "activeTab" },
- { APIPermission::kAdView, "adview" },
- { APIPermission::kAlarms, "alarms" },
- { APIPermission::kEgg, "egg" },
- { APIPermission::kBookmark, "bookmarks", APIPermissionInfo::kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
- PermissionMessage::kBookmarks },
chrome/browser/extensions/extension_function_histogram_value.h,目前該文件已經遷移到extensions\browser目錄
- MEDIAGALLERIES_GETMETADATA,
- INPUT_IME_SENDKEYEVENTS,
- VIRTUALKEYBOARDPRIVATE_LOCKKEYBOARD,
- EGG_PAIN,
- ENUM_BOUNDARY // Last entry: Add new entries above.
chrome/browser/extensions/api/egg/egg_api.h
- #include "chrome/common/extensions/api/egg.h" //這個自動生成的頭文件,加上就行
- #include "chrome/browser/extensions/chrome_extension_function.h"
- namespace extensions {
- class EggPainFunction : public AsyncExtensionFunction {
- public:
- EggPainFunction();
- virtual bool RunImpl() OVERRIDE;
- protected:
- virtual ~EggPainFunction() {}
- private:
- DECLARE_EXTENSION_FUNCTION("egg.pain", DAFEI_POST);
- };
- }
- #include "egg_api.h"
- #include "base/logging.h"
- #include "sys/types.h"
- #include "unistd.h"
- namespace extensions {
- namespace egg = api::egg;
- EggPainFunction::EggPainFunction() {}
- bool EggPainFunction::RunImpl() {
- scoped_ptr<egg::Pain::Params> params(
- egg::Pain::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
- std::string tmp = "egg in process:";
- char buf[20] = {0};
- sprintf(buf, "%d", getpid());
- tmp.append(std::string(buf));
- LOG(INFO) << tmp;
- WriteToConsole(content::CONSOLE_MESSAGE_LEVEL_WARNING, tmp);
- return true;
- }
- }
加到gypi裏 chrome/chrome_browser_extensions.gypi
- 'browser/extensions/api/alarms/alarm_manager.h',
- 'browser/extensions/api/alarms/alarms_api.cc',
- 'browser/extensions/api/alarms/alarms_api.h',
- 'browser/extensions/api/egg/egg_api.h',
- 'browser/extensions/api/egg/egg_api.cc',
- 'browser/extensions/api/app_current_window_internal/app_current_window_internal_api.cc',
- 'browser/extensions/api/app_current_window_internal/app_current_window_internal_api.h',
- 'browser/extensions/api/app_runtime/app_runtime_api.cc',
5.好了,現在去編譯就OK了