diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-04-05 14:08:31 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-04-11 07:46:53 +0000 |
commit | 6a4cabb866f66d4128a97cdc6d9d08ce074f1247 (patch) | |
tree | ab00f70a5e89278d6a0d16ff0c42578dc4d84a2d /chromium/components/content_settings | |
parent | e733310db58160074f574c429d48f8308c0afe17 (diff) | |
download | qtwebengine-chromium-6a4cabb866f66d4128a97cdc6d9d08ce074f1247.tar.gz |
BASELINE: Update Chromium to 57.0.2987.144
Change-Id: I29db402ff696c71a04c4dbaec822c2e53efe0267
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
Diffstat (limited to 'chromium/components/content_settings')
36 files changed, 776 insertions, 325 deletions
diff --git a/chromium/components/content_settings/core/browser/BUILD.gn b/chromium/components/content_settings/core/browser/BUILD.gn index 15d412ac5d8..3e4fa6688f5 100644 --- a/chromium/components/content_settings/core/browser/BUILD.gn +++ b/chromium/components/content_settings/core/browser/BUILD.gn @@ -3,15 +3,16 @@ # found in the LICENSE file. import("//build/config/features.gni") +import("//ppapi/features/features.gni") static_library("browser") { sources = [ - "content_settings_binary_value_map.cc", - "content_settings_binary_value_map.h", "content_settings_default_provider.cc", "content_settings_default_provider.h", "content_settings_details.cc", "content_settings_details.h", + "content_settings_global_value_map.cc", + "content_settings_global_value_map.h", "content_settings_info.cc", "content_settings_info.h", "content_settings_observable_provider.cc", @@ -82,8 +83,9 @@ source_set("unit_tests") { "//base/test:test_support", "//components/content_settings/core/common", "//components/content_settings/core/test:test_support", - "//components/pref_registry:test_support", + "//components/pref_registry:pref_registry", "//components/prefs", + "//components/sync_preferences:test_support", "//extensions/features", "//testing/gtest", "//url", diff --git a/chromium/components/content_settings/core/browser/DEPS b/chromium/components/content_settings/core/browser/DEPS index dc52ba406c1..eddae7bcb63 100644 --- a/chromium/components/content_settings/core/browser/DEPS +++ b/chromium/components/content_settings/core/browser/DEPS @@ -3,6 +3,7 @@ include_rules = [ "+components/content_settings/core/test", "+components/keyed_service/core", "+components/pref_registry", + "+components/sync_preferences", "+components/url_formatter", "+extensions/features", "+net/base", diff --git a/chromium/components/content_settings/core/browser/content_settings_binary_value_map.cc b/chromium/components/content_settings/core/browser/content_settings_binary_value_map.cc deleted file mode 100644 index ddfb7326c12..00000000000 --- a/chromium/components/content_settings/core/browser/content_settings_binary_value_map.cc +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/content_settings/core/browser/content_settings_binary_value_map.h" - -#include <utility> - -#include "base/synchronization/lock.h" -#include "components/content_settings/core/browser/content_settings_rule.h" -#include "components/content_settings/core/common/content_settings.h" - -namespace content_settings { - -namespace { - -class RuleIteratorBinary : public RuleIterator { - public: - RuleIteratorBinary(bool is_enabled, std::unique_ptr<base::AutoLock> auto_lock) - : is_done_(is_enabled), auto_lock_(std::move(auto_lock)) {} - - bool HasNext() const override { return !is_done_; } - - Rule Next() override { - DCHECK(HasNext()); - is_done_ = true; - return Rule(ContentSettingsPattern::Wildcard(), - ContentSettingsPattern::Wildcard(), - new base::FundamentalValue(CONTENT_SETTING_BLOCK)); - } - - private: - bool is_done_; - std::unique_ptr<base::AutoLock> auto_lock_; -}; - -} // namespace - -BinaryValueMap::BinaryValueMap() {} - -BinaryValueMap::~BinaryValueMap() {} - -std::unique_ptr<RuleIterator> BinaryValueMap::GetRuleIterator( - ContentSettingsType content_type, - const ResourceIdentifier& resource_identifier, - std::unique_ptr<base::AutoLock> auto_lock) const { - if (!resource_identifier.empty()) - return nullptr; - return std::unique_ptr<RuleIterator>(new RuleIteratorBinary( - IsContentSettingEnabled(content_type), std::move(auto_lock))); -} - -void BinaryValueMap::SetContentSettingDisabled(ContentSettingsType content_type, - bool is_disabled) { - is_enabled_[content_type] = !is_disabled; -} - -bool BinaryValueMap::IsContentSettingEnabled( - ContentSettingsType content_type) const { - auto it = is_enabled_.find(content_type); - return it == is_enabled_.end() || it->second; -} - -} // namespace content_settings diff --git a/chromium/components/content_settings/core/browser/content_settings_default_provider.cc b/chromium/components/content_settings/core/browser/content_settings_default_provider.cc index f68ac5a5654..261fedb9d6b 100644 --- a/chromium/components/content_settings/core/browser/content_settings_default_provider.cc +++ b/chromium/components/content_settings/core/browser/content_settings_default_provider.cc @@ -177,11 +177,6 @@ DefaultProvider::DefaultProvider(PrefService* prefs, bool incognito) GetPrefName(CONTENT_SETTINGS_TYPE_MIDI_SYSEX))), CONTENT_SETTING_NUM_SETTINGS); UMA_HISTOGRAM_ENUMERATION( - "ContentSettings.DefaultKeygenSetting", - IntToContentSetting(prefs_->GetInteger( - GetPrefName(CONTENT_SETTINGS_TYPE_KEYGEN))), - CONTENT_SETTING_NUM_SETTINGS); - UMA_HISTOGRAM_ENUMERATION( "ContentSettings.DefaultWebBluetoothGuardSetting", IntToContentSetting(prefs_->GetInteger( GetPrefName(CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD))), diff --git a/chromium/components/content_settings/core/browser/content_settings_global_value_map.cc b/chromium/components/content_settings/core/browser/content_settings_global_value_map.cc new file mode 100644 index 00000000000..94744fd7574 --- /dev/null +++ b/chromium/components/content_settings/core/browser/content_settings_global_value_map.cc @@ -0,0 +1,72 @@ +// Copyright (c) 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/content_settings/core/browser/content_settings_global_value_map.h" + +#include <utility> + +#include "base/memory/ptr_util.h" +#include "base/synchronization/lock.h" +#include "components/content_settings/core/browser/content_settings_rule.h" +#include "components/content_settings/core/common/content_settings.h" + +namespace content_settings { + +namespace { + +class RuleIteratorSimple : public RuleIterator { + public: + RuleIteratorSimple(ContentSetting setting) : setting_(setting) {} + + bool HasNext() const override { return !is_done_; } + + Rule Next() override { + DCHECK(HasNext()); + is_done_ = true; + return Rule(ContentSettingsPattern::Wildcard(), + ContentSettingsPattern::Wildcard(), + new base::FundamentalValue(setting_)); + } + + private: + const ContentSetting setting_; + bool is_done_ = false; + + DISALLOW_COPY_AND_ASSIGN(RuleIteratorSimple); +}; + +} // namespace + +GlobalValueMap::GlobalValueMap() {} + +GlobalValueMap::~GlobalValueMap() {} + +std::unique_ptr<RuleIterator> GlobalValueMap::GetRuleIterator( + ContentSettingsType content_type, + const ResourceIdentifier& resource_identifier) const { + if (!resource_identifier.empty()) + return nullptr; + + auto it = settings_.find(content_type); + if (it == settings_.end()) + return nullptr; + + return base::MakeUnique<RuleIteratorSimple>(it->second); +} + +void GlobalValueMap::SetContentSetting(ContentSettingsType content_type, + ContentSetting setting) { + if (setting == CONTENT_SETTING_DEFAULT) + settings_.erase(content_type); + else + settings_[content_type] = setting; +} + +ContentSetting GlobalValueMap::GetContentSetting( + ContentSettingsType content_type) const { + auto it = settings_.find(content_type); + return it == settings_.end() ? CONTENT_SETTING_DEFAULT : it->second; +} + +} // namespace content_settings diff --git a/chromium/components/content_settings/core/browser/content_settings_binary_value_map.h b/chromium/components/content_settings/core/browser/content_settings_global_value_map.h index dbce8982bc1..99407a1ab08 100644 --- a/chromium/components/content_settings/core/browser/content_settings_binary_value_map.h +++ b/chromium/components/content_settings/core/browser/content_settings_global_value_map.h @@ -2,43 +2,42 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_BINARY_VALUE_MAP_H_ -#define COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_BINARY_VALUE_MAP_H_ +#ifndef COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_GLOBAL_VALUE_MAP_H_ +#define COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_GLOBAL_VALUE_MAP_H_ #include <map> #include "components/content_settings/core/browser/content_settings_provider.h" #include "components/content_settings/core/common/content_settings_types.h" -namespace base { -class AutoLock; -} // namespace base - namespace content_settings { class RuleIterator; -// A simplified value map that can be used to disable or enable the entire -// Content Setting. The default behaviour is enabling the Content Setting if -// it is not set explicitly. -class BinaryValueMap { +// A simplified value map that sets global content settings, i.e. applying to +// all sites. +// Note that this class does not do any synchronization. As content settings are +// accessed from multiple threads, it's the responsibility of the client to +// prevent concurrent access. +class GlobalValueMap { public: - BinaryValueMap(); - ~BinaryValueMap(); + GlobalValueMap(); + ~GlobalValueMap(); // Returns nullptr to indicate the RuleIterator is empty. std::unique_ptr<RuleIterator> GetRuleIterator( ContentSettingsType content_type, - const ResourceIdentifier& resource_identifier, - std::unique_ptr<base::AutoLock> lock) const; - void SetContentSettingDisabled(ContentSettingsType content_type, - bool disabled); - bool IsContentSettingEnabled(ContentSettingsType content_type) const; + const ResourceIdentifier& resource_identifier) const; + void SetContentSetting(ContentSettingsType content_type, + ContentSetting setting); + ContentSetting GetContentSetting(ContentSettingsType content_type) const; private: - std::map<ContentSettingsType, bool> is_enabled_; + std::map<ContentSettingsType, ContentSetting> settings_; + + DISALLOW_COPY_AND_ASSIGN(GlobalValueMap); }; } // namespace content_settings -#endif // COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_BINARY_VALUE_MAP_H_ +#endif // COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_GLOBAL_VALUE_MAP_H_ diff --git a/chromium/components/content_settings/core/browser/content_settings_info.h b/chromium/components/content_settings/core/browser/content_settings_info.h index b7018dfff52..d1eb3a58248 100644 --- a/chromium/components/content_settings/core/browser/content_settings_info.h +++ b/chromium/components/content_settings/core/browser/content_settings_info.h @@ -21,12 +21,14 @@ class ContentSettingsInfo { enum IncognitoBehavior { // Content setting will be inherited from regular to incognito profiles // as usual. + // TODO(dullweber): Remove as soon as INHERIT_IF_LESS_PERMISSIVE was tested. INHERIT_IN_INCOGNITO, - // Content setting will only partially inherit from regular to incognito - // profiles: BLOCK will inherit as usual, but ALLOW will become ASK. - // This is unusual, so seek privacy review before using this. - INHERIT_IN_INCOGNITO_EXCEPT_ALLOW + // Content settings can be inherited if the setting is less permissive + // than the initial default value of the content setting. Example: A setting + // with an initial value of ASK will be inherited if it is set to BLOCK or + // ASK but ALLOW will become ASK in incognito mode. + INHERIT_IF_LESS_PERMISSIVE }; // This object does not take ownership of |website_settings_info|. diff --git a/chromium/components/content_settings/core/browser/content_settings_policy_provider.cc b/chromium/components/content_settings/core/browser/content_settings_policy_provider.cc index 78a12a27a91..81a059b6e0d 100644 --- a/chromium/components/content_settings/core/browser/content_settings_policy_provider.cc +++ b/chromium/components/content_settings/core/browser/content_settings_policy_provider.cc @@ -55,11 +55,7 @@ const PrefsForManagedContentSettingsMapEntry {prefs::kManagedPopupsAllowedForUrls, CONTENT_SETTINGS_TYPE_POPUPS, CONTENT_SETTING_ALLOW}, {prefs::kManagedPopupsBlockedForUrls, CONTENT_SETTINGS_TYPE_POPUPS, - CONTENT_SETTING_BLOCK}, - {prefs::kManagedKeygenAllowedForUrls, - CONTENT_SETTINGS_TYPE_KEYGEN, CONTENT_SETTING_ALLOW}, - {prefs::kManagedKeygenBlockedForUrls, - CONTENT_SETTINGS_TYPE_KEYGEN, CONTENT_SETTING_BLOCK}}; + CONTENT_SETTING_BLOCK}}; } // namespace @@ -89,7 +85,6 @@ const PolicyProvider::PrefsForManagedDefaultMapEntry prefs::kManagedDefaultNotificationsSetting}, {CONTENT_SETTINGS_TYPE_PLUGINS, prefs::kManagedDefaultPluginsSetting}, {CONTENT_SETTINGS_TYPE_POPUPS, prefs::kManagedDefaultPopupsSetting}, - {CONTENT_SETTINGS_TYPE_KEYGEN, prefs::kManagedDefaultKeygenSetting}, {CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, prefs::kManagedDefaultWebBluetoothGuardSetting}, }; @@ -111,8 +106,6 @@ void PolicyProvider::RegisterProfilePrefs( registry->RegisterListPref(prefs::kManagedPluginsBlockedForUrls); registry->RegisterListPref(prefs::kManagedPopupsAllowedForUrls); registry->RegisterListPref(prefs::kManagedPopupsBlockedForUrls); - registry->RegisterListPref(prefs::kManagedKeygenAllowedForUrls); - registry->RegisterListPref(prefs::kManagedKeygenBlockedForUrls); // Preferences for default content setting policies. If a policy is not set of // the corresponding preferences below is set to CONTENT_SETTING_DEFAULT. registry->RegisterIntegerPref(prefs::kManagedDefaultCookiesSetting, @@ -131,8 +124,6 @@ void PolicyProvider::RegisterProfilePrefs( CONTENT_SETTING_DEFAULT); registry->RegisterIntegerPref(prefs::kManagedDefaultPopupsSetting, CONTENT_SETTING_DEFAULT); - registry->RegisterIntegerPref(prefs::kManagedDefaultKeygenSetting, - CONTENT_SETTING_DEFAULT); registry->RegisterIntegerPref(prefs::kManagedDefaultWebBluetoothGuardSetting, CONTENT_SETTING_DEFAULT); } @@ -162,8 +153,6 @@ PolicyProvider::PolicyProvider(PrefService* prefs) : prefs_(prefs) { pref_change_registrar_.Add(prefs::kManagedPluginsBlockedForUrls, callback); pref_change_registrar_.Add(prefs::kManagedPopupsAllowedForUrls, callback); pref_change_registrar_.Add(prefs::kManagedPopupsBlockedForUrls, callback); - pref_change_registrar_.Add(prefs::kManagedKeygenAllowedForUrls, callback); - pref_change_registrar_.Add(prefs::kManagedKeygenBlockedForUrls, callback); // The following preferences are only used to indicate if a default content // setting is managed and to hold the managed default setting value. If the // value for any of the following preferences is set then the corresponding @@ -182,7 +171,6 @@ PolicyProvider::PolicyProvider(PrefService* prefs) : prefs_(prefs) { prefs::kManagedDefaultMediaStreamSetting, callback); pref_change_registrar_.Add(prefs::kManagedDefaultPluginsSetting, callback); pref_change_registrar_.Add(prefs::kManagedDefaultPopupsSetting, callback); - pref_change_registrar_.Add(prefs::kManagedDefaultKeygenSetting, callback); pref_change_registrar_.Add(prefs::kManagedDefaultWebBluetoothGuardSetting, callback); } @@ -300,7 +288,7 @@ void PolicyProvider::GetAutoSelectCertificateSettingsFromPreferences( std::unique_ptr<base::Value> value = base::JSONReader::Read( pattern_filter_json, base::JSON_ALLOW_TRAILING_COMMAS); - if (!value || !value->IsType(base::Value::TYPE_DICTIONARY)) { + if (!value || !value->IsType(base::Value::Type::DICTIONARY)) { VLOG(1) << "Ignoring invalid certificate auto select setting. Reason:" " Invalid JSON object: " << pattern_filter_json; continue; @@ -428,9 +416,7 @@ void PolicyProvider::OnPreferenceChanged(const std::string& name) { name == prefs::kManagedPluginsAllowedForUrls || name == prefs::kManagedPluginsBlockedForUrls || name == prefs::kManagedPopupsAllowedForUrls || - name == prefs::kManagedPopupsBlockedForUrls || - name == prefs::kManagedKeygenAllowedForUrls || - name == prefs::kManagedKeygenBlockedForUrls) { + name == prefs::kManagedPopupsBlockedForUrls) { ReadManagedContentSettings(true); ReadManagedDefaultSettings(); } diff --git a/chromium/components/content_settings/core/browser/content_settings_pref.cc b/chromium/components/content_settings/core/browser/content_settings_pref.cc index e19199368aa..0306c586032 100644 --- a/chromium/components/content_settings/core/browser/content_settings_pref.cc +++ b/chromium/components/content_settings/core/browser/content_settings_pref.cc @@ -50,7 +50,7 @@ bool IsValueAllowedForType(const base::Value* value, ContentSettingsType type) { // TODO(raymes): We should permit different types of base::Value for // website settings. - return value->GetType() == base::Value::TYPE_DICTIONARY; + return value->GetType() == base::Value::Type::DICTIONARY; } } // namespace diff --git a/chromium/components/content_settings/core/browser/content_settings_pref.h b/chromium/components/content_settings/core/browser/content_settings_pref.h index aa2ab178e3d..d06fe01e28b 100644 --- a/chromium/components/content_settings/core/browser/content_settings_pref.h +++ b/chromium/components/content_settings/core/browser/content_settings_pref.h @@ -27,10 +27,6 @@ class Clock; class DictionaryValue; } -namespace user_prefs { -class PrefRegistrySyncable; -} - namespace content_settings { class RuleIterator; @@ -78,10 +74,6 @@ class ContentSettingsPref { bool TryLockForTesting() const; private: - // TODO(msramek): Currently only needed in the unittest to get the - // corresponding pref name. Remove once pref names are in WebsiteSettingsInfo. - friend class DeadlockCheckerObserver; - // Reads all content settings exceptions from the preference and loads them // into the |value_map_|. The |value_map_| is cleared first. void ReadContentSettingsFromPref(); diff --git a/chromium/components/content_settings/core/browser/content_settings_pref_provider.h b/chromium/components/content_settings/core/browser/content_settings_pref_provider.h index 16c88610fa3..0c08dfc1657 100644 --- a/chromium/components/content_settings/core/browser/content_settings_pref_provider.h +++ b/chromium/components/content_settings/core/browser/content_settings_pref_provider.h @@ -20,7 +20,6 @@ class PrefService; namespace base { class Clock; -class DictionaryValue; } namespace user_prefs { diff --git a/chromium/components/content_settings/core/browser/content_settings_provider.h b/chromium/components/content_settings/core/browser/content_settings_provider.h index 057ed81ba7e..3ee28c7d929 100644 --- a/chromium/components/content_settings/core/browser/content_settings_provider.h +++ b/chromium/components/content_settings/core/browser/content_settings_provider.h @@ -18,7 +18,6 @@ class ContentSettingsPattern; namespace content_settings { -struct Rule; class RuleIterator; class ProviderInterface { diff --git a/chromium/components/content_settings/core/browser/content_settings_registry.cc b/chromium/components/content_settings/core/browser/content_settings_registry.cc index b147dca2b92..917c6cc3348 100644 --- a/chromium/components/content_settings/core/browser/content_settings_registry.cc +++ b/chromium/components/content_settings/core/browser/content_settings_registry.cc @@ -125,7 +125,7 @@ void ContentSettingsRegistry::Init() { CONTENT_SETTING_SESSION_ONLY), WebsiteSettingsInfo::REQUESTING_DOMAIN_ONLY_SCOPE, WebsiteSettingsRegistry::ALL_PLATFORMS, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_IMAGES, "images", CONTENT_SETTING_ALLOW, WebsiteSettingsInfo::SYNCABLE, @@ -134,7 +134,7 @@ void ContentSettingsRegistry::Init() { ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK), WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_JAVASCRIPT, "javascript", CONTENT_SETTING_ALLOW, WebsiteSettingsInfo::SYNCABLE, @@ -144,7 +144,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_PLUGINS, "plugins", CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, @@ -155,7 +155,7 @@ void ContentSettingsRegistry::Init() { CONTENT_SETTING_DETECT_IMPORTANT_CONTENT), WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_POPUPS, "popups", CONTENT_SETTING_BLOCK, WebsiteSettingsInfo::SYNCABLE, @@ -164,7 +164,7 @@ void ContentSettingsRegistry::Init() { ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK), WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::ALL_PLATFORMS, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_GEOLOCATION, "geolocation", CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, @@ -174,7 +174,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, "notifications", CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, @@ -186,7 +186,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsRegistry::PLATFORM_ANDROID, // See also NotificationPermissionContext::DecidePermission which // implements additional incognito exceptions. - ContentSettingsInfo::INHERIT_IN_INCOGNITO_EXCEPT_ALLOW); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, "media-stream-mic", CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, @@ -196,7 +196,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, "media-stream-camera", CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, @@ -206,7 +206,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_PPAPI_BROKER, "ppapi-broker", CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, @@ -215,7 +215,7 @@ void ContentSettingsRegistry::Init() { CONTENT_SETTING_ASK), WebsiteSettingsInfo::REQUESTING_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, "automatic-downloads", CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, @@ -226,7 +226,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_MIDI_SYSEX, "midi-sysex", CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, WhitelistedSchemes(), @@ -235,7 +235,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, "protected-media-identifier", CONTENT_SETTING_ASK, @@ -245,7 +245,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE, WebsiteSettingsRegistry::PLATFORM_ANDROID | WebsiteSettingsRegistry::PLATFORM_CHROMEOS, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_DURABLE_STORAGE, "durable-storage", CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, @@ -254,15 +254,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); - - Register(CONTENT_SETTINGS_TYPE_KEYGEN, "keygen", CONTENT_SETTING_BLOCK, - WebsiteSettingsInfo::SYNCABLE, WhitelistedSchemes(), - ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK), - WebsiteSettingsInfo::REQUESTING_ORIGIN_ONLY_SCOPE, - WebsiteSettingsRegistry::DESKTOP | - WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC, "background-sync", CONTENT_SETTING_ALLOW, WebsiteSettingsInfo::UNSYNCABLE, @@ -271,7 +263,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_AUTOPLAY, "autoplay", CONTENT_SETTING_ALLOW, WebsiteSettingsInfo::UNSYNCABLE, WhitelistedSchemes(), @@ -279,7 +271,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); // Content settings that aren't used to store any data. TODO(raymes): use a // different mechanism rather than content settings to represent these. @@ -290,14 +282,14 @@ void ContentSettingsRegistry::Init() { WhitelistedSchemes(), ValidSettings(), WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, "mixed-script", CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE, WhitelistedSchemes(), ValidSettings(), WebsiteSettingsInfo::TOP_LEVEL_ORIGIN_ONLY_SCOPE, WebsiteSettingsRegistry::DESKTOP, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); Register(CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, "bluetooth-guard", CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, @@ -306,7 +298,7 @@ void ContentSettingsRegistry::Init() { WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE, WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, - ContentSettingsInfo::INHERIT_IN_INCOGNITO); + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE); } void ContentSettingsRegistry::Register( @@ -321,11 +313,6 @@ void ContentSettingsRegistry::Register( ContentSettingsInfo::IncognitoBehavior incognito_behavior) { // Ensure that nothing has been registered yet for the given type. DCHECK(!website_settings_registry_->Get(type)); - DCHECK(incognito_behavior != - ContentSettingsInfo::INHERIT_IN_INCOGNITO_EXCEPT_ALLOW || - base::ContainsKey(valid_settings, CONTENT_SETTING_ASK)) - << "If INHERIT_IN_INCOGNITO_EXCEPT_ALLOW is set, ASK must be listed as a " - "valid setting."; std::unique_ptr<base::Value> default_value( new base::FundamentalValue(static_cast<int>(initial_default_value))); const WebsiteSettingsInfo* website_settings_info = diff --git a/chromium/components/content_settings/core/browser/content_settings_registry_unittest.cc b/chromium/components/content_settings/core/browser/content_settings_registry_unittest.cc index bf595c44e03..d63d180e0bf 100644 --- a/chromium/components/content_settings/core/browser/content_settings_registry_unittest.cc +++ b/chromium/components/content_settings/core/browser/content_settings_registry_unittest.cc @@ -71,7 +71,7 @@ TEST_F(ContentSettingsRegistryTest, Properties) { // Check the other properties are populated correctly. EXPECT_TRUE(info->IsSettingValid(CONTENT_SETTING_SESSION_ONLY)); EXPECT_FALSE(info->IsSettingValid(CONTENT_SETTING_ASK)); - EXPECT_EQ(ContentSettingsInfo::INHERIT_IN_INCOGNITO, + EXPECT_EQ(ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, info->incognito_behavior()); // Check the WebsiteSettingsInfo is populated correctly. diff --git a/chromium/components/content_settings/core/browser/content_settings_utils.cc b/chromium/components/content_settings/core/browser/content_settings_utils.cc index 176c866beeb..9458bf5007e 100644 --- a/chromium/components/content_settings/core/browser/content_settings_utils.cc +++ b/chromium/components/content_settings/core/browser/content_settings_utils.cc @@ -37,6 +37,25 @@ static_assert(arraysize(kContentSettingsStringMapping) == "kContentSettingsToFromString should have " "CONTENT_SETTING_NUM_SETTINGS elements"); +// Content settings sorted from most to least permissive. The order is chosen +// to check if a permission grants more rights than another. This is intuitive +// for ALLOW, ASK and BLOCK. SESSION_ONLY and DETECT_IMPORTANT_CONTENT are never +// used in the same setting so their respective order is not important but both +// belong between ALLOW and ASK. DEFAULT should never be used and is therefore +// not part of this array. +const ContentSetting kContentSettingOrder[] = { + CONTENT_SETTING_ALLOW, + CONTENT_SETTING_SESSION_ONLY, + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, + CONTENT_SETTING_ASK, + CONTENT_SETTING_BLOCK +}; + +static_assert(arraysize(kContentSettingOrder) == + CONTENT_SETTING_NUM_SETTINGS - 1, + "kContentSettingOrder should have CONTENT_SETTING_NUM_SETTINGS-1" + "entries"); + } // namespace namespace content_settings { @@ -96,10 +115,8 @@ PatternPair ParsePatternString(const std::string& pattern_str) { } PatternPair pattern_pair; - pattern_pair.first = - ContentSettingsPattern::FromString(pattern_str_list[0]); - pattern_pair.second = - ContentSettingsPattern::FromString(pattern_str_list[1]); + pattern_pair.first = ContentSettingsPattern::FromString(pattern_str_list[0]); + pattern_pair.second = ContentSettingsPattern::FromString(pattern_str_list[1]); return pattern_pair; } @@ -158,4 +175,17 @@ void GetRendererContentSettingRules(const HostContentSettingsMap* map, &(rules->autoplay_rules)); } +bool IsMorePermissive(ContentSetting a, ContentSetting b) { + // Check whether |a| or |b| is reached first in kContentSettingOrder. + // If |a| is first, it means that |a| is more permissive than |b|. + for (ContentSetting setting : kContentSettingOrder) { + if (setting == b) + return false; + if (setting == a) + return true; + } + NOTREACHED(); + return true; +} + } // namespace content_settings diff --git a/chromium/components/content_settings/core/browser/content_settings_utils.h b/chromium/components/content_settings/core/browser/content_settings_utils.h index e3d5a4a171a..fdcaf0bc6fa 100644 --- a/chromium/components/content_settings/core/browser/content_settings_utils.h +++ b/chromium/components/content_settings/core/browser/content_settings_utils.h @@ -18,14 +18,10 @@ namespace base { class Value; } -class GURL; class HostContentSettingsMap; namespace content_settings { -class ProviderInterface; -class RuleIterator; - typedef std::pair<ContentSettingsPattern, ContentSettingsPattern> PatternPair; // Helper class to iterate over only the values in a map. @@ -86,6 +82,9 @@ std::unique_ptr<base::Value> ContentSettingToValue(ContentSetting setting); void GetRendererContentSettingRules(const HostContentSettingsMap* map, RendererContentSettingRules* rules); +// Returns true if setting |a| is more permissive than setting |b|. +bool IsMorePermissive(ContentSetting a, ContentSetting b); + } // namespace content_settings #endif // COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_UTILS_H_ diff --git a/chromium/components/content_settings/core/browser/content_settings_utils_unittest.cc b/chromium/components/content_settings/core/browser/content_settings_utils_unittest.cc index f51e46148e2..f38264b8b9a 100644 --- a/chromium/components/content_settings/core/browser/content_settings_utils_unittest.cc +++ b/chromium/components/content_settings/core/browser/content_settings_utils_unittest.cc @@ -12,6 +12,8 @@ #include "components/content_settings/core/test/content_settings_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" +namespace content_settings { + namespace { const char* const kContentSettingNames[] = { @@ -28,36 +30,34 @@ static_assert(arraysize(kContentSettingNames) == CONTENT_SETTING_NUM_SETTINGS, } // namespace TEST(ContentSettingsUtilsTest, ParsePatternString) { - content_settings::PatternPair pattern_pair; + PatternPair pattern_pair; - pattern_pair = content_settings::ParsePatternString(std::string()); + pattern_pair = ParsePatternString(std::string()); EXPECT_FALSE(pattern_pair.first.IsValid()); EXPECT_FALSE(pattern_pair.second.IsValid()); - pattern_pair = content_settings::ParsePatternString(","); + pattern_pair = ParsePatternString(","); EXPECT_FALSE(pattern_pair.first.IsValid()); EXPECT_FALSE(pattern_pair.second.IsValid()); - pattern_pair = content_settings::ParsePatternString("http://www.foo.com"); + pattern_pair = ParsePatternString("http://www.foo.com"); EXPECT_TRUE(pattern_pair.first.IsValid()); EXPECT_EQ(pattern_pair.second, ContentSettingsPattern::Wildcard()); // This inconsistency is to recover from some broken code. - pattern_pair = content_settings::ParsePatternString("http://www.foo.com,"); + pattern_pair = ParsePatternString("http://www.foo.com,"); EXPECT_TRUE(pattern_pair.first.IsValid()); EXPECT_FALSE(pattern_pair.second.IsValid()); - pattern_pair = content_settings::ParsePatternString( - "http://www.foo.com,http://www.bar.com"); + pattern_pair = ParsePatternString("http://www.foo.com,http://www.bar.com"); EXPECT_TRUE(pattern_pair.first.IsValid()); EXPECT_TRUE(pattern_pair.second.IsValid()); - pattern_pair = content_settings::ParsePatternString( - "http://www.foo.com,http://www.bar.com,"); + pattern_pair = ParsePatternString("http://www.foo.com,http://www.bar.com,"); EXPECT_FALSE(pattern_pair.first.IsValid()); EXPECT_FALSE(pattern_pair.second.IsValid()); - pattern_pair = content_settings::ParsePatternString( + pattern_pair = ParsePatternString( "http://www.foo.com,http://www.bar.com,http://www.error.com"); EXPECT_FALSE(pattern_pair.first.IsValid()); EXPECT_FALSE(pattern_pair.second.IsValid()); @@ -65,22 +65,77 @@ TEST(ContentSettingsUtilsTest, ParsePatternString) { TEST(ContentSettingsUtilsTest, ContentSettingsStringMap) { std::string setting_string = - content_settings::ContentSettingToString(CONTENT_SETTING_NUM_SETTINGS); + ContentSettingToString(CONTENT_SETTING_NUM_SETTINGS); EXPECT_TRUE(setting_string.empty()); for (size_t i = 0; i < arraysize(kContentSettingNames); ++i) { ContentSetting setting = static_cast<ContentSetting>(i); - setting_string = content_settings::ContentSettingToString(setting); + setting_string = ContentSettingToString(setting); EXPECT_EQ(kContentSettingNames[i], setting_string); ContentSetting converted_setting; if (i == 0) { - EXPECT_FALSE(content_settings::ContentSettingFromString( + EXPECT_FALSE(ContentSettingFromString( kContentSettingNames[i], &converted_setting)); } else { - EXPECT_TRUE(content_settings::ContentSettingFromString( + EXPECT_TRUE(ContentSettingFromString( kContentSettingNames[i], &converted_setting)); } EXPECT_EQ(setting, converted_setting); } } + +TEST(ContentSettingsUtilsTest, IsMorePermissive) { + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK)); + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_ALLOW, CONTENT_SETTING_ASK)); + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_ALLOW, CONTENT_SETTING_DETECT_IMPORTANT_CONTENT)); + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_ALLOW, CONTENT_SETTING_SESSION_ONLY)); + + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_SESSION_ONLY, CONTENT_SETTING_ASK)); + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_SESSION_ONLY, CONTENT_SETTING_BLOCK)); + + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, CONTENT_SETTING_ASK)); + EXPECT_TRUE(IsMorePermissive( + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, CONTENT_SETTING_BLOCK)); + + EXPECT_TRUE(IsMorePermissive(CONTENT_SETTING_ASK, CONTENT_SETTING_BLOCK)); + + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_BLOCK, CONTENT_SETTING_ALLOW)); + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_BLOCK, CONTENT_SETTING_DETECT_IMPORTANT_CONTENT)); + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_BLOCK, CONTENT_SETTING_SESSION_ONLY)); + EXPECT_FALSE(IsMorePermissive(CONTENT_SETTING_BLOCK, CONTENT_SETTING_ASK)); + + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_ASK, CONTENT_SETTING_ALLOW)); + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_ASK, CONTENT_SETTING_SESSION_ONLY)); + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_ASK, CONTENT_SETTING_DETECT_IMPORTANT_CONTENT)); + + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_SESSION_ONLY, CONTENT_SETTING_ALLOW)); + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, CONTENT_SETTING_ALLOW)); + + EXPECT_FALSE(IsMorePermissive( + CONTENT_SETTING_ALLOW, CONTENT_SETTING_ALLOW)); + + // Check that all possible ContentSettings except CONTENT_SETTING_DEFAULT are + // handled. + for (int i = 1; i < CONTENT_SETTING_NUM_SETTINGS; ++i) { + auto s = static_cast<ContentSetting>(i); + EXPECT_FALSE(IsMorePermissive(s, s)); + } +} + +} // namespace content_settings
\ No newline at end of file diff --git a/chromium/components/content_settings/core/browser/cookie_settings.cc b/chromium/components/content_settings/core/browser/cookie_settings.cc index b5db52bd258..9f616f4bbc9 100644 --- a/chromium/components/content_settings/core/browser/cookie_settings.cc +++ b/chromium/components/content_settings/core/browser/cookie_settings.cc @@ -58,18 +58,36 @@ ContentSetting CookieSettings::GetDefaultCookieSetting( bool CookieSettings::IsReadingCookieAllowed(const GURL& url, const GURL& first_party_url) const { - ContentSetting setting = GetCookieSetting(url, first_party_url, false, NULL); - return IsAllowed(setting); + ContentSetting reading_setting; + GetCookieSetting(url, first_party_url, nullptr, &reading_setting, + nullptr /* setting_cookie */); + return IsAllowed(reading_setting); } bool CookieSettings::IsSettingCookieAllowed(const GURL& url, const GURL& first_party_url) const { - ContentSetting setting = GetCookieSetting(url, first_party_url, true, NULL); - return IsAllowed(setting); + ContentSetting setting_setting; + GetCookieSetting(url, first_party_url, nullptr, nullptr /* reading_cookie */, + &setting_setting); + return IsAllowed(setting_setting); +} + +void CookieSettings::GetReadingAndSettingCookieAllowed( + const GURL& url, + const GURL& first_party_url, + bool* reading_cookie_allowed, + bool* setting_cookie_allowed) const { + ContentSetting reading_setting; + ContentSetting setting_setting; + GetCookieSetting(url, first_party_url, nullptr, &reading_setting, + &setting_setting); + *reading_cookie_allowed = IsAllowed(reading_setting); + *setting_cookie_allowed = IsAllowed(setting_setting); } bool CookieSettings::IsCookieSessionOnly(const GURL& origin) const { - ContentSetting setting = GetCookieSetting(origin, origin, true, NULL); + ContentSetting setting; + GetCookieSetting(origin, origin, nullptr, nullptr, &setting); DCHECK(IsValidSetting(setting)); return (setting == CONTENT_SETTING_SESSION_ONLY); } @@ -122,18 +140,29 @@ void CookieSettings::ShutdownOnUIThread() { pref_change_registrar_.RemoveAll(); } -ContentSetting CookieSettings::GetCookieSetting(const GURL& url, - const GURL& first_party_url, - bool setting_cookie, - SettingSource* source) const { +void CookieSettings::GetCookieSetting(const GURL& url, + const GURL& first_party_url, + content_settings::SettingSource* source, + ContentSetting* reading_cookie, + ContentSetting* setting_cookie) const { // Auto-allow in extensions or for WebUI embedded in a secure origin. - if (url.SchemeIsCryptographic() && first_party_url.SchemeIs(kChromeUIScheme)) - return CONTENT_SETTING_ALLOW; + if (first_party_url.SchemeIs(kChromeUIScheme) && + url.SchemeIsCryptographic()) { + if (reading_cookie) + *reading_cookie = CONTENT_SETTING_ALLOW; + if (setting_cookie) + *setting_cookie = CONTENT_SETTING_ALLOW; + return; + } #if BUILDFLAG(ENABLE_EXTENSIONS) - if (url.SchemeIs(kExtensionScheme) && - first_party_url.SchemeIs(kExtensionScheme)) { - return CONTENT_SETTING_ALLOW; + if (url.SchemeIs(extension_scheme_) && + first_party_url.SchemeIs(extension_scheme_)) { + if (reading_cookie) + *reading_cookie = CONTENT_SETTING_ALLOW; + if (setting_cookie) + *setting_cookie = CONTENT_SETTING_ALLOW; + return; } #endif @@ -147,26 +176,27 @@ ContentSetting CookieSettings::GetCookieSetting(const GURL& url, *source = info.source; // If no explicit exception has been made and third-party cookies are blocked - // by default, apply that rule. - if (info.primary_pattern.MatchesAllHosts() && - info.secondary_pattern.MatchesAllHosts() && - ShouldBlockThirdPartyCookies() && - !first_party_url.SchemeIs(extension_scheme_)) { - net::StaticCookiePolicy policy( - net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES); - int rv; - if (setting_cookie) - rv = policy.CanSetCookie(url, first_party_url); - else - rv = policy.CanGetCookies(url, first_party_url); - DCHECK_NE(net::ERR_IO_PENDING, rv); - if (rv != net::OK) - return CONTENT_SETTING_BLOCK; - } + // by default, apply CONTENT_SETTING_BLOCKED. + bool block_third = info.primary_pattern.MatchesAllHosts() && + info.secondary_pattern.MatchesAllHosts() && + ShouldBlockThirdPartyCookies() && + !first_party_url.SchemeIs(extension_scheme_); + net::StaticCookiePolicy policy( + net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES); // We should always have a value, at least from the default provider. DCHECK(value.get()); - return ValueToContentSetting(value.get()); + ContentSetting setting = ValueToContentSetting(value.get()); + if (reading_cookie) { + bool block = + block_third && policy.CanGetCookies(url, first_party_url) != net::OK; + *reading_cookie = block ? CONTENT_SETTING_BLOCK : setting; + } + if (setting_cookie) { + bool block = + block_third && policy.CanSetCookie(url, first_party_url) != net::OK; + *setting_cookie = block ? CONTENT_SETTING_BLOCK : setting; + } } CookieSettings::~CookieSettings() { diff --git a/chromium/components/content_settings/core/browser/cookie_settings.h b/chromium/components/content_settings/core/browser/cookie_settings.h index 26ffa8068ba..b1653f37a5a 100644 --- a/chromium/components/content_settings/core/browser/cookie_settings.h +++ b/chromium/components/content_settings/core/browser/cookie_settings.h @@ -17,7 +17,6 @@ #include "components/keyed_service/core/refcounted_keyed_service.h" #include "components/prefs/pref_change_registrar.h" -class ContentSettingsPattern; class GURL; class PrefService; @@ -37,7 +36,7 @@ class CookieSettings : public RefcountedKeyedService { // Returns the default content setting (CONTENT_SETTING_ALLOW, // CONTENT_SETTING_BLOCK, or CONTENT_SETTING_SESSION_ONLY) for cookies. If - // |provider_id| is not NULL, the id of the provider which provided the + // |provider_id| is not nullptr, the id of the provider which provided the // default setting is assigned to it. // // This may be called on any thread. @@ -57,6 +56,15 @@ class CookieSettings : public RefcountedKeyedService { bool IsSettingCookieAllowed(const GURL& url, const GURL& first_party_url) const; + // Gets the results from IsReadingCookieAllowed and IsSettingCookieAllowed in + // a performance efficient way. + // + // This may be called on any thread. + void GetReadingAndSettingCookieAllowed(const GURL& url, + const GURL& first_party_url, + bool* reading_cookie_allowed, + bool* setting_cookie_allowed) const; + // Returns true if the cookie set by a page identified by |url| should be // session only. Querying this only makes sense if |IsSettingCookieAllowed| // has returned true. @@ -66,7 +74,7 @@ class CookieSettings : public RefcountedKeyedService { // Returns all patterns with a non-default cookie setting, mapped to their // actual settings, in the precedence order of the setting rules. |settings| - // must be a non-NULL outparam. + // must be a non-nullptr outparam. // // This may be called on any thread. void GetCookieSettings(ContentSettingsForOneType* settings) const; @@ -95,11 +103,11 @@ class CookieSettings : public RefcountedKeyedService { void ShutdownOnUIThread() override; // A helper for applying third party cookie blocking rules. - ContentSetting GetCookieSetting( - const GURL& url, - const GURL& first_party_url, - bool setting_cookie, - content_settings::SettingSource* source) const; + void GetCookieSetting(const GURL& url, + const GURL& first_party_url, + content_settings::SettingSource* source, + ContentSetting* reading_cookie, + ContentSetting* setting_cookie) const; static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); diff --git a/chromium/components/content_settings/core/browser/cookie_settings_unittest.cc b/chromium/components/content_settings/core/browser/cookie_settings_unittest.cc index 79a2f7383c8..2299b95802a 100644 --- a/chromium/components/content_settings/core/browser/cookie_settings_unittest.cc +++ b/chromium/components/content_settings/core/browser/cookie_settings_unittest.cc @@ -4,10 +4,11 @@ #include "components/content_settings/core/browser/cookie_settings.h" +#include "base/message_loop/message_loop.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings_pattern.h" #include "components/content_settings/core/common/pref_names.h" -#include "components/pref_registry/testing_pref_service_syncable.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" #include "extensions/features/features.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -38,7 +39,11 @@ class CookieSettingsTest : public testing::Test { ~CookieSettingsTest() override { settings_map_->ShutdownOnUIThread(); } protected: - user_prefs::TestingPrefServiceSyncable prefs_; + // There must be a valid ThreadTaskRunnerHandle in HostContentSettingsMap's + // scope. + base::MessageLoop message_loop_; + + sync_preferences::TestingPrefServiceSyncable prefs_; scoped_refptr<HostContentSettingsMap> settings_map_; scoped_refptr<CookieSettings> cookie_settings_; const GURL kBlockedSite; diff --git a/chromium/components/content_settings/core/browser/host_content_settings_map.cc b/chromium/components/content_settings/core/browser/host_content_settings_map.cc index 1f29b5b4d15..4ebb241f384 100644 --- a/chromium/components/content_settings/core/browser/host_content_settings_map.cc +++ b/chromium/components/content_settings/core/browser/host_content_settings_map.cc @@ -14,6 +14,7 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/clock.h" #include "build/build_config.h" #include "components/content_settings/core/browser/content_settings_default_provider.h" @@ -36,6 +37,7 @@ #include "url/gurl.h" using content_settings::WebsiteSettingsInfo; +using content_settings::ContentSettingsInfo; namespace { @@ -97,30 +99,37 @@ std::unique_ptr<base::Value> ProcessIncognitoInheritanceBehavior( ContentSettingsType content_type, std::unique_ptr<base::Value> value) { // Website setting inheritance can be completely disallowed. - const content_settings::WebsiteSettingsInfo* website_settings_info = + const WebsiteSettingsInfo* website_settings_info = content_settings::WebsiteSettingsRegistry::GetInstance()->Get( content_type); if (website_settings_info && website_settings_info->incognito_behavior() == - content_settings::WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO) { + WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO) { return nullptr; } - // Content setting inheritance can be disabled for CONTENT_SETTING_ALLOW. - const content_settings::ContentSettingsInfo* content_settings_info = + // Content setting inheritance can be for settings, that are more permissive + // than the initial value of a content setting. + const ContentSettingsInfo* content_settings_info = content_settings::ContentSettingsRegistry::GetInstance()->Get( content_type); if (content_settings_info) { - if (content_settings_info->incognito_behavior() != - content_settings::ContentSettingsInfo:: - INHERIT_IN_INCOGNITO_EXCEPT_ALLOW) - return value; - ContentSetting setting = - content_settings::ValueToContentSetting(value.get()); - if (setting != CONTENT_SETTING_ALLOW) - return value; - DCHECK(content_settings_info->IsSettingValid(CONTENT_SETTING_ASK)); - return content_settings::ContentSettingToValue(CONTENT_SETTING_ASK); + ContentSettingsInfo::IncognitoBehavior behaviour = + content_settings_info->incognito_behavior(); + switch (behaviour) { + case ContentSettingsInfo::INHERIT_IN_INCOGNITO: + return value; + case ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE: + ContentSetting setting = + content_settings::ValueToContentSetting(value.get()); + const base::Value* initial_value = content_settings_info + ->website_settings_info()->initial_default_value(); + ContentSetting initial_setting = + content_settings::ValueToContentSetting(initial_value); + if (content_settings::IsMorePermissive(setting, initial_setting)) + return content_settings::ContentSettingToValue(initial_setting); + return value; + } } return value; @@ -153,12 +162,24 @@ content_settings::PatternPair GetPatternsFromScopingType( return patterns; } +content_settings::PatternPair GetPatternsForContentSettingsType( + const GURL& primary_url, + const GURL& secondary_url, + ContentSettingsType type) { + const WebsiteSettingsInfo* website_settings_info = + content_settings::WebsiteSettingsRegistry::GetInstance()->Get(type); + DCHECK(website_settings_info); + content_settings::PatternPair patterns = GetPatternsFromScopingType( + website_settings_info->scoping_type(), primary_url, secondary_url); + return patterns; +} + } // namespace HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, bool is_incognito_profile, bool is_guest_profile) - : + : RefcountedKeyedService(base::ThreadTaskRunnerHandle::Get()), #ifndef NDEBUG used_from_thread_id_(base::PlatformThread::CurrentId()), #endif @@ -189,7 +210,6 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, default_provider->AddObserver(this); content_settings_providers_[DEFAULT_PROVIDER] = std::move(default_provider); - MigrateKeygenSettings(); MigrateDomainScopedSettings(false); RecordExceptionMetrics(); } @@ -341,11 +361,8 @@ void HostContentSettingsMap::SetWebsiteSettingDefaultScope( ContentSettingsType content_type, const std::string& resource_identifier, std::unique_ptr<base::Value> value) { - const WebsiteSettingsInfo* info = - content_settings::WebsiteSettingsRegistry::GetInstance()->Get( - content_type); - content_settings::PatternPair patterns = GetPatternsFromScopingType( - info->scoping_type(), primary_url, secondary_url); + content_settings::PatternPair patterns = GetPatternsForContentSettingsType( + primary_url, secondary_url, content_type); ContentSettingsPattern primary_pattern = patterns.first; ContentSettingsPattern secondary_pattern = patterns.second; if (!primary_pattern.IsValid() || !secondary_pattern.IsValid()) @@ -377,11 +394,34 @@ void HostContentSettingsMap::SetWebsiteSettingCustomScope( NOTREACHED(); } +bool HostContentSettingsMap::CanSetNarrowestContentSetting( + const GURL& primary_url, + const GURL& secondary_url, + ContentSettingsType type) const { + content_settings::PatternPair patterns = + GetNarrowestPatterns(primary_url, secondary_url, type); + return patterns.first.IsValid() && patterns.second.IsValid(); +} + void HostContentSettingsMap::SetNarrowestContentSetting( const GURL& primary_url, const GURL& secondary_url, ContentSettingsType type, ContentSetting setting) { + content_settings::PatternPair patterns = + GetNarrowestPatterns(primary_url, secondary_url, type); + + if (!patterns.first.IsValid() || !patterns.second.IsValid()) + return; + + SetContentSettingCustomScope(patterns.first, patterns.second, type, + std::string(), setting); +} + +content_settings::PatternPair HostContentSettingsMap::GetNarrowestPatterns ( + const GURL& primary_url, + const GURL& secondary_url, + ContentSettingsType type) const { // Permission settings are specified via rules. There exists always at least // one rule for the default setting. Get the rule that currently defines // the permission for the given permission |type|. Then test whether the @@ -391,31 +431,29 @@ void HostContentSettingsMap::SetNarrowestContentSetting( content_settings::SettingInfo info; std::unique_ptr<base::Value> v = GetWebsiteSettingInternal( primary_url, secondary_url, type, std::string(), &info); - DCHECK_EQ(content_settings::SETTING_SOURCE_USER, info.source); - - const WebsiteSettingsInfo* website_settings_info = - content_settings::WebsiteSettingsRegistry::GetInstance()->Get(type); - content_settings::PatternPair patterns = GetPatternsFromScopingType( - website_settings_info->scoping_type(), primary_url, secondary_url); + if (info.source != content_settings::SETTING_SOURCE_USER) { + // Return an invalid pattern if the current setting is not a user setting + // and thus can't be changed. + return content_settings::PatternPair(); + } - ContentSettingsPattern narrow_primary = patterns.first; - ContentSettingsPattern narrow_secondary = patterns.second; + content_settings::PatternPair patterns = GetPatternsForContentSettingsType( + primary_url, secondary_url, type); ContentSettingsPattern::Relation r1 = info.primary_pattern.Compare(patterns.first); if (r1 == ContentSettingsPattern::PREDECESSOR) { - narrow_primary = info.primary_pattern; + patterns.first = info.primary_pattern; } else if (r1 == ContentSettingsPattern::IDENTITY) { ContentSettingsPattern::Relation r2 = info.secondary_pattern.Compare(patterns.second); DCHECK(r2 != ContentSettingsPattern::DISJOINT_ORDER_POST && r2 != ContentSettingsPattern::DISJOINT_ORDER_PRE); if (r2 == ContentSettingsPattern::PREDECESSOR) - narrow_secondary = info.secondary_pattern; + patterns.second = info.secondary_pattern; } - SetContentSettingCustomScope(narrow_primary, narrow_secondary, type, - std::string(), setting); + return patterns; } void HostContentSettingsMap::SetContentSettingCustomScope( @@ -450,15 +488,9 @@ void HostContentSettingsMap::SetContentSettingDefaultScope( ContentSettingsType content_type, const std::string& resource_identifier, ContentSetting setting) { - using content_settings::ContentSettingsInfo; - const ContentSettingsInfo* info = - content_settings::ContentSettingsRegistry::GetInstance()->Get( - content_type); - DCHECK(info); + content_settings::PatternPair patterns = GetPatternsForContentSettingsType( + primary_url, secondary_url, content_type); - content_settings::PatternPair patterns = - GetPatternsFromScopingType(info->website_settings_info()->scoping_type(), - primary_url, secondary_url); ContentSettingsPattern primary_pattern = patterns.first; ContentSettingsPattern secondary_pattern = patterns.second; if (!primary_pattern.IsValid() || !secondary_pattern.IsValid()) @@ -468,45 +500,6 @@ void HostContentSettingsMap::SetContentSettingDefaultScope( resource_identifier, setting); } -void HostContentSettingsMap::MigrateKeygenSettings() { - const content_settings::ContentSettingsInfo* info = - content_settings::ContentSettingsRegistry::GetInstance()->Get( - CONTENT_SETTINGS_TYPE_KEYGEN); - if (info) { - ContentSettingsForOneType settings; - GetSettingsForOneType(CONTENT_SETTINGS_TYPE_KEYGEN, std::string(), - &settings); - - for (const ContentSettingPatternSource& setting_entry : settings) { - // Migrate user preference settings only. - if (setting_entry.source != "preference") - continue; - // Migrate old-format settings only. - if (setting_entry.secondary_pattern != - ContentSettingsPattern::Wildcard()) { - GURL url(setting_entry.primary_pattern.ToString()); - // Pull out the value of the old-format setting. Only do this if the - // patterns are as we expect them to be, otherwise the setting will just - // be removed for safety. - ContentSetting content_setting = CONTENT_SETTING_DEFAULT; - if (setting_entry.primary_pattern == setting_entry.secondary_pattern && - url.is_valid()) { - content_setting = GetContentSetting( - url, url, CONTENT_SETTINGS_TYPE_KEYGEN, std::string()); - } - // Remove the old pattern. - SetContentSettingCustomScope(setting_entry.primary_pattern, - setting_entry.secondary_pattern, - CONTENT_SETTINGS_TYPE_KEYGEN, - std::string(), CONTENT_SETTING_DEFAULT); - // Set the new pattern. - SetContentSettingDefaultScope(url, GURL(), CONTENT_SETTINGS_TYPE_KEYGEN, - std::string(), content_setting); - } - } - } -} - void HostContentSettingsMap::MigrateDomainScopedSettings(bool after_sync) { DomainToOriginMigrationStatus status = static_cast<DomainToOriginMigrationStatus>( @@ -795,6 +788,7 @@ void HostContentSettingsMap::OnContentSettingChanged( } HostContentSettingsMap::~HostContentSettingsMap() { + DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(!prefs_); } diff --git a/chromium/components/content_settings/core/browser/host_content_settings_map.h b/chromium/components/content_settings/core/browser/host_content_settings_map.h index b3eea7fff6e..b74865acb39 100644 --- a/chromium/components/content_settings/core/browser/host_content_settings_map.h +++ b/chromium/components/content_settings/core/browser/host_content_settings_map.h @@ -26,7 +26,6 @@ #include "components/keyed_service/core/refcounted_keyed_service.h" #include "components/prefs/pref_change_registrar.h" -class ExtensionService; class GURL; class PrefService; @@ -39,6 +38,7 @@ namespace content_settings { class ObservableProvider; class ProviderInterface; class PrefProvider; +class RuleIterator; class TestUtils; } @@ -196,6 +196,13 @@ class HostContentSettingsMap : public content_settings::Observer, const std::string& resource_identifier, std::unique_ptr<base::Value> value); + // Check if a call to SetNarrowestContentSetting would succeed or if it would + // fail because of an invalid pattern. + bool CanSetNarrowestContentSetting( + const GURL& primary_url, + const GURL& secondary_url, + ContentSettingsType type) const; + // Sets the most specific rule that currently defines the setting for the // given content type. TODO(raymes): Remove this once all content settings // are scoped to origin scope. There is no scope more narrow than origin @@ -307,7 +314,6 @@ class HostContentSettingsMap : public content_settings::Observer, DomainToOriginMigrationStatus); FRIEND_TEST_ALL_PREFIXES(HostContentSettingsMapTest, MigrateDomainScopedSettings); - FRIEND_TEST_ALL_PREFIXES(HostContentSettingsMapTest, MigrateKeygenSettings); friend class content_settings::TestUtils; @@ -323,16 +329,6 @@ class HostContentSettingsMap : public content_settings::Observer, ContentSettingsType content_type, ProviderType* provider_type) const; - // Migrate Keygen settings which only use a primary pattern. Settings which - // only used a primary pattern were inconsistent in what they did with the - // secondary pattern. Some stored a ContentSettingsPattern::Wildcard() whereas - // others stored the same pattern twice. This function migrates all such - // settings to use ContentSettingsPattern::Wildcard(). This allows us to make - // the scoping code consistent across different settings. - // TODO(lshang): Remove this when clients have migrated (~M53). We should - // leave in some code to remove old-format settings for a long time. - void MigrateKeygenSettings(); - // Collect UMA data of exceptions. void RecordExceptionMetrics(); @@ -364,6 +360,11 @@ class HostContentSettingsMap : public content_settings::Observer, const std::string& resource_identifier, content_settings::SettingInfo* info) const; + content_settings::PatternPair GetNarrowestPatterns( + const GURL& primary_url, + const GURL& secondary_url, + ContentSettingsType type) const; + static std::unique_ptr<base::Value> GetContentSettingValueAndPatterns( const content_settings::ProviderInterface* provider, const GURL& primary_url, diff --git a/chromium/components/content_settings/core/browser/website_settings_info.cc b/chromium/components/content_settings/core/browser/website_settings_info.cc index 8ee4a329a27..e7932081bac 100644 --- a/chromium/components/content_settings/core/browser/website_settings_info.cc +++ b/chromium/components/content_settings/core/browser/website_settings_info.cc @@ -48,7 +48,7 @@ WebsiteSettingsInfo::WebsiteSettingsInfo( // TODO(raymes): We should migrate the underlying pref to be a dictionary // rather than an int. DCHECK(!initial_default_value_ || - initial_default_value_->IsType(base::Value::TYPE_INTEGER)); + initial_default_value_->IsType(base::Value::Type::INTEGER)); } WebsiteSettingsInfo::~WebsiteSettingsInfo() {} diff --git a/chromium/components/content_settings/core/common/BUILD.gn b/chromium/components/content_settings/core/common/BUILD.gn index a73d49ed145..42404221620 100644 --- a/chromium/components/content_settings/core/common/BUILD.gn +++ b/chromium/components/content_settings/core/common/BUILD.gn @@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//mojo/public/tools/bindings/mojom.gni") + static_library("common") { sources = [ "content_settings.cc", @@ -19,6 +21,7 @@ static_library("common") { deps = [ "//base", + "//mojo/public/cpp/bindings:struct_traits", "//net", "//url", ] @@ -39,3 +42,9 @@ source_set("unit_tests") { "//url", ] } + +mojom("mojo_bindings") { + sources = [ + "content_settings.mojom", + ] +} diff --git a/chromium/components/content_settings/core/common/DEPS b/chromium/components/content_settings/core/common/DEPS index 201d8c82fc0..4e501b277a1 100644 --- a/chromium/components/content_settings/core/common/DEPS +++ b/chromium/components/content_settings/core/common/DEPS @@ -1,4 +1,5 @@ include_rules = [ + "+mojo/public/cpp/bindings", "+net/base", "+testing", "+url", diff --git a/chromium/components/content_settings/core/common/OWNERS b/chromium/components/content_settings/core/common/OWNERS new file mode 100644 index 00000000000..ac44cd00686 --- /dev/null +++ b/chromium/components/content_settings/core/common/OWNERS @@ -0,0 +1,5 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS + +per-file *_struct_traits*.*=set noparent +per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS diff --git a/chromium/components/content_settings/core/common/content_settings.cc b/chromium/components/content_settings/core/common/content_settings.cc index 5e38200208a..5139efc6c54 100644 --- a/chromium/components/content_settings/core/common/content_settings.cc +++ b/chromium/components/content_settings/core/common/content_settings.cc @@ -52,7 +52,7 @@ ContentSettingsType kHistogramOrder[] = { CONTENT_SETTINGS_TYPE_APP_BANNER, CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE, - CONTENT_SETTINGS_TYPE_KEYGEN, + CONTENT_SETTINGS_TYPE_DEFAULT, // KEYGEN (removed) CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC, CONTENT_SETTINGS_TYPE_AUTOPLAY, diff --git a/chromium/components/content_settings/core/common/content_settings.h b/chromium/components/content_settings/core/common/content_settings.h index 3179ef324bf..c441e280eaa 100644 --- a/chromium/components/content_settings/core/common/content_settings.h +++ b/chromium/components/content_settings/core/common/content_settings.h @@ -18,6 +18,9 @@ // A Java counterpart will be generated for this enum. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.preferences.website // GENERATED_JAVA_CLASS_NAME_OVERRIDE: ContentSettingValues +// +// TODO(nigeltao): migrate the Java users of this enum to the mojom-generated +// enum. enum ContentSetting { CONTENT_SETTING_DEFAULT = 0, CONTENT_SETTING_ALLOW, diff --git a/chromium/components/content_settings/core/common/content_settings.mojom b/chromium/components/content_settings/core/common/content_settings.mojom new file mode 100644 index 00000000000..5c4c5d92a92 --- /dev/null +++ b/chromium/components/content_settings/core/common/content_settings.mojom @@ -0,0 +1,72 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module content_settings.mojom; + +// This mirrors the C++ type in content_settings_pattern.h. +struct PatternParts { + // Lowercase string of the URL scheme to match. This string is empty if the + // |is_scheme_wildcard| flag is set. + string scheme; + + // True if the scheme wildcard is set. + bool is_scheme_wildcard; + + // Normalized string that is either of the following: + // - IPv4 or IPv6 + // - hostname + // - domain + // - empty string if the |is_host_wildcard flag is set. + string host; + + // True if the domain wildcard is set. + bool has_domain_wildcard; + + // String with the port to match. This string is empty if the + // |is_port_wildcard| flag is set. + string port; + + // True if the port wildcard is set. + bool is_port_wildcard; + + // TODO(markusheintz): Needed for legacy reasons. Remove. Path + // specification. Only used for content settings pattern with a "file" + // scheme part. + string path; + + // True if the path wildcard is set. + bool is_path_wildcard; +}; + +// This mirrors the C++ type in content_settings_pattern.h. +struct ContentSettingsPattern { + PatternParts parts; + bool is_valid; +}; + +// This mirrors the C++ type in content_settings.h. +enum ContentSetting { + DEFAULT = 0, + ALLOW, + BLOCK, + ASK, + SESSION_ONLY, + DETECT_IMPORTANT_CONTENT +}; + +// This mirrors the C++ type in content_settings.h. +struct ContentSettingPatternSource { + ContentSettingsPattern primary_pattern; + ContentSettingsPattern secondary_pattern; + ContentSetting setting; + string source; + bool incognito; +}; + +// This mirrors the C++ type in content_settings.h. +struct RendererContentSettingRules { + array<ContentSettingPatternSource> image_rules; + array<ContentSettingPatternSource> script_rules; + array<ContentSettingPatternSource> autoplay_rules; +}; diff --git a/chromium/components/content_settings/core/common/content_settings.typemap b/chromium/components/content_settings/core/common/content_settings.typemap new file mode 100644 index 00000000000..200cd73767d --- /dev/null +++ b/chromium/components/content_settings/core/common/content_settings.typemap @@ -0,0 +1,27 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +deps = [ + "//components/content_settings/core/common", + "//mojo/public/cpp/bindings", +] +mojom = "//components/content_settings/core/common/content_settings.mojom" +public_deps = [ + "//components/content_settings/core/common", +] +public_headers = [ + "//components/content_settings/core/common/content_settings.h", + "//components/content_settings/core/common/content_settings_pattern.h", +] +sources = [ + "//components/content_settings/core/common/content_settings_struct_traits.cc", +] +traits_headers = [ "//components/content_settings/core/common/content_settings_struct_traits.h" ] +type_mappings = [ + "content_settings.mojom.PatternParts=::ContentSettingsPattern::PatternParts", + "content_settings.mojom.ContentSettingsPattern=::ContentSettingsPattern", + "content_settings.mojom.ContentSetting=::ContentSetting", + "content_settings.mojom.ContentSettingPatternSource=::ContentSettingPatternSource", + "content_settings.mojom.RendererContentSettingRules=::RendererContentSettingRules", +] diff --git a/chromium/components/content_settings/core/common/content_settings_pattern.h b/chromium/components/content_settings/core/common/content_settings_pattern.h index f0432f59930..7d6fc8d00dd 100644 --- a/chromium/components/content_settings/core/common/content_settings_pattern.h +++ b/chromium/components/content_settings/core/common/content_settings_pattern.h @@ -10,11 +10,16 @@ #include <string> #include "base/gtest_prod_util.h" +#include "mojo/public/cpp/bindings/struct_traits.h" class GURL; namespace content_settings { class PatternParser; + +namespace mojom { +class ContentSettingsPatternDataView; +} } // A pattern used in content setting rules. See |IsValid| for a description of @@ -216,7 +221,9 @@ class ContentSettingsPattern { private: friend class content_settings::PatternParser; - friend class ContentSettingsPatternSerializer; + friend struct mojo::StructTraits< + content_settings::mojom::ContentSettingsPatternDataView, + ContentSettingsPattern>; FRIEND_TEST_ALL_PREFIXES(ContentSettingsPatternParserTest, SerializePatterns); class Builder; diff --git a/chromium/components/content_settings/core/common/content_settings_struct_traits.cc b/chromium/components/content_settings/core/common/content_settings_struct_traits.cc new file mode 100644 index 00000000000..11ad9c92ed6 --- /dev/null +++ b/chromium/components/content_settings/core/common/content_settings_struct_traits.cc @@ -0,0 +1,104 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/content_settings/core/common/content_settings_struct_traits.h" + +namespace mojo { + +// static +bool StructTraits<content_settings::mojom::PatternPartsDataView, + ContentSettingsPattern::PatternParts>:: + Read(content_settings::mojom::PatternPartsDataView data, + ContentSettingsPattern::PatternParts* out) { + out->is_scheme_wildcard = data.is_scheme_wildcard(); + out->has_domain_wildcard = data.has_domain_wildcard(); + out->is_port_wildcard = data.is_port_wildcard(); + out->is_path_wildcard = data.is_path_wildcard(); + return data.ReadScheme(&out->scheme) && data.ReadHost(&out->host) && + data.ReadPort(&out->port) && data.ReadPath(&out->path); +} + +// static +bool StructTraits<content_settings::mojom::ContentSettingsPatternDataView, + ContentSettingsPattern>:: + Read(content_settings::mojom::ContentSettingsPatternDataView data, + ContentSettingsPattern* out) { + out->is_valid_ = data.is_valid(); + return data.ReadParts(&out->parts_); +} + +// static +content_settings::mojom::ContentSetting +EnumTraits<content_settings::mojom::ContentSetting, ContentSetting>::ToMojom( + ContentSetting setting) { + switch (setting) { + case CONTENT_SETTING_DEFAULT: + return content_settings::mojom::ContentSetting::DEFAULT; + case CONTENT_SETTING_ALLOW: + return content_settings::mojom::ContentSetting::ALLOW; + case CONTENT_SETTING_BLOCK: + return content_settings::mojom::ContentSetting::BLOCK; + case CONTENT_SETTING_ASK: + return content_settings::mojom::ContentSetting::ASK; + case CONTENT_SETTING_SESSION_ONLY: + return content_settings::mojom::ContentSetting::SESSION_ONLY; + case CONTENT_SETTING_DETECT_IMPORTANT_CONTENT: + return content_settings::mojom::ContentSetting::DETECT_IMPORTANT_CONTENT; + case CONTENT_SETTING_NUM_SETTINGS: + // CONTENT_SETTING_NUM_SETTINGS is a dummy enum value. + break; + } + NOTREACHED(); + return content_settings::mojom::ContentSetting::DEFAULT; +} + +// static +bool EnumTraits<content_settings::mojom::ContentSetting, ContentSetting>:: + FromMojom(content_settings::mojom::ContentSetting setting, + ContentSetting* out) { + switch (setting) { + case content_settings::mojom::ContentSetting::DEFAULT: + *out = CONTENT_SETTING_DEFAULT; + return true; + case content_settings::mojom::ContentSetting::ALLOW: + *out = CONTENT_SETTING_ALLOW; + return true; + case content_settings::mojom::ContentSetting::BLOCK: + *out = CONTENT_SETTING_BLOCK; + return true; + case content_settings::mojom::ContentSetting::ASK: + *out = CONTENT_SETTING_ASK; + return true; + case content_settings::mojom::ContentSetting::SESSION_ONLY: + *out = CONTENT_SETTING_SESSION_ONLY; + return true; + case content_settings::mojom::ContentSetting::DETECT_IMPORTANT_CONTENT: + *out = CONTENT_SETTING_DETECT_IMPORTANT_CONTENT; + return true; + } + return false; +} + +// static +bool StructTraits<content_settings::mojom::ContentSettingPatternSourceDataView, + ContentSettingPatternSource>:: + Read(content_settings::mojom::ContentSettingPatternSourceDataView data, + ContentSettingPatternSource* out) { + out->incognito = data.incognito(); + return data.ReadPrimaryPattern(&out->primary_pattern) && + data.ReadSecondaryPattern(&out->secondary_pattern) && + data.ReadSetting(&out->setting) && data.ReadSource(&out->source); +} + +// static +bool StructTraits<content_settings::mojom::RendererContentSettingRulesDataView, + RendererContentSettingRules>:: + Read(content_settings::mojom::RendererContentSettingRulesDataView data, + RendererContentSettingRules* out) { + return data.ReadImageRules(&out->image_rules) && + data.ReadScriptRules(&out->script_rules) && + data.ReadAutoplayRules(&out->autoplay_rules); +} + +} // namespace mojo diff --git a/chromium/components/content_settings/core/common/content_settings_struct_traits.h b/chromium/components/content_settings/core/common/content_settings_struct_traits.h new file mode 100644 index 00000000000..10c78efeafd --- /dev/null +++ b/chromium/components/content_settings/core/common/content_settings_struct_traits.h @@ -0,0 +1,142 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_STRUCT_TRAITS_H +#define COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_STRUCT_TRAITS_H + +#include <string> + +#include "components/content_settings/core/common/content_settings.h" +#include "components/content_settings/core/common/content_settings.mojom.h" +#include "mojo/public/cpp/bindings/enum_traits.h" +#include "mojo/public/cpp/bindings/struct_traits.h" + +namespace mojo { + +template <> +struct StructTraits<content_settings::mojom::PatternPartsDataView, + ContentSettingsPattern::PatternParts> { + static const std::string& scheme( + const ContentSettingsPattern::PatternParts& r) { + return r.scheme; + } + + static bool is_scheme_wildcard( + const ContentSettingsPattern::PatternParts& r) { + return r.is_scheme_wildcard; + } + + static const std::string& host( + const ContentSettingsPattern::PatternParts& r) { + return r.host; + } + + static bool has_domain_wildcard( + const ContentSettingsPattern::PatternParts& r) { + return r.has_domain_wildcard; + } + + static const std::string& port( + const ContentSettingsPattern::PatternParts& r) { + return r.port; + } + + static bool is_port_wildcard(const ContentSettingsPattern::PatternParts& r) { + return r.is_port_wildcard; + } + + static const std::string& path( + const ContentSettingsPattern::PatternParts& r) { + return r.path; + } + + static bool is_path_wildcard(const ContentSettingsPattern::PatternParts& r) { + return r.is_path_wildcard; + } + + static bool Read(content_settings::mojom::PatternPartsDataView data, + ContentSettingsPattern::PatternParts* out); +}; + +template <> +struct StructTraits<content_settings::mojom::ContentSettingsPatternDataView, + ContentSettingsPattern> { + static const ContentSettingsPattern::PatternParts& parts( + const ContentSettingsPattern& r) { + return r.parts_; + } + + static bool is_valid(const ContentSettingsPattern& r) { return r.is_valid_; } + + static bool Read(content_settings::mojom::ContentSettingsPatternDataView data, + ContentSettingsPattern* out); +}; + +template <> +struct EnumTraits<content_settings::mojom::ContentSetting, ContentSetting> { + static content_settings::mojom::ContentSetting ToMojom( + ContentSetting setting); + + static bool FromMojom(content_settings::mojom::ContentSetting setting, + ContentSetting* out); +}; + +template <> +struct StructTraits< + content_settings::mojom::ContentSettingPatternSourceDataView, + ContentSettingPatternSource> { + static const ContentSettingsPattern& primary_pattern( + const ContentSettingPatternSource& r) { + return r.primary_pattern; + } + + static const ContentSettingsPattern& secondary_pattern( + const ContentSettingPatternSource& r) { + return r.secondary_pattern; + } + + static ContentSetting setting(const ContentSettingPatternSource& r) { + return r.setting; + } + + static const std::string& source(const ContentSettingPatternSource& r) { + return r.source; + } + + static bool incognito(const ContentSettingPatternSource& r) { + return r.incognito; + } + + static bool Read( + content_settings::mojom::ContentSettingPatternSourceDataView data, + ContentSettingPatternSource* out); +}; + +template <> +struct StructTraits< + content_settings::mojom::RendererContentSettingRulesDataView, + RendererContentSettingRules> { + static const std::vector<ContentSettingPatternSource>& image_rules( + const RendererContentSettingRules& r) { + return r.image_rules; + } + + static const std::vector<ContentSettingPatternSource>& script_rules( + const RendererContentSettingRules& r) { + return r.script_rules; + } + + static const std::vector<ContentSettingPatternSource>& autoplay_rules( + const RendererContentSettingRules& r) { + return r.autoplay_rules; + } + + static bool Read( + content_settings::mojom::RendererContentSettingRulesDataView data, + RendererContentSettingRules* out); +}; + +} // namespace mojo + +#endif // COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_STRUCT_TRAITS_H diff --git a/chromium/components/content_settings/core/common/content_settings_types.h b/chromium/components/content_settings/core/common/content_settings_types.h index f4c8d73964d..f6814643385 100644 --- a/chromium/components/content_settings/core/common/content_settings_types.h +++ b/chromium/components/content_settings/core/common/content_settings_types.h @@ -40,7 +40,6 @@ enum ContentSettingsType { CONTENT_SETTINGS_TYPE_DURABLE_STORAGE, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA, CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, - CONTENT_SETTINGS_TYPE_KEYGEN, CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC, CONTENT_SETTINGS_TYPE_AUTOPLAY, CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT, diff --git a/chromium/components/content_settings/core/common/pref_names.cc b/chromium/components/content_settings/core/common/pref_names.cc index 36a7e628b32..08bb3112b88 100644 --- a/chromium/components/content_settings/core/common/pref_names.cc +++ b/chromium/components/content_settings/core/common/pref_names.cc @@ -42,8 +42,6 @@ const char kManagedDefaultPluginsSetting[] = "profile.managed_default_content_settings.plugins"; const char kManagedDefaultPopupsSetting[] = "profile.managed_default_content_settings.popups"; -const char kManagedDefaultKeygenSetting[] = - "profile.managed_default_content_settings.keygen"; const char kManagedDefaultWebBluetoothGuardSetting[] = "profile.managed_default_content_settings.web_bluetooth_guard"; @@ -77,9 +75,4 @@ const char kManagedPopupsAllowedForUrls[] = "profile.managed_popups_allowed_for_urls"; const char kManagedPopupsBlockedForUrls[] = "profile.managed_popups_blocked_for_urls"; -const char kManagedKeygenAllowedForUrls[] = - "profile.managed_keygen_allowed_for_urls"; -const char kManagedKeygenBlockedForUrls[] = - "profile.managed_keygen_blocked_for_urls"; - } // namespace prefs diff --git a/chromium/components/content_settings/core/common/pref_names.h b/chromium/components/content_settings/core/common/pref_names.h index 9ddbd4c882d..daf1b6cf1ad 100644 --- a/chromium/components/content_settings/core/common/pref_names.h +++ b/chromium/components/content_settings/core/common/pref_names.h @@ -26,7 +26,6 @@ extern const char kManagedDefaultPopupsSetting[]; extern const char kManagedDefaultGeolocationSetting[]; extern const char kManagedDefaultNotificationsSetting[]; extern const char kManagedDefaultMediaStreamSetting[]; -extern const char kManagedDefaultKeygenSetting[]; extern const char kManagedDefaultWebBluetoothGuardSetting[]; extern const char kManagedCookiesAllowedForUrls[]; @@ -43,8 +42,6 @@ extern const char kManagedPopupsBlockedForUrls[]; extern const char kManagedNotificationsAllowedForUrls[]; extern const char kManagedNotificationsBlockedForUrls[]; extern const char kManagedAutoSelectCertificateForUrls[]; -extern const char kManagedKeygenAllowedForUrls[]; -extern const char kManagedKeygenBlockedForUrls[]; } // namespace prefs |