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