Quit browser RunLoop via injected Closure rather than via QuitCurrent*.
Use of QuitCurrent*Deprecated() is ambiguous, since RunLoops can be
nested, and so is unsafe to use in general.
TBR: bartfab
Bug: 845966, 844016, 749312
Change-Id: I537862ea02c4ed67887db32993f40e53f614b3cd
Reviewed-on: https://chromium-review.googlesource.com/1019967
Reviewed-by: Wez <[email protected]>
Reviewed-by: Robert Liao <[email protected]>
Reviewed-by: Trent Apted <[email protected]>
Reviewed-by: Gabriel Charette <[email protected]>
Reviewed-by: Avi Drissman <[email protected]>
Commit-Queue: Wez <[email protected]>
Cr-Commit-Position: refs/heads/master@{#562046}
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index a5237f6..db3d8c1 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -310,6 +310,23 @@
webrtc_event_log_manager_ = WebRtcEventLogManager::CreateSingletonInstance();
}
+#if !defined(OS_ANDROID)
+void BrowserProcessImpl::SetQuitClosure(base::OnceClosure quit_closure) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ DCHECK(!quit_closure_);
+ quit_closure_ = std::move(quit_closure);
+}
+#endif
+
+#if defined(OS_MACOSX)
+base::OnceClosure BrowserProcessImpl::SwapQuitClosure(
+ base::OnceClosure quit_closure) {
+ DCHECK(quit_closure);
+ std::swap(quit_closure, quit_closure_);
+ return quit_closure;
+}
+#endif
+
BrowserProcessImpl::~BrowserProcessImpl() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
#if BUILDFLAG(ENABLE_EXTENSIONS)
@@ -1369,6 +1386,7 @@
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
release_last_reference_callstack_ = base::debug::StackTrace();
+ DCHECK(!shutting_down_);
shutting_down_ = true;
#if BUILDFLAG(ENABLE_PRINTING)
// Wait for the pending print jobs to finish. Don't do this later, since
@@ -1391,9 +1409,10 @@
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(ChromeBrowserMainPartsMac::DidEndMainMessageLoop));
#endif
- base::RunLoop::QuitCurrentWhenIdleDeprecated();
#if !defined(OS_ANDROID)
+ std::move(quit_closure_).Run();
+
chrome::ShutdownIfNeeded();
#endif // !defined(OS_ANDROID)
}