本文中chromium 版本為54
參考資料:
chromium如何新增extension API以及添加內部擴展
http://slides.com/luyuan/grit#/
一、嵌入擴展
1. 復制擴展的資源文件夾,到 src\chrome\browser\resources\ 文件夾下,
其中manifest.json文件的“key”的來源:通過載入一個自定義的crx插件然后在chromium的appdata下找到該插件的key,該key可能被用於計算extension-id,如果擴展無法調用接口,有可能是key不對,在src\base\base64.cc的Base64Decode函數處做檢查。
(在chromium中用開發者模式添加你的擴展,找到用戶數據中以id命名的文件夾,得到manifest.json中的key)
如果沒有這個key,chromium啟動就會崩潰。
2. 在src\chrome\browser\extensions\component_loader.cc文件下,
AddDefaultComponentExtensions()函數中添加:
Add(IDR_EXTENSION_MANIFEST, base::FilePath(FILE_PATH_LITERAL("extension_name")));
3.在src\chrome\browser\browser_resources.grd 文件下,定義一個ID IDR_EXTENSION_MANIFEST跟擴展mainfest.json的關聯
<include name="IDR_EXTENSION_MANIFEST" file="resources\extension_dir\manifest.json" type="BINDATA" />
4.在src\chrome\browser\extensions\component_extensions_whitelist\whitelist.cc文件,
bool IsComponentExtensionWhitelisted(int manifest_resource_id)函數中添加:
case IDR_EXTENSION_MANIFEST:
5.把web資源添加到src\chrome\browser\resources\component_extension_resources.grd文件中,用於資源打包,必須把除了mainfest.json文件之外的其他獨立文件都加進來。
二、其它修改
1.安裝后首次運行的歡迎頁面URL
src\chrome\app\resources\locale_settings.grd 中修改 IDS_WELCOME_PAGE_URL
2.改圖標
替換
src\chrome\app\theme\chromium
src\chrome\app\theme\default_100_percent\chromium
src\chrome\app\theme\default_200_percent\chromium
下面相關的圖片
exe圖標在資源文件src/chrome/app/chrome_exe.rc中定義IDR_MAINFRAME,chrome.dll里也定義了一個IDR_MAINFRAME,在chrome_dll.rc中。
3.菜單修改
以新建標簽為例:
符號定義:src\chrome\app\chrome_command_ids.h(49):#define IDC_NEW_TAB 34014
命令執行:src\chrome\browser\ui\browser_command_controller.cc(367): case IDC_NEW_TAB:
初始化狀態:src\chrome\browser\ui\browser_command_controller.cc(802) BrowserCommandController::InitCommandState
添加菜單項:src\chrome\browser\ui\toolbar\app_menu_model.cc(787): AddItemWithStringId(IDC_NEW_TAB, IDS_NEW_TAB);
4.改產品名稱
- src\chrome\app\chromium_strings.grd 中的 IDS_PRODUCT_NAME 和其它帶Chromium字樣的字符串,IDS_PRODUCT_NAME 也出現在關於頁面中
- src\chrome\app\resources\chromium_strings_XX.xtb 等語言相關的文件中的Chromium字樣,主要是<translation id = "2910007522516064972">&Chromium Browser সম্পর্কে< / translation>這句(關於chrome...)。
- src\components\components_chromium_strings.grd : IDS_VERSION_UI_LICENSE (關於...頁面下面的感謝聲明)
- src\components\strings\components_chromium_strings_en-GB.xtb <translation id="4365115785552740256"> 同上,還有其它語言的
- <translation id="459535195905078186">Chromium 應用</translation> 改成 <translation id="459535195905078186">Chromium Browser 應用</translation>
5.移除“缺少Google API 密鑰……”的警告
找到src\chrome\browser\ui\startup\startup_browser_creator_impl.cc GoogleApiKeysInfoBarDelegate::Create一句
GoogleApiKeysInfoBarDelegate::Create(InfoBarService::FromWebContents(
browser->tab_strip_model()->GetActiveWebContents()));
,注釋掉。
注:這個警告是編譯時 google_api_key = "no" 的結果,不使用api key,你定制的瀏覽器就沒法登錄google賬戶。
6.在代碼中加命令行參數
src\chrome\app\chrome_main_delegate.cc ChromeMainDelegate::BasicStartupComplete 中
bool ChromeMainDelegate::BasicStartupComplete(int* exit_code) { base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); // add custom switches command_line.AppendSwitch(switches::kProcessPerSite); command_line.AppendSwitch(switches::kEnableExperimentalWebPlatformFeatures);
7.獲取chrome APP的app-id
進入 chrome://extensions/ =》 開發者模式 =》 加載APP =》 詳細信息 =》創建快捷方式 =》 快捷方式屬性里有 --app-id=xxxxxx
8.修改navigator.userAgent/appVersion的值
String FrameLoader::userAgent() const
String userAgent = client()->userAgent();
String userAgent = String::format("%s 你想加的內容/1.0.0.5", client()->userAgent().utf8().data());
注:因為沙箱的原因,這樣硬編碼只是權宜之計,最好是跟browser process通信獲得本地配置文件中的版本信息。
附件:
grd_generator.py
# -*- coding: utf-8 -*- import os from Tools.scripts.treesync import raw_input def traverse(rootDir): for lists in os.listdir(rootDir): path = os.path.join(rootDir, lists) if os.path.isfile(path): if os.path.basename(path) == 'manifest.json': continue rel_path = os.path.relpath(path, parent_dir) symbol = rel_path.replace('\\', '_').replace('-', '_').replace('.', '_').upper() print('<include name="IDR_' + symbol + '" file="' + rel_path + '" type="BINDATA" />') # print(path) if os.path.isdir(path): traverse(path) dir = raw_input('請輸入擴展文件夾路徑:').strip('\n') parent_dir = os.path.abspath(os.path.join(dir, os.pardir)) traverse(dir)