如何在C++中增加給JavaScript調用的API

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


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

155326446.jpg


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

155358213.jpg


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

155416138.jpg


下面我們要做的,就是在management中增加showButton API,用於顯示或隱藏擴展欄上(某)擴展程序的Icon。增加showButton API大體上分成兩大部驟。步驟一爲變更C++代碼,步驟二爲變更management.json接口描述文件。下面逐步講解基於Chrome R28源碼的具體變更內容。


首先,在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的註冊。

175225102.jpg


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

155659240.jpg


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章