1. 程式人生 > >【Chrome】如何在C++中增加給JavaScript呼叫的API

【Chrome】如何在C++中增加給JavaScript呼叫的API

本文示例說明了如何在Chrome瀏覽器中增加JavaScript API。為了簡化,先假設是在已有的namespace中增加一個新的API,文章的最後將指出如果增加一下全新的namespace所需注意的事項。

在繼續之前,請確保你的Chrome瀏覽器中已安裝了一些擴充套件程式。可以在位址列中輸入chrome://extensions檢視已安裝的擴充套件程式。下圖示例說明了我的瀏覽器中已安裝了Google Mail Checker擴充套件程式,我們將使用它來測試新增的API(測試可以使用任何擴充套件程式,而不需指定這所示例的Google Mail checker)。

從上圖也同時示例瞭如何開啟Chrome網上商店,我們需要進入該頁面檢視已開發好的API。進入頁面後按F12開啟開發者工具,並將開發者工具切換到控制檯。

在開發者工具的控制檯中,輸入“chrome.management.un”其將顯示management namespace所支援的API。

下面我們要做的,就是在management中增加showButton API,用於顯示或隱藏擴充套件欄上(某)擴充套件程式的Icon。增加showButton API大體上分成兩大部驟。步驟一為變更C++程式碼,步驟二為變更management.json介面描述檔案。下面逐步講解基於Chrome R28原始碼的具體變更內容。

首先,在src\chrome\browser\extensions\api\management\management_api.h中增加一個新類的宣告。當showButton在Javascript中被呼叫時,該類將負責進行後續處理,其RunImpl方法將會被呼叫。

1 2 3 4 5 6 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。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 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檢查是否存在錯誤。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 { "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的註冊。

程式編譯完成後,我們可以在開發者工具的控制檯上測試showButton函式。下圖示例說明了通過呼叫該函式隱藏和顯示Google Mail Checker擴充套件程式的Icon。

上面示例瞭如何在已存在的management namespace中增加一個API。在Chrome中,JavaScript API的使用存在許可權的概念。如果新增API的同時也需新增namespace的話,需要注意在APIPermissionInfo::RegisterAllPermissions方法中註冊新增namespace的許可權,否則會出現頁面無法訪問新增API的問題。