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/auto_reset.h" 6 #include "base/command_line.h" 7 #include "base/json/json_reader.h" 8 #include "base/json/json_writer.h" 9 #include "base/message_loop/message_loop.h" 10 #include "base/prefs/pref_service.h" 11 #include "base/prefs/scoped_user_pref_update.h" 12 #include "chrome/browser/content_settings/content_settings_details.h" 13 #include "chrome/browser/content_settings/cookie_settings.h" 14 #include "chrome/browser/content_settings/host_content_settings_map.h" 15 #include "chrome/browser/content_settings/mock_settings_observer.h" 16 #include "chrome/common/chrome_switches.h" 17 #include "chrome/common/pref_names.h" 18 #include "chrome/common/url_constants.h" 19 #include "chrome/test/base/testing_pref_service_syncable.h" 20 #include "chrome/test/base/testing_profile.h" 21 #include "content/public/test/test_browser_thread.h" 22 #include "net/base/static_cookie_policy.h" 23 #include "testing/gtest/include/gtest/gtest.h" 24 #include "url/gurl.h" 25 26 using content::BrowserThread; 27 28 using ::testing::_; 29 30 class HostContentSettingsMapTest : public testing::Test { 31 public: 32 HostContentSettingsMapTest() : ui_thread_(BrowserThread::UI, &message_loop_) { 33 } 34 35 protected: 36 base::MessageLoop message_loop_; 37 content::TestBrowserThread ui_thread_; 38 }; 39 40 TEST_F(HostContentSettingsMapTest, DefaultValues) { 41 TestingProfile profile; 42 HostContentSettingsMap* host_content_settings_map = 43 profile.GetHostContentSettingsMap(); 44 45 // Check setting defaults. 46 EXPECT_EQ(CONTENT_SETTING_ALLOW, 47 host_content_settings_map->GetDefaultContentSetting( 48 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); 49 host_content_settings_map->SetDefaultContentSetting( 50 CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); 51 EXPECT_EQ(CONTENT_SETTING_BLOCK, 52 host_content_settings_map->GetDefaultContentSetting( 53 CONTENT_SETTINGS_TYPE_IMAGES, NULL)); 54 EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( 55 GURL(chrome::kChromeUINewTabURL), 56 GURL(chrome::kChromeUINewTabURL), 57 CONTENT_SETTINGS_TYPE_IMAGES, 58 std::string())); 59 { 60 host_content_settings_map->SetDefaultContentSetting( 61 CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK); 62 EXPECT_EQ(CONTENT_SETTING_ASK, 63 host_content_settings_map->GetDefaultContentSetting( 64 CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); 65 } 66 host_content_settings_map->SetDefaultContentSetting( 67 CONTENT_SETTINGS_TYPE_POPUPS, CONTENT_SETTING_ALLOW); 68 EXPECT_EQ(CONTENT_SETTING_ALLOW, 69 host_content_settings_map->GetDefaultContentSetting( 70 CONTENT_SETTINGS_TYPE_POPUPS, NULL)); 71 } 72 73 TEST_F(HostContentSettingsMapTest, IndividualSettings) { 74 TestingProfile profile; 75 HostContentSettingsMap* host_content_settings_map = 76 profile.GetHostContentSettingsMap(); 77 78 // Check returning individual settings. 79 GURL host("http://example.com/"); 80 ContentSettingsPattern pattern = 81 ContentSettingsPattern::FromString("[*.]example.com"); 82 EXPECT_EQ(CONTENT_SETTING_ALLOW, 83 host_content_settings_map->GetContentSetting( 84 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 85 host_content_settings_map->SetContentSetting( 86 pattern, 87 ContentSettingsPattern::Wildcard(), 88 CONTENT_SETTINGS_TYPE_IMAGES, 89 std::string(), 90 CONTENT_SETTING_DEFAULT); 91 EXPECT_EQ(CONTENT_SETTING_ALLOW, 92 host_content_settings_map->GetContentSetting( 93 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 94 host_content_settings_map->SetContentSetting( 95 pattern, 96 ContentSettingsPattern::Wildcard(), 97 CONTENT_SETTINGS_TYPE_IMAGES, 98 std::string(), 99 CONTENT_SETTING_BLOCK); 100 EXPECT_EQ(CONTENT_SETTING_BLOCK, 101 host_content_settings_map->GetContentSetting( 102 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 103 EXPECT_EQ(CONTENT_SETTING_ALLOW, 104 host_content_settings_map->GetContentSetting( 105 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); 106 107 // Check returning all settings for a host. 108 host_content_settings_map->SetContentSetting( 109 pattern, 110 ContentSettingsPattern::Wildcard(), 111 CONTENT_SETTINGS_TYPE_IMAGES, 112 std::string(), 113 CONTENT_SETTING_DEFAULT); 114 EXPECT_EQ(CONTENT_SETTING_ALLOW, 115 host_content_settings_map->GetContentSetting( 116 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 117 host_content_settings_map->SetContentSetting( 118 pattern, 119 ContentSettingsPattern::Wildcard(), 120 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 121 std::string(), 122 CONTENT_SETTING_BLOCK); 123 EXPECT_EQ(CONTENT_SETTING_BLOCK, 124 host_content_settings_map->GetContentSetting( 125 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); 126 host_content_settings_map->SetContentSetting( 127 pattern, 128 ContentSettingsPattern::Wildcard(), 129 CONTENT_SETTINGS_TYPE_PLUGINS, 130 std::string(), 131 CONTENT_SETTING_ALLOW); 132 EXPECT_EQ(CONTENT_SETTING_ALLOW, 133 host_content_settings_map->GetContentSetting( 134 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); 135 EXPECT_EQ(CONTENT_SETTING_BLOCK, 136 host_content_settings_map->GetContentSetting( 137 host, host, CONTENT_SETTINGS_TYPE_POPUPS, std::string())); 138 EXPECT_EQ(CONTENT_SETTING_ASK, 139 host_content_settings_map->GetContentSetting( 140 host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 141 EXPECT_EQ( 142 CONTENT_SETTING_ASK, 143 host_content_settings_map->GetContentSetting( 144 host, host, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string())); 145 EXPECT_EQ(CONTENT_SETTING_ASK, 146 host_content_settings_map->GetContentSetting( 147 host, host, CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string())); 148 EXPECT_EQ(CONTENT_SETTING_ASK, 149 host_content_settings_map->GetContentSetting( 150 host, host, CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string())); 151 152 // Check returning all hosts for a setting. 153 ContentSettingsPattern pattern2 = 154 ContentSettingsPattern::FromString("[*.]example.org"); 155 host_content_settings_map->SetContentSetting( 156 pattern2, 157 ContentSettingsPattern::Wildcard(), 158 CONTENT_SETTINGS_TYPE_IMAGES, 159 std::string(), 160 CONTENT_SETTING_BLOCK); 161 host_content_settings_map->SetContentSetting( 162 pattern2, 163 ContentSettingsPattern::Wildcard(), 164 CONTENT_SETTINGS_TYPE_PLUGINS, 165 std::string(), 166 CONTENT_SETTING_BLOCK); 167 ContentSettingsForOneType host_settings; 168 host_content_settings_map->GetSettingsForOneType( 169 CONTENT_SETTINGS_TYPE_IMAGES, std::string(), &host_settings); 170 // |host_settings| contains the default setting and an exception. 171 EXPECT_EQ(2U, host_settings.size()); 172 host_content_settings_map->GetSettingsForOneType( 173 CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), &host_settings); 174 // |host_settings| contains the default setting and 2 exceptions. 175 EXPECT_EQ(3U, host_settings.size()); 176 host_content_settings_map->GetSettingsForOneType( 177 CONTENT_SETTINGS_TYPE_POPUPS, std::string(), &host_settings); 178 // |host_settings| contains only the default setting. 179 EXPECT_EQ(1U, host_settings.size()); 180 } 181 182 TEST_F(HostContentSettingsMapTest, Clear) { 183 TestingProfile profile; 184 HostContentSettingsMap* host_content_settings_map = 185 profile.GetHostContentSettingsMap(); 186 187 // Check clearing one type. 188 ContentSettingsPattern pattern = 189 ContentSettingsPattern::FromString("[*.]example.org"); 190 ContentSettingsPattern pattern2 = 191 ContentSettingsPattern::FromString("[*.]example.net"); 192 host_content_settings_map->SetContentSetting( 193 pattern2, 194 ContentSettingsPattern::Wildcard(), 195 CONTENT_SETTINGS_TYPE_IMAGES, 196 std::string(), 197 CONTENT_SETTING_BLOCK); 198 host_content_settings_map->SetContentSetting( 199 pattern, 200 ContentSettingsPattern::Wildcard(), 201 CONTENT_SETTINGS_TYPE_IMAGES, 202 std::string(), 203 CONTENT_SETTING_BLOCK); 204 host_content_settings_map->SetContentSetting( 205 pattern, 206 ContentSettingsPattern::Wildcard(), 207 CONTENT_SETTINGS_TYPE_PLUGINS, 208 std::string(), 209 CONTENT_SETTING_BLOCK); 210 host_content_settings_map->SetContentSetting( 211 pattern2, 212 ContentSettingsPattern::Wildcard(), 213 CONTENT_SETTINGS_TYPE_IMAGES, 214 std::string(), 215 CONTENT_SETTING_BLOCK); 216 host_content_settings_map->ClearSettingsForOneType( 217 CONTENT_SETTINGS_TYPE_IMAGES); 218 ContentSettingsForOneType host_settings; 219 host_content_settings_map->GetSettingsForOneType( 220 CONTENT_SETTINGS_TYPE_IMAGES, std::string(), &host_settings); 221 // |host_settings| contains only the default setting. 222 EXPECT_EQ(1U, host_settings.size()); 223 host_content_settings_map->GetSettingsForOneType( 224 CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), &host_settings); 225 // |host_settings| contains the default setting and an exception. 226 EXPECT_EQ(2U, host_settings.size()); 227 } 228 229 TEST_F(HostContentSettingsMapTest, Patterns) { 230 TestingProfile profile; 231 HostContentSettingsMap* host_content_settings_map = 232 profile.GetHostContentSettingsMap(); 233 234 GURL host1("http://example.com/"); 235 GURL host2("http://www.example.com/"); 236 GURL host3("http://example.org/"); 237 ContentSettingsPattern pattern1 = 238 ContentSettingsPattern::FromString("[*.]example.com"); 239 ContentSettingsPattern pattern2 = 240 ContentSettingsPattern::FromString("example.org"); 241 EXPECT_EQ(CONTENT_SETTING_ALLOW, 242 host_content_settings_map->GetContentSetting( 243 host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 244 host_content_settings_map->SetContentSetting( 245 pattern1, 246 ContentSettingsPattern::Wildcard(), 247 CONTENT_SETTINGS_TYPE_IMAGES, 248 std::string(), 249 CONTENT_SETTING_BLOCK); 250 EXPECT_EQ(CONTENT_SETTING_BLOCK, 251 host_content_settings_map->GetContentSetting( 252 host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 253 EXPECT_EQ(CONTENT_SETTING_BLOCK, 254 host_content_settings_map->GetContentSetting( 255 host2, host2, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 256 EXPECT_EQ(CONTENT_SETTING_ALLOW, 257 host_content_settings_map->GetContentSetting( 258 host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 259 host_content_settings_map->SetContentSetting( 260 pattern2, 261 ContentSettingsPattern::Wildcard(), 262 CONTENT_SETTINGS_TYPE_IMAGES, 263 std::string(), 264 CONTENT_SETTING_BLOCK); 265 EXPECT_EQ(CONTENT_SETTING_BLOCK, 266 host_content_settings_map->GetContentSetting( 267 host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 268 } 269 270 TEST_F(HostContentSettingsMapTest, Observer) { 271 TestingProfile profile; 272 HostContentSettingsMap* host_content_settings_map = 273 profile.GetHostContentSettingsMap(); 274 MockSettingsObserver observer; 275 276 ContentSettingsPattern primary_pattern = 277 ContentSettingsPattern::FromString("[*.]example.com"); 278 ContentSettingsPattern secondary_pattern = 279 ContentSettingsPattern::Wildcard(); 280 EXPECT_CALL(observer, 281 OnContentSettingsChanged(host_content_settings_map, 282 CONTENT_SETTINGS_TYPE_IMAGES, 283 false, 284 primary_pattern, 285 secondary_pattern, 286 false)); 287 host_content_settings_map->SetContentSetting( 288 primary_pattern, 289 secondary_pattern, 290 CONTENT_SETTINGS_TYPE_IMAGES, 291 std::string(), 292 CONTENT_SETTING_ALLOW); 293 ::testing::Mock::VerifyAndClearExpectations(&observer); 294 295 EXPECT_CALL(observer, 296 OnContentSettingsChanged(host_content_settings_map, 297 CONTENT_SETTINGS_TYPE_IMAGES, false, 298 _, _, true)); 299 host_content_settings_map->ClearSettingsForOneType( 300 CONTENT_SETTINGS_TYPE_IMAGES); 301 ::testing::Mock::VerifyAndClearExpectations(&observer); 302 303 EXPECT_CALL(observer, 304 OnContentSettingsChanged(host_content_settings_map, 305 CONTENT_SETTINGS_TYPE_IMAGES, false, 306 _, _, true)); 307 host_content_settings_map->SetDefaultContentSetting( 308 CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); 309 } 310 311 TEST_F(HostContentSettingsMapTest, ObserveDefaultPref) { 312 TestingProfile profile; 313 HostContentSettingsMap* host_content_settings_map = 314 profile.GetHostContentSettingsMap(); 315 316 PrefService* prefs = profile.GetPrefs(); 317 318 // Make a copy of the default pref value so we can reset it later. 319 scoped_ptr<base::Value> default_value(prefs->FindPreference( 320 prefs::kDefaultContentSettings)->GetValue()->DeepCopy()); 321 322 GURL host("http://example.com"); 323 324 host_content_settings_map->SetDefaultContentSetting( 325 CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); 326 EXPECT_EQ(CONTENT_SETTING_BLOCK, 327 host_content_settings_map->GetContentSetting( 328 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 329 330 // Make a copy of the pref's new value so we can reset it later. 331 scoped_ptr<base::Value> new_value(prefs->FindPreference( 332 prefs::kDefaultContentSettings)->GetValue()->DeepCopy()); 333 334 // Clearing the backing pref should also clear the internal cache. 335 prefs->Set(prefs::kDefaultContentSettings, *default_value); 336 EXPECT_EQ(CONTENT_SETTING_ALLOW, 337 host_content_settings_map->GetContentSetting( 338 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 339 340 // Reseting the pref to its previous value should update the cache. 341 prefs->Set(prefs::kDefaultContentSettings, *new_value); 342 EXPECT_EQ(CONTENT_SETTING_BLOCK, 343 host_content_settings_map->GetContentSetting( 344 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 345 } 346 347 TEST_F(HostContentSettingsMapTest, ObserveExceptionPref) { 348 TestingProfile profile; 349 HostContentSettingsMap* host_content_settings_map = 350 profile.GetHostContentSettingsMap(); 351 352 PrefService* prefs = profile.GetPrefs(); 353 354 // Make a copy of the default pref value so we can reset it later. 355 scoped_ptr<base::Value> default_value(prefs->FindPreference( 356 prefs::kContentSettingsPatternPairs)->GetValue()->DeepCopy()); 357 358 ContentSettingsPattern pattern = 359 ContentSettingsPattern::FromString("[*.]example.com"); 360 GURL host("http://example.com"); 361 362 EXPECT_EQ(CONTENT_SETTING_ALLOW, 363 host_content_settings_map->GetContentSetting( 364 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 365 366 host_content_settings_map->SetContentSetting( 367 pattern, 368 ContentSettingsPattern::Wildcard(), 369 CONTENT_SETTINGS_TYPE_IMAGES, 370 std::string(), 371 CONTENT_SETTING_BLOCK); 372 EXPECT_EQ(CONTENT_SETTING_BLOCK, 373 host_content_settings_map->GetContentSetting( 374 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 375 376 // Make a copy of the pref's new value so we can reset it later. 377 scoped_ptr<base::Value> new_value(prefs->FindPreference( 378 prefs::kContentSettingsPatternPairs)->GetValue()->DeepCopy()); 379 380 // Clearing the backing pref should also clear the internal cache. 381 prefs->Set(prefs::kContentSettingsPatternPairs, *default_value); 382 EXPECT_EQ(CONTENT_SETTING_ALLOW, 383 host_content_settings_map->GetContentSetting( 384 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 385 386 // Reseting the pref to its previous value should update the cache. 387 prefs->Set(prefs::kContentSettingsPatternPairs, *new_value); 388 EXPECT_EQ(CONTENT_SETTING_BLOCK, 389 host_content_settings_map->GetContentSetting( 390 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 391 } 392 393 TEST_F(HostContentSettingsMapTest, HostTrimEndingDotCheck) { 394 TestingProfile profile; 395 HostContentSettingsMap* host_content_settings_map = 396 profile.GetHostContentSettingsMap(); 397 CookieSettings* cookie_settings = 398 CookieSettings::Factory::GetForProfile(&profile).get(); 399 400 ContentSettingsPattern pattern = 401 ContentSettingsPattern::FromString("[*.]example.com"); 402 GURL host_ending_with_dot("http://example.com./"); 403 404 EXPECT_EQ(CONTENT_SETTING_ALLOW, 405 host_content_settings_map->GetContentSetting( 406 host_ending_with_dot, 407 host_ending_with_dot, 408 CONTENT_SETTINGS_TYPE_IMAGES, 409 std::string())); 410 host_content_settings_map->SetContentSetting( 411 pattern, 412 ContentSettingsPattern::Wildcard(), 413 CONTENT_SETTINGS_TYPE_IMAGES, 414 std::string(), 415 CONTENT_SETTING_DEFAULT); 416 EXPECT_EQ( 417 CONTENT_SETTING_ALLOW, 418 host_content_settings_map->GetContentSetting(host_ending_with_dot, 419 host_ending_with_dot, 420 CONTENT_SETTINGS_TYPE_IMAGES, 421 std::string())); 422 host_content_settings_map->SetContentSetting( 423 pattern, 424 ContentSettingsPattern::Wildcard(), 425 CONTENT_SETTINGS_TYPE_IMAGES, 426 std::string(), 427 CONTENT_SETTING_BLOCK); 428 EXPECT_EQ( 429 CONTENT_SETTING_BLOCK, 430 host_content_settings_map->GetContentSetting(host_ending_with_dot, 431 host_ending_with_dot, 432 CONTENT_SETTINGS_TYPE_IMAGES, 433 std::string())); 434 435 EXPECT_TRUE(cookie_settings->IsSettingCookieAllowed( 436 host_ending_with_dot, host_ending_with_dot)); 437 host_content_settings_map->SetContentSetting( 438 pattern, 439 ContentSettingsPattern::Wildcard(), 440 CONTENT_SETTINGS_TYPE_COOKIES, 441 std::string(), 442 CONTENT_SETTING_DEFAULT); 443 EXPECT_TRUE(cookie_settings->IsSettingCookieAllowed( 444 host_ending_with_dot, host_ending_with_dot)); 445 host_content_settings_map->SetContentSetting( 446 pattern, 447 ContentSettingsPattern::Wildcard(), 448 CONTENT_SETTINGS_TYPE_COOKIES, 449 std::string(), 450 CONTENT_SETTING_BLOCK); 451 EXPECT_FALSE(cookie_settings->IsSettingCookieAllowed( 452 host_ending_with_dot, host_ending_with_dot)); 453 454 EXPECT_EQ(CONTENT_SETTING_ALLOW, 455 host_content_settings_map->GetContentSetting( 456 host_ending_with_dot, 457 host_ending_with_dot, 458 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 459 std::string())); 460 host_content_settings_map->SetContentSetting( 461 pattern, 462 ContentSettingsPattern::Wildcard(), 463 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 464 std::string(), 465 CONTENT_SETTING_DEFAULT); 466 EXPECT_EQ(CONTENT_SETTING_ALLOW, 467 host_content_settings_map->GetContentSetting( 468 host_ending_with_dot, 469 host_ending_with_dot, 470 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 471 std::string())); 472 host_content_settings_map->SetContentSetting( 473 pattern, 474 ContentSettingsPattern::Wildcard(), 475 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 476 std::string(), 477 CONTENT_SETTING_BLOCK); 478 EXPECT_EQ(CONTENT_SETTING_BLOCK, 479 host_content_settings_map->GetContentSetting( 480 host_ending_with_dot, 481 host_ending_with_dot, 482 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 483 std::string())); 484 485 EXPECT_EQ(CONTENT_SETTING_ALLOW, 486 host_content_settings_map->GetContentSetting( 487 host_ending_with_dot, 488 host_ending_with_dot, 489 CONTENT_SETTINGS_TYPE_PLUGINS, 490 std::string())); 491 host_content_settings_map->SetContentSetting( 492 pattern, 493 ContentSettingsPattern::Wildcard(), 494 CONTENT_SETTINGS_TYPE_PLUGINS, 495 std::string(), 496 CONTENT_SETTING_DEFAULT); 497 EXPECT_EQ(CONTENT_SETTING_ALLOW, 498 host_content_settings_map->GetContentSetting( 499 host_ending_with_dot, 500 host_ending_with_dot, 501 CONTENT_SETTINGS_TYPE_PLUGINS, 502 std::string())); 503 host_content_settings_map->SetContentSetting( 504 pattern, 505 ContentSettingsPattern::Wildcard(), 506 CONTENT_SETTINGS_TYPE_PLUGINS, 507 std::string(), 508 CONTENT_SETTING_BLOCK); 509 EXPECT_EQ(CONTENT_SETTING_BLOCK, 510 host_content_settings_map->GetContentSetting( 511 host_ending_with_dot, 512 host_ending_with_dot, 513 CONTENT_SETTINGS_TYPE_PLUGINS, 514 std::string())); 515 516 EXPECT_EQ( 517 CONTENT_SETTING_BLOCK, 518 host_content_settings_map->GetContentSetting(host_ending_with_dot, 519 host_ending_with_dot, 520 CONTENT_SETTINGS_TYPE_POPUPS, 521 std::string())); 522 host_content_settings_map->SetContentSetting( 523 pattern, 524 ContentSettingsPattern::Wildcard(), 525 CONTENT_SETTINGS_TYPE_POPUPS, 526 std::string(), 527 CONTENT_SETTING_DEFAULT); 528 EXPECT_EQ( 529 CONTENT_SETTING_BLOCK, 530 host_content_settings_map->GetContentSetting(host_ending_with_dot, 531 host_ending_with_dot, 532 CONTENT_SETTINGS_TYPE_POPUPS, 533 std::string())); 534 host_content_settings_map->SetContentSetting( 535 pattern, 536 ContentSettingsPattern::Wildcard(), 537 CONTENT_SETTINGS_TYPE_POPUPS, 538 std::string(), 539 CONTENT_SETTING_ALLOW); 540 EXPECT_EQ( 541 CONTENT_SETTING_ALLOW, 542 host_content_settings_map->GetContentSetting(host_ending_with_dot, 543 host_ending_with_dot, 544 CONTENT_SETTINGS_TYPE_POPUPS, 545 std::string())); 546 } 547 548 TEST_F(HostContentSettingsMapTest, NestedSettings) { 549 TestingProfile profile; 550 HostContentSettingsMap* host_content_settings_map = 551 profile.GetHostContentSettingsMap(); 552 553 GURL host("http://a.b.example.com/"); 554 ContentSettingsPattern pattern1 = 555 ContentSettingsPattern::FromString("[*.]example.com"); 556 ContentSettingsPattern pattern2 = 557 ContentSettingsPattern::FromString("[*.]b.example.com"); 558 ContentSettingsPattern pattern3 = 559 ContentSettingsPattern::FromString("a.b.example.com"); 560 561 host_content_settings_map->SetContentSetting( 562 pattern1, 563 ContentSettingsPattern::Wildcard(), 564 CONTENT_SETTINGS_TYPE_IMAGES, 565 std::string(), 566 CONTENT_SETTING_BLOCK); 567 568 host_content_settings_map->SetContentSetting( 569 pattern2, 570 ContentSettingsPattern::Wildcard(), 571 CONTENT_SETTINGS_TYPE_COOKIES, 572 std::string(), 573 CONTENT_SETTING_BLOCK); 574 575 host_content_settings_map->SetContentSetting( 576 pattern3, 577 ContentSettingsPattern::Wildcard(), 578 CONTENT_SETTINGS_TYPE_PLUGINS, 579 std::string(), 580 CONTENT_SETTING_BLOCK); 581 host_content_settings_map->SetDefaultContentSetting( 582 CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); 583 584 EXPECT_EQ(CONTENT_SETTING_BLOCK, 585 host_content_settings_map->GetContentSetting( 586 host, host, CONTENT_SETTINGS_TYPE_COOKIES, std::string())); 587 EXPECT_EQ(CONTENT_SETTING_BLOCK, 588 host_content_settings_map->GetContentSetting( 589 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 590 EXPECT_EQ(CONTENT_SETTING_BLOCK, 591 host_content_settings_map->GetContentSetting( 592 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); 593 EXPECT_EQ(CONTENT_SETTING_BLOCK, 594 host_content_settings_map->GetContentSetting( 595 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string())); 596 EXPECT_EQ(CONTENT_SETTING_BLOCK, 597 host_content_settings_map->GetContentSetting( 598 host, host, CONTENT_SETTINGS_TYPE_POPUPS, std::string())); 599 EXPECT_EQ(CONTENT_SETTING_ASK, 600 host_content_settings_map->GetContentSetting( 601 host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string())); 602 EXPECT_EQ( 603 CONTENT_SETTING_ASK, 604 host_content_settings_map->GetContentSetting( 605 host, host, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string())); 606 EXPECT_EQ(CONTENT_SETTING_ASK, 607 host_content_settings_map->GetContentSetting( 608 host, host, CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string())); 609 EXPECT_EQ(CONTENT_SETTING_ASK, 610 host_content_settings_map->GetContentSetting( 611 host, host, CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string())); 612 } 613 614 TEST_F(HostContentSettingsMapTest, OffTheRecord) { 615 TestingProfile profile; 616 HostContentSettingsMap* host_content_settings_map = 617 profile.GetHostContentSettingsMap(); 618 scoped_refptr<HostContentSettingsMap> otr_map( 619 new HostContentSettingsMap(profile.GetPrefs(), 620 true)); 621 622 GURL host("http://example.com/"); 623 ContentSettingsPattern pattern = 624 ContentSettingsPattern::FromString("[*.]example.com"); 625 626 EXPECT_EQ(CONTENT_SETTING_ALLOW, 627 host_content_settings_map->GetContentSetting( 628 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 629 EXPECT_EQ(CONTENT_SETTING_ALLOW, 630 otr_map->GetContentSetting( 631 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 632 633 // Changing content settings on the main map should also affect the 634 // incognito map. 635 host_content_settings_map->SetContentSetting( 636 pattern, 637 ContentSettingsPattern::Wildcard(), 638 CONTENT_SETTINGS_TYPE_IMAGES, 639 std::string(), 640 CONTENT_SETTING_BLOCK); 641 EXPECT_EQ(CONTENT_SETTING_BLOCK, 642 host_content_settings_map->GetContentSetting( 643 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 644 EXPECT_EQ(CONTENT_SETTING_BLOCK, 645 otr_map->GetContentSetting( 646 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 647 648 // Changing content settings on the incognito map should NOT affect the 649 // main map. 650 otr_map->SetContentSetting(pattern, 651 ContentSettingsPattern::Wildcard(), 652 CONTENT_SETTINGS_TYPE_IMAGES, 653 std::string(), 654 CONTENT_SETTING_ALLOW); 655 EXPECT_EQ(CONTENT_SETTING_BLOCK, 656 host_content_settings_map->GetContentSetting( 657 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 658 EXPECT_EQ(CONTENT_SETTING_ALLOW, 659 otr_map->GetContentSetting( 660 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 661 662 otr_map->ShutdownOnUIThread(); 663 } 664 665 // For a single Unicode encoded pattern, check if it gets converted to punycode 666 // and old pattern gets deleted. 667 TEST_F(HostContentSettingsMapTest, CanonicalizeExceptionsUnicodeOnly) { 668 TestingProfile profile; 669 PrefService* prefs = profile.GetPrefs(); 670 671 // Set utf-8 data. 672 { 673 DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatternPairs); 674 base::DictionaryValue* all_settings_dictionary = update.Get(); 675 ASSERT_TRUE(NULL != all_settings_dictionary); 676 677 base::DictionaryValue* dummy_payload = new base::DictionaryValue; 678 dummy_payload->SetInteger("images", CONTENT_SETTING_ALLOW); 679 all_settings_dictionary->SetWithoutPathExpansion("[*.]\xC4\x87ira.com,*", 680 dummy_payload); 681 } 682 profile.GetHostContentSettingsMap(); 683 684 const base::DictionaryValue* all_settings_dictionary = 685 prefs->GetDictionary(prefs::kContentSettingsPatternPairs); 686 const base::DictionaryValue* result = NULL; 687 EXPECT_FALSE(all_settings_dictionary->GetDictionaryWithoutPathExpansion( 688 "[*.]\xC4\x87ira.com,*", &result)); 689 EXPECT_TRUE(all_settings_dictionary->GetDictionaryWithoutPathExpansion( 690 "[*.]xn--ira-ppa.com,*", &result)); 691 } 692 693 // If both Unicode and its punycode pattern exist, make sure we don't touch the 694 // settings for the punycode, and that Unicode pattern gets deleted. 695 TEST_F(HostContentSettingsMapTest, CanonicalizeExceptionsUnicodeAndPunycode) { 696 TestingProfile profile; 697 698 scoped_ptr<base::Value> value(base::JSONReader::Read( 699 "{\"[*.]\\xC4\\x87ira.com,*\":{\"images\":1}}")); 700 profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *value); 701 702 // Set punycode equivalent, with different setting. 703 scoped_ptr<base::Value> puny_value(base::JSONReader::Read( 704 "{\"[*.]xn--ira-ppa.com,*\":{\"images\":2}}")); 705 profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *puny_value); 706 707 // Initialize the content map. 708 profile.GetHostContentSettingsMap(); 709 710 const base::DictionaryValue* content_setting_prefs = 711 profile.GetPrefs()->GetDictionary(prefs::kContentSettingsPatternPairs); 712 std::string prefs_as_json; 713 base::JSONWriter::Write(content_setting_prefs, &prefs_as_json); 714 EXPECT_STREQ("{\"[*.]xn--ira-ppa.com,*\":{\"images\":2}}", 715 prefs_as_json.c_str()); 716 } 717 718 // If a default-content-setting is managed, the managed value should be used 719 // instead of the default value. 720 TEST_F(HostContentSettingsMapTest, ManagedDefaultContentSetting) { 721 TestingProfile profile; 722 HostContentSettingsMap* host_content_settings_map = 723 profile.GetHostContentSettingsMap(); 724 TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); 725 726 EXPECT_EQ(CONTENT_SETTING_ALLOW, 727 host_content_settings_map->GetDefaultContentSetting( 728 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); 729 730 // Set managed-default-content-setting through the coresponding preferences. 731 prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting, 732 base::Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 733 EXPECT_EQ(CONTENT_SETTING_BLOCK, 734 host_content_settings_map->GetDefaultContentSetting( 735 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); 736 737 // Remove managed-default-content-settings-preferences. 738 prefs->RemoveManagedPref(prefs::kManagedDefaultJavaScriptSetting); 739 EXPECT_EQ(CONTENT_SETTING_ALLOW, 740 host_content_settings_map->GetDefaultContentSetting( 741 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); 742 743 // Set preference to manage the default-content-setting for Plugins. 744 prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting, 745 base::Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 746 EXPECT_EQ(CONTENT_SETTING_BLOCK, 747 host_content_settings_map->GetDefaultContentSetting( 748 CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); 749 750 // Remove the preference to manage the default-content-setting for Plugins. 751 prefs->RemoveManagedPref(prefs::kManagedDefaultPluginsSetting); 752 EXPECT_EQ(CONTENT_SETTING_ALLOW, 753 host_content_settings_map->GetDefaultContentSetting( 754 CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); 755 } 756 757 TEST_F(HostContentSettingsMapTest, 758 GetNonDefaultContentSettingsIfTypeManaged) { 759 TestingProfile profile; 760 HostContentSettingsMap* host_content_settings_map = 761 profile.GetHostContentSettingsMap(); 762 TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); 763 764 // Set pattern for JavaScript setting. 765 ContentSettingsPattern pattern = 766 ContentSettingsPattern::FromString("[*.]example.com"); 767 host_content_settings_map->SetContentSetting( 768 pattern, 769 ContentSettingsPattern::Wildcard(), 770 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 771 std::string(), 772 CONTENT_SETTING_BLOCK); 773 774 EXPECT_EQ(CONTENT_SETTING_ALLOW, 775 host_content_settings_map->GetDefaultContentSetting( 776 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); 777 778 GURL host("http://example.com/"); 779 EXPECT_EQ(CONTENT_SETTING_BLOCK, 780 host_content_settings_map->GetContentSetting( 781 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); 782 783 // Set managed-default-content-setting for content-settings-type JavaScript. 784 prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting, 785 base::Value::CreateIntegerValue(CONTENT_SETTING_ALLOW)); 786 EXPECT_EQ(CONTENT_SETTING_ALLOW, 787 host_content_settings_map->GetContentSetting( 788 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); 789 } 790 791 // Managed default content setting should have higher priority 792 // than user defined patterns. 793 TEST_F(HostContentSettingsMapTest, 794 ManagedDefaultContentSettingIgnoreUserPattern) { 795 TestingProfile profile; 796 HostContentSettingsMap* host_content_settings_map = 797 profile.GetHostContentSettingsMap(); 798 TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); 799 800 // Block all JavaScript. 801 host_content_settings_map->SetDefaultContentSetting( 802 CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); 803 804 // Set an exception to allow "[*.]example.com" 805 ContentSettingsPattern pattern = 806 ContentSettingsPattern::FromString("[*.]example.com"); 807 808 host_content_settings_map->SetContentSetting( 809 pattern, 810 ContentSettingsPattern::Wildcard(), 811 CONTENT_SETTINGS_TYPE_JAVASCRIPT, 812 std::string(), 813 CONTENT_SETTING_ALLOW); 814 815 EXPECT_EQ(CONTENT_SETTING_BLOCK, 816 host_content_settings_map->GetDefaultContentSetting( 817 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL)); 818 GURL host("http://example.com/"); 819 EXPECT_EQ(CONTENT_SETTING_ALLOW, 820 host_content_settings_map->GetContentSetting( 821 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); 822 823 // Set managed-default-content-settings-preferences. 824 prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting, 825 base::Value::CreateIntegerValue(CONTENT_SETTING_BLOCK)); 826 EXPECT_EQ(CONTENT_SETTING_BLOCK, 827 host_content_settings_map->GetContentSetting( 828 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); 829 830 // Remove managed-default-content-settings-preferences. 831 prefs->RemoveManagedPref(prefs::kManagedDefaultJavaScriptSetting); 832 EXPECT_EQ(CONTENT_SETTING_ALLOW, 833 host_content_settings_map->GetContentSetting( 834 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string())); 835 } 836 837 // If a default-content-setting is set to managed setting, the user defined 838 // setting should be preserved. 839 TEST_F(HostContentSettingsMapTest, OverwrittenDefaultContentSetting) { 840 TestingProfile profile; 841 HostContentSettingsMap* host_content_settings_map = 842 profile.GetHostContentSettingsMap(); 843 TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); 844 845 // Set user defined default-content-setting for Cookies. 846 host_content_settings_map->SetDefaultContentSetting( 847 CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_BLOCK); 848 EXPECT_EQ(CONTENT_SETTING_BLOCK, 849 host_content_settings_map->GetDefaultContentSetting( 850 CONTENT_SETTINGS_TYPE_COOKIES, NULL)); 851 852 // Set preference to manage the default-content-setting for Cookies. 853 prefs->SetManagedPref(prefs::kManagedDefaultCookiesSetting, 854 base::Value::CreateIntegerValue(CONTENT_SETTING_ALLOW)); 855 EXPECT_EQ(CONTENT_SETTING_ALLOW, 856 host_content_settings_map->GetDefaultContentSetting( 857 CONTENT_SETTINGS_TYPE_COOKIES, NULL)); 858 859 // Remove the preference to manage the default-content-setting for Cookies. 860 prefs->RemoveManagedPref(prefs::kManagedDefaultCookiesSetting); 861 EXPECT_EQ(CONTENT_SETTING_BLOCK, 862 host_content_settings_map->GetDefaultContentSetting( 863 CONTENT_SETTINGS_TYPE_COOKIES, NULL)); 864 } 865 866 // If a setting for a default-content-setting-type is set while the type is 867 // managed, then the new setting should be preserved and used after the 868 // default-content-setting-type is not managed anymore. 869 TEST_F(HostContentSettingsMapTest, SettingDefaultContentSettingsWhenManaged) { 870 TestingProfile profile; 871 HostContentSettingsMap* host_content_settings_map = 872 profile.GetHostContentSettingsMap(); 873 TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); 874 875 prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting, 876 base::Value::CreateIntegerValue(CONTENT_SETTING_ALLOW)); 877 EXPECT_EQ(CONTENT_SETTING_ALLOW, 878 host_content_settings_map->GetDefaultContentSetting( 879 CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); 880 881 host_content_settings_map->SetDefaultContentSetting( 882 CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK); 883 EXPECT_EQ(CONTENT_SETTING_ALLOW, 884 host_content_settings_map->GetDefaultContentSetting( 885 CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); 886 887 prefs->RemoveManagedPref(prefs::kManagedDefaultPluginsSetting); 888 EXPECT_EQ(CONTENT_SETTING_BLOCK, 889 host_content_settings_map->GetDefaultContentSetting( 890 CONTENT_SETTINGS_TYPE_PLUGINS, NULL)); 891 } 892 893 TEST_F(HostContentSettingsMapTest, GetContentSetting) { 894 TestingProfile profile; 895 HostContentSettingsMap* host_content_settings_map = 896 profile.GetHostContentSettingsMap(); 897 898 GURL host("http://example.com/"); 899 GURL embedder("chrome://foo"); 900 ContentSettingsPattern pattern = 901 ContentSettingsPattern::FromString("[*.]example.com"); 902 host_content_settings_map->SetContentSetting( 903 pattern, 904 ContentSettingsPattern::Wildcard(), 905 CONTENT_SETTINGS_TYPE_IMAGES, 906 std::string(), 907 CONTENT_SETTING_BLOCK); 908 EXPECT_EQ(CONTENT_SETTING_BLOCK, 909 host_content_settings_map->GetContentSetting( 910 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 911 EXPECT_EQ(CONTENT_SETTING_ALLOW, 912 host_content_settings_map->GetContentSetting( 913 embedder, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); 914 } 915 916 TEST_F(HostContentSettingsMapTest, ShouldAllowAllContent) { 917 TestingProfile profile; 918 HostContentSettingsMap* host_content_settings_map = 919 profile.GetHostContentSettingsMap(); 920 921 GURL http_host("http://example.com/"); 922 GURL https_host("https://example.com/"); 923 GURL embedder("chrome://foo"); 924 GURL extension("chrome-extension://foo"); 925 EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent( 926 http_host, embedder, CONTENT_SETTINGS_TYPE_NOTIFICATIONS)); 927 EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent( 928 http_host, embedder, CONTENT_SETTINGS_TYPE_GEOLOCATION)); 929 EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent( 930 http_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES)); 931 EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent( 932 https_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES)); 933 EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent( 934 https_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES)); 935 EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent( 936 embedder, http_host, CONTENT_SETTINGS_TYPE_COOKIES)); 937 EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent( 938 extension, extension, CONTENT_SETTINGS_TYPE_COOKIES)); 939 EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent( 940 extension, extension, CONTENT_SETTINGS_TYPE_PLUGINS)); 941 EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent( 942 extension, http_host, CONTENT_SETTINGS_TYPE_COOKIES)); 943 } 944 945 TEST_F(HostContentSettingsMapTest, MigrateClearOnExit) { 946 TestingProfile profile; 947 TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService(); 948 949 prefs->SetBoolean(prefs::kClearSiteDataOnExit, true); 950 951 scoped_ptr<base::Value> patterns(base::JSONReader::Read( 952 "{\"[*.]example.com,*\":{\"cookies\": 1}," 953 " \"[*.]other.com,*\":{\"cookies\": 2}," 954 " \"[*.]third.com,*\":{\"cookies\": 4}}")); 955 profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *patterns); 956 957 scoped_ptr<base::Value> defaults(base::JSONReader::Read("{\"cookies\": 1}")); 958 profile.GetPrefs()->Set(prefs::kDefaultContentSettings, *defaults); 959 960 HostContentSettingsMap* host_content_settings_map = 961 profile.GetHostContentSettingsMap(); 962 963 EXPECT_EQ(CONTENT_SETTING_SESSION_ONLY, 964 host_content_settings_map->GetDefaultContentSetting( 965 CONTENT_SETTINGS_TYPE_COOKIES, NULL)); 966 EXPECT_EQ(CONTENT_SETTING_SESSION_ONLY, 967 host_content_settings_map->GetContentSetting( 968 GURL("http://example.com"), 969 GURL("http://example.com"), 970 CONTENT_SETTINGS_TYPE_COOKIES, 971 std::string())); 972 EXPECT_EQ(CONTENT_SETTING_BLOCK, 973 host_content_settings_map->GetContentSetting( 974 GURL("http://other.com"), 975 GURL("http://other.com"), 976 CONTENT_SETTINGS_TYPE_COOKIES, 977 std::string())); 978 EXPECT_EQ(CONTENT_SETTING_SESSION_ONLY, 979 host_content_settings_map->GetContentSetting( 980 GURL("http://third.com"), 981 GURL("http://third.com"), 982 CONTENT_SETTINGS_TYPE_COOKIES, 983 std::string())); 984 } 985