| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/declarative/rules_cache_delegate.h" | 5 #include "chrome/browser/extensions/api/declarative/rules_cache_delegate.h" |
| 6 | 6 |
| 7 #include "chrome/browser/chrome_notification_types.h" | 7 #include "chrome/browser/chrome_notification_types.h" |
| 8 #include "chrome/browser/extensions/api/declarative/rules_registry.h" | 8 #include "chrome/browser/extensions/api/declarative/rules_registry.h" |
| 9 #include "chrome/browser/extensions/extension_info_map.h" | 9 #include "chrome/browser/extensions/extension_info_map.h" |
| 10 #include "chrome/browser/extensions/extension_service.h" | 10 #include "chrome/browser/extensions/extension_service.h" |
| 11 #include "chrome/browser/extensions/extension_system.h" | 11 #include "chrome/browser/extensions/extension_system.h" |
| 12 #include "chrome/browser/extensions/extension_util.h" | 12 #include "chrome/browser/extensions/extension_util.h" |
| 13 #include "chrome/browser/extensions/state_store.h" | 13 #include "chrome/browser/extensions/state_store.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 15 #include "content/public/browser/notification_details.h" | 15 #include "content/public/browser/notification_details.h" |
| 16 #include "content/public/browser/notification_source.h" | 16 #include "content/public/browser/notification_source.h" |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 // Returns the key to use for storing declarative rules in the state store. | 20 // Returns the key to use for storing declarative rules in the state store. |
| 21 std::string GetDeclarativeRuleStorageKey(const std::string& event_name, | 21 std::string GetDeclarativeRuleStorageKey(const std::string& event_name, |
| 22 bool incognito) { | 22 bool incognito) { |
| 23 if (incognito) | 23 if (incognito) |
| 24 return "declarative_rules.incognito." + event_name; | 24 return "declarative_rules.incognito." + event_name; |
| 25 else | 25 else |
| 26 return "declarative_rules." + event_name; | 26 return "declarative_rules." + event_name; |
| 27 } | 27 } |
| 28 | 28 |
| 29 |
| 29 } // namespace | 30 } // namespace |
| 30 | 31 |
| 31 namespace extensions { | 32 namespace extensions { |
| 32 | 33 |
| 33 // RulesCacheDelegate | 34 // RulesCacheDelegate |
| 34 | 35 |
| 35 const char RulesCacheDelegate::kRulesStoredKey[] = | 36 const char RulesCacheDelegate::kRulesStoredKey[] = |
| 36 "has_declarative_rules"; | 37 "has_declarative_rules"; |
| 37 | 38 |
| 38 RulesCacheDelegate::RulesCacheDelegate( | 39 RulesCacheDelegate::RulesCacheDelegate(bool log_storage_init_delay) |
| 39 Profile* profile, | 40 : profile_(NULL), |
| 40 const std::string& event_name, | |
| 41 content::BrowserThread::ID rules_registry_thread, | |
| 42 base::WeakPtr<RulesRegistry> registry, | |
| 43 bool log_storage_init_delay) | |
| 44 : profile_(profile), | |
| 45 storage_key_(GetDeclarativeRuleStorageKey(event_name, | |
| 46 profile->IsOffTheRecord())), | |
| 47 rules_stored_key_(GetRulesStoredKey(event_name, | |
| 48 profile->IsOffTheRecord())), | |
| 49 log_storage_init_delay_(log_storage_init_delay), | 41 log_storage_init_delay_(log_storage_init_delay), |
| 50 registry_(registry), | |
| 51 rules_registry_thread_(rules_registry_thread), | |
| 52 notified_registry_(false), | 42 notified_registry_(false), |
| 53 weak_ptr_factory_(this) {} | 43 weak_ptr_factory_(this) { |
| 44 } |
| 54 | 45 |
| 55 RulesCacheDelegate::~RulesCacheDelegate() {} | 46 RulesCacheDelegate::~RulesCacheDelegate() {} |
| 56 | 47 |
| 57 // Returns the key to use for storing whether the rules have been stored. | 48 // Returns the key to use for storing whether the rules have been stored. |
| 58 // static | 49 // static |
| 59 std::string RulesCacheDelegate::GetRulesStoredKey(const std::string& event_name, | 50 std::string RulesCacheDelegate::GetRulesStoredKey(const std::string& event_name, |
| 60 bool incognito) { | 51 bool incognito) { |
| 61 std::string result(kRulesStoredKey); | 52 std::string result(kRulesStoredKey); |
| 62 result += incognito ? ".incognito." : "."; | 53 result += incognito ? ".incognito." : "."; |
| 63 return result + event_name; | 54 return result + event_name; |
| 64 } | 55 } |
| 65 | 56 |
| 66 // This is called from the constructor of RulesRegistry, so it is | 57 // This is called from the constructor of RulesRegistry, so it is |
| 67 // important that it both | 58 // important that it both |
| 68 // 1. calls no (in particular virtual) methods of the rules registry, and | 59 // 1. calls no (in particular virtual) methods of the rules registry, and |
| 69 // 2. does not create scoped_refptr holding the registry. (A short-lived | 60 // 2. does not create scoped_refptr holding the registry. (A short-lived |
| 70 // scoped_refptr might delete the rules registry before it is constructed.) | 61 // scoped_refptr might delete the rules registry before it is constructed.) |
| 71 void RulesCacheDelegate::Init() { | 62 void RulesCacheDelegate::Init(RulesRegistry* registry) { |
| 72 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 63 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 73 | 64 |
| 65 // WARNING: The first use of |registry_| will bind it to the calling thread |
| 66 // so don't use this here. |
| 67 registry_ = registry->GetWeakPtr(); |
| 68 |
| 69 profile_ = registry->profile(); |
| 70 storage_key_ = |
| 71 GetDeclarativeRuleStorageKey(registry->event_name(), |
| 72 profile_->IsOffTheRecord()); |
| 73 rules_stored_key_ = GetRulesStoredKey(registry->event_name(), |
| 74 profile_->IsOffTheRecord()); |
| 75 rules_registry_thread_ = registry->owner_thread(); |
| 76 |
| 74 ExtensionSystem& system = *ExtensionSystem::Get(profile_); | 77 ExtensionSystem& system = *ExtensionSystem::Get(profile_); |
| 75 extensions::StateStore* store = system.rules_store(); | 78 extensions::StateStore* store = system.rules_store(); |
| 76 if (store) | 79 if (store) |
| 77 store->RegisterKey(storage_key_); | 80 store->RegisterKey(storage_key_); |
| 78 | 81 |
| 79 registrar_.Add(this, | 82 registrar_.Add(this, |
| 80 chrome::NOTIFICATION_EXTENSION_LOADED, | 83 chrome::NOTIFICATION_EXTENSION_LOADED, |
| 81 content::Source<Profile>(profile_->GetOriginalProfile())); | 84 content::Source<Profile>(profile_->GetOriginalProfile())); |
| 82 | 85 |
| 83 if (profile_->IsOffTheRecord()) | 86 if (profile_->IsOffTheRecord()) |
| 84 log_storage_init_delay_ = false; | 87 log_storage_init_delay_ = false; |
| 85 | 88 |
| 86 system.ready().Post( | 89 system.ready().Post( |
| 87 FROM_HERE, | 90 FROM_HERE, |
| 88 base::Bind(&RulesCacheDelegate::ReadRulesForInstalledExtensions, | 91 base::Bind(&RulesCacheDelegate::ReadRulesForInstalledExtensions, |
| 89 GetWeakPtr())); | 92 weak_ptr_factory_.GetWeakPtr())); |
| 90 system.ready().Post(FROM_HERE, | 93 system.ready().Post(FROM_HERE, |
| 91 base::Bind(&RulesCacheDelegate::CheckIfReady, | 94 base::Bind(&RulesCacheDelegate::CheckIfReady, |
| 92 GetWeakPtr())); | 95 weak_ptr_factory_.GetWeakPtr())); |
| 93 } | 96 } |
| 94 | 97 |
| 95 void RulesCacheDelegate::WriteToStorage(const std::string& extension_id, | 98 void RulesCacheDelegate::WriteToStorage(const std::string& extension_id, |
| 96 scoped_ptr<base::Value> value) { | 99 scoped_ptr<base::Value> value) { |
| 97 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 100 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 98 if (!profile_) | 101 if (!profile_) |
| 99 return; | 102 return; |
| 100 | 103 |
| 101 const base::ListValue* rules = NULL; | 104 const base::ListValue* rules = NULL; |
| 102 CHECK(value->GetAsList(&rules)); | 105 CHECK(value->GetAsList(&rules)); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 void RulesCacheDelegate::ReadFromStorage(const std::string& extension_id) { | 178 void RulesCacheDelegate::ReadFromStorage(const std::string& extension_id) { |
| 176 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 179 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 177 if (!profile_) | 180 if (!profile_) |
| 178 return; | 181 return; |
| 179 | 182 |
| 180 if (log_storage_init_delay_ && storage_init_time_.is_null()) | 183 if (log_storage_init_delay_ && storage_init_time_.is_null()) |
| 181 storage_init_time_ = base::Time::Now(); | 184 storage_init_time_ = base::Time::Now(); |
| 182 | 185 |
| 183 if (!GetDeclarativeRulesStored(extension_id)) { | 186 if (!GetDeclarativeRulesStored(extension_id)) { |
| 184 ExtensionSystem::Get(profile_)->ready().Post( | 187 ExtensionSystem::Get(profile_)->ready().Post( |
| 185 FROM_HERE, base::Bind(&RulesCacheDelegate::CheckIfReady, GetWeakPtr())); | 188 FROM_HERE, base::Bind(&RulesCacheDelegate::CheckIfReady, |
| 189 weak_ptr_factory_.GetWeakPtr())); |
| 186 return; | 190 return; |
| 187 } | 191 } |
| 188 | 192 |
| 189 extensions::StateStore* store = ExtensionSystem::Get(profile_)->rules_store(); | 193 extensions::StateStore* store = ExtensionSystem::Get(profile_)->rules_store(); |
| 190 if (!store) | 194 if (!store) |
| 191 return; | 195 return; |
| 192 waiting_for_extensions_.insert(extension_id); | 196 waiting_for_extensions_.insert(extension_id); |
| 193 store->GetExtensionValue( | 197 store->GetExtensionValue( |
| 194 extension_id, | 198 extension_id, |
| 195 storage_key_, | 199 storage_key_, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 207 FROM_HERE, | 211 FROM_HERE, |
| 208 base::Bind(&RulesRegistry::DeserializeAndAddRules, | 212 base::Bind(&RulesRegistry::DeserializeAndAddRules, |
| 209 registry_, | 213 registry_, |
| 210 extension_id, | 214 extension_id, |
| 211 base::Passed(&value))); | 215 base::Passed(&value))); |
| 212 | 216 |
| 213 waiting_for_extensions_.erase(extension_id); | 217 waiting_for_extensions_.erase(extension_id); |
| 214 | 218 |
| 215 if (waiting_for_extensions_.empty()) | 219 if (waiting_for_extensions_.empty()) |
| 216 ExtensionSystem::Get(profile_)->ready().Post( | 220 ExtensionSystem::Get(profile_)->ready().Post( |
| 217 FROM_HERE, base::Bind(&RulesCacheDelegate::CheckIfReady, GetWeakPtr())); | 221 FROM_HERE, base::Bind(&RulesCacheDelegate::CheckIfReady, |
| 222 weak_ptr_factory_.GetWeakPtr())); |
| 218 } | 223 } |
| 219 | 224 |
| 220 bool RulesCacheDelegate::GetDeclarativeRulesStored( | 225 bool RulesCacheDelegate::GetDeclarativeRulesStored( |
| 221 const std::string& extension_id) const { | 226 const std::string& extension_id) const { |
| 222 CHECK(profile_); | 227 CHECK(profile_); |
| 223 const ExtensionScopedPrefs* extension_prefs = ExtensionPrefs::Get(profile_); | 228 const ExtensionScopedPrefs* extension_prefs = ExtensionPrefs::Get(profile_); |
| 224 | 229 |
| 225 bool rules_stored = true; | 230 bool rules_stored = true; |
| 226 if (extension_prefs->ReadPrefAsBoolean( | 231 if (extension_prefs->ReadPrefAsBoolean( |
| 227 extension_id, rules_stored_key_, &rules_stored)) | 232 extension_id, rules_stored_key_, &rules_stored)) |
| 228 return rules_stored; | 233 return rules_stored; |
| 229 | 234 |
| 230 // Safe default -- if we don't know that the rules are not stored, we force | 235 // Safe default -- if we don't know that the rules are not stored, we force |
| 231 // a read by returning true. | 236 // a read by returning true. |
| 232 return true; | 237 return true; |
| 233 } | 238 } |
| 234 | 239 |
| 235 void RulesCacheDelegate::SetDeclarativeRulesStored( | 240 void RulesCacheDelegate::SetDeclarativeRulesStored( |
| 236 const std::string& extension_id, | 241 const std::string& extension_id, |
| 237 bool rules_stored) { | 242 bool rules_stored) { |
| 238 CHECK(profile_); | 243 CHECK(profile_); |
| 239 ExtensionScopedPrefs* extension_prefs = ExtensionPrefs::Get(profile_); | 244 ExtensionScopedPrefs* extension_prefs = ExtensionPrefs::Get(profile_); |
| 240 extension_prefs->UpdateExtensionPref( | 245 extension_prefs->UpdateExtensionPref( |
| 241 extension_id, | 246 extension_id, |
| 242 rules_stored_key_, | 247 rules_stored_key_, |
| 243 new base::FundamentalValue(rules_stored)); | 248 new base::FundamentalValue(rules_stored)); |
| 244 } | 249 } |
| 245 | 250 |
| 246 } // namespace extensions | 251 } // namespace extensions |
| OLD | NEW |