blob: c2cc6faf6ad1a72d840a22eb9ce31331e73a1bd9 [file] [log] [blame]
[email protected]e7e46732012-01-05 11:45:551// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]a4ff9eae2011-08-01 19:58:165#include "chrome/test/base/testing_profile.h"
initial.commit09911bf2008-07-26 23:55:296
[email protected]a42b5592009-09-03 16:52:237#include "build/build_config.h"
[email protected]dbbad7a2010-08-13 18:18:368
9#include "base/base_paths.h"
[email protected]e3e43d92010-02-26 22:02:3810#include "base/command_line.h"
[email protected]dbbad7a2010-08-13 18:18:3611#include "base/file_util.h"
[email protected]76ae8a62013-05-10 05:34:2212#include "base/message_loop/message_loop_proxy.h"
[email protected]dbbad7a2010-08-13 18:18:3613#include "base/path_service.h"
[email protected]03b9b4e2012-10-22 20:01:5214#include "base/prefs/testing_pref_store.h"
[email protected]8e937c1e2012-06-28 22:57:3015#include "base/run_loop.h"
[email protected]3ea1b182013-02-08 22:38:4116#include "base/strings/string_number_conversions.h"
[email protected]dbbad7a2010-08-13 18:18:3617#include "chrome/browser/autocomplete/autocomplete_classifier.h"
[email protected]a9afddb2009-02-12 17:49:4218#include "chrome/browser/bookmarks/bookmark_model.h"
[email protected]f61f4782012-06-08 21:54:2119#include "chrome/browser/bookmarks/bookmark_model_factory.h"
[email protected]1459fb62011-05-25 19:03:2720#include "chrome/browser/browser_process.h"
[email protected]81d49782013-07-12 01:50:5221#include "chrome/browser/chrome_notification_types.h"
[email protected]9d01a6a2010-11-30 12:03:3322#include "chrome/browser/content_settings/host_content_settings_map.h"
[email protected]2f69b382011-02-19 00:34:2523#include "chrome/browser/extensions/extension_service.h"
[email protected]19eb80152011-02-26 00:28:4324#include "chrome/browser/extensions/extension_special_storage_policy.h"
[email protected]31d8f5f22012-04-02 15:22:0825#include "chrome/browser/extensions/extension_system.h"
26#include "chrome/browser/extensions/extension_system_factory.h"
27#include "chrome/browser/extensions/test_extension_system.h"
[email protected]ee2ed42c2011-04-28 22:19:1428#include "chrome/browser/favicon/favicon_service.h"
[email protected]f3d2b312012-08-23 22:27:5929#include "chrome/browser/favicon/favicon_service_factory.h"
[email protected]c476e632011-06-23 11:18:0430#include "chrome/browser/geolocation/chrome_geolocation_permission_context.h"
[email protected]b2cf4522012-10-23 00:11:5731#include "chrome/browser/geolocation/chrome_geolocation_permission_context_factory.h"
[email protected]075ae732009-02-11 23:58:3132#include "chrome/browser/history/history_backend.h"
[email protected]d891f522013-02-08 03:24:4133#include "chrome/browser/history/history_db_task.h"
[email protected]6a2c09f2013-01-25 04:50:0734#include "chrome/browser/history/history_service.h"
[email protected]f61f4782012-06-08 21:54:2135#include "chrome/browser/history/history_service_factory.h"
[email protected]572f40c9b2012-07-06 20:35:3336#include "chrome/browser/history/shortcuts_backend.h"
37#include "chrome/browser/history/shortcuts_backend_factory.h"
[email protected]dbbad7a2010-08-13 18:18:3638#include "chrome/browser/history/top_sites.h"
[email protected]a50e16a2013-04-25 14:07:1739#include "chrome/browser/history/web_history_service_factory.h"
[email protected]6f96cbcb2011-11-04 02:26:0740#include "chrome/browser/net/proxy_service_factory.h"
[email protected]dbbad7a2010-08-13 18:18:3641#include "chrome/browser/notifications/desktop_notification_service.h"
[email protected]dcb72d52011-04-13 12:36:5342#include "chrome/browser/notifications/desktop_notification_service_factory.h"
[email protected]d81bb3e2013-05-02 18:17:0343#include "chrome/browser/policy/profile_policy_connector.h"
44#include "chrome/browser/policy/profile_policy_connector_factory.h"
[email protected]37858e52010-08-26 00:22:0245#include "chrome/browser/prefs/browser_prefs.h"
[email protected]c753f142013-02-10 13:14:0446#include "chrome/browser/prefs/pref_service_syncable.h"
[email protected]4850a7f2011-03-08 23:36:5947#include "chrome/browser/prerender/prerender_manager.h"
[email protected]7e75e4a2013-05-17 17:20:0348#include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h"
[email protected]27ddfed22012-10-30 23:22:4349#include "chrome/browser/profiles/storage_partition_descriptor.h"
[email protected]16bd088b2012-04-03 08:12:1250#include "chrome/browser/search_engines/template_url_fetcher_factory.h"
[email protected]810ffba2012-06-12 01:07:4851#include "chrome/browser/webdata/web_data_service.h"
[email protected]d07edd42012-05-14 23:49:4652#include "chrome/browser/webdata/web_data_service_factory.h"
[email protected]a9afddb2009-02-12 17:49:4253#include "chrome/common/chrome_constants.h"
[email protected]9e33d7e2011-09-30 16:43:5454#include "chrome/common/chrome_switches.h"
[email protected]dbbad7a2010-08-13 18:18:3655#include "chrome/common/url_constants.h"
[email protected]7bc60682011-07-29 20:55:5956#include "chrome/test/base/bookmark_load_observer.h"
[email protected]18a15ca82012-08-30 00:28:1657#include "chrome/test/base/history_index_restore_observer.h"
[email protected]7688968a2013-02-12 21:45:1358#include "chrome/test/base/testing_pref_service_syncable.h"
[email protected]af44e7fb2011-07-29 18:32:3259#include "chrome/test/base/ui_test_utils.h"
[email protected]0dd6f2032013-05-20 23:33:4060#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
[email protected]75fee372013-03-06 00:42:4461#include "components/user_prefs/user_prefs.h"
[email protected]c38831a12011-10-28 12:44:4962#include "content/public/browser/browser_thread.h"
[email protected]ad50def52011-10-19 23:17:0763#include "content/public/browser/notification_service.h"
[email protected]fb29e6cf2012-07-12 21:27:2064#include "content/public/browser/render_process_host.h"
[email protected]885c0e92012-11-13 20:27:4265#include "content/public/browser/storage_partition.h"
[email protected]08a932d52012-06-03 21:42:1266#include "content/public/test/mock_resource_context.h"
[email protected]a7fe9112012-07-20 02:34:4567#include "content/public/test/test_utils.h"
[email protected]885c0e92012-11-13 20:27:4268#include "extensions/common/constants.h"
[email protected]aa84a7e2012-03-15 21:29:0669#include "net/cookies/cookie_monster.h"
[email protected]812b3a32010-01-08 05:36:0470#include "net/url_request/url_request_context.h"
[email protected]abe2c032011-03-31 18:49:3471#include "net/url_request/url_request_context_getter.h"
[email protected]d2db0292011-01-26 20:23:4472#include "net/url_request/url_request_test_util.h"
[email protected]4772b072010-03-30 17:45:4673#include "testing/gmock/include/gmock/gmock.h"
[email protected]248ce192011-02-10 15:26:3474
[email protected]21d3a882012-05-31 14:41:5575#if defined(ENABLE_CONFIGURATION_POLICY)
[email protected]d81bb3e2013-05-02 18:17:0376#include "chrome/browser/policy/configuration_policy_provider.h"
[email protected]21d3a882012-05-31 14:41:5577#include "chrome/browser/policy/policy_service_impl.h"
78#else
79#include "chrome/browser/policy/policy_service_stub.h"
80#endif // defined(ENABLE_CONFIGURATION_POLICY)
81
[email protected]6f96cbcb2011-11-04 02:26:0782#if defined(OS_CHROMEOS)
83#include "chrome/browser/chromeos/proxy_config_service_impl.h"
84#endif // defined(OS_CHROMEOS)
85
[email protected]e1acf6f2008-10-27 20:43:3386using base::Time;
[email protected]631bb742011-11-02 11:29:3987using content::BrowserThread;
[email protected]b441a8492012-06-06 14:55:5788using content::DownloadManagerDelegate;
[email protected]3c887412010-04-19 20:30:2389using testing::NiceMock;
[email protected]4772b072010-03-30 17:45:4690using testing::Return;
[email protected]e1acf6f2008-10-27 20:43:3391
[email protected]d364c652008-08-29 19:46:5692namespace {
93
[email protected]0bfc29a2009-04-27 16:15:4494// Task used to make sure history has finished processing a request. Intended
95// for use with BlockUntilHistoryProcessesPendingRequests.
96
[email protected]d891f522013-02-08 03:24:4197class QuittingHistoryDBTask : public history::HistoryDBTask {
[email protected]0bfc29a2009-04-27 16:15:4498 public:
99 QuittingHistoryDBTask() {}
100
101 virtual bool RunOnDBThread(history::HistoryBackend* backend,
[email protected]be9826e62013-02-07 02:00:58102 history::HistoryDatabase* db) OVERRIDE {
[email protected]0bfc29a2009-04-27 16:15:44103 return true;
104 }
105
[email protected]be9826e62013-02-07 02:00:58106 virtual void DoneRunOnMainThread() OVERRIDE {
[email protected]bb024fe2013-05-10 21:33:26107 base::MessageLoop::current()->Quit();
[email protected]0bfc29a2009-04-27 16:15:44108 }
109
110 private:
[email protected]be9826e62013-02-07 02:00:58111 virtual ~QuittingHistoryDBTask() {}
[email protected]7991a232009-11-06 01:55:48112
[email protected]0bfc29a2009-04-27 16:15:44113 DISALLOW_COPY_AND_ASSIGN(QuittingHistoryDBTask);
114};
115
[email protected]aeb53f02011-01-15 00:21:34116class TestExtensionURLRequestContext : public net::URLRequestContext {
[email protected]c10da4b02010-03-25 14:38:32117 public:
118 TestExtensionURLRequestContext() {
119 net::CookieMonster* cookie_monster = new net::CookieMonster(NULL, NULL);
[email protected]885c0e92012-11-13 20:27:42120 const char* schemes[] = {extensions::kExtensionScheme};
[email protected]c10da4b02010-03-25 14:38:32121 cookie_monster->SetCookieableSchemes(schemes, 1);
[email protected]f6c21cb2011-02-16 19:45:41122 set_cookie_store(cookie_monster);
[email protected]c10da4b02010-03-25 14:38:32123 }
[email protected]7b2720b2012-04-25 16:59:11124
[email protected]7b2720b2012-04-25 16:59:11125 virtual ~TestExtensionURLRequestContext() {}
[email protected]c10da4b02010-03-25 14:38:32126};
127
[email protected]abe2c032011-03-31 18:49:34128class TestExtensionURLRequestContextGetter
129 : public net::URLRequestContextGetter {
[email protected]c10da4b02010-03-25 14:38:32130 public:
[email protected]be9826e62013-02-07 02:00:58131 virtual net::URLRequestContext* GetURLRequestContext() OVERRIDE {
[email protected]ef2bf422012-05-11 03:27:09132 if (!context_.get())
133 context_.reset(new TestExtensionURLRequestContext());
[email protected]c10da4b02010-03-25 14:38:32134 return context_.get();
135 }
[email protected]4969b0122012-06-16 01:58:28136 virtual scoped_refptr<base::SingleThreadTaskRunner>
137 GetNetworkTaskRunner() const OVERRIDE {
[email protected]0c7d74f2010-10-11 11:55:26138 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
[email protected]83a7d2eb2010-05-03 21:46:19139 }
[email protected]c10da4b02010-03-25 14:38:32140
[email protected]13ed17f82012-04-06 02:27:18141 protected:
142 virtual ~TestExtensionURLRequestContextGetter() {}
143
[email protected]c10da4b02010-03-25 14:38:32144 private:
[email protected]ef2bf422012-05-11 03:27:09145 scoped_ptr<net::URLRequestContext> context_;
[email protected]c10da4b02010-03-25 14:38:32146};
147
[email protected]f1484c52013-05-22 23:25:44148BrowserContextKeyedService* CreateTestDesktopNotificationService(
[email protected]c7fa4362013-04-26 18:09:02149 content::BrowserContext* profile) {
[email protected]29cebbd2012-06-06 21:43:42150#if defined(ENABLE_NOTIFICATIONS)
[email protected]c7fa4362013-04-26 18:09:02151 return new DesktopNotificationService(static_cast<Profile*>(profile), NULL);
[email protected]29cebbd2012-06-06 21:43:42152#else
153 return NULL;
154#endif
[email protected]dcb72d52011-04-13 12:36:53155}
156
[email protected]d364c652008-08-29 19:46:56157} // namespace
158
[email protected]89dbb1772012-07-17 13:47:25159// static
160#if defined(OS_CHROMEOS)
161// Must be kept in sync with
162// ChromeBrowserMainPartsChromeos::PreEarlyInitialization.
163const char TestingProfile::kTestUserProfileDir[] = "test-user";
164#else
165const char TestingProfile::kTestUserProfileDir[] = "Default";
166#endif
167
[email protected]f25387b2008-08-21 15:20:33168TestingProfile::TestingProfile()
[email protected]ea6f76572008-12-18 00:09:55169 : start_time_(Time::Now()),
[email protected]2fb7dc982010-09-29 12:24:28170 testing_prefs_(NULL),
[email protected]5bb2f522011-03-25 19:04:44171 incognito_(false),
[email protected]074311a2013-02-28 23:14:09172 original_profile_(NULL),
[email protected]5cdcd152011-03-31 22:48:52173 last_session_exited_cleanly_(true),
[email protected]f0901a22013-05-27 21:37:53174 browser_context_dependency_manager_(
[email protected]f1484c52013-05-22 23:25:44175 BrowserContextDependencyManager::GetInstance()),
[email protected]537c1082011-12-02 02:37:17176 delegate_(NULL) {
[email protected]5c4c89f2012-08-07 21:09:59177 CreateTempProfileDir();
[email protected]49a25632011-08-31 17:03:48178 profile_path_ = temp_dir_.path();
179
180 Init();
[email protected]537c1082011-12-02 02:37:17181 FinishInit();
[email protected]49a25632011-08-31 17:03:48182}
183
[email protected]152ea302013-02-11 04:08:40184TestingProfile::TestingProfile(const base::FilePath& path)
[email protected]49a25632011-08-31 17:03:48185 : start_time_(Time::Now()),
186 testing_prefs_(NULL),
187 incognito_(false),
[email protected]074311a2013-02-28 23:14:09188 original_profile_(NULL),
[email protected]49a25632011-08-31 17:03:48189 last_session_exited_cleanly_(true),
190 profile_path_(path),
[email protected]f0901a22013-05-27 21:37:53191 browser_context_dependency_manager_(
[email protected]f1484c52013-05-22 23:25:44192 BrowserContextDependencyManager::GetInstance()),
[email protected]537c1082011-12-02 02:37:17193 delegate_(NULL) {
[email protected]49a25632011-08-31 17:03:48194 Init();
[email protected]537c1082011-12-02 02:37:17195 FinishInit();
196}
197
[email protected]152ea302013-02-11 04:08:40198TestingProfile::TestingProfile(const base::FilePath& path,
[email protected]537c1082011-12-02 02:37:17199 Delegate* delegate)
200 : start_time_(Time::Now()),
201 testing_prefs_(NULL),
202 incognito_(false),
[email protected]074311a2013-02-28 23:14:09203 original_profile_(NULL),
[email protected]537c1082011-12-02 02:37:17204 last_session_exited_cleanly_(true),
205 profile_path_(path),
[email protected]f0901a22013-05-27 21:37:53206 browser_context_dependency_manager_(
[email protected]f1484c52013-05-22 23:25:44207 BrowserContextDependencyManager::GetInstance()),
[email protected]537c1082011-12-02 02:37:17208 delegate_(delegate) {
209 Init();
210 if (delegate_) {
[email protected]bb024fe2013-05-10 21:33:26211 base::MessageLoop::current()->PostTask(
212 FROM_HERE,
213 base::Bind(&TestingProfile::FinishInit, base::Unretained(this)));
[email protected]537c1082011-12-02 02:37:17214 } else {
215 FinishInit();
216 }
[email protected]49a25632011-08-31 17:03:48217}
218
[email protected]5c4c89f2012-08-07 21:09:59219TestingProfile::TestingProfile(
[email protected]152ea302013-02-11 04:08:40220 const base::FilePath& path,
[email protected]5c4c89f2012-08-07 21:09:59221 Delegate* delegate,
222 scoped_refptr<ExtensionSpecialStoragePolicy> extension_policy,
[email protected]a0cc9a532013-02-12 02:23:12223 scoped_ptr<PrefServiceSyncable> prefs)
[email protected]5c4c89f2012-08-07 21:09:59224 : start_time_(Time::Now()),
225 prefs_(prefs.release()),
226 testing_prefs_(NULL),
[email protected]a0cc9a532013-02-12 02:23:12227 incognito_(false),
[email protected]074311a2013-02-28 23:14:09228 original_profile_(NULL),
[email protected]5c4c89f2012-08-07 21:09:59229 last_session_exited_cleanly_(true),
230 extension_special_storage_policy_(extension_policy),
[email protected]5c4c89f2012-08-07 21:09:59231 profile_path_(path),
[email protected]f0901a22013-05-27 21:37:53232 browser_context_dependency_manager_(
[email protected]f1484c52013-05-22 23:25:44233 BrowserContextDependencyManager::GetInstance()),
[email protected]5c4c89f2012-08-07 21:09:59234 delegate_(delegate) {
235
236 // If no profile path was supplied, create one.
237 if (profile_path_.empty()) {
238 CreateTempProfileDir();
239 profile_path_ = temp_dir_.path();
240 }
241
242 Init();
243 // If caller supplied a delegate, delay the FinishInit invocation until other
244 // tasks have run.
245 // TODO(atwilson): See if this is still required once we convert the current
246 // users of the constructor that takes a Delegate* param.
247 if (delegate_) {
[email protected]bb024fe2013-05-10 21:33:26248 base::MessageLoop::current()->PostTask(
249 FROM_HERE,
250 base::Bind(&TestingProfile::FinishInit, base::Unretained(this)));
[email protected]5c4c89f2012-08-07 21:09:59251 } else {
252 FinishInit();
253 }
254}
255
256void TestingProfile::CreateTempProfileDir() {
257 if (!temp_dir_.CreateUniqueTempDir()) {
258 LOG(ERROR) << "Failed to create unique temporary directory.";
259
260 // Fallback logic in case we fail to create unique temporary directory.
[email protected]152ea302013-02-11 04:08:40261 base::FilePath system_tmp_dir;
[email protected]5c4c89f2012-08-07 21:09:59262 bool success = PathService::Get(base::DIR_TEMP, &system_tmp_dir);
263
264 // We're severly screwed if we can't get the system temporary
265 // directory. Die now to avoid writing to the filesystem root
266 // or other bad places.
267 CHECK(success);
268
[email protected]152ea302013-02-11 04:08:40269 base::FilePath fallback_dir(
270 system_tmp_dir.AppendASCII("TestingProfilePath"));
[email protected]dd3aa792013-07-16 19:10:23271 base::DeleteFile(fallback_dir, true);
[email protected]5c4c89f2012-08-07 21:09:59272 file_util::CreateDirectory(fallback_dir);
273 if (!temp_dir_.Set(fallback_dir)) {
274 // That shouldn't happen, but if it does, try to recover.
275 LOG(ERROR) << "Failed to use a fallback temporary directory.";
276
277 // We're screwed if this fails, see CHECK above.
278 CHECK(temp_dir_.Set(system_tmp_dir));
279 }
280 }
281}
282
[email protected]49a25632011-08-31 17:03:48283void TestingProfile::Init() {
[email protected]7e75e4a2013-05-17 17:20:03284 // Normally this would happen during browser startup, but for tests
285 // we need to trigger creation of Profile-related services.
286 ChromeBrowserMainExtraPartsProfiles::
[email protected]f1484c52013-05-22 23:25:44287 EnsureBrowserContextKeyedServiceFactoriesBuilt();
[email protected]7e75e4a2013-05-17 17:20:03288
[email protected]75fee372013-03-06 00:42:44289 if (prefs_.get())
[email protected]c7141feb2013-06-11 13:00:16290 user_prefs::UserPrefs::Set(this, prefs_.get());
[email protected]c7fa4362013-04-26 18:09:02291 else
292 CreateTestingPrefService();
[email protected]75fee372013-03-06 00:42:44293
[email protected]7567484142013-07-11 17:36:07294 if (!base::PathExists(profile_path_))
[email protected]d41e6572012-05-04 20:49:42295 file_util::CreateDirectory(profile_path_);
296
[email protected]d81bb3e2013-05-02 18:17:03297 // TODO(joaodasilva): remove this once this PKS isn't created in ProfileImpl
298 // anymore, after converting the PrefService to a PKS. Until then it must
299 // be associated with a TestingProfile too.
300 CreateProfilePolicyConnector();
301
[email protected]bd306722012-07-11 20:43:59302 extensions::ExtensionSystemFactory::GetInstance()->SetTestingFactory(
303 this, extensions::TestExtensionSystem::Build);
[email protected]31d8f5f22012-04-02 15:22:08304
[email protected]f0901a22013-05-27 21:37:53305 browser_context_dependency_manager_->CreateBrowserContextServices(this, true);
[email protected]49a25632011-08-31 17:03:48306
[email protected]5fd2e842012-03-01 00:29:11307#if defined(ENABLE_NOTIFICATIONS)
[email protected]dcb72d52011-04-13 12:36:53308 // Install profile keyed service factory hooks for dummy/test services
[email protected]7722653b2011-06-03 17:28:22309 DesktopNotificationServiceFactory::GetInstance()->SetTestingFactory(
310 this, CreateTestDesktopNotificationService);
[email protected]5fd2e842012-03-01 00:29:11311#endif
[email protected]537c1082011-12-02 02:37:17312}
[email protected]12463cd2011-07-19 09:40:20313
[email protected]537c1082011-12-02 02:37:17314void TestingProfile::FinishInit() {
[email protected]080adba92011-12-07 19:00:40315 DCHECK(content::NotificationService::current());
[email protected]ad50def52011-10-19 23:17:07316 content::NotificationService::current()->Notify(
[email protected]12463cd2011-07-19 09:40:20317 chrome::NOTIFICATION_PROFILE_CREATED,
[email protected]6c2381d2011-10-19 02:52:53318 content::Source<Profile>(static_cast<Profile*>(this)),
[email protected]ad50def52011-10-19 23:17:07319 content::NotificationService::NoDetails());
[email protected]537c1082011-12-02 02:37:17320
321 if (delegate_)
[email protected]00b33f802012-03-13 07:46:03322 delegate_->OnProfileCreated(this, true, false);
[email protected]ab23dbe2010-08-12 02:10:46323}
324
[email protected]f25387b2008-08-21 15:20:33325TestingProfile::~TestingProfile() {
[email protected]a7c4c032012-07-27 00:36:32326 MaybeSendDestroyedNotification();
[email protected]5cdcd152011-03-31 22:48:52327
[email protected]f0901a22013-05-27 21:37:53328 browser_context_dependency_manager_->DestroyBrowserContextServices(this);
[email protected]5cdcd152011-03-31 22:48:52329
[email protected]5c6ac842013-06-02 23:37:03330 if (host_content_settings_map_.get())
[email protected]35552dc52011-07-12 09:04:38331 host_content_settings_map_->ShutdownOnUIThread();
332
[email protected]809cc4d2010-10-27 15:22:54333 DestroyTopSites();
[email protected]cdba46992011-06-07 11:51:39334
[email protected]cc5bfd42010-11-24 14:44:02335 if (pref_proxy_config_tracker_.get())
336 pref_proxy_config_tracker_->DetachFromPrefService();
[email protected]f25387b2008-08-21 15:20:33337}
initial.commit09911bf2008-07-26 23:55:29338
[email protected]f1484c52013-05-22 23:25:44339static BrowserContextKeyedService* BuildFaviconService(
[email protected]c7fa4362013-04-26 18:09:02340 content::BrowserContext* profile) {
[email protected]f3d2b312012-08-23 22:27:59341 return new FaviconService(
[email protected]c7fa4362013-04-26 18:09:02342 HistoryServiceFactory::GetForProfileWithoutCreating(
343 static_cast<Profile*>(profile)));
[email protected]f3d2b312012-08-23 22:27:59344}
345
[email protected]d2879af2010-02-08 16:02:56346void TestingProfile::CreateFaviconService() {
[email protected]f3d2b312012-08-23 22:27:59347 // It is up to the caller to create the history service if one is needed.
348 FaviconServiceFactory::GetInstance()->SetTestingFactory(
349 this, BuildFaviconService);
[email protected]d2879af2010-02-08 16:02:56350}
351
[email protected]f1484c52013-05-22 23:25:44352static BrowserContextKeyedService* BuildHistoryService(
[email protected]c7fa4362013-04-26 18:09:02353 content::BrowserContext* profile) {
354 return new HistoryService(static_cast<Profile*>(profile));
[email protected]f61f4782012-06-08 21:54:21355}
356
[email protected]d486a0852009-11-02 21:40:00357void TestingProfile::CreateHistoryService(bool delete_file, bool no_db) {
[email protected]809cc4d2010-10-27 15:22:54358 DestroyHistoryService();
[email protected]f25387b2008-08-21 15:20:33359 if (delete_file) {
[email protected]152ea302013-02-11 04:08:40360 base::FilePath path = GetPath();
[email protected]f7011fcb2009-01-28 21:54:32361 path = path.Append(chrome::kHistoryFilename);
[email protected]dd3aa792013-07-16 19:10:23362 base::DeleteFile(path, false);
[email protected]f25387b2008-08-21 15:20:33363 }
[email protected]7019bb6d2012-08-23 09:09:48364 // This will create and init the history service.
[email protected]f61f4782012-06-08 21:54:21365 HistoryService* history_service = static_cast<HistoryService*>(
366 HistoryServiceFactory::GetInstance()->SetTestingFactoryAndUse(
[email protected]a5894fe2012-11-01 14:40:56367 this, BuildHistoryService));
[email protected]7019bb6d2012-08-23 09:09:48368 if (!history_service->Init(this->GetPath(),
369 BookmarkModelFactory::GetForProfile(this),
370 no_db)) {
[email protected]f61f4782012-06-08 21:54:21371 HistoryServiceFactory::GetInstance()->SetTestingFactoryAndUse(this, NULL);
[email protected]7019bb6d2012-08-23 09:09:48372 }
[email protected]a50e16a2013-04-25 14:07:17373 // Disable WebHistoryService by default, since it makes network requests.
374 WebHistoryServiceFactory::GetInstance()->SetTestingFactory(this, NULL);
initial.commit09911bf2008-07-26 23:55:29375}
376
377void TestingProfile::DestroyHistoryService() {
[email protected]a5894fe2012-11-01 14:40:56378 HistoryService* history_service =
[email protected]6c537042012-07-13 00:59:02379 HistoryServiceFactory::GetForProfileWithoutCreating(this);
[email protected]a5894fe2012-11-01 14:40:56380 if (!history_service)
initial.commit09911bf2008-07-26 23:55:29381 return;
382
[email protected]f61f4782012-06-08 21:54:21383 history_service->NotifyRenderProcessHostDestruction(0);
[email protected]bb024fe2013-05-10 21:33:26384 history_service->SetOnBackendDestroyTask(base::MessageLoop::QuitClosure());
[email protected]f61f4782012-06-08 21:54:21385 history_service->Cleanup();
386 HistoryServiceFactory::ShutdownForProfile(this);
initial.commit09911bf2008-07-26 23:55:29387
388 // Wait for the backend class to terminate before deleting the files and
389 // moving to the next test. Note: if this never terminates, somebody is
390 // probably leaking a reference to the history backend, so it never calls
391 // our destroy task.
[email protected]bb024fe2013-05-10 21:33:26392 base::MessageLoop::current()->Run();
initial.commit09911bf2008-07-26 23:55:29393
initial.commit09911bf2008-07-26 23:55:29394 // Make sure we don't have any event pending that could disrupt the next
395 // test.
[email protected]bb024fe2013-05-10 21:33:26396 base::MessageLoop::current()->PostTask(FROM_HERE,
397 base::MessageLoop::QuitClosure());
398 base::MessageLoop::current()->Run();
initial.commit09911bf2008-07-26 23:55:29399}
[email protected]4d0cd7ce2008-08-11 16:40:57400
[email protected]809cc4d2010-10-27 15:22:54401void TestingProfile::CreateTopSites() {
402 DestroyTopSites();
[email protected]9a93d3432013-04-29 20:52:12403 top_sites_ = history::TopSites::Create(
404 this, GetPath().Append(chrome::kTopSitesFilename));
[email protected]809cc4d2010-10-27 15:22:54405}
406
407void TestingProfile::DestroyTopSites() {
408 if (top_sites_.get()) {
409 top_sites_->Shutdown();
410 top_sites_ = NULL;
[email protected]9a93d3432013-04-29 20:52:12411 // TopSitesImpl::Shutdown schedules some tasks (from TopSitesBackend) that
412 // need to be run to properly shutdown. Run all pending tasks now. This is
[email protected]809cc4d2010-10-27 15:22:54413 // normally handled by browser_process shutdown.
[email protected]bb024fe2013-05-10 21:33:26414 if (base::MessageLoop::current())
415 base::MessageLoop::current()->RunUntilIdle();
[email protected]809cc4d2010-10-27 15:22:54416 }
417}
418
[email protected]f1484c52013-05-22 23:25:44419static BrowserContextKeyedService* BuildBookmarkModel(
[email protected]c7fa4362013-04-26 18:09:02420 content::BrowserContext* context) {
421 Profile* profile = static_cast<Profile*>(context);
[email protected]f61f4782012-06-08 21:54:21422 BookmarkModel* bookmark_model = new BookmarkModel(profile);
[email protected]afecfb72013-04-18 17:17:33423 bookmark_model->Load(profile->GetIOTaskRunner());
[email protected]f61f4782012-06-08 21:54:21424 return bookmark_model;
425}
426
427
[email protected]d8e41ed2008-09-11 15:22:32428void TestingProfile::CreateBookmarkModel(bool delete_file) {
[email protected]90ef13132008-08-27 03:27:46429 if (delete_file) {
[email protected]8a39b472013-04-04 17:07:42430 base::FilePath path = GetPath().Append(chrome::kBookmarksFileName);
[email protected]dd3aa792013-07-16 19:10:23431 base::DeleteFile(path, false);
[email protected]90ef13132008-08-27 03:27:46432 }
[email protected]f61f4782012-06-08 21:54:21433 // This will create a bookmark model.
[email protected]8a39b472013-04-04 17:07:42434 BookmarkModel* bookmark_service = static_cast<BookmarkModel*>(
435 BookmarkModelFactory::GetInstance()->SetTestingFactoryAndUse(
436 this, BuildBookmarkModel));
[email protected]f61f4782012-06-08 21:54:21437
438 HistoryService* history_service =
[email protected]a5894fe2012-11-01 14:40:56439 HistoryServiceFactory::GetForProfileWithoutCreating(this);
[email protected]f61f4782012-06-08 21:54:21440 if (history_service) {
[email protected]8a39b472013-04-04 17:07:42441 history_service->history_backend_->bookmark_service_ = bookmark_service;
[email protected]f61f4782012-06-08 21:54:21442 history_service->history_backend_->expirer_.bookmark_service_ =
443 bookmark_service;
[email protected]90ef13132008-08-27 03:27:46444 }
[email protected]4d0cd7ce2008-08-11 16:40:57445}
[email protected]d2c017a2008-08-13 21:51:45446
[email protected]f1484c52013-05-22 23:25:44447static BrowserContextKeyedService* BuildWebDataService(
[email protected]c7fa4362013-04-26 18:09:02448 content::BrowserContext* profile) {
449 return new WebDataServiceWrapper(static_cast<Profile*>(profile));
[email protected]d07edd42012-05-14 23:49:46450}
[email protected]2609bc12010-01-24 08:32:55451
[email protected]d07edd42012-05-14 23:49:46452void TestingProfile::CreateWebDataService() {
[email protected]a5c65292012-05-25 00:50:01453 WebDataServiceFactory::GetInstance()->SetTestingFactory(
[email protected]d07edd42012-05-14 23:49:46454 this, BuildWebDataService);
[email protected]2609bc12010-01-24 08:32:55455}
456
[email protected]18a15ca82012-08-30 00:28:16457void TestingProfile::BlockUntilHistoryIndexIsRefreshed() {
458 // Only get the history service if it actually exists since the caller of the
459 // test should explicitly call CreateHistoryService to build it.
460 HistoryService* history_service =
461 HistoryServiceFactory::GetForProfileWithoutCreating(this);
462 DCHECK(history_service);
463 history::InMemoryURLIndex* index = history_service->InMemoryIndex();
464 if (!index || index->restored())
465 return;
466 base::RunLoop run_loop;
467 HistoryIndexRestoreObserver observer(
468 content::GetQuitTaskForRunLoop(&run_loop));
469 index->set_restore_cache_observer(&observer);
470 run_loop.Run();
471 index->set_restore_cache_observer(NULL);
472 DCHECK(index->restored());
473}
474
[email protected]120abf132011-09-27 21:38:06475// TODO(phajdan.jr): Doesn't this hang if Top Sites are already loaded?
[email protected]809cc4d2010-10-27 15:22:54476void TestingProfile::BlockUntilTopSitesLoaded() {
[email protected]a7fe9112012-07-20 02:34:45477 content::WindowedNotificationObserver top_sites_loaded_observer(
[email protected]120abf132011-09-27 21:38:06478 chrome::NOTIFICATION_TOP_SITES_LOADED,
[email protected]ad50def52011-10-19 23:17:07479 content::NotificationService::AllSources());
[email protected]d7f7f752012-08-08 02:02:55480 if (!HistoryServiceFactory::GetForProfile(this, Profile::EXPLICIT_ACCESS))
[email protected]809cc4d2010-10-27 15:22:54481 GetTopSites()->HistoryLoaded();
[email protected]120abf132011-09-27 21:38:06482 top_sites_loaded_observer.Wait();
[email protected]809cc4d2010-10-27 15:22:54483}
484
[email protected]152ea302013-02-11 04:08:40485base::FilePath TestingProfile::GetPath() {
[email protected]49a25632011-08-31 17:03:48486 return profile_path_;
[email protected]f9dec9482010-08-20 20:42:19487}
488
[email protected]0de615a2012-11-08 04:40:59489scoped_refptr<base::SequencedTaskRunner> TestingProfile::GetIOTaskRunner() {
[email protected]bb024fe2013-05-10 21:33:26490 return base::MessageLoop::current()->message_loop_proxy();
[email protected]0de615a2012-11-08 04:40:59491}
492
[email protected]5b199522012-12-22 17:24:44493TestingPrefServiceSyncable* TestingProfile::GetTestingPrefService() {
[email protected]2fb7dc982010-09-29 12:24:28494 if (!prefs_.get())
495 CreateTestingPrefService();
496 DCHECK(testing_prefs_);
497 return testing_prefs_;
[email protected]dbbad7a2010-08-13 18:18:36498}
499
[email protected]8e5c89a2011-06-07 18:13:33500TestingProfile* TestingProfile::AsTestingProfile() {
501 return this;
502}
503
[email protected]29d70252011-04-28 02:16:58504std::string TestingProfile::GetProfileName() {
505 return std::string("testing_profile");
506}
507
[email protected]27d6e852012-03-02 21:31:32508bool TestingProfile::IsOffTheRecord() const {
[email protected]5bb2f522011-03-25 19:04:44509 return incognito_;
[email protected]fadc607b62011-02-07 17:55:50510}
511
[email protected]93dba942011-02-23 22:45:01512void TestingProfile::SetOffTheRecordProfile(Profile* profile) {
[email protected]5bb2f522011-03-25 19:04:44513 incognito_profile_.reset(profile);
[email protected]93dba942011-02-23 22:45:01514}
515
[email protected]074311a2013-02-28 23:14:09516void TestingProfile::SetOriginalProfile(Profile* profile) {
517 original_profile_ = profile;
518}
519
[email protected]fadc607b62011-02-07 17:55:50520Profile* TestingProfile::GetOffTheRecordProfile() {
[email protected]5bb2f522011-03-25 19:04:44521 return incognito_profile_.get();
[email protected]fadc607b62011-02-07 17:55:50522}
523
524bool TestingProfile::HasOffTheRecordProfile() {
[email protected]5bb2f522011-03-25 19:04:44525 return incognito_profile_.get() != NULL;
[email protected]fadc607b62011-02-07 17:55:50526}
527
528Profile* TestingProfile::GetOriginalProfile() {
[email protected]074311a2013-02-28 23:14:09529 if (original_profile_)
530 return original_profile_;
[email protected]fadc607b62011-02-07 17:55:50531 return this;
532}
533
[email protected]eaa7dd182010-12-14 11:09:00534ExtensionService* TestingProfile::GetExtensionService() {
[email protected]bd306722012-07-11 20:43:59535 return extensions::ExtensionSystem::Get(this)->extension_service();
[email protected]2fb7dc982010-09-29 12:24:28536}
537
[email protected]2261e7b72011-07-12 13:43:55538void TestingProfile::SetExtensionSpecialStoragePolicy(
539 ExtensionSpecialStoragePolicy* extension_special_storage_policy) {
540 extension_special_storage_policy_ = extension_special_storage_policy;
541}
542
[email protected]19eb80152011-02-26 00:28:43543ExtensionSpecialStoragePolicy*
544TestingProfile::GetExtensionSpecialStoragePolicy() {
[email protected]cdba46992011-06-07 11:51:39545 if (!extension_special_storage_policy_.get())
[email protected]7c5048c2011-08-19 17:07:05546 extension_special_storage_policy_ = new ExtensionSpecialStoragePolicy(NULL);
[email protected]cdba46992011-06-07 11:51:39547 return extension_special_storage_policy_.get();
[email protected]19eb80152011-02-26 00:28:43548}
549
[email protected]dbbad7a2010-08-13 18:18:36550net::CookieMonster* TestingProfile::GetCookieMonster() {
551 if (!GetRequestContext())
552 return NULL;
[email protected]277ec262011-03-30 21:09:40553 return GetRequestContext()->GetURLRequestContext()->cookie_store()->
554 GetCookieMonster();
[email protected]dbbad7a2010-08-13 18:18:36555}
556
[email protected]2fb7dc982010-09-29 12:24:28557void TestingProfile::CreateTestingPrefService() {
558 DCHECK(!prefs_.get());
[email protected]5b199522012-12-22 17:24:44559 testing_prefs_ = new TestingPrefServiceSyncable();
[email protected]2fb7dc982010-09-29 12:24:28560 prefs_.reset(testing_prefs_);
[email protected]c7141feb2013-06-11 13:00:16561 user_prefs::UserPrefs::Set(this, prefs_.get());
[email protected]37ca3fe02013-07-05 15:32:44562 chrome::RegisterUserProfilePrefs(testing_prefs_->registry());
[email protected]2fb7dc982010-09-29 12:24:28563}
564
[email protected]d81bb3e2013-05-02 18:17:03565void TestingProfile::CreateProfilePolicyConnector() {
566 scoped_ptr<policy::PolicyService> service;
567#if defined(ENABLE_CONFIGURATION_POLICY)
568 std::vector<policy::ConfigurationPolicyProvider*> providers;
569 service.reset(new policy::PolicyServiceImpl(providers));
570#else
571 service.reset(new policy::PolicyServiceStub());
572#endif
573 profile_policy_connector_.reset(
574 new policy::ProfilePolicyConnector(this));
575 profile_policy_connector_->InitForTesting(service.Pass());
576 policy::ProfilePolicyConnectorFactory::GetInstance()->SetServiceForTesting(
577 this, profile_policy_connector_.get());
578 CHECK_EQ(profile_policy_connector_.get(),
579 policy::ProfilePolicyConnectorFactory::GetForProfile(this));
580}
581
[email protected]c753f142013-02-10 13:14:04582PrefService* TestingProfile::GetPrefs() {
[email protected]dbbad7a2010-08-13 18:18:36583 if (!prefs_.get()) {
[email protected]2fb7dc982010-09-29 12:24:28584 CreateTestingPrefService();
[email protected]dbbad7a2010-08-13 18:18:36585 }
586 return prefs_.get();
587}
588
589history::TopSites* TestingProfile::GetTopSites() {
[email protected]809cc4d2010-10-27 15:22:54590 return top_sites_.get();
[email protected]dbbad7a2010-08-13 18:18:36591}
592
[email protected]fadc607b62011-02-07 17:55:50593history::TopSites* TestingProfile::GetTopSitesWithoutCreating() {
594 return top_sites_.get();
595}
596
[email protected]b441a8492012-06-06 14:55:57597DownloadManagerDelegate* TestingProfile::GetDownloadManagerDelegate() {
[email protected]fadc607b62011-02-07 17:55:50598 return NULL;
599}
600
[email protected]abe2c032011-03-31 18:49:34601net::URLRequestContextGetter* TestingProfile::GetRequestContext() {
[email protected]812b3a32010-01-08 05:36:04602 return request_context_.get();
603}
604
[email protected]6bd30072013-02-08 18:17:11605net::URLRequestContextGetter* TestingProfile::CreateRequestContext(
[email protected]672c8c12013-03-07 12:30:06606 content::ProtocolHandlerMap* protocol_handlers) {
[email protected]6bd30072013-02-08 18:17:11607 return request_context_.get();
608}
609
[email protected]da5683db2011-04-23 17:12:21610net::URLRequestContextGetter* TestingProfile::GetRequestContextForRenderProcess(
611 int renderer_child_id) {
[email protected]fb29e6cf2012-07-12 21:27:20612 content::RenderProcessHost* rph = content::RenderProcessHost::FromID(
613 renderer_child_id);
[email protected]1bc28312012-11-08 08:31:53614 return rph->GetStoragePartition()->GetURLRequestContext();
[email protected]d9696672011-03-15 22:45:09615}
616
[email protected]812b3a32010-01-08 05:36:04617void TestingProfile::CreateRequestContext() {
[email protected]5c6ac842013-06-02 23:37:03618 if (!request_context_.get())
619 request_context_ = new net::TestURLRequestContextGetter(
620 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
[email protected]812b3a32010-01-08 05:36:04621}
622
[email protected]7c893202010-10-07 20:18:02623void TestingProfile::ResetRequestContext() {
[email protected]3931fd82012-03-12 21:18:48624 // Any objects holding live URLFetchers should be deleted before the request
625 // context is shut down.
[email protected]16bd088b2012-04-03 08:12:12626 TemplateURLFetcherFactory::ShutdownForProfile(this);
[email protected]3931fd82012-03-12 21:18:48627
[email protected]7c893202010-10-07 20:18:02628 request_context_ = NULL;
629}
630
[email protected]10705a7b2012-08-21 19:07:08631net::URLRequestContextGetter* TestingProfile::GetMediaRequestContext() {
632 return NULL;
633}
634
635net::URLRequestContextGetter*
636TestingProfile::GetMediaRequestContextForRenderProcess(
637 int renderer_child_id) {
[email protected]fadc607b62011-02-07 17:55:50638 return NULL;
639}
640
[email protected]10eb28162012-09-18 03:04:09641net::URLRequestContextGetter*
642TestingProfile::GetMediaRequestContextForStoragePartition(
[email protected]152ea302013-02-11 04:08:40643 const base::FilePath& partition_path,
[email protected]27ddfed22012-10-30 23:22:43644 bool in_memory) {
[email protected]10eb28162012-09-18 03:04:09645 return NULL;
646}
647
[email protected]8aca7252013-07-12 19:18:59648void TestingProfile::RequestMIDISysExPermission(
649 int render_process_id,
650 int render_view_id,
651 const GURL& requesting_frame,
652 const MIDISysExPermissionCallback& callback) {
653 // Always reject requests for testing.
654 callback.Run(false);
655}
656
[email protected]abe2c032011-03-31 18:49:34657net::URLRequestContextGetter* TestingProfile::GetRequestContextForExtensions() {
[email protected]5c6ac842013-06-02 23:37:03658 if (!extensions_request_context_.get())
[email protected]00dea9582012-05-09 15:20:05659 extensions_request_context_ = new TestExtensionURLRequestContextGetter();
[email protected]c10da4b02010-03-25 14:38:32660 return extensions_request_context_.get();
661}
662
[email protected]fadc607b62011-02-07 17:55:50663net::SSLConfigService* TestingProfile::GetSSLConfigService() {
[email protected]dc6655b2012-12-14 05:58:24664 if (!GetRequestContext())
665 return NULL;
666 return GetRequestContext()->GetURLRequestContext()->ssl_config_service();
[email protected]fadc607b62011-02-07 17:55:50667}
668
[email protected]10eb28162012-09-18 03:04:09669net::URLRequestContextGetter*
[email protected]6bd30072013-02-08 18:17:11670TestingProfile::CreateRequestContextForStoragePartition(
[email protected]152ea302013-02-11 04:08:40671 const base::FilePath& partition_path,
[email protected]6bd30072013-02-08 18:17:11672 bool in_memory,
[email protected]672c8c12013-03-07 12:30:06673 content::ProtocolHandlerMap* protocol_handlers) {
[email protected]10eb28162012-09-18 03:04:09674 // We don't test storage partitions here yet, so returning the same dummy
[email protected]d9696672011-03-15 22:45:09675 // context is sufficient for now.
676 return GetRequestContext();
677}
678
[email protected]df02aca2012-02-09 21:03:20679content::ResourceContext* TestingProfile::GetResourceContext() {
[email protected]314c3e22012-02-21 03:57:42680 if (!resource_context_.get())
681 resource_context_.reset(new content::MockResourceContext());
682 return resource_context_.get();
[email protected]e89b77d2011-04-15 18:58:10683}
684
[email protected]dbbad7a2010-08-13 18:18:36685HostContentSettingsMap* TestingProfile::GetHostContentSettingsMap() {
[email protected]35552dc52011-07-12 09:04:38686 if (!host_content_settings_map_.get()) {
[email protected]646c29cb62012-06-18 14:31:05687 host_content_settings_map_ = new HostContentSettingsMap(GetPrefs(), false);
[email protected]701550ad2012-09-06 23:43:29688#if defined(ENABLE_EXTENSIONS)
[email protected]646c29cb62012-06-18 14:31:05689 ExtensionService* extension_service = GetExtensionService();
690 if (extension_service)
691 host_content_settings_map_->RegisterExtensionService(extension_service);
[email protected]701550ad2012-09-06 23:43:29692#endif
[email protected]35552dc52011-07-12 09:04:38693 }
[email protected]dbbad7a2010-08-13 18:18:36694 return host_content_settings_map_.get();
695}
696
[email protected]810ddc52012-01-24 01:00:35697content::GeolocationPermissionContext*
[email protected]dbbad7a2010-08-13 18:18:36698TestingProfile::GetGeolocationPermissionContext() {
[email protected]a877a7d2013-01-08 13:40:59699 return ChromeGeolocationPermissionContextFactory::GetForProfile(this);
[email protected]dbbad7a2010-08-13 18:18:36700}
701
[email protected]fadc607b62011-02-07 17:55:50702std::wstring TestingProfile::GetName() {
703 return std::wstring();
704}
705
706std::wstring TestingProfile::GetID() {
707 return id_;
708}
709
710void TestingProfile::SetID(const std::wstring& id) {
711 id_ = id;
712}
713
[email protected]fadc607b62011-02-07 17:55:50714bool TestingProfile::IsSameProfile(Profile *p) {
715 return this == p;
716}
717
718base::Time TestingProfile::GetStartTime() const {
719 return start_time_;
720}
721
[email protected]152ea302013-02-11 04:08:40722base::FilePath TestingProfile::last_selected_directory() {
[email protected]fadc607b62011-02-07 17:55:50723 return last_selected_directory_;
724}
725
[email protected]152ea302013-02-11 04:08:40726void TestingProfile::set_last_selected_directory(const base::FilePath& path) {
[email protected]fadc607b62011-02-07 17:55:50727 last_selected_directory_ = path;
728}
729
[email protected]cc5bfd42010-11-24 14:44:02730PrefProxyConfigTracker* TestingProfile::GetProxyConfigTracker() {
[email protected]6f96cbcb2011-11-04 02:26:07731 if (!pref_proxy_config_tracker_.get()) {
732 pref_proxy_config_tracker_.reset(
733 ProxyServiceFactory::CreatePrefProxyConfigTracker(GetPrefs()));
734 }
735 return pref_proxy_config_tracker_.get();
[email protected]cc5bfd42010-11-24 14:44:02736}
737
[email protected]0bfc29a2009-04-27 16:15:44738void TestingProfile::BlockUntilHistoryProcessesPendingRequests() {
[email protected]a5894fe2012-11-01 14:40:56739 HistoryService* history_service =
[email protected]6c537042012-07-13 00:59:02740 HistoryServiceFactory::GetForProfile(this, Profile::EXPLICIT_ACCESS);
[email protected]a5894fe2012-11-01 14:40:56741 DCHECK(history_service);
[email protected]bb024fe2013-05-10 21:33:26742 DCHECK(base::MessageLoop::current());
[email protected]0bfc29a2009-04-27 16:15:44743
744 CancelableRequestConsumer consumer;
[email protected]f61f4782012-06-08 21:54:21745 history_service->ScheduleDBTask(new QuittingHistoryDBTask(), &consumer);
[email protected]bb024fe2013-05-10 21:33:26746 base::MessageLoop::current()->Run();
[email protected]0bfc29a2009-04-27 16:15:44747}
[email protected]345a8b72009-09-29 09:11:44748
[email protected]8382d8c2011-09-15 03:43:17749chrome_browser_net::Predictor* TestingProfile::GetNetworkPredictor() {
750 return NULL;
751}
752
[email protected]e0e1fc22012-11-05 20:25:36753void TestingProfile::ClearNetworkingHistorySince(
754 base::Time time,
755 const base::Closure& completion) {
756 if (!completion.is_null()) {
757 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion);
758 }
[email protected]02896a82011-09-21 18:54:32759}
760
[email protected]671f9c62011-10-28 19:22:07761GURL TestingProfile::GetHomePage() {
762 return GURL(chrome::kChromeUINewTabURL);
763}
764
[email protected]c753f142013-02-10 13:14:04765PrefService* TestingProfile::GetOffTheRecordPrefs() {
[email protected]fadc607b62011-02-07 17:55:50766 return NULL;
767}
768
[email protected]36fb2c7c2011-04-04 15:49:08769quota::SpecialStoragePolicy* TestingProfile::GetSpecialStoragePolicy() {
770 return GetExtensionSpecialStoragePolicy();
771}
772
[email protected]1bee6ed2012-03-14 06:46:36773bool TestingProfile::WasCreatedByVersionOrLater(const std::string& version) {
774 return true;
775}
[email protected]ef92e172012-04-25 19:40:41776
[email protected]6c0ca7fc2012-10-05 16:27:22777Profile::ExitType TestingProfile::GetLastSessionExitType() {
778 return last_session_exited_cleanly_ ? EXIT_NORMAL : EXIT_CRASHED;
[email protected]2ca1ea662012-10-04 02:26:36779}
780
[email protected]5c4c89f2012-08-07 21:09:59781TestingProfile::Builder::Builder()
782 : build_called_(false),
[email protected]a0cc9a532013-02-12 02:23:12783 delegate_(NULL) {
[email protected]5c4c89f2012-08-07 21:09:59784}
785
786TestingProfile::Builder::~Builder() {
787}
788
[email protected]152ea302013-02-11 04:08:40789void TestingProfile::Builder::SetPath(const base::FilePath& path) {
[email protected]5c4c89f2012-08-07 21:09:59790 path_ = path;
791}
792
793void TestingProfile::Builder::SetDelegate(Delegate* delegate) {
794 delegate_ = delegate;
795}
796
797void TestingProfile::Builder::SetExtensionSpecialStoragePolicy(
798 scoped_refptr<ExtensionSpecialStoragePolicy> policy) {
799 extension_policy_ = policy;
800}
801
[email protected]5b199522012-12-22 17:24:44802void TestingProfile::Builder::SetPrefService(
803 scoped_ptr<PrefServiceSyncable> prefs) {
[email protected]5c4c89f2012-08-07 21:09:59804 pref_service_ = prefs.Pass();
805}
806
[email protected]5c4c89f2012-08-07 21:09:59807scoped_ptr<TestingProfile> TestingProfile::Builder::Build() {
808 DCHECK(!build_called_);
809 build_called_ = true;
810 return scoped_ptr<TestingProfile>(new TestingProfile(
811 path_,
812 delegate_,
813 extension_policy_,
[email protected]a0cc9a532013-02-12 02:23:12814 pref_service_.Pass()));
[email protected]5c4c89f2012-08-07 21:09:59815}