1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_TEST_BASE_TESTING_PROFILE_H_ 6 #define CHROME_TEST_BASE_TESTING_PROFILE_H_ 7 8 #include <string> 9 10 #include "base/files/scoped_temp_dir.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "chrome/browser/profiles/profile.h" 14 #include "components/domain_reliability/clear_mode.h" 15 #include "components/keyed_service/content/browser_context_keyed_service_factory.h" 16 17 namespace content { 18 class MockResourceContext; 19 class SSLHostStateDelegate; 20 } 21 22 namespace history { 23 class TopSites; 24 } 25 26 namespace net { 27 class CookieMonster; 28 class URLRequestContextGetter; 29 } 30 31 namespace policy { 32 class PolicyService; 33 class ProfilePolicyConnector; 34 class SchemaRegistryService; 35 } 36 37 namespace storage { 38 class SpecialStoragePolicy; 39 } 40 41 class BrowserContextDependencyManager; 42 class ExtensionSpecialStoragePolicy; 43 class HostContentSettingsMap; 44 class PrefServiceSyncable; 45 class TestingPrefServiceSyncable; 46 47 class TestingProfile : public Profile { 48 public: 49 // Profile directory name for the test user. This is "Default" on most 50 // platforms but must be different on ChromeOS because a logged-in user cannot 51 // use "Default" as profile directory. 52 // Browser- and UI tests should always use this to get to the user's profile 53 // directory. Unit-tests, though, should use |kInitialProfile|, which is 54 // always "Default", because they are runnining without logged-in user. 55 static const char kTestUserProfileDir[]; 56 57 // Default constructor that cannot be used with multi-profiles. 58 TestingProfile(); 59 60 typedef std::vector<std::pair< 61 BrowserContextKeyedServiceFactory*, 62 BrowserContextKeyedServiceFactory::TestingFactoryFunction> > 63 TestingFactories; 64 65 // Helper class for building an instance of TestingProfile (allows injecting 66 // mocks for various services prior to profile initialization). 67 // TODO(atwilson): Remove non-default constructors and various setters in 68 // favor of using the Builder API. 69 class Builder { 70 public: 71 Builder(); 72 ~Builder(); 73 74 // Sets a Delegate to be called back during profile init. This causes the 75 // final initialization to be performed via a task so the caller must run 76 // a MessageLoop. Caller maintains ownership of the Delegate 77 // and must manage its lifetime so it continues to exist until profile 78 // initialization is complete. 79 void SetDelegate(Delegate* delegate); 80 81 // Adds a testing factory to the TestingProfile. These testing factories 82 // are applied before the ProfileKeyedServices are created. 83 void AddTestingFactory( 84 BrowserContextKeyedServiceFactory* service_factory, 85 BrowserContextKeyedServiceFactory::TestingFactoryFunction callback); 86 87 #if defined(ENABLE_EXTENSIONS) 88 // Sets the ExtensionSpecialStoragePolicy to be returned by 89 // GetExtensionSpecialStoragePolicy(). 90 void SetExtensionSpecialStoragePolicy( 91 scoped_refptr<ExtensionSpecialStoragePolicy> policy); 92 #endif 93 94 // Sets the path to the directory to be used to hold profile data. 95 void SetPath(const base::FilePath& path); 96 97 // Sets the PrefService to be used by this profile. 98 void SetPrefService(scoped_ptr<PrefServiceSyncable> prefs); 99 100 // Makes the Profile being built a guest profile. 101 void SetGuestSession(); 102 103 // Sets the supervised user ID (which is empty by default). If it is set to 104 // a non-empty string, the profile is supervised. 105 void SetSupervisedUserId(const std::string& supervised_user_id); 106 107 // Sets the PolicyService to be used by this profile. 108 void SetPolicyService(scoped_ptr<policy::PolicyService> policy_service); 109 110 // Creates the TestingProfile using previously-set settings. 111 scoped_ptr<TestingProfile> Build(); 112 113 // Build an incognito profile, owned by |original_profile|. Note: unless you 114 // need to customize the Builder, or access TestingProfile member functions, 115 // you can use original_profile->GetOffTheRecordProfile(). 116 TestingProfile* BuildIncognito(TestingProfile* original_profile); 117 118 private: 119 // If true, Build() has already been called. 120 bool build_called_; 121 122 // Various staging variables where values are held until Build() is invoked. 123 scoped_ptr<PrefServiceSyncable> pref_service_; 124 #if defined(ENABLE_EXTENSIONS) 125 scoped_refptr<ExtensionSpecialStoragePolicy> extension_policy_; 126 #endif 127 base::FilePath path_; 128 Delegate* delegate_; 129 bool guest_session_; 130 std::string supervised_user_id_; 131 scoped_ptr<policy::PolicyService> policy_service_; 132 TestingFactories testing_factories_; 133 134 DISALLOW_COPY_AND_ASSIGN(Builder); 135 }; 136 137 // Multi-profile aware constructor that takes the path to a directory managed 138 // for this profile. This constructor is meant to be used by 139 // TestingProfileManager::CreateTestingProfile. If you need to create multi- 140 // profile profiles, use that factory method instead of this directly. 141 // Exception: if you need to create multi-profile profiles for testing the 142 // ProfileManager, then use the constructor below instead. 143 explicit TestingProfile(const base::FilePath& path); 144 145 // Multi-profile aware constructor that takes the path to a directory managed 146 // for this profile and a delegate. This constructor is meant to be used 147 // for unittesting the ProfileManager. 148 TestingProfile(const base::FilePath& path, Delegate* delegate); 149 150 // Full constructor allowing the setting of all possible instance data. 151 // Callers should use Builder::Build() instead of invoking this constructor. 152 TestingProfile(const base::FilePath& path, 153 Delegate* delegate, 154 #if defined(ENABLE_EXTENSIONS) 155 scoped_refptr<ExtensionSpecialStoragePolicy> extension_policy, 156 #endif 157 scoped_ptr<PrefServiceSyncable> prefs, 158 TestingProfile* parent, 159 bool guest_session, 160 const std::string& supervised_user_id, 161 scoped_ptr<policy::PolicyService> policy_service, 162 const TestingFactories& factories); 163 164 virtual ~TestingProfile(); 165 166 // Creates the favicon service. Consequent calls would recreate the service. 167 void CreateFaviconService(); 168 169 // Creates the history service. If |delete_file| is true, the history file is 170 // deleted first, then the HistoryService is created. As TestingProfile 171 // deletes the directory containing the files used by HistoryService, this 172 // only matters if you're recreating the HistoryService. If |no_db| is true, 173 // the history backend will fail to initialize its database; this is useful 174 // for testing error conditions. Returns true on success. 175 bool CreateHistoryService(bool delete_file, bool no_db) WARN_UNUSED_RESULT; 176 177 // Shuts down and nulls out the reference to HistoryService. 178 void DestroyHistoryService(); 179 180 // Creates TopSites. This returns immediately, and top sites may not be 181 // loaded. Use BlockUntilTopSitesLoaded to ensure TopSites has finished 182 // loading. 183 void CreateTopSites(); 184 185 // Shuts down and nulls out the reference to TopSites. 186 void DestroyTopSites(); 187 188 // Creates the BookmarkBarModel. If not invoked the bookmark bar model is 189 // NULL. If |delete_file| is true, the bookmarks file is deleted first, then 190 // the model is created. As TestingProfile deletes the directory containing 191 // the files used by HistoryService, the boolean only matters if you're 192 // recreating the BookmarkModel. 193 // 194 // NOTE: this does not block until the bookmarks are loaded. For that use 195 // WaitForBookmarkModelToLoad(). 196 void CreateBookmarkModel(bool delete_file); 197 198 // Creates a WebDataService. If not invoked, the web data service is NULL. 199 void CreateWebDataService(); 200 201 // Blocks until the HistoryService finishes restoring its in-memory cache. 202 // This is NOT invoked from CreateHistoryService. 203 void BlockUntilHistoryIndexIsRefreshed(); 204 205 // Blocks until TopSites finishes loading. 206 void BlockUntilTopSitesLoaded(); 207 208 // Allow setting a profile as Guest after-the-fact to simplify some tests. 209 void SetGuestSession(bool guest); 210 211 TestingPrefServiceSyncable* GetTestingPrefService(); 212 213 // Called on the parent of an incognito |profile|. Usually called from the 214 // constructor of an incognito TestingProfile, but can also be used by tests 215 // to provide an OffTheRecordProfileImpl instance. 216 void SetOffTheRecordProfile(scoped_ptr<Profile> profile); 217 218 // content::BrowserContext 219 virtual base::FilePath GetPath() const OVERRIDE; 220 virtual scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() OVERRIDE; 221 virtual bool IsOffTheRecord() const OVERRIDE; 222 virtual content::DownloadManagerDelegate* 223 GetDownloadManagerDelegate() OVERRIDE; 224 virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE; 225 virtual net::URLRequestContextGetter* CreateRequestContext( 226 content::ProtocolHandlerMap* protocol_handlers, 227 content::URLRequestInterceptorScopedVector request_interceptors) OVERRIDE; 228 virtual net::URLRequestContextGetter* GetRequestContextForRenderProcess( 229 int renderer_child_id) OVERRIDE; 230 virtual content::ResourceContext* GetResourceContext() OVERRIDE; 231 virtual content::BrowserPluginGuestManager* GetGuestManager() OVERRIDE; 232 virtual storage::SpecialStoragePolicy* GetSpecialStoragePolicy() OVERRIDE; 233 virtual content::PushMessagingService* GetPushMessagingService() OVERRIDE; 234 virtual content::SSLHostStateDelegate* GetSSLHostStateDelegate() OVERRIDE; 235 236 virtual TestingProfile* AsTestingProfile() OVERRIDE; 237 238 // Profile 239 virtual std::string GetProfileName() OVERRIDE; 240 virtual ProfileType GetProfileType() const OVERRIDE; 241 242 // DEPRECATED, because it's fragile to change a profile from non-incognito 243 // to incognito after the ProfileKeyedServices have been created (some 244 // ProfileKeyedServices either should not exist in incognito mode, or will 245 // crash when they try to get references to other services they depend on, 246 // but do not exist in incognito mode). 247 // TODO(atwilson): Remove this API (http://crbug.com/277296). 248 // 249 // Changes a profile's to/from incognito mode temporarily - profile will be 250 // returned to non-incognito before destruction to allow services to 251 // properly shutdown. This is only supported for legacy tests - new tests 252 // should create a true incognito profile using Builder::SetIncognito() or 253 // by using the TestingProfile constructor that allows setting the incognito 254 // flag. ForceIncognito(bool force_incognito)255 void ForceIncognito(bool force_incognito) { 256 force_incognito_ = force_incognito; 257 } 258 259 virtual Profile* GetOffTheRecordProfile() OVERRIDE; DestroyOffTheRecordProfile()260 virtual void DestroyOffTheRecordProfile() OVERRIDE {} 261 virtual bool HasOffTheRecordProfile() OVERRIDE; 262 virtual Profile* GetOriginalProfile() OVERRIDE; 263 virtual bool IsSupervised() OVERRIDE; 264 #if defined(ENABLE_EXTENSIONS) 265 void SetExtensionSpecialStoragePolicy( 266 ExtensionSpecialStoragePolicy* extension_special_storage_policy); 267 #endif 268 virtual ExtensionSpecialStoragePolicy* 269 GetExtensionSpecialStoragePolicy() OVERRIDE; 270 // TODO(ajwong): Remove this API in favor of directly retrieving the 271 // CookieStore from the StoragePartition after ExtensionURLRequestContext 272 // has been removed. 273 net::CookieMonster* GetCookieMonster(); 274 275 virtual PrefService* GetPrefs() OVERRIDE; 276 277 virtual history::TopSites* GetTopSites() OVERRIDE; 278 virtual history::TopSites* GetTopSitesWithoutCreating() OVERRIDE; 279 280 virtual net::URLRequestContextGetter* GetMediaRequestContext() OVERRIDE; 281 virtual net::URLRequestContextGetter* GetMediaRequestContextForRenderProcess( 282 int renderer_child_id) OVERRIDE; 283 virtual net::URLRequestContextGetter* 284 GetRequestContextForExtensions() OVERRIDE; 285 virtual net::URLRequestContextGetter* 286 GetMediaRequestContextForStoragePartition( 287 const base::FilePath& partition_path, 288 bool in_memory) OVERRIDE; 289 virtual net::URLRequestContextGetter* CreateRequestContextForStoragePartition( 290 const base::FilePath& partition_path, 291 bool in_memory, 292 content::ProtocolHandlerMap* protocol_handlers, 293 content::URLRequestInterceptorScopedVector request_interceptors) OVERRIDE; 294 virtual net::SSLConfigService* GetSSLConfigService() OVERRIDE; 295 virtual HostContentSettingsMap* GetHostContentSettingsMap() OVERRIDE; set_last_session_exited_cleanly(bool value)296 void set_last_session_exited_cleanly(bool value) { 297 last_session_exited_cleanly_ = value; 298 } 299 virtual bool IsSameProfile(Profile *p) OVERRIDE; 300 virtual base::Time GetStartTime() const OVERRIDE; 301 virtual base::FilePath last_selected_directory() OVERRIDE; 302 virtual void set_last_selected_directory(const base::FilePath& path) OVERRIDE; 303 virtual bool WasCreatedByVersionOrLater(const std::string& version) OVERRIDE; 304 virtual bool IsGuestSession() const OVERRIDE; SetExitType(ExitType exit_type)305 virtual void SetExitType(ExitType exit_type) OVERRIDE {} 306 virtual ExitType GetLastSessionExitType() OVERRIDE; 307 #if defined(OS_CHROMEOS) ChangeAppLocale(const std::string &,AppLocaleChangedVia)308 virtual void ChangeAppLocale(const std::string&, 309 AppLocaleChangedVia) OVERRIDE { 310 } OnLogin()311 virtual void OnLogin() OVERRIDE { 312 } InitChromeOSPreferences()313 virtual void InitChromeOSPreferences() OVERRIDE { 314 } 315 #endif // defined(OS_CHROMEOS) 316 317 virtual PrefProxyConfigTracker* GetProxyConfigTracker() OVERRIDE; 318 319 // Schedules a task on the history backend and runs a nested loop until the 320 // task is processed. This has the effect of blocking the caller until the 321 // history service processes all pending requests. 322 void BlockUntilHistoryProcessesPendingRequests(); 323 324 virtual chrome_browser_net::Predictor* GetNetworkPredictor() OVERRIDE; 325 virtual DevToolsNetworkController* GetDevToolsNetworkController() OVERRIDE; 326 virtual void ClearNetworkingHistorySince( 327 base::Time time, 328 const base::Closure& completion) OVERRIDE; 329 virtual GURL GetHomePage() OVERRIDE; 330 331 virtual PrefService* GetOffTheRecordPrefs() OVERRIDE; 332 set_profile_name(const std::string & profile_name)333 void set_profile_name(const std::string& profile_name) { 334 profile_name_ = profile_name; 335 } 336 337 protected: 338 base::Time start_time_; 339 scoped_ptr<PrefServiceSyncable> prefs_; 340 // ref only for right type, lifecycle is managed by prefs_ 341 TestingPrefServiceSyncable* testing_prefs_; 342 343 private: 344 // Creates a temporary directory for use by this profile. 345 void CreateTempProfileDir(); 346 347 // Common initialization between the two constructors. 348 void Init(); 349 350 // Finishes initialization when a profile is created asynchronously. 351 void FinishInit(); 352 353 // Creates a TestingPrefService and associates it with the TestingProfile. 354 void CreateTestingPrefService(); 355 356 // Initializes |prefs_| for an incognito profile, derived from 357 // |original_profile_|. 358 void CreateIncognitoPrefService(); 359 360 // Creates a ProfilePolicyConnector that the ProfilePolicyConnectorFactory 361 // maps to this profile. 362 void CreateProfilePolicyConnector(); 363 364 // Internally, this is a TestURLRequestContextGetter that creates a dummy 365 // request context. Currently, only the CookieMonster is hooked up. 366 scoped_refptr<net::URLRequestContextGetter> extensions_request_context_; 367 368 bool force_incognito_; 369 scoped_ptr<Profile> incognito_profile_; 370 TestingProfile* original_profile_; 371 372 bool guest_session_; 373 374 std::string supervised_user_id_; 375 376 // Did the last session exit cleanly? Default is true. 377 bool last_session_exited_cleanly_; 378 379 scoped_refptr<HostContentSettingsMap> host_content_settings_map_; 380 381 base::FilePath last_selected_directory_; 382 scoped_refptr<history::TopSites> top_sites_; // For history and thumbnails. 383 384 #if defined(ENABLE_EXTENSIONS) 385 scoped_refptr<ExtensionSpecialStoragePolicy> 386 extension_special_storage_policy_; 387 #endif 388 389 // The proxy prefs tracker. 390 scoped_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; 391 392 // We use a temporary directory to store testing profile data. In a multi- 393 // profile environment, this is invalid and the directory is managed by the 394 // TestingProfileManager. 395 base::ScopedTempDir temp_dir_; 396 // The path to this profile. This will be valid in either of the two above 397 // cases. 398 base::FilePath profile_path_; 399 400 // We keep a weak pointer to the dependency manager we want to notify on our 401 // death. Defaults to the Singleton implementation but overridable for 402 // testing. 403 BrowserContextDependencyManager* browser_context_dependency_manager_; 404 405 // Owned, but must be deleted on the IO thread so not placing in a 406 // scoped_ptr<>. 407 content::MockResourceContext* resource_context_; 408 409 #if defined(ENABLE_CONFIGURATION_POLICY) 410 scoped_ptr<policy::SchemaRegistryService> schema_registry_service_; 411 #endif 412 scoped_ptr<policy::ProfilePolicyConnector> profile_policy_connector_; 413 414 // Weak pointer to a delegate for indicating that a profile was created. 415 Delegate* delegate_; 416 417 std::string profile_name_; 418 419 scoped_ptr<policy::PolicyService> policy_service_; 420 }; 421 422 #endif // CHROME_TEST_BASE_TESTING_PROFILE_H_ 423