Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: chrome/browser/profile.cc

Issue 16408: Refactor the two URLRequestContext subclasses in profile.cc into a new shared (Closed)
Patch Set: aa@chromium.org Created 12 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/profile.h ('k') | net/url_request/url_request_context.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/profile.h" 5 #include "chrome/browser/profile.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/file_path.h" 8 #include "base/file_path.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/lock.h" 10 #include "base/lock.h"
11 #include "base/path_service.h" 11 #include "base/path_service.h"
12 #include "base/scoped_ptr.h" 12 #include "base/scoped_ptr.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "base/values.h" 14 #include "base/values.h"
15 #include "chrome/app/locales/locale_settings.h" 15 #include "chrome/app/locales/locale_settings.h"
16 #include "chrome/browser/bookmarks/bookmark_model.h" 16 #include "chrome/browser/bookmarks/bookmark_model.h"
17 #include "chrome/browser/browser_list.h" 17 #include "chrome/browser/browser_list.h"
18 #include "chrome/browser/browser_process.h" 18 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/download/download_manager.h" 19 #include "chrome/browser/download/download_manager.h"
20 #include "chrome/browser/extensions/extensions_service.h" 20 #include "chrome/browser/extensions/extensions_service.h"
21 #include "chrome/browser/greasemonkey_master.h" 21 #include "chrome/browser/greasemonkey_master.h"
22 #include "chrome/browser/history/history.h" 22 #include "chrome/browser/history/history.h"
23 #include "chrome/browser/navigation_controller.h" 23 #include "chrome/browser/navigation_controller.h"
24 #include "chrome/browser/net/chrome_url_request_context.h"
24 #include "chrome/browser/profile_manager.h" 25 #include "chrome/browser/profile_manager.h"
25 #include "chrome/browser/render_process_host.h" 26 #include "chrome/browser/render_process_host.h"
26 #include "chrome/browser/sessions/session_service.h" 27 #include "chrome/browser/sessions/session_service.h"
27 #include "chrome/browser/sessions/tab_restore_service.h" 28 #include "chrome/browser/sessions/tab_restore_service.h"
28 #include "chrome/browser/spellchecker.h" 29 #include "chrome/browser/spellchecker.h"
29 #include "chrome/browser/template_url_fetcher.h" 30 #include "chrome/browser/template_url_fetcher.h"
30 #include "chrome/browser/template_url_model.h" 31 #include "chrome/browser/template_url_model.h"
31 #include "chrome/browser/visitedlink_master.h" 32 #include "chrome/browser/visitedlink_master.h"
32 #include "chrome/browser/webdata/web_data_service.h" 33 #include "chrome/browser/webdata/web_data_service.h"
33 #include "chrome/common/chrome_constants.h" 34 #include "chrome/common/chrome_constants.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 Profile* Profile::CreateProfile(const std::wstring& path) { 70 Profile* Profile::CreateProfile(const std::wstring& path) {
70 return new ProfileImpl(path); 71 return new ProfileImpl(path);
71 } 72 }
72 73
73 //static 74 //static
74 URLRequestContext* Profile::GetDefaultRequestContext() { 75 URLRequestContext* Profile::GetDefaultRequestContext() {
75 return default_request_context_; 76 return default_request_context_;
76 } 77 }
77 78
78 79
79 // Sets up proxy info if it was specified, otherwise returns NULL. The
80 // returned pointer MUST be deleted by the caller if non-NULL.
81 static net::ProxyInfo* CreateProxyInfo(const CommandLine& command_line) {
82 net::ProxyInfo* proxy_info = NULL;
83
84 if (command_line.HasSwitch(switches::kProxyServer)) {
85 proxy_info = new net::ProxyInfo();
86 const std::wstring& proxy_server =
87 command_line.GetSwitchValue(switches::kProxyServer);
88 proxy_info->UseNamedProxy(WideToASCII(proxy_server));
89 }
90
91 return proxy_info;
92 }
93
94 // Releases the URLRequestContext and sends out a notification about it.
95 // Note: runs on IO thread.
96 static void ReleaseURLRequestContext(URLRequestContext* context) {
97 NotificationService::current()->Notify(NOTIFY_URL_REQUEST_CONTEXT_RELEASED,
98 Source<URLRequestContext>(context),
99 NotificationService::NoDetails());
100 context->Release();
101 }
102
103 // A context for URLRequests issued relative to this profile.
104 class ProfileImpl::RequestContext : public URLRequestContext,
105 public NotificationObserver {
106 public:
107 // |cookie_store_path| is the local disk path at which the cookie store
108 // is persisted.
109 RequestContext(const std::wstring& cookie_store_path,
110 const std::wstring& disk_cache_path,
111 PrefService* prefs)
112 : prefs_(prefs) {
113 cookie_store_ = NULL;
114
115 // setup user agent
116 user_agent_ = webkit_glue::GetUserAgent();
117 // set up Accept-Language and Accept-Charset header values
118 // TODO(jungshik) : This may slow down http requests. Perhaps,
119 // we have to come up with a better way to set up these values.
120 accept_language_ = WideToASCII(prefs_->GetString(prefs::kAcceptLanguages));
121 accept_charset_ = WideToASCII(prefs_->GetString(prefs::kDefaultCharset));
122 accept_charset_ += ",*,utf-8";
123
124 CommandLine command_line;
125
126 scoped_ptr<net::ProxyInfo> proxy_info(CreateProxyInfo(command_line));
127 proxy_service_ = net::ProxyService::Create(proxy_info.get());
128
129 net::HttpCache* cache =
130 new net::HttpCache(proxy_service_, disk_cache_path, 0);
131
132 bool record_mode = chrome::kRecordModeEnabled &&
133 CommandLine().HasSwitch(switches::kRecordMode);
134 bool playback_mode = CommandLine().HasSwitch(switches::kPlaybackMode);
135
136 if (record_mode || playback_mode) {
137 // Don't use existing cookies and use an in-memory store.
138 cookie_store_ = new net::CookieMonster();
139 cache->set_mode(
140 record_mode ? net::HttpCache::RECORD : net::HttpCache::PLAYBACK);
141 }
142 http_transaction_factory_ = cache;
143
144 // setup cookie store
145 if (!cookie_store_) {
146 DCHECK(!cookie_store_path.empty());
147 cookie_db_.reset(new SQLitePersistentCookieStore(
148 cookie_store_path, g_browser_process->db_thread()->message_loop()));
149 cookie_store_ = new net::CookieMonster(cookie_db_.get());
150 }
151
152 cookie_policy_.SetType(net::CookiePolicy::FromInt(
153 prefs_->GetInteger(prefs::kCookieBehavior)));
154
155 // The first request context to be created is the one for the default
156 // profile - at least until we support multiple profiles.
157 if (!default_request_context_)
158 default_request_context_ = this;
159 NotificationService::current()->Notify(
160 NOTIFY_DEFAULT_REQUEST_CONTEXT_AVAILABLE,
161 NotificationService::AllSources(), NotificationService::NoDetails());
162
163 // Register for notifications about prefs.
164 prefs_->AddPrefObserver(prefs::kAcceptLanguages, this);
165 prefs_->AddPrefObserver(prefs::kCookieBehavior, this);
166 }
167
168 // NotificationObserver implementation.
169 virtual void Observe(NotificationType type,
170 const NotificationSource& source,
171 const NotificationDetails& details) {
172 if (NOTIFY_PREF_CHANGED == type) {
173 std::wstring* pref_name_in = Details<std::wstring>(details).ptr();
174 PrefService* prefs = Source<PrefService>(source).ptr();
175 DCHECK(pref_name_in && prefs);
176 if (*pref_name_in == prefs::kAcceptLanguages) {
177 std::string accept_language =
178 WideToASCII(prefs->GetString(prefs::kAcceptLanguages));
179 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
180 NewRunnableMethod(this,
181 &RequestContext::OnAcceptLanguageChange,
182 accept_language));
183 } else if (*pref_name_in == prefs::kCookieBehavior) {
184 net::CookiePolicy::Type type = net::CookiePolicy::FromInt(
185 prefs_->GetInteger(prefs::kCookieBehavior));
186 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
187 NewRunnableMethod(this,
188 &RequestContext::OnCookiePolicyChange,
189 type));
190 }
191 }
192 }
193
194 // Since ProfileImpl::RequestContext will be destroyed on IO thread, but all
195 // PrefService observers are needed to clear in before destroying ProfileImpl.
196 // So we use to CleanupBeforeDestroy to do this thing. This function need to
197 // be called on destructor of ProfileImpl.
198 void CleanupBeforeDestroy() {
199 // Unregister for pref notifications.
200 prefs_->RemovePrefObserver(prefs::kAcceptLanguages, this);
201 prefs_->RemovePrefObserver(prefs::kCookieBehavior, this);
202 prefs_ = NULL;
203 }
204
205 void OnAcceptLanguageChange(std::string accept_language) {
206 DCHECK(MessageLoop::current() ==
207 ChromeThread::GetMessageLoop(ChromeThread::IO));
208 accept_language_ = accept_language;
209 }
210
211 void OnCookiePolicyChange(net::CookiePolicy::Type type) {
212 DCHECK(MessageLoop::current() ==
213 ChromeThread::GetMessageLoop(ChromeThread::IO));
214 cookie_policy_.SetType(type);
215 }
216
217 virtual ~RequestContext() {
218 DCHECK(NULL == prefs_);
219 delete cookie_store_;
220 delete http_transaction_factory_;
221 delete proxy_service_;
222
223 if (default_request_context_ == this)
224 default_request_context_ = NULL;
225 }
226
227 private:
228 scoped_ptr<SQLitePersistentCookieStore> cookie_db_;
229 PrefService* prefs_;
230 };
231
232 ////////////////////////////////////////////////////////////////////////////////
233 //
234 // An URLRequestContext proxy for OffTheRecord. This request context is
235 // really a proxy to the original profile's request context but set
236 // is_off_the_record_ to true.
237 //
238 // TODO(ACW). Do we need to share the FtpAuthCache with the real request context
239 // see bug 974328
240 //
241 // TODO(jackson): http://b/issue?id=1197350 Remove duplicated code from above.
242 //
243 ////////////////////////////////////////////////////////////////////////////////
244 class OffTheRecordRequestContext : public URLRequestContext,
245 public NotificationObserver {
246 public:
247 explicit OffTheRecordRequestContext(Profile* profile) {
248 DCHECK(!profile->IsOffTheRecord());
249 prefs_ = profile->GetPrefs();
250 DCHECK(prefs_);
251
252 // The OffTheRecordRequestContext is owned by the OffTheRecordProfileImpl
253 // which is itself owned by the original profile. We reference the original
254 // context to make sure it doesn't go away when we delete the object graph.
255 original_context_ = profile->GetRequestContext();
256
257 // Share the same proxy service as the original profile. This proxy
258 // service's lifespan is dependent on the lifespan of the original profile,
259 // which we reference (see above).
260 proxy_service_ = original_context_->proxy_service();
261
262 http_transaction_factory_ = new net::HttpCache(proxy_service_, 0);
263 cookie_store_ = new net::CookieMonster;
264 cookie_policy_.SetType(net::CookiePolicy::FromInt(
265 prefs_->GetInteger(prefs::kCookieBehavior)));
266 user_agent_ = original_context_->user_agent();
267 accept_language_ = original_context_->accept_language();
268 accept_charset_ = original_context_->accept_charset();
269 is_off_the_record_ = true;
270
271 // Register for notifications about prefs.
272 prefs_->AddPrefObserver(prefs::kAcceptLanguages, this);
273 prefs_->AddPrefObserver(prefs::kCookieBehavior, this);
274 }
275
276 // Since OffTheRecordProfileImpl maybe be destroyed after destroying
277 // PrefService, but all PrefService observers are needed to clear in
278 // before destroying PrefService. So we use to CleanupBeforeDestroy
279 // to do this thing. This function need to be called on destructor
280 // of ProfileImpl.
281 void CleanupBeforeDestroy() {
282 // Unregister for pref notifications.
283 prefs_->RemovePrefObserver(prefs::kAcceptLanguages, this);
284 prefs_->RemovePrefObserver(prefs::kCookieBehavior, this);
285 prefs_ = NULL;
286 }
287
288 // NotificationObserver implementation.
289 virtual void Observe(NotificationType type,
290 const NotificationSource& source,
291 const NotificationDetails& details) {
292 if (NOTIFY_PREF_CHANGED == type) {
293 std::wstring* pref_name_in = Details<std::wstring>(details).ptr();
294 PrefService* prefs = Source<PrefService>(source).ptr();
295 DCHECK(pref_name_in && prefs);
296 if (*pref_name_in == prefs::kAcceptLanguages) {
297 std::string accept_language =
298 WideToASCII(prefs->GetString(prefs::kAcceptLanguages));
299 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
300 NewRunnableMethod(
301 this,
302 &OffTheRecordRequestContext::OnAcceptLanguageChange,
303 accept_language));
304 } else if (*pref_name_in == prefs::kCookieBehavior) {
305 net::CookiePolicy::Type type = net::CookiePolicy::FromInt(
306 prefs_->GetInteger(prefs::kCookieBehavior));
307 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
308 NewRunnableMethod(this,
309 &OffTheRecordRequestContext::OnCookiePolicyChange,
310 type));
311 }
312 }
313 }
314
315 void OnAcceptLanguageChange(std::string accept_language) {
316 DCHECK(MessageLoop::current() ==
317 ChromeThread::GetMessageLoop(ChromeThread::IO));
318 accept_language_ = accept_language;
319 }
320
321 void OnCookiePolicyChange(net::CookiePolicy::Type type) {
322 DCHECK(MessageLoop::current() ==
323 ChromeThread::GetMessageLoop(ChromeThread::IO));
324 cookie_policy_.SetType(type);
325 }
326
327 virtual ~OffTheRecordRequestContext() {
328 DCHECK(NULL == prefs_);
329 delete cookie_store_;
330 delete http_transaction_factory_;
331 // NOTE: do not delete |proxy_service_| as is owned by the original profile.
332
333 // The OffTheRecordRequestContext simply act as a proxy to the real context.
334 // There is nothing else to delete.
335 }
336
337 private:
338 // The original (non off the record) URLRequestContext.
339 scoped_refptr<URLRequestContext> original_context_;
340 PrefService* prefs_;
341
342 DISALLOW_EVIL_CONSTRUCTORS(OffTheRecordRequestContext);
343 };
344
345 //////////////////////////////////////////////////////////////////////////////// 80 ////////////////////////////////////////////////////////////////////////////////
346 // 81 //
347 // OffTheRecordProfileImpl is a profile subclass that wraps an existing profile 82 // OffTheRecordProfileImpl is a profile subclass that wraps an existing profile
348 // to make it suitable for the off the record mode. 83 // to make it suitable for the off the record mode.
349 // 84 //
350 //////////////////////////////////////////////////////////////////////////////// 85 ////////////////////////////////////////////////////////////////////////////////
351 class OffTheRecordProfileImpl : public Profile, 86 class OffTheRecordProfileImpl : public Profile,
352 public NotificationObserver { 87 public NotificationObserver {
353 public: 88 public:
354 explicit OffTheRecordProfileImpl(Profile* real_profile) 89 explicit OffTheRecordProfileImpl(Profile* real_profile)
355 : profile_(real_profile), 90 : profile_(real_profile),
356 start_time_(Time::Now()) { 91 start_time_(Time::Now()) {
357 request_context_ = new OffTheRecordRequestContext(real_profile); 92 request_context_ = ChromeURLRequestContext::CreateOffTheRecord(this);
358 request_context_->AddRef(); 93 request_context_->AddRef();
359 // Register for browser close notifications so we can detect when the last 94 // Register for browser close notifications so we can detect when the last
360 // off-the-record window is closed, in which case we can clean our states 95 // off-the-record window is closed, in which case we can clean our states
361 // (cookies, downloads...). 96 // (cookies, downloads...).
362 NotificationService::current()->AddObserver( 97 NotificationService::current()->AddObserver(
363 this, NOTIFY_BROWSER_CLOSED, NotificationService::AllSources()); 98 this, NOTIFY_BROWSER_CLOSED, NotificationService::AllSources());
364 } 99 }
365 100
366 virtual ~OffTheRecordProfileImpl() { 101 virtual ~OffTheRecordProfileImpl() {
367 if (request_context_) { 102 if (request_context_) {
368 request_context_->CleanupBeforeDestroy(); 103 request_context_->CleanupOnUIThread();
104
369 // Clean up request context on IO thread. 105 // Clean up request context on IO thread.
370 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, 106 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
371 NewRunnableFunction(&ReleaseURLRequestContext, request_context_)); 107 NewRunnableMethod(request_context_,
108 &base::RefCountedThreadSafe<URLRequestContext>::Release));
372 request_context_ = NULL; 109 request_context_ = NULL;
373 } 110 }
374 NotificationService::current()->RemoveObserver( 111 NotificationService::current()->RemoveObserver(
375 this, NOTIFY_BROWSER_CLOSED, NotificationService::AllSources()); 112 this, NOTIFY_BROWSER_CLOSED, NotificationService::AllSources());
376 } 113 }
377 114
378 virtual std::wstring GetPath() { return profile_->GetPath(); } 115 virtual std::wstring GetPath() { return profile_->GetPath(); }
379 116
380 virtual bool IsOffTheRecord() { 117 virtual bool IsOffTheRecord() {
381 return true; 118 return true;
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 // Note that we check against 1 as this notification is sent before the 275 // Note that we check against 1 as this notification is sent before the
539 // browser window is actually removed from the list. 276 // browser window is actually removed from the list.
540 if (BrowserList::GetBrowserCount(this) <= 1) 277 if (BrowserList::GetBrowserCount(this) <= 1)
541 ExitedOffTheRecordMode(); 278 ExitedOffTheRecordMode();
542 } 279 }
543 280
544 private: 281 private:
545 // The real underlying profile. 282 // The real underlying profile.
546 Profile* profile_; 283 Profile* profile_;
547 284
548 // A proxy to the real request context. 285 // The context to use for requests made from this OTR session.
549 OffTheRecordRequestContext* request_context_; 286 ChromeURLRequestContext* request_context_;
550 287
551 // The download manager that only stores downloaded items in memory. 288 // The download manager that only stores downloaded items in memory.
552 scoped_refptr<DownloadManager> download_manager_; 289 scoped_refptr<DownloadManager> download_manager_;
553 290
554 // Time we were started. 291 // Time we were started.
555 Time start_time_; 292 Time start_time_;
556 293
557 DISALLOW_EVIL_CONSTRUCTORS(OffTheRecordProfileImpl); 294 DISALLOW_EVIL_CONSTRUCTORS(OffTheRecordProfileImpl);
558 }; 295 };
559 296
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 if (spellchecker_) { 358 if (spellchecker_) {
622 // The spellchecker must be deleted on the I/O thread. During testing, we 359 // The spellchecker must be deleted on the I/O thread. During testing, we
623 // don't have an I/O thread. 360 // don't have an I/O thread.
624 if (io_thread) 361 if (io_thread)
625 io_thread->message_loop()->ReleaseSoon(FROM_HERE, spellchecker_); 362 io_thread->message_loop()->ReleaseSoon(FROM_HERE, spellchecker_);
626 else 363 else
627 spellchecker_->Release(); 364 spellchecker_->Release();
628 } 365 }
629 366
630 if (request_context_) { 367 if (request_context_) {
631 request_context_->CleanupBeforeDestroy(); 368 request_context_->CleanupOnUIThread();
369
370 if (default_request_context_ == request_context_)
371 default_request_context_ = NULL;
372
632 // Clean up request context on IO thread. 373 // Clean up request context on IO thread.
633 io_thread->message_loop()->PostTask(FROM_HERE, 374 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
634 NewRunnableFunction(&ReleaseURLRequestContext, request_context_)); 375 NewRunnableMethod(request_context_,
376 &base::RefCountedThreadSafe<URLRequestContext>::Release));
635 request_context_ = NULL; 377 request_context_ = NULL;
636 } 378 }
637 379
638 // HistoryService may call into the BookmarkModel, as such we need to 380 // HistoryService may call into the BookmarkModel, as such we need to
639 // delete HistoryService before the BookmarkModel. The destructor for 381 // delete HistoryService before the BookmarkModel. The destructor for
640 // HistoryService will join with HistoryService's backend thread so that 382 // HistoryService will join with HistoryService's backend thread so that
641 // by the time the destructor has finished we're sure it will no longer call 383 // by the time the destructor has finished we're sure it will no longer call
642 // into the BookmarkModel. 384 // into the BookmarkModel.
643 history_service_ = NULL; 385 history_service_ = NULL;
644 bookmark_bar_model_.reset(); 386 bookmark_bar_model_.reset();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 file_util::AppendToPath(&pref_file_path, chrome::kPreferencesFilename); 488 file_util::AppendToPath(&pref_file_path, chrome::kPreferencesFilename);
747 return pref_file_path; 489 return pref_file_path;
748 } 490 }
749 491
750 URLRequestContext* ProfileImpl::GetRequestContext() { 492 URLRequestContext* ProfileImpl::GetRequestContext() {
751 if (!request_context_) { 493 if (!request_context_) {
752 std::wstring cookie_path = GetPath(); 494 std::wstring cookie_path = GetPath();
753 file_util::AppendToPath(&cookie_path, chrome::kCookieFilename); 495 file_util::AppendToPath(&cookie_path, chrome::kCookieFilename);
754 std::wstring cache_path = GetPath(); 496 std::wstring cache_path = GetPath();
755 file_util::AppendToPath(&cache_path, chrome::kCacheDirname); 497 file_util::AppendToPath(&cache_path, chrome::kCacheDirname);
756 request_context_ = 498 request_context_ = ChromeURLRequestContext::CreateOriginal(
757 new ProfileImpl::RequestContext(cookie_path, cache_path, GetPrefs()); 499 this, cookie_path, cache_path);
758 request_context_->AddRef(); 500 request_context_->AddRef();
759 501
502 // The first request context is always a normal (non-OTR) request context.
503 // Even when Chromium is started in OTR mode, a normal profile is always
504 // created first.
505 if (!default_request_context_) {
506 default_request_context_ = request_context_;
507 NotificationService::current()->Notify(
508 NOTIFY_DEFAULT_REQUEST_CONTEXT_AVAILABLE,
509 NotificationService::AllSources(), NotificationService::NoDetails());
510 }
511
760 DCHECK(request_context_->cookie_store()); 512 DCHECK(request_context_->cookie_store());
761 } 513 }
762 514
763 return request_context_; 515 return request_context_;
764 } 516 }
765 517
766 HistoryService* ProfileImpl::GetHistoryService(ServiceAccessType sat) { 518 HistoryService* ProfileImpl::GetHistoryService(ServiceAccessType sat) {
767 if (!history_service_created_) { 519 if (!history_service_created_) {
768 history_service_created_ = true; 520 history_service_created_ = true;
769 scoped_refptr<HistoryService> history(new HistoryService(this)); 521 scoped_refptr<HistoryService> history(new HistoryService(this));
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 } 759 }
1008 760
1009 #ifdef CHROME_PERSONALIZATION 761 #ifdef CHROME_PERSONALIZATION
1010 ProfilePersonalization* ProfileImpl::GetProfilePersonalization() { 762 ProfilePersonalization* ProfileImpl::GetProfilePersonalization() {
1011 if (!personalization_.get()) 763 if (!personalization_.get())
1012 personalization_.reset( 764 personalization_.reset(
1013 Personalization::CreateProfilePersonalization(this)); 765 Personalization::CreateProfilePersonalization(this));
1014 return personalization_.get(); 766 return personalization_.get();
1015 } 767 }
1016 #endif 768 #endif
OLDNEW
« no previous file with comments | « chrome/browser/profile.h ('k') | net/url_request/url_request_context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698