1 // Copyright (c) 2012 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/strings/string16.h" 6 #include "base/strings/utf_string_conversions.h" 7 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 8 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 9 #include "chrome/test/base/testing_profile.h" 10 #include "content/public/test/test_browser_thread.h" 11 #include "net/cookies/canonical_cookie.h" 12 #include "net/cookies/cookie_options.h" 13 #include "net/cookies/parsed_cookie.h" 14 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 17 using content::BrowserThread; 18 19 namespace { 20 21 class MockSiteDataObserver 22 : public TabSpecificContentSettings::SiteDataObserver { 23 public: 24 explicit MockSiteDataObserver( 25 TabSpecificContentSettings* tab_specific_content_settings) 26 : SiteDataObserver(tab_specific_content_settings) { 27 } 28 29 virtual ~MockSiteDataObserver() {} 30 31 MOCK_METHOD0(OnSiteDataAccessed, void()); 32 33 private: 34 DISALLOW_COPY_AND_ASSIGN(MockSiteDataObserver); 35 }; 36 37 } // namespace 38 39 class TabSpecificContentSettingsTest : public ChromeRenderViewHostTestHarness { 40 public: 41 virtual void SetUp() OVERRIDE { 42 ChromeRenderViewHostTestHarness::SetUp(); 43 TabSpecificContentSettings::CreateForWebContents(web_contents()); 44 } 45 }; 46 47 TEST_F(TabSpecificContentSettingsTest, BlockedContent) { 48 TabSpecificContentSettings* content_settings = 49 TabSpecificContentSettings::FromWebContents(web_contents()); 50 net::CookieOptions options; 51 52 // Check that after initializing, nothing is blocked. 53 EXPECT_FALSE( 54 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES)); 55 EXPECT_FALSE( 56 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT)); 57 EXPECT_FALSE( 58 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS)); 59 EXPECT_FALSE( 60 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 61 EXPECT_FALSE( 62 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS)); 63 EXPECT_FALSE(content_settings->IsContentBlocked( 64 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 65 EXPECT_FALSE(content_settings->IsContentBlocked( 66 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 67 68 // Set a cookie, block access to images, block mediastream access and block a 69 // popup. 70 content_settings->OnCookieChanged(GURL("http://google.com"), 71 GURL("http://google.com"), 72 "A=B", 73 options, 74 false); 75 content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES, 76 std::string()); 77 content_settings->SetPopupsBlocked(true); 78 content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 79 std::string()); 80 content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 81 std::string()); 82 83 // Check that only the respective content types are affected. 84 EXPECT_TRUE(content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES)); 85 EXPECT_FALSE( 86 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT)); 87 EXPECT_FALSE( 88 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS)); 89 EXPECT_FALSE( 90 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 91 EXPECT_TRUE(content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS)); 92 EXPECT_TRUE(content_settings->IsContentBlocked( 93 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 94 EXPECT_TRUE(content_settings->IsContentBlocked( 95 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 96 content_settings->OnCookieChanged(GURL("http://google.com"), 97 GURL("http://google.com"), 98 "A=B", 99 options, 100 false); 101 102 // Block a cookie. 103 content_settings->OnCookieChanged(GURL("http://google.com"), 104 GURL("http://google.com"), 105 "C=D", 106 options, 107 true); 108 EXPECT_TRUE( 109 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 110 111 // Reset blocked content settings. 112 content_settings->ClearBlockedContentSettingsExceptForCookies(); 113 EXPECT_FALSE( 114 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES)); 115 EXPECT_FALSE( 116 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT)); 117 EXPECT_FALSE( 118 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS)); 119 EXPECT_TRUE( 120 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 121 EXPECT_FALSE( 122 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS)); 123 EXPECT_FALSE(content_settings->IsContentBlocked( 124 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 125 EXPECT_FALSE(content_settings->IsContentBlocked( 126 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 127 128 content_settings->ClearCookieSpecificContentSettings(); 129 EXPECT_FALSE( 130 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES)); 131 EXPECT_FALSE( 132 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT)); 133 EXPECT_FALSE( 134 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS)); 135 EXPECT_FALSE( 136 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 137 EXPECT_FALSE( 138 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS)); 139 EXPECT_FALSE(content_settings->IsContentBlocked( 140 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 141 EXPECT_FALSE(content_settings->IsContentBlocked( 142 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 143 } 144 145 TEST_F(TabSpecificContentSettingsTest, BlockedFileSystems) { 146 TabSpecificContentSettings* content_settings = 147 TabSpecificContentSettings::FromWebContents(web_contents()); 148 149 // Access a file system. 150 content_settings->OnFileSystemAccessed(GURL("http://google.com"), false); 151 EXPECT_FALSE( 152 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 153 154 // Block access to a file system. 155 content_settings->OnFileSystemAccessed(GURL("http://google.com"), true); 156 EXPECT_TRUE( 157 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 158 } 159 160 TEST_F(TabSpecificContentSettingsTest, AllowedContent) { 161 TabSpecificContentSettings* content_settings = 162 TabSpecificContentSettings::FromWebContents(web_contents()); 163 net::CookieOptions options; 164 165 // Test default settings. 166 ASSERT_FALSE( 167 content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_IMAGES)); 168 ASSERT_FALSE( 169 content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES)); 170 ASSERT_FALSE( 171 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 172 ASSERT_FALSE(content_settings->IsContentAllowed( 173 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 174 ASSERT_FALSE(content_settings->IsContentAllowed( 175 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 176 177 // Record a cookie. 178 content_settings->OnCookieChanged(GURL("http://google.com"), 179 GURL("http://google.com"), 180 "A=B", 181 options, 182 false); 183 ASSERT_TRUE( 184 content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES)); 185 ASSERT_FALSE( 186 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 187 188 // Record a blocked cookie. 189 content_settings->OnCookieChanged(GURL("http://google.com"), 190 GURL("http://google.com"), 191 "C=D", 192 options, 193 true); 194 ASSERT_TRUE( 195 content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES)); 196 ASSERT_TRUE( 197 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 198 199 200 ASSERT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED, 201 content_settings->GetMicrophoneCameraState()); 202 203 // Access microphone. 204 content_settings->OnMicrophoneAccessed(); 205 ASSERT_TRUE(content_settings->IsContentAllowed( 206 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 207 ASSERT_FALSE(content_settings->IsContentBlocked( 208 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 209 ASSERT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED, 210 content_settings->GetMicrophoneCameraState()); 211 212 // Allow mediastream access. 213 content_settings->OnCameraAccessed(); 214 ASSERT_TRUE(content_settings->IsContentAllowed( 215 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 216 ASSERT_FALSE(content_settings->IsContentBlocked( 217 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 218 ASSERT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED, 219 content_settings->GetMicrophoneCameraState()); 220 221 // Allow mediastream microphone access. 222 content_settings->OnMicrophoneAccessBlocked(); 223 ASSERT_FALSE(content_settings->IsContentAllowed( 224 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 225 ASSERT_TRUE(content_settings->IsContentBlocked( 226 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 227 228 // Allow mediastream camera access. 229 content_settings->OnCameraAccessBlocked(); 230 ASSERT_FALSE(content_settings->IsContentAllowed( 231 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 232 ASSERT_TRUE(content_settings->IsContentBlocked( 233 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 234 235 236 // Record a blocked mediastream microphone access request. 237 content_settings->OnMicrophoneAccessBlocked(); 238 ASSERT_FALSE(content_settings->IsContentAllowed( 239 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 240 ASSERT_TRUE(content_settings->IsContentBlocked( 241 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); 242 243 // Record a blocked mediastream microphone access request. 244 content_settings->OnCameraAccessBlocked(); 245 ASSERT_FALSE(content_settings->IsContentAllowed( 246 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 247 ASSERT_TRUE(content_settings->IsContentBlocked( 248 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); 249 } 250 251 TEST_F(TabSpecificContentSettingsTest, EmptyCookieList) { 252 TabSpecificContentSettings* content_settings = 253 TabSpecificContentSettings::FromWebContents(web_contents()); 254 255 ASSERT_FALSE( 256 content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES)); 257 ASSERT_FALSE( 258 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 259 content_settings->OnCookiesRead(GURL("http://google.com"), 260 GURL("http://google.com"), 261 net::CookieList(), 262 true); 263 ASSERT_FALSE( 264 content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES)); 265 ASSERT_FALSE( 266 content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES)); 267 } 268 269 TEST_F(TabSpecificContentSettingsTest, SiteDataObserver) { 270 TabSpecificContentSettings* content_settings = 271 TabSpecificContentSettings::FromWebContents(web_contents()); 272 MockSiteDataObserver mock_observer(content_settings); 273 EXPECT_CALL(mock_observer, OnSiteDataAccessed()).Times(6); 274 275 bool blocked_by_policy = false; 276 content_settings->OnCookieChanged(GURL("http://google.com"), 277 GURL("http://google.com"), 278 "A=B", 279 net::CookieOptions(), 280 blocked_by_policy); 281 net::CookieList cookie_list; 282 scoped_ptr<net::CanonicalCookie> cookie( 283 net::CanonicalCookie::Create(GURL("http://google.com"), 284 "CookieName=CookieValue", 285 base::Time::Now(), net::CookieOptions())); 286 287 cookie_list.push_back(*cookie); 288 content_settings->OnCookiesRead(GURL("http://google.com"), 289 GURL("http://google.com"), 290 cookie_list, 291 blocked_by_policy); 292 content_settings->OnFileSystemAccessed(GURL("http://google.com"), 293 blocked_by_policy); 294 content_settings->OnIndexedDBAccessed(GURL("http://google.com"), 295 UTF8ToUTF16("text"), 296 blocked_by_policy); 297 content_settings->OnLocalStorageAccessed(GURL("http://google.com"), 298 true, 299 blocked_by_policy); 300 content_settings->OnWebDatabaseAccessed(GURL("http://google.com"), 301 UTF8ToUTF16("name"), 302 UTF8ToUTF16("display_name"), 303 blocked_by_policy); 304 } 305 306 TEST_F(TabSpecificContentSettingsTest, BlockThenAllowMediaAccess) { 307 TabSpecificContentSettings* content_settings = 308 TabSpecificContentSettings::FromWebContents(web_contents()); 309 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 310 TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED); 311 312 content_settings->OnMicrophoneAccessBlocked(); 313 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 314 TabSpecificContentSettings::MICROPHONE_BLOCKED); 315 content_settings->OnCameraAccessBlocked(); 316 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 317 TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED); 318 319 // If microphone and camera have opposite settings, like one is allowed, 320 // while the other is denied, we show the allow access in our UI. 321 content_settings->OnMicrophoneAccessed(); 322 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 323 TabSpecificContentSettings::MICROPHONE_ACCESSED); 324 content_settings->OnCameraAccessed(); 325 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 326 TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED); 327 } 328 329 TEST_F(TabSpecificContentSettingsTest, AllowThenBlockMediaAccess) { 330 TabSpecificContentSettings* content_settings = 331 TabSpecificContentSettings::FromWebContents(web_contents()); 332 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 333 TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED); 334 335 content_settings->OnMicrophoneAccessed(); 336 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 337 TabSpecificContentSettings::MICROPHONE_ACCESSED); 338 content_settings->OnCameraAccessed(); 339 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 340 TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED); 341 342 // If microphone and camera have opposite settings, like one is allowed, 343 // while the other is denied, we show the allow access in our UI. 344 // TODO(xians): Fix the UI to show one allowed icon and one blocked icon. 345 content_settings->OnMicrophoneAccessBlocked(); 346 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 347 TabSpecificContentSettings::CAMERA_ACCESSED); 348 content_settings->OnCameraAccessBlocked(); 349 EXPECT_EQ(content_settings->GetMicrophoneCameraState(), 350 TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED); 351 } 352