diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-05-16 09:59:13 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-05-20 10:28:53 +0000 |
commit | 6c11fb357ec39bf087b8b632e2b1e375aef1b38b (patch) | |
tree | c8315530db18a8ee566521c39ab8a6af4f72bc03 /chromium/components/content_settings | |
parent | 3ffaed019d0772e59d6cdb2d0d32fe4834c31f72 (diff) | |
download | qtwebengine-chromium-6c11fb357ec39bf087b8b632e2b1e375aef1b38b.tar.gz |
BASELINE: Update Chromium to 74.0.3729.159
Change-Id: I8d2497da544c275415aedd94dd25328d555de811
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/components/content_settings')
11 files changed, 206 insertions, 6 deletions
diff --git a/chromium/components/content_settings/core/browser/BUILD.gn b/chromium/components/content_settings/core/browser/BUILD.gn index 8e6d992b5c9..1edbe265cee 100644 --- a/chromium/components/content_settings/core/browser/BUILD.gn +++ b/chromium/components/content_settings/core/browser/BUILD.gn @@ -76,6 +76,7 @@ jumbo_source_set("unit_tests") { testonly = true sources = [ "content_settings_ephemeral_provider_unittest.cc", + "content_settings_pref_unittest.cc", "content_settings_registry_unittest.cc", "content_settings_rule_unittest.cc", "content_settings_utils_unittest.cc", @@ -95,8 +96,10 @@ jumbo_source_set("unit_tests") { "//components/content_settings/core/test:test_support", "//components/pref_registry:pref_registry", "//components/prefs", + "//components/prefs:test_support", "//components/sync_preferences:test_support", "//extensions/buildflags", + "//testing/gmock", "//testing/gtest", "//url", ] diff --git a/chromium/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc b/chromium/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc index d45ed16dfcb..60836267296 100644 --- a/chromium/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc +++ b/chromium/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc @@ -82,9 +82,9 @@ bool OriginIdentifierValueMap::PatternPair::operator<( std::tie(other.primary_pattern, other.secondary_pattern); } -OriginIdentifierValueMap::ValueEntry::ValueEntry(){}; +OriginIdentifierValueMap::ValueEntry::ValueEntry() {} -OriginIdentifierValueMap::ValueEntry::~ValueEntry(){}; +OriginIdentifierValueMap::ValueEntry::~ValueEntry() {} std::unique_ptr<RuleIterator> OriginIdentifierValueMap::GetRuleIterator( ContentSettingsType content_type, 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 99b0c543c47..b3784368a93 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 @@ -322,7 +322,7 @@ void PolicyProvider::GetAutoSelectCertificateSettingsFromPreferences( continue; } - std::unique_ptr<base::Value> value = base::JSONReader::Read( + std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated( pattern_filter_json, base::JSON_ALLOW_TRAILING_COMMAS); if (!value || !value->is_dict()) { VLOG(1) << "Ignoring invalid certificate auto select setting. Reason:" 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 90facf52998..4e8ef3ac8df 100644 --- a/chromium/components/content_settings/core/browser/content_settings_pref.cc +++ b/chromium/components/content_settings/core/browser/content_settings_pref.cc @@ -404,7 +404,7 @@ void ContentSettingsPref::UpdatePref( value->CreateDeepCopy()); // Update timestamp for whole resource dictionary. settings_dictionary->SetKey(kLastModifiedPath, - base::Value(base::Int64ToString( + base::Value(base::NumberToString( last_modified.ToInternalValue()))); } } else { @@ -418,7 +418,7 @@ void ContentSettingsPref::UpdatePref( settings_dictionary->SetWithoutPathExpansion(kSettingPath, value->CreateDeepCopy()); settings_dictionary->SetKey(kLastModifiedPath, - base::Value(base::Int64ToString( + base::Value(base::NumberToString( last_modified.ToInternalValue()))); } } diff --git a/chromium/components/content_settings/core/browser/content_settings_pref_unittest.cc b/chromium/components/content_settings/core/browser/content_settings_pref_unittest.cc new file mode 100644 index 00000000000..652a041e4bc --- /dev/null +++ b/chromium/components/content_settings/core/browser/content_settings_pref_unittest.cc @@ -0,0 +1,153 @@ +// Copyright 2019 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_pref.h" +#include "components/content_settings/core/common/content_settings_pattern.h" + +#include "base/bind_helpers.h" +#include "base/stl_util.h" +#include "base/values.h" +#include "components/content_settings/core/browser/content_settings_utils.h" +#include "components/content_settings/core/common/content_settings_types.h" +#include "components/prefs/pref_change_registrar.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace content_settings { +namespace { + +// Test content setting pattern pairs in string format. The percent-encoded +// sequence "%61" should get canonicalized to the letter 'a'. +constexpr char kTestPatternCanonicalAlpha[] = "https://alpha.com,*"; +constexpr char kTestPatternNonCanonicalAlpha1[] = "https://%61lpha.com,*"; +constexpr char kTestPatternNonCanonicalAlpha2[] = "https://alph%61.com,*"; +constexpr char kTestPatternCanonicalBeta[] = "https://beta.com,*"; +constexpr char kTestPatternNonCanonicalBeta[] = "https://bet%61.com,*"; + +constexpr char kTestContentSettingPrefName[] = "content_settings.test"; + +constexpr char kLastModifiedKey[] = "last_modified"; +constexpr char kSettingKey[] = "setting"; +constexpr char kTagKey[] = "tag"; + +// Creates a JSON dictionary representing a dummy content setting exception +// value in preferences. The setting will be marked with the |tag| like so: +// +// value = { +// "last_modified": "...", +// "setting": { +// "tag": "...", +// } +// } +base::Value CreateDummyContentSettingValue(base::StringPiece tag) { + base::Value setting(base::Value::Type::DICTIONARY); + setting.SetKey(kTagKey, base::Value(tag)); + + base::Value pref_value(base::Value::Type::DICTIONARY); + pref_value.SetKey(kLastModifiedKey, base::Value("13189876543210000")); + pref_value.SetKey(kSettingKey, std::move(setting)); + return pref_value; +} + +// Given the JSON dictionary representing the "setting" stored under a content +// setting exception value, returns the tag. +std::string GetTagFromDummyContentSetting(const base::Value& setting) { + const auto* tag = setting.FindKey(kTagKey); + return tag ? tag->GetString() : std::string(); +} + +// Given the JSON dictionary representing a content setting exception value, +// returns the tag. +std::string GetTagFromDummyContentSettingValue(const base::Value& pref_value) { + const auto* setting = pref_value.FindKey(kSettingKey); + return setting ? GetTagFromDummyContentSetting(*setting) : std::string(); +} + +} // namespace + +TEST(ContentSettingsPref, CanonicalizationWhileReadingFromPrefs) { + // Canonical/non-canonical patterns originally in preferences. + constexpr const char* kTestOriginalPatterns[] = { + kTestPatternNonCanonicalAlpha1, + kTestPatternNonCanonicalAlpha2, + kTestPatternCanonicalBeta, + kTestPatternNonCanonicalBeta, + }; + + // Upon construction, ContentSettingPref reads all content setting exception + // data stored in Preferences for a given content setting. This process also + // has the side effect that it migrates all data keyed under non-canonical + // content setting pattern pairs to be keyed under the corresponding canoncial + // pattern pair, both in Preferences, as well as in ContentSettingPref's + // in-memory |value_map| representation. There are two edge cases here: + // + // 1) If multiple non-canonical patterns map to the same canonical pattern, + // the data for the last read pattern is retained, the rest thrown away. + // 2) We ignore and delete non-canonical pattern pairs if a canonical one + // already exists. + // + // With regard to the test data, NonCanonicalAlpha1 and NonCanonicalAlpha2 + // would both map to CanonicalAlpha, so the value for the latter should be + // retained. + // + // NonCanonicalBeta would be canonicalized to CanonicalBeta, but because there + // is already a value under that key, the latter should be retained and the + // non-canonical value thrown away. + using CanonicalPatternToTag = std::pair<std::string, std::string>; + const std::vector<CanonicalPatternToTag> kExpectedPatternsToTags = { + {kTestPatternCanonicalAlpha, kTestPatternNonCanonicalAlpha2}, + {kTestPatternCanonicalBeta, kTestPatternCanonicalBeta}, + }; + + auto original_pref_value = std::make_unique<base::DictionaryValue>(); + for (const auto* pattern : kTestOriginalPatterns) { + original_pref_value->SetKey(pattern, + CreateDummyContentSettingValue(pattern)); + } + + TestingPrefServiceSimple prefs; + prefs.registry()->RegisterDictionaryPref(kTestContentSettingPrefName); + prefs.SetUserPref(kTestContentSettingPrefName, + std::move(original_pref_value)); + + PrefChangeRegistrar registrar; + registrar.Init(&prefs); + ContentSettingsPref content_settings_pref( + CONTENT_SETTINGS_TYPE_MEDIA_ENGAGEMENT, &prefs, ®istrar, + kTestContentSettingPrefName, false, base::DoNothing()); + + // Verify that the |value_map| contains the expected content setting patterns + // and setting. + + std::vector<CanonicalPatternToTag> patterns_to_tags_in_memory; + auto rule_iterator = content_settings_pref.GetRuleIterator( + std::string() /* resource_identifier */, false /* is_incognito */); + while (rule_iterator->HasNext()) { + auto rule = rule_iterator->Next(); + patterns_to_tags_in_memory.emplace_back( + CreatePatternString(rule.primary_pattern, rule.secondary_pattern), + GetTagFromDummyContentSetting(rule.value)); + } + + EXPECT_THAT(patterns_to_tags_in_memory, + testing::UnorderedElementsAreArray(kExpectedPatternsToTags)); + + // Verify that Preferences do, as well. + + std::vector<CanonicalPatternToTag> patterns_to_tags_in_prefs; + const auto* canonical_pref_value = + prefs.GetUserPref(kTestContentSettingPrefName); + ASSERT_TRUE(canonical_pref_value->is_dict()); + for (const auto& key_value : canonical_pref_value->DictItems()) { + patterns_to_tags_in_prefs.emplace_back( + key_value.first, GetTagFromDummyContentSettingValue(key_value.second)); + } + + EXPECT_THAT(patterns_to_tags_in_prefs, + testing::UnorderedElementsAreArray(kExpectedPatternsToTags)); +} + +} // namespace content_settings 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 912fdeba281..03d0c89f73c 100644 --- a/chromium/components/content_settings/core/browser/content_settings_registry.cc +++ b/chromium/components/content_settings/core/browser/content_settings_registry.cc @@ -440,6 +440,16 @@ void ContentSettingsRegistry::Init() { ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, ContentSettingsInfo::PERSISTENT, ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY); + + Register(CONTENT_SETTINGS_TYPE_SERIAL_GUARD, "serial-guard", + CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, + WhitelistedSchemes(), + ValidSettings(CONTENT_SETTING_ASK, CONTENT_SETTING_BLOCK), + WebsiteSettingsInfo::SINGLE_ORIGIN_WITH_EMBEDDED_EXCEPTIONS_SCOPE, + WebsiteSettingsRegistry::DESKTOP, + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, + ContentSettingsInfo::PERSISTENT, + ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY); } void ContentSettingsRegistry::Register( diff --git a/chromium/components/content_settings/core/browser/website_settings_registry.cc b/chromium/components/content_settings/core/browser/website_settings_registry.cc index 052b8db744c..085efe9dc56 100644 --- a/chromium/components/content_settings/core/browser/website_settings_registry.cc +++ b/chromium/components/content_settings/core/browser/website_settings_registry.cc @@ -194,6 +194,11 @@ void WebsiteSettingsRegistry::Init() { WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY, WebsiteSettingsInfo::SINGLE_ORIGIN_WITH_EMBEDDED_EXCEPTIONS_SCOPE, DESKTOP, WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO); + Register(CONTENT_SETTINGS_TYPE_SERIAL_CHOOSER_DATA, "serial-chooser-data", + nullptr, WebsiteSettingsInfo::UNSYNCABLE, + WebsiteSettingsInfo::NOT_LOSSY, + WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE, + DESKTOP, WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO); } } // namespace content_settings diff --git a/chromium/components/content_settings/core/common/content_settings.cc b/chromium/components/content_settings/core/common/content_settings.cc index 28e51c015a5..cac5b0ca073 100644 --- a/chromium/components/content_settings/core/common/content_settings.cc +++ b/chromium/components/content_settings/core/common/content_settings.cc @@ -29,7 +29,7 @@ struct HistogramValue { // content settings type name instead. // // The array size must be explicit for the static_asserts below. -constexpr size_t kNumHistogramValues = 41; +constexpr size_t kNumHistogramValues = 43; constexpr HistogramValue kHistogramValue[kNumHistogramValues] = { {CONTENT_SETTINGS_TYPE_COOKIES, 0}, {CONTENT_SETTINGS_TYPE_IMAGES, 1}, @@ -72,6 +72,8 @@ constexpr HistogramValue kHistogramValue[kNumHistogramValues] = { {CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH, 45}, {CONTENT_SETTINGS_TYPE_INTENT_PICKER_DISPLAY, 46}, {CONTENT_SETTINGS_TYPE_IDLE_DETECTION, 47}, + {CONTENT_SETTINGS_TYPE_SERIAL_GUARD, 48}, + {CONTENT_SETTINGS_TYPE_SERIAL_CHOOSER_DATA, 49}, }; } // namespace diff --git a/chromium/components/content_settings/core/common/content_settings_pattern_parser.cc b/chromium/components/content_settings/core/common/content_settings_pattern_parser.cc index 00af1089513..7064c2b4c96 100644 --- a/chromium/components/content_settings/core/common/content_settings_pattern_parser.cc +++ b/chromium/components/content_settings/core/common/content_settings_pattern_parser.cc @@ -20,6 +20,10 @@ const char kPortWildcard[] = "*"; const char kSchemeWildcard[] = "*"; const char kUrlPathSeparator[] = "/"; const char kUrlPortSeparator[] = ":"; +// A domain wildcard pattern involves exactly one separating dot, +// inside the square brackets. This is a common misunderstanding of that +// pattern that we want to check for. See: https://crbug.com/823706. +const char kDomainWildcardWithSuperfluousDot[] = "[*.]."; } // namespace @@ -130,6 +134,12 @@ void PatternParser::Parse(base::StringPiece pattern_spec, return; } + if (base::StartsWith(host_piece, kDomainWildcardWithSuperfluousDot, + base::CompareCase::SENSITIVE)) { + builder->Invalid(); + return; + } + host_piece.remove_prefix(kDomainWildcardLength); builder->WithDomainWildcard(); builder->WithHost(host_piece.as_string()); diff --git a/chromium/components/content_settings/core/common/content_settings_pattern_parser_unittest.cc b/chromium/components/content_settings/core/common/content_settings_pattern_parser_unittest.cc index 20c7c7ac022..244db0108a7 100644 --- a/chromium/components/content_settings/core/common/content_settings_pattern_parser_unittest.cc +++ b/chromium/components/content_settings/core/common/content_settings_pattern_parser_unittest.cc @@ -150,6 +150,16 @@ TEST(ContentSettingsPatternParserTest, ParsePatterns) { ::testing::Return(&builder)); content_settings::PatternParser::Parse("www.youtube.com*", &builder); ::testing::Mock::VerifyAndClear(&builder); + + // Test for kDomainWildcardWithSuperfluousDot + EXPECT_CALL(builder, WithSchemeWildcard()) + .Times(1) + .WillOnce(::testing::Return(&builder)); + EXPECT_CALL(builder, Invalid()) + .Times(1) + .WillOnce(::testing::Return(&builder)); + content_settings::PatternParser::Parse("[*.].youtube.com", &builder); + ::testing::Mock::VerifyAndClear(&builder); } TEST(ContentSettingsPatternParserTest, ParseFilePatterns) { 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 17b6ab6df63..338fdd7ea5d 100644 --- a/chromium/components/content_settings/core/common/content_settings_types.h +++ b/chromium/components/content_settings/core/common/content_settings_types.h @@ -129,6 +129,13 @@ enum ContentSettingsType { // Used to store whether to allow a website to detect user active/idle state. CONTENT_SETTINGS_TYPE_IDLE_DETECTION, + // Content settings for access to serial ports. The "guard" content setting + // stores whether to allow sites to ask for permission to access a port. The + // permissions granted to access particular ports are stored in the "chooser + // data" website setting. + CONTENT_SETTINGS_TYPE_SERIAL_GUARD, + CONTENT_SETTINGS_TYPE_SERIAL_CHOOSER_DATA, + CONTENT_SETTINGS_NUM_TYPES, }; |