chromium中的Preferences机制

chromium使用preferences来存储配置信息。配置中的项是通过”proxy.mode”的字符串来确定。preferences对应这browser profile或者是local state。local state一般存储的是跟本机相关的信息,一般不会同步到其他机器上。

preference有以下几个特性:

  • 注册带有默认值的preference
  • 设置和获取preferences 值。同时执行基本类型的验证,同时尊重preferences源的优先级,提供线程安全
  • preferences 值改变的通知机制

注册preferences

每个preferences在使用之前必须注册,比如这样

prefs::kSavingBrowserHistoryDisabled是在pref_names文件定义的字符串”history.saving_disabled”。RegisterBooleanPref代表值的类型是boolean,第二个参数是注册值的默认类型,第三个参数是指定这个值是否需要同步。preference是以json的格式写到磁盘里,刚才的代码会产生这样的json数据:

如果需要注册新的preferences,在browser_prefs.cc的RegisterLocalState 或者RegisterUserPrefs中调用RegisterPrefs。

访问RegisterPrefs的值

preferences的生命周期是在UI线程上的。preferences对应的profile信息可以通过Profile::GetPrefs()获得PrefService。然后通过PrefService去获取某个值。对于local_state 的PrefService我们可以通过 g_browser_process->local_state()获得。

PrefService提供的getter和setter函数如下:

如果想确保我们的修改触发通知,有两个选择:

  • 使用void PrefService::Set(const char* path, const Value& value) 设置一个新的dictionary的值
  • 使用ScopedUserPrefUpdate去修改dictionary或者list

当update离开作用域,值改变个通知就会被触发。

你不必保存修改后的preferences,所有的set,update操作会触发一个定时器去写入修改的preferences到磁盘。如果你想手动的触发写入逻辑,可以调用PrefService::CommitPendingWrite()。

PrefChangeRegistrar可以提供preference改变事件的订阅。
定义一个PrefChangeRegistrar registrar_;
然后注册:
registrar_.Init(pref_service);
registrar_.Add(prefs::kPreference, this);

所有prefs::kPreference的改变都会调用this的Observe()。PrefMember类(BooleanPrefMember, IntegerPrefMember, …,pref_member.h)是一些preference值的帮助类。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注