1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/memory/scoped_ptr.h" 6 #include "base/message_loop/message_loop.h" 7 #include "base/prefs/pref_service.h" 8 #include "base/prefs/testing_pref_service.h" 9 #include "chrome/browser/content_settings/content_settings_default_provider.h" 10 #include "chrome/browser/content_settings/content_settings_mock_observer.h" 11 #include "chrome/browser/content_settings/content_settings_utils.h" 12 #include "chrome/common/pref_names.h" 13 #include "chrome/test/base/testing_profile.h" 14 #include "content/public/test/test_browser_thread.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "url/gurl.h" 17 18 using ::testing::_; 19 using content::BrowserThread; 20 21 class DefaultProviderTest : public testing::Test { 22 public: 23 DefaultProviderTest() 24 : ui_thread_(BrowserThread::UI, &message_loop_), 25 provider_(profile_.GetPrefs(), false) { 26 } 27 virtual ~DefaultProviderTest() { 28 provider_.ShutdownOnUIThread(); 29 } 30 31 protected: 32 base::MessageLoop message_loop_; 33 content::TestBrowserThread ui_thread_; 34 TestingProfile profile_; 35 content_settings::DefaultProvider provider_; 36 }; 37 38 TEST_F(DefaultProviderTest, DefaultValues) { 39 // Check setting defaults. 40 EXPECT_EQ(CONTENT_SETTING_ALLOW, 41 GetContentSetting(&provider_, 42 GURL(), 43 GURL(), 44 CONTENT_SETTINGS_TYPE_COOKIES, 45 std::string(), 46 false)); 47 provider_.SetWebsiteSetting( 48 ContentSettingsPattern::Wildcard(), 49 ContentSettingsPattern::Wildcard(), 50 CONTENT_SETTINGS_TYPE_COOKIES, 51 std::string(), 52 Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 53 EXPECT_EQ(CONTENT_SETTING_BLOCK, 54 GetContentSetting(&provider_, 55 GURL(), 56 GURL(), 57 CONTENT_SETTINGS_TYPE_COOKIES, 58 std::string(), 59 false)); 60 61 EXPECT_EQ(CONTENT_SETTING_ASK, 62 GetContentSetting(&provider_, 63 GURL(), 64 GURL(), 65 CONTENT_SETTINGS_TYPE_GEOLOCATION, 66 std::string(), 67 false)); 68 provider_.SetWebsiteSetting( 69 ContentSettingsPattern::Wildcard(), 70 ContentSettingsPattern::Wildcard(), 71 CONTENT_SETTINGS_TYPE_GEOLOCATION, 72 std::string(), 73 Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 74 EXPECT_EQ(CONTENT_SETTING_BLOCK, 75 GetContentSetting(&provider_, 76 GURL(), 77 GURL(), 78 CONTENT_SETTINGS_TYPE_GEOLOCATION, 79 std::string(), 80 false)); 81 82 scoped_ptr<base::Value> value( 83 GetContentSettingValue(&provider_, 84 GURL("http://example.com/"), 85 GURL("http://example.com/"), 86 CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, 87 std::string(), 88 false)); 89 EXPECT_FALSE(value.get()); 90 } 91 92 TEST_F(DefaultProviderTest, IgnoreNonDefaultSettings) { 93 GURL primary_url("http://www.google.com"); 94 GURL secondary_url("http://www.google.com"); 95 96 EXPECT_EQ(CONTENT_SETTING_ALLOW, 97 GetContentSetting(&provider_, 98 primary_url, 99 secondary_url, 100 CONTENT_SETTINGS_TYPE_COOKIES, 101 std::string(), 102 false)); 103 scoped_ptr<base::Value> value( 104 Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 105 bool owned = provider_.SetWebsiteSetting( 106 ContentSettingsPattern::FromURL(primary_url), 107 ContentSettingsPattern::FromURL(secondary_url), 108 CONTENT_SETTINGS_TYPE_COOKIES, 109 std::string(), 110 value.get()); 111 EXPECT_FALSE(owned); 112 EXPECT_EQ(CONTENT_SETTING_ALLOW, 113 GetContentSetting(&provider_, 114 primary_url, 115 secondary_url, 116 CONTENT_SETTINGS_TYPE_COOKIES, 117 std::string(), 118 false)); 119 } 120 121 TEST_F(DefaultProviderTest, Observer) { 122 content_settings::MockObserver mock_observer; 123 EXPECT_CALL(mock_observer, 124 OnContentSettingChanged( 125 _, _, CONTENT_SETTINGS_TYPE_IMAGES, "")); 126 provider_.AddObserver(&mock_observer); 127 provider_.SetWebsiteSetting( 128 ContentSettingsPattern::Wildcard(), 129 ContentSettingsPattern::Wildcard(), 130 CONTENT_SETTINGS_TYPE_IMAGES, 131 std::string(), 132 Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 133 134 EXPECT_CALL(mock_observer, 135 OnContentSettingChanged( 136 _, _, CONTENT_SETTINGS_TYPE_GEOLOCATION, "")); 137 provider_.SetWebsiteSetting( 138 ContentSettingsPattern::Wildcard(), 139 ContentSettingsPattern::Wildcard(), 140 CONTENT_SETTINGS_TYPE_GEOLOCATION, 141 std::string(), 142 Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 143 } 144 145 146 TEST_F(DefaultProviderTest, ObserveDefaultPref) { 147 PrefService* prefs = profile_.GetPrefs(); 148 149 // Make a copy of the default pref value so we can reset it later. 150 scoped_ptr<Value> default_value(prefs->FindPreference( 151 prefs::kDefaultContentSettings)->GetValue()->DeepCopy()); 152 153 provider_.SetWebsiteSetting( 154 ContentSettingsPattern::Wildcard(), 155 ContentSettingsPattern::Wildcard(), 156 CONTENT_SETTINGS_TYPE_COOKIES, 157 std::string(), 158 Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 159 EXPECT_EQ(CONTENT_SETTING_BLOCK, 160 GetContentSetting(&provider_, 161 GURL(), 162 GURL(), 163 CONTENT_SETTINGS_TYPE_COOKIES, 164 std::string(), 165 false)); 166 167 // Make a copy of the pref's new value so we can reset it later. 168 scoped_ptr<Value> new_value(prefs->FindPreference( 169 prefs::kDefaultContentSettings)->GetValue()->DeepCopy()); 170 171 // Clearing the backing pref should also clear the internal cache. 172 prefs->Set(prefs::kDefaultContentSettings, *default_value); 173 EXPECT_EQ(CONTENT_SETTING_ALLOW, 174 GetContentSetting(&provider_, 175 GURL(), 176 GURL(), 177 CONTENT_SETTINGS_TYPE_COOKIES, 178 std::string(), 179 false)); 180 // Reseting the pref to its previous value should update the cache. 181 prefs->Set(prefs::kDefaultContentSettings, *new_value); 182 EXPECT_EQ(CONTENT_SETTING_BLOCK, 183 GetContentSetting(&provider_, 184 GURL(), 185 GURL(), 186 CONTENT_SETTINGS_TYPE_COOKIES, 187 std::string(), 188 false)); 189 } 190 191 TEST_F(DefaultProviderTest, OffTheRecord) { 192 content_settings::DefaultProvider otr_provider(profile_.GetPrefs(), true); 193 194 EXPECT_EQ(CONTENT_SETTING_ALLOW, 195 GetContentSetting(&provider_, 196 GURL(), 197 GURL(), 198 CONTENT_SETTINGS_TYPE_COOKIES, 199 std::string(), 200 false)); 201 EXPECT_EQ(CONTENT_SETTING_ALLOW, 202 GetContentSetting(&otr_provider, 203 GURL(), 204 GURL(), 205 CONTENT_SETTINGS_TYPE_COOKIES, 206 std::string(), 207 true)); 208 209 // Changing content settings on the main provider should also affect the 210 // incognito map. 211 provider_.SetWebsiteSetting( 212 ContentSettingsPattern::Wildcard(), 213 ContentSettingsPattern::Wildcard(), 214 CONTENT_SETTINGS_TYPE_COOKIES, 215 std::string(), 216 Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 217 EXPECT_EQ(CONTENT_SETTING_BLOCK, 218 GetContentSetting(&provider_, 219 GURL(), 220 GURL(), 221 CONTENT_SETTINGS_TYPE_COOKIES, 222 std::string(), 223 false)); 224 225 EXPECT_EQ(CONTENT_SETTING_BLOCK, 226 GetContentSetting(&otr_provider, 227 GURL(), 228 GURL(), 229 CONTENT_SETTINGS_TYPE_COOKIES, 230 std::string(), 231 true)); 232 233 // Changing content settings on the incognito provider should be ignored. 234 scoped_ptr<base::Value> value( 235 Value::CreateIntegerValue(CONTENT_SETTING_ALLOW)); 236 bool owned = otr_provider.SetWebsiteSetting( 237 ContentSettingsPattern::Wildcard(), 238 ContentSettingsPattern::Wildcard(), 239 CONTENT_SETTINGS_TYPE_COOKIES, 240 std::string(), 241 value.get()); 242 EXPECT_FALSE(owned); 243 EXPECT_EQ(CONTENT_SETTING_BLOCK, 244 GetContentSetting(&provider_, 245 GURL(), 246 GURL(), 247 CONTENT_SETTINGS_TYPE_COOKIES, 248 std::string(), 249 false)); 250 251 EXPECT_EQ(CONTENT_SETTING_BLOCK, 252 GetContentSetting(&otr_provider, 253 GURL(), 254 GURL(), 255 CONTENT_SETTINGS_TYPE_COOKIES, 256 std::string(), 257 true)); 258 otr_provider.ShutdownOnUIThread(); 259 } 260