Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/profiles/profile.h" | 5 #include "chrome/browser/profiles/profile.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 #include "chrome/common/chrome_constants.h" | 31 #include "chrome/common/chrome_constants.h" |
| 32 #include "chrome/common/pref_names.h" | 32 #include "chrome/common/pref_names.h" |
| 33 #include "chrome/test/base/in_process_browser_test.h" | 33 #include "chrome/test/base/in_process_browser_test.h" |
| 34 #include "chrome/test/base/ui_test_utils.h" | 34 #include "chrome/test/base/ui_test_utils.h" |
| 35 #include "components/bookmarks/browser/startup_task_runner_service.h" | 35 #include "components/bookmarks/browser/startup_task_runner_service.h" |
| 36 #include "components/prefs/pref_service.h" | 36 #include "components/prefs/pref_service.h" |
| 37 #include "components/version_info/version_info.h" | 37 #include "components/version_info/version_info.h" |
| 38 #include "content/public/browser/browser_thread.h" | 38 #include "content/public/browser/browser_thread.h" |
| 39 #include "content/public/browser/storage_partition.h" | 39 #include "content/public/browser/storage_partition.h" |
| 40 #include "content/public/test/test_utils.h" | 40 #include "content/public/test/test_utils.h" |
| 41 #include "extensions/browser/extension_registry.h" | |
| 42 #include "extensions/common/extension.h" | |
| 43 #include "extensions/common/extension_builder.h" | |
| 44 #include "extensions/common/value_builder.h" | |
| 41 #include "net/base/net_errors.h" | 45 #include "net/base/net_errors.h" |
| 42 #include "net/test/url_request/url_request_failed_job.h" | 46 #include "net/test/url_request/url_request_failed_job.h" |
| 43 #include "net/url_request/url_fetcher.h" | 47 #include "net/url_request/url_fetcher.h" |
| 44 #include "net/url_request/url_fetcher_delegate.h" | 48 #include "net/url_request/url_fetcher_delegate.h" |
| 45 #include "net/url_request/url_request_context_getter.h" | 49 #include "net/url_request/url_request_context_getter.h" |
| 46 #include "net/url_request/url_request_status.h" | 50 #include "net/url_request/url_request_status.h" |
| 47 #include "testing/gmock/include/gmock/gmock.h" | 51 #include "testing/gmock/include/gmock/gmock.h" |
| 48 #include "testing/gtest/include/gtest/gtest.h" | 52 #include "testing/gtest/include/gtest/gtest.h" |
| 49 #include "url/gurl.h" | 53 #include "url/gurl.h" |
| 50 | 54 |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 414 | 418 |
| 415 // Setting back to a crashed value should work. | 419 // Setting back to a crashed value should work. |
| 416 profile->SetExitType(Profile::EXIT_CRASHED); | 420 profile->SetExitType(Profile::EXIT_CRASHED); |
| 417 std::string final_value(prefs->GetString(prefs::kSessionExitType)); | 421 std::string final_value(prefs->GetString(prefs::kSessionExitType)); |
| 418 EXPECT_EQ(crash_value, final_value); | 422 EXPECT_EQ(crash_value, final_value); |
| 419 } | 423 } |
| 420 | 424 |
| 421 FlushIoTaskRunnerAndSpinThreads(); | 425 FlushIoTaskRunnerAndSpinThreads(); |
| 422 } | 426 } |
| 423 | 427 |
| 428 namespace { | |
| 429 | |
| 430 scoped_refptr<const extensions::Extension> BuildTestApp(Profile* profile) { | |
| 431 scoped_refptr<const extensions::Extension> app; | |
| 432 app = | |
| 433 extensions::ExtensionBuilder() | |
| 434 .SetManifest( | |
| 435 extensions::DictionaryBuilder() | |
| 436 .Set("name", "test app") | |
| 437 .Set("version", "1") | |
| 438 .Set("app", | |
| 439 extensions::DictionaryBuilder() | |
| 440 .Set("background", | |
| 441 extensions::DictionaryBuilder() | |
| 442 .Set("scripts", extensions::ListBuilder() | |
| 443 .Append("background.js") | |
| 444 .Build()) | |
| 445 .Build()) | |
| 446 .Build()) | |
| 447 .Build()) | |
| 448 .Build(); | |
| 449 extensions::ExtensionRegistry* registry = | |
| 450 extensions::ExtensionRegistry::Get(profile); | |
| 451 EXPECT_TRUE(registry->AddEnabled(app)); | |
| 452 return app; | |
| 453 } | |
| 454 | |
| 455 void FetchURLRequestContext(net::URLRequestContextGetter* getter, | |
| 456 net::URLRequestContext** context) { | |
| 457 *context = getter->GetURLRequestContext(); | |
| 458 } | |
| 459 | |
| 460 } // namespace | |
| 461 | |
| 462 IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, URLRequestContextIsolation) { | |
| 463 base::ScopedTempDir temp_dir; | |
| 464 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
| 465 | |
| 466 MockProfileDelegate delegate; | |
| 467 EXPECT_CALL(delegate, OnProfileCreated(testing::NotNull(), true, true)); | |
| 468 | |
| 469 { | |
| 470 std::unique_ptr<Profile> profile(CreateProfile( | |
| 471 temp_dir.path(), &delegate, Profile::CREATE_MODE_SYNCHRONOUS)); | |
| 472 | |
| 473 scoped_refptr<const extensions::Extension> app = | |
| 474 BuildTestApp(profile.get()); | |
| 475 content::StoragePartition* extension_partition = | |
| 476 content::BrowserContext::GetStoragePartitionForSite( | |
| 477 profile.get(), | |
| 478 extensions::Extension::GetBaseURLFromExtensionId(app->id())); | |
| 479 net::URLRequestContextGetter* extension_context_getter = | |
| 480 extension_partition->GetURLRequestContext(); | |
| 481 net::URLRequestContextGetter* main_context_getter = | |
| 482 profile->GetRequestContext(); | |
| 483 | |
| 484 net::URLRequestContext* extension_context = nullptr; | |
| 485 net::URLRequestContext* main_context = nullptr; | |
| 486 base::RunLoop run_loop; | |
| 487 content::BrowserThread::PostTask( | |
| 488 content::BrowserThread::IO, FROM_HERE, | |
| 489 base::Bind(&FetchURLRequestContext, extension_context_getter, | |
| 490 &extension_context)); | |
| 491 content::BrowserThread::PostTaskAndReply( | |
| 492 content::BrowserThread::IO, FROM_HERE, | |
| 493 base::Bind(&FetchURLRequestContext, main_context_getter, &main_context), | |
| 494 run_loop.QuitClosure()); | |
| 495 run_loop.Run(); | |
| 496 | |
| 497 CHECK(extension_context); | |
| 498 CHECK(main_context); | |
|
mmenke
2016/04/27 02:28:47
We'd crash just below if these aren't true, anyway
nharper
2016/04/27 22:25:44
Done.
| |
| 499 | |
| 500 EXPECT_NE(extension_context, main_context); | |
| 501 EXPECT_NE(extension_context->channel_id_service(), | |
| 502 main_context->channel_id_service()); | |
|
mmenke
2016/04/27 02:28:47
Dereferencing the context on the UI thread just do
nharper
2016/04/27 22:25:44
Done.
| |
| 503 } | |
| 504 | |
| 505 FlushIoTaskRunnerAndSpinThreads(); | |
| 506 } | |
| 507 | |
| 508 IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, | |
| 509 OffTheRecordURLRequestContextIsolation) { | |
| 510 base::ScopedTempDir temp_dir; | |
| 511 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | |
| 512 | |
| 513 MockProfileDelegate delegate; | |
| 514 EXPECT_CALL(delegate, OnProfileCreated(testing::NotNull(), true, true)); | |
| 515 | |
| 516 { | |
| 517 std::unique_ptr<Profile> profile(CreateProfile( | |
| 518 temp_dir.path(), &delegate, Profile::CREATE_MODE_SYNCHRONOUS)); | |
| 519 Profile* otr_profile = profile->GetOffTheRecordProfile(); | |
| 520 | |
| 521 scoped_refptr<const extensions::Extension> app = BuildTestApp(otr_profile); | |
| 522 content::StoragePartition* extension_partition = | |
| 523 content::BrowserContext::GetStoragePartitionForSite( | |
| 524 otr_profile, | |
| 525 extensions::Extension::GetBaseURLFromExtensionId(app->id())); | |
| 526 net::URLRequestContextGetter* extension_context_getter = | |
| 527 extension_partition->GetURLRequestContext(); | |
| 528 net::URLRequestContextGetter* main_context_getter = | |
| 529 otr_profile->GetRequestContext(); | |
| 530 | |
| 531 net::URLRequestContext* extension_context = nullptr; | |
| 532 net::URLRequestContext* main_context = nullptr; | |
| 533 base::RunLoop run_loop; | |
| 534 content::BrowserThread::PostTask( | |
| 535 content::BrowserThread::IO, FROM_HERE, | |
| 536 base::Bind(&FetchURLRequestContext, extension_context_getter, | |
| 537 &extension_context)); | |
| 538 content::BrowserThread::PostTaskAndReply( | |
| 539 content::BrowserThread::IO, FROM_HERE, | |
| 540 base::Bind(&FetchURLRequestContext, main_context_getter, &main_context), | |
| 541 run_loop.QuitClosure()); | |
| 542 run_loop.Run(); | |
| 543 | |
| 544 CHECK(extension_context); | |
| 545 CHECK(main_context); | |
| 546 | |
| 547 EXPECT_NE(extension_context, main_context); | |
| 548 EXPECT_NE(extension_context->channel_id_service(), | |
| 549 main_context->channel_id_service()); | |
| 550 } | |
| 551 | |
| 552 FlushIoTaskRunnerAndSpinThreads(); | |
| 553 } | |
| 554 | |
| 424 // The EndSession IO synchronization is only critical on Windows, but also | 555 // The EndSession IO synchronization is only critical on Windows, but also |
| 425 // happens under the USE_X11 define. See BrowserProcessImpl::EndSession. | 556 // happens under the USE_X11 define. See BrowserProcessImpl::EndSession. |
| 426 #if defined(USE_X11) || defined(OS_WIN) || defined(USE_OZONE) | 557 #if defined(USE_X11) || defined(OS_WIN) || defined(USE_OZONE) |
| 427 | 558 |
| 428 namespace { | 559 namespace { |
| 429 | 560 |
| 430 std::string GetExitTypePreferenceFromDisk(Profile* profile) { | 561 std::string GetExitTypePreferenceFromDisk(Profile* profile) { |
| 431 base::FilePath prefs_path = | 562 base::FilePath prefs_path = |
| 432 profile->GetPath().Append(chrome::kPreferencesFilename); | 563 profile->GetPath().Append(chrome::kPreferencesFilename); |
| 433 std::string prefs; | 564 std::string prefs; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 548 | 679 |
| 549 IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, | 680 IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, |
| 550 URLFetcherUsingExtensionContextDuringIncognitoTeardown) { | 681 URLFetcherUsingExtensionContextDuringIncognitoTeardown) { |
| 551 Browser* incognito_browser = | 682 Browser* incognito_browser = |
| 552 OpenURLOffTheRecord(browser()->profile(), GURL("about:blank")); | 683 OpenURLOffTheRecord(browser()->profile(), GURL("about:blank")); |
| 553 | 684 |
| 554 RunURLFetcherActiveDuringIncognitoTeardownTest( | 685 RunURLFetcherActiveDuringIncognitoTeardownTest( |
| 555 incognito_browser, | 686 incognito_browser, |
| 556 incognito_browser->profile()->GetRequestContextForExtensions()); | 687 incognito_browser->profile()->GetRequestContextForExtensions()); |
| 557 } | 688 } |
| OLD | NEW |