15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class gathers state related to a single user profile.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_PROFILES_PROFILE_H_
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PROFILES_PROFILE_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/content_browser_client.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_job_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeAppCacheService;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionService;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSpecialStoragePolicy;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FaviconService;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostContentSettingsMap;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordStore;
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass PrefProxyConfigTracker;
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass PrefService;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PromoCounter;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProtocolHandlerRegistry;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingProfile;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDataService;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabContentsProvider;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SequencedTaskRunner;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Time;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_net {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Predictor;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LibCrosServiceLibraryImpl;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResetDefaultProxyConfigServiceTask;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUI;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace fileapi {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemContext;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShortcutsBackend;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TopSites;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLConfigService;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Instead of adding more members to Profile, consider creating a
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// BrowserContextKeyedService. See
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// http://dev.chromium.org/developers/design-documents/profile-architecture
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile : public content::BrowserContext {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Profile services are accessed with the following parameter. This parameter
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // defines what the caller plans to do with the service.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The caller is responsible for not performing any operation that would
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result in persistent implicit records while using an OffTheRecord profile.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This flag allows the profile to perform an additional check.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It also gives us an opportunity to perform further checks in the future. We
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // could, for example, return an history service that only allow some specific
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // methods.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ServiceAccessType {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The caller plans to perform a read or write that takes place as a result
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of the user input. Use this flag when the operation you are doing can be
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // performed while incognito. (ex: creating a bookmark)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Since EXPLICIT_ACCESS means "as a result of a user action", this request
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // always succeeds.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPLICIT_ACCESS,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The caller plans to call a method that will permanently change some data
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in the profile, as part of Chrome's implicit data logging. Use this flag
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when you are about to perform an operation which is incompatible with the
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // incognito mode.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IMPLICIT_ACCESS
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum CreateStatus {
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Profile services were not created due to a local error (e.g., disk full).
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CREATE_STATUS_LOCAL_FAIL,
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Profile services were not created due to a remote error (e.g., network
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // down during limited-user registration).
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CREATE_STATUS_REMOTE_FAIL,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Profile created but before initializing extensions and promo resources.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE_STATUS_CREATED,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Profile is created, extensions and promo resources are initialized.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE_STATUS_INITIALIZED,
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Profile creation (managed-user registration, generally) was canceled
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // by the user.
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CREATE_STATUS_CANCELED,
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    MAX_CREATE_STATUS  // For histogram display.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum CreateMode {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE_MODE_SYNCHRONOUS,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE_MODE_ASYNCHRONOUS
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ExitType {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A normal shutdown. The user clicked exit/closed last window of the
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // profile.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXIT_NORMAL,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The exit was the result of the system shutting down.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXIT_SESSION_ENDED,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXIT_CRASHED,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Delegate {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~Delegate();
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when creation of the profile is finished.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnProfileCreated(Profile* profile,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool success,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool is_new_profile) = 0;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key used to bind profile to the widget with which it is associated.
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const char kProfileKey[];
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile();
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~Profile();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Profile prefs are registered as soon as the prefs are loaded for the first
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time.
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets task runner for I/O operations associated with |profile|.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_refptr<base::SequencedTaskRunner> GetTaskRunnerForProfile(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* profile);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new profile given a path. If |create_mode| is
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CREATE_MODE_ASYNCHRONOUS then the profile is initialized asynchronously.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static Profile* CreateProfile(const base::FilePath& path,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Delegate* delegate,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                CreateMode create_mode);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the profile corresponding to the given browser context.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Profile* FromBrowserContext(content::BrowserContext* browser_context);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the profile corresponding to the given WebUI.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static Profile* FromWebUI(content::WebUI* web_ui);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::BrowserContext implementation ------------------------------------
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Typesafe upcast.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual TestingProfile* AsTestingProfile();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns sequenced task runner where browser context dependent I/O
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // operations should be performed.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() = 0;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the name associated with this profile. This name is displayed in
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the browser frame.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetProfileName() = 0;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the incognito version of this profile. The returned pointer
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is owned by the receiving profile. If the receiving profile is off the
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // record, the same profile is returned.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WARNING: This will create the OffTheRecord profile if it doesn't already
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exist. If this isn't what you want, you need to check
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasOffTheRecordProfile() first.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Profile* GetOffTheRecordProfile() = 0;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroys the incognito profile.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DestroyOffTheRecordProfile() = 0;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if an incognito profile exists.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasOffTheRecordProfile() = 0;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the original "recording" profile. This method returns this if the
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile is not incognito.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Profile* GetOriginalProfile() = 0;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Returns whether the profile is managed (see ManagedUserService).
202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool IsManaged() = 0;
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a pointer to the TopSites (thumbnail manager) instance
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for this profile.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual history::TopSites* GetTopSites() = 0;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Variant of GetTopSites that doesn't force creation.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual history::TopSites* GetTopSitesWithoutCreating() = 0;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DEPRECATED. Instead, use ExtensionSystem::extension_service().
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves a pointer to the ExtensionService associated with this
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile. The ExtensionService is created at startup.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yoz): remove this accessor (bug 104095).
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ExtensionService* GetExtensionService() = 0;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessor. The instance is created upon first access.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ExtensionSpecialStoragePolicy*
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExtensionSpecialStoragePolicy() = 0;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieves a pointer to the PrefService that manages the
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // preferences for this user profile.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PrefService* GetPrefs() = 0;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves a pointer to the PrefService that manages the preferences
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for OffTheRecord Profiles.  This PrefService is lazily created the first
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time that this method is called.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PrefService* GetOffTheRecordPrefs() = 0;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the main request context.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::URLRequestContextGetter* GetRequestContext() = 0;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the request context used for extension-related requests.  This
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is only used for a separate cookie store currently.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::URLRequestContextGetter* GetRequestContextForExtensions() = 0;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the SSLConfigService for this profile.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::SSLConfigService* GetSSLConfigService() = 0;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the Hostname <-> Content settings map for this profile.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HostContentSettingsMap* GetHostContentSettingsMap() = 0;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return whether 2 profiles are the same. 2 profiles are the same if they
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // represent the same profile. This can happen if there is pointer equality
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or if one profile is the incognito version of another profile (or vice
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // versa).
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsSameProfile(Profile* profile) = 0;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the time the profile was started. This is not the time the profile
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was created, rather it is the time the user started chrome and logged into
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this profile. For the single profile case, this corresponds to the time
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the user started chrome.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::Time GetStartTime() const = 0;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates the main net::URLRequestContextGetter that will be returned by
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GetRequestContext(). Should only be called once per ContentBrowserClient
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // object. This function is exposed because of the circular dependency where
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GetStoragePartition() is used to retrieve the request context, but creation
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // still has to happen in the Profile so the StoragePartition calls
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ContextBrowserClient to call this function.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(ajwong): Remove once http://crbug.com/159193 is resolved.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual net::URLRequestContextGetter* CreateRequestContext(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::ProtocolHandlerMap* protocol_handlers) = 0;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates the net::URLRequestContextGetter for a StoragePartition. Should
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // only be called once per partition_path per ContentBrowserClient object.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function is exposed because the request context is retrieved from the
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // StoragePartition, but creation still has to happen in the Profile so the
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // StoragePartition calls ContextBrowserClient to call this function.
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(ajwong): Remove once http://crbug.com/159193 is resolved.
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual net::URLRequestContextGetter* CreateRequestContextForStoragePartition(
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& partition_path,
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool in_memory,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::ProtocolHandlerMap* protocol_handlers) = 0;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the last directory that was chosen for uploading or opening a file.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual base::FilePath last_selected_directory() = 0;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void set_last_selected_directory(const base::FilePath& path) = 0;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum AppLocaleChangedVia {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Caused by chrome://settings change.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    APP_LOCALE_CHANGED_VIA_SETTINGS,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Locale has been reverted via LocaleChangeGuard.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    APP_LOCALE_CHANGED_VIA_REVERT,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // From login screen.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    APP_LOCALE_CHANGED_VIA_LOGIN,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Source unknown.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    APP_LOCALE_CHANGED_VIA_UNKNOWN
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changes application locale for a profile.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ChangeAppLocale(
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& locale, AppLocaleChangedVia via) = 0;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called after login.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLogin() = 0;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates ChromeOS's EnterpriseExtensionListener.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupChromeOSEnterpriseExtensionObserver() = 0;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes Chrome OS's preferences.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InitChromeOSPreferences() = 0;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the helper object that provides the proxy configuration service
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // access to the the proxy configuration possibly defined by preferences.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PrefProxyConfigTracker* GetProxyConfigTracker() = 0;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the Predictor object used for dns prefetch.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual chrome_browser_net::Predictor* GetNetworkPredictor() = 0;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes all network related data since |time|. It deletes transport
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // security state since |time| and it also deletes HttpServerProperties data.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Works asynchronously, however if the |completion| callback is non-null, it
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will be posted on the UI thread once the removal process completes.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Be aware that theoretically it is possible that |completion| will be
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invoked after the Profile instance has been destroyed.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ClearNetworkingHistorySince(base::Time time,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const base::Closure& completion) = 0;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the home page for this profile.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual GURL GetHomePage() = 0;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether or not the profile was created by a version of Chrome
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // more recent (or equal to) the one specified.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WasCreatedByVersionOrLater(const std::string& version) = 0;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetDebugName();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether it is a guest session.
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual bool IsGuestSession() const;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did the user restore the last session? This is set by SessionRestore.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_restored_last_session(bool restored_last_session) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    restored_last_session_ = restored_last_session;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool restored_last_session() const {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return restored_last_session_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the ExitType for the profile. This may be invoked multiple times
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // during shutdown; only the first such change (the transition from
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EXIT_CRASHED to one of the other values) is written to prefs, any
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later calls are ignored.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: this is invoked internally on a normal shutdown, but is public so
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that it can be invoked when the user logs out/powers down (WM_ENDSESSION),
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or to handle backgrounding/foregrounding on mobile.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExitType(ExitType exit_type) = 0;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns how the last session was shutdown.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ExitType GetLastSessionExitType() = 0;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop sending accessibility events until ResumeAccessibilityEvents().
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls to Pause nest; no events will be sent until the number of
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resume calls matches the number of Pause calls received.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PauseAccessibilityEvents() {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    accessibility_pause_level_++;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResumeAccessibilityEvents() {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_GT(accessibility_pause_level_, 0);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    accessibility_pause_level_--;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldSendAccessibilityEvents() {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0 == accessibility_pause_level_;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns whether the profile is new.  A profile is new if the browser has
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // not been shut down since the profile was created.
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsNewProfile();
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether sync is configurable by the user. Returns false if sync is
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled or controlled by configuration management.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsSyncAccessible();
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send NOTIFICATION_PROFILE_DESTROYED for this Profile, if it has not
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // already been sent. It is necessary because most Profiles are destroyed by
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProfileDestroyer, but in tests, some are not.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MaybeSendDestroyedNotification();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates an OffTheRecordProfile which points to this Profile.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* CreateOffTheRecordProfile();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool restored_last_session_;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to prevent the notification that this Profile is destroyed from
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being sent twice.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sent_destroyed_notification_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessibility events will only be propagated when the pause
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // level is zero.  PauseAccessibilityEvents and ResumeAccessibilityEvents
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // increment and decrement the level, respectively, rather than set it to
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true or false, so that calls can be nested.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int accessibility_pause_level_;
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Profile);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(COMPILER_GCC)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace BASE_HASH_NAMESPACE {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hash<Profile*> {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::size_t operator()(Profile* const& p) const {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<std::size_t>(p);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace BASE_HASH_NAMESPACE
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_PROFILES_PROFILE_H_
417