// Copyright (c) 2012 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 "base/auto_reset.h" #include "base/command_line.h" #include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/message_loop/message_loop.h" #include "base/prefs/pref_service.h" #include "base/prefs/scoped_user_pref_update.h" #include "chrome/browser/content_settings/content_settings_mock_observer.h" #include "chrome/browser/content_settings/cookie_settings.h" #include "chrome/browser/content_settings/mock_settings_observer.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/testing_pref_service_syncable.h" #include "chrome/test/base/testing_profile.h" #include "components/content_settings/core/browser/content_settings_details.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "content/public/test/test_browser_thread.h" #include "net/base/static_cookie_policy.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" using content::BrowserThread; using ::testing::_; class HostContentSettingsMapTest : public testing::Test { public: HostContentSettingsMapTest() : ui_thread_(BrowserThread::UI, &message_loop_) { } protected: base::MessageLoop message_loop_; content::TestBrowserThread ui_thread_; }; TEST_F(HostContentSettingsMapTest, DefaultValues) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); // Check setting defaults. EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_IMAGES, NULL)); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( GURL(chrome::kChromeUINewTabURL), GURL(chrome::kChromeUINewTabURL), CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ALLOW); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_DETECT_IMPORTANT_CONTENT); EXPECT_EQ(CONTENT_SETTING_DETECT_IMPORTANT_CONTENT, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_POPUPS, CONTENT_SETTING_ALLOW); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_POPUPS, NULL)); } TEST_F(HostContentSettingsMapTest, IndividualSettings) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); // Check returning individual settings. GURL host("http://example.com/"); ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_DEFAULT); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); // Check returning all settings for a host. host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_DEFAULT); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), CONTENT_SETTING_ALLOW); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_POPUPS, std::string())); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); EXPECT_EQ( CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string())); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string())); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string())); // Check returning all hosts for a setting. ContentSettingsPattern pattern2 = ContentSettingsPattern::FromString("[*.]example.org"); host_content_settings_map->SetContentSetting( pattern2, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->SetContentSetting( pattern2, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), CONTENT_SETTING_BLOCK); ContentSettingsForOneType host_settings; host_content_settings_map->GetSettingsForOneType( CONTENT_SETTINGS_TYPE_IMAGES, std::string(), &host_settings); // |host_settings| contains the default setting and an exception. EXPECT_EQ(2U, host_settings.size()); host_content_settings_map->GetSettingsForOneType( CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), &host_settings); // |host_settings| contains the default setting and 2 exceptions. EXPECT_EQ(3U, host_settings.size()); host_content_settings_map->GetSettingsForOneType( CONTENT_SETTINGS_TYPE_POPUPS, std::string(), &host_settings); // |host_settings| contains only the default setting. EXPECT_EQ(1U, host_settings.size()); } TEST_F(HostContentSettingsMapTest, Clear) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); // Check clearing one type. ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.org"); ContentSettingsPattern pattern2 = ContentSettingsPattern::FromString("[*.]example.net"); host_content_settings_map->SetContentSetting( pattern2, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->SetContentSetting( pattern2, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->ClearSettingsForOneType( CONTENT_SETTINGS_TYPE_IMAGES); ContentSettingsForOneType host_settings; host_content_settings_map->GetSettingsForOneType( CONTENT_SETTINGS_TYPE_IMAGES, std::string(), &host_settings); // |host_settings| contains only the default setting. EXPECT_EQ(1U, host_settings.size()); host_content_settings_map->GetSettingsForOneType( CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), &host_settings); // |host_settings| contains the default setting and an exception. EXPECT_EQ(2U, host_settings.size()); } TEST_F(HostContentSettingsMapTest, Patterns) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); GURL host1("http://example.com/"); GURL host2("http://www.example.com/"); GURL host3("http://example.org/"); ContentSettingsPattern pattern1 = ContentSettingsPattern::FromString("[*.]example.com"); ContentSettingsPattern pattern2 = ContentSettingsPattern::FromString("example.org"); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern1, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host2, host2, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern2, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); } TEST_F(HostContentSettingsMapTest, Observer) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); MockSettingsObserver observer(host_content_settings_map); ContentSettingsPattern primary_pattern = ContentSettingsPattern::FromString("[*.]example.com"); ContentSettingsPattern secondary_pattern = ContentSettingsPattern::Wildcard(); EXPECT_CALL(observer, OnContentSettingsChanged(host_content_settings_map, CONTENT_SETTINGS_TYPE_IMAGES, false, primary_pattern, secondary_pattern, false)); host_content_settings_map->SetContentSetting( primary_pattern, secondary_pattern, CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_ALLOW); ::testing::Mock::VerifyAndClearExpectations(&observer); EXPECT_CALL(observer, OnContentSettingsChanged(host_content_settings_map, CONTENT_SETTINGS_TYPE_IMAGES, false, _, _, true)); host_content_settings_map->ClearSettingsForOneType( CONTENT_SETTINGS_TYPE_IMAGES); ::testing::Mock::VerifyAndClearExpectations(&observer); EXPECT_CALL(observer, OnContentSettingsChanged(host_content_settings_map, CONTENT_SETTINGS_TYPE_IMAGES, false, _, _, true)); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); } TEST_F(HostContentSettingsMapTest, ObserveDefaultPref) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); PrefService* prefs = profile.GetPrefs(); // Make a copy of the default pref value so we can reset it later. scoped_ptr default_value(prefs->FindPreference( prefs::kDefaultContentSettings)->GetValue()->DeepCopy()); GURL host("http://example.com"); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Make a copy of the pref's new value so we can reset it later. scoped_ptr new_value(prefs->FindPreference( prefs::kDefaultContentSettings)->GetValue()->DeepCopy()); // Clearing the backing pref should also clear the internal cache. prefs->Set(prefs::kDefaultContentSettings, *default_value); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Reseting the pref to its previous value should update the cache. prefs->Set(prefs::kDefaultContentSettings, *new_value); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); } TEST_F(HostContentSettingsMapTest, ObserveExceptionPref) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); PrefService* prefs = profile.GetPrefs(); // Make a copy of the default pref value so we can reset it later. scoped_ptr default_value(prefs->FindPreference( prefs::kContentSettingsPatternPairs)->GetValue()->DeepCopy()); ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); GURL host("http://example.com"); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Make a copy of the pref's new value so we can reset it later. scoped_ptr new_value(prefs->FindPreference( prefs::kContentSettingsPatternPairs)->GetValue()->DeepCopy()); // Clearing the backing pref should also clear the internal cache. prefs->Set(prefs::kContentSettingsPatternPairs, *default_value); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Reseting the pref to its previous value should update the cache. prefs->Set(prefs::kContentSettingsPatternPairs, *new_value); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); } TEST_F(HostContentSettingsMapTest, HostTrimEndingDotCheck) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); CookieSettings* cookie_settings = CookieSettings::Factory::GetForProfile(&profile).get(); ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); GURL host_ending_with_dot("http://example.com./"); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_DEFAULT); EXPECT_EQ( CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting(host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ( CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting(host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_TRUE(cookie_settings->IsSettingCookieAllowed( host_ending_with_dot, host_ending_with_dot)); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), CONTENT_SETTING_DEFAULT); EXPECT_TRUE(cookie_settings->IsSettingCookieAllowed( host_ending_with_dot, host_ending_with_dot)); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_FALSE(cookie_settings->IsSettingCookieAllowed( host_ending_with_dot, host_ending_with_dot)); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string(), CONTENT_SETTING_DEFAULT); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), CONTENT_SETTING_DEFAULT); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); EXPECT_EQ( CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting(host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_POPUPS, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_POPUPS, std::string(), CONTENT_SETTING_DEFAULT); EXPECT_EQ( CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting(host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_POPUPS, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_POPUPS, std::string(), CONTENT_SETTING_ALLOW); EXPECT_EQ( CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting(host_ending_with_dot, host_ending_with_dot, CONTENT_SETTINGS_TYPE_POPUPS, std::string())); } TEST_F(HostContentSettingsMapTest, NestedSettings) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); GURL host("http://a.b.example.com/"); ContentSettingsPattern pattern1 = ContentSettingsPattern::FromString("[*.]example.com"); ContentSettingsPattern pattern2 = ContentSettingsPattern::FromString("[*.]b.example.com"); ContentSettingsPattern pattern3 = ContentSettingsPattern::FromString("a.b.example.com"); host_content_settings_map->SetContentSetting( pattern1, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->SetContentSetting( pattern2, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->SetContentSetting( pattern3, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), CONTENT_SETTING_BLOCK); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_COOKIES, std::string())); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_POPUPS, std::string())); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); EXPECT_EQ( CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string())); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string())); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string())); } TEST_F(HostContentSettingsMapTest, OffTheRecord) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); scoped_refptr otr_map( new HostContentSettingsMap(profile.GetPrefs(), true)); GURL host("http://example.com/"); ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_ALLOW, otr_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Changing content settings on the main map should also affect the // incognito map. host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_BLOCK, otr_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Changing content settings on the incognito map should NOT affect the // main map. otr_map->SetContentSetting(pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_ALLOW); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_ALLOW, otr_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); otr_map->ShutdownOnUIThread(); } // For a single Unicode encoded pattern, check if it gets converted to punycode // and old pattern gets deleted. TEST_F(HostContentSettingsMapTest, CanonicalizeExceptionsUnicodeOnly) { TestingProfile profile; PrefService* prefs = profile.GetPrefs(); // Set utf-8 data. { DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatternPairs); base::DictionaryValue* all_settings_dictionary = update.Get(); ASSERT_TRUE(NULL != all_settings_dictionary); base::DictionaryValue* dummy_payload = new base::DictionaryValue; dummy_payload->SetInteger("images", CONTENT_SETTING_ALLOW); all_settings_dictionary->SetWithoutPathExpansion("[*.]\xC4\x87ira.com,*", dummy_payload); } profile.GetHostContentSettingsMap(); const base::DictionaryValue* all_settings_dictionary = prefs->GetDictionary(prefs::kContentSettingsPatternPairs); const base::DictionaryValue* result = NULL; EXPECT_FALSE(all_settings_dictionary->GetDictionaryWithoutPathExpansion( "[*.]\xC4\x87ira.com,*", &result)); EXPECT_TRUE(all_settings_dictionary->GetDictionaryWithoutPathExpansion( "[*.]xn--ira-ppa.com,*", &result)); } // If both Unicode and its punycode pattern exist, make sure we don't touch the // settings for the punycode, and that Unicode pattern gets deleted. TEST_F(HostContentSettingsMapTest, CanonicalizeExceptionsUnicodeAndPunycode) { TestingProfile profile; scoped_ptr value(base::JSONReader::Read( "{\"[*.]\\xC4\\x87ira.com,*\":{\"images\":1}}")); profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *value); // Set punycode equivalent, with different setting. scoped_ptr puny_value(base::JSONReader::Read( "{\"[*.]xn--ira-ppa.com,*\":{\"images\":2}}")); profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *puny_value); // Initialize the content map. profile.GetHostContentSettingsMap(); const base::DictionaryValue* content_setting_prefs = profile.GetPrefs()->GetDictionary(prefs::kContentSettingsPatternPairs); std::string prefs_as_json; base::JSONWriter::Write(content_setting_prefs, &prefs_as_json); EXPECT_STREQ("{\"[*.]xn--ira-ppa.com,*\":{\"images\":2}}", prefs_as_json.c_str()); } // If a default-content-setting is managed, the managed value should be used // instead of the default value. TEST_F(HostContentSettingsMapTest, ManagedDefaultContentSetting) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); // Set managed-default-content-setting through the coresponding preferences. prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting, new base::FundamentalValue(CONTENT_SETTING_BLOCK)); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); // Remove managed-default-content-settings-preferences. prefs->RemoveManagedPref(prefs::kManagedDefaultJavaScriptSetting); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); // Set preference to manage the default-content-setting for Plugins. prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting, new base::FundamentalValue(CONTENT_SETTING_BLOCK)); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); // Remove the preference to manage the default-content-setting for Plugins. prefs->RemoveManagedPref(prefs::kManagedDefaultPluginsSetting); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); } TEST_F(HostContentSettingsMapTest, GetNonDefaultContentSettingsIfTypeManaged) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); // Set pattern for JavaScript setting. ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); GURL host("http://example.com/"); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); // Set managed-default-content-setting for content-settings-type JavaScript. prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting, new base::FundamentalValue(CONTENT_SETTING_ALLOW)); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); } // Managed default content setting should have higher priority // than user defined patterns. TEST_F(HostContentSettingsMapTest, ManagedDefaultContentSettingIgnoreUserPattern) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); // Block all JavaScript. host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); // Set an exception to allow "[*.]example.com" ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string(), CONTENT_SETTING_ALLOW); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); GURL host("http://example.com/"); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); // Set managed-default-content-settings-preferences. prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting, new base::FundamentalValue(CONTENT_SETTING_BLOCK)); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); // Remove managed-default-content-settings-preferences. prefs->RemoveManagedPref(prefs::kManagedDefaultJavaScriptSetting); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); } // If a default-content-setting is set to managed setting, the user defined // setting should be preserved. TEST_F(HostContentSettingsMapTest, OverwrittenDefaultContentSetting) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); // Set user defined default-content-setting for Cookies. host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_COOKIES, NULL)); // Set preference to manage the default-content-setting for Cookies. prefs->SetManagedPref(prefs::kManagedDefaultCookiesSetting, new base::FundamentalValue(CONTENT_SETTING_ALLOW)); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_COOKIES, NULL)); // Remove the preference to manage the default-content-setting for Cookies. prefs->RemoveManagedPref(prefs::kManagedDefaultCookiesSetting); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_COOKIES, NULL)); } // If a setting for a default-content-setting-type is set while the type is // managed, then the new setting should be preserved and used after the // default-content-setting-type is not managed anymore. TEST_F(HostContentSettingsMapTest, SettingDefaultContentSettingsWhenManaged) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting, new base::FundamentalValue(CONTENT_SETTING_ALLOW)); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); prefs->RemoveManagedPref(prefs::kManagedDefaultPluginsSetting); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); } TEST_F(HostContentSettingsMapTest, GetContentSetting) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); GURL host("http://example.com/"); GURL embedder("chrome://foo"); ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( embedder, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); } TEST_F(HostContentSettingsMapTest, ShouldAllowAllContent) { GURL http_host("http://example.com/"); GURL https_host("https://example.com/"); GURL embedder("chrome://foo"); GURL extension("chrome-extension://foo"); EXPECT_FALSE(HostContentSettingsMap::ShouldAllowAllContent( http_host, embedder, CONTENT_SETTINGS_TYPE_NOTIFICATIONS)); EXPECT_FALSE(HostContentSettingsMap::ShouldAllowAllContent( http_host, embedder, CONTENT_SETTINGS_TYPE_GEOLOCATION)); EXPECT_FALSE(HostContentSettingsMap::ShouldAllowAllContent( http_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES)); EXPECT_TRUE(HostContentSettingsMap::ShouldAllowAllContent( https_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES)); EXPECT_TRUE(HostContentSettingsMap::ShouldAllowAllContent( https_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES)); EXPECT_TRUE(HostContentSettingsMap::ShouldAllowAllContent( embedder, http_host, CONTENT_SETTINGS_TYPE_COOKIES)); #if defined(ENABLE_EXTENSIONS) EXPECT_TRUE(HostContentSettingsMap::ShouldAllowAllContent( extension, extension, CONTENT_SETTINGS_TYPE_COOKIES)); #else EXPECT_FALSE(HostContentSettingsMap::ShouldAllowAllContent( extension, extension, CONTENT_SETTINGS_TYPE_COOKIES)); #endif EXPECT_FALSE(HostContentSettingsMap::ShouldAllowAllContent( extension, extension, CONTENT_SETTINGS_TYPE_PLUGINS)); EXPECT_FALSE(HostContentSettingsMap::ShouldAllowAllContent( extension, http_host, CONTENT_SETTINGS_TYPE_COOKIES)); } TEST_F(HostContentSettingsMapTest, IsSettingAllowedForType) { TestingProfile profile; PrefService* prefs = profile.GetPrefs(); EXPECT_TRUE(HostContentSettingsMap::IsSettingAllowedForType( prefs, CONTENT_SETTING_ASK, CONTENT_SETTINGS_TYPE_FULLSCREEN)); // TODO(msramek): Add more checks for setting type - setting pairs where // it is not obvious whether or not they are allowed. } TEST_F(HostContentSettingsMapTest, AddContentSettingsObserver) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); content_settings::MockObserver mock_observer; GURL host("http://example.com/"); ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); EXPECT_CALL(mock_observer, OnContentSettingChanged(pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, "")); host_content_settings_map->AddObserver(&mock_observer); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, std::string(), CONTENT_SETTING_DEFAULT); } TEST_F(HostContentSettingsMapTest, OverrideAllowedWebsiteSetting) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); GURL host("http://example.com/"); ContentSettingsPattern pattern = ContentSettingsPattern::FromString("[*.]example.com"); host_content_settings_map->SetContentSetting( pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string(), CONTENT_SETTING_ALLOW); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); // Disabling should override an allowed exception. host_content_settings_map->SetContentSettingOverride( CONTENT_SETTINGS_TYPE_GEOLOCATION, false); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); host_content_settings_map->SetContentSettingOverride( CONTENT_SETTINGS_TYPE_GEOLOCATION, true); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); } TEST_F(HostContentSettingsMapTest, OverrideAllowedDefaultSetting) { TestingProfile profile; HostContentSettingsMap* host_content_settings_map = profile.GetHostContentSettingsMap(); // Check setting defaults. EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetDefaultContentSetting( CONTENT_SETTINGS_TYPE_IMAGES, NULL)); GURL host("http://example.com/"); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Disabling should override an allowed default setting. host_content_settings_map->SetContentSettingOverride( CONTENT_SETTINGS_TYPE_IMAGES, false); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); // Enabling shouldn't override positively. host_content_settings_map->SetContentSettingOverride( CONTENT_SETTINGS_TYPE_IMAGES, true); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); host_content_settings_map->SetDefaultContentSetting( CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); }