chromium中增加默认主题的一个方法

首先,chromium除了默认主题外,其它都是以chrome拓展的方式安装的,所以对于一个新的主题,需要定一个主题id,这个主题id可以先自己定一个,只要长度一致就可以了,但是主题id会有字母范围的限制,所以可以找一个现成的id,然后直接交换几个字母的位置就可以,后继这个id并不会真正用到。

src\chrome\browser\themes\theme_service.cc
const char* ThemeService::kDefaultThemeID = "";
const char* ThemeService::kNewDefaultThemeID = "ndoippcjlipfddffdcimakhebaemnmgn";

在theme_service_factory.cc中设置默认注册的主题id为新的主题id。

src\chrome\browser\themes\theme_service_factory.cc
  registry->RegisterStringPref(
      prefs::kCurrentThemeID,
	  ThemeService::kNewDefaultThemeID,
      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);

在chrome启动后,会调用ThemeService::Init函数,进而进入LoadThemePrefs函数,但是进入LoadThemePrefs后,这里是不载入主题的,因为当前current_id等于kNewDefaultThemeID,kCurrentThemePackFilename为空。ThemeService会监听NOTIFICATION_EXTENSIONS_READY信号,当extension系统启动完成后,调用ThemeService的OnExtensionServiceReady函数,接下来就可以通过extension系统加载主题。在OnExtensionServiceReady函数中,ready_当前的值为false,因为没有载入任何主题。调用MigrateTheme函数,将函数修改为

void ThemeService::MigrateTheme() {
  // TODO(erg): We need to pop up a dialog informing the user that their
  // theme is being migrated.
  ExtensionService* service =
      extensions::ExtensionSystem::Get(profile_)->extension_service();
  const Extension* extension = service ?
      service->GetExtensionById(GetThemeID(), false) : NULL;
  if (extension) {
    DLOG(ERROR) << "Migrating theme";
    BuildFromExtension(extension);
    content::RecordAction(UserMetricsAction("Themes.Migrated"));
  } else {
	if (GetThemeID() == kNewDefaultThemeID) {
		base::FilePath dir_exe;
		PathService::Get(base::DIR_EXE, &dir_exe);
		base::FilePath new_theme_dir(dir_exe.value() + FILE_PATH_LITERAL("/new_theme"));
		extensions::UnpackedInstaller::Create(service)->Load(new_theme_dir);
	} else {
		  DLOG(ERROR) << "Theme is mysteriously gone.";
		  ClearAllThemeData();
		  content::RecordAction(UserMetricsAction("Themes.Gone"));
    }
  }
}

由于初始的主题id是kNewDefaultThemeID,会需要从给定文件夹new_theme_dir载入主题拓展。MigrateTheme运行完毕调用NotifyThemeChanged,主题加载完成。

在重置主题时,会调用ClearAllThemeData函数,该函数重新设置主题id,并重新载入主题。

void ThemeService::ClearAllThemeData() {
  if (!ready_)
    return;
  SwapThemeSupplier(NULL);
  FreePlatformCaches();
  profile_->GetPrefs()->ClearPref(prefs::kCurrentThemePackFilename);
  SaveThemeID(kNewDefaultThemeID);
  base::MessageLoop::current()->PostTask(FROM_HERE,
	  base::Bind(&ThemeService::RemoveUnusedThemes,
	  weak_ptr_factory_.GetWeakPtr(),
	  true));
  MigrateTheme();
}

时间: 2024-10-07 01:33:24

chromium中增加默认主题的一个方法的相关文章

在chromium源码中增加默认的搜索引擎

接下的文章会涉及对chromium源代码的修改,会从一些简单的方向修改chromium的功能.本篇文章介绍如何在chromium中增加一个默认的搜索引擎. 以增加我们国家的搜索引擎--中国搜索 http://www.chinaso.com/ 为例 1.首先需要定义一下搜索引擎 在src/chrome/browser/search_engines/prepopulated_engines.json文件中,定义了许多默认的搜索引擎,我们在该文件中,搜索www.sogou.com,参考sogou的定义

JavaSE8基础 同一个包下的子类,可以访问到父类中的 默认/受保护/公有方法

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: 父类: package jizuiku; class Person { void showDefault() { System.out.println("showDefault"); } private void showPrivate() { System.out.println("sh

Android Studio中如何跳到某一个方法

http://androidren.com/index.php?qa=287&qa_1=android-studio%E4%B8%AD%E5%A6%82%E4%BD%95%E8%B7%B3%E5%88%B0%E6%9F%90%E4%B8%80%E4%B8%AA%E6%96%B9%E6%B3%95 我们在Eclipse中,跳到某一个方法使用的是CTRL + O,然后输入方法名.在Android Studio中,我们可以通过下面的方法: CMD+F12,然后输入方法名. 当然也会有另类玩法(工程大的

eclipse中改变默认的workspace的方法及说明

eclipse中改变默然的workspace的方法可以有: 1.在创建project的时候,手动选择使用新的workspace,如创建一个web project,在向导中的Location选项,取消使用"Use default location",同时在下面选择新的workspace. 2.在file菜单中选择switch workspace项,即可选择一个新的workspace http://roucheng.cnblogs.com/ 3.在eclipse安装目录下configura

Grails的GSP页面中增加无条件跳转的方法。

在网页中增加如下的代码即可实现跳转 <script> location.href = "login" </script> 其实:location.href为命令,引号内指定的就是要跳转的位置.

Android Studio中Button等控件的Text中字符串默认大写的解决方法

初学Android的时候,在Android Studio中xml里面添加一个Button.EditText等控件后,它的Text总是会显示大写,即使你输入的字符串是小写也不行,控制字符串大小写的属性是android:textAllCaps, 最后查看了一下Themes.xml文件,找到了一些端倪,发现在设置样式的时候,默认是把所有的字符串显示大写true. 如图,是从android的Style.xml中的截图,   [解决办法] 1. 把xml中你不想大写的控件添加一行 android:text

在chromium中加入默认的启动页

启动页的配置选项如图所示: 启动页的默认配置由src\chrome\browser\prefs\session_startup_pref.cc生成 在RegisterProfilePrefs函数中,可以看到配置的选项. registry->RegisterIntegerPref( prefs::kRestoreOnStartup, TypeToPrefValue(GetDefaultStartupType()), user_prefs::PrefRegistrySyncable::SYNCABL

UI中对于选择主题的处理方法

- (instancetype)init { self = [super init]; if (self) {//初始化_themeName NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *key = [defaults objectForKey:KThemeDefaultKey]; if (key.length == 0) { _themeName = @"New PinkPink"

ASP.NET中身份验证的三种方法

Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活.Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端.服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了. 问题来了,在实际是用中我们往往需要的是基于角色,或者说基于用户组的验