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

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


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

155326446.jpg


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

155358213.jpg


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

155416138.jpg


下面咱們要作的,就是在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

175225102.jpg


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

155659240.jpg


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

相關文章
相關標籤/搜索