Home | History | Annotate | Download | only in base
      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 "chrome/test/base/testing_profile.h"
      6 
      7 #include "base/base_paths.h"
      8 #include "base/command_line.h"
      9 #include "base/files/file_util.h"
     10 #include "base/message_loop/message_loop_proxy.h"
     11 #include "base/path_service.h"
     12 #include "base/prefs/testing_pref_store.h"
     13 #include "base/run_loop.h"
     14 #include "base/strings/string_number_conversions.h"
     15 #include "chrome/browser/autocomplete/autocomplete_classifier.h"
     16 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
     17 #include "chrome/browser/bookmarks/chrome_bookmark_client.h"
     18 #include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
     19 #include "chrome/browser/browser_process.h"
     20 #include "chrome/browser/chrome_notification_types.h"
     21 #include "chrome/browser/content_settings/host_content_settings_map.h"
     22 #include "chrome/browser/extensions/extension_service.h"
     23 #include "chrome/browser/favicon/chrome_favicon_client_factory.h"
     24 #include "chrome/browser/favicon/favicon_service.h"
     25 #include "chrome/browser/favicon/favicon_service_factory.h"
     26 #include "chrome/browser/history/chrome_history_client.h"
     27 #include "chrome/browser/history/chrome_history_client_factory.h"
     28 #include "chrome/browser/history/history_backend.h"
     29 #include "chrome/browser/history/history_db_task.h"
     30 #include "chrome/browser/history/history_service.h"
     31 #include "chrome/browser/history/history_service_factory.h"
     32 #include "chrome/browser/history/top_sites.h"
     33 #include "chrome/browser/history/web_history_service_factory.h"
     34 #include "chrome/browser/net/pref_proxy_config_tracker.h"
     35 #include "chrome/browser/net/proxy_service_factory.h"
     36 #include "chrome/browser/notifications/desktop_notification_service.h"
     37 #include "chrome/browser/notifications/desktop_notification_service_factory.h"
     38 #include "chrome/browser/policy/profile_policy_connector.h"
     39 #include "chrome/browser/policy/profile_policy_connector_factory.h"
     40 #include "chrome/browser/prefs/browser_prefs.h"
     41 #include "chrome/browser/prefs/pref_service_syncable.h"
     42 #include "chrome/browser/prerender/prerender_manager.h"
     43 #include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h"
     44 #include "chrome/browser/profiles/profile_manager.h"
     45 #include "chrome/browser/profiles/storage_partition_descriptor.h"
     46 #include "chrome/browser/search_engines/template_url_fetcher_factory.h"
     47 #include "chrome/browser/webdata/web_data_service_factory.h"
     48 #include "chrome/common/chrome_constants.h"
     49 #include "chrome/common/chrome_switches.h"
     50 #include "chrome/common/pref_names.h"
     51 #include "chrome/common/url_constants.h"
     52 #include "chrome/test/base/history_index_restore_observer.h"
     53 #include "chrome/test/base/testing_pref_service_syncable.h"
     54 #include "chrome/test/base/ui_test_utils.h"
     55 #include "components/bookmarks/browser/bookmark_model.h"
     56 #include "components/bookmarks/common/bookmark_constants.h"
     57 #include "components/history/core/browser/top_sites_observer.h"
     58 #include "components/keyed_service/content/browser_context_dependency_manager.h"
     59 #include "components/policy/core/common/policy_service.h"
     60 #include "components/user_prefs/user_prefs.h"
     61 #include "content/public/browser/browser_thread.h"
     62 #include "content/public/browser/cookie_store_factory.h"
     63 #include "content/public/browser/notification_service.h"
     64 #include "content/public/browser/render_process_host.h"
     65 #include "content/public/browser/storage_partition.h"
     66 #include "content/public/test/mock_resource_context.h"
     67 #include "content/public/test/test_utils.h"
     68 #include "extensions/common/constants.h"
     69 #include "net/cookies/cookie_monster.h"
     70 #include "net/url_request/url_request_context.h"
     71 #include "net/url_request/url_request_context_getter.h"
     72 #include "net/url_request/url_request_test_util.h"
     73 #include "testing/gmock/include/gmock/gmock.h"
     74 
     75 #if defined(ENABLE_CONFIGURATION_POLICY)
     76 #include "chrome/browser/policy/schema_registry_service.h"
     77 #include "chrome/browser/policy/schema_registry_service_factory.h"
     78 #include "components/policy/core/common/configuration_policy_provider.h"
     79 #include "components/policy/core/common/policy_service_impl.h"
     80 #include "components/policy/core/common/schema.h"
     81 #else
     82 #include "components/policy/core/common/policy_service_stub.h"
     83 #endif  // defined(ENABLE_CONFIGURATION_POLICY)
     84 
     85 #if defined(ENABLE_EXTENSIONS)
     86 #include "chrome/browser/extensions/extension_special_storage_policy.h"
     87 #include "chrome/browser/extensions/extension_system_factory.h"
     88 #include "chrome/browser/extensions/test_extension_system.h"
     89 #include "extensions/browser/extension_system.h"
     90 #include "extensions/browser/guest_view/guest_view_manager.h"
     91 #endif
     92 
     93 #if defined(OS_ANDROID)
     94 #include "chrome/browser/signin/android_profile_oauth2_token_service.h"
     95 #endif
     96 
     97 #if defined(ENABLE_MANAGED_USERS)
     98 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
     99 #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
    100 #endif
    101 
    102 using base::Time;
    103 using content::BrowserThread;
    104 using content::DownloadManagerDelegate;
    105 using testing::NiceMock;
    106 using testing::Return;
    107 
    108 namespace {
    109 
    110 // Used to make sure TopSites has finished loading
    111 class WaitTopSitesLoadedObserver : public history::TopSitesObserver {
    112  public:
    113   explicit WaitTopSitesLoadedObserver(content::MessageLoopRunner* runner)
    114       : runner_(runner) {}
    115   virtual void TopSitesLoaded(history::TopSites* top_sites) OVERRIDE {
    116     runner_->Quit();
    117   }
    118   virtual void TopSitesChanged(history::TopSites* top_sites) OVERRIDE {}
    119 
    120  private:
    121   // weak
    122   content::MessageLoopRunner* runner_;
    123 };
    124 
    125 // Task used to make sure history has finished processing a request. Intended
    126 // for use with BlockUntilHistoryProcessesPendingRequests.
    127 
    128 class QuittingHistoryDBTask : public history::HistoryDBTask {
    129  public:
    130   QuittingHistoryDBTask() {}
    131 
    132   virtual bool RunOnDBThread(history::HistoryBackend* backend,
    133                              history::HistoryDatabase* db) OVERRIDE {
    134     return true;
    135   }
    136 
    137   virtual void DoneRunOnMainThread() OVERRIDE {
    138     base::MessageLoop::current()->Quit();
    139   }
    140 
    141  private:
    142   virtual ~QuittingHistoryDBTask() {}
    143 
    144   DISALLOW_COPY_AND_ASSIGN(QuittingHistoryDBTask);
    145 };
    146 
    147 class TestExtensionURLRequestContext : public net::URLRequestContext {
    148  public:
    149   TestExtensionURLRequestContext() {
    150     net::CookieMonster* cookie_monster =
    151         content::CreateCookieStore(content::CookieStoreConfig())->
    152             GetCookieMonster();
    153     const char* const schemes[] = {extensions::kExtensionScheme};
    154     cookie_monster->SetCookieableSchemes(schemes, arraysize(schemes));
    155     set_cookie_store(cookie_monster);
    156   }
    157 
    158   virtual ~TestExtensionURLRequestContext() {
    159     AssertNoURLRequests();
    160   }
    161 };
    162 
    163 class TestExtensionURLRequestContextGetter
    164     : public net::URLRequestContextGetter {
    165  public:
    166   virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE {
    167     if (!context_.get())
    168       context_.reset(new TestExtensionURLRequestContext());
    169     return context_.get();
    170   }
    171   virtual scoped_refptr<base::SingleThreadTaskRunner>
    172       GetNetworkTaskRunner() const OVERRIDE {
    173     return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
    174   }
    175 
    176  protected:
    177   virtual ~TestExtensionURLRequestContextGetter() {}
    178 
    179  private:
    180   scoped_ptr<net::URLRequestContext> context_;
    181 };
    182 
    183 #if defined(ENABLE_NOTIFICATIONS)
    184 KeyedService* CreateTestDesktopNotificationService(
    185     content::BrowserContext* profile) {
    186   return new DesktopNotificationService(static_cast<Profile*>(profile));
    187 }
    188 #endif
    189 
    190 }  // namespace
    191 
    192 // static
    193 #if defined(OS_CHROMEOS)
    194 // Must be kept in sync with
    195 // ChromeBrowserMainPartsChromeos::PreEarlyInitialization.
    196 const char TestingProfile::kTestUserProfileDir[] = "test-user";
    197 #else
    198 const char TestingProfile::kTestUserProfileDir[] = "Default";
    199 #endif
    200 
    201 TestingProfile::TestingProfile()
    202     : start_time_(Time::Now()),
    203       testing_prefs_(NULL),
    204       force_incognito_(false),
    205       original_profile_(NULL),
    206       guest_session_(false),
    207       last_session_exited_cleanly_(true),
    208       browser_context_dependency_manager_(
    209           BrowserContextDependencyManager::GetInstance()),
    210       resource_context_(NULL),
    211       delegate_(NULL) {
    212   CreateTempProfileDir();
    213   profile_path_ = temp_dir_.path();
    214 
    215   Init();
    216   FinishInit();
    217 }
    218 
    219 TestingProfile::TestingProfile(const base::FilePath& path)
    220     : start_time_(Time::Now()),
    221       testing_prefs_(NULL),
    222       force_incognito_(false),
    223       original_profile_(NULL),
    224       guest_session_(false),
    225       last_session_exited_cleanly_(true),
    226       profile_path_(path),
    227       browser_context_dependency_manager_(
    228           BrowserContextDependencyManager::GetInstance()),
    229       resource_context_(NULL),
    230       delegate_(NULL) {
    231   Init();
    232   FinishInit();
    233 }
    234 
    235 TestingProfile::TestingProfile(const base::FilePath& path,
    236                                Delegate* delegate)
    237     : start_time_(Time::Now()),
    238       testing_prefs_(NULL),
    239       force_incognito_(false),
    240       original_profile_(NULL),
    241       guest_session_(false),
    242       last_session_exited_cleanly_(true),
    243       profile_path_(path),
    244       browser_context_dependency_manager_(
    245           BrowserContextDependencyManager::GetInstance()),
    246       resource_context_(NULL),
    247       delegate_(delegate) {
    248   Init();
    249   if (delegate_) {
    250     base::MessageLoop::current()->PostTask(
    251         FROM_HERE,
    252         base::Bind(&TestingProfile::FinishInit, base::Unretained(this)));
    253   } else {
    254     FinishInit();
    255   }
    256 }
    257 
    258 TestingProfile::TestingProfile(
    259     const base::FilePath& path,
    260     Delegate* delegate,
    261 #if defined(ENABLE_EXTENSIONS)
    262     scoped_refptr<ExtensionSpecialStoragePolicy> extension_policy,
    263 #endif
    264     scoped_ptr<PrefServiceSyncable> prefs,
    265     TestingProfile* parent,
    266     bool guest_session,
    267     const std::string& supervised_user_id,
    268     scoped_ptr<policy::PolicyService> policy_service,
    269     const TestingFactories& factories)
    270     : start_time_(Time::Now()),
    271       prefs_(prefs.release()),
    272       testing_prefs_(NULL),
    273       force_incognito_(false),
    274       original_profile_(parent),
    275       guest_session_(guest_session),
    276       supervised_user_id_(supervised_user_id),
    277       last_session_exited_cleanly_(true),
    278 #if defined(ENABLE_EXTENSIONS)
    279       extension_special_storage_policy_(extension_policy),
    280 #endif
    281       profile_path_(path),
    282       browser_context_dependency_manager_(
    283           BrowserContextDependencyManager::GetInstance()),
    284       resource_context_(NULL),
    285       delegate_(delegate),
    286       policy_service_(policy_service.release()) {
    287   if (parent)
    288     parent->SetOffTheRecordProfile(scoped_ptr<Profile>(this));
    289 
    290   // If no profile path was supplied, create one.
    291   if (profile_path_.empty()) {
    292     CreateTempProfileDir();
    293     profile_path_ = temp_dir_.path();
    294   }
    295 
    296   // Set any testing factories prior to initializing the services.
    297   for (TestingFactories::const_iterator it = factories.begin();
    298        it != factories.end(); ++it) {
    299     it->first->SetTestingFactory(this, it->second);
    300   }
    301 
    302   Init();
    303   // If caller supplied a delegate, delay the FinishInit invocation until other
    304   // tasks have run.
    305   // TODO(atwilson): See if this is still required once we convert the current
    306   // users of the constructor that takes a Delegate* param.
    307   if (delegate_) {
    308     base::MessageLoop::current()->PostTask(
    309         FROM_HERE,
    310         base::Bind(&TestingProfile::FinishInit, base::Unretained(this)));
    311   } else {
    312     FinishInit();
    313   }
    314 }
    315 
    316 void TestingProfile::CreateTempProfileDir() {
    317   if (!temp_dir_.CreateUniqueTempDir()) {
    318     LOG(ERROR) << "Failed to create unique temporary directory.";
    319 
    320     // Fallback logic in case we fail to create unique temporary directory.
    321     base::FilePath system_tmp_dir;
    322     bool success = PathService::Get(base::DIR_TEMP, &system_tmp_dir);
    323 
    324     // We're severly screwed if we can't get the system temporary
    325     // directory. Die now to avoid writing to the filesystem root
    326     // or other bad places.
    327     CHECK(success);
    328 
    329     base::FilePath fallback_dir(
    330         system_tmp_dir.AppendASCII("TestingProfilePath"));
    331     base::DeleteFile(fallback_dir, true);
    332     base::CreateDirectory(fallback_dir);
    333     if (!temp_dir_.Set(fallback_dir)) {
    334       // That shouldn't happen, but if it does, try to recover.
    335       LOG(ERROR) << "Failed to use a fallback temporary directory.";
    336 
    337       // We're screwed if this fails, see CHECK above.
    338       CHECK(temp_dir_.Set(system_tmp_dir));
    339     }
    340   }
    341 }
    342 
    343 void TestingProfile::Init() {
    344   // If threads have been initialized, we should be on the UI thread.
    345   DCHECK(!content::BrowserThread::IsThreadInitialized(
    346              content::BrowserThread::UI) ||
    347          content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
    348 
    349 #if defined(OS_ANDROID)
    350   // Make sure token service knows its running in tests.
    351   AndroidProfileOAuth2TokenService::set_is_testing_profile();
    352 #endif
    353 
    354   // Normally this would happen during browser startup, but for tests
    355   // we need to trigger creation of Profile-related services.
    356   ChromeBrowserMainExtraPartsProfiles::
    357       EnsureBrowserContextKeyedServiceFactoriesBuilt();
    358 
    359   if (prefs_.get())
    360     user_prefs::UserPrefs::Set(this, prefs_.get());
    361   else if (IsOffTheRecord())
    362     CreateIncognitoPrefService();
    363   else
    364     CreateTestingPrefService();
    365 
    366   if (!base::PathExists(profile_path_))
    367     base::CreateDirectory(profile_path_);
    368 
    369   // TODO(joaodasilva): remove this once this PKS isn't created in ProfileImpl
    370   // anymore, after converting the PrefService to a PKS. Until then it must
    371   // be associated with a TestingProfile too.
    372   if (!IsOffTheRecord())
    373     CreateProfilePolicyConnector();
    374 
    375 #if defined(ENABLE_EXTENSIONS)
    376   extensions::ExtensionSystemFactory::GetInstance()->SetTestingFactory(
    377       this, extensions::TestExtensionSystem::Build);
    378 #endif
    379 
    380   // Prefs for incognito profiles are set in CreateIncognitoPrefService() by
    381   // simulating ProfileImpl::GetOffTheRecordPrefs().
    382   if (!IsOffTheRecord()) {
    383     DCHECK(!original_profile_);
    384     user_prefs::PrefRegistrySyncable* pref_registry =
    385         static_cast<user_prefs::PrefRegistrySyncable*>(
    386             prefs_->DeprecatedGetPrefRegistry());
    387     browser_context_dependency_manager_->
    388         RegisterProfilePrefsForServices(this, pref_registry);
    389   }
    390 
    391   browser_context_dependency_manager_->CreateBrowserContextServicesForTest(
    392       this);
    393 
    394 #if defined(ENABLE_NOTIFICATIONS)
    395   // Install profile keyed service factory hooks for dummy/test services
    396   DesktopNotificationServiceFactory::GetInstance()->SetTestingFactory(
    397       this, CreateTestDesktopNotificationService);
    398 #endif
    399 
    400 #if defined(ENABLE_MANAGED_USERS)
    401   if (!IsOffTheRecord()) {
    402     SupervisedUserSettingsService* settings_service =
    403         SupervisedUserSettingsServiceFactory::GetForProfile(this);
    404     TestingPrefStore* store = new TestingPrefStore();
    405     settings_service->Init(store);
    406     store->SetInitializationCompleted();
    407   }
    408 #endif
    409 
    410   profile_name_ = "testing_profile";
    411 }
    412 
    413 void TestingProfile::FinishInit() {
    414   DCHECK(content::NotificationService::current());
    415   content::NotificationService::current()->Notify(
    416       chrome::NOTIFICATION_PROFILE_CREATED,
    417       content::Source<Profile>(static_cast<Profile*>(this)),
    418       content::NotificationService::NoDetails());
    419 
    420   ProfileManager* profile_manager = g_browser_process->profile_manager();
    421   if (profile_manager)
    422     profile_manager->InitProfileUserPrefs(this);
    423 
    424   if (delegate_)
    425     delegate_->OnProfileCreated(this, true, false);
    426 }
    427 
    428 TestingProfile::~TestingProfile() {
    429   // Revert to non-incognito mode before shutdown.
    430   force_incognito_ = false;
    431 
    432   // If this profile owns an incognito profile, tear it down first.
    433   incognito_profile_.reset();
    434 
    435   // Any objects holding live URLFetchers should be deleted before teardown.
    436   TemplateURLFetcherFactory::ShutdownForProfile(this);
    437 
    438   MaybeSendDestroyedNotification();
    439 
    440   browser_context_dependency_manager_->DestroyBrowserContextServices(this);
    441 
    442   if (host_content_settings_map_.get())
    443     host_content_settings_map_->ShutdownOnUIThread();
    444 
    445   DestroyTopSites();
    446 
    447   if (pref_proxy_config_tracker_.get())
    448     pref_proxy_config_tracker_->DetachFromPrefService();
    449   // Failing a post == leaks == heapcheck failure. Make that an immediate test
    450   // failure.
    451   if (resource_context_) {
    452     CHECK(BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
    453                                     resource_context_));
    454     resource_context_ = NULL;
    455     content::RunAllPendingInMessageLoop(BrowserThread::IO);
    456   }
    457 }
    458 
    459 static KeyedService* BuildFaviconService(content::BrowserContext* profile) {
    460   FaviconClient* favicon_client =
    461       ChromeFaviconClientFactory::GetForProfile(static_cast<Profile*>(profile));
    462   return new FaviconService(static_cast<Profile*>(profile), favicon_client);
    463 }
    464 
    465 void TestingProfile::CreateFaviconService() {
    466   // It is up to the caller to create the history service if one is needed.
    467   FaviconServiceFactory::GetInstance()->SetTestingFactory(
    468       this, BuildFaviconService);
    469 }
    470 
    471 static KeyedService* BuildHistoryService(content::BrowserContext* context) {
    472   Profile* profile = static_cast<Profile*>(context);
    473   return new HistoryService(ChromeHistoryClientFactory::GetForProfile(profile),
    474                             profile);
    475 }
    476 
    477 bool TestingProfile::CreateHistoryService(bool delete_file, bool no_db) {
    478   DestroyHistoryService();
    479   if (delete_file) {
    480     base::FilePath path = GetPath();
    481     path = path.Append(chrome::kHistoryFilename);
    482     if (!base::DeleteFile(path, false) || base::PathExists(path))
    483       return false;
    484   }
    485   // This will create and init the history service.
    486   HistoryService* history_service = static_cast<HistoryService*>(
    487       HistoryServiceFactory::GetInstance()->SetTestingFactoryAndUse(
    488           this, BuildHistoryService));
    489   if (!history_service->Init(this->GetPath(), no_db)) {
    490     HistoryServiceFactory::GetInstance()->SetTestingFactoryAndUse(this, NULL);
    491   }
    492   // Disable WebHistoryService by default, since it makes network requests.
    493   WebHistoryServiceFactory::GetInstance()->SetTestingFactory(this, NULL);
    494   return true;
    495 }
    496 
    497 void TestingProfile::DestroyHistoryService() {
    498   HistoryService* history_service =
    499       HistoryServiceFactory::GetForProfileWithoutCreating(this);
    500   if (!history_service)
    501     return;
    502 
    503   history_service->ClearCachedDataForContextID(0);
    504   history_service->SetOnBackendDestroyTask(base::MessageLoop::QuitClosure());
    505   history_service->Cleanup();
    506   HistoryServiceFactory::ShutdownForProfile(this);
    507 
    508   // Wait for the backend class to terminate before deleting the files and
    509   // moving to the next test. Note: if this never terminates, somebody is
    510   // probably leaking a reference to the history backend, so it never calls
    511   // our destroy task.
    512   base::MessageLoop::current()->Run();
    513 
    514   // Make sure we don't have any event pending that could disrupt the next
    515   // test.
    516   base::MessageLoop::current()->PostTask(FROM_HERE,
    517                                          base::MessageLoop::QuitClosure());
    518   base::MessageLoop::current()->Run();
    519 }
    520 
    521 void TestingProfile::CreateTopSites() {
    522   DestroyTopSites();
    523   top_sites_ = history::TopSites::Create(
    524       this, GetPath().Append(chrome::kTopSitesFilename));
    525 }
    526 
    527 void TestingProfile::DestroyTopSites() {
    528   if (top_sites_.get()) {
    529     top_sites_->Shutdown();
    530     top_sites_ = NULL;
    531     // TopSitesImpl::Shutdown schedules some tasks (from TopSitesBackend) that
    532     // need to be run to properly shutdown. Run all pending tasks now. This is
    533     // normally handled by browser_process shutdown.
    534     if (base::MessageLoop::current())
    535       base::MessageLoop::current()->RunUntilIdle();
    536   }
    537 }
    538 
    539 static KeyedService* BuildBookmarkModel(content::BrowserContext* context) {
    540   Profile* profile = static_cast<Profile*>(context);
    541   ChromeBookmarkClient* bookmark_client =
    542       ChromeBookmarkClientFactory::GetForProfile(profile);
    543   BookmarkModel* bookmark_model = new BookmarkModel(bookmark_client);
    544   bookmark_client->Init(bookmark_model);
    545   bookmark_model->Load(profile->GetPrefs(),
    546                        profile->GetPrefs()->GetString(prefs::kAcceptLanguages),
    547                        profile->GetPath(),
    548                        profile->GetIOTaskRunner(),
    549                        content::BrowserThread::GetMessageLoopProxyForThread(
    550                            content::BrowserThread::UI));
    551   return bookmark_model;
    552 }
    553 
    554 static KeyedService* BuildChromeBookmarkClient(
    555     content::BrowserContext* context) {
    556   return new ChromeBookmarkClient(static_cast<Profile*>(context));
    557 }
    558 
    559 static KeyedService* BuildChromeHistoryClient(
    560     content::BrowserContext* context) {
    561   Profile* profile = static_cast<Profile*>(context);
    562   return new ChromeHistoryClient(BookmarkModelFactory::GetForProfile(profile),
    563                                  profile,
    564                                  profile->GetTopSites());
    565 }
    566 
    567 void TestingProfile::CreateBookmarkModel(bool delete_file) {
    568   if (delete_file) {
    569     base::FilePath path = GetPath().Append(bookmarks::kBookmarksFileName);
    570     base::DeleteFile(path, false);
    571   }
    572   ChromeHistoryClientFactory::GetInstance()->SetTestingFactory(
    573       this, BuildChromeHistoryClient);
    574   ChromeBookmarkClientFactory::GetInstance()->SetTestingFactory(
    575       this, BuildChromeBookmarkClient);
    576   // This creates the BookmarkModel.
    577   ignore_result(BookmarkModelFactory::GetInstance()->SetTestingFactoryAndUse(
    578       this, BuildBookmarkModel));
    579 }
    580 
    581 static KeyedService* BuildWebDataService(content::BrowserContext* profile) {
    582   return new WebDataServiceWrapper(static_cast<Profile*>(profile));
    583 }
    584 
    585 void TestingProfile::CreateWebDataService() {
    586   WebDataServiceFactory::GetInstance()->SetTestingFactory(
    587       this, BuildWebDataService);
    588 }
    589 
    590 void TestingProfile::BlockUntilHistoryIndexIsRefreshed() {
    591   // Only get the history service if it actually exists since the caller of the
    592   // test should explicitly call CreateHistoryService to build it.
    593   HistoryService* history_service =
    594       HistoryServiceFactory::GetForProfileWithoutCreating(this);
    595   DCHECK(history_service);
    596   history::InMemoryURLIndex* index = history_service->InMemoryIndex();
    597   if (!index || index->restored())
    598     return;
    599   base::RunLoop run_loop;
    600   HistoryIndexRestoreObserver observer(
    601       content::GetQuitTaskForRunLoop(&run_loop));
    602   index->set_restore_cache_observer(&observer);
    603   run_loop.Run();
    604   index->set_restore_cache_observer(NULL);
    605   DCHECK(index->restored());
    606 }
    607 
    608 // TODO(phajdan.jr): Doesn't this hang if Top Sites are already loaded?
    609 void TestingProfile::BlockUntilTopSitesLoaded() {
    610   scoped_refptr<content::MessageLoopRunner> runner =
    611       new content::MessageLoopRunner;
    612   WaitTopSitesLoadedObserver observer(runner.get());
    613   top_sites_->AddObserver(&observer);
    614   runner->Run();
    615   top_sites_->RemoveObserver(&observer);
    616 }
    617 
    618 void TestingProfile::SetGuestSession(bool guest) {
    619   guest_session_ = guest;
    620 }
    621 
    622 base::FilePath TestingProfile::GetPath() const {
    623   return profile_path_;
    624 }
    625 
    626 scoped_refptr<base::SequencedTaskRunner> TestingProfile::GetIOTaskRunner() {
    627   return base::MessageLoop::current()->message_loop_proxy();
    628 }
    629 
    630 TestingPrefServiceSyncable* TestingProfile::GetTestingPrefService() {
    631   DCHECK(prefs_);
    632   DCHECK(testing_prefs_);
    633   return testing_prefs_;
    634 }
    635 
    636 TestingProfile* TestingProfile::AsTestingProfile() {
    637   return this;
    638 }
    639 
    640 std::string TestingProfile::GetProfileName() {
    641   return profile_name_;
    642 }
    643 
    644 Profile::ProfileType TestingProfile::GetProfileType() const {
    645   if (guest_session_)
    646     return GUEST_PROFILE;
    647   if (force_incognito_ || original_profile_)
    648     return INCOGNITO_PROFILE;
    649   return REGULAR_PROFILE;
    650 }
    651 
    652 bool TestingProfile::IsOffTheRecord() const {
    653   return force_incognito_ || original_profile_;
    654 }
    655 
    656 void TestingProfile::SetOffTheRecordProfile(scoped_ptr<Profile> profile) {
    657   DCHECK(!IsOffTheRecord());
    658   DCHECK_EQ(this, profile->GetOriginalProfile());
    659   incognito_profile_ = profile.Pass();
    660 }
    661 
    662 Profile* TestingProfile::GetOffTheRecordProfile() {
    663   if (IsOffTheRecord())
    664     return this;
    665   if (!incognito_profile_)
    666     TestingProfile::Builder().BuildIncognito(this);
    667   return incognito_profile_.get();
    668 }
    669 
    670 bool TestingProfile::HasOffTheRecordProfile() {
    671   return incognito_profile_.get() != NULL;
    672 }
    673 
    674 Profile* TestingProfile::GetOriginalProfile() {
    675   if (original_profile_)
    676     return original_profile_;
    677   return this;
    678 }
    679 
    680 bool TestingProfile::IsSupervised() {
    681   return !supervised_user_id_.empty();
    682 }
    683 
    684 #if defined(ENABLE_EXTENSIONS)
    685 void TestingProfile::SetExtensionSpecialStoragePolicy(
    686     ExtensionSpecialStoragePolicy* extension_special_storage_policy) {
    687   extension_special_storage_policy_ = extension_special_storage_policy;
    688 }
    689 #endif
    690 
    691 ExtensionSpecialStoragePolicy*
    692 TestingProfile::GetExtensionSpecialStoragePolicy() {
    693 #if defined(ENABLE_EXTENSIONS)
    694   if (!extension_special_storage_policy_.get())
    695     extension_special_storage_policy_ = new ExtensionSpecialStoragePolicy(NULL);
    696   return extension_special_storage_policy_.get();
    697 #else
    698   return NULL;
    699 #endif
    700 }
    701 
    702 net::CookieMonster* TestingProfile::GetCookieMonster() {
    703   if (!GetRequestContext())
    704     return NULL;
    705   return GetRequestContext()->GetURLRequestContext()->cookie_store()->
    706       GetCookieMonster();
    707 }
    708 
    709 void TestingProfile::CreateTestingPrefService() {
    710   DCHECK(!prefs_.get());
    711   testing_prefs_ = new TestingPrefServiceSyncable();
    712   prefs_.reset(testing_prefs_);
    713   user_prefs::UserPrefs::Set(this, prefs_.get());
    714   chrome::RegisterUserProfilePrefs(testing_prefs_->registry());
    715 }
    716 
    717 void TestingProfile::CreateIncognitoPrefService() {
    718   DCHECK(original_profile_);
    719   DCHECK(!testing_prefs_);
    720   // Simplified version of ProfileImpl::GetOffTheRecordPrefs(). Note this
    721   // leaves testing_prefs_ unset.
    722   prefs_.reset(original_profile_->prefs_->CreateIncognitoPrefService(NULL));
    723   user_prefs::UserPrefs::Set(this, prefs_.get());
    724 }
    725 
    726 void TestingProfile::CreateProfilePolicyConnector() {
    727 #if defined(ENABLE_CONFIGURATION_POLICY)
    728   schema_registry_service_ =
    729       policy::SchemaRegistryServiceFactory::CreateForContext(
    730           this, policy::Schema(), NULL);
    731   CHECK_EQ(schema_registry_service_.get(),
    732            policy::SchemaRegistryServiceFactory::GetForContext(this));
    733 #endif  // defined(ENABLE_CONFIGURATION_POLICY)
    734 
    735 if (!policy_service_) {
    736 #if defined(ENABLE_CONFIGURATION_POLICY)
    737     std::vector<policy::ConfigurationPolicyProvider*> providers;
    738     policy_service_.reset(new policy::PolicyServiceImpl(providers));
    739 #else
    740     policy_service_.reset(new policy::PolicyServiceStub());
    741 #endif
    742   }
    743   profile_policy_connector_.reset(new policy::ProfilePolicyConnector());
    744   profile_policy_connector_->InitForTesting(policy_service_.Pass());
    745   policy::ProfilePolicyConnectorFactory::GetInstance()->SetServiceForTesting(
    746       this, profile_policy_connector_.get());
    747   CHECK_EQ(profile_policy_connector_.get(),
    748            policy::ProfilePolicyConnectorFactory::GetForProfile(this));
    749 }
    750 
    751 PrefService* TestingProfile::GetPrefs() {
    752   DCHECK(prefs_);
    753   return prefs_.get();
    754 }
    755 
    756 history::TopSites* TestingProfile::GetTopSites() {
    757   return top_sites_.get();
    758 }
    759 
    760 history::TopSites* TestingProfile::GetTopSitesWithoutCreating() {
    761   return top_sites_.get();
    762 }
    763 
    764 DownloadManagerDelegate* TestingProfile::GetDownloadManagerDelegate() {
    765   return NULL;
    766 }
    767 
    768 net::URLRequestContextGetter* TestingProfile::GetRequestContext() {
    769   return GetDefaultStoragePartition(this)->GetURLRequestContext();
    770 }
    771 
    772 net::URLRequestContextGetter* TestingProfile::CreateRequestContext(
    773     content::ProtocolHandlerMap* protocol_handlers,
    774     content::URLRequestInterceptorScopedVector request_interceptors) {
    775   return new net::TestURLRequestContextGetter(
    776             BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
    777 }
    778 
    779 net::URLRequestContextGetter* TestingProfile::GetRequestContextForRenderProcess(
    780     int renderer_child_id) {
    781   content::RenderProcessHost* rph = content::RenderProcessHost::FromID(
    782       renderer_child_id);
    783   return rph->GetStoragePartition()->GetURLRequestContext();
    784 }
    785 
    786 net::URLRequestContextGetter* TestingProfile::GetMediaRequestContext() {
    787   return NULL;
    788 }
    789 
    790 net::URLRequestContextGetter*
    791 TestingProfile::GetMediaRequestContextForRenderProcess(
    792     int renderer_child_id) {
    793   return NULL;
    794 }
    795 
    796 net::URLRequestContextGetter*
    797 TestingProfile::GetMediaRequestContextForStoragePartition(
    798     const base::FilePath& partition_path,
    799     bool in_memory) {
    800   return NULL;
    801 }
    802 
    803 net::URLRequestContextGetter* TestingProfile::GetRequestContextForExtensions() {
    804   if (!extensions_request_context_.get())
    805     extensions_request_context_ = new TestExtensionURLRequestContextGetter();
    806   return extensions_request_context_.get();
    807 }
    808 
    809 net::SSLConfigService* TestingProfile::GetSSLConfigService() {
    810   if (!GetRequestContext())
    811     return NULL;
    812   return GetRequestContext()->GetURLRequestContext()->ssl_config_service();
    813 }
    814 
    815 net::URLRequestContextGetter*
    816 TestingProfile::CreateRequestContextForStoragePartition(
    817     const base::FilePath& partition_path,
    818     bool in_memory,
    819     content::ProtocolHandlerMap* protocol_handlers,
    820     content::URLRequestInterceptorScopedVector request_interceptors) {
    821   // We don't test storage partitions here yet, so returning the same dummy
    822   // context is sufficient for now.
    823   return GetRequestContext();
    824 }
    825 
    826 content::ResourceContext* TestingProfile::GetResourceContext() {
    827   if (!resource_context_)
    828     resource_context_ = new content::MockResourceContext();
    829   return resource_context_;
    830 }
    831 
    832 HostContentSettingsMap* TestingProfile::GetHostContentSettingsMap() {
    833   if (!host_content_settings_map_.get()) {
    834     host_content_settings_map_ = new HostContentSettingsMap(GetPrefs(), false);
    835 #if defined(ENABLE_EXTENSIONS)
    836     ExtensionService* extension_service =
    837         extensions::ExtensionSystem::Get(this)->extension_service();
    838     if (extension_service) {
    839       extension_service->RegisterContentSettings(
    840           host_content_settings_map_.get());
    841     }
    842 #endif
    843   }
    844   return host_content_settings_map_.get();
    845 }
    846 
    847 content::BrowserPluginGuestManager* TestingProfile::GetGuestManager() {
    848 #if defined(ENABLE_EXTENSIONS)
    849   return extensions::GuestViewManager::FromBrowserContext(this);
    850 #else
    851   return NULL;
    852 #endif
    853 }
    854 
    855 content::PushMessagingService* TestingProfile::GetPushMessagingService() {
    856   return NULL;
    857 }
    858 
    859 bool TestingProfile::IsSameProfile(Profile *p) {
    860   return this == p;
    861 }
    862 
    863 base::Time TestingProfile::GetStartTime() const {
    864   return start_time_;
    865 }
    866 
    867 base::FilePath TestingProfile::last_selected_directory() {
    868   return last_selected_directory_;
    869 }
    870 
    871 void TestingProfile::set_last_selected_directory(const base::FilePath& path) {
    872   last_selected_directory_ = path;
    873 }
    874 
    875 PrefProxyConfigTracker* TestingProfile::GetProxyConfigTracker() {
    876   if (!pref_proxy_config_tracker_.get()) {
    877     // TestingProfile is used in unit tests, where local state is not available.
    878     pref_proxy_config_tracker_.reset(
    879         ProxyServiceFactory::CreatePrefProxyConfigTrackerOfProfile(GetPrefs(),
    880                                                                    NULL));
    881   }
    882   return pref_proxy_config_tracker_.get();
    883 }
    884 
    885 void TestingProfile::BlockUntilHistoryProcessesPendingRequests() {
    886   HistoryService* history_service =
    887       HistoryServiceFactory::GetForProfile(this, Profile::EXPLICIT_ACCESS);
    888   DCHECK(history_service);
    889   DCHECK(base::MessageLoop::current());
    890 
    891   base::CancelableTaskTracker tracker;
    892   history_service->ScheduleDBTask(
    893       scoped_ptr<history::HistoryDBTask>(
    894           new QuittingHistoryDBTask()),
    895       &tracker);
    896   base::MessageLoop::current()->Run();
    897 }
    898 
    899 chrome_browser_net::Predictor* TestingProfile::GetNetworkPredictor() {
    900   return NULL;
    901 }
    902 
    903 DevToolsNetworkController* TestingProfile::GetDevToolsNetworkController() {
    904   return NULL;
    905 }
    906 
    907 void TestingProfile::ClearNetworkingHistorySince(
    908     base::Time time,
    909     const base::Closure& completion) {
    910   if (!completion.is_null()) {
    911     BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion);
    912   }
    913 }
    914 
    915 GURL TestingProfile::GetHomePage() {
    916   return GURL(chrome::kChromeUINewTabURL);
    917 }
    918 
    919 PrefService* TestingProfile::GetOffTheRecordPrefs() {
    920   return NULL;
    921 }
    922 
    923 storage::SpecialStoragePolicy* TestingProfile::GetSpecialStoragePolicy() {
    924 #if defined(ENABLE_EXTENSIONS)
    925   return GetExtensionSpecialStoragePolicy();
    926 #else
    927   return NULL;
    928 #endif
    929 }
    930 
    931 content::SSLHostStateDelegate* TestingProfile::GetSSLHostStateDelegate() {
    932   return NULL;
    933 }
    934 
    935 bool TestingProfile::WasCreatedByVersionOrLater(const std::string& version) {
    936   return true;
    937 }
    938 
    939 bool TestingProfile::IsGuestSession() const {
    940   return guest_session_;
    941 }
    942 
    943 Profile::ExitType TestingProfile::GetLastSessionExitType() {
    944   return last_session_exited_cleanly_ ? EXIT_NORMAL : EXIT_CRASHED;
    945 }
    946 
    947 TestingProfile::Builder::Builder()
    948     : build_called_(false),
    949       delegate_(NULL),
    950       guest_session_(false) {
    951 }
    952 
    953 TestingProfile::Builder::~Builder() {
    954 }
    955 
    956 void TestingProfile::Builder::SetPath(const base::FilePath& path) {
    957   path_ = path;
    958 }
    959 
    960 void TestingProfile::Builder::SetDelegate(Delegate* delegate) {
    961   delegate_ = delegate;
    962 }
    963 
    964 #if defined(ENABLE_EXTENSIONS)
    965 void TestingProfile::Builder::SetExtensionSpecialStoragePolicy(
    966     scoped_refptr<ExtensionSpecialStoragePolicy> policy) {
    967   extension_policy_ = policy;
    968 }
    969 #endif
    970 
    971 void TestingProfile::Builder::SetPrefService(
    972     scoped_ptr<PrefServiceSyncable> prefs) {
    973   pref_service_ = prefs.Pass();
    974 }
    975 
    976 void TestingProfile::Builder::SetGuestSession() {
    977   guest_session_ = true;
    978 }
    979 
    980 void TestingProfile::Builder::SetSupervisedUserId(
    981     const std::string& supervised_user_id) {
    982   supervised_user_id_ = supervised_user_id;
    983 }
    984 
    985 void TestingProfile::Builder::SetPolicyService(
    986     scoped_ptr<policy::PolicyService> policy_service) {
    987   policy_service_ = policy_service.Pass();
    988 }
    989 
    990 void TestingProfile::Builder::AddTestingFactory(
    991     BrowserContextKeyedServiceFactory* service_factory,
    992     BrowserContextKeyedServiceFactory::TestingFactoryFunction callback) {
    993   testing_factories_.push_back(std::make_pair(service_factory, callback));
    994 }
    995 
    996 scoped_ptr<TestingProfile> TestingProfile::Builder::Build() {
    997   DCHECK(!build_called_);
    998   build_called_ = true;
    999 
   1000   return scoped_ptr<TestingProfile>(new TestingProfile(path_,
   1001                                                        delegate_,
   1002 #if defined(ENABLE_EXTENSIONS)
   1003                                                        extension_policy_,
   1004 #endif
   1005                                                        pref_service_.Pass(),
   1006                                                        NULL,
   1007                                                        guest_session_,
   1008                                                        supervised_user_id_,
   1009                                                        policy_service_.Pass(),
   1010                                                        testing_factories_));
   1011 }
   1012 
   1013 TestingProfile* TestingProfile::Builder::BuildIncognito(
   1014     TestingProfile* original_profile) {
   1015   DCHECK(!build_called_);
   1016   DCHECK(original_profile);
   1017   build_called_ = true;
   1018 
   1019   // Note: Owned by |original_profile|.
   1020   return new TestingProfile(path_,
   1021                             delegate_,
   1022 #if defined(ENABLE_EXTENSIONS)
   1023                             extension_policy_,
   1024 #endif
   1025                             pref_service_.Pass(),
   1026                             original_profile,
   1027                             guest_session_,
   1028                             supervised_user_id_,
   1029                             policy_service_.Pass(),
   1030                             testing_factories_);
   1031 }
   1032