Chromium有非常强大的扩展系统,很多功能可以通过扩展实现,比如广告过滤,购物比价。所以开发Chromium功能,不一定需要修改Chromium的C++源代码,只需要做一个扩展就可以了。
通过Chromium的扩展来增强浏览器功能,有多个优点:
- 功能耦合低。浏览器客户端只需要提供相应的接口API,扩展去调用相应的接口API即可。
- 开发客户端接口API和开发扩展可以并行。另外Chromium有完善的扩展系统,调试等等都非常方便。
- 升级独立。以后升级扩展就可以升级功能了,而不需要升级整个浏览器。
- 开发速度快。因为扩展大多数是用的web开发技术,就是html和js,所以开发起来很快。而修改Chromium的c++代码则复杂很多。
随着Chromium安全策略的收紧,一般来说,只能通过Chrome的应用商店来安装扩展,禁止其他扩展静默安装。https://developer.chrome.com/extensions/external_extensions根据这篇文档的描述,浏览器想内置一些扩展限制很多,比较麻烦。如果自己定制浏览器,想默认安装一些扩展,不是很方便。
其实,如果改代码的话,就没有任何限制,直接调用extensions::CrxInstaller去安装。下面是静默安装本地crx扩展文件的例子:
Profile* profile =
g_browser_process->profile_manager()->GetActiveUserProfile();
base::FilePath extension_path;
base::PathService::Get(chrome::DIR_EXTERNAL_EXTENSIONS, &extension_path);
extension_path = extension_path.AppendASCII(extension_id + ".crx");
ExtensionService* service =
extensions::ExtensionSystem::Get(profile)->extension_service();
if (!service->GetInstalledExtension(extension_id)) {
scoped_refptr<extensions::CrxInstaller> crx_installer(
extensions::CrxInstaller::Create(service, nullptr));
crx_installer->set_allow_silent_install(true);
crx_installer->set_is_gallery_install(true);
crx_installer->set_install_immediately(true);
crx_installer->InstallCrx(extension_path);
}
以前大概是2015年前,Chromium也是可以静默的安装内置的扩展的,现在代码里面需要改一点也是支持的。
把我们需要内置的扩展放到chrome/browser/resources/default_apps里面,这个目录已经有了几个其他的内置扩展,比如docs.crx、drive.crx等等。
此外需要在external_extensions.json里面添加我们扩展的信息。
当浏览器启动的时候,ExtensionService会调用default_apps::Provider会按照external_extensions.json的描述去安装我们内置的扩展。
void Provider::VisitRegisteredExtension() {
//if (!profile_ || !ShouldInstallInProfile()) {
// base::DictionaryValue* prefs = new base::DictionaryValue;
// SetPrefs(prefs);
// return;
//}
extensions::ExternalProviderImpl::VisitRegisteredExtension();
}