OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/content_settings/host_content_settings_map.h" | 5 #include "chrome/browser/content_settings/host_content_settings_map.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "chrome/browser/browser_thread.h" | 10 #include "chrome/browser/browser_thread.h" |
11 #include "chrome/browser/content_settings/content_settings_details.h" | 11 #include "chrome/browser/content_settings/content_settings_details.h" |
12 #include "chrome/browser/content_settings/policy_content_settings_provider.h" | |
13 #include "chrome/browser/content_settings/pref_content_settings_provider.h" | |
12 #include "chrome/browser/metrics/user_metrics.h" | 14 #include "chrome/browser/metrics/user_metrics.h" |
13 #include "chrome/browser/prefs/pref_service.h" | 15 #include "chrome/browser/prefs/pref_service.h" |
14 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
15 #include "chrome/browser/prefs/scoped_pref_update.h" | 17 #include "chrome/browser/prefs/scoped_pref_update.h" |
16 #include "chrome/common/notification_service.h" | 18 #include "chrome/common/notification_service.h" |
17 #include "chrome/common/notification_source.h" | 19 #include "chrome/common/notification_source.h" |
18 #include "chrome/common/notification_type.h" | 20 #include "chrome/common/notification_type.h" |
19 #include "chrome/common/chrome_switches.h" | 21 #include "chrome/common/chrome_switches.h" |
20 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
21 #include "chrome/common/url_constants.h" | 23 #include "chrome/common/url_constants.h" |
22 #include "googleurl/src/gurl.h" | 24 #include "googleurl/src/gurl.h" |
23 #include "googleurl/src/url_canon.h" | |
24 #include "googleurl/src/url_parse.h" | |
25 #include "net/base/dns_util.h" | |
26 #include "net/base/net_util.h" | 25 #include "net/base/net_util.h" |
27 #include "net/base/static_cookie_policy.h" | 26 #include "net/base/static_cookie_policy.h" |
28 | 27 |
29 namespace { | 28 namespace { |
30 | 29 |
31 // Base pref path of the prefs that contain the managed default content | |
32 // settings values. | |
33 const std::string kManagedSettings = | |
34 "profile.managed_default_content_settings"; | |
35 | |
36 // The preference keys where resource identifiers are stored for | 30 // The preference keys where resource identifiers are stored for |
37 // ContentSettingsType values that support resource identifiers. | 31 // ContentSettingsType values that support resource identifiers. |
38 const char* kResourceTypeNames[CONTENT_SETTINGS_NUM_TYPES] = { | 32 const char* kResourceTypeNames[CONTENT_SETTINGS_NUM_TYPES] = { |
39 NULL, | 33 NULL, |
40 NULL, | 34 NULL, |
41 NULL, | 35 NULL, |
42 "per_plugin", | 36 "per_plugin", |
43 NULL, | 37 NULL, |
44 NULL, // Not used for Geolocation | 38 NULL, // Not used for Geolocation |
45 NULL, // Not used for Notifications | 39 NULL, // Not used for Notifications |
46 }; | 40 }; |
47 | 41 |
48 // The names of the ContentSettingsType values, for use with dictionary prefs. | 42 // The names of the ContentSettingsType values, for use with dictionary prefs. |
49 const char* kTypeNames[CONTENT_SETTINGS_NUM_TYPES] = { | 43 const char* kTypeNames[CONTENT_SETTINGS_NUM_TYPES] = { |
50 "cookies", | 44 "cookies", |
51 "images", | 45 "images", |
52 "javascript", | 46 "javascript", |
53 "plugins", | 47 "plugins", |
54 "popups", | 48 "popups", |
55 NULL, // Not used for Geolocation | 49 NULL, // Not used for Geolocation |
56 NULL, // Not used for Notifications | 50 NULL, // Not used for Notifications |
57 }; | 51 }; |
58 | 52 |
59 // The preferences used to manage ContentSettingsTypes. | |
60 const char* kPrefToManageType[CONTENT_SETTINGS_NUM_TYPES] = { | |
61 prefs::kManagedDefaultCookiesSetting, | |
62 prefs::kManagedDefaultImagesSetting, | |
63 prefs::kManagedDefaultJavaScriptSetting, | |
64 prefs::kManagedDefaultPluginsSetting, | |
65 prefs::kManagedDefaultPopupsSetting, | |
66 NULL, // Not used for Geolocation | |
67 NULL, // Not used for Notifications | |
68 }; | |
69 | |
70 // The default setting for each content type. | |
71 const ContentSetting kDefaultSettings[CONTENT_SETTINGS_NUM_TYPES] = { | |
72 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_COOKIES | |
73 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_IMAGES | |
74 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_JAVASCRIPT | |
75 CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_PLUGINS | |
76 CONTENT_SETTING_BLOCK, // CONTENT_SETTINGS_TYPE_POPUPS | |
77 CONTENT_SETTING_ASK, // Not used for Geolocation | |
78 CONTENT_SETTING_ASK, // Not used for Notifications | |
79 }; | |
80 | |
81 // True if a given content settings type requires additional resource | 53 // True if a given content settings type requires additional resource |
82 // identifiers. | 54 // identifiers. |
83 const bool kRequiresResourceIdentifier[CONTENT_SETTINGS_NUM_TYPES] = { | 55 const bool kRequiresResourceIdentifier[CONTENT_SETTINGS_NUM_TYPES] = { |
84 false, // CONTENT_SETTINGS_TYPE_COOKIES | 56 false, // CONTENT_SETTINGS_TYPE_COOKIES |
85 false, // CONTENT_SETTINGS_TYPE_IMAGES | 57 false, // CONTENT_SETTINGS_TYPE_IMAGES |
86 false, // CONTENT_SETTINGS_TYPE_JAVASCRIPT | 58 false, // CONTENT_SETTINGS_TYPE_JAVASCRIPT |
87 true, // CONTENT_SETTINGS_TYPE_PLUGINS | 59 true, // CONTENT_SETTINGS_TYPE_PLUGINS |
88 false, // CONTENT_SETTINGS_TYPE_POPUPS | 60 false, // CONTENT_SETTINGS_TYPE_POPUPS |
89 false, // Not used for Geolocation | 61 false, // Not used for Geolocation |
90 false, // Not used for Notifications | 62 false, // Not used for Notifications |
(...skipping 27 matching lines...) Expand all Loading... | |
118 } // namespace | 90 } // namespace |
119 | 91 |
120 | 92 |
121 struct HostContentSettingsMap::ExtendedContentSettings { | 93 struct HostContentSettingsMap::ExtendedContentSettings { |
122 ContentSettings content_settings; | 94 ContentSettings content_settings; |
123 ResourceContentSettings content_settings_for_resources; | 95 ResourceContentSettings content_settings_for_resources; |
124 }; | 96 }; |
125 | 97 |
126 HostContentSettingsMap::HostContentSettingsMap(Profile* profile) | 98 HostContentSettingsMap::HostContentSettingsMap(Profile* profile) |
127 : profile_(profile), | 99 : profile_(profile), |
100 content_settings_providers_deleter_(&content_settings_providers_), | |
128 block_third_party_cookies_(false), | 101 block_third_party_cookies_(false), |
129 is_block_third_party_cookies_managed_(false), | 102 is_block_third_party_cookies_managed_(false), |
130 is_off_the_record_(profile_->IsOffTheRecord()), | 103 is_off_the_record_(profile_->IsOffTheRecord()), |
131 updating_preferences_(false) { | 104 updating_preferences_(false) { |
105 // The order in which the content settings providers are created is critical, | |
106 // as providers that are further down in the list (i.e. added later) override | |
107 // providers further up. | |
108 content_settings_providers_.push_back( | |
109 new PrefContentSettingsProvider(profile)); | |
110 content_settings_providers_.push_back( | |
111 new PolicyContentSettingsProvider(profile)); | |
112 | |
132 PrefService* prefs = profile_->GetPrefs(); | 113 PrefService* prefs = profile_->GetPrefs(); |
133 | 114 |
134 MigrateObsoleteCookiePref(prefs); | 115 MigrateObsoleteCookiePref(prefs); |
135 | 116 |
136 MigrateObsoletePopupsPref(prefs); | 117 MigrateObsoletePopupsPref(prefs); |
137 | 118 |
138 MigrateObsoletePerhostPref(prefs); | 119 MigrateObsoletePerhostPref(prefs); |
139 | 120 |
140 // Read global defaults. | |
141 DCHECK_EQ(arraysize(kTypeNames), | |
142 static_cast<size_t>(CONTENT_SETTINGS_NUM_TYPES)); | |
143 ReadDefaultSettings(false); | |
144 | |
145 // Read misc. global settings. | 121 // Read misc. global settings. |
146 block_third_party_cookies_ = | 122 block_third_party_cookies_ = |
147 prefs->GetBoolean(prefs::kBlockThirdPartyCookies); | 123 prefs->GetBoolean(prefs::kBlockThirdPartyCookies); |
148 is_block_third_party_cookies_managed_ = | 124 is_block_third_party_cookies_managed_ = |
149 prefs->IsManagedPreference(prefs::kBlockThirdPartyCookies); | 125 prefs->IsManagedPreference(prefs::kBlockThirdPartyCookies); |
150 block_nonsandboxed_plugins_ = | 126 block_nonsandboxed_plugins_ = |
151 prefs->GetBoolean(prefs::kBlockNonsandboxedPlugins); | 127 prefs->GetBoolean(prefs::kBlockNonsandboxedPlugins); |
152 | 128 |
153 // Verify preferences version. | 129 // Verify preferences version. |
154 if (!prefs->HasPrefPath(prefs::kContentSettingsVersion)) { | 130 if (!prefs->HasPrefPath(prefs::kContentSettingsVersion)) { |
155 prefs->SetInteger(prefs::kContentSettingsVersion, | 131 prefs->SetInteger(prefs::kContentSettingsVersion, |
156 ContentSettingsPattern::kContentSettingsPatternVersion); | 132 ContentSettingsPattern::kContentSettingsPatternVersion); |
157 } | 133 } |
158 if (prefs->GetInteger(prefs::kContentSettingsVersion) > | 134 if (prefs->GetInteger(prefs::kContentSettingsVersion) > |
159 ContentSettingsPattern::kContentSettingsPatternVersion) { | 135 ContentSettingsPattern::kContentSettingsPatternVersion) { |
160 LOG(ERROR) << "Unknown content settings version in preferences."; | 136 LOG(ERROR) << "Unknown content settings version in preferences."; |
161 return; | 137 return; |
162 } | 138 } |
163 | 139 |
164 // Read exceptions. | 140 // Read exceptions. |
165 ReadExceptions(false); | 141 ReadExceptions(false); |
166 | 142 |
167 pref_change_registrar_.Init(prefs); | 143 pref_change_registrar_.Init(prefs); |
168 pref_change_registrar_.Add(prefs::kDefaultContentSettings, this); | |
169 pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this); | 144 pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this); |
170 pref_change_registrar_.Add(prefs::kBlockThirdPartyCookies, this); | 145 pref_change_registrar_.Add(prefs::kBlockThirdPartyCookies, this); |
171 pref_change_registrar_.Add(prefs::kBlockNonsandboxedPlugins, this); | 146 pref_change_registrar_.Add(prefs::kBlockNonsandboxedPlugins, this); |
172 // The following preferences are only used to indicate if a | |
173 // default-content-setting is managed and to hold the managed default-setting | |
174 // value. If the value for any of the following perferences is set then the | |
175 // corresponding default-content-setting is managed. These preferences exist | |
176 // in parallel to the preference default-content-settings. If a | |
177 // default-content-settings-type is managed any user defined excpetions | |
178 // (patterns) for this type are ignored. | |
179 pref_change_registrar_.Add(prefs::kManagedDefaultCookiesSetting, this); | |
180 pref_change_registrar_.Add(prefs::kManagedDefaultImagesSetting, this); | |
181 pref_change_registrar_.Add(prefs::kManagedDefaultJavaScriptSetting, this); | |
182 pref_change_registrar_.Add(prefs::kManagedDefaultPluginsSetting, this); | |
183 pref_change_registrar_.Add(prefs::kManagedDefaultPopupsSetting, this); | |
184 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED, | 147 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED, |
185 Source<Profile>(profile_)); | 148 Source<Profile>(profile_)); |
186 } | 149 } |
187 | 150 |
188 // static | 151 // static |
189 void HostContentSettingsMap::RegisterUserPrefs(PrefService* prefs) { | 152 void HostContentSettingsMap::RegisterUserPrefs(PrefService* prefs) { |
190 prefs->RegisterDictionaryPref(prefs::kDefaultContentSettings); | |
191 prefs->RegisterIntegerPref(prefs::kContentSettingsVersion, | 153 prefs->RegisterIntegerPref(prefs::kContentSettingsVersion, |
192 ContentSettingsPattern::kContentSettingsPatternVersion); | 154 ContentSettingsPattern::kContentSettingsPatternVersion); |
193 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatterns); | 155 prefs->RegisterDictionaryPref(prefs::kContentSettingsPatterns); |
194 prefs->RegisterBooleanPref(prefs::kBlockThirdPartyCookies, false); | 156 prefs->RegisterBooleanPref(prefs::kBlockThirdPartyCookies, false); |
195 prefs->RegisterBooleanPref(prefs::kBlockNonsandboxedPlugins, false); | 157 prefs->RegisterBooleanPref(prefs::kBlockNonsandboxedPlugins, false); |
196 prefs->RegisterIntegerPref(prefs::kContentSettingsWindowLastTabIndex, 0); | 158 prefs->RegisterIntegerPref(prefs::kContentSettingsWindowLastTabIndex, 0); |
197 | 159 |
198 // Preferences for default content setting policies. A policy is not set of | |
199 // the corresponding preferences below is set to CONTENT_SETTING_DEFAULT. | |
200 prefs->RegisterIntegerPref(prefs::kManagedDefaultCookiesSetting, | |
201 CONTENT_SETTING_DEFAULT); | |
202 prefs->RegisterIntegerPref(prefs::kManagedDefaultImagesSetting, | |
203 CONTENT_SETTING_DEFAULT); | |
204 prefs->RegisterIntegerPref(prefs::kManagedDefaultJavaScriptSetting, | |
205 CONTENT_SETTING_DEFAULT); | |
206 prefs->RegisterIntegerPref(prefs::kManagedDefaultPluginsSetting, | |
207 CONTENT_SETTING_DEFAULT); | |
208 prefs->RegisterIntegerPref(prefs::kManagedDefaultPopupsSetting, | |
209 CONTENT_SETTING_DEFAULT); | |
210 | |
211 // Obsolete prefs, for migration: | 160 // Obsolete prefs, for migration: |
212 prefs->RegisterIntegerPref(prefs::kCookieBehavior, | 161 prefs->RegisterIntegerPref(prefs::kCookieBehavior, |
213 net::StaticCookiePolicy::ALLOW_ALL_COOKIES); | 162 net::StaticCookiePolicy::ALLOW_ALL_COOKIES); |
214 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts); | 163 prefs->RegisterListPref(prefs::kPopupWhitelistedHosts); |
215 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings); | 164 prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings); |
216 } | 165 } |
217 | 166 |
218 ContentSetting HostContentSettingsMap::GetDefaultContentSetting( | 167 ContentSetting HostContentSettingsMap::GetDefaultContentSetting( |
219 ContentSettingsType content_type) const { | 168 ContentSettingsType content_type) const { |
220 AutoLock auto_lock(lock_); | 169 AutoLock auto_lock(lock_); |
221 if (IsDefaultContentSettingManaged(content_type)) | 170 typedef std::vector<ContentSettingsProviderInterface*>::const_iterator |
222 return managed_default_content_settings_.settings[content_type]; | 171 provider_iterator; |
223 return default_content_settings_.settings[content_type]; | 172 ContentSetting setting = CONTENT_SETTING_DEFAULT; |
173 for (provider_iterator provider = content_settings_providers_.begin(); | |
174 provider != content_settings_providers_.end(); ++provider) { | |
175 if (!(*provider)->CanProvideDefaultSetting(content_type)) | |
176 continue; | |
177 ContentSetting provided_setting = | |
178 (*provider)->ProvideDefaultSetting(content_type); | |
179 if (provided_setting != CONTENT_SETTING_DEFAULT) | |
180 setting = provided_setting; | |
181 } | |
182 CHECK_NE(CONTENT_SETTING_DEFAULT, setting); | |
183 return setting; | |
224 } | 184 } |
225 | 185 |
226 ContentSetting HostContentSettingsMap::GetContentSetting( | 186 ContentSetting HostContentSettingsMap::GetContentSetting( |
227 const GURL& url, | 187 const GURL& url, |
228 ContentSettingsType content_type, | 188 ContentSettingsType content_type, |
229 const std::string& resource_identifier) const { | 189 const std::string& resource_identifier) const { |
230 ContentSetting setting = GetNonDefaultContentSetting(url, | 190 ContentSetting setting = GetNonDefaultContentSetting(url, |
231 content_type, | 191 content_type, |
232 resource_identifier); | 192 resource_identifier); |
233 if (setting == CONTENT_SETTING_DEFAULT || | 193 if (setting == CONTENT_SETTING_DEFAULT || |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
311 next_dot - ContentSettingsPattern::kDomainWildcardLength + 1); | 271 next_dot - ContentSettingsPattern::kDomainWildcardLength + 1); |
312 } | 272 } |
313 | 273 |
314 return CONTENT_SETTING_DEFAULT; | 274 return CONTENT_SETTING_DEFAULT; |
315 } | 275 } |
316 | 276 |
317 ContentSettings HostContentSettingsMap::GetContentSettings( | 277 ContentSettings HostContentSettingsMap::GetContentSettings( |
318 const GURL& url) const { | 278 const GURL& url) const { |
319 ContentSettings output = GetNonDefaultContentSettings(url); | 279 ContentSettings output = GetNonDefaultContentSettings(url); |
320 | 280 |
321 AutoLock auto_lock(lock_); | |
322 | |
323 // If we require a resource identifier, set the content settings to default, | 281 // If we require a resource identifier, set the content settings to default, |
324 // otherwise make the defaults explicit. | 282 // otherwise make the defaults explicit. |
325 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) { | 283 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) { |
326 if (RequiresResourceIdentifier(ContentSettingsType(j))) { | 284 if (RequiresResourceIdentifier(ContentSettingsType(j))) { |
327 output.settings[j] = CONTENT_SETTING_DEFAULT; | 285 output.settings[j] = CONTENT_SETTING_DEFAULT; |
328 } else { | 286 } else { |
329 if (output.settings[j] == CONTENT_SETTING_DEFAULT) { | 287 if (output.settings[j] == CONTENT_SETTING_DEFAULT) { |
330 output.settings[j] = default_content_settings_.settings[j]; | 288 output.settings[j] = GetDefaultContentSetting(ContentSettingsType(j)); |
331 } | 289 } |
332 // A managed default content setting has the highest priority and hence | 290 // A managed default content setting has the highest priority and hence |
333 // will overwrite any previously set value. | 291 // will overwrite any previously set value. |
334 if (IsDefaultContentSettingManaged(ContentSettingsType(j))) { | 292 if (IsDefaultContentSettingManaged(ContentSettingsType(j))) { |
293 AutoLock auto_lock(lock_); | |
335 output.settings[j] = | 294 output.settings[j] = |
336 managed_default_content_settings_.settings[j]; | 295 managed_default_content_settings_.settings[j]; |
337 } | 296 } |
338 } | 297 } |
339 } | 298 } |
340 return output; | 299 return output; |
341 } | 300 } |
342 | 301 |
343 ContentSettings HostContentSettingsMap::GetNonDefaultContentSettings( | 302 ContentSettings HostContentSettingsMap::GetNonDefaultContentSettings( |
344 const GURL& url) const { | 303 const GURL& url) const { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
434 | 393 |
435 void HostContentSettingsMap::SetDefaultContentSetting( | 394 void HostContentSettingsMap::SetDefaultContentSetting( |
436 ContentSettingsType content_type, | 395 ContentSettingsType content_type, |
437 ContentSetting setting) { | 396 ContentSetting setting) { |
438 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. | 397 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. |
439 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 398 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
440 DCHECK(content_type != CONTENT_SETTINGS_TYPE_PLUGINS || | 399 DCHECK(content_type != CONTENT_SETTINGS_TYPE_PLUGINS || |
441 setting != CONTENT_SETTING_ASK || | 400 setting != CONTENT_SETTING_ASK || |
442 CommandLine::ForCurrentProcess()->HasSwitch( | 401 CommandLine::ForCurrentProcess()->HasSwitch( |
443 switches::kEnableClickToPlay)); | 402 switches::kEnableClickToPlay)); |
444 PrefService* prefs = profile_->GetPrefs(); | |
445 | 403 |
446 // The default settings may not be directly modified for OTR sessions. | 404 // The default settings may not be directly modified for OTR sessions. |
447 // Instead, they are synced to the main profile's setting. | 405 // Instead, they are synced to the main profile's setting. |
448 if (is_off_the_record_) { | 406 if (is_off_the_record_) { |
449 NOTREACHED(); | 407 NOTREACHED(); |
450 return; | 408 return; |
451 } | 409 } |
452 | 410 |
453 DictionaryValue* default_settings_dictionary = | |
454 prefs->GetMutableDictionary(prefs::kDefaultContentSettings); | |
455 std::string dictionary_path(kTypeNames[content_type]); | |
456 updating_preferences_ = true; | |
457 { | 411 { |
gfeher
2010/12/08 13:59:17
Why is this in a separate block?
jochen (gone - plz use gerrit)
2010/12/08 14:54:01
Done.
| |
458 AutoLock auto_lock(lock_); | 412 typedef std::vector<ContentSettingsProviderInterface*>::iterator |
459 ScopedPrefUpdate update(prefs, prefs::kDefaultContentSettings); | 413 provider_iterator; |
460 if ((setting == CONTENT_SETTING_DEFAULT) || | 414 for (provider_iterator provider = content_settings_providers_.begin(); |
461 (setting == kDefaultSettings[content_type])) { | 415 provider != content_settings_providers_.end(); ++provider) { |
462 default_content_settings_.settings[content_type] = | 416 if (!(*provider)->CanProvideDefaultSetting(content_type)) |
463 kDefaultSettings[content_type]; | 417 continue; |
464 default_settings_dictionary->RemoveWithoutPathExpansion(dictionary_path, | 418 (*provider)->UpdateDefaultSetting(content_type, setting); |
gfeher
2010/12/08 13:59:17
Adding CanUpdateDefaultSetting to the interface an
jochen (gone - plz use gerrit)
2010/12/08 14:54:01
I think it's better to broadcast the update to all
gfeher
2010/12/09 10:29:53
Ok.
| |
465 NULL); | |
466 } else { | |
467 default_content_settings_.settings[content_type] = setting; | |
468 default_settings_dictionary->SetWithoutPathExpansion( | |
469 dictionary_path, Value::CreateIntegerValue(setting)); | |
470 } | 419 } |
471 } | 420 } |
472 updating_preferences_ = false; | |
473 | |
474 NotifyObservers( | |
475 ContentSettingsDetails(ContentSettingsPattern(), content_type, "")); | |
476 } | 421 } |
477 | 422 |
478 void HostContentSettingsMap::SetContentSetting( | 423 void HostContentSettingsMap::SetContentSetting( |
479 const ContentSettingsPattern& original_pattern, | 424 const ContentSettingsPattern& original_pattern, |
480 ContentSettingsType content_type, | 425 ContentSettingsType content_type, |
481 const std::string& resource_identifier, | 426 const std::string& resource_identifier, |
482 ContentSetting setting) { | 427 ContentSetting setting) { |
483 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. | 428 DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. |
484 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 429 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
485 DCHECK_NE(RequiresResourceIdentifier(content_type), | 430 DCHECK_NE(RequiresResourceIdentifier(content_type), |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
720 UserMetricsAction("BlockNonsandboxedPlugins_Disable")); | 665 UserMetricsAction("BlockNonsandboxedPlugins_Disable")); |
721 prefs->ClearPref(prefs::kBlockNonsandboxedPlugins); | 666 prefs->ClearPref(prefs::kBlockNonsandboxedPlugins); |
722 } | 667 } |
723 } | 668 } |
724 | 669 |
725 void HostContentSettingsMap::ResetToDefaults() { | 670 void HostContentSettingsMap::ResetToDefaults() { |
726 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 671 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
727 | 672 |
728 { | 673 { |
729 AutoLock auto_lock(lock_); | 674 AutoLock auto_lock(lock_); |
730 default_content_settings_ = ContentSettings(); | 675 typedef std::vector<ContentSettingsProviderInterface*>::iterator |
731 ForceDefaultsToBeExplicit(); | 676 provider_iterator; |
677 for (provider_iterator provider = content_settings_providers_.begin(); | |
678 provider != content_settings_providers_.end(); ++provider) { | |
679 (*provider)->ResetToDefaults(); | |
680 } | |
732 // Clear all content settings map except the | 681 // Clear all content settings map except the |
733 // managed_default_content_settings. | 682 // managed_default_content_settings. |
734 host_content_settings_.clear(); | 683 host_content_settings_.clear(); |
735 off_the_record_settings_.clear(); | 684 off_the_record_settings_.clear(); |
736 // Don't reset block third party cookies if they are managed. | 685 // Don't reset block third party cookies if they are managed. |
737 if (!IsBlockThirdPartyCookiesManaged()) | 686 if (!IsBlockThirdPartyCookiesManaged()) |
738 block_third_party_cookies_ = false; | 687 block_third_party_cookies_ = false; |
739 block_nonsandboxed_plugins_ = false; | 688 block_nonsandboxed_plugins_ = false; |
740 } | 689 } |
741 | 690 |
742 if (!is_off_the_record_) { | 691 if (!is_off_the_record_) { |
743 PrefService* prefs = profile_->GetPrefs(); | 692 PrefService* prefs = profile_->GetPrefs(); |
744 updating_preferences_ = true; | 693 updating_preferences_ = true; |
745 prefs->ClearPref(prefs::kDefaultContentSettings); | |
746 prefs->ClearPref(prefs::kContentSettingsPatterns); | 694 prefs->ClearPref(prefs::kContentSettingsPatterns); |
747 // If the block third party cookies preference is managed we still must | 695 // If the block third party cookies preference is managed we still must |
748 // clear it in order to restore the default value for later when the | 696 // clear it in order to restore the default value for later when the |
749 // preference is not managed anymore. | 697 // preference is not managed anymore. |
750 prefs->ClearPref(prefs::kBlockThirdPartyCookies); | 698 prefs->ClearPref(prefs::kBlockThirdPartyCookies); |
751 prefs->ClearPref(prefs::kBlockNonsandboxedPlugins); | 699 prefs->ClearPref(prefs::kBlockNonsandboxedPlugins); |
752 updating_preferences_ = false; | 700 updating_preferences_ = false; |
753 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(), | 701 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(), |
754 CONTENT_SETTINGS_TYPE_DEFAULT, | 702 CONTENT_SETTINGS_TYPE_DEFAULT, |
755 "")); | 703 "")); |
756 } | 704 } |
757 } | 705 } |
758 | 706 |
759 void HostContentSettingsMap::Observe(NotificationType type, | 707 void HostContentSettingsMap::Observe(NotificationType type, |
760 const NotificationSource& source, | 708 const NotificationSource& source, |
761 const NotificationDetails& details) { | 709 const NotificationDetails& details) { |
762 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 710 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
763 | 711 |
764 if (NotificationType::PREF_CHANGED == type) { | 712 if (NotificationType::PREF_CHANGED == type) { |
765 if (updating_preferences_) | 713 if (updating_preferences_) |
766 return; | 714 return; |
767 | 715 |
768 std::string* name = Details<std::string>(details).ptr(); | 716 std::string* name = Details<std::string>(details).ptr(); |
769 if (prefs::kDefaultContentSettings == *name) { | 717 if (prefs::kContentSettingsPatterns == *name) { |
770 ReadDefaultSettings(true); | |
771 } else if (prefs::kContentSettingsPatterns == *name) { | |
772 ReadExceptions(true); | 718 ReadExceptions(true); |
773 } else if (prefs::kBlockThirdPartyCookies == *name) { | 719 } else if (prefs::kBlockThirdPartyCookies == *name) { |
774 AutoLock auto_lock(lock_); | 720 AutoLock auto_lock(lock_); |
775 block_third_party_cookies_ = profile_->GetPrefs()->GetBoolean( | 721 block_third_party_cookies_ = profile_->GetPrefs()->GetBoolean( |
776 prefs::kBlockThirdPartyCookies); | 722 prefs::kBlockThirdPartyCookies); |
777 is_block_third_party_cookies_managed_ = | 723 is_block_third_party_cookies_managed_ = |
778 profile_->GetPrefs()->IsManagedPreference( | 724 profile_->GetPrefs()->IsManagedPreference( |
779 prefs::kBlockThirdPartyCookies); | 725 prefs::kBlockThirdPartyCookies); |
780 } else if (prefs::kBlockNonsandboxedPlugins == *name) { | 726 } else if (prefs::kBlockNonsandboxedPlugins == *name) { |
781 AutoLock auto_lock(lock_); | 727 AutoLock auto_lock(lock_); |
782 block_nonsandboxed_plugins_ = profile_->GetPrefs()->GetBoolean( | 728 block_nonsandboxed_plugins_ = profile_->GetPrefs()->GetBoolean( |
783 prefs::kBlockNonsandboxedPlugins); | 729 prefs::kBlockNonsandboxedPlugins); |
784 } else if (prefs::kManagedDefaultCookiesSetting == *name) { | |
785 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES, | |
786 profile_->GetPrefs(), | |
787 &managed_default_content_settings_); | |
788 } else if (prefs::kManagedDefaultImagesSetting == *name) { | |
789 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_IMAGES, | |
790 profile_->GetPrefs(), | |
791 &managed_default_content_settings_); | |
792 } else if (prefs::kManagedDefaultJavaScriptSetting == *name) { | |
793 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_JAVASCRIPT, | |
794 profile_->GetPrefs(), | |
795 &managed_default_content_settings_); | |
796 } else if (prefs::kManagedDefaultPluginsSetting == *name) { | |
797 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_PLUGINS, | |
798 profile_->GetPrefs(), | |
799 &managed_default_content_settings_); | |
800 } else if (prefs::kManagedDefaultPopupsSetting == *name) { | |
801 UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_POPUPS, | |
802 profile_->GetPrefs(), | |
803 &managed_default_content_settings_); | |
804 } else { | 730 } else { |
805 NOTREACHED() << "Unexpected preference observed"; | 731 NOTREACHED() << "Unexpected preference observed"; |
806 return; | 732 return; |
807 } | 733 } |
808 | 734 |
809 if (!is_off_the_record_) { | 735 if (!is_off_the_record_) { |
810 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(), | 736 NotifyObservers(ContentSettingsDetails(ContentSettingsPattern(), |
811 CONTENT_SETTINGS_TYPE_DEFAULT, | 737 CONTENT_SETTINGS_TYPE_DEFAULT, |
812 "")); | 738 "")); |
813 } | 739 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
874 ClickToPlayFixup(ContentSettingsType(type), | 800 ClickToPlayFixup(ContentSettingsType(type), |
875 ContentSetting(setting)); | 801 ContentSetting(setting)); |
876 } | 802 } |
877 | 803 |
878 break; | 804 break; |
879 } | 805 } |
880 } | 806 } |
881 } | 807 } |
882 } | 808 } |
883 | 809 |
884 void HostContentSettingsMap::ForceDefaultsToBeExplicit() { | |
885 DCHECK_EQ(arraysize(kDefaultSettings), | |
886 static_cast<size_t>(CONTENT_SETTINGS_NUM_TYPES)); | |
887 | |
888 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { | |
889 if (default_content_settings_.settings[i] == CONTENT_SETTING_DEFAULT) | |
890 default_content_settings_.settings[i] = kDefaultSettings[i]; | |
891 } | |
892 } | |
893 | |
894 bool HostContentSettingsMap::AllDefault( | 810 bool HostContentSettingsMap::AllDefault( |
895 const ExtendedContentSettings& settings) const { | 811 const ExtendedContentSettings& settings) const { |
896 for (size_t i = 0; i < arraysize(settings.content_settings.settings); ++i) { | 812 for (size_t i = 0; i < arraysize(settings.content_settings.settings); ++i) { |
897 if (settings.content_settings.settings[i] != CONTENT_SETTING_DEFAULT) | 813 if (settings.content_settings.settings[i] != CONTENT_SETTING_DEFAULT) |
898 return false; | 814 return false; |
899 } | 815 } |
900 return settings.content_settings_for_resources.empty(); | 816 return settings.content_settings_for_resources.empty(); |
901 } | 817 } |
902 | 818 |
903 void HostContentSettingsMap::ReadDefaultSettings(bool overwrite) { | |
904 PrefService* prefs = profile_->GetPrefs(); | |
905 const DictionaryValue* default_settings_dictionary = | |
906 prefs->GetDictionary(prefs::kDefaultContentSettings); | |
907 | |
908 if (overwrite) | |
909 default_content_settings_ = ContentSettings(); | |
910 | |
911 // Careful: The returned value could be NULL if the pref has never been set. | |
912 if (default_settings_dictionary != NULL) { | |
913 GetSettingsFromDictionary(default_settings_dictionary, | |
914 &default_content_settings_); | |
915 } | |
916 ForceDefaultsToBeExplicit(); | |
917 | |
918 // Read managed default content settings. | |
919 ReadManagedDefaultSettings(prefs, &managed_default_content_settings_); | |
920 } | |
921 | |
922 void HostContentSettingsMap::ReadManagedDefaultSettings( | |
923 const PrefService* prefs, ContentSettings* settings) { | |
924 for (size_t type = 0; type < arraysize(kPrefToManageType); ++type) { | |
925 if (kPrefToManageType[type] == NULL) { | |
926 // TODO(markusheintz): Handle Geolocation and notification separately. | |
927 continue; | |
928 } | |
929 UpdateManagedDefaultSetting(ContentSettingsType(type), prefs, settings); | |
930 } | |
931 } | |
932 | |
933 void HostContentSettingsMap::UpdateManagedDefaultSetting( | |
934 ContentSettingsType type, | |
935 const PrefService* prefs, | |
936 ContentSettings* settings) { | |
937 // If a pref to manage a default-content-setting was not set (NOTICE: | |
938 // "HasPrefPath" returns false if no value was set for a registered pref) then | |
939 // the default value of the preference is used. The default value of a | |
940 // preference to manage a default-content-settings is | |
941 // CONTENT_SETTING_DEFAULT. This indicates that no managed value is set. If a | |
942 // pref was set, than it MUST be managed. | |
943 DCHECK(!prefs->HasPrefPath(kPrefToManageType[type]) || | |
944 prefs->IsManagedPreference(kPrefToManageType[type])); | |
945 AutoLock auto_lock(lock_); | |
946 settings->settings[type] = IntToContentSetting( | |
947 prefs->GetInteger(kPrefToManageType[type])); | |
948 } | |
949 | |
950 bool HostContentSettingsMap::IsDefaultContentSettingManaged( | 819 bool HostContentSettingsMap::IsDefaultContentSettingManaged( |
951 ContentSettingsType content_type) const { | 820 ContentSettingsType content_type) const { |
952 // All managed_default_content_settings_ are always set explicitly or | 821 typedef std::vector<ContentSettingsProviderInterface*>::const_iterator |
953 // initialized to CONTENT_SETTINGS_DEFAULT. Hence each content settings type | 822 provider_iterator; |
954 // that is set to CONTENT_SETTINGS_DEFAULT is not managed since it was not set | 823 for (provider_iterator provider = content_settings_providers_.begin(); |
markusheintz_
2010/12/08 14:03:06
Theoretically It is possible that a content settin
jochen (gone - plz use gerrit)
2010/12/08 14:54:01
That's true. However, in that case, already the st
| |
955 // explicitly. | 824 provider != content_settings_providers_.end(); ++provider) { |
956 return managed_default_content_settings_.settings[content_type] != | 825 if ((*provider)->DefaultSettingIsManaged(content_type)) |
957 CONTENT_SETTING_DEFAULT; | 826 return true; |
827 } | |
828 return false; | |
958 } | 829 } |
959 | 830 |
960 void HostContentSettingsMap::ReadExceptions(bool overwrite) { | 831 void HostContentSettingsMap::ReadExceptions(bool overwrite) { |
961 PrefService* prefs = profile_->GetPrefs(); | 832 PrefService* prefs = profile_->GetPrefs(); |
962 DictionaryValue* all_settings_dictionary = | 833 DictionaryValue* all_settings_dictionary = |
963 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns); | 834 prefs->GetMutableDictionary(prefs::kContentSettingsPatterns); |
964 | 835 |
965 if (overwrite) | 836 if (overwrite) |
966 host_content_settings_.clear(); | 837 host_content_settings_.clear(); |
967 | 838 |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1102 } | 973 } |
1103 | 974 |
1104 for (size_t i = 0; i < move_items.size(); ++i) { | 975 for (size_t i = 0; i < move_items.size(); ++i) { |
1105 Value* pattern_settings_dictionary = NULL; | 976 Value* pattern_settings_dictionary = NULL; |
1106 all_settings_dictionary->RemoveWithoutPathExpansion( | 977 all_settings_dictionary->RemoveWithoutPathExpansion( |
1107 move_items[i].first, &pattern_settings_dictionary); | 978 move_items[i].first, &pattern_settings_dictionary); |
1108 all_settings_dictionary->SetWithoutPathExpansion( | 979 all_settings_dictionary->SetWithoutPathExpansion( |
1109 move_items[i].second, pattern_settings_dictionary); | 980 move_items[i].second, pattern_settings_dictionary); |
1110 } | 981 } |
1111 } | 982 } |
OLD | NEW |