blob: 962e3abd99fe013ea28292b24a9bee4287e506a3 [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]83a7d2eb2010-05-03 21:46:1912#include "base/message_loop_proxy.h"
[email protected]dbbad7a2010-08-13 18:18:3613#include "base/path_service.h"
[email protected]e83326f2010-07-31 17:29:2514#include "base/string_number_conversions.h"
[email protected]dbbad7a2010-08-13 18:18:3615#include "chrome/browser/autocomplete/autocomplete_classifier.h"
[email protected]a9afddb2009-02-12 17:49:4216#include "chrome/browser/bookmarks/bookmark_model.h"
[email protected]1459fb62011-05-25 19:03:2717#include "chrome/browser/browser_process.h"
[email protected]9d01a6a2010-11-30 12:03:3318#include "chrome/browser/content_settings/host_content_settings_map.h"
[email protected]a6d36cc2011-02-23 00:39:4819#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
[email protected]2bb51302011-02-18 22:39:2720#include "chrome/browser/extensions/extension_pref_value_map.h"
[email protected]2f69b382011-02-19 00:34:2521#include "chrome/browser/extensions/extension_service.h"
[email protected]19eb80152011-02-26 00:28:4322#include "chrome/browser/extensions/extension_special_storage_policy.h"
[email protected]ee2ed42c2011-04-28 22:19:1423#include "chrome/browser/favicon/favicon_service.h"
[email protected]c476e632011-06-23 11:18:0424#include "chrome/browser/geolocation/chrome_geolocation_permission_context.h"
[email protected]dbbad7a2010-08-13 18:18:3625#include "chrome/browser/history/history.h"
[email protected]075ae732009-02-11 23:58:3126#include "chrome/browser/history/history_backend.h"
[email protected]dbbad7a2010-08-13 18:18:3627#include "chrome/browser/history/top_sites.h"
[email protected]6f96cbcb2011-11-04 02:26:0728#include "chrome/browser/net/proxy_service_factory.h"
[email protected]dbbad7a2010-08-13 18:18:3629#include "chrome/browser/notifications/desktop_notification_service.h"
[email protected]dcb72d52011-04-13 12:36:5330#include "chrome/browser/notifications/desktop_notification_service_factory.h"
[email protected]37858e52010-08-26 00:22:0231#include "chrome/browser/prefs/browser_prefs.h"
[email protected]9a8c4022011-01-25 14:25:3332#include "chrome/browser/prefs/testing_pref_store.h"
[email protected]4850a7f2011-03-08 23:36:5933#include "chrome/browser/prerender/prerender_manager.h"
[email protected]5cdcd152011-03-31 22:48:5234#include "chrome/browser/profiles/profile_dependency_manager.h"
[email protected]ee78d8a2012-03-15 16:53:4835#include "chrome/browser/protector/protector_service_factory.h"
[email protected]fb9d1f42010-10-06 23:17:5936#include "chrome/browser/search_engines/template_url_fetcher.h"
[email protected]8e5c89a2011-06-07 18:13:3337#include "chrome/browser/search_engines/template_url_service.h"
38#include "chrome/browser/search_engines/template_url_service_factory.h"
[email protected]c52b2892012-03-07 11:01:0239#include "chrome/browser/speech/chrome_speech_recognition_preferences.h"
[email protected]4772b072010-03-30 17:45:4640#include "chrome/browser/sync/profile_sync_service_mock.h"
[email protected]fd42ac30f2011-02-27 19:33:3641#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
[email protected]a9afddb2009-02-12 17:49:4242#include "chrome/common/chrome_constants.h"
[email protected]432115822011-07-10 15:52:2743#include "chrome/common/chrome_notification_types.h"
[email protected]9e33d7e2011-09-30 16:43:5444#include "chrome/common/chrome_switches.h"
[email protected]dbbad7a2010-08-13 18:18:3645#include "chrome/common/url_constants.h"
[email protected]7bc60682011-07-29 20:55:5946#include "chrome/test/base/bookmark_load_observer.h"
[email protected]8ad3636e2011-08-01 22:31:4047#include "chrome/test/base/testing_pref_service.h"
[email protected]af44e7fb2011-07-29 18:32:3248#include "chrome/test/base/ui_test_utils.h"
[email protected]c38831a12011-10-28 12:44:4949#include "content/public/browser/browser_thread.h"
[email protected]ad50def52011-10-19 23:17:0750#include "content/public/browser/notification_service.h"
[email protected]1b418ea2012-03-05 14:20:1651#include "content/test/mock_resource_context.h"
[email protected]aa84a7e2012-03-15 21:29:0652#include "net/cookies/cookie_monster.h"
[email protected]812b3a32010-01-08 05:36:0453#include "net/url_request/url_request_context.h"
[email protected]abe2c032011-03-31 18:49:3454#include "net/url_request/url_request_context_getter.h"
[email protected]d2db0292011-01-26 20:23:4455#include "net/url_request/url_request_test_util.h"
[email protected]4772b072010-03-30 17:45:4656#include "testing/gmock/include/gmock/gmock.h"
[email protected]2f351cb2009-11-09 23:43:3457#include "webkit/database/database_tracker.h"
[email protected]de5480fa2011-05-26 22:07:3658#include "webkit/fileapi/file_system_context.h"
[email protected]e7e46732012-01-05 11:45:5559#include "webkit/fileapi/file_system_options.h"
[email protected]94704172011-08-01 16:23:4060#include "webkit/quota/mock_quota_manager.h"
[email protected]c38831a12011-10-28 12:44:4961#include "webkit/quota/quota_manager.h"
[email protected]248ce192011-02-10 15:26:3462
[email protected]6f96cbcb2011-11-04 02:26:0763#if defined(OS_CHROMEOS)
64#include "chrome/browser/chromeos/proxy_config_service_impl.h"
65#endif // defined(OS_CHROMEOS)
66
[email protected]e1acf6f2008-10-27 20:43:3367using base::Time;
[email protected]631bb742011-11-02 11:29:3968using content::BrowserThread;
[email protected]e582fdd2011-12-20 16:48:1769using content::DownloadManager;
[email protected]3c887412010-04-19 20:30:2370using testing::NiceMock;
[email protected]4772b072010-03-30 17:45:4671using testing::Return;
[email protected]e1acf6f2008-10-27 20:43:3372
[email protected]d364c652008-08-29 19:46:5673namespace {
74
[email protected]0bfc29a2009-04-27 16:15:4475// Task used to make sure history has finished processing a request. Intended
76// for use with BlockUntilHistoryProcessesPendingRequests.
77
78class QuittingHistoryDBTask : public HistoryDBTask {
79 public:
80 QuittingHistoryDBTask() {}
81
82 virtual bool RunOnDBThread(history::HistoryBackend* backend,
83 history::HistoryDatabase* db) {
84 return true;
85 }
86
87 virtual void DoneRunOnMainThread() {
88 MessageLoop::current()->Quit();
89 }
90
91 private:
[email protected]7991a232009-11-06 01:55:4892 ~QuittingHistoryDBTask() {}
93
[email protected]0bfc29a2009-04-27 16:15:4494 DISALLOW_COPY_AND_ASSIGN(QuittingHistoryDBTask);
95};
96
[email protected]aeb53f02011-01-15 00:21:3497class TestExtensionURLRequestContext : public net::URLRequestContext {
[email protected]c10da4b02010-03-25 14:38:3298 public:
99 TestExtensionURLRequestContext() {
100 net::CookieMonster* cookie_monster = new net::CookieMonster(NULL, NULL);
101 const char* schemes[] = {chrome::kExtensionScheme};
102 cookie_monster->SetCookieableSchemes(schemes, 1);
[email protected]f6c21cb2011-02-16 19:45:41103 set_cookie_store(cookie_monster);
[email protected]c10da4b02010-03-25 14:38:32104 }
105};
106
[email protected]abe2c032011-03-31 18:49:34107class TestExtensionURLRequestContextGetter
108 : public net::URLRequestContextGetter {
[email protected]c10da4b02010-03-25 14:38:32109 public:
[email protected]aeb53f02011-01-15 00:21:34110 virtual net::URLRequestContext* GetURLRequestContext() {
[email protected]c10da4b02010-03-25 14:38:32111 if (!context_)
112 context_ = new TestExtensionURLRequestContext();
113 return context_.get();
114 }
[email protected]00ed48f2010-10-22 22:19:24115 virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const {
[email protected]0c7d74f2010-10-11 11:55:26116 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
[email protected]83a7d2eb2010-05-03 21:46:19117 }
[email protected]c10da4b02010-03-25 14:38:32118
119 private:
[email protected]aeb53f02011-01-15 00:21:34120 scoped_refptr<net::URLRequestContext> context_;
[email protected]c10da4b02010-03-25 14:38:32121};
122
[email protected]abc77242012-03-16 04:32:31123ProfileKeyedService* CreateTestDesktopNotificationService(Profile* profile) {
[email protected]dcb72d52011-04-13 12:36:53124 return new DesktopNotificationService(profile, NULL);
125}
126
[email protected]d364c652008-08-29 19:46:56127} // namespace
128
[email protected]f25387b2008-08-21 15:20:33129TestingProfile::TestingProfile()
[email protected]ea6f76572008-12-18 00:09:55130 : start_time_(Time::Now()),
[email protected]2fb7dc982010-09-29 12:24:28131 testing_prefs_(NULL),
[email protected]5bb2f522011-03-25 19:04:44132 incognito_(false),
[email protected]5cdcd152011-03-31 22:48:52133 last_session_exited_cleanly_(true),
[email protected]537c1082011-12-02 02:37:17134 profile_dependency_manager_(ProfileDependencyManager::GetInstance()),
135 delegate_(NULL) {
[email protected]f9dec9482010-08-20 20:42:19136 if (!temp_dir_.CreateUniqueTempDir()) {
137 LOG(ERROR) << "Failed to create unique temporary directory.";
initial.commit09911bf2008-07-26 23:55:29138
[email protected]f9dec9482010-08-20 20:42:19139 // Fallback logic in case we fail to create unique temporary directory.
140 FilePath system_tmp_dir;
141 bool success = PathService::Get(base::DIR_TEMP, &system_tmp_dir);
[email protected]848cd05e2008-09-19 18:33:48142
[email protected]f9dec9482010-08-20 20:42:19143 // We're severly screwed if we can't get the system temporary
144 // directory. Die now to avoid writing to the filesystem root
145 // or other bad places.
146 CHECK(success);
147
148 FilePath fallback_dir(system_tmp_dir.AppendASCII("TestingProfilePath"));
149 file_util::Delete(fallback_dir, true);
150 file_util::CreateDirectory(fallback_dir);
151 if (!temp_dir_.Set(fallback_dir)) {
152 // That shouldn't happen, but if it does, try to recover.
153 LOG(ERROR) << "Failed to use a fallback temporary directory.";
154
155 // We're screwed if this fails, see CHECK above.
156 CHECK(temp_dir_.Set(system_tmp_dir));
157 }
158 }
[email protected]dcb72d52011-04-13 12:36:53159
[email protected]49a25632011-08-31 17:03:48160 profile_path_ = temp_dir_.path();
161
162 Init();
[email protected]537c1082011-12-02 02:37:17163 FinishInit();
[email protected]49a25632011-08-31 17:03:48164}
165
166TestingProfile::TestingProfile(const FilePath& path)
167 : start_time_(Time::Now()),
168 testing_prefs_(NULL),
169 incognito_(false),
170 last_session_exited_cleanly_(true),
171 profile_path_(path),
[email protected]537c1082011-12-02 02:37:17172 profile_dependency_manager_(ProfileDependencyManager::GetInstance()),
173 delegate_(NULL) {
[email protected]49a25632011-08-31 17:03:48174 Init();
[email protected]537c1082011-12-02 02:37:17175 FinishInit();
176}
177
178TestingProfile::TestingProfile(const FilePath& path,
179 Delegate* delegate)
180 : start_time_(Time::Now()),
181 testing_prefs_(NULL),
182 incognito_(false),
183 last_session_exited_cleanly_(true),
184 profile_path_(path),
185 profile_dependency_manager_(ProfileDependencyManager::GetInstance()),
186 delegate_(delegate) {
187 Init();
188 if (delegate_) {
189 MessageLoop::current()->PostTask(FROM_HERE,
190 base::Bind(&TestingProfile::FinishInit,
191 base::Unretained(this)));
192 } else {
193 FinishInit();
194 }
[email protected]49a25632011-08-31 17:03:48195}
196
197void TestingProfile::Init() {
198 profile_dependency_manager_->CreateProfileServices(this, true);
199
[email protected]5fd2e842012-03-01 00:29:11200#if defined(ENABLE_NOTIFICATIONS)
[email protected]dcb72d52011-04-13 12:36:53201 // Install profile keyed service factory hooks for dummy/test services
[email protected]7722653b2011-06-03 17:28:22202 DesktopNotificationServiceFactory::GetInstance()->SetTestingFactory(
203 this, CreateTestDesktopNotificationService);
[email protected]5fd2e842012-03-01 00:29:11204#endif
[email protected]537c1082011-12-02 02:37:17205}
[email protected]12463cd2011-07-19 09:40:20206
[email protected]537c1082011-12-02 02:37:17207void TestingProfile::FinishInit() {
[email protected]080adba92011-12-07 19:00:40208 DCHECK(content::NotificationService::current());
[email protected]ad50def52011-10-19 23:17:07209 content::NotificationService::current()->Notify(
[email protected]12463cd2011-07-19 09:40:20210 chrome::NOTIFICATION_PROFILE_CREATED,
[email protected]6c2381d2011-10-19 02:52:53211 content::Source<Profile>(static_cast<Profile*>(this)),
[email protected]ad50def52011-10-19 23:17:07212 content::NotificationService::NoDetails());
[email protected]537c1082011-12-02 02:37:17213
214 if (delegate_)
[email protected]00b33f802012-03-13 07:46:03215 delegate_->OnProfileCreated(this, true, false);
[email protected]ab23dbe2010-08-12 02:10:46216}
217
[email protected]f25387b2008-08-21 15:20:33218TestingProfile::~TestingProfile() {
[email protected]080adba92011-12-07 19:00:40219 DCHECK(content::NotificationService::current());
[email protected]ad50def52011-10-19 23:17:07220 content::NotificationService::current()->Notify(
[email protected]432115822011-07-10 15:52:27221 chrome::NOTIFICATION_PROFILE_DESTROYED,
[email protected]6c2381d2011-10-19 02:52:53222 content::Source<Profile>(static_cast<Profile*>(this)),
[email protected]ad50def52011-10-19 23:17:07223 content::NotificationService::NoDetails());
[email protected]5cdcd152011-03-31 22:48:52224
225 profile_dependency_manager_->DestroyProfileServices(this);
226
[email protected]35552dc52011-07-12 09:04:38227 if (host_content_settings_map_)
228 host_content_settings_map_->ShutdownOnUIThread();
229
[email protected]809cc4d2010-10-27 15:22:54230 DestroyTopSites();
[email protected]f25387b2008-08-21 15:20:33231 DestroyHistoryService();
[email protected]d2879af2010-02-08 16:02:56232 // FaviconService depends on HistoryServce so destroying it later.
233 DestroyFaviconService();
[email protected]2609bc12010-01-24 08:32:55234 DestroyWebDataService();
[email protected]cdba46992011-06-07 11:51:39235
[email protected]cc5bfd42010-11-24 14:44:02236 if (pref_proxy_config_tracker_.get())
237 pref_proxy_config_tracker_->DetachFromPrefService();
[email protected]f25387b2008-08-21 15:20:33238}
initial.commit09911bf2008-07-26 23:55:29239
[email protected]d2879af2010-02-08 16:02:56240void TestingProfile::CreateFaviconService() {
[email protected]04732c0e2011-09-16 13:21:53241 favicon_service_.reset(new FaviconService(this));
[email protected]d2879af2010-02-08 16:02:56242}
243
[email protected]d486a0852009-11-02 21:40:00244void TestingProfile::CreateHistoryService(bool delete_file, bool no_db) {
[email protected]809cc4d2010-10-27 15:22:54245 DestroyHistoryService();
[email protected]f25387b2008-08-21 15:20:33246 if (delete_file) {
[email protected]f7011fcb2009-01-28 21:54:32247 FilePath path = GetPath();
248 path = path.Append(chrome::kHistoryFilename);
[email protected]f25387b2008-08-21 15:20:33249 file_util::Delete(path, false);
250 }
[email protected]90ef13132008-08-27 03:27:46251 history_service_ = new HistoryService(this);
[email protected]d486a0852009-11-02 21:40:00252 history_service_->Init(GetPath(), bookmark_bar_model_.get(), no_db);
initial.commit09911bf2008-07-26 23:55:29253}
254
255void TestingProfile::DestroyHistoryService() {
256 if (!history_service_.get())
257 return;
258
259 history_service_->NotifyRenderProcessHostDestruction(0);
[email protected]1cb1a242011-12-10 18:36:51260 history_service_->SetOnBackendDestroyTask(MessageLoop::QuitClosure());
initial.commit09911bf2008-07-26 23:55:29261 history_service_->Cleanup();
262 history_service_ = NULL;
263
264 // Wait for the backend class to terminate before deleting the files and
265 // moving to the next test. Note: if this never terminates, somebody is
266 // probably leaking a reference to the history backend, so it never calls
267 // our destroy task.
268 MessageLoop::current()->Run();
269
initial.commit09911bf2008-07-26 23:55:29270 // Make sure we don't have any event pending that could disrupt the next
271 // test.
[email protected]1cb1a242011-12-10 18:36:51272 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
initial.commit09911bf2008-07-26 23:55:29273 MessageLoop::current()->Run();
274}
[email protected]4d0cd7ce2008-08-11 16:40:57275
[email protected]809cc4d2010-10-27 15:22:54276void TestingProfile::CreateTopSites() {
277 DestroyTopSites();
278 top_sites_ = new history::TopSites(this);
[email protected]73c47932010-12-06 18:13:43279 FilePath file_name = GetPath().Append(chrome::kTopSitesFilename);
[email protected]809cc4d2010-10-27 15:22:54280 top_sites_->Init(file_name);
281}
282
283void TestingProfile::DestroyTopSites() {
284 if (top_sites_.get()) {
285 top_sites_->Shutdown();
286 top_sites_ = NULL;
287 // TopSites::Shutdown schedules some tasks (from TopSitesBackend) that need
288 // to be run to properly shutdown. Run all pending tasks now. This is
289 // normally handled by browser_process shutdown.
290 if (MessageLoop::current())
291 MessageLoop::current()->RunAllPending();
292 }
293}
294
295void TestingProfile::DestroyFaviconService() {
[email protected]04732c0e2011-09-16 13:21:53296 favicon_service_.reset();
[email protected]809cc4d2010-10-27 15:22:54297}
298
[email protected]d8e41ed2008-09-11 15:22:32299void TestingProfile::CreateBookmarkModel(bool delete_file) {
[email protected]90ef13132008-08-27 03:27:46300 // Nuke the model first, that way we're sure it's done writing to disk.
301 bookmark_bar_model_.reset(NULL);
302
303 if (delete_file) {
[email protected]f7011fcb2009-01-28 21:54:32304 FilePath path = GetPath();
305 path = path.Append(chrome::kBookmarksFileName);
[email protected]90ef13132008-08-27 03:27:46306 file_util::Delete(path, false);
307 }
[email protected]d8e41ed2008-09-11 15:22:32308 bookmark_bar_model_.reset(new BookmarkModel(this));
[email protected]90ef13132008-08-27 03:27:46309 if (history_service_.get()) {
310 history_service_->history_backend_->bookmark_service_ =
311 bookmark_bar_model_.get();
312 history_service_->history_backend_->expirer_.bookmark_service_ =
313 bookmark_bar_model_.get();
314 }
315 bookmark_bar_model_->Load();
[email protected]4d0cd7ce2008-08-11 16:40:57316}
[email protected]d2c017a2008-08-13 21:51:45317
[email protected]69c579e2010-04-23 20:01:00318void TestingProfile::CreateAutocompleteClassifier() {
319 autocomplete_classifier_.reset(new AutocompleteClassifier(this));
320}
321
[email protected]a6d36cc2011-02-23 00:39:48322void TestingProfile::CreateProtocolHandlerRegistry() {
[email protected]fd8ca522011-05-02 18:54:49323 protocol_handler_registry_ = new ProtocolHandlerRegistry(this,
324 new ProtocolHandlerRegistry::Delegate());
[email protected]a6d36cc2011-02-23 00:39:48325}
326
[email protected]2609bc12010-01-24 08:32:55327void TestingProfile::CreateWebDataService(bool delete_file) {
328 if (web_data_service_.get())
329 web_data_service_->Shutdown();
330
331 if (delete_file) {
332 FilePath path = GetPath();
333 path = path.Append(chrome::kWebDataFilename);
334 file_util::Delete(path, false);
335 }
336
337 web_data_service_ = new WebDataService;
338 if (web_data_service_.get())
339 web_data_service_->Init(GetPath());
340}
341
[email protected]d364c652008-08-29 19:46:56342void TestingProfile::BlockUntilBookmarkModelLoaded() {
343 DCHECK(bookmark_bar_model_.get());
344 if (bookmark_bar_model_->IsLoaded())
345 return;
346 BookmarkLoadObserver observer;
347 bookmark_bar_model_->AddObserver(&observer);
348 MessageLoop::current()->Run();
349 bookmark_bar_model_->RemoveObserver(&observer);
350 DCHECK(bookmark_bar_model_->IsLoaded());
351}
352
[email protected]120abf132011-09-27 21:38:06353// TODO(phajdan.jr): Doesn't this hang if Top Sites are already loaded?
[email protected]809cc4d2010-10-27 15:22:54354void TestingProfile::BlockUntilTopSitesLoaded() {
[email protected]120abf132011-09-27 21:38:06355 ui_test_utils::WindowedNotificationObserver top_sites_loaded_observer(
356 chrome::NOTIFICATION_TOP_SITES_LOADED,
[email protected]ad50def52011-10-19 23:17:07357 content::NotificationService::AllSources());
[email protected]809cc4d2010-10-27 15:22:54358 if (!GetHistoryService(Profile::EXPLICIT_ACCESS))
359 GetTopSites()->HistoryLoaded();
[email protected]120abf132011-09-27 21:38:06360 top_sites_loaded_observer.Wait();
[email protected]809cc4d2010-10-27 15:22:54361}
362
[email protected]fb9d1f42010-10-06 23:17:59363void TestingProfile::CreateTemplateURLFetcher() {
364 template_url_fetcher_.reset(new TemplateURLFetcher(this));
365}
366
[email protected]abc77242012-03-16 04:32:31367static ProfileKeyedService* BuildTemplateURLService(Profile* profile) {
[email protected]8e5c89a2011-06-07 18:13:33368 return new TemplateURLService(profile);
[email protected]fb9d1f42010-10-06 23:17:59369}
370
[email protected]8e5c89a2011-06-07 18:13:33371void TestingProfile::CreateTemplateURLService() {
372 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
373 this, BuildTemplateURLService);
[email protected]d2c017a2008-08-13 21:51:45374}
[email protected]0bfc29a2009-04-27 16:15:44375
[email protected]66d22162011-11-22 03:47:31376void TestingProfile::BlockUntilTemplateURLServiceLoaded() {
377 TemplateURLService* turl_model =
378 TemplateURLServiceFactory::GetForProfile(this);
379 if (turl_model->loaded())
380 return;
381
382 ui_test_utils::WindowedNotificationObserver turl_service_load_observer(
383 chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED,
384 content::NotificationService::AllSources());
385 turl_model->Load();
386 turl_service_load_observer.Wait();
387}
388
[email protected]e15be2b2012-03-09 08:42:11389void TestingProfile::CreateExtensionProcessManager() {
390 extension_process_manager_.reset(ExtensionProcessManager::Create(this));
391}
392
393ExtensionService* TestingProfile::CreateExtensionService(
394 const CommandLine* command_line,
395 const FilePath& install_directory,
396 bool autoupdate_enabled) {
397 // Extension pref store, created for use by |extension_prefs_|.
398
399 extension_pref_value_map_.reset(new ExtensionPrefValueMap);
400
401 bool extensions_disabled =
402 command_line && command_line->HasSwitch(switches::kDisableExtensions);
403
404 // Note that the GetPrefs() creates a TestingPrefService, therefore
405 // the extension controlled pref values set in extension_prefs_
406 // are not reflected in the pref service. One would need to
407 // inject a new ExtensionPrefStore(extension_pref_value_map_.get(), false).
408 extension_prefs_.reset(
409 new ExtensionPrefs(GetPrefs(),
410 install_directory,
411 extension_pref_value_map_.get()));
412 extension_prefs_->Init(extensions_disabled);
413 extension_service_.reset(new ExtensionService(this,
414 command_line,
415 install_directory,
416 extension_prefs_.get(),
417 autoupdate_enabled,
418 true));
419 return extension_service_.get();
420}
421
[email protected]f9dec9482010-08-20 20:42:19422FilePath TestingProfile::GetPath() {
[email protected]49a25632011-08-31 17:03:48423 return profile_path_;
[email protected]f9dec9482010-08-20 20:42:19424}
425
[email protected]dbbad7a2010-08-13 18:18:36426TestingPrefService* TestingProfile::GetTestingPrefService() {
[email protected]2fb7dc982010-09-29 12:24:28427 if (!prefs_.get())
428 CreateTestingPrefService();
429 DCHECK(testing_prefs_);
430 return testing_prefs_;
[email protected]dbbad7a2010-08-13 18:18:36431}
432
[email protected]8e5c89a2011-06-07 18:13:33433TestingProfile* TestingProfile::AsTestingProfile() {
434 return this;
435}
436
[email protected]29d70252011-04-28 02:16:58437std::string TestingProfile::GetProfileName() {
438 return std::string("testing_profile");
439}
440
[email protected]27d6e852012-03-02 21:31:32441bool TestingProfile::IsOffTheRecord() const {
[email protected]5bb2f522011-03-25 19:04:44442 return incognito_;
[email protected]fadc607b62011-02-07 17:55:50443}
444
[email protected]93dba942011-02-23 22:45:01445void TestingProfile::SetOffTheRecordProfile(Profile* profile) {
[email protected]5bb2f522011-03-25 19:04:44446 incognito_profile_.reset(profile);
[email protected]93dba942011-02-23 22:45:01447}
448
[email protected]fadc607b62011-02-07 17:55:50449Profile* TestingProfile::GetOffTheRecordProfile() {
[email protected]5bb2f522011-03-25 19:04:44450 return incognito_profile_.get();
[email protected]fadc607b62011-02-07 17:55:50451}
452
[email protected]d4f5d1162011-11-30 01:41:52453GAIAInfoUpdateService* TestingProfile::GetGAIAInfoUpdateService() {
454 return NULL;
455}
456
[email protected]fadc607b62011-02-07 17:55:50457bool TestingProfile::HasOffTheRecordProfile() {
[email protected]5bb2f522011-03-25 19:04:44458 return incognito_profile_.get() != NULL;
[email protected]fadc607b62011-02-07 17:55:50459}
460
461Profile* TestingProfile::GetOriginalProfile() {
462 return this;
463}
464
[email protected]fadc607b62011-02-07 17:55:50465VisitedLinkMaster* TestingProfile::GetVisitedLinkMaster() {
466 return NULL;
467}
468
[email protected]eaa7dd182010-12-14 11:09:00469ExtensionService* TestingProfile::GetExtensionService() {
[email protected]e15be2b2012-03-09 08:42:11470 return extension_service_.get();
[email protected]2fb7dc982010-09-29 12:24:28471}
472
[email protected]fadc607b62011-02-07 17:55:50473UserScriptMaster* TestingProfile::GetUserScriptMaster() {
[email protected]e15be2b2012-03-09 08:42:11474 return NULL;
475}
476
477ExtensionDevToolsManager* TestingProfile::GetExtensionDevToolsManager() {
478 return NULL;
[email protected]fadc607b62011-02-07 17:55:50479}
480
481ExtensionProcessManager* TestingProfile::GetExtensionProcessManager() {
[email protected]e15be2b2012-03-09 08:42:11482 return extension_process_manager_.get();
483}
484
485ExtensionMessageService* TestingProfile::GetExtensionMessageService() {
486 return NULL;
[email protected]fadc607b62011-02-07 17:55:50487}
488
489ExtensionEventRouter* TestingProfile::GetExtensionEventRouter() {
[email protected]e15be2b2012-03-09 08:42:11490 return NULL;
[email protected]fadc607b62011-02-07 17:55:50491}
492
[email protected]2261e7b72011-07-12 13:43:55493void TestingProfile::SetExtensionSpecialStoragePolicy(
494 ExtensionSpecialStoragePolicy* extension_special_storage_policy) {
495 extension_special_storage_policy_ = extension_special_storage_policy;
496}
497
[email protected]19eb80152011-02-26 00:28:43498ExtensionSpecialStoragePolicy*
499TestingProfile::GetExtensionSpecialStoragePolicy() {
[email protected]cdba46992011-06-07 11:51:39500 if (!extension_special_storage_policy_.get())
[email protected]7c5048c2011-08-19 17:07:05501 extension_special_storage_policy_ = new ExtensionSpecialStoragePolicy(NULL);
[email protected]cdba46992011-06-07 11:51:39502 return extension_special_storage_policy_.get();
[email protected]19eb80152011-02-26 00:28:43503}
504
[email protected]b6536df2012-03-16 18:55:23505LazyBackgroundTaskQueue* TestingProfile::GetLazyBackgroundTaskQueue() {
506 return NULL;
507}
508
[email protected]fadc607b62011-02-07 17:55:50509FaviconService* TestingProfile::GetFaviconService(ServiceAccessType access) {
510 return favicon_service_.get();
511}
512
513HistoryService* TestingProfile::GetHistoryService(ServiceAccessType access) {
514 return history_service_.get();
515}
516
517HistoryService* TestingProfile::GetHistoryServiceWithoutCreating() {
518 return history_service_.get();
519}
520
[email protected]dbbad7a2010-08-13 18:18:36521net::CookieMonster* TestingProfile::GetCookieMonster() {
522 if (!GetRequestContext())
523 return NULL;
[email protected]277ec262011-03-30 21:09:40524 return GetRequestContext()->GetURLRequestContext()->cookie_store()->
525 GetCookieMonster();
[email protected]dbbad7a2010-08-13 18:18:36526}
527
[email protected]fadc607b62011-02-07 17:55:50528AutocompleteClassifier* TestingProfile::GetAutocompleteClassifier() {
529 return autocomplete_classifier_.get();
530}
531
[email protected]c620fd52011-07-22 18:33:29532history::ShortcutsBackend* TestingProfile::GetShortcutsBackend() {
533 return NULL;
534}
535
[email protected]fadc607b62011-02-07 17:55:50536WebDataService* TestingProfile::GetWebDataService(ServiceAccessType access) {
537 return web_data_service_.get();
538}
539
540WebDataService* TestingProfile::GetWebDataServiceWithoutCreating() {
541 return web_data_service_.get();
542}
543
[email protected]2fb7dc982010-09-29 12:24:28544void TestingProfile::SetPrefService(PrefService* prefs) {
[email protected]ddcaa412012-03-30 19:57:29545#if defined(ENABLE_PROTECTOR_SERVICE)
[email protected]ee78d8a2012-03-15 16:53:48546 // ProtectorService binds itself very closely to the PrefService at the moment
547 // of Profile creation and watches pref changes to update their backup.
548 // For tests that replace the PrefService after TestingProfile creation,
549 // ProtectorService is disabled to prevent further invalid memory accesses.
550 protector::ProtectorServiceFactory::GetInstance()->
551 SetTestingFactory(this, NULL);
[email protected]ddcaa412012-03-30 19:57:29552#endif
[email protected]2fb7dc982010-09-29 12:24:28553 prefs_.reset(prefs);
554}
555
556void TestingProfile::CreateTestingPrefService() {
557 DCHECK(!prefs_.get());
558 testing_prefs_ = new TestingPrefService();
559 prefs_.reset(testing_prefs_);
560 Profile::RegisterUserPrefs(prefs_.get());
[email protected]2f9d81322011-02-21 09:55:43561 browser::RegisterUserPrefs(prefs_.get());
[email protected]2fb7dc982010-09-29 12:24:28562}
563
[email protected]dbbad7a2010-08-13 18:18:36564PrefService* TestingProfile::GetPrefs() {
565 if (!prefs_.get()) {
[email protected]2fb7dc982010-09-29 12:24:28566 CreateTestingPrefService();
[email protected]dbbad7a2010-08-13 18:18:36567 }
568 return prefs_.get();
569}
570
[email protected]fadc607b62011-02-07 17:55:50571TemplateURLFetcher* TestingProfile::GetTemplateURLFetcher() {
572 return template_url_fetcher_.get();
573}
574
[email protected]dbbad7a2010-08-13 18:18:36575history::TopSites* TestingProfile::GetTopSites() {
[email protected]809cc4d2010-10-27 15:22:54576 return top_sites_.get();
[email protected]dbbad7a2010-08-13 18:18:36577}
578
[email protected]fadc607b62011-02-07 17:55:50579history::TopSites* TestingProfile::GetTopSitesWithoutCreating() {
580 return top_sites_.get();
581}
582
583DownloadManager* TestingProfile::GetDownloadManager() {
584 return NULL;
585}
586
[email protected]abe2c032011-03-31 18:49:34587net::URLRequestContextGetter* TestingProfile::GetRequestContext() {
[email protected]812b3a32010-01-08 05:36:04588 return request_context_.get();
589}
590
[email protected]da5683db2011-04-23 17:12:21591net::URLRequestContextGetter* TestingProfile::GetRequestContextForRenderProcess(
592 int renderer_child_id) {
[email protected]e15be2b2012-03-09 08:42:11593 if (extension_service_.get()) {
594 const Extension* installed_app = extension_service_->
[email protected]da5683db2011-04-23 17:12:21595 GetInstalledAppForRenderer(renderer_child_id);
596 if (installed_app != NULL && installed_app->is_storage_isolated())
597 return GetRequestContextForIsolatedApp(installed_app->id());
598 }
[email protected]d9696672011-03-15 22:45:09599
600 return GetRequestContext();
601}
602
[email protected]812b3a32010-01-08 05:36:04603void TestingProfile::CreateRequestContext() {
604 if (!request_context_)
[email protected]44738602012-03-02 22:56:01605 request_context_ =
606 new TestURLRequestContextGetter(
607 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
[email protected]812b3a32010-01-08 05:36:04608}
609
[email protected]7c893202010-10-07 20:18:02610void TestingProfile::ResetRequestContext() {
[email protected]3931fd82012-03-12 21:18:48611 // Any objects holding live URLFetchers should be deleted before the request
612 // context is shut down.
613 template_url_fetcher_.reset();
614
[email protected]7c893202010-10-07 20:18:02615 request_context_ = NULL;
616}
617
[email protected]abe2c032011-03-31 18:49:34618net::URLRequestContextGetter* TestingProfile::GetRequestContextForMedia() {
[email protected]fadc607b62011-02-07 17:55:50619 return NULL;
620}
621
[email protected]abe2c032011-03-31 18:49:34622net::URLRequestContextGetter* TestingProfile::GetRequestContextForExtensions() {
[email protected]c10da4b02010-03-25 14:38:32623 if (!extensions_request_context_)
624 extensions_request_context_ = new TestExtensionURLRequestContextGetter();
625 return extensions_request_context_.get();
626}
627
[email protected]fadc607b62011-02-07 17:55:50628net::SSLConfigService* TestingProfile::GetSSLConfigService() {
629 return NULL;
630}
631
632UserStyleSheetWatcher* TestingProfile::GetUserStyleSheetWatcher() {
633 return NULL;
634}
635
[email protected]abe2c032011-03-31 18:49:34636net::URLRequestContextGetter* TestingProfile::GetRequestContextForIsolatedApp(
[email protected]d9696672011-03-15 22:45:09637 const std::string& app_id) {
638 // We don't test isolated app storage here yet, so returning the same dummy
639 // context is sufficient for now.
640 return GetRequestContext();
641}
642
[email protected]df02aca2012-02-09 21:03:20643content::ResourceContext* TestingProfile::GetResourceContext() {
[email protected]314c3e22012-02-21 03:57:42644 if (!resource_context_.get())
645 resource_context_.reset(new content::MockResourceContext());
646 return resource_context_.get();
[email protected]e89b77d2011-04-15 18:58:10647}
648
[email protected]dbbad7a2010-08-13 18:18:36649HostContentSettingsMap* TestingProfile::GetHostContentSettingsMap() {
[email protected]35552dc52011-07-12 09:04:38650 if (!host_content_settings_map_.get()) {
651 host_content_settings_map_ = new HostContentSettingsMap(
652 GetPrefs(), GetExtensionService(), false);
653 }
[email protected]dbbad7a2010-08-13 18:18:36654 return host_content_settings_map_.get();
655}
656
[email protected]810ddc52012-01-24 01:00:35657content::GeolocationPermissionContext*
[email protected]dbbad7a2010-08-13 18:18:36658TestingProfile::GetGeolocationPermissionContext() {
659 if (!geolocation_permission_context_.get()) {
660 geolocation_permission_context_ =
[email protected]c476e632011-06-23 11:18:04661 new ChromeGeolocationPermissionContext(this);
[email protected]dbbad7a2010-08-13 18:18:36662 }
663 return geolocation_permission_context_.get();
664}
665
[email protected]c52b2892012-03-07 11:01:02666content::SpeechRecognitionPreferences*
667 TestingProfile::GetSpeechRecognitionPreferences() {
[email protected]3297132a2012-02-21 23:27:59668#if defined(ENABLE_INPUT_SPEECH)
[email protected]c52b2892012-03-07 11:01:02669 if (!speech_recognition_preferences_.get())
670 speech_recognition_preferences_ =
671 new ChromeSpeechRecognitionPreferences(GetPrefs());
672 return speech_recognition_preferences_.get();
[email protected]3297132a2012-02-21 23:27:59673#else
674 return NULL;
675#endif
[email protected]8238dd62011-09-29 15:13:01676}
677
[email protected]fadc607b62011-02-07 17:55:50678std::wstring TestingProfile::GetName() {
679 return std::wstring();
680}
681
682std::wstring TestingProfile::GetID() {
683 return id_;
684}
685
686void TestingProfile::SetID(const std::wstring& id) {
687 id_ = id;
688}
689
690bool TestingProfile::DidLastSessionExitCleanly() {
691 return last_session_exited_cleanly_;
692}
693
694BookmarkModel* TestingProfile::GetBookmarkModel() {
695 return bookmark_bar_model_.get();
696}
697
698bool TestingProfile::IsSameProfile(Profile *p) {
699 return this == p;
700}
701
702base::Time TestingProfile::GetStartTime() const {
703 return start_time_;
704}
705
[email protected]a6d36cc2011-02-23 00:39:48706ProtocolHandlerRegistry* TestingProfile::GetProtocolHandlerRegistry() {
707 return protocol_handler_registry_.get();
708}
709
[email protected]fadc607b62011-02-07 17:55:50710FilePath TestingProfile::last_selected_directory() {
711 return last_selected_directory_;
712}
713
714void TestingProfile::set_last_selected_directory(const FilePath& path) {
715 last_selected_directory_ = path;
716}
717
[email protected]cc5bfd42010-11-24 14:44:02718PrefProxyConfigTracker* TestingProfile::GetProxyConfigTracker() {
[email protected]6f96cbcb2011-11-04 02:26:07719 if (!pref_proxy_config_tracker_.get()) {
720 pref_proxy_config_tracker_.reset(
721 ProxyServiceFactory::CreatePrefProxyConfigTracker(GetPrefs()));
722 }
723 return pref_proxy_config_tracker_.get();
[email protected]cc5bfd42010-11-24 14:44:02724}
725
[email protected]0bfc29a2009-04-27 16:15:44726void TestingProfile::BlockUntilHistoryProcessesPendingRequests() {
727 DCHECK(history_service_.get());
728 DCHECK(MessageLoop::current());
729
730 CancelableRequestConsumer consumer;
731 history_service_->ScheduleDBTask(new QuittingHistoryDBTask(), &consumer);
732 MessageLoop::current()->Run();
733}
[email protected]345a8b72009-09-29 09:11:44734
[email protected]e15be2b2012-03-09 08:42:11735ExtensionInfoMap* TestingProfile::GetExtensionInfoMap() {
736 return NULL;
737}
738
[email protected]fadc607b62011-02-07 17:55:50739PromoCounter* TestingProfile::GetInstantPromoCounter() {
740 return NULL;
741}
742
[email protected]248ce192011-02-10 15:26:34743ChromeURLDataManager* TestingProfile::GetChromeURLDataManager() {
744 if (!chrome_url_data_manager_.get())
[email protected]63e26822011-07-16 19:07:35745 chrome_url_data_manager_.reset(
746 new ChromeURLDataManager(
747 base::Callback<ChromeURLDataManagerBackend*(void)>()));
[email protected]248ce192011-02-10 15:26:34748 return chrome_url_data_manager_.get();
749}
750
[email protected]8382d8c2011-09-15 03:43:17751chrome_browser_net::Predictor* TestingProfile::GetNetworkPredictor() {
752 return NULL;
753}
754
[email protected]db96a882011-10-09 02:01:54755void TestingProfile::ClearNetworkingHistorySince(base::Time time) {
[email protected]02896a82011-09-21 18:54:32756 NOTIMPLEMENTED();
757}
758
[email protected]671f9c62011-10-28 19:22:07759GURL TestingProfile::GetHomePage() {
760 return GURL(chrome::kChromeUINewTabURL);
761}
762
[email protected]fadc607b62011-02-07 17:55:50763PrefService* TestingProfile::GetOffTheRecordPrefs() {
764 return NULL;
765}
766
[email protected]36fb2c7c2011-04-04 15:49:08767quota::SpecialStoragePolicy* TestingProfile::GetSpecialStoragePolicy() {
768 return GetExtensionSpecialStoragePolicy();
769}
770
[email protected]2609bc12010-01-24 08:32:55771void TestingProfile::DestroyWebDataService() {
772 if (!web_data_service_.get())
773 return;
774
775 web_data_service_->Shutdown();
776}
[email protected]1bee6ed2012-03-14 06:46:36777
778bool TestingProfile::WasCreatedByVersionOrLater(const std::string& version) {
779 return true;
780}