15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/clock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_default_provider.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_policy_provider.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_pref_provider.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_details.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_observable_provider.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_provider.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_rule.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings_pattern.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/static_cookie_policy.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_EXTENSIONS)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/constants.h"
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<content_settings::Rule> Rules;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::pair<std::string, std::string> StringPair;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(bauerb): Expose constants.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kProviderNames[] = {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "platform_app",
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "policy",
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "extension",
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  "override",
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "preference",
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "default"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content_settings::SettingSource kProviderSourceMap[] = {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::SETTING_SOURCE_EXTENSION,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::SETTING_SOURCE_POLICY,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::SETTING_SOURCE_EXTENSION,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::SETTING_SOURCE_USER,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::SETTING_SOURCE_USER,
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content_settings::SETTING_SOURCE_USER,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(kProviderSourceMap) ==
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   HostContentSettingsMap::NUM_PROVIDER_TYPES,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               kProviderSourceMap_has_incorrect_size);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the |content_type| supports a resource identifier.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Resource identifiers are supported (but not required) for plug-ins.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SupportsResourceIdentifier(ContentSettingsType content_type) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_type == CONTENT_SETTINGS_TYPE_PLUGINS;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHostContentSettingsMap::HostContentSettingsMap(PrefService* prefs,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               bool incognito)
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    :
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      used_from_thread_id_(base::PlatformThread::CurrentId()),
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs_(prefs),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_off_the_record_(incognito) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::ObservableProvider* policy_provider =
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new content_settings::PolicyProvider(prefs_);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_provider->AddObserver(this);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings_providers_[POLICY_PROVIDER] = policy_provider;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::ObservableProvider* pref_provider =
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new content_settings::PrefProvider(prefs_, is_off_the_record_);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_provider->AddObserver(this);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings_providers_[PREF_PROVIDER] = pref_provider;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::ObservableProvider* default_provider =
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new content_settings::DefaultProvider(prefs_, is_off_the_record_);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_provider->AddObserver(this);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings_providers_[DEFAULT_PROVIDER] = default_provider;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content_settings_providers_[OVERRIDE_PROVIDER] =
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new content_settings::OverrideProvider(prefs_, is_off_the_record_);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_off_the_record_) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Migrate obsolete preferences.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MigrateObsoleteClearOnExitPref();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid HostContentSettingsMap::RegisterProfilePrefs(
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kContentSettingsWindowLastTabIndex,
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0,
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kContentSettingsClearOnExitMigrated,
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register the prefs for the content settings providers.
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content_settings::DefaultProvider::RegisterProfilePrefs(registry);
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content_settings::PrefProvider::RegisterProfilePrefs(registry);
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content_settings::PolicyProvider::RegisterProfilePrefs(registry);
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content_settings::OverrideProvider::RegisterProfilePrefs(registry);
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid HostContentSettingsMap::RegisterProvider(
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ProviderType type,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<content_settings::ObservableProvider> provider) {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!content_settings_providers_[type]);
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  provider->AddObserver(this);
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content_settings_providers_[type] = provider.release();
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef NDEBUG
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_NE(used_from_thread_id_, base::kInvalidThreadId)
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "Used from multiple threads before initialization complete.";
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OnContentSettingChanged(ContentSettingsPattern(),
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          ContentSettingsPattern(),
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          CONTENT_SETTINGS_TYPE_DEFAULT,
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          std::string());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting HostContentSettingsMap::GetDefaultContentSettingFromProvider(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_settings::ProviderInterface* provider) const {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content_settings::RuleIterator> rule_iterator(
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      provider->GetRuleIterator(content_type, std::string(), false));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (rule_iterator->HasNext()) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_settings::Rule rule = rule_iterator->Next();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rule.primary_pattern == wildcard &&
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rule.secondary_pattern == wildcard) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return content_settings::ValueToContentSetting(rule.value.get());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CONTENT_SETTING_DEFAULT;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting HostContentSettingsMap::GetDefaultContentSetting(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* provider_id) const {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UsedContentSettingsProviders();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterate through the list of providers and return the first non-NULL value
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that matches |primary_url| and |secondary_url|.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ConstProviderIterator provider = content_settings_providers_.begin();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       provider != content_settings_providers_.end();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++provider) {
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (provider->first == PREF_PROVIDER ||
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        provider->first == OVERRIDE_PROVIDER)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting default_setting =
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetDefaultContentSettingFromProvider(content_type, provider->second);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (default_setting != CONTENT_SETTING_DEFAULT) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (provider_id)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *provider_id = kProviderNames[provider->first];
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return default_setting;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CONTENT_SETTING_DEFAULT;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting HostContentSettingsMap::GetContentSetting(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier) const {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!ContentTypeHasCompoundValue(content_type));
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::Value> value = GetWebsiteSetting(
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      primary_url, secondary_url, content_type, resource_identifier, NULL);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_settings::ValueToContentSetting(value.get());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::GetSettingsForOneType(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsForOneType* settings) const {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(SupportsResourceIdentifier(content_type) ||
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         resource_identifier.empty());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(settings);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UsedContentSettingsProviders();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->clear();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ConstProviderIterator provider = content_settings_providers_.begin();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       provider != content_settings_providers_.end();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++provider) {
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (provider->first == OVERRIDE_PROVIDER)
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For each provider, iterate first the incognito-specific rules, then the
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // normal rules.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_off_the_record_) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddSettingsForOneType(provider->second,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            provider->first,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            content_type,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            resource_identifier,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            settings,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            true);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddSettingsForOneType(provider->second,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          provider->first,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          content_type,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          resource_identifier,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          settings,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          false);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::SetDefaultContentSetting(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsSettingAllowedForType(prefs_, setting, content_type));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Value* value = NULL;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting != CONTENT_SETTING_DEFAULT)
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value = new base::FundamentalValue(setting);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetWebsiteSetting(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::Wildcard(),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::SetWebsiteSetting(
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Value* value) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValueAllowedForType(prefs_, value, content_type));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(SupportsResourceIdentifier(content_type) ||
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         resource_identifier.empty());
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UsedContentSettingsProviders();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ProviderIterator provider = content_settings_providers_.begin();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       provider != content_settings_providers_.end();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++provider) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (provider->second->SetWebsiteSetting(primary_pattern,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            secondary_pattern,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            content_type,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            resource_identifier,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            value)) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void HostContentSettingsMap::SetNarrowestWebsiteSetting(
27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
27603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ContentSettingsType content_type,
27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const std::string& resource_identifier,
27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ContentSetting setting,
28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    content_settings::SettingInfo existing_info) {
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ContentSettingsPattern narrow_primary = primary_pattern;
28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ContentSettingsPattern narrow_secondary = secondary_pattern;
28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK_EQ(content_settings::SETTING_SOURCE_USER, existing_info.source);
28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ContentSettingsPattern::Relation r1 =
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      existing_info.primary_pattern.Compare(primary_pattern);
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (r1 == ContentSettingsPattern::PREDECESSOR) {
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    narrow_primary = existing_info.primary_pattern;
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  } else if (r1 == ContentSettingsPattern::IDENTITY) {
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ContentSettingsPattern::Relation r2 =
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        existing_info.secondary_pattern.Compare(secondary_pattern);
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DCHECK(r2 != ContentSettingsPattern::DISJOINT_ORDER_POST &&
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)           r2 != ContentSettingsPattern::DISJOINT_ORDER_PRE);
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (r2 == ContentSettingsPattern::PREDECESSOR)
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      narrow_secondary = existing_info.secondary_pattern;
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SetContentSetting(
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      narrow_primary, narrow_secondary, content_type, std::string(), setting);
30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::SetContentSetting(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!ContentTypeHasCompoundValue(content_type));
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (setting == CONTENT_SETTING_ALLOW &&
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS)) {
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UpdateLastUsageByPattern(primary_pattern, secondary_pattern, content_type);
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Value* value = NULL;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting != CONTENT_SETTING_DEFAULT)
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value = new base::FundamentalValue(setting);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetWebsiteSetting(primary_pattern,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    secondary_pattern,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content_type,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    resource_identifier,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    value);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
326116680a4aac90f2aa7413d9095a592090648e557Ben MurdochContentSetting HostContentSettingsMap::GetContentSettingAndMaybeUpdateLastUsage(
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& primary_url,
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& secondary_url,
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ContentSettingsType content_type,
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& resource_identifier) {
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ContentSetting setting = GetContentSetting(
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      primary_url, secondary_url, content_type, resource_identifier);
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (setting == CONTENT_SETTING_ALLOW) {
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UpdateLastUsageByPattern(
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ContentSettingsPattern::FromURLNoWildcard(primary_url),
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ContentSettingsPattern::FromURLNoWildcard(secondary_url),
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content_type);
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return setting;
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostContentSettingsMap::UpdateLastUsage(const GURL& primary_url,
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             const GURL& secondary_url,
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             ContentSettingsType content_type) {
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UpdateLastUsageByPattern(
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ContentSettingsPattern::FromURLNoWildcard(primary_url),
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ContentSettingsPattern::FromURLNoWildcard(secondary_url),
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_type);
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostContentSettingsMap::UpdateLastUsageByPattern(
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ContentSettingsPattern& primary_pattern,
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ContentSettingsPattern& secondary_pattern,
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ContentSettingsType content_type) {
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UsedContentSettingsProviders();
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPrefProvider()->UpdateLastUsage(
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      primary_pattern, secondary_pattern, content_type);
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FOR_EACH_OBSERVER(
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content_settings::Observer,
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      observers_,
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OnContentSettingUsed(primary_pattern, secondary_pattern, content_type));
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::Time HostContentSettingsMap::GetLastUsage(
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& primary_url,
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& secondary_url,
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ContentSettingsType content_type) {
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetLastUsageByPattern(
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ContentSettingsPattern::FromURLNoWildcard(primary_url),
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ContentSettingsPattern::FromURLNoWildcard(secondary_url),
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content_type);
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::Time HostContentSettingsMap::GetLastUsageByPattern(
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ContentSettingsPattern& primary_pattern,
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ContentSettingsPattern& secondary_pattern,
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ContentSettingsType content_type) {
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UsedContentSettingsProviders();
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetPrefProvider()->GetLastUsage(
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      primary_pattern, secondary_pattern, content_type);
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciContentSetting HostContentSettingsMap::GetContentSettingWithoutOverride(
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& primary_url,
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& secondary_url,
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type,
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& resource_identifier) {
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::Value> value(GetWebsiteSettingWithoutOverride(
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      primary_url, secondary_url, content_type, resource_identifier, NULL));
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return content_settings::ValueToContentSetting(value.get());
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<base::Value>
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHostContentSettingsMap::GetWebsiteSettingWithoutOverride(
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& primary_url,
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& secondary_url,
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type,
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& resource_identifier,
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content_settings::SettingInfo* info) const {
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return GetWebsiteSettingInternal(primary_url,
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   secondary_url,
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   content_type,
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   resource_identifier,
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   info,
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   false);
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid HostContentSettingsMap::SetContentSettingOverride(
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type,
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool is_enabled) {
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UsedContentSettingsProviders();
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content_settings::OverrideProvider* override =
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<content_settings::OverrideProvider*>(
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content_settings_providers_[OVERRIDE_PROVIDER]);
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  override->SetOverrideSetting(content_type, is_enabled);
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool HostContentSettingsMap::GetContentSettingOverride(
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type) {
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UsedContentSettingsProviders();
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content_settings::OverrideProvider* override =
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<content_settings::OverrideProvider*>(
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content_settings_providers_[OVERRIDE_PROVIDER]);
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return override->IsEnabled(content_type);
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HostContentSettingsMap::AddObserver(content_settings::Observer* observer) {
4356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  observers_.AddObserver(observer);
4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
4376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HostContentSettingsMap::RemoveObserver(
4396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content_settings::Observer* observer) {
4406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  observers_.RemoveObserver(observer);
4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
4426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HostContentSettingsMap::SetPrefClockForTesting(
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::Clock> clock) {
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UsedContentSettingsProviders();
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetPrefProvider()->SetClockForTesting(clock.Pass());
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::AddExceptionForURL(
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(markusheintz): Until the UI supports pattern pairs, both urls must
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // match.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(primary_url == secondary_url);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!ContentTypeHasCompoundValue(content_type));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure there is no entry that would override the pattern we are about
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to insert for exactly this URL.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentSetting(ContentSettingsPattern::FromURLNoWildcard(primary_url),
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ContentSettingsPattern::Wildcard(),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content_type,
465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    std::string(),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    CONTENT_SETTING_DEFAULT);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetContentSetting(ContentSettingsPattern::FromURL(primary_url),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    ContentSettingsPattern::Wildcard(),
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content_type,
471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    std::string(),
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    setting);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::ClearSettingsForOneType(
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type) {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UsedContentSettingsProviders();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ProviderIterator provider = content_settings_providers_.begin();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       provider != content_settings_providers_.end();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++provider) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->second->ClearAllContentSettingsRules(content_type);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HostContentSettingsMap::IsValueAllowedForType(
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* prefs, const base::Value* value, ContentSettingsType type) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ContentTypeHasCompoundValue(type) || IsSettingAllowedForType(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs, content_settings::ValueToContentSetting(value), type);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HostContentSettingsMap::IsSettingAllowedForType(
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* prefs,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't yet support stored content settings for mixed scripting.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_MIXEDSCRIPT)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BLOCK semantics are not implemented for fullscreen.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_FULLSCREEN &&
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setting == CONTENT_SETTING_BLOCK) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We don't support ALLOW for media default setting.
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM &&
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      setting == CONTENT_SETTING_ALLOW) {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // App banners store a dictionary.
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_APP_BANNER)
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DEFAULT, ALLOW and BLOCK are always allowed.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_DEFAULT ||
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setting == CONTENT_SETTING_ALLOW ||
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setting == CONTENT_SETTING_BLOCK) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (content_type) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_COOKIES:
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return setting == CONTENT_SETTING_SESSION_ONLY;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_PLUGINS:
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MOUSELOCK:
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM:
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_PPAPI_BROKER:
5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS:
536558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return setting == CONTENT_SETTING_ASK;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HostContentSettingsMap::ContentTypeHasCompoundValue(
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType type) {
5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Values for content type CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE,
5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // CONTENT_SETTINGS_TYPE_MEDIASTREAM, and
5485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS are of type dictionary/map.
5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Compound types like dictionaries can't be mapped to the type
5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // |ContentSetting|.
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID)
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (type == CONTENT_SETTINGS_TYPE_APP_BANNER)
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (type == CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE ||
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          type == CONTENT_SETTINGS_TYPE_MEDIASTREAM ||
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          type == CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::OnContentSettingChanged(
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string resource_identifier) {
5666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  FOR_EACH_OBSERVER(content_settings::Observer,
5676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    observers_,
5686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    OnContentSettingChanged(primary_pattern,
5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                            secondary_pattern,
5706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                            content_type,
5716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                            resource_identifier));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostContentSettingsMap::~HostContentSettingsMap() {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!prefs_);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteValues(&content_settings_providers_);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::ShutdownOnUIThread() {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(prefs_);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs_ = NULL;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ProviderIterator it = content_settings_providers_.begin();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != content_settings_providers_.end();
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    it->second->ShutdownOnUIThread();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::MigrateObsoleteClearOnExitPref() {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't migrate more than once.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs_->HasPrefPath(prefs::kContentSettingsClearOnExitMigrated) &&
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs_->GetBoolean(prefs::kContentSettingsClearOnExitMigrated)) {
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prefs_->GetBoolean(prefs::kClearSiteDataOnExit)) {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Nothing to be done
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs_->SetBoolean(prefs::kContentSettingsClearOnExitMigrated, true);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the default cookie settings:
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  old              new
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  ---------------- ----------------
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  ALLOW            SESSION_ONLY
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  SESSION_ONLY     SESSION_ONLY
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  BLOCK            BLOCK
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting default_setting = GetDefaultContentSettingFromProvider(
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_COOKIES,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_settings_providers_[DEFAULT_PROVIDER]);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_setting == CONTENT_SETTING_ALLOW) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetDefaultContentSetting(
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_SESSION_ONLY);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the exceptions using the same rules.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType exceptions;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSettingsForOneType(content_settings_providers_[PREF_PROVIDER],
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        PREF_PROVIDER,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        CONTENT_SETTINGS_TYPE_COOKIES,
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        std::string(),
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        &exceptions,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        false);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContentSettingsForOneType::iterator it = exceptions.begin();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != exceptions.end(); ++it) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it->setting != CONTENT_SETTING_ALLOW)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetWebsiteSetting(it->primary_pattern,
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      it->secondary_pattern,
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      CONTENT_SETTINGS_TYPE_COOKIES,
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      std::string(),
6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      new base::FundamentalValue(CONTENT_SETTING_SESSION_ONLY));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs_->SetBoolean(prefs::kContentSettingsClearOnExitMigrated, true);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostContentSettingsMap::AddSettingsForOneType(
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content_settings::ProviderInterface* provider,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProviderType provider_type,
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsForOneType* settings,
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool incognito) const {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content_settings::RuleIterator> rule_iterator(
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      provider->GetRuleIterator(content_type,
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                resource_identifier,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                incognito));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (rule_iterator->HasNext()) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content_settings::Rule& rule = rule_iterator->Next();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting_value = CONTENT_SETTING_DEFAULT;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(bauerb): Return rules as a list of values, not content settings.
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Handle the case using compound values for its exceptions and arbitrary
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // values for its default setting. Here we assume all the exceptions
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // are granted as |CONTENT_SETTING_ALLOW|.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ContentTypeHasCompoundValue(content_type) &&
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rule.value.get() &&
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rule.primary_pattern != ContentSettingsPattern::Wildcard()) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setting_value = CONTENT_SETTING_ALLOW;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      setting_value = content_settings::ValueToContentSetting(rule.value.get());
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->push_back(ContentSettingPatternSource(
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rule.primary_pattern, rule.secondary_pattern,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        setting_value,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kProviderNames[provider_type],
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        incognito));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HostContentSettingsMap::UsedContentSettingsProviders() const {
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (used_from_thread_id_ == base::kInvalidThreadId)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::PlatformThread::CurrentId() != used_from_thread_id_)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    used_from_thread_id_ = base::kInvalidThreadId;
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HostContentSettingsMap::ShouldAllowAllContent(
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS ||
687558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
688558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      content_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER) {
693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (secondary_url.SchemeIs(content::kChromeUIScheme) &&
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_COOKIES &&
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_url.SchemeIsSecure()) {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_EXTENSIONS)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (primary_url.SchemeIs(extensions::kExtensionScheme)) {
703424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    switch (content_type) {
704424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case CONTENT_SETTINGS_TYPE_PLUGINS:
705424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case CONTENT_SETTINGS_TYPE_MEDIASTREAM:
706424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
707424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
708424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        return false;
709424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      case CONTENT_SETTINGS_TYPE_COOKIES:
710424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        return secondary_url.SchemeIs(extensions::kExtensionScheme);
711424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      default:
712424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        return true;
713424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return primary_url.SchemeIs(content::kChromeDevToolsScheme) ||
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         primary_url.SchemeIs(content::kChromeUIScheme);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<base::Value> HostContentSettingsMap::GetWebsiteSetting(
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_settings::SettingInfo* info) const {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(SupportsResourceIdentifier(content_type) ||
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         resource_identifier.empty());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the scheme of the requesting url is whitelisted.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShouldAllowAllContent(primary_url, secondary_url, content_type)) {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (info) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info->source = content_settings::SETTING_SOURCE_WHITELIST;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info->primary_pattern = ContentSettingsPattern::Wildcard();
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info->secondary_pattern = ContentSettingsPattern::Wildcard();
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return scoped_ptr<base::Value>(
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new base::FundamentalValue(CONTENT_SETTING_ALLOW));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return GetWebsiteSettingInternal(primary_url,
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   secondary_url,
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   content_type,
7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   resource_identifier,
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   info,
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   true);
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHostContentSettingsMap::ProviderType
7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHostContentSettingsMap::GetProviderTypeFromSource(const std::string& source) {
7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < arraysize(kProviderNames); ++i) {
7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (source == kProviderNames[i])
7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return static_cast<ProviderType>(i);
7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return DEFAULT_PROVIDER;
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicontent_settings::PrefProvider* HostContentSettingsMap::GetPrefProvider() {
7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return static_cast<content_settings::PrefProvider*>(
7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content_settings_providers_[PREF_PROVIDER]);
7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<base::Value> HostContentSettingsMap::GetWebsiteSettingInternal(
7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& primary_url,
7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& secondary_url,
7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type,
7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& resource_identifier,
7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content_settings::SettingInfo* info,
7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool get_override) const {
7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UsedContentSettingsProviders();
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern* primary_pattern = NULL;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern* secondary_pattern = NULL;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (info) {
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    primary_pattern = &info->primary_pattern;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    secondary_pattern = &info->secondary_pattern;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The list of |content_settings_providers_| is ordered according to their
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // precedence.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ConstProviderIterator provider = content_settings_providers_.begin();
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       provider != content_settings_providers_.end();
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++provider) {
7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!get_override && provider->first == OVERRIDE_PROVIDER)
7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<base::Value> value(
7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content_settings::GetContentSettingValueAndPatterns(provider->second,
7901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            primary_url,
7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            secondary_url,
7921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            content_type,
7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            resource_identifier,
7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            is_off_the_record_,
7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            primary_pattern,
7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            secondary_pattern));
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value) {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (info)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        info->source = kProviderSourceMap[provider->first];
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return value.Pass();
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (info) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->source = content_settings::SETTING_SOURCE_NONE;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->primary_pattern = ContentSettingsPattern();
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info->secondary_pattern = ContentSettingsPattern();
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return scoped_ptr<base::Value>();
810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
811