Chromium静默安装扩展

Chromium有非常强大的扩展系统,很多功能可以通过扩展实现,比如广告过滤,购物比价。所以开发Chromium功能,不一定需要修改Chromium的C++源代码,只需要做一个扩展就可以了。

通过Chromium的扩展来增强浏览器功能,有多个优点:

随着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();
}