本文示例說明了如何在Chrome瀏覽器中增長JavaScript API。爲了簡化,先假設是在已有的namespace中增長一個新的API,文章的最後將指出若是增長一下全新的namespace所需注意的事項。chrome
在繼續以前,請確保你的Chrome瀏覽器中已安裝了一些擴展程序。能夠在地址欄中輸入chrome://extensions查看已安裝的擴展程序。下圖示例說明了個人瀏覽器中已安裝了Google Mail Checker擴展程序,咱們將使用它來測試新增的API(測試可使用任何擴展程序,而不需指定這所示例的Google Mail checker)。json
從上圖也同時示例瞭如何打開Chrome網上商店,咱們須要進入該頁面查看已開發好的API。進入頁面後按F12打開開發者工具,並將開發者工具切換到控制檯。api
在開發者工具的控制檯中,輸入「chrome.management.un」其將顯示management namespace所支持的API。瀏覽器
下面咱們要作的,就是在management中增長showButton API,用於顯示或隱藏擴展欄上(某)擴展程序的Icon。增長showButton API大致上分紅兩大部驟。步驟一爲變動C++代碼,步驟二爲變動management.json接口描述文件。下面逐步講解基於Chrome R28源碼的具體變動內容。ide
首先,在src\chrome\browser\extensions\api\management\management_api.h中增長一個新類的聲明。當showButton在Javascript中被調用時,該類將負責進行後續處理,其RunImpl方法將會被調用。函數
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。工具
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檢查是否存在錯誤。
測試
{ "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的註冊。this
程序編譯完成後,咱們能夠在開發者工具的控制檯上測試showButton函數。下圖示例說明了經過調用該函數隱藏和顯示Google Mail Checker擴展程序的Icon。spa
上面示例瞭如何在已存在的management namespace中增長一個API。在Chrome中,JavaScript API的使用存在權限的概念。若是新增API的同時也需新增namespace的話,須要注意在APIPermissionInfo::RegisterAllPermissions方法中註冊新增namespace的權限,不然會出現頁面沒法訪問新增API的問題。