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

Side by Side Diff: chrome/browser/extensions/extension_content_settings_store.cc

Issue 7088017: Split incognito extension content settings in session-only and persistent. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review Created 9 years, 6 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/extension_content_settings_store.h" 5 #include "chrome/browser/extensions/extension_content_settings_store.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stl_util-inl.h" 10 #include "base/stl_util-inl.h"
11 #include "base/values.h" 11 #include "base/values.h"
12 #include "chrome/browser/extensions/extension_content_settings_api_constants.h" 12 #include "chrome/browser/extensions/extension_content_settings_api_constants.h"
13 #include "chrome/browser/extensions/extension_content_settings_helpers.h" 13 #include "chrome/browser/extensions/extension_content_settings_helpers.h"
14 #include "content/browser/browser_thread.h" 14 #include "content/browser/browser_thread.h"
15 15
16 namespace helpers = extension_content_settings_helpers; 16 namespace helpers = extension_content_settings_helpers;
17 namespace keys = extension_content_settings_api_constants; 17 namespace keys = extension_content_settings_api_constants;
18 18
19 using content_settings::ResourceIdentifier; 19 using content_settings::ResourceIdentifier;
20 20
21 struct ExtensionContentSettingsStore::ExtensionEntry { 21 struct ExtensionContentSettingsStore::ExtensionEntry {
22 // Installation time of the extension. 22 // Installation time of the extension.
23 base::Time install_time; 23 base::Time install_time;
24 // Whether extension is enabled in the profile. 24 // Whether extension is enabled in the profile.
25 bool enabled; 25 bool enabled;
26 // Content settings. 26 // Content settings.
27 ContentSettingSpecList settings; 27 ContentSettingSpecList settings;
28 // Incognito content settings. 28 // Persistent incognito content settings.
29 ContentSettingSpecList incognito_settings; 29 ContentSettingSpecList incognito_persistent_settings;
30 // Session-only incognito content settings.
31 ContentSettingSpecList incognito_session_only_settings;
30 }; 32 };
31 33
32 ExtensionContentSettingsStore::ExtensionContentSettingsStore() { 34 ExtensionContentSettingsStore::ExtensionContentSettingsStore() {
33 DCHECK(OnCorrectThread()); 35 DCHECK(OnCorrectThread());
34 } 36 }
35 37
36 ExtensionContentSettingsStore::~ExtensionContentSettingsStore() { 38 ExtensionContentSettingsStore::~ExtensionContentSettingsStore() {
37 DCHECK(OnCorrectThread()); 39 DCHECK(OnCorrectThread());
38 NotifyOfDestruction(); 40 NotifyOfDestruction();
39 STLDeleteValues(&entries_); 41 STLDeleteValues(&entries_);
40 } 42 }
41 43
42 void ExtensionContentSettingsStore::SetExtensionContentSetting( 44 void ExtensionContentSettingsStore::SetExtensionContentSetting(
43 const std::string& ext_id, 45 const std::string& ext_id,
44 const ContentSettingsPattern& embedded_pattern, 46 const ContentSettingsPattern& embedded_pattern,
45 const ContentSettingsPattern& top_level_pattern, 47 const ContentSettingsPattern& top_level_pattern,
46 ContentSettingsType type, 48 ContentSettingsType type,
47 const content_settings::ResourceIdentifier& identifier, 49 const content_settings::ResourceIdentifier& identifier,
48 ContentSetting setting, 50 ContentSetting setting,
49 bool incognito) { 51 extension_prefs_scope::Scope scope) {
50 { 52 {
51 base::AutoLock lock(lock_); 53 base::AutoLock lock(lock_);
52 ContentSettingSpecList* setting_spec_list = 54 ContentSettingSpecList* setting_spec_list =
53 GetContentSettingSpecList(ext_id, incognito); 55 GetContentSettingSpecList(ext_id, scope);
54 56
55 // Find |ContentSettingSpec|. 57 // Find |ContentSettingSpec|.
56 ContentSettingSpecList::iterator setting_spec = setting_spec_list->begin(); 58 ContentSettingSpecList::iterator setting_spec = setting_spec_list->begin();
57 while (setting_spec != setting_spec_list->end()) { 59 while (setting_spec != setting_spec_list->end()) {
58 if (setting_spec->embedded_pattern == embedded_pattern && 60 if (setting_spec->embedded_pattern == embedded_pattern &&
59 setting_spec->top_level_pattern == top_level_pattern && 61 setting_spec->top_level_pattern == top_level_pattern &&
60 setting_spec->content_type == type && 62 setting_spec->content_type == type &&
61 setting_spec->resource_identifier == identifier) { 63 setting_spec->resource_identifier == identifier) {
62 break; 64 break;
63 } 65 }
(...skipping 14 matching lines...) Expand all
78 setting_spec->setting = setting; 80 setting_spec->setting = setting;
79 } else { 81 } else {
80 setting_spec_list->erase(setting_spec); 82 setting_spec_list->erase(setting_spec);
81 } 83 }
82 } 84 }
83 85
84 // Send notification that content settings changed. 86 // Send notification that content settings changed.
85 // TODO(markusheintz): Notifications should only be sent if the set content 87 // TODO(markusheintz): Notifications should only be sent if the set content
86 // setting is effective and not hidden by another setting of another 88 // setting is effective and not hidden by another setting of another
87 // extension installed more recently. 89 // extension installed more recently.
88 NotifyOfContentSettingChanged(ext_id, incognito); 90 NotifyOfContentSettingChanged(ext_id,
91 scope != extension_prefs_scope::kRegular);
89 } 92 }
90 93
91 void ExtensionContentSettingsStore::RegisterExtension( 94 void ExtensionContentSettingsStore::RegisterExtension(
92 const std::string& ext_id, 95 const std::string& ext_id,
93 const base::Time& install_time, 96 const base::Time& install_time,
94 bool is_enabled) { 97 bool is_enabled) {
95 base::AutoLock lock(lock_); 98 base::AutoLock lock(lock_);
96 ExtensionEntryMap::iterator i = entries_.find(ext_id); 99 ExtensionEntryMap::iterator i = entries_.find(ext_id);
97 if (i != entries_.end()) 100 if (i != entries_.end())
98 delete i->second; 101 delete i->second;
99 102
100 entries_[ext_id] = new ExtensionEntry; 103 entries_[ext_id] = new ExtensionEntry;
101 entries_[ext_id]->install_time = install_time; 104 entries_[ext_id]->install_time = install_time;
102 entries_[ext_id]->enabled = is_enabled; 105 entries_[ext_id]->enabled = is_enabled;
103 } 106 }
104 107
105 void ExtensionContentSettingsStore::UnregisterExtension( 108 void ExtensionContentSettingsStore::UnregisterExtension(
106 const std::string& ext_id) { 109 const std::string& ext_id) {
107 bool notify = false; 110 bool notify = false;
108 bool notify_incognito = false; 111 bool notify_incognito = false;
109 { 112 {
110 base::AutoLock lock(lock_); 113 base::AutoLock lock(lock_);
111 ExtensionEntryMap::iterator i = entries_.find(ext_id); 114 ExtensionEntryMap::iterator i = entries_.find(ext_id);
112 if (i == entries_.end()) 115 if (i == entries_.end())
113 return; 116 return;
114 notify = !i->second->settings.empty(); 117 notify = !i->second->settings.empty();
115 notify_incognito = !i->second->incognito_settings.empty(); 118 notify_incognito = !i->second->incognito_persistent_settings.empty() ||
119 !i->second->incognito_session_only_settings.empty();
116 120
117 delete i->second; 121 delete i->second;
118 entries_.erase(i); 122 entries_.erase(i);
119 } 123 }
120 if (notify) 124 if (notify)
121 NotifyOfContentSettingChanged(ext_id, false); 125 NotifyOfContentSettingChanged(ext_id, false);
122 if (notify_incognito) 126 if (notify_incognito)
123 NotifyOfContentSettingChanged(ext_id, true); 127 NotifyOfContentSettingChanged(ext_id, true);
124 } 128 }
125 129
126 void ExtensionContentSettingsStore::SetExtensionState( 130 void ExtensionContentSettingsStore::SetExtensionState(
127 const std::string& ext_id, bool is_enabled) { 131 const std::string& ext_id, bool is_enabled) {
128 bool notify = false; 132 bool notify = false;
129 bool notify_incognito = false; 133 bool notify_incognito = false;
130 { 134 {
131 base::AutoLock lock(lock_); 135 base::AutoLock lock(lock_);
132 ExtensionEntryMap::const_iterator i = entries_.find(ext_id); 136 ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
133 if (i == entries_.end()) 137 if (i == entries_.end())
134 return; 138 return;
135 notify = !i->second->settings.empty(); 139 notify = !i->second->settings.empty();
136 notify_incognito = !i->second->incognito_settings.empty(); 140 notify_incognito = !i->second->incognito_persistent_settings.empty() ||
141 !i->second->incognito_session_only_settings.empty();
137 142
138 i->second->enabled = is_enabled; 143 i->second->enabled = is_enabled;
139 } 144 }
140 if (notify) 145 if (notify)
141 NotifyOfContentSettingChanged(ext_id, false); 146 NotifyOfContentSettingChanged(ext_id, false);
142 if (notify_incognito) 147 if (notify_incognito)
143 NotifyOfContentSettingChanged(ext_id, true); 148 NotifyOfContentSettingChanged(ext_id, true);
144 } 149 }
145 150
146 ExtensionContentSettingsStore::ContentSettingSpecList* 151 ExtensionContentSettingsStore::ContentSettingSpecList*
147 ExtensionContentSettingsStore::GetContentSettingSpecList( 152 ExtensionContentSettingsStore::GetContentSettingSpecList(
148 const std::string& ext_id, 153 const std::string& ext_id,
149 bool incognito) { 154 extension_prefs_scope::Scope scope) {
150 ExtensionEntryMap::const_iterator i = entries_.find(ext_id); 155 ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
151 DCHECK(i != entries_.end()); 156 DCHECK(i != entries_.end());
152 return incognito ? &(i->second->incognito_settings) 157 switch (scope) {
153 : &(i->second->settings); 158 case extension_prefs_scope::kRegular:
159 return &(i->second->settings);
160 case extension_prefs_scope::kIncognitoPersistent:
161 return &(i->second->incognito_persistent_settings);
162 case extension_prefs_scope::kIncognitoSessionOnly:
163 return &(i->second->incognito_session_only_settings);
164 }
165 NOTREACHED();
166 return NULL;
154 } 167 }
155 168
156 const ExtensionContentSettingsStore::ContentSettingSpecList* 169 const ExtensionContentSettingsStore::ContentSettingSpecList*
157 ExtensionContentSettingsStore::GetContentSettingSpecList( 170 ExtensionContentSettingsStore::GetContentSettingSpecList(
158 const std::string& ext_id, 171 const std::string& ext_id,
159 bool incognito) const { 172 extension_prefs_scope::Scope scope) const {
160 ExtensionEntryMap::const_iterator i = entries_.find(ext_id); 173 ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
161 DCHECK(i != entries_.end()); 174 DCHECK(i != entries_.end());
162 return incognito ? &(i->second->incognito_settings) 175 switch (scope) {
163 : &(i->second->settings); 176 case extension_prefs_scope::kRegular:
177 return &(i->second->settings);
178 case extension_prefs_scope::kIncognitoPersistent:
179 return &(i->second->incognito_persistent_settings);
180 case extension_prefs_scope::kIncognitoSessionOnly:
181 return &(i->second->incognito_session_only_settings);
182 }
183 NOTREACHED();
184 return NULL;
164 } 185 }
165 186
166
167 ContentSetting ExtensionContentSettingsStore::GetContentSettingFromSpecList( 187 ContentSetting ExtensionContentSettingsStore::GetContentSettingFromSpecList(
168 const GURL& embedded_url, 188 const GURL& embedded_url,
169 const GURL& top_level_url, 189 const GURL& top_level_url,
170 ContentSettingsType type, 190 ContentSettingsType type,
171 const content_settings::ResourceIdentifier& identifier, 191 const content_settings::ResourceIdentifier& identifier,
172 const ContentSettingSpecList& setting_spec_list) const { 192 const ContentSettingSpecList& setting_spec_list) const {
173 ContentSettingSpecList::const_iterator winner_spec = setting_spec_list.end(); 193 ContentSettingSpecList::const_iterator winner_spec = setting_spec_list.end();
174 194
175 for (ContentSettingSpecList::const_iterator spec = setting_spec_list.begin(); 195 for (ContentSettingSpecList::const_iterator spec = setting_spec_list.begin();
176 spec != setting_spec_list.end(); ++spec) { 196 spec != setting_spec_list.end(); ++spec) {
177 if (!spec->embedded_pattern.Matches(embedded_url) || 197 if (!spec->embedded_pattern.Matches(embedded_url) ||
178 !spec->top_level_pattern.Matches(top_level_url) || 198 !spec->top_level_pattern.Matches(top_level_url) ||
179 spec->content_type != type || 199 spec->content_type != type ||
180 spec->resource_identifier != identifier) { 200 spec->resource_identifier != identifier) {
181 continue; 201 continue;
182 } 202 }
183 203
184 // TODO(markusheintz): Compare top-level patterns as well? 204 // TODO(markusheintz): Compare embedded patterns as well?
185 if (winner_spec == setting_spec_list.end() || 205 if (winner_spec == setting_spec_list.end() ||
186 spec->embedded_pattern.Compare(winner_spec->embedded_pattern) == 206 winner_spec->top_level_pattern.Compare(spec->top_level_pattern) ==
187 ContentSettingsPattern::SUCCESSOR) { 207 ContentSettingsPattern::SUCCESSOR) {
188 winner_spec = spec; 208 winner_spec = spec;
189 } 209 }
190 } 210 }
191 211
192 return (winner_spec != setting_spec_list.end()) ? winner_spec->setting 212 return (winner_spec != setting_spec_list.end()) ? winner_spec->setting
193 : CONTENT_SETTING_DEFAULT; 213 : CONTENT_SETTING_DEFAULT;
194 } 214 }
195 215
196 ContentSetting ExtensionContentSettingsStore::GetEffectiveContentSetting( 216 ContentSetting ExtensionContentSettingsStore::GetEffectiveContentSetting(
(...skipping 12 matching lines...) Expand all
209 const base::Time& install_time = i->second->install_time; 229 const base::Time& install_time = i->second->install_time;
210 const bool enabled = i->second->enabled; 230 const bool enabled = i->second->enabled;
211 231
212 if (!enabled) 232 if (!enabled)
213 continue; 233 continue;
214 if (install_time < winners_install_time) 234 if (install_time < winners_install_time)
215 continue; 235 continue;
216 236
217 ContentSetting setting = CONTENT_SETTING_DEFAULT; 237 ContentSetting setting = CONTENT_SETTING_DEFAULT;
218 if (incognito) { 238 if (incognito) {
219 // Get incognito setting 239 // Try session-only incognito setting first.
220 setting = GetContentSettingFromSpecList(embedded_url, top_level_url, type, 240 setting = GetContentSettingFromSpecList(
221 identifier, 241 embedded_url, top_level_url, type, identifier,
222 i->second->incognito_settings); 242 i->second->incognito_session_only_settings);
243 if (setting == CONTENT_SETTING_DEFAULT) {
244 // Next, persistent incognito setting.
245 setting = GetContentSettingFromSpecList(
246 embedded_url, top_level_url, type, identifier,
247 i->second->incognito_persistent_settings);
248 }
223 } 249 }
224 if (setting == CONTENT_SETTING_DEFAULT) { 250 if (setting == CONTENT_SETTING_DEFAULT) {
225 // Get non incognito setting 251 // Then, non-incognito setting.
226 setting = GetContentSettingFromSpecList(embedded_url, top_level_url, type, 252 setting = GetContentSettingFromSpecList(embedded_url, top_level_url, type,
227 identifier, i->second->settings); 253 identifier, i->second->settings);
228 } 254 }
229 255
230 if (setting != CONTENT_SETTING_DEFAULT) { 256 if (setting != CONTENT_SETTING_DEFAULT) {
231 winners_install_time = install_time; 257 winners_install_time = install_time;
232 winner_setting = setting; 258 winner_setting = setting;
233 } 259 }
234 } 260 }
235 261
236 return winner_setting; 262 return winner_setting;
237 } 263 }
238 264
265 void ExtensionContentSettingsStore::ClearContentSettingsForExtension(
266 const std::string& ext_id,
267 extension_prefs_scope::Scope scope) {
268 bool notify = false;
269 {
270 base::AutoLock lock(lock_);
271 ContentSettingSpecList* setting_spec_list =
272 GetContentSettingSpecList(ext_id, scope);
273 notify = !setting_spec_list->empty();
274 setting_spec_list->clear();
275 }
276 if (notify) {
277 NotifyOfContentSettingChanged(ext_id,
278 scope != extension_prefs_scope::kRegular);
279 }
280 }
281
282 // static
283 void ExtensionContentSettingsStore::AddRules(
284 ContentSettingsType type,
285 const content_settings::ResourceIdentifier& identifier,
286 const ContentSettingSpecList* setting_spec_list,
287 content_settings::ProviderInterface::Rules* rules) {
288 ContentSettingSpecList::const_iterator it;
289 for (it = setting_spec_list->begin(); it != setting_spec_list->end(); ++it) {
290 if (it->content_type == type && it->resource_identifier == identifier) {
291 rules->push_back(content_settings::ProviderInterface::Rule(
292 it->embedded_pattern, it->top_level_pattern, it->setting));
293 }
294 }
295 }
296
239 void ExtensionContentSettingsStore::GetContentSettingsForContentType( 297 void ExtensionContentSettingsStore::GetContentSettingsForContentType(
240 ContentSettingsType type, 298 ContentSettingsType type,
241 const content_settings::ResourceIdentifier& identifier, 299 const content_settings::ResourceIdentifier& identifier,
242 bool incognito, 300 bool incognito,
243 content_settings::ProviderInterface::Rules* rules) const { 301 content_settings::ProviderInterface::Rules* rules) const {
244 base::AutoLock lock(lock_); 302 base::AutoLock lock(lock_);
245 ExtensionEntryMap::const_iterator ext_it; 303 ExtensionEntryMap::const_iterator ext_it;
246 for (ext_it = entries_.begin(); ext_it != entries_.end(); ++ext_it) { 304 for (ext_it = entries_.begin(); ext_it != entries_.end(); ++ext_it) {
247 const ContentSettingSpecList* setting_spec_list = 305 if (incognito) {
248 GetContentSettingSpecList(ext_it->first, incognito); 306 AddRules(type, identifier,
249 ContentSettingSpecList::const_iterator it; 307 GetContentSettingSpecList(
250 for (it = setting_spec_list->begin(); it != setting_spec_list->end(); 308 ext_it->first,
251 ++it) { 309 extension_prefs_scope::kIncognitoPersistent),
252 if (it->content_type == type && it->resource_identifier == identifier) { 310 rules);
253 rules->push_back(content_settings::ProviderInterface::Rule( 311 AddRules(type, identifier,
254 it->embedded_pattern, it->top_level_pattern, it->setting)); 312 GetContentSettingSpecList(
255 } 313 ext_it->first,
314 extension_prefs_scope::kIncognitoSessionOnly),
315 rules);
316 } else {
317 AddRules(type, identifier,
318 GetContentSettingSpecList(
319 ext_it->first,
320 extension_prefs_scope::kRegular),
321 rules);
256 } 322 }
257 } 323 }
258 } 324 }
259 325
260 ListValue* ExtensionContentSettingsStore::GetSettingsForExtension( 326 ListValue* ExtensionContentSettingsStore::GetSettingsForExtension(
261 const std::string& extension_id) const { 327 const std::string& extension_id,
328 extension_prefs_scope::Scope scope) const {
262 base::AutoLock lock(lock_); 329 base::AutoLock lock(lock_);
263 ListValue* settings = new ListValue(); 330 ListValue* settings = new ListValue();
264 const ContentSettingSpecList* setting_spec_list = 331 const ContentSettingSpecList* setting_spec_list =
265 GetContentSettingSpecList(extension_id, false); 332 GetContentSettingSpecList(extension_id, scope);
266 ContentSettingSpecList::const_iterator it; 333 ContentSettingSpecList::const_iterator it;
267 for (it = setting_spec_list->begin(); it != setting_spec_list->end(); ++it) { 334 for (it = setting_spec_list->begin(); it != setting_spec_list->end(); ++it) {
268 DictionaryValue* setting_dict = new DictionaryValue(); 335 DictionaryValue* setting_dict = new DictionaryValue();
269 setting_dict->SetString(keys::kEmbeddedPatternKey, 336 setting_dict->SetString(keys::kEmbeddedPatternKey,
270 it->embedded_pattern.ToString()); 337 it->embedded_pattern.ToString());
271 setting_dict->SetString(keys::kTopLevelPatternKey, 338 setting_dict->SetString(keys::kTopLevelPatternKey,
272 it->top_level_pattern.ToString()); 339 it->top_level_pattern.ToString());
273 setting_dict->SetString( 340 setting_dict->SetString(
274 keys::kContentSettingsTypeKey, 341 keys::kContentSettingsTypeKey,
275 helpers::ContentSettingsTypeToString(it->content_type)); 342 helpers::ContentSettingsTypeToString(it->content_type));
276 setting_dict->SetString(keys::kResourceIdentifierKey, 343 setting_dict->SetString(keys::kResourceIdentifierKey,
277 it->resource_identifier); 344 it->resource_identifier);
278 setting_dict->SetString(keys::kContentSettingKey, 345 setting_dict->SetString(keys::kContentSettingKey,
279 helpers::ContentSettingToString(it->setting)); 346 helpers::ContentSettingToString(it->setting));
280 settings->Append(setting_dict); 347 settings->Append(setting_dict);
281 } 348 }
282 return settings; 349 return settings;
283 } 350 }
284 351
285 void ExtensionContentSettingsStore::SetExtensionContentSettingsFromList( 352 void ExtensionContentSettingsStore::SetExtensionContentSettingsFromList(
286 const std::string& extension_id, 353 const std::string& extension_id,
287 const ListValue* list) { 354 const ListValue* list,
355 extension_prefs_scope::Scope scope) {
288 for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) { 356 for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) {
289 if ((*it)->GetType() != Value::TYPE_DICTIONARY) { 357 if ((*it)->GetType() != Value::TYPE_DICTIONARY) {
290 NOTREACHED(); 358 NOTREACHED();
291 continue; 359 continue;
292 } 360 }
293 DictionaryValue* dict = static_cast<DictionaryValue*>(*it); 361 DictionaryValue* dict = static_cast<DictionaryValue*>(*it);
294 std::string pattern_str; 362 std::string pattern_str;
295 dict->GetString(keys::kTopLevelPatternKey, &pattern_str); 363 dict->GetString(keys::kTopLevelPatternKey, &pattern_str);
296 ContentSettingsPattern pattern = 364 ContentSettingsPattern pattern =
297 ContentSettingsPattern::FromString(pattern_str); 365 ContentSettingsPattern::FromString(pattern_str);
(...skipping 20 matching lines...) Expand all
318 bool result = 386 bool result =
319 helpers::StringToContentSetting(content_setting_string, &setting); 387 helpers::StringToContentSetting(content_setting_string, &setting);
320 DCHECK(result); 388 DCHECK(result);
321 389
322 SetExtensionContentSetting(extension_id, 390 SetExtensionContentSetting(extension_id,
323 pattern, 391 pattern,
324 embedded_pattern, 392 embedded_pattern,
325 content_settings_type, 393 content_settings_type,
326 resource_identifier, 394 resource_identifier,
327 setting, 395 setting,
328 false); 396 scope);
329 } 397 }
330 } 398 }
331 399
332 void ExtensionContentSettingsStore::AddObserver(Observer* observer) { 400 void ExtensionContentSettingsStore::AddObserver(Observer* observer) {
333 DCHECK(OnCorrectThread()); 401 DCHECK(OnCorrectThread());
334 observers_.AddObserver(observer); 402 observers_.AddObserver(observer);
335 } 403 }
336 404
337 void ExtensionContentSettingsStore::RemoveObserver(Observer* observer) { 405 void ExtensionContentSettingsStore::RemoveObserver(Observer* observer) {
338 DCHECK(OnCorrectThread()); 406 DCHECK(OnCorrectThread());
(...skipping 25 matching lines...) Expand all
364 ExtensionContentSettingsStore::Observer, 432 ExtensionContentSettingsStore::Observer,
365 observers_, 433 observers_,
366 OnContentSettingChanged(extension_id, incognito)); 434 OnContentSettingChanged(extension_id, incognito));
367 } 435 }
368 436
369 bool ExtensionContentSettingsStore::OnCorrectThread() { 437 bool ExtensionContentSettingsStore::OnCorrectThread() {
370 // If there is no UI thread, we're most likely in a unit test. 438 // If there is no UI thread, we're most likely in a unit test.
371 return !BrowserThread::IsWellKnownThread(BrowserThread::UI) || 439 return !BrowserThread::IsWellKnownThread(BrowserThread::UI) ||
372 BrowserThread::CurrentlyOn(BrowserThread::UI); 440 BrowserThread::CurrentlyOn(BrowserThread::UI);
373 } 441 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698