Extract BeginShutdown and unify shutdown flow

Introduce BeginShutdown() (declared in header) and move window-close shutdown logic into it. OnWindowCloseRequested and chrome close/exit handlers now call BeginShutdown; shutdown now collects closing_tab_browsers_ plus any active tab browsers into a single list before closing them. MaybeFinishShutdown was updated to consider closing_tab_browsers_ so shutdown won't finish prematurely. This centralizes shutdown behavior and ensures all relevant browser instances are closed cleanly.
This commit is contained in:
Andrew Zambazos
2026-05-20 20:19:38 +12:00
parent 302753cd3d
commit 659d1530b0
2 changed files with 19 additions and 6 deletions
+18 -6
View File
@@ -228,6 +228,10 @@ void NebulaController::OnWindowCloseRequested() {
return; return;
} }
BeginShutdown();
}
void NebulaController::BeginShutdown() {
if (closing_) { if (closing_) {
if (window_ && window_->native_handle()) { if (window_ && window_->native_handle()) {
nebula::platform::DestroyTopLevelWindow(window_->native_handle()); nebula::platform::DestroyTopLevelWindow(window_->native_handle());
@@ -242,6 +246,13 @@ void NebulaController::OnWindowCloseRequested() {
cookie_manager->FlushStore(nullptr); cookie_manager->FlushStore(nullptr);
} }
std::vector<CefRefPtr<CefBrowser>> content_browsers = closing_tab_browsers_;
for (const auto& tab : tabs_.Tabs()) {
if (tab.browser) {
content_browsers.push_back(tab.browser);
}
}
if (chrome_browser_) { if (chrome_browser_) {
chrome_browser_->GetHost()->CloseBrowser(true); chrome_browser_->GetHost()->CloseBrowser(true);
} }
@@ -251,9 +262,9 @@ void NebulaController::OnWindowCloseRequested() {
if (menu_popup_browser_) { if (menu_popup_browser_) {
menu_popup_browser_->GetHost()->CloseBrowser(true); menu_popup_browser_->GetHost()->CloseBrowser(true);
} }
for (const auto& tab : tabs_.Tabs()) { for (const auto& browser : content_browsers) {
if (tab.browser) { if (browser) {
tab.browser->GetHost()->CloseBrowser(true); browser->GetHost()->CloseBrowser(true);
} }
} }
@@ -418,10 +429,10 @@ void NebulaController::OnChromeCommand(const std::string& command, const std::st
} else if (command == "maximize" && window_) { } else if (command == "maximize" && window_) {
window_->ToggleMaximize(); window_->ToggleMaximize();
} else if (command == "close" && window_) { } else if (command == "close" && window_) {
OnWindowCloseRequested(); BeginShutdown();
} else if (command == "exit-bigpicture" && window_) { } else if (command == "exit-bigpicture" && window_) {
if (launch_options_.mode == AppMode::BigPicture) { if (launch_options_.mode == AppMode::BigPicture) {
OnWindowCloseRequested(); BeginShutdown();
return; return;
} }
ExitBigPictureMode(); ExitBigPictureMode();
@@ -1189,7 +1200,8 @@ void NebulaController::MaybeFinishShutdown() {
return; return;
} }
if (chrome_browser_ || big_picture_browser_ || menu_popup_browser_ || tabs_.HasOpenBrowsers()) { if (chrome_browser_ || big_picture_browser_ || menu_popup_browser_ ||
tabs_.HasOpenBrowsers() || !closing_tab_browsers_.empty()) {
return; return;
} }
+1
View File
@@ -77,6 +77,7 @@ private:
void InjectBigPictureCursor(CefRefPtr<CefBrowser> browser); void InjectBigPictureCursor(CefRefPtr<CefBrowser> browser);
void RemoveBigPictureCursor(CefRefPtr<CefBrowser> browser); void RemoveBigPictureCursor(CefRefPtr<CefBrowser> browser);
void PersistSession() const; void PersistSession() const;
void BeginShutdown();
void MaybeFinishShutdown(); void MaybeFinishShutdown();
bool ForgetClosingTabBrowser(CefRefPtr<CefBrowser> browser); bool ForgetClosingTabBrowser(CefRefPtr<CefBrowser> browser);