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

Side by Side 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: Fixing the uninitialised WeakPtrFactory 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/extensions/api/declarative/rules_registry_with_cache.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_registry_with_cache.h" 5 #include "chrome/browser/extensions/api/declarative/rules_registry_with_cache.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 24 matching lines...) Expand all
35 } 35 }
36 36
37 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > RulesFromValue( 37 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > RulesFromValue(
38 const base::Value* value) { 38 const base::Value* value) {
39 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > rules; 39 std::vector<linked_ptr<extensions::RulesRegistry::Rule> > rules;
40 40
41 const base::ListValue* list = NULL; 41 const base::ListValue* list = NULL;
42 if (!value || !value->GetAsList(&list)) 42 if (!value || !value->GetAsList(&list))
43 return rules; 43 return rules;
44 44
45 rules.reserve(list->GetSize());
45 for (size_t i = 0; i < list->GetSize(); ++i) { 46 for (size_t i = 0; i < list->GetSize(); ++i) {
46 const base::DictionaryValue* dict = NULL; 47 const base::DictionaryValue* dict = NULL;
47 if (!list->GetDictionary(i, &dict)) 48 if (!list->GetDictionary(i, &dict))
48 continue; 49 continue;
49 linked_ptr<extensions::RulesRegistry::Rule> rule( 50 linked_ptr<extensions::RulesRegistry::Rule> rule(
50 new extensions::RulesRegistry::Rule()); 51 new extensions::RulesRegistry::Rule());
51 if (extensions::RulesRegistry::Rule::Populate(*dict, rule.get())) 52 if (extensions::RulesRegistry::Rule::Populate(*dict, rule.get()))
52 rules.push_back(rule); 53 rules.push_back(rule);
53 } 54 }
54 55
(...skipping 16 matching lines...) Expand all
71 72
72 // RulesRegistryWithCache 73 // RulesRegistryWithCache
73 74
74 RulesRegistryWithCache::RulesRegistryWithCache( 75 RulesRegistryWithCache::RulesRegistryWithCache(
75 Profile* profile, 76 Profile* profile,
76 const char* event_name, 77 const char* event_name,
77 content::BrowserThread::ID owner_thread, 78 content::BrowserThread::ID owner_thread,
78 bool log_storage_init_delay, 79 bool log_storage_init_delay,
79 scoped_ptr<RuleStorageOnUI>* ui_part) 80 scoped_ptr<RuleStorageOnUI>* ui_part)
80 : RulesRegistry(owner_thread, event_name), 81 : RulesRegistry(owner_thread, event_name),
81 weak_ptr_factory_((profile) ? this : NULL), 82 weak_ptr_factory_(this),
82 storage_on_ui_((profile 83 storage_on_ui_((profile
83 ? (new RuleStorageOnUI(profile, 84 ? (new RuleStorageOnUI(profile,
84 GetDeclarativeRuleStorageKey( 85 GetDeclarativeRuleStorageKey(
85 event_name, 86 event_name,
86 profile->IsOffTheRecord()), 87 profile->IsOffTheRecord()),
87 owner_thread, 88 owner_thread,
88 weak_ptr_factory_.GetWeakPtr(), 89 weak_ptr_factory_.GetWeakPtr(),
89 log_storage_init_delay)) 90 log_storage_init_delay))
90 ->GetWeakPtr() 91 ->GetWeakPtr()
91 : base::WeakPtr<RuleStorageOnUI>())) { 92 : base::WeakPtr<RuleStorageOnUI>())),
93 process_changed_rules_requested_(false) {
92 if (!profile) { 94 if (!profile) {
93 CHECK(!ui_part); 95 CHECK(!ui_part);
94 return; 96 return;
95 } 97 }
96 98
97 ui_part->reset(storage_on_ui_.get()); 99 ui_part->reset(storage_on_ui_.get());
98 100
99 storage_on_ui_->Init(); 101 storage_on_ui_->Init();
100 } 102 }
101 103
(...skipping 17 matching lines...) Expand all
119 return error; 121 return error;
120 122
121 // Commit all rules into |rules_| on success. 123 // Commit all rules into |rules_| on success.
122 for (std::vector<linked_ptr<Rule> >::const_iterator i = 124 for (std::vector<linked_ptr<Rule> >::const_iterator i =
123 rules.begin(); i != rules.end(); ++i) { 125 rules.begin(); i != rules.end(); ++i) {
124 const RuleId& rule_id = *((*i)->id); 126 const RuleId& rule_id = *((*i)->id);
125 RulesDictionaryKey key(extension_id, rule_id); 127 RulesDictionaryKey key(extension_id, rule_id);
126 rules_[key] = *i; 128 rules_[key] = *i;
127 } 129 }
128 130
129 ProcessChangedRules(extension_id); 131 if (!process_changed_rules_requested_) {
132 process_changed_rules_requested_ = true;
133 ready_.Post(FROM_HERE,
134 base::Bind(&RulesRegistryWithCache::ProcessChangedRules,
135 weak_ptr_factory_.GetWeakPtr(),
136 extension_id));
137 }
130 return kSuccess; 138 return kSuccess;
131 } 139 }
132 140
133 std::string RulesRegistryWithCache::RemoveRules( 141 std::string RulesRegistryWithCache::RemoveRules(
134 const std::string& extension_id, 142 const std::string& extension_id,
135 const std::vector<std::string>& rule_identifiers) { 143 const std::vector<std::string>& rule_identifiers) {
136 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread())); 144 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
137 145
138 std::string error = RemoveRulesImpl(extension_id, rule_identifiers); 146 std::string error = RemoveRulesImpl(extension_id, rule_identifiers);
139 147
140 if (!error.empty()) 148 if (!error.empty())
141 return error; 149 return error;
142 150
143 // Commit removal of rules from |rules_| on success. 151 // Commit removal of rules from |rules_| on success.
144 for (std::vector<std::string>::const_iterator i = 152 for (std::vector<std::string>::const_iterator i =
145 rule_identifiers.begin(); i != rule_identifiers.end(); ++i) { 153 rule_identifiers.begin(); i != rule_identifiers.end(); ++i) {
146 RulesDictionaryKey lookup_key(extension_id, *i); 154 RulesDictionaryKey lookup_key(extension_id, *i);
147 rules_.erase(lookup_key); 155 rules_.erase(lookup_key);
148 } 156 }
149 157
150 ProcessChangedRules(extension_id); 158 if (!process_changed_rules_requested_) {
159 process_changed_rules_requested_ = true;
160 ready_.Post(FROM_HERE,
161 base::Bind(&RulesRegistryWithCache::ProcessChangedRules,
162 weak_ptr_factory_.GetWeakPtr(),
163 extension_id));
164 }
151 return kSuccess; 165 return kSuccess;
152 } 166 }
153 167
154 std::string RulesRegistryWithCache::RemoveAllRules( 168 std::string RulesRegistryWithCache::RemoveAllRules(
155 const std::string& extension_id) { 169 const std::string& extension_id) {
156 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread())); 170 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
157 171
158 std::string error = RemoveAllRulesImpl(extension_id); 172 std::string error = RemoveAllRulesImpl(extension_id);
159 173
160 if (!error.empty()) 174 if (!error.empty())
161 return error; 175 return error;
162 176
163 // Commit removal of rules from |rules_| on success. 177 // Commit removal of rules from |rules_| on success.
164 for (RulesDictionary::const_iterator i = rules_.begin(); 178 for (RulesDictionary::const_iterator i = rules_.begin();
165 i != rules_.end();) { 179 i != rules_.end();) {
166 const RulesDictionaryKey& key = i->first; 180 const RulesDictionaryKey& key = i->first;
167 ++i; 181 ++i;
168 if (key.first == extension_id) 182 if (key.first == extension_id)
169 rules_.erase(key); 183 rules_.erase(key);
170 } 184 }
171 185
172 ProcessChangedRules(extension_id); 186 if (!process_changed_rules_requested_) {
187 process_changed_rules_requested_ = true;
188 ready_.Post(FROM_HERE,
189 base::Bind(&RulesRegistryWithCache::ProcessChangedRules,
190 weak_ptr_factory_.GetWeakPtr(),
191 extension_id));
192 }
173 return kSuccess; 193 return kSuccess;
174 } 194 }
175 195
176 std::string RulesRegistryWithCache::GetRules( 196 std::string RulesRegistryWithCache::GetRules(
177 const std::string& extension_id, 197 const std::string& extension_id,
178 const std::vector<std::string>& rule_identifiers, 198 const std::vector<std::string>& rule_identifiers,
179 std::vector<linked_ptr<RulesRegistry::Rule> >* out) { 199 std::vector<linked_ptr<RulesRegistry::Rule> >* out) {
180 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread())); 200 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
181 201
182 for (std::vector<std::string>::const_iterator i = rule_identifiers.begin(); 202 for (std::vector<std::string>::const_iterator i = rule_identifiers.begin();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 scoped_ptr<base::Value> rules) { 250 scoped_ptr<base::Value> rules) {
231 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread())); 251 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
232 252
233 AddRules(extension_id, RulesFromValue(rules.get())); 253 AddRules(extension_id, RulesFromValue(rules.get()));
234 } 254 }
235 255
236 void RulesRegistryWithCache::ProcessChangedRules( 256 void RulesRegistryWithCache::ProcessChangedRules(
237 const std::string& extension_id) { 257 const std::string& extension_id) {
238 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread())); 258 DCHECK(content::BrowserThread::CurrentlyOn(owner_thread()));
239 259
260 process_changed_rules_requested_ = false;
261
240 std::vector<linked_ptr<RulesRegistry::Rule> > new_rules; 262 std::vector<linked_ptr<RulesRegistry::Rule> > new_rules;
241 std::string error = GetAllRules(extension_id, &new_rules); 263 std::string error = GetAllRules(extension_id, &new_rules);
242 DCHECK_EQ(std::string(), error); 264 DCHECK_EQ(std::string(), error);
243 content::BrowserThread::PostTask( 265 content::BrowserThread::PostTask(
244 content::BrowserThread::UI, 266 content::BrowserThread::UI,
245 FROM_HERE, 267 FROM_HERE,
246 base::Bind(&RuleStorageOnUI::WriteToStorage, 268 base::Bind(&RuleStorageOnUI::WriteToStorage,
247 storage_on_ui_, 269 storage_on_ui_,
248 extension_id, 270 extension_id,
249 base::Passed(RulesToValue(new_rules)))); 271 base::Passed(RulesToValue(new_rules))));
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 base::Passed(&value))); 407 base::Passed(&value)));
386 408
387 waiting_for_extensions_.erase(extension_id); 409 waiting_for_extensions_.erase(extension_id);
388 410
389 if (waiting_for_extensions_.empty()) 411 if (waiting_for_extensions_.empty())
390 ExtensionSystem::Get(profile_)->ready().Post( 412 ExtensionSystem::Get(profile_)->ready().Post(
391 FROM_HERE, base::Bind(&RuleStorageOnUI::CheckIfReady, GetWeakPtr())); 413 FROM_HERE, base::Bind(&RuleStorageOnUI::CheckIfReady, GetWeakPtr()));
392 } 414 }
393 415
394 } // namespace extensions 416 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/declarative/rules_registry_with_cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698