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

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

Issue 9150016: Move creation and ownership of ResourceDispatcherHost and PluginService to content. This gives a ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix chromeos ui_tests Created 8 years, 11 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 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/browser_process_impl.h" 5 #include "chrome/browser/browser_process_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 #include "chrome/common/chrome_switches.h" 61 #include "chrome/common/chrome_switches.h"
62 #include "chrome/common/extensions/extension_l10n_util.h" 62 #include "chrome/common/extensions/extension_l10n_util.h"
63 #include "chrome/common/extensions/extension_resource.h" 63 #include "chrome/common/extensions/extension_resource.h"
64 #include "chrome/common/json_pref_store.h" 64 #include "chrome/common/json_pref_store.h"
65 #include "chrome/common/pref_names.h" 65 #include "chrome/common/pref_names.h"
66 #include "chrome/common/switch_utils.h" 66 #include "chrome/common/switch_utils.h"
67 #include "chrome/common/url_constants.h" 67 #include "chrome/common/url_constants.h"
68 #include "chrome/installer/util/google_update_constants.h" 68 #include "chrome/installer/util/google_update_constants.h"
69 #include "content/browser/browser_child_process_host.h" 69 #include "content/browser/browser_child_process_host.h"
70 #include "content/browser/child_process_security_policy.h" 70 #include "content/browser/child_process_security_policy.h"
71 #include "content/browser/download/download_file_manager.h"
72 #include "content/browser/download/download_status_updater.h" 71 #include "content/browser/download/download_status_updater.h"
73 #include "content/browser/download/mhtml_generation_manager.h" 72 #include "content/browser/download/mhtml_generation_manager.h"
74 #include "content/browser/download/save_file_manager.h"
75 #include "content/browser/gpu/gpu_process_host_ui_shim.h" 73 #include "content/browser/gpu/gpu_process_host_ui_shim.h"
76 #include "content/browser/net/browser_online_state_observer.h" 74 #include "content/browser/net/browser_online_state_observer.h"
77 #include "content/browser/renderer_host/resource_dispatcher_host.h" 75 #include "content/browser/renderer_host/resource_dispatcher_host.h"
78 #include "content/public/browser/browser_thread.h" 76 #include "content/public/browser/browser_thread.h"
79 #include "content/public/browser/notification_details.h" 77 #include "content/public/browser/notification_details.h"
80 #include "content/public/browser/plugin_service.h" 78 #include "content/public/browser/plugin_service.h"
81 #include "content/public/browser/render_process_host.h" 79 #include "content/public/browser/render_process_host.h"
82 #include "content/public/common/url_fetcher.h" 80 #include "content/public/common/url_fetcher.h"
83 #include "media/audio/audio_manager.h" 81 #include "media/audio/audio_manager.h"
84 #include "net/socket/client_socket_pool_manager.h" 82 #include "net/socket/client_socket_pool_manager.h"
(...skipping 29 matching lines...) Expand all
114 // How long to wait for the File thread to complete during EndSession, on 112 // How long to wait for the File thread to complete during EndSession, on
115 // Linux. We have a timeout here because we're unable to run the UI messageloop 113 // Linux. We have a timeout here because we're unable to run the UI messageloop
116 // and there's some deadlock risk. Our only option is to exit anyway. 114 // and there's some deadlock risk. Our only option is to exit anyway.
117 static const int kEndSessionTimeoutSeconds = 10; 115 static const int kEndSessionTimeoutSeconds = 10;
118 #endif 116 #endif
119 117
120 using content::BrowserThread; 118 using content::BrowserThread;
121 using content::PluginService; 119 using content::PluginService;
122 120
123 BrowserProcessImpl::BrowserProcessImpl(const CommandLine& command_line) 121 BrowserProcessImpl::BrowserProcessImpl(const CommandLine& command_line)
124 : created_resource_dispatcher_host_(false), 122 : created_metrics_service_(false),
125 created_metrics_service_(false),
126 created_watchdog_thread_(false), 123 created_watchdog_thread_(false),
127 created_profile_manager_(false), 124 created_profile_manager_(false),
128 created_local_state_(false), 125 created_local_state_(false),
129 created_icon_manager_(false), 126 created_icon_manager_(false),
130 created_browser_policy_connector_(false), 127 created_browser_policy_connector_(false),
131 created_notification_ui_manager_(false), 128 created_notification_ui_manager_(false),
132 created_safe_browsing_service_(false), 129 created_safe_browsing_service_(false),
133 module_ref_count_(0), 130 module_ref_count_(0),
134 did_start_(false), 131 did_start_(false),
135 checked_for_new_frames_(false), 132 checked_for_new_frames_(false),
(...skipping 12 matching lines...) Expand all
148 chrome::kExtensionScheme); 145 chrome::kExtensionScheme);
149 146
150 extension_event_router_forwarder_ = new ExtensionEventRouterForwarder; 147 extension_event_router_forwarder_ = new ExtensionEventRouterForwarder;
151 148
152 ExtensionTabIdMap::GetInstance()->Init(); 149 ExtensionTabIdMap::GetInstance()->Init();
153 150
154 online_state_observer_.reset(new BrowserOnlineStateObserver); 151 online_state_observer_.reset(new BrowserOnlineStateObserver);
155 } 152 }
156 153
157 BrowserProcessImpl::~BrowserProcessImpl() { 154 BrowserProcessImpl::~BrowserProcessImpl() {
158 // See StartTearDown and PreStopThread functions below, this is where
159 // most destruction happens so that it can be interleaved with threads
160 // going away.
161
162 // Wait for the pending print jobs to finish. 155 // Wait for the pending print jobs to finish.
163 print_job_manager_->OnQuit(); 156 print_job_manager_->OnQuit();
164 print_job_manager_.reset(); 157 print_job_manager_.reset();
165 158
166 tracked_objects::ThreadData::EnsureCleanupWasCalled(4); 159 tracked_objects::ThreadData::EnsureCleanupWasCalled(4);
167 160
168 g_browser_process = NULL; 161 g_browser_process = NULL;
169 } 162 }
170 163
171 void BrowserProcessImpl::StartTearDown() { 164 void BrowserProcessImpl::StartTearDown() {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 // to be cancelled too. Remove this when DefaultRequestContext goes away. 205 // to be cancelled too. Remove this when DefaultRequestContext goes away.
213 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 206 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
214 base::Bind(&content::URLFetcher::CancelAll)); 207 base::Bind(&content::URLFetcher::CancelAll));
215 208
216 // Need to clear profiles (download managers) before the io_thread_. 209 // Need to clear profiles (download managers) before the io_thread_.
217 profile_manager_.reset(); 210 profile_manager_.reset();
218 211
219 // Debugger must be cleaned up before IO thread and NotificationService. 212 // Debugger must be cleaned up before IO thread and NotificationService.
220 remote_debugging_server_.reset(); 213 remote_debugging_server_.reset();
221 214
222 if (resource_dispatcher_host_.get()) {
223 // Cancel pending requests and prevent new requests.
224 resource_dispatcher_host()->Shutdown();
225 }
226
227 ExtensionTabIdMap::GetInstance()->Shutdown(); 215 ExtensionTabIdMap::GetInstance()->Shutdown();
228 216
229 // The policy providers managed by |browser_policy_connector_| need to shut 217 // The policy providers managed by |browser_policy_connector_| need to shut
230 // down while the IO and FILE threads are still alive. 218 // down while the IO and FILE threads are still alive.
231 browser_policy_connector_.reset(); 219 browser_policy_connector_.reset();
232 220
233 // Destroying the GpuProcessHostUIShims on the UI thread posts a task to 221 // Destroying the GpuProcessHostUIShims on the UI thread posts a task to
234 // delete related objects on the GPU thread. This must be done before 222 // delete related objects on the GPU thread. This must be done before
235 // stopping the GPU thread. The GPU thread will close IPC channels to renderer 223 // stopping the GPU thread. The GPU thread will close IPC channels to renderer
236 // processes so this has to happen before stopping the IO thread. 224 // processes so this has to happen before stopping the IO thread.
237 GpuProcessHostUIShim::DestroyAll(); 225 GpuProcessHostUIShim::DestroyAll();
238 226
239 // Stop the watchdog thread before stopping other threads. 227 // Stop the watchdog thread before stopping other threads.
240 watchdog_thread_.reset(); 228 watchdog_thread_.reset();
241 } 229 }
242 230
243 void BrowserProcessImpl::PreStartThread(BrowserThread::ID thread_id) { 231 void BrowserProcessImpl::PostDestroyThreads() {
244 switch (thread_id) { 232 // With the file_thread_ flushed, we can release any icon resources.
245 case BrowserThread::IO: 233 icon_manager_.reset();
246 CreateIOThreadState();
247 break;
248 234
249 default: 235 // Reset associated state right after actual thread is stopped,
250 break; 236 // as io_thread_.global_ cleanup happens in CleanUp on the IO
251 } 237 // thread, i.e. as the thread exits its message loop.
252 } 238 //
253 239 // This is important also because in various places, the
254 void BrowserProcessImpl::PostStartThread(BrowserThread::ID thread_id) { 240 // IOThread object being NULL is considered synonymous with the
255 } 241 // IO thread having stopped.
256 242 io_thread_.reset();
257 void BrowserProcessImpl::PreStopThread(BrowserThread::ID thread_id) {
258 switch (thread_id) {
259 case BrowserThread::FILE:
260 // Clean up state that lives on or uses the file_thread_ before
261 // it goes away.
262 if (resource_dispatcher_host_.get()) {
263 resource_dispatcher_host()->download_file_manager()->Shutdown();
264 resource_dispatcher_host()->save_file_manager()->Shutdown();
265 }
266 break;
267 case BrowserThread::WEBKIT_DEPRECATED:
268 // Need to destroy ResourceDispatcherHost before PluginService
269 // and SafeBrowsingService, since it caches a pointer to
270 // it.
271 resource_dispatcher_host_.reset();
272 break;
273 default:
274 break;
275 }
276 }
277
278 void BrowserProcessImpl::PostStopThread(BrowserThread::ID thread_id) {
279 switch (thread_id) {
280 case BrowserThread::FILE:
281 // With the file_thread_ flushed, we can release any icon resources.
282 icon_manager_.reset();
283 break;
284 case BrowserThread::IO:
285 // Reset associated state right after actual thread is stopped,
286 // as io_thread_.global_ cleanup happens in CleanUp on the IO
287 // thread, i.e. as the thread exits its message loop.
288 //
289 // This is important also because in various places, the
290 // IOThread object being NULL is considered synonymous with the
291 // IO thread having stopped.
292 io_thread_.reset();
293 break;
294 default:
295 break;
296 }
297 } 243 }
298 244
299 #if defined(OS_WIN) 245 #if defined(OS_WIN)
300 // Send a QuitTask to the given MessageLoop when the (file) thread has processed 246 // Send a QuitTask to the given MessageLoop when the (file) thread has processed
301 // our (other) recent requests (to save preferences). 247 // our (other) recent requests (to save preferences).
302 // Change the boolean so that the receiving thread will know that we did indeed 248 // Change the boolean so that the receiving thread will know that we did indeed
303 // send the QuitTask that terminated the message loop. 249 // send the QuitTask that terminated the message loop.
304 static void PostQuit(MessageLoop* message_loop) { 250 static void PostQuit(MessageLoop* message_loop) {
305 g_end_session_file_thread_has_completed = true; 251 g_end_session_file_thread_has_completed = true;
306 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 252 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure());
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 ++quits_received; 331 ++quits_received;
386 } while (!g_end_session_file_thread_has_completed); 332 } while (!g_end_session_file_thread_has_completed);
387 // If we did get extra quits, then we should re-post them to the message loop. 333 // If we did get extra quits, then we should re-post them to the message loop.
388 while (--quits_received > 0) 334 while (--quits_received > 0)
389 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 335 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
390 #else 336 #else
391 NOTIMPLEMENTED(); 337 NOTIMPLEMENTED();
392 #endif 338 #endif
393 } 339 }
394 340
395 ResourceDispatcherHost* BrowserProcessImpl::resource_dispatcher_host() {
396 DCHECK(CalledOnValidThread());
397 if (!created_resource_dispatcher_host_)
398 CreateResourceDispatcherHost();
399 return resource_dispatcher_host_.get();
400 }
401
402 MetricsService* BrowserProcessImpl::metrics_service() { 341 MetricsService* BrowserProcessImpl::metrics_service() {
403 DCHECK(CalledOnValidThread()); 342 DCHECK(CalledOnValidThread());
404 if (!created_metrics_service_) 343 if (!created_metrics_service_)
405 CreateMetricsService(); 344 CreateMetricsService();
406 return metrics_service_.get(); 345 return metrics_service_.get();
407 } 346 }
408 347
409 IOThread* BrowserProcessImpl::io_thread() { 348 IOThread* BrowserProcessImpl::io_thread() {
410 DCHECK(CalledOnValidThread()); 349 DCHECK(CalledOnValidThread());
411 DCHECK(io_thread_.get()); 350 DCHECK(io_thread_.get());
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 } 629 }
691 630
692 AudioManager* BrowserProcessImpl::audio_manager() { 631 AudioManager* BrowserProcessImpl::audio_manager() {
693 DCHECK(CalledOnValidThread()); 632 DCHECK(CalledOnValidThread());
694 if (!audio_manager_) 633 if (!audio_manager_)
695 audio_manager_ = AudioManager::Create(); 634 audio_manager_ = AudioManager::Create();
696 635
697 return audio_manager_; 636 return audio_manager_;
698 } 637 }
699 638
700 void BrowserProcessImpl::CreateResourceDispatcherHost() { 639 void BrowserProcessImpl::ResourceDispatcherHostCreated() {
701 DCHECK(!created_resource_dispatcher_host_ &&
702 resource_dispatcher_host_.get() == NULL);
703 created_resource_dispatcher_host_ = true;
704
705 // UserScriptListener and NetworkDelayListener will delete themselves. 640 // UserScriptListener and NetworkDelayListener will delete themselves.
706 ResourceQueue::DelegateSet resource_queue_delegates; 641 ResourceDispatcherHost* rdh = ResourceDispatcherHost::Get();
707 resource_queue_delegates.insert(new UserScriptListener()); 642 rdh->AddResourceQueueDelegate(new UserScriptListener());
708 resource_queue_delegates.insert(new NetworkDelayListener()); 643 rdh->AddResourceQueueDelegate(new NetworkDelayListener());
709
710 resource_dispatcher_host_.reset(
711 new ResourceDispatcherHost(resource_queue_delegates));
712 resource_dispatcher_host_->Initialize();
713 644
714 resource_dispatcher_host_delegate_.reset( 645 resource_dispatcher_host_delegate_.reset(
715 new ChromeResourceDispatcherHostDelegate(resource_dispatcher_host_.get(), 646 new ChromeResourceDispatcherHostDelegate(rdh, prerender_tracker()));
716 prerender_tracker())); 647 rdh->set_delegate(resource_dispatcher_host_delegate_.get());
717 resource_dispatcher_host_->set_delegate(
718 resource_dispatcher_host_delegate_.get());
719 648
720 pref_change_registrar_.Add(prefs::kAllowCrossOriginAuthPrompt, this); 649 pref_change_registrar_.Add(prefs::kAllowCrossOriginAuthPrompt, this);
721 ApplyAllowCrossOriginAuthPromptPolicy(); 650 ApplyAllowCrossOriginAuthPromptPolicy();
722 } 651 }
723 652
724 void BrowserProcessImpl::CreateMetricsService() { 653 void BrowserProcessImpl::CreateMetricsService() {
725 DCHECK(!created_metrics_service_ && metrics_service_.get() == NULL); 654 DCHECK(!created_metrics_service_ && metrics_service_.get() == NULL);
726 created_metrics_service_ = true; 655 created_metrics_service_ = true;
727 656
728 metrics_service_.reset(new MetricsService); 657 metrics_service_.reset(new MetricsService);
729 } 658 }
730 659
731 void BrowserProcessImpl::CreateIOThreadState() {
732 // Prior to any processing happening on the io thread, we create the
733 // plugin service as it is predominantly used from the io thread,
734 // but must be created on the main thread. The service ctor is
735 // inexpensive and does not invoke the io_thread() accessor.
736 PluginService* plugin_service = PluginService::GetInstance();
737 plugin_service->Init();
738 plugin_service->SetFilter(ChromePluginServiceFilter::GetInstance());
739 plugin_service->StartWatchingPlugins();
740
741 // Register the internal Flash if available.
742 FilePath path;
743 if (!CommandLine::ForCurrentProcess()->HasSwitch(
744 switches::kDisableInternalFlash) &&
745 PathService::Get(chrome::FILE_FLASH_PLUGIN, &path)) {
746 plugin_service->AddExtraPluginPath(path);
747 }
748
749 #if defined(OS_POSIX)
750 // Also find plugins in a user-specific plugins dir,
751 // e.g. ~/.config/chromium/Plugins.
752 FilePath user_data_dir;
753 if (PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) {
754 plugin_service->AddExtraPluginPath(user_data_dir.Append("Plugins"));
755 }
756 #endif
757
758 scoped_ptr<IOThread> thread(new IOThread(
759 local_state(), net_log_.get(), extension_event_router_forwarder_.get()));
760 io_thread_.swap(thread);
761 }
762
763 void BrowserProcessImpl::CreateWatchdogThread() { 660 void BrowserProcessImpl::CreateWatchdogThread() {
764 DCHECK(!created_watchdog_thread_ && watchdog_thread_.get() == NULL); 661 DCHECK(!created_watchdog_thread_ && watchdog_thread_.get() == NULL);
765 created_watchdog_thread_ = true; 662 created_watchdog_thread_ = true;
766 663
767 scoped_ptr<WatchDogThread> thread(new WatchDogThread()); 664 scoped_ptr<WatchDogThread> thread(new WatchDogThread());
768 if (!thread->Start()) 665 if (!thread->Start())
769 return; 666 return;
770 watchdog_thread_.swap(thread); 667 watchdog_thread_.swap(thread);
771 } 668 }
772 669
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 716
820 // This is observed by ChildProcessSecurityPolicy, which lives in content/ 717 // This is observed by ChildProcessSecurityPolicy, which lives in content/
821 // though, so it can't register itself. 718 // though, so it can't register itself.
822 local_state_->RegisterListPref(prefs::kDisabledSchemes); 719 local_state_->RegisterListPref(prefs::kDisabledSchemes);
823 pref_change_registrar_.Add(prefs::kDisabledSchemes, this); 720 pref_change_registrar_.Add(prefs::kDisabledSchemes, this);
824 ApplyDisabledSchemesPolicy(); 721 ApplyDisabledSchemesPolicy();
825 722
826 local_state_->RegisterBooleanPref(prefs::kAllowCrossOriginAuthPrompt, false); 723 local_state_->RegisterBooleanPref(prefs::kAllowCrossOriginAuthPrompt, false);
827 } 724 }
828 725
726 void BrowserProcessImpl::PreCreateThreads() {
727 io_thread_.reset(new IOThread(
728 local_state(), net_log_.get(), extension_event_router_forwarder_.get()));
729 }
730
829 void BrowserProcessImpl::PreMainMessageLoopRun() { 731 void BrowserProcessImpl::PreMainMessageLoopRun() {
732 PluginService* plugin_service = PluginService::GetInstance();
733 plugin_service->SetFilter(ChromePluginServiceFilter::GetInstance());
734 plugin_service->StartWatchingPlugins();
735
736 // Register the internal Flash if available.
737 FilePath path;
738 if (!CommandLine::ForCurrentProcess()->HasSwitch(
739 switches::kDisableInternalFlash) &&
740 PathService::Get(chrome::FILE_FLASH_PLUGIN, &path)) {
741 plugin_service->AddExtraPluginPath(path);
742 }
743
744 #if defined(OS_POSIX)
745 // Also find plugins in a user-specific plugins dir,
746 // e.g. ~/.config/chromium/Plugins.
747 FilePath user_data_dir;
748 if (PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) {
749 plugin_service->AddExtraPluginPath(user_data_dir.Append("Plugins"));
750 }
751 #endif
752
830 if (local_state_->IsManagedPreference(prefs::kDefaultBrowserSettingEnabled)) 753 if (local_state_->IsManagedPreference(prefs::kDefaultBrowserSettingEnabled))
831 ApplyDefaultBrowserPolicy(); 754 ApplyDefaultBrowserPolicy();
832 } 755 }
833 756
834 void BrowserProcessImpl::CreateIconManager() { 757 void BrowserProcessImpl::CreateIconManager() {
835 DCHECK(!created_icon_manager_ && icon_manager_.get() == NULL); 758 DCHECK(!created_icon_manager_ && icon_manager_.get() == NULL);
836 created_icon_manager_ = true; 759 created_icon_manager_ = true;
837 icon_manager_.reset(new IconManager); 760 icon_manager_.reset(new IconManager);
838 } 761 }
839 762
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 void BrowserProcessImpl::ApplyDefaultBrowserPolicy() { 832 void BrowserProcessImpl::ApplyDefaultBrowserPolicy() {
910 if (local_state_->GetBoolean(prefs::kDefaultBrowserSettingEnabled)) { 833 if (local_state_->GetBoolean(prefs::kDefaultBrowserSettingEnabled)) {
911 scoped_refptr<ShellIntegration::DefaultWebClientWorker> 834 scoped_refptr<ShellIntegration::DefaultWebClientWorker>
912 set_browser_worker = new ShellIntegration::DefaultBrowserWorker(NULL); 835 set_browser_worker = new ShellIntegration::DefaultBrowserWorker(NULL);
913 set_browser_worker->StartSetAsDefault(); 836 set_browser_worker->StartSetAsDefault();
914 } 837 }
915 } 838 }
916 839
917 void BrowserProcessImpl::ApplyAllowCrossOriginAuthPromptPolicy() { 840 void BrowserProcessImpl::ApplyAllowCrossOriginAuthPromptPolicy() {
918 bool value = local_state()->GetBoolean(prefs::kAllowCrossOriginAuthPrompt); 841 bool value = local_state()->GetBoolean(prefs::kAllowCrossOriginAuthPrompt);
919 resource_dispatcher_host()->set_allow_cross_origin_auth_prompt(value); 842 ResourceDispatcherHost::Get()->set_allow_cross_origin_auth_prompt(value);
920 } 843 }
921 844
922 // Mac is currently not supported. 845 // Mac is currently not supported.
923 #if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 846 #if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
924 847
925 bool BrowserProcessImpl::CanAutorestartForUpdate() const { 848 bool BrowserProcessImpl::CanAutorestartForUpdate() const {
926 // Check if browser is in the background and if it needs to be restarted to 849 // Check if browser is in the background and if it needs to be restarted to
927 // apply a pending update. 850 // apply a pending update.
928 return BrowserList::size() == 0 && BrowserList::WillKeepAlive() && 851 return BrowserList::size() == 0 && BrowserList::WillKeepAlive() &&
929 upgrade_util::IsUpdatePendingRestart(); 852 upgrade_util::IsUpdatePendingRestart();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 } 892 }
970 893
971 void BrowserProcessImpl::OnAutoupdateTimer() { 894 void BrowserProcessImpl::OnAutoupdateTimer() {
972 if (CanAutorestartForUpdate()) { 895 if (CanAutorestartForUpdate()) {
973 DLOG(WARNING) << "Detected update. Restarting browser."; 896 DLOG(WARNING) << "Detected update. Restarting browser.";
974 RestartBackgroundInstance(); 897 RestartBackgroundInstance();
975 } 898 }
976 } 899 }
977 900
978 #endif // (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 901 #endif // (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698