本文示例說明了如何在Chrome瀏覽器中增加JavaScript API,。為了簡化,,先假設(shè)是在已有的namespace中增加一個新的API,文章的最后將指出如果增加一下全新的namespace所需注意的事項,。
在繼續(xù)之前,,請確保你的Chrome瀏覽器中已安裝了一些擴展程序??梢栽诘刂窓谥休斎隿hrome://extensions查看已安裝的擴展程序,。下圖示例說明了我的瀏覽器中已安裝了Google Mail Checker擴展程序,我們將使用它來測試新增的API(測試可以使用任何擴展程序,,而不需指定這所示例的Google Mail checker),。
從上圖也同時示例了如何打開Chrome網(wǎng)上商店,我們需要進入該頁面查看已開發(fā)好的API,。進入頁面后按F12打開開發(fā)者工具,,并將開發(fā)者工具切換到控制臺。
在開發(fā)者工具的控制臺中,,輸入“chrome.management.un”其將顯示management namespace所支持的API,。
下面我們要做的,就是在management中增加showButton API,,用于顯示或隱藏擴展欄上(某)擴展程序的Icon,。增加showButton API大體上分成兩大部驟。步驟一為變更C++代碼,,步驟二為變更management.json接口描述文件,。下面逐步講解基于Chrome R28源碼的具體變更內(nèi)容,。
首先,在src\chrome\browser\extensions\api\management\management_api.h中增加一個新類的聲明,。當(dāng)showButton在Javascript中被調(diào)用時,,該類將負責(zé)進行后續(xù)處理,其RunImpl方法將會被調(diào)用,。
點擊(此處)折疊或打開
-
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中增加新類的實現(xiàn)。RunImpl方法根據(jù)JavaScript所傳入的兩個參數(shù)調(diào)用SetBrowserActionVisibility函數(shù),,實現(xiàn)對擴展程序Icon的顯示和隱藏,。第一個參數(shù)為擴展程序的ID,第二個參數(shù)是一個布爾變量,,用于指示是顯示(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兩大部分,一定要將新增內(nèi)容放入functions部分,。為了防止變更JSON文件時出錯,,可以使用Notepad++,并在其上安裝JSLint和JSMin兩個插件,。在編輯完JSON文件后先調(diào)用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函數(shù)內(nèi)增加對ManagementShowButtonFunction的注冊,。
程序編譯完成后,我們可以在開發(fā)者工具的控制臺上測試showButton函數(shù),。下圖示例說明了通過調(diào)用該函數(shù)隱藏和顯示Google Mail Checker擴展程序的Icon,。
上面示例了如何在已存在的management namespace中增加一個API。在Chrome中,,JavaScript API的使用存在權(quán)限的概念,。如果新增API的同時也需新增namespace的話,需要注意在APIPermissionInfo::RegisterAllPermissions方法中注冊新增namespace的權(quán)限,,否則會出現(xiàn)頁面無法訪問新增API的問題,。
|