Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/content_settings/host_content_settings_map.h" | 5 #include "chrome/browser/content_settings/host_content_settings_map.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "base/time/clock.h" | 15 #include "base/time/clock.h" |
| 16 #include "chrome/browser/chrome_notification_types.h" | |
| 17 #include "chrome/browser/content_settings/content_settings_custom_extension_prov ider.h" | |
| 18 #include "chrome/browser/content_settings/content_settings_default_provider.h" | 16 #include "chrome/browser/content_settings/content_settings_default_provider.h" |
| 19 #include "chrome/browser/content_settings/content_settings_details.h" | 17 #include "chrome/browser/content_settings/content_settings_details.h" |
| 20 #include "chrome/browser/content_settings/content_settings_internal_extension_pr ovider.h" | |
| 21 #include "chrome/browser/content_settings/content_settings_observable_provider.h " | 18 #include "chrome/browser/content_settings/content_settings_observable_provider.h " |
| 22 #include "chrome/browser/content_settings/content_settings_policy_provider.h" | 19 #include "chrome/browser/content_settings/content_settings_policy_provider.h" |
| 23 #include "chrome/browser/content_settings/content_settings_pref_provider.h" | 20 #include "chrome/browser/content_settings/content_settings_pref_provider.h" |
| 24 #include "chrome/browser/content_settings/content_settings_provider.h" | 21 #include "chrome/browser/content_settings/content_settings_provider.h" |
| 25 #include "chrome/browser/content_settings/content_settings_rule.h" | 22 #include "chrome/browser/content_settings/content_settings_rule.h" |
| 26 #include "chrome/browser/content_settings/content_settings_utils.h" | 23 #include "chrome/browser/content_settings/content_settings_utils.h" |
| 27 #include "chrome/browser/extensions/api/content_settings/content_settings_servic e.h" | |
| 28 #include "chrome/common/chrome_switches.h" | 24 #include "chrome/common/chrome_switches.h" |
| 29 #include "chrome/common/pref_names.h" | 25 #include "chrome/common/pref_names.h" |
| 30 #include "chrome/common/url_constants.h" | 26 #include "chrome/common/url_constants.h" |
| 31 #include "components/content_settings/core/common/content_settings_pattern.h" | 27 #include "components/content_settings/core/common/content_settings_pattern.h" |
| 32 #include "components/pref_registry/pref_registry_syncable.h" | 28 #include "components/pref_registry/pref_registry_syncable.h" |
| 33 #include "content/public/browser/browser_thread.h" | 29 #include "content/public/browser/browser_thread.h" |
| 34 #include "content/public/browser/notification_service.h" | |
| 35 #include "content/public/browser/notification_source.h" | |
| 36 #include "content/public/browser/user_metrics.h" | |
| 37 #include "content/public/common/content_switches.h" | 30 #include "content/public/common/content_switches.h" |
| 38 #include "net/base/net_errors.h" | 31 #include "net/base/net_errors.h" |
| 39 #include "net/base/static_cookie_policy.h" | 32 #include "net/base/static_cookie_policy.h" |
| 40 #include "url/gurl.h" | 33 #include "url/gurl.h" |
| 41 | 34 |
| 42 #if defined(ENABLE_EXTENSIONS) | 35 #if defined(ENABLE_EXTENSIONS) |
| 43 #include "chrome/browser/extensions/extension_service.h" | |
| 44 #include "extensions/browser/extension_prefs.h" | |
| 45 #include "extensions/common/constants.h" | 36 #include "extensions/common/constants.h" |
| 46 #endif | 37 #endif |
| 47 | 38 |
| 48 using base::UserMetricsAction; | |
| 49 using content::BrowserThread; | 39 using content::BrowserThread; |
| 50 | 40 |
| 51 namespace { | 41 namespace { |
| 52 | 42 |
| 53 typedef std::vector<content_settings::Rule> Rules; | |
| 54 | |
| 55 typedef std::pair<std::string, std::string> StringPair; | |
| 56 | |
| 57 // TODO(bauerb): Expose constants. | |
| 58 const char* kProviderNames[] = { | |
| 59 "platform_app", | |
| 60 "policy", | |
| 61 "extension", | |
| 62 "preference", | |
| 63 "default" | |
| 64 }; | |
| 65 | |
| 66 content_settings::SettingSource kProviderSourceMap[] = { | |
| 67 content_settings::SETTING_SOURCE_EXTENSION, | |
| 68 content_settings::SETTING_SOURCE_POLICY, | |
| 69 content_settings::SETTING_SOURCE_EXTENSION, | |
| 70 content_settings::SETTING_SOURCE_USER, | |
| 71 content_settings::SETTING_SOURCE_USER, | |
| 72 }; | |
| 73 COMPILE_ASSERT(arraysize(kProviderSourceMap) == | |
| 74 HostContentSettingsMap::NUM_PROVIDER_TYPES, | |
| 75 kProviderSourceMap_has_incorrect_size); | |
| 76 | |
| 77 // Returns true if the |content_type| supports a resource identifier. | 43 // Returns true if the |content_type| supports a resource identifier. |
| 78 // Resource identifiers are supported (but not required) for plug-ins. | 44 // Resource identifiers are supported (but not required) for plug-ins. |
| 79 bool SupportsResourceIdentifier(ContentSettingsType content_type) { | 45 bool SupportsResourceIdentifier(ContentSettingsType content_type) { |
| 80 return content_type == CONTENT_SETTINGS_TYPE_PLUGINS; | 46 return content_type == CONTENT_SETTINGS_TYPE_PLUGINS; |
| 81 } | 47 } |
| 82 | 48 |
| 83 } // namespace | 49 } // namespace |
| 84 | 50 |
| 85 HostContentSettingsMap::HostContentSettingsMap( | 51 HostContentSettingsMap::HostContentSettingsMap( |
| 86 PrefService* prefs, | 52 PrefService* prefs, |
| 87 bool incognito) : | 53 bool incognito) : |
| 88 #ifndef NDEBUG | 54 #ifndef NDEBUG |
| 89 used_from_thread_id_(base::PlatformThread::CurrentId()), | 55 used_from_thread_id_(base::PlatformThread::CurrentId()), |
| 90 #endif | 56 #endif |
| 91 prefs_(prefs), | 57 prefs_(prefs), |
| 92 is_off_the_record_(incognito) { | 58 is_off_the_record_(incognito) { |
| 93 content_settings::ObservableProvider* policy_provider = | 59 content_settings::ObservableProvider* policy_provider = |
| 94 new content_settings::PolicyProvider(prefs_); | 60 new content_settings::PolicyProvider(prefs_); |
| 95 policy_provider->AddObserver(this); | 61 policy_provider->AddObserver(this); |
| 96 content_settings_providers_[POLICY_PROVIDER] = policy_provider; | 62 content_settings_providers_.push_back(policy_provider); |
| 97 | 63 |
| 98 content_settings::ObservableProvider* pref_provider = | 64 pref_provider_ = |
| 99 new content_settings::PrefProvider(prefs_, is_off_the_record_); | 65 new content_settings::PrefProvider(prefs_, is_off_the_record_); |
| 100 pref_provider->AddObserver(this); | 66 pref_provider_->AddObserver(this); |
| 101 content_settings_providers_[PREF_PROVIDER] = pref_provider; | 67 content_settings_providers_.push_back(pref_provider_); |
| 102 | 68 |
| 103 content_settings::ObservableProvider* default_provider = | 69 default_provider_ = |
| 104 new content_settings::DefaultProvider(prefs_, is_off_the_record_); | 70 new content_settings::DefaultProvider(prefs_, is_off_the_record_); |
| 105 default_provider->AddObserver(this); | 71 default_provider_->AddObserver(this); |
| 106 content_settings_providers_[DEFAULT_PROVIDER] = default_provider; | 72 content_settings_providers_.push_back(default_provider_); |
| 107 | 73 |
| 108 if (!is_off_the_record_) { | 74 if (!is_off_the_record_) { |
| 109 // Migrate obsolete preferences. | 75 // Migrate obsolete preferences. |
| 110 MigrateObsoleteClearOnExitPref(); | 76 MigrateObsoleteClearOnExitPref(); |
| 111 } | 77 } |
| 112 } | 78 } |
| 113 | 79 |
| 114 #if defined(ENABLE_EXTENSIONS) | |
| 115 void HostContentSettingsMap::RegisterExtensionService( | |
| 116 ExtensionService* extension_service) { | |
| 117 DCHECK(extension_service); | |
| 118 DCHECK(!content_settings_providers_[INTERNAL_EXTENSION_PROVIDER]); | |
| 119 DCHECK(!content_settings_providers_[CUSTOM_EXTENSION_PROVIDER]); | |
| 120 | |
| 121 content_settings::InternalExtensionProvider* internal_extension_provider = | |
| 122 new content_settings::InternalExtensionProvider(extension_service); | |
| 123 internal_extension_provider->AddObserver(this); | |
| 124 content_settings_providers_[INTERNAL_EXTENSION_PROVIDER] = | |
| 125 internal_extension_provider; | |
| 126 | |
| 127 content_settings::ObservableProvider* custom_extension_provider = | |
| 128 new content_settings::CustomExtensionProvider( | |
| 129 extensions::ContentSettingsService::Get( | |
| 130 extension_service->GetBrowserContext())->content_settings_store(), | |
| 131 is_off_the_record_); | |
| 132 custom_extension_provider->AddObserver(this); | |
| 133 content_settings_providers_[CUSTOM_EXTENSION_PROVIDER] = | |
| 134 custom_extension_provider; | |
| 135 | |
| 136 #ifndef NDEBUG | |
| 137 DCHECK(used_from_thread_id_ != base::kInvalidThreadId) | |
| 138 << "Used from multiple threads before initialization complete."; | |
| 139 #endif | |
| 140 | |
| 141 OnContentSettingChanged(ContentSettingsPattern(), | |
| 142 ContentSettingsPattern(), | |
| 143 CONTENT_SETTINGS_TYPE_DEFAULT, | |
| 144 std::string()); | |
| 145 } | |
| 146 #endif | |
| 147 | |
| 148 // static | 80 // static |
| 149 void HostContentSettingsMap::RegisterProfilePrefs( | 81 void HostContentSettingsMap::RegisterProfilePrefs( |
| 150 user_prefs::PrefRegistrySyncable* registry) { | 82 user_prefs::PrefRegistrySyncable* registry) { |
| 151 registry->RegisterIntegerPref( | 83 registry->RegisterIntegerPref( |
| 152 prefs::kContentSettingsWindowLastTabIndex, | 84 prefs::kContentSettingsWindowLastTabIndex, |
| 153 0, | 85 0, |
| 154 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 86 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
| 155 registry->RegisterBooleanPref( | 87 registry->RegisterBooleanPref( |
| 156 prefs::kContentSettingsClearOnExitMigrated, | 88 prefs::kContentSettingsClearOnExitMigrated, |
| 157 false, | 89 false, |
| 158 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 90 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
| 159 | 91 |
| 160 // Register the prefs for the content settings providers. | 92 // Register the prefs for the content settings providers. |
| 161 content_settings::DefaultProvider::RegisterProfilePrefs(registry); | 93 content_settings::DefaultProvider::RegisterProfilePrefs(registry); |
| 162 content_settings::PrefProvider::RegisterProfilePrefs(registry); | 94 content_settings::PrefProvider::RegisterProfilePrefs(registry); |
| 163 content_settings::PolicyProvider::RegisterProfilePrefs(registry); | 95 content_settings::PolicyProvider::RegisterProfilePrefs(registry); |
| 164 } | 96 } |
| 165 | 97 |
| 98 void HostContentSettingsMap::RegisterProvider( | |
| 99 scoped_ptr<content_settings::ObservableProvider> provider) { | |
| 100 provider->AddObserver(this); | |
| 101 content_settings_providers_.push_back(provider.release()); | |
| 102 | |
| 103 #ifndef NDEBUG | |
| 104 DCHECK_NE(used_from_thread_id_, base::kInvalidThreadId) | |
| 105 << "Used from multiple threads before initialization complete."; | |
| 106 #endif | |
| 107 | |
| 108 OnContentSettingChanged(ContentSettingsPattern(), | |
| 109 ContentSettingsPattern(), | |
| 110 CONTENT_SETTINGS_TYPE_DEFAULT, | |
| 111 std::string()); | |
| 112 } | |
| 113 | |
| 114 size_t HostContentSettingsMap::GetNumProviders() const { | |
| 115 return content_settings_providers_.size(); | |
| 116 } | |
| 117 | |
| 118 const content_settings::ProviderInterface* | |
| 119 HostContentSettingsMap::GetProviderAt( | |
|
Bernhard Bauer
2014/09/12 09:07:25
The parameter should fit on this line, no?
| |
| 120 size_t i) const { | |
| 121 return content_settings_providers_[i]; | |
| 122 } | |
| 123 | |
| 166 ContentSetting HostContentSettingsMap::GetDefaultContentSettingFromProvider( | 124 ContentSetting HostContentSettingsMap::GetDefaultContentSettingFromProvider( |
| 167 ContentSettingsType content_type, | 125 ContentSettingsType content_type, |
| 168 content_settings::ProviderInterface* provider) const { | 126 content_settings::ProviderInterface* provider) const { |
| 169 scoped_ptr<content_settings::RuleIterator> rule_iterator( | 127 scoped_ptr<content_settings::RuleIterator> rule_iterator( |
| 170 provider->GetRuleIterator(content_type, std::string(), false)); | 128 provider->GetRuleIterator(content_type, std::string(), false)); |
| 171 | 129 |
| 172 ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard(); | 130 ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard(); |
| 173 while (rule_iterator->HasNext()) { | 131 while (rule_iterator->HasNext()) { |
| 174 content_settings::Rule rule = rule_iterator->Next(); | 132 content_settings::Rule rule = rule_iterator->Next(); |
| 175 if (rule.primary_pattern == wildcard && | 133 if (rule.primary_pattern == wildcard && |
| 176 rule.secondary_pattern == wildcard) { | 134 rule.secondary_pattern == wildcard) { |
| 177 return content_settings::ValueToContentSetting(rule.value.get()); | 135 return content_settings::ValueToContentSetting(rule.value.get()); |
| 178 } | 136 } |
| 179 } | 137 } |
| 180 return CONTENT_SETTING_DEFAULT; | 138 return CONTENT_SETTING_DEFAULT; |
| 181 } | 139 } |
| 182 | 140 |
| 183 ContentSetting HostContentSettingsMap::GetDefaultContentSetting( | 141 ContentSetting HostContentSettingsMap::GetDefaultContentSetting( |
| 184 ContentSettingsType content_type, | 142 ContentSettingsType content_type, |
| 185 std::string* provider_id) const { | 143 std::string* provider_id) const { |
| 186 UsedContentSettingsProviders(); | 144 UsedContentSettingsProviders(); |
| 187 | 145 |
| 188 // Iterate through the list of providers and return the first non-NULL value | 146 // Iterate through the list of providers and return the first non-NULL value |
| 189 // that matches |primary_url| and |secondary_url|. | 147 // that matches |primary_url| and |secondary_url|. |
| 190 for (ConstProviderIterator provider = content_settings_providers_.begin(); | 148 for (ConstProviderIterator provider = content_settings_providers_.begin(); |
| 191 provider != content_settings_providers_.end(); | 149 provider != content_settings_providers_.end(); |
| 192 ++provider) { | 150 ++provider) { |
| 193 if (provider->first == PREF_PROVIDER) | 151 if (*provider == pref_provider_) |
| 194 continue; | 152 continue; |
| 195 ContentSetting default_setting = | 153 ContentSetting default_setting = |
| 196 GetDefaultContentSettingFromProvider(content_type, provider->second); | 154 GetDefaultContentSettingFromProvider(content_type, *provider); |
| 197 if (default_setting != CONTENT_SETTING_DEFAULT) { | 155 if (default_setting != CONTENT_SETTING_DEFAULT) { |
| 198 if (provider_id) | 156 if (provider_id) |
| 199 *provider_id = kProviderNames[provider->first]; | 157 *provider_id = (*provider)->GetProviderName(); |
| 200 return default_setting; | 158 return default_setting; |
| 201 } | 159 } |
| 202 } | 160 } |
| 203 | 161 |
| 204 // The method GetDefaultContentSetting always has to return an explicit | 162 // The method GetDefaultContentSetting always has to return an explicit |
| 205 // value that is to be used as default. We here rely on the | 163 // value that is to be used as default. We here rely on the |
| 206 // DefaultProvider to always provide a value. | 164 // DefaultProvider to always provide a value. |
| 207 NOTREACHED(); | 165 NOTREACHED(); |
| 208 return CONTENT_SETTING_DEFAULT; | 166 return CONTENT_SETTING_DEFAULT; |
| 209 } | 167 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 228 DCHECK(settings); | 186 DCHECK(settings); |
| 229 UsedContentSettingsProviders(); | 187 UsedContentSettingsProviders(); |
| 230 | 188 |
| 231 settings->clear(); | 189 settings->clear(); |
| 232 for (ConstProviderIterator provider = content_settings_providers_.begin(); | 190 for (ConstProviderIterator provider = content_settings_providers_.begin(); |
| 233 provider != content_settings_providers_.end(); | 191 provider != content_settings_providers_.end(); |
| 234 ++provider) { | 192 ++provider) { |
| 235 // For each provider, iterate first the incognito-specific rules, then the | 193 // For each provider, iterate first the incognito-specific rules, then the |
| 236 // normal rules. | 194 // normal rules. |
| 237 if (is_off_the_record_) { | 195 if (is_off_the_record_) { |
| 238 AddSettingsForOneType(provider->second, | 196 AddSettingsForOneType(*provider, |
| 239 provider->first, | |
| 240 content_type, | 197 content_type, |
| 241 resource_identifier, | 198 resource_identifier, |
| 242 settings, | 199 settings, |
| 243 true); | 200 true); |
| 244 } | 201 } |
| 245 AddSettingsForOneType(provider->second, | 202 AddSettingsForOneType(*provider, |
| 246 provider->first, | |
| 247 content_type, | 203 content_type, |
| 248 resource_identifier, | 204 resource_identifier, |
| 249 settings, | 205 settings, |
| 250 false); | 206 false); |
| 251 } | 207 } |
| 252 } | 208 } |
| 253 | 209 |
| 254 void HostContentSettingsMap::SetDefaultContentSetting( | 210 void HostContentSettingsMap::SetDefaultContentSetting( |
| 255 ContentSettingsType content_type, | 211 ContentSettingsType content_type, |
| 256 ContentSetting setting) { | 212 ContentSetting setting) { |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 274 const std::string& resource_identifier, | 230 const std::string& resource_identifier, |
| 275 base::Value* value) { | 231 base::Value* value) { |
| 276 DCHECK(IsValueAllowedForType(prefs_, value, content_type)); | 232 DCHECK(IsValueAllowedForType(prefs_, value, content_type)); |
| 277 DCHECK(SupportsResourceIdentifier(content_type) || | 233 DCHECK(SupportsResourceIdentifier(content_type) || |
| 278 resource_identifier.empty()); | 234 resource_identifier.empty()); |
| 279 UsedContentSettingsProviders(); | 235 UsedContentSettingsProviders(); |
| 280 | 236 |
| 281 for (ProviderIterator provider = content_settings_providers_.begin(); | 237 for (ProviderIterator provider = content_settings_providers_.begin(); |
| 282 provider != content_settings_providers_.end(); | 238 provider != content_settings_providers_.end(); |
| 283 ++provider) { | 239 ++provider) { |
| 284 if (provider->second->SetWebsiteSetting(primary_pattern, | 240 if ((*provider)->SetWebsiteSetting(primary_pattern, |
| 285 secondary_pattern, | 241 secondary_pattern, |
| 286 content_type, | 242 content_type, |
| 287 resource_identifier, | 243 resource_identifier, |
| 288 value)) { | 244 value)) { |
| 289 return; | 245 return; |
| 290 } | 246 } |
| 291 } | 247 } |
| 292 NOTREACHED(); | 248 NOTREACHED(); |
| 293 } | 249 } |
| 294 | 250 |
| 295 void HostContentSettingsMap::SetNarrowestWebsiteSetting( | 251 void HostContentSettingsMap::SetNarrowestWebsiteSetting( |
| 296 const ContentSettingsPattern& primary_pattern, | 252 const ContentSettingsPattern& primary_pattern, |
| 297 const ContentSettingsPattern& secondary_pattern, | 253 const ContentSettingsPattern& secondary_pattern, |
| 298 ContentSettingsType content_type, | 254 ContentSettingsType content_type, |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 ContentSettingsPattern::FromURLNoWildcard(secondary_url), | 326 ContentSettingsPattern::FromURLNoWildcard(secondary_url), |
| 371 content_type); | 327 content_type); |
| 372 } | 328 } |
| 373 | 329 |
| 374 void HostContentSettingsMap::UpdateLastUsageByPattern( | 330 void HostContentSettingsMap::UpdateLastUsageByPattern( |
| 375 const ContentSettingsPattern& primary_pattern, | 331 const ContentSettingsPattern& primary_pattern, |
| 376 const ContentSettingsPattern& secondary_pattern, | 332 const ContentSettingsPattern& secondary_pattern, |
| 377 ContentSettingsType content_type) { | 333 ContentSettingsType content_type) { |
| 378 UsedContentSettingsProviders(); | 334 UsedContentSettingsProviders(); |
| 379 | 335 |
| 380 GetPrefProvider()->UpdateLastUsage( | 336 pref_provider_->UpdateLastUsage( |
| 381 primary_pattern, secondary_pattern, content_type); | 337 primary_pattern, secondary_pattern, content_type); |
| 382 | 338 |
| 383 FOR_EACH_OBSERVER( | 339 FOR_EACH_OBSERVER( |
| 384 content_settings::Observer, | 340 content_settings::Observer, |
| 385 observers_, | 341 observers_, |
| 386 OnContentSettingUsed(primary_pattern, secondary_pattern, content_type)); | 342 OnContentSettingUsed(primary_pattern, secondary_pattern, content_type)); |
| 387 } | 343 } |
| 388 | 344 |
| 389 base::Time HostContentSettingsMap::GetLastUsage( | 345 base::Time HostContentSettingsMap::GetLastUsage( |
| 390 const GURL& primary_url, | 346 const GURL& primary_url, |
| 391 const GURL& secondary_url, | 347 const GURL& secondary_url, |
| 392 ContentSettingsType content_type) { | 348 ContentSettingsType content_type) { |
| 393 return GetLastUsageByPattern( | 349 return GetLastUsageByPattern( |
| 394 ContentSettingsPattern::FromURLNoWildcard(primary_url), | 350 ContentSettingsPattern::FromURLNoWildcard(primary_url), |
| 395 ContentSettingsPattern::FromURLNoWildcard(secondary_url), | 351 ContentSettingsPattern::FromURLNoWildcard(secondary_url), |
| 396 content_type); | 352 content_type); |
| 397 } | 353 } |
| 398 | 354 |
| 399 base::Time HostContentSettingsMap::GetLastUsageByPattern( | 355 base::Time HostContentSettingsMap::GetLastUsageByPattern( |
| 400 const ContentSettingsPattern& primary_pattern, | 356 const ContentSettingsPattern& primary_pattern, |
| 401 const ContentSettingsPattern& secondary_pattern, | 357 const ContentSettingsPattern& secondary_pattern, |
| 402 ContentSettingsType content_type) { | 358 ContentSettingsType content_type) { |
| 403 UsedContentSettingsProviders(); | 359 UsedContentSettingsProviders(); |
| 404 | 360 |
| 405 return GetPrefProvider()->GetLastUsage( | 361 return pref_provider_->GetLastUsage( |
| 406 primary_pattern, secondary_pattern, content_type); | 362 primary_pattern, secondary_pattern, content_type); |
| 407 } | 363 } |
| 408 | 364 |
| 409 void HostContentSettingsMap::AddObserver(content_settings::Observer* observer) { | 365 void HostContentSettingsMap::AddObserver(content_settings::Observer* observer) { |
| 410 observers_.AddObserver(observer); | 366 observers_.AddObserver(observer); |
| 411 } | 367 } |
| 412 | 368 |
| 413 void HostContentSettingsMap::RemoveObserver( | 369 void HostContentSettingsMap::RemoveObserver( |
| 414 content_settings::Observer* observer) { | 370 content_settings::Observer* observer) { |
| 415 observers_.RemoveObserver(observer); | 371 observers_.RemoveObserver(observer); |
| 416 } | 372 } |
| 417 | 373 |
| 418 void HostContentSettingsMap::SetPrefClockForTesting( | 374 void HostContentSettingsMap::SetPrefClockForTesting( |
| 419 scoped_ptr<base::Clock> clock) { | 375 scoped_ptr<base::Clock> clock) { |
| 420 UsedContentSettingsProviders(); | 376 UsedContentSettingsProviders(); |
| 421 | 377 |
| 422 GetPrefProvider()->SetClockForTesting(clock.Pass()); | 378 pref_provider_->SetClockForTesting(clock.Pass()); |
| 423 } | 379 } |
| 424 | 380 |
| 425 void HostContentSettingsMap::AddExceptionForURL( | 381 void HostContentSettingsMap::AddExceptionForURL( |
| 426 const GURL& primary_url, | 382 const GURL& primary_url, |
| 427 const GURL& secondary_url, | 383 const GURL& secondary_url, |
| 428 ContentSettingsType content_type, | 384 ContentSettingsType content_type, |
| 429 ContentSetting setting) { | 385 ContentSetting setting) { |
| 430 // TODO(markusheintz): Until the UI supports pattern pairs, both urls must | 386 // TODO(markusheintz): Until the UI supports pattern pairs, both urls must |
| 431 // match. | 387 // match. |
| 432 DCHECK(primary_url == secondary_url); | 388 DCHECK(primary_url == secondary_url); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 446 std::string(), | 402 std::string(), |
| 447 setting); | 403 setting); |
| 448 } | 404 } |
| 449 | 405 |
| 450 void HostContentSettingsMap::ClearSettingsForOneType( | 406 void HostContentSettingsMap::ClearSettingsForOneType( |
| 451 ContentSettingsType content_type) { | 407 ContentSettingsType content_type) { |
| 452 UsedContentSettingsProviders(); | 408 UsedContentSettingsProviders(); |
| 453 for (ProviderIterator provider = content_settings_providers_.begin(); | 409 for (ProviderIterator provider = content_settings_providers_.begin(); |
| 454 provider != content_settings_providers_.end(); | 410 provider != content_settings_providers_.end(); |
| 455 ++provider) { | 411 ++provider) { |
| 456 provider->second->ClearAllContentSettingsRules(content_type); | 412 (*provider)->ClearAllContentSettingsRules(content_type); |
| 457 } | 413 } |
| 458 } | 414 } |
| 459 | 415 |
| 460 bool HostContentSettingsMap::IsValueAllowedForType( | 416 bool HostContentSettingsMap::IsValueAllowedForType( |
| 461 PrefService* prefs, const base::Value* value, ContentSettingsType type) { | 417 PrefService* prefs, const base::Value* value, ContentSettingsType type) { |
| 462 return ContentTypeHasCompoundValue(type) || IsSettingAllowedForType( | 418 return ContentTypeHasCompoundValue(type) || IsSettingAllowedForType( |
| 463 prefs, content_settings::ValueToContentSetting(value), type); | 419 prefs, content_settings::ValueToContentSetting(value), type); |
| 464 } | 420 } |
| 465 | 421 |
| 466 // static | 422 // static |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 FOR_EACH_OBSERVER(content_settings::Observer, | 497 FOR_EACH_OBSERVER(content_settings::Observer, |
| 542 observers_, | 498 observers_, |
| 543 OnContentSettingChanged(primary_pattern, | 499 OnContentSettingChanged(primary_pattern, |
| 544 secondary_pattern, | 500 secondary_pattern, |
| 545 content_type, | 501 content_type, |
| 546 resource_identifier)); | 502 resource_identifier)); |
| 547 } | 503 } |
| 548 | 504 |
| 549 HostContentSettingsMap::~HostContentSettingsMap() { | 505 HostContentSettingsMap::~HostContentSettingsMap() { |
| 550 DCHECK(!prefs_); | 506 DCHECK(!prefs_); |
| 551 STLDeleteValues(&content_settings_providers_); | |
| 552 } | 507 } |
| 553 | 508 |
| 554 void HostContentSettingsMap::ShutdownOnUIThread() { | 509 void HostContentSettingsMap::ShutdownOnUIThread() { |
| 555 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 510 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 556 DCHECK(prefs_); | 511 DCHECK(prefs_); |
| 557 prefs_ = NULL; | 512 prefs_ = NULL; |
| 558 for (ProviderIterator it = content_settings_providers_.begin(); | 513 for (ProviderIterator it = content_settings_providers_.begin(); |
| 559 it != content_settings_providers_.end(); | 514 it != content_settings_providers_.end(); |
| 560 ++it) { | 515 ++it) { |
| 561 it->second->ShutdownOnUIThread(); | 516 (*it)->ShutdownOnUIThread(); |
| 562 } | 517 } |
| 563 } | 518 } |
| 564 | 519 |
| 565 void HostContentSettingsMap::MigrateObsoleteClearOnExitPref() { | 520 void HostContentSettingsMap::MigrateObsoleteClearOnExitPref() { |
| 566 // Don't migrate more than once. | 521 // Don't migrate more than once. |
| 567 if (prefs_->HasPrefPath(prefs::kContentSettingsClearOnExitMigrated) && | 522 if (prefs_->HasPrefPath(prefs::kContentSettingsClearOnExitMigrated) && |
| 568 prefs_->GetBoolean(prefs::kContentSettingsClearOnExitMigrated)) { | 523 prefs_->GetBoolean(prefs::kContentSettingsClearOnExitMigrated)) { |
| 569 return; | 524 return; |
| 570 } | 525 } |
| 571 | 526 |
| 572 if (!prefs_->GetBoolean(prefs::kClearSiteDataOnExit)) { | 527 if (!prefs_->GetBoolean(prefs::kClearSiteDataOnExit)) { |
| 573 // Nothing to be done | 528 // Nothing to be done |
| 574 prefs_->SetBoolean(prefs::kContentSettingsClearOnExitMigrated, true); | 529 prefs_->SetBoolean(prefs::kContentSettingsClearOnExitMigrated, true); |
| 575 return; | 530 return; |
| 576 } | 531 } |
| 577 | 532 |
| 578 // Change the default cookie settings: | 533 // Change the default cookie settings: |
| 579 // old new | 534 // old new |
| 580 // ---------------- ---------------- | 535 // ---------------- ---------------- |
| 581 // ALLOW SESSION_ONLY | 536 // ALLOW SESSION_ONLY |
| 582 // SESSION_ONLY SESSION_ONLY | 537 // SESSION_ONLY SESSION_ONLY |
| 583 // BLOCK BLOCK | 538 // BLOCK BLOCK |
| 584 ContentSetting default_setting = GetDefaultContentSettingFromProvider( | 539 ContentSetting default_setting = GetDefaultContentSettingFromProvider( |
| 585 CONTENT_SETTINGS_TYPE_COOKIES, | 540 CONTENT_SETTINGS_TYPE_COOKIES, |
| 586 content_settings_providers_[DEFAULT_PROVIDER]); | 541 default_provider_); |
| 587 if (default_setting == CONTENT_SETTING_ALLOW) { | 542 if (default_setting == CONTENT_SETTING_ALLOW) { |
| 588 SetDefaultContentSetting( | 543 SetDefaultContentSetting( |
| 589 CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_SESSION_ONLY); | 544 CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_SESSION_ONLY); |
| 590 } | 545 } |
| 591 | 546 |
| 592 // Change the exceptions using the same rules. | 547 // Change the exceptions using the same rules. |
| 593 ContentSettingsForOneType exceptions; | 548 ContentSettingsForOneType exceptions; |
| 594 AddSettingsForOneType(content_settings_providers_[PREF_PROVIDER], | 549 AddSettingsForOneType(pref_provider_, |
| 595 PREF_PROVIDER, | |
| 596 CONTENT_SETTINGS_TYPE_COOKIES, | 550 CONTENT_SETTINGS_TYPE_COOKIES, |
| 597 std::string(), | 551 std::string(), |
| 598 &exceptions, | 552 &exceptions, |
| 599 false); | 553 false); |
| 600 for (ContentSettingsForOneType::iterator it = exceptions.begin(); | 554 for (ContentSettingsForOneType::iterator it = exceptions.begin(); |
| 601 it != exceptions.end(); ++it) { | 555 it != exceptions.end(); ++it) { |
| 602 if (it->setting != CONTENT_SETTING_ALLOW) | 556 if (it->setting != CONTENT_SETTING_ALLOW) |
| 603 continue; | 557 continue; |
| 604 SetWebsiteSetting(it->primary_pattern, | 558 SetWebsiteSetting(it->primary_pattern, |
| 605 it->secondary_pattern, | 559 it->secondary_pattern, |
| 606 CONTENT_SETTINGS_TYPE_COOKIES, | 560 CONTENT_SETTINGS_TYPE_COOKIES, |
| 607 std::string(), | 561 std::string(), |
| 608 new base::FundamentalValue(CONTENT_SETTING_SESSION_ONLY)); | 562 new base::FundamentalValue(CONTENT_SETTING_SESSION_ONLY)); |
| 609 } | 563 } |
| 610 | 564 |
| 611 prefs_->SetBoolean(prefs::kContentSettingsClearOnExitMigrated, true); | 565 prefs_->SetBoolean(prefs::kContentSettingsClearOnExitMigrated, true); |
| 612 } | 566 } |
| 613 | 567 |
| 614 void HostContentSettingsMap::AddSettingsForOneType( | 568 void HostContentSettingsMap::AddSettingsForOneType( |
| 615 const content_settings::ProviderInterface* provider, | 569 const content_settings::ProviderInterface* provider, |
| 616 ProviderType provider_type, | |
| 617 ContentSettingsType content_type, | 570 ContentSettingsType content_type, |
| 618 const std::string& resource_identifier, | 571 const std::string& resource_identifier, |
| 619 ContentSettingsForOneType* settings, | 572 ContentSettingsForOneType* settings, |
| 620 bool incognito) const { | 573 bool incognito) const { |
| 621 scoped_ptr<content_settings::RuleIterator> rule_iterator( | 574 scoped_ptr<content_settings::RuleIterator> rule_iterator( |
| 622 provider->GetRuleIterator(content_type, | 575 provider->GetRuleIterator(content_type, |
| 623 resource_identifier, | 576 resource_identifier, |
| 624 incognito)); | 577 incognito)); |
| 625 while (rule_iterator->HasNext()) { | 578 while (rule_iterator->HasNext()) { |
| 626 const content_settings::Rule& rule = rule_iterator->Next(); | 579 const content_settings::Rule& rule = rule_iterator->Next(); |
| 627 ContentSetting setting_value = CONTENT_SETTING_DEFAULT; | 580 ContentSetting setting_value = CONTENT_SETTING_DEFAULT; |
| 628 // TODO(bauerb): Return rules as a list of values, not content settings. | 581 // TODO(bauerb): Return rules as a list of values, not content settings. |
| 629 // Handle the case using compound values for its exceptions and arbitrary | 582 // Handle the case using compound values for its exceptions and arbitrary |
| 630 // values for its default setting. Here we assume all the exceptions | 583 // values for its default setting. Here we assume all the exceptions |
| 631 // are granted as |CONTENT_SETTING_ALLOW|. | 584 // are granted as |CONTENT_SETTING_ALLOW|. |
| 632 if (ContentTypeHasCompoundValue(content_type) && | 585 if (ContentTypeHasCompoundValue(content_type) && |
| 633 rule.value.get() && | 586 rule.value.get() && |
| 634 rule.primary_pattern != ContentSettingsPattern::Wildcard()) { | 587 rule.primary_pattern != ContentSettingsPattern::Wildcard()) { |
| 635 setting_value = CONTENT_SETTING_ALLOW; | 588 setting_value = CONTENT_SETTING_ALLOW; |
| 636 } else { | 589 } else { |
| 637 setting_value = content_settings::ValueToContentSetting(rule.value.get()); | 590 setting_value = content_settings::ValueToContentSetting(rule.value.get()); |
| 638 } | 591 } |
| 639 settings->push_back(ContentSettingPatternSource( | 592 settings->push_back(ContentSettingPatternSource( |
| 640 rule.primary_pattern, rule.secondary_pattern, | 593 rule.primary_pattern, rule.secondary_pattern, |
| 641 setting_value, | 594 setting_value, |
| 642 kProviderNames[provider_type], | 595 provider->GetProviderName(), |
| 643 incognito)); | 596 incognito)); |
| 644 } | 597 } |
| 645 } | 598 } |
| 646 | 599 |
| 647 void HostContentSettingsMap::UsedContentSettingsProviders() const { | 600 void HostContentSettingsMap::UsedContentSettingsProviders() const { |
| 648 #ifndef NDEBUG | 601 #ifndef NDEBUG |
| 649 if (used_from_thread_id_ == base::kInvalidThreadId) | 602 if (used_from_thread_id_ == base::kInvalidThreadId) |
| 650 return; | 603 return; |
| 651 | 604 |
| 652 if (base::PlatformThread::CurrentId() != used_from_thread_id_) | 605 if (base::PlatformThread::CurrentId() != used_from_thread_id_) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 717 primary_pattern = &info->primary_pattern; | 670 primary_pattern = &info->primary_pattern; |
| 718 secondary_pattern = &info->secondary_pattern; | 671 secondary_pattern = &info->secondary_pattern; |
| 719 } | 672 } |
| 720 | 673 |
| 721 // The list of |content_settings_providers_| is ordered according to their | 674 // The list of |content_settings_providers_| is ordered according to their |
| 722 // precedence. | 675 // precedence. |
| 723 for (ConstProviderIterator provider = content_settings_providers_.begin(); | 676 for (ConstProviderIterator provider = content_settings_providers_.begin(); |
| 724 provider != content_settings_providers_.end(); | 677 provider != content_settings_providers_.end(); |
| 725 ++provider) { | 678 ++provider) { |
| 726 base::Value* value = content_settings::GetContentSettingValueAndPatterns( | 679 base::Value* value = content_settings::GetContentSettingValueAndPatterns( |
| 727 provider->second, primary_url, secondary_url, content_type, | 680 *provider, primary_url, secondary_url, content_type, |
| 728 resource_identifier, is_off_the_record_, | 681 resource_identifier, is_off_the_record_, |
| 729 primary_pattern, secondary_pattern); | 682 primary_pattern, secondary_pattern); |
| 730 if (value) { | 683 if (value) { |
| 731 if (info) | 684 if (info) |
| 732 info->source = kProviderSourceMap[provider->first]; | 685 info->source = (*provider)->GetSettingSource(); |
| 733 return value; | 686 return value; |
| 734 } | 687 } |
| 735 } | 688 } |
| 736 | 689 |
| 737 if (info) { | 690 if (info) { |
| 738 info->source = content_settings::SETTING_SOURCE_NONE; | 691 info->source = content_settings::SETTING_SOURCE_NONE; |
| 739 info->primary_pattern = ContentSettingsPattern(); | 692 info->primary_pattern = ContentSettingsPattern(); |
| 740 info->secondary_pattern = ContentSettingsPattern(); | 693 info->secondary_pattern = ContentSettingsPattern(); |
| 741 } | 694 } |
| 742 return NULL; | 695 return NULL; |
| 743 } | 696 } |
| 744 | |
| 745 // static | |
| 746 HostContentSettingsMap::ProviderType | |
| 747 HostContentSettingsMap::GetProviderTypeFromSource( | |
| 748 const std::string& source) { | |
| 749 for (size_t i = 0; i < arraysize(kProviderNames); ++i) { | |
| 750 if (source == kProviderNames[i]) | |
| 751 return static_cast<ProviderType>(i); | |
| 752 } | |
| 753 | |
| 754 NOTREACHED(); | |
| 755 return DEFAULT_PROVIDER; | |
| 756 } | |
| 757 | |
| 758 content_settings::PrefProvider* HostContentSettingsMap::GetPrefProvider() { | |
| 759 return static_cast<content_settings::PrefProvider*>( | |
| 760 content_settings_providers_[PREF_PROVIDER]); | |
| 761 } | |
| OLD | NEW |