blob: 90077d138662f7f699377551ee4eadeb2cda5378 [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]2f69b382011-02-19 00:34:2520#include "chrome/browser/extensions/extension_service.h"
[email protected]19eb80152011-02-26 00:28:4321#include "chrome/browser/extensions/extension_special_storage_policy.h"
[email protected]31d8f5f22012-04-02 15:22:0822#include "chrome/browser/extensions/extension_system.h"
23#include "chrome/browser/extensions/extension_system_factory.h"
24#include "chrome/browser/extensions/test_extension_system.h"
[email protected]ee2ed42c2011-04-28 22:19:1425#include "chrome/browser/favicon/favicon_service.h"
[email protected]c476e632011-06-23 11:18:0426#include "chrome/browser/geolocation/chrome_geolocation_permission_context.h"
[email protected]dbbad7a2010-08-13 18:18:3627#include "chrome/browser/history/history.h"
[email protected]075ae732009-02-11 23:58:3128#include "chrome/browser/history/history_backend.h"
[email protected]dbbad7a2010-08-13 18:18:3629#include "chrome/browser/history/top_sites.h"
[email protected]6f96cbcb2011-11-04 02:26:0730#include "chrome/browser/net/proxy_service_factory.h"
[email protected]dbbad7a2010-08-13 18:18:3631#include "chrome/browser/notifications/desktop_notification_service.h"
[email protected]dcb72d52011-04-13 12:36:5332#include "chrome/browser/notifications/desktop_notification_service_factory.h"
[email protected]37858e52010-08-26 00:22:0233#include "chrome/browser/prefs/browser_prefs.h"
[email protected]9a8c4022011-01-25 14:25:3334#include "chrome/browser/prefs/testing_pref_store.h"
[email protected]4850a7f2011-03-08 23:36:5935#include "chrome/browser/prerender/prerender_manager.h"
[email protected]5cdcd152011-03-31 22:48:5236#include "chrome/browser/profiles/profile_dependency_manager.h"
[email protected]ee78d8a2012-03-15 16:53:4837#include "chrome/browser/protector/protector_service_factory.h"
[email protected]16bd088b2012-04-03 08:12:1238#include "chrome/browser/search_engines/template_url_fetcher_factory.h"
[email protected]8e5c89a2011-06-07 18:13:3339#include "chrome/browser/search_engines/template_url_service.h"
40#include "chrome/browser/search_engines/template_url_service_factory.h"
[email protected]c52b2892012-03-07 11:01:0241#include "chrome/browser/speech/chrome_speech_recognition_preferences.h"
[email protected]d07edd42012-05-14 23:49:4642#include "chrome/browser/webdata/web_data_service_factory.h"
[email protected]a9afddb2009-02-12 17:49:4243#include "chrome/common/chrome_constants.h"
[email protected]432115822011-07-10 15:52:2744#include "chrome/common/chrome_notification_types.h"
[email protected]9e33d7e2011-09-30 16:43:5445#include "chrome/common/chrome_switches.h"
[email protected]dbbad7a2010-08-13 18:18:3646#include "chrome/common/url_constants.h"
[email protected]7bc60682011-07-29 20:55:5947#include "chrome/test/base/bookmark_load_observer.h"
[email protected]8ad3636e2011-08-01 22:31:4048#include "chrome/test/base/testing_pref_service.h"
[email protected]af44e7fb2011-07-29 18:32:3249#include "chrome/test/base/ui_test_utils.h"
[email protected]c38831a12011-10-28 12:44:4950#include "content/public/browser/browser_thread.h"
[email protected]ad50def52011-10-19 23:17:0751#include "content/public/browser/notification_service.h"
[email protected]08a932d52012-06-03 21:42:1252#include "content/public/test/mock_resource_context.h"
[email protected]aa84a7e2012-03-15 21:29:0653#include "net/cookies/cookie_monster.h"
[email protected]812b3a32010-01-08 05:36:0454#include "net/url_request/url_request_context.h"
[email protected]abe2c032011-03-31 18:49:3455#include "net/url_request/url_request_context_getter.h"
[email protected]d2db0292011-01-26 20:23:4456#include "net/url_request/url_request_test_util.h"
[email protected]4772b072010-03-30 17:45:4657#include "testing/gmock/include/gmock/gmock.h"
[email protected]248ce192011-02-10 15:26:3458
[email protected]21d3a882012-05-31 14:41:5559#if defined(ENABLE_CONFIGURATION_POLICY)
60#include "chrome/browser/policy/policy_service_impl.h"
61#else
62#include "chrome/browser/policy/policy_service_stub.h"
63#endif // defined(ENABLE_CONFIGURATION_POLICY)
64
[email protected]6f96cbcb2011-11-04 02:26:0765#if defined(OS_CHROMEOS)
66#include "chrome/browser/chromeos/proxy_config_service_impl.h"
67#endif // defined(OS_CHROMEOS)
68
[email protected]e1acf6f2008-10-27 20:43:3369using base::Time;
[email protected]631bb742011-11-02 11:29:3970using content::BrowserThread;
[email protected]b441a8492012-06-06 14:55:5771using content::DownloadManagerDelegate;
[email protected]3c887412010-04-19 20:30:2372using testing::NiceMock;
[email protected]4772b072010-03-30 17:45:4673using testing::Return;
[email protected]e1acf6f2008-10-27 20:43:3374
[email protected]d364c652008-08-29 19:46:5675namespace {
76
[email protected]0bfc29a2009-04-27 16:15:4477// Task used to make sure history has finished processing a request. Intended
78// for use with BlockUntilHistoryProcessesPendingRequests.
79
80class QuittingHistoryDBTask : public HistoryDBTask {
81 public:
82 QuittingHistoryDBTask() {}
83
84 virtual bool RunOnDBThread(history::HistoryBackend* backend,
85 history::HistoryDatabase* db) {
86 return true;
87 }
88
89 virtual void DoneRunOnMainThread() {
90 MessageLoop::current()->Quit();
91 }
92
93 private:
[email protected]7991a232009-11-06 01:55:4894 ~QuittingHistoryDBTask() {}
95
[email protected]0bfc29a2009-04-27 16:15:4496 DISALLOW_COPY_AND_ASSIGN(QuittingHistoryDBTask);
97};
98
[email protected]aeb53f02011-01-15 00:21:3499class TestExtensionURLRequestContext : public net::URLRequestContext {
[email protected]c10da4b02010-03-25 14:38:32100 public:
101 TestExtensionURLRequestContext() {
102 net::CookieMonster* cookie_monster = new net::CookieMonster(NULL, NULL);
103 const char* schemes[] = {chrome::kExtensionScheme};
104 cookie_monster->SetCookieableSchemes(schemes, 1);
[email protected]f6c21cb2011-02-16 19:45:41105 set_cookie_store(cookie_monster);
[email protected]c10da4b02010-03-25 14:38:32106 }
[email protected]7b2720b2012-04-25 16:59:11107
[email protected]7b2720b2012-04-25 16:59:11108 virtual ~TestExtensionURLRequestContext() {}
[email protected]c10da4b02010-03-25 14:38:32109};
110
[email protected]abe2c032011-03-31 18:49:34111class TestExtensionURLRequestContextGetter
112 : public net::URLRequestContextGetter {
[email protected]c10da4b02010-03-25 14:38:32113 public:
[email protected]aeb53f02011-01-15 00:21:34114 virtual net::URLRequestContext* GetURLRequestContext() {
[email protected]ef2bf422012-05-11 03:27:09115 if (!context_.get())
116 context_.reset(new TestExtensionURLRequestContext());
[email protected]c10da4b02010-03-25 14:38:32117 return context_.get();
118 }
[email protected]00ed48f2010-10-22 22:19:24119 virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const {
[email protected]0c7d74f2010-10-11 11:55:26120 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
[email protected]83a7d2eb2010-05-03 21:46:19121 }
[email protected]c10da4b02010-03-25 14:38:32122
[email protected]13ed17f82012-04-06 02:27:18123 protected:
124 virtual ~TestExtensionURLRequestContextGetter() {}
125
[email protected]c10da4b02010-03-25 14:38:32126 private:
[email protected]ef2bf422012-05-11 03:27:09127 scoped_ptr<net::URLRequestContext> context_;
[email protected]c10da4b02010-03-25 14:38:32128};
129
[email protected]abc77242012-03-16 04:32:31130ProfileKeyedService* CreateTestDesktopNotificationService(Profile* profile) {
[email protected]29cebbd2012-06-06 21:43:42131#if defined(ENABLE_NOTIFICATIONS)
[email protected]dcb72d52011-04-13 12:36:53132 return new DesktopNotificationService(profile, NULL);
[email protected]29cebbd2012-06-06 21:43:42133#else
134 return NULL;
135#endif
[email protected]dcb72d52011-04-13 12:36:53136}
137
[email protected]d364c652008-08-29 19:46:56138} // namespace
139
[email protected]f25387b2008-08-21 15:20:33140TestingProfile::TestingProfile()
[email protected]ea6f76572008-12-18 00:09:55141 : start_time_(Time::Now()),
[email protected]2fb7dc982010-09-29 12:24:28142 testing_prefs_(NULL),
[email protected]5bb2f522011-03-25 19:04:44143 incognito_(false),
[email protected]5cdcd152011-03-31 22:48:52144 last_session_exited_cleanly_(true),
[email protected]537c1082011-12-02 02:37:17145 profile_dependency_manager_(ProfileDependencyManager::GetInstance()),
146 delegate_(NULL) {
[email protected]f9dec9482010-08-20 20:42:19147 if (!temp_dir_.CreateUniqueTempDir()) {
148 LOG(ERROR) << "Failed to create unique temporary directory.";
initial.commit09911bf2008-07-26 23:55:29149
[email protected]f9dec9482010-08-20 20:42:19150 // Fallback logic in case we fail to create unique temporary directory.
151 FilePath system_tmp_dir;
152 bool success = PathService::Get(base::DIR_TEMP, &system_tmp_dir);
[email protected]848cd05e2008-09-19 18:33:48153
[email protected]f9dec9482010-08-20 20:42:19154 // We're severly screwed if we can't get the system temporary
155 // directory. Die now to avoid writing to the filesystem root
156 // or other bad places.
157 CHECK(success);
158
159 FilePath fallback_dir(system_tmp_dir.AppendASCII("TestingProfilePath"));
160 file_util::Delete(fallback_dir, true);
161 file_util::CreateDirectory(fallback_dir);
162 if (!temp_dir_.Set(fallback_dir)) {
163 // That shouldn't happen, but if it does, try to recover.
164 LOG(ERROR) << "Failed to use a fallback temporary directory.";
165
166 // We're screwed if this fails, see CHECK above.
167 CHECK(temp_dir_.Set(system_tmp_dir));
168 }
169 }
[email protected]dcb72d52011-04-13 12:36:53170
[email protected]49a25632011-08-31 17:03:48171 profile_path_ = temp_dir_.path();
172
173 Init();
[email protected]537c1082011-12-02 02:37:17174 FinishInit();
[email protected]49a25632011-08-31 17:03:48175}
176
177TestingProfile::TestingProfile(const FilePath& path)
178 : start_time_(Time::Now()),
179 testing_prefs_(NULL),
180 incognito_(false),
181 last_session_exited_cleanly_(true),
182 profile_path_(path),
[email protected]537c1082011-12-02 02:37:17183 profile_dependency_manager_(ProfileDependencyManager::GetInstance()),
184 delegate_(NULL) {
[email protected]49a25632011-08-31 17:03:48185 Init();
[email protected]537c1082011-12-02 02:37:17186 FinishInit();
187}
188
189TestingProfile::TestingProfile(const FilePath& path,
190 Delegate* delegate)
191 : start_time_(Time::Now()),
192 testing_prefs_(NULL),
193 incognito_(false),
194 last_session_exited_cleanly_(true),
195 profile_path_(path),
196 profile_dependency_manager_(ProfileDependencyManager::GetInstance()),
197 delegate_(delegate) {
198 Init();
199 if (delegate_) {
200 MessageLoop::current()->PostTask(FROM_HERE,
201 base::Bind(&TestingProfile::FinishInit,
202 base::Unretained(this)));
203 } else {
204 FinishInit();
205 }
[email protected]49a25632011-08-31 17:03:48206}
207
208void TestingProfile::Init() {
[email protected]d41e6572012-05-04 20:49:42209 if (!file_util::PathExists(profile_path_))
210 file_util::CreateDirectory(profile_path_);
211
[email protected]31d8f5f22012-04-02 15:22:08212 ExtensionSystemFactory::GetInstance()->SetTestingFactory(
213 this, TestExtensionSystem::Build);
214
[email protected]49a25632011-08-31 17:03:48215 profile_dependency_manager_->CreateProfileServices(this, true);
216
[email protected]5fd2e842012-03-01 00:29:11217#if defined(ENABLE_NOTIFICATIONS)
[email protected]dcb72d52011-04-13 12:36:53218 // Install profile keyed service factory hooks for dummy/test services
[email protected]7722653b2011-06-03 17:28:22219 DesktopNotificationServiceFactory::GetInstance()->SetTestingFactory(
220 this, CreateTestDesktopNotificationService);
[email protected]5fd2e842012-03-01 00:29:11221#endif
[email protected]537c1082011-12-02 02:37:17222}
[email protected]12463cd2011-07-19 09:40:20223
[email protected]537c1082011-12-02 02:37:17224void TestingProfile::FinishInit() {
[email protected]080adba92011-12-07 19:00:40225 DCHECK(content::NotificationService::current());
[email protected]ad50def52011-10-19 23:17:07226 content::NotificationService::current()->Notify(
[email protected]12463cd2011-07-19 09:40:20227 chrome::NOTIFICATION_PROFILE_CREATED,
[email protected]6c2381d2011-10-19 02:52:53228 content::Source<Profile>(static_cast<Profile*>(this)),
[email protected]ad50def52011-10-19 23:17:07229 content::NotificationService::NoDetails());
[email protected]537c1082011-12-02 02:37:17230
231 if (delegate_)
[email protected]00b33f802012-03-13 07:46:03232 delegate_->OnProfileCreated(this, true, false);
[email protected]ab23dbe2010-08-12 02:10:46233}
234
[email protected]f25387b2008-08-21 15:20:33235TestingProfile::~TestingProfile() {
[email protected]080adba92011-12-07 19:00:40236 DCHECK(content::NotificationService::current());
[email protected]ad50def52011-10-19 23:17:07237 content::NotificationService::current()->Notify(
[email protected]432115822011-07-10 15:52:27238 chrome::NOTIFICATION_PROFILE_DESTROYED,
[email protected]6c2381d2011-10-19 02:52:53239 content::Source<Profile>(static_cast<Profile*>(this)),
[email protected]ad50def52011-10-19 23:17:07240 content::NotificationService::NoDetails());
[email protected]5cdcd152011-03-31 22:48:52241
242 profile_dependency_manager_->DestroyProfileServices(this);
243
[email protected]35552dc52011-07-12 09:04:38244 if (host_content_settings_map_)
245 host_content_settings_map_->ShutdownOnUIThread();
246
[email protected]809cc4d2010-10-27 15:22:54247 DestroyTopSites();
[email protected]6c87f872012-05-25 03:38:54248 DestroyHistoryService();
249 // FaviconService depends on HistoryServce so destroying it later.
[email protected]d2879af2010-02-08 16:02:56250 DestroyFaviconService();
[email protected]cdba46992011-06-07 11:51:39251
[email protected]cc5bfd42010-11-24 14:44:02252 if (pref_proxy_config_tracker_.get())
253 pref_proxy_config_tracker_->DetachFromPrefService();
[email protected]f25387b2008-08-21 15:20:33254}
initial.commit09911bf2008-07-26 23:55:29255
[email protected]d2879af2010-02-08 16:02:56256void TestingProfile::CreateFaviconService() {
[email protected]04732c0e2011-09-16 13:21:53257 favicon_service_.reset(new FaviconService(this));
[email protected]d2879af2010-02-08 16:02:56258}
259
[email protected]d486a0852009-11-02 21:40:00260void TestingProfile::CreateHistoryService(bool delete_file, bool no_db) {
[email protected]809cc4d2010-10-27 15:22:54261 DestroyHistoryService();
[email protected]f25387b2008-08-21 15:20:33262 if (delete_file) {
[email protected]f7011fcb2009-01-28 21:54:32263 FilePath path = GetPath();
264 path = path.Append(chrome::kHistoryFilename);
[email protected]f25387b2008-08-21 15:20:33265 file_util::Delete(path, false);
266 }
[email protected]6c87f872012-05-25 03:38:54267 history_service_ = new HistoryService(this);
268 history_service_->Init(GetPath(), bookmark_bar_model_.get(), no_db);
initial.commit09911bf2008-07-26 23:55:29269}
270
271void TestingProfile::DestroyHistoryService() {
[email protected]6c87f872012-05-25 03:38:54272 if (!history_service_.get())
initial.commit09911bf2008-07-26 23:55:29273 return;
274
[email protected]6c87f872012-05-25 03:38:54275 history_service_->NotifyRenderProcessHostDestruction(0);
276 history_service_->SetOnBackendDestroyTask(MessageLoop::QuitClosure());
277 history_service_->Cleanup();
278 history_service_ = NULL;
initial.commit09911bf2008-07-26 23:55:29279
280 // Wait for the backend class to terminate before deleting the files and
281 // moving to the next test. Note: if this never terminates, somebody is
282 // probably leaking a reference to the history backend, so it never calls
283 // our destroy task.
284 MessageLoop::current()->Run();
285
initial.commit09911bf2008-07-26 23:55:29286 // Make sure we don't have any event pending that could disrupt the next
287 // test.
[email protected]1cb1a242011-12-10 18:36:51288 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
initial.commit09911bf2008-07-26 23:55:29289 MessageLoop::current()->Run();
290}
[email protected]4d0cd7ce2008-08-11 16:40:57291
[email protected]809cc4d2010-10-27 15:22:54292void TestingProfile::CreateTopSites() {
293 DestroyTopSites();
294 top_sites_ = new history::TopSites(this);
[email protected]73c47932010-12-06 18:13:43295 FilePath file_name = GetPath().Append(chrome::kTopSitesFilename);
[email protected]809cc4d2010-10-27 15:22:54296 top_sites_->Init(file_name);
297}
298
299void TestingProfile::DestroyTopSites() {
300 if (top_sites_.get()) {
301 top_sites_->Shutdown();
302 top_sites_ = NULL;
303 // TopSites::Shutdown schedules some tasks (from TopSitesBackend) that need
304 // to be run to properly shutdown. Run all pending tasks now. This is
305 // normally handled by browser_process shutdown.
306 if (MessageLoop::current())
307 MessageLoop::current()->RunAllPending();
308 }
309}
310
311void TestingProfile::DestroyFaviconService() {
[email protected]04732c0e2011-09-16 13:21:53312 favicon_service_.reset();
[email protected]809cc4d2010-10-27 15:22:54313}
314
[email protected]d8e41ed2008-09-11 15:22:32315void TestingProfile::CreateBookmarkModel(bool delete_file) {
[email protected]6c87f872012-05-25 03:38:54316 // Nuke the model first, that way we're sure it's done writing to disk.
317 bookmark_bar_model_.reset(NULL);
[email protected]90ef13132008-08-27 03:27:46318
319 if (delete_file) {
[email protected]f7011fcb2009-01-28 21:54:32320 FilePath path = GetPath();
321 path = path.Append(chrome::kBookmarksFileName);
[email protected]90ef13132008-08-27 03:27:46322 file_util::Delete(path, false);
323 }
[email protected]6c87f872012-05-25 03:38:54324 bookmark_bar_model_.reset(new BookmarkModel(this));
325 if (history_service_.get()) {
326 history_service_->history_backend_->bookmark_service_ =
327 bookmark_bar_model_.get();
328 history_service_->history_backend_->expirer_.bookmark_service_ =
329 bookmark_bar_model_.get();
[email protected]90ef13132008-08-27 03:27:46330 }
[email protected]6c87f872012-05-25 03:38:54331 bookmark_bar_model_->Load();
[email protected]4d0cd7ce2008-08-11 16:40:57332}
[email protected]d2c017a2008-08-13 21:51:45333
[email protected]69c579e2010-04-23 20:01:00334void TestingProfile::CreateAutocompleteClassifier() {
335 autocomplete_classifier_.reset(new AutocompleteClassifier(this));
336}
337
[email protected]a6d36cc2011-02-23 00:39:48338void TestingProfile::CreateProtocolHandlerRegistry() {
[email protected]fd8ca522011-05-02 18:54:49339 protocol_handler_registry_ = new ProtocolHandlerRegistry(this,
340 new ProtocolHandlerRegistry::Delegate());
[email protected]a6d36cc2011-02-23 00:39:48341}
342
[email protected]d07edd42012-05-14 23:49:46343static scoped_refptr<RefcountedProfileKeyedService> BuildWebDataService(
344 Profile* profile) {
345 WebDataService* web_data_service = new WebDataService();
346 if (web_data_service)
347 web_data_service->Init(profile->GetPath());
[email protected]a5c65292012-05-25 00:50:01348 return web_data_service;
[email protected]d07edd42012-05-14 23:49:46349}
[email protected]2609bc12010-01-24 08:32:55350
[email protected]d07edd42012-05-14 23:49:46351void TestingProfile::CreateWebDataService() {
[email protected]a5c65292012-05-25 00:50:01352 WebDataServiceFactory::GetInstance()->SetTestingFactory(
[email protected]d07edd42012-05-14 23:49:46353 this, BuildWebDataService);
[email protected]2609bc12010-01-24 08:32:55354}
355
[email protected]d364c652008-08-29 19:46:56356void TestingProfile::BlockUntilBookmarkModelLoaded() {
[email protected]6c87f872012-05-25 03:38:54357 DCHECK(bookmark_bar_model_.get());
358 if (bookmark_bar_model_->IsLoaded())
[email protected]d364c652008-08-29 19:46:56359 return;
360 BookmarkLoadObserver observer;
[email protected]6c87f872012-05-25 03:38:54361 bookmark_bar_model_->AddObserver(&observer);
[email protected]d364c652008-08-29 19:46:56362 MessageLoop::current()->Run();
[email protected]6c87f872012-05-25 03:38:54363 bookmark_bar_model_->RemoveObserver(&observer);
364 DCHECK(bookmark_bar_model_->IsLoaded());
[email protected]d364c652008-08-29 19:46:56365}
366
[email protected]120abf132011-09-27 21:38:06367// TODO(phajdan.jr): Doesn't this hang if Top Sites are already loaded?
[email protected]809cc4d2010-10-27 15:22:54368void TestingProfile::BlockUntilTopSitesLoaded() {
[email protected]120abf132011-09-27 21:38:06369 ui_test_utils::WindowedNotificationObserver top_sites_loaded_observer(
370 chrome::NOTIFICATION_TOP_SITES_LOADED,
[email protected]ad50def52011-10-19 23:17:07371 content::NotificationService::AllSources());
[email protected]809cc4d2010-10-27 15:22:54372 if (!GetHistoryService(Profile::EXPLICIT_ACCESS))
373 GetTopSites()->HistoryLoaded();
[email protected]120abf132011-09-27 21:38:06374 top_sites_loaded_observer.Wait();
[email protected]809cc4d2010-10-27 15:22:54375}
376
[email protected]abc77242012-03-16 04:32:31377static ProfileKeyedService* BuildTemplateURLService(Profile* profile) {
[email protected]8e5c89a2011-06-07 18:13:33378 return new TemplateURLService(profile);
[email protected]fb9d1f42010-10-06 23:17:59379}
380
[email protected]8e5c89a2011-06-07 18:13:33381void TestingProfile::CreateTemplateURLService() {
382 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
383 this, BuildTemplateURLService);
[email protected]d2c017a2008-08-13 21:51:45384}
[email protected]0bfc29a2009-04-27 16:15:44385
[email protected]66d22162011-11-22 03:47:31386void TestingProfile::BlockUntilTemplateURLServiceLoaded() {
387 TemplateURLService* turl_model =
388 TemplateURLServiceFactory::GetForProfile(this);
389 if (turl_model->loaded())
390 return;
391
392 ui_test_utils::WindowedNotificationObserver turl_service_load_observer(
393 chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED,
394 content::NotificationService::AllSources());
395 turl_model->Load();
396 turl_service_load_observer.Wait();
397}
398
[email protected]f9dec9482010-08-20 20:42:19399FilePath TestingProfile::GetPath() {
[email protected]49a25632011-08-31 17:03:48400 return profile_path_;
[email protected]f9dec9482010-08-20 20:42:19401}
402
[email protected]dbbad7a2010-08-13 18:18:36403TestingPrefService* TestingProfile::GetTestingPrefService() {
[email protected]2fb7dc982010-09-29 12:24:28404 if (!prefs_.get())
405 CreateTestingPrefService();
406 DCHECK(testing_prefs_);
407 return testing_prefs_;
[email protected]dbbad7a2010-08-13 18:18:36408}
409
[email protected]8e5c89a2011-06-07 18:13:33410TestingProfile* TestingProfile::AsTestingProfile() {
411 return this;
412}
413
[email protected]29d70252011-04-28 02:16:58414std::string TestingProfile::GetProfileName() {
415 return std::string("testing_profile");
416}
417
[email protected]27d6e852012-03-02 21:31:32418bool TestingProfile::IsOffTheRecord() const {
[email protected]5bb2f522011-03-25 19:04:44419 return incognito_;
[email protected]fadc607b62011-02-07 17:55:50420}
421
[email protected]93dba942011-02-23 22:45:01422void TestingProfile::SetOffTheRecordProfile(Profile* profile) {
[email protected]5bb2f522011-03-25 19:04:44423 incognito_profile_.reset(profile);
[email protected]93dba942011-02-23 22:45:01424}
425
[email protected]fadc607b62011-02-07 17:55:50426Profile* TestingProfile::GetOffTheRecordProfile() {
[email protected]5bb2f522011-03-25 19:04:44427 return incognito_profile_.get();
[email protected]fadc607b62011-02-07 17:55:50428}
429
[email protected]d4f5d1162011-11-30 01:41:52430GAIAInfoUpdateService* TestingProfile::GetGAIAInfoUpdateService() {
431 return NULL;
432}
433
[email protected]fadc607b62011-02-07 17:55:50434bool TestingProfile::HasOffTheRecordProfile() {
[email protected]5bb2f522011-03-25 19:04:44435 return incognito_profile_.get() != NULL;
[email protected]fadc607b62011-02-07 17:55:50436}
437
438Profile* TestingProfile::GetOriginalProfile() {
439 return this;
440}
441
[email protected]fadc607b62011-02-07 17:55:50442VisitedLinkMaster* TestingProfile::GetVisitedLinkMaster() {
443 return NULL;
444}
445
[email protected]eaa7dd182010-12-14 11:09:00446ExtensionService* TestingProfile::GetExtensionService() {
[email protected]749d59a2012-04-05 00:23:24447 return ExtensionSystem::Get(this)->extension_service();
[email protected]2fb7dc982010-09-29 12:24:28448}
449
[email protected]fadc607b62011-02-07 17:55:50450UserScriptMaster* TestingProfile::GetUserScriptMaster() {
[email protected]749d59a2012-04-05 00:23:24451 return ExtensionSystem::Get(this)->user_script_master();
[email protected]fadc607b62011-02-07 17:55:50452}
453
454ExtensionProcessManager* TestingProfile::GetExtensionProcessManager() {
[email protected]749d59a2012-04-05 00:23:24455 return ExtensionSystem::Get(this)->process_manager();
[email protected]fadc607b62011-02-07 17:55:50456}
457
458ExtensionEventRouter* TestingProfile::GetExtensionEventRouter() {
[email protected]749d59a2012-04-05 00:23:24459 return ExtensionSystem::Get(this)->event_router();
[email protected]fadc607b62011-02-07 17:55:50460}
461
[email protected]2261e7b72011-07-12 13:43:55462void TestingProfile::SetExtensionSpecialStoragePolicy(
463 ExtensionSpecialStoragePolicy* extension_special_storage_policy) {
464 extension_special_storage_policy_ = extension_special_storage_policy;
465}
466
[email protected]19eb80152011-02-26 00:28:43467ExtensionSpecialStoragePolicy*
468TestingProfile::GetExtensionSpecialStoragePolicy() {
[email protected]cdba46992011-06-07 11:51:39469 if (!extension_special_storage_policy_.get())
[email protected]7c5048c2011-08-19 17:07:05470 extension_special_storage_policy_ = new ExtensionSpecialStoragePolicy(NULL);
[email protected]cdba46992011-06-07 11:51:39471 return extension_special_storage_policy_.get();
[email protected]19eb80152011-02-26 00:28:43472}
473
[email protected]fadc607b62011-02-07 17:55:50474FaviconService* TestingProfile::GetFaviconService(ServiceAccessType access) {
475 return favicon_service_.get();
476}
477
478HistoryService* TestingProfile::GetHistoryService(ServiceAccessType access) {
[email protected]6c87f872012-05-25 03:38:54479 return history_service_.get();
[email protected]fadc607b62011-02-07 17:55:50480}
481
482HistoryService* TestingProfile::GetHistoryServiceWithoutCreating() {
[email protected]6c87f872012-05-25 03:38:54483 return history_service_.get();
[email protected]fadc607b62011-02-07 17:55:50484}
485
[email protected]dbbad7a2010-08-13 18:18:36486net::CookieMonster* TestingProfile::GetCookieMonster() {
487 if (!GetRequestContext())
488 return NULL;
[email protected]277ec262011-03-30 21:09:40489 return GetRequestContext()->GetURLRequestContext()->cookie_store()->
490 GetCookieMonster();
[email protected]dbbad7a2010-08-13 18:18:36491}
492
[email protected]fadc607b62011-02-07 17:55:50493AutocompleteClassifier* TestingProfile::GetAutocompleteClassifier() {
494 return autocomplete_classifier_.get();
495}
496
[email protected]21d3a882012-05-31 14:41:55497policy::PolicyService* TestingProfile::GetPolicyService() {
498 if (!policy_service_.get()) {
499#if defined(ENABLE_CONFIGURATION_POLICY)
500 policy::PolicyServiceImpl::Providers providers;
501 policy_service_.reset(new policy::PolicyServiceImpl(providers));
502#else
503 policy_service_.reset(new policy::PolicyServiceStub());
504#endif
505 }
506 return policy_service_.get();
507}
508
[email protected]c620fd52011-07-22 18:33:29509history::ShortcutsBackend* TestingProfile::GetShortcutsBackend() {
510 return NULL;
511}
512
[email protected]2fb7dc982010-09-29 12:24:28513void TestingProfile::SetPrefService(PrefService* prefs) {
[email protected]ddcaa412012-03-30 19:57:29514#if defined(ENABLE_PROTECTOR_SERVICE)
[email protected]ee78d8a2012-03-15 16:53:48515 // ProtectorService binds itself very closely to the PrefService at the moment
516 // of Profile creation and watches pref changes to update their backup.
517 // For tests that replace the PrefService after TestingProfile creation,
518 // ProtectorService is disabled to prevent further invalid memory accesses.
519 protector::ProtectorServiceFactory::GetInstance()->
520 SetTestingFactory(this, NULL);
[email protected]ddcaa412012-03-30 19:57:29521#endif
[email protected]2fb7dc982010-09-29 12:24:28522 prefs_.reset(prefs);
523}
524
525void TestingProfile::CreateTestingPrefService() {
526 DCHECK(!prefs_.get());
527 testing_prefs_ = new TestingPrefService();
528 prefs_.reset(testing_prefs_);
529 Profile::RegisterUserPrefs(prefs_.get());
[email protected]2f9d81322011-02-21 09:55:43530 browser::RegisterUserPrefs(prefs_.get());
[email protected]2fb7dc982010-09-29 12:24:28531}
532
[email protected]dbbad7a2010-08-13 18:18:36533PrefService* TestingProfile::GetPrefs() {
534 if (!prefs_.get()) {
[email protected]2fb7dc982010-09-29 12:24:28535 CreateTestingPrefService();
[email protected]dbbad7a2010-08-13 18:18:36536 }
537 return prefs_.get();
538}
539
540history::TopSites* TestingProfile::GetTopSites() {
[email protected]809cc4d2010-10-27 15:22:54541 return top_sites_.get();
[email protected]dbbad7a2010-08-13 18:18:36542}
543
[email protected]fadc607b62011-02-07 17:55:50544history::TopSites* TestingProfile::GetTopSitesWithoutCreating() {
545 return top_sites_.get();
546}
547
[email protected]b441a8492012-06-06 14:55:57548DownloadManagerDelegate* TestingProfile::GetDownloadManagerDelegate() {
[email protected]fadc607b62011-02-07 17:55:50549 return NULL;
550}
551
[email protected]abe2c032011-03-31 18:49:34552net::URLRequestContextGetter* TestingProfile::GetRequestContext() {
[email protected]812b3a32010-01-08 05:36:04553 return request_context_.get();
554}
555
[email protected]da5683db2011-04-23 17:12:21556net::URLRequestContextGetter* TestingProfile::GetRequestContextForRenderProcess(
557 int renderer_child_id) {
[email protected]31d8f5f22012-04-02 15:22:08558 ExtensionService* extension_service =
[email protected]749d59a2012-04-05 00:23:24559 ExtensionSystem::Get(this)->extension_service();
[email protected]31d8f5f22012-04-02 15:22:08560 if (extension_service) {
[email protected]1c321ee2012-05-21 03:02:34561 const extensions::Extension* installed_app = extension_service->
[email protected]da5683db2011-04-23 17:12:21562 GetInstalledAppForRenderer(renderer_child_id);
563 if (installed_app != NULL && installed_app->is_storage_isolated())
564 return GetRequestContextForIsolatedApp(installed_app->id());
565 }
[email protected]d9696672011-03-15 22:45:09566
567 return GetRequestContext();
568}
569
[email protected]812b3a32010-01-08 05:36:04570void TestingProfile::CreateRequestContext() {
571 if (!request_context_)
[email protected]44738602012-03-02 22:56:01572 request_context_ =
573 new TestURLRequestContextGetter(
574 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
[email protected]812b3a32010-01-08 05:36:04575}
576
[email protected]7c893202010-10-07 20:18:02577void TestingProfile::ResetRequestContext() {
[email protected]3931fd82012-03-12 21:18:48578 // Any objects holding live URLFetchers should be deleted before the request
579 // context is shut down.
[email protected]16bd088b2012-04-03 08:12:12580 TemplateURLFetcherFactory::ShutdownForProfile(this);
[email protected]3931fd82012-03-12 21:18:48581
[email protected]7c893202010-10-07 20:18:02582 request_context_ = NULL;
583}
584
[email protected]abe2c032011-03-31 18:49:34585net::URLRequestContextGetter* TestingProfile::GetRequestContextForMedia() {
[email protected]fadc607b62011-02-07 17:55:50586 return NULL;
587}
588
[email protected]abe2c032011-03-31 18:49:34589net::URLRequestContextGetter* TestingProfile::GetRequestContextForExtensions() {
[email protected]c10da4b02010-03-25 14:38:32590 if (!extensions_request_context_)
[email protected]00dea9582012-05-09 15:20:05591 extensions_request_context_ = new TestExtensionURLRequestContextGetter();
[email protected]c10da4b02010-03-25 14:38:32592 return extensions_request_context_.get();
593}
594
[email protected]fadc607b62011-02-07 17:55:50595net::SSLConfigService* TestingProfile::GetSSLConfigService() {
596 return NULL;
597}
598
[email protected]abe2c032011-03-31 18:49:34599net::URLRequestContextGetter* TestingProfile::GetRequestContextForIsolatedApp(
[email protected]d9696672011-03-15 22:45:09600 const std::string& app_id) {
601 // We don't test isolated app storage here yet, so returning the same dummy
602 // context is sufficient for now.
603 return GetRequestContext();
604}
605
[email protected]df02aca2012-02-09 21:03:20606content::ResourceContext* TestingProfile::GetResourceContext() {
[email protected]314c3e22012-02-21 03:57:42607 if (!resource_context_.get())
608 resource_context_.reset(new content::MockResourceContext());
609 return resource_context_.get();
[email protected]e89b77d2011-04-15 18:58:10610}
611
[email protected]dbbad7a2010-08-13 18:18:36612HostContentSettingsMap* TestingProfile::GetHostContentSettingsMap() {
[email protected]35552dc52011-07-12 09:04:38613 if (!host_content_settings_map_.get()) {
614 host_content_settings_map_ = new HostContentSettingsMap(
615 GetPrefs(), GetExtensionService(), false);
616 }
[email protected]dbbad7a2010-08-13 18:18:36617 return host_content_settings_map_.get();
618}
619
[email protected]810ddc52012-01-24 01:00:35620content::GeolocationPermissionContext*
[email protected]dbbad7a2010-08-13 18:18:36621TestingProfile::GetGeolocationPermissionContext() {
622 if (!geolocation_permission_context_.get()) {
623 geolocation_permission_context_ =
[email protected]c476e632011-06-23 11:18:04624 new ChromeGeolocationPermissionContext(this);
[email protected]dbbad7a2010-08-13 18:18:36625 }
626 return geolocation_permission_context_.get();
627}
628
[email protected]c52b2892012-03-07 11:01:02629content::SpeechRecognitionPreferences*
630 TestingProfile::GetSpeechRecognitionPreferences() {
[email protected]3297132a2012-02-21 23:27:59631#if defined(ENABLE_INPUT_SPEECH)
[email protected]750e9572012-06-06 15:21:24632 return ChromeSpeechRecognitionPreferences::GetForProfile(this);
[email protected]3297132a2012-02-21 23:27:59633#else
634 return NULL;
635#endif
[email protected]8238dd62011-09-29 15:13:01636}
637
[email protected]fadc607b62011-02-07 17:55:50638std::wstring TestingProfile::GetName() {
639 return std::wstring();
640}
641
642std::wstring TestingProfile::GetID() {
643 return id_;
644}
645
646void TestingProfile::SetID(const std::wstring& id) {
647 id_ = id;
648}
649
650bool TestingProfile::DidLastSessionExitCleanly() {
651 return last_session_exited_cleanly_;
652}
653
654BookmarkModel* TestingProfile::GetBookmarkModel() {
[email protected]6c87f872012-05-25 03:38:54655 return bookmark_bar_model_.get();
[email protected]fadc607b62011-02-07 17:55:50656}
657
658bool TestingProfile::IsSameProfile(Profile *p) {
659 return this == p;
660}
661
662base::Time TestingProfile::GetStartTime() const {
663 return start_time_;
664}
665
[email protected]a6d36cc2011-02-23 00:39:48666ProtocolHandlerRegistry* TestingProfile::GetProtocolHandlerRegistry() {
667 return protocol_handler_registry_.get();
668}
669
[email protected]fadc607b62011-02-07 17:55:50670FilePath TestingProfile::last_selected_directory() {
671 return last_selected_directory_;
672}
673
674void TestingProfile::set_last_selected_directory(const FilePath& path) {
675 last_selected_directory_ = path;
676}
677
[email protected]cc5bfd42010-11-24 14:44:02678PrefProxyConfigTracker* TestingProfile::GetProxyConfigTracker() {
[email protected]6f96cbcb2011-11-04 02:26:07679 if (!pref_proxy_config_tracker_.get()) {
680 pref_proxy_config_tracker_.reset(
681 ProxyServiceFactory::CreatePrefProxyConfigTracker(GetPrefs()));
682 }
683 return pref_proxy_config_tracker_.get();
[email protected]cc5bfd42010-11-24 14:44:02684}
685
[email protected]0bfc29a2009-04-27 16:15:44686void TestingProfile::BlockUntilHistoryProcessesPendingRequests() {
[email protected]6c87f872012-05-25 03:38:54687 DCHECK(history_service_.get());
[email protected]0bfc29a2009-04-27 16:15:44688 DCHECK(MessageLoop::current());
689
690 CancelableRequestConsumer consumer;
[email protected]6c87f872012-05-25 03:38:54691 history_service_->ScheduleDBTask(new QuittingHistoryDBTask(), &consumer);
[email protected]0bfc29a2009-04-27 16:15:44692 MessageLoop::current()->Run();
693}
[email protected]345a8b72009-09-29 09:11:44694
[email protected]8382d8c2011-09-15 03:43:17695chrome_browser_net::Predictor* TestingProfile::GetNetworkPredictor() {
696 return NULL;
697}
698
[email protected]db96a882011-10-09 02:01:54699void TestingProfile::ClearNetworkingHistorySince(base::Time time) {
[email protected]02896a82011-09-21 18:54:32700 NOTIMPLEMENTED();
701}
702
[email protected]671f9c62011-10-28 19:22:07703GURL TestingProfile::GetHomePage() {
704 return GURL(chrome::kChromeUINewTabURL);
705}
706
[email protected]fadc607b62011-02-07 17:55:50707PrefService* TestingProfile::GetOffTheRecordPrefs() {
708 return NULL;
709}
710
[email protected]36fb2c7c2011-04-04 15:49:08711quota::SpecialStoragePolicy* TestingProfile::GetSpecialStoragePolicy() {
712 return GetExtensionSpecialStoragePolicy();
713}
714
[email protected]1bee6ed2012-03-14 06:46:36715bool TestingProfile::WasCreatedByVersionOrLater(const std::string& version) {
716 return true;
717}
[email protected]ef92e172012-04-25 19:40:41718
719base::Callback<ChromeURLDataManagerBackend*(void)>
720 TestingProfile::GetChromeURLDataManagerBackendGetter() const {
721 return base::Callback<ChromeURLDataManagerBackend*(void)>();
722}