|  | // Copyright 2013 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CHROME_BROWSER_LIFETIME_BROWSER_CLOSE_MANAGER_H_ | 
|  | #define CHROME_BROWSER_LIFETIME_BROWSER_CLOSE_MANAGER_H_ | 
|  |  | 
|  | #include <optional> | 
|  |  | 
|  | #include "base/functional/callback_forward.h" | 
|  | #include "base/memory/raw_ptr.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/timer/elapsed_timer.h" | 
|  |  | 
|  | class Browser; | 
|  |  | 
|  | // Manages confirming that browser windows are closeable and closing them at | 
|  | // shutdown. | 
|  | class BrowserCloseManager : public base::RefCounted<BrowserCloseManager> { | 
|  | public: | 
|  | BrowserCloseManager(); | 
|  |  | 
|  | BrowserCloseManager(const BrowserCloseManager&) = delete; | 
|  | BrowserCloseManager& operator=(const BrowserCloseManager&) = delete; | 
|  |  | 
|  | // Starts closing all browser windows. | 
|  | void StartClosingBrowsers(); | 
|  |  | 
|  | protected: | 
|  | friend class base::RefCounted<BrowserCloseManager>; | 
|  |  | 
|  | virtual ~BrowserCloseManager(); | 
|  |  | 
|  | virtual void ConfirmCloseWithPendingDownloads( | 
|  | int download_count, | 
|  | base::OnceCallback<void(bool)> callback); | 
|  |  | 
|  | private: | 
|  | // Notifies all browser windows that the close is cancelled. | 
|  | void CancelBrowserClose(); | 
|  |  | 
|  | // Checks whether all browser windows are ready to close and closes them if | 
|  | // they are. | 
|  | void TryToCloseBrowsers(); | 
|  |  | 
|  | // Called to report whether a beforeunload dialog was accepted. | 
|  | void OnBrowserReportCloseable(bool proceed); | 
|  |  | 
|  | // Closes all browser windows. | 
|  | void CloseBrowsers(); | 
|  |  | 
|  | // Checks whether there are any downloads in-progress and prompts the user to | 
|  | // cancel them. If there are no downloads or the user accepts the cancel | 
|  | // downloads dialog, CloseBrowsers is called to continue with the shutdown. | 
|  | // Otherwise, if the user declines to cancel downloads, the shutdown is | 
|  | // aborted and the downloads page is shown for each profile with in-progress | 
|  | // downloads. | 
|  | void CheckForDownloadsInProgress(); | 
|  |  | 
|  | // Called to report whether downloads may be cancelled during shutdown. | 
|  | void OnReportDownloadsCancellable(bool proceed); | 
|  |  | 
|  | // Timer for the total time spent running beforeunload handlers across all | 
|  | // browsers during a shutdown attempt. | 
|  | // This is emplaced when TryToCloseBrowsers() begins processing and is reset | 
|  | // after the metric is recorded to prevent recording more than once. | 
|  | std::optional<base::ElapsedTimer> close_timer_; | 
|  |  | 
|  | // The browser for which we are waiting for a callback to | 
|  | // OnBrowserReportCloseable. | 
|  | raw_ptr<Browser> current_browser_; | 
|  | }; | 
|  |  | 
|  | #endif  // CHROME_BROWSER_LIFETIME_BROWSER_CLOSE_MANAGER_H_ |