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