summaryrefslogtreecommitdiff
path: root/chromium/components/content_settings
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-05-16 09:59:13 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-05-20 10:28:53 +0000
commit6c11fb357ec39bf087b8b632e2b1e375aef1b38b (patch)
treec8315530db18a8ee566521c39ab8a6af4f72bc03 /chromium/components/content_settings
parent3ffaed019d0772e59d6cdb2d0d32fe4834c31f72 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/components/content_settings/core/browser/BUILD.gn3
-rw-r--r--chromium/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc4
-rw-r--r--chromium/components/content_settings/core/browser/content_settings_policy_provider.cc2
-rw-r--r--chromium/components/content_settings/core/browser/content_settings_pref.cc4
-rw-r--r--chromium/components/content_settings/core/browser/content_settings_pref_unittest.cc153
-rw-r--r--chromium/components/content_settings/core/browser/content_settings_registry.cc10
-rw-r--r--chromium/components/content_settings/core/browser/website_settings_registry.cc5
-rw-r--r--chromium/components/content_settings/core/common/content_settings.cc4
-rw-r--r--chromium/components/content_settings/core/common/content_settings_pattern_parser.cc10
-rw-r--r--chromium/components/content_settings/core/common/content_settings_pattern_parser_unittest.cc10
-rw-r--r--chromium/components/content_settings/core/common/content_settings_types.h7
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, &registrar,
+ 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,
};