Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(944)

Unified Diff: chrome/browser/extensions/api/declarative/rules_registry_with_cache.cc

Issue 14851011: RulesRegistryWithCache::ProcessChangedRules speed-up (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/declarative/rules_registry_with_cache.cc
diff --git a/chrome/browser/extensions/api/declarative/rules_registry_with_cache.cc b/chrome/browser/extensions/api/declarative/rules_registry_with_cache.cc
index a1e3a7c187b20c01737e8ab453eb59318a64491b..b4057c4f89b5e574d368f7d6b7c35358b3adfe82 100644
--- a/chrome/browser/extensions/api/declarative/rules_registry_with_cache.cc
+++ b/chrome/browser/extensions/api/declarative/rules_registry_with_cache.cc
@@ -42,6 +42,7 @@ std::vector<linked_ptr<extensions::RulesRegistry::Rule> > RulesFromValue(
if (!value || !value->GetAsList(&list))
return rules;
+ rules.reserve(list->GetSize());
for (size_t i = 0; i < list->GetSize(); ++i) {
const base::DictionaryValue* dict = NULL;
if (!list->GetDictionary(i, &dict))
@@ -111,13 +112,13 @@ std::string RulesRegistryWithCache::AddRules(
const std::string& extension_id,
const std::vector<linked_ptr<Rule> >& rules) {
DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
+ RulesDictionary& current_rules = rules_[extension_id];
// Verify that all rule IDs are new.
for (std::vector<linked_ptr<Rule> >::const_iterator i =
rules.begin(); i != rules.end(); ++i) {
const RuleId& rule_id = *((*i)->id);
- RulesDictionaryKey key(extension_id, rule_id);
- if (rules_.find(key) != rules_.end())
+ if (current_rules.find(rule_id) != current_rules.end())
return base::StringPrintf(kDuplicateRuleId, rule_id.c_str());
}
@@ -130,8 +131,7 @@ std::string RulesRegistryWithCache::AddRules(
for (std::vector<linked_ptr<Rule> >::const_iterator i =
rules.begin(); i != rules.end(); ++i) {
const RuleId& rule_id = *((*i)->id);
- RulesDictionaryKey key(extension_id, rule_id);
- rules_[key] = *i;
+ current_rules[rule_id] = *i;
}
ProcessChangedRules(extension_id);
@@ -149,11 +149,13 @@ std::string RulesRegistryWithCache::RemoveRules(
return error;
// Commit removal of rules from |rules_| on success.
+ RulesDictionary& current_rules = rules_[extension_id];
for (std::vector<std::string>::const_iterator i =
rule_identifiers.begin(); i != rule_identifiers.end(); ++i) {
- RulesDictionaryKey lookup_key(extension_id, *i);
- rules_.erase(lookup_key);
+ current_rules.erase(*i);
}
+ if (current_rules.empty())
+ rules_.erase(extension_id);
ProcessChangedRules(extension_id);
return kSuccess;
@@ -169,13 +171,7 @@ std::string RulesRegistryWithCache::RemoveAllRules(
return error;
// Commit removal of rules from |rules_| on success.
- for (RulesDictionary::const_iterator i = rules_.begin();
- i != rules_.end();) {
- const RulesDictionaryKey& key = i->first;
- ++i;
- if (key.first == extension_id)
- rules_.erase(key);
- }
+ rules_.erase(extension_id);
ProcessChangedRules(extension_id);
return kSuccess;
@@ -187,11 +183,11 @@ std::string RulesRegistryWithCache::GetRules(
std::vector<linked_ptr<RulesRegistry::Rule> >* out) {
DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
+ RulesDictionary& current_rules = rules_[extension_id];
for (std::vector<std::string>::const_iterator i = rule_identifiers.begin();
i != rule_identifiers.end(); ++i) {
- RulesDictionaryKey lookup_key(extension_id, *i);
- RulesDictionary::iterator entry = rules_.find(lookup_key);
- if (entry != rules_.end())
+ RulesDictionary::iterator entry = current_rules.find(*i);
+ if (entry != current_rules.end())
out->push_back(entry->second);
}
return kSuccess;
@@ -202,11 +198,11 @@ std::string RulesRegistryWithCache::GetAllRules(
std::vector<linked_ptr<RulesRegistry::Rule> >* out) {
DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
- for (RulesDictionary::const_iterator i = rules_.begin();
- i != rules_.end(); ++i) {
- const RulesDictionaryKey& key = i->first;
- if (key.first == extension_id)
- out->push_back(i->second);
+ RulesDictionary& current_rules = rules_[extension_id];
+ out->reserve(out->size() + current_rules.size());
+ for (RulesDictionary::const_iterator i = current_rules.begin();
+ i != current_rules.end(); ++i) {
+ out->push_back(i->second);
}
return kSuccess;
}
@@ -250,8 +246,8 @@ void RulesRegistryWithCache::ProcessChangedRules(
const std::string& extension_id) {
DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
- std::vector<linked_ptr<RulesRegistry::Rule> > new_rules;
- std::string error = GetAllRules(extension_id, &new_rules);
+ scoped_ptr<RulesVector> new_rules(new RulesVector());
+ std::string error = GetAllRules(extension_id, new_rules.get());
DCHECK_EQ(std::string(), error);
content::BrowserThread::PostTask(
content::BrowserThread::UI,
@@ -259,7 +255,7 @@ void RulesRegistryWithCache::ProcessChangedRules(
base::Bind(&RuleStorageOnUI::WriteToStorage,
storage_on_ui_,
extension_id,
- base::Passed(RulesToValue(new_rules))));
+ base::Passed(&new_rules)));
}
// RulesRegistryWithCache::RuleStorageOnUI
@@ -326,14 +322,16 @@ void RulesRegistryWithCache::RuleStorageOnUI::Init() {
void RulesRegistryWithCache::RuleStorageOnUI::WriteToStorage(
const std::string& extension_id,
- scoped_ptr<base::Value> value) {
+ scoped_ptr<RulesVector> new_rules) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
if (!profile_)
return;
StateStore* store = ExtensionSystem::Get(profile_)->rules_store();
- if (store)
- store->SetExtensionValue(extension_id, storage_key_, value.Pass());
+ if (store) {
+ store->SetExtensionValue(
+ extension_id, storage_key_, RulesToValue(*new_rules));
+ }
}
void RulesRegistryWithCache::RuleStorageOnUI::Observe(

Powered by Google App Engine
This is Rietveld 408576698