From 32fe7f1032b8a67e2326413128aa711bb644f820 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 31 Mar 2023 21:41:15 +0100 Subject: [PATCH] browser/window_delegate: correctly handle closing --- src/browser/window_delegate.cxx | 26 ++++++++++++++++++++------ src/browser/window_delegate.hxx | 3 +++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/browser/window_delegate.cxx b/src/browser/window_delegate.cxx index 46d6089..4f8b39a 100644 --- a/src/browser/window_delegate.cxx +++ b/src/browser/window_delegate.cxx @@ -6,13 +6,19 @@ Browser::WindowDelegate::WindowDelegate( CefRefPtr browser_view, CefRefPtr browser_view_delegate, Details details -): details(details), window(nullptr), browser_view(browser_view), browser_view_delegate(browser_view_delegate) { } +): details(details), window(nullptr), browser_view(browser_view), browser_view_delegate(browser_view_delegate), closing(false) { } void Browser::WindowDelegate::Close() { - if (this->window) { - this->window->Close(); - this->window = nullptr; - } + this->closing = true; + this->window->Close(); +} + +int Browser::WindowDelegate::GetBrowserIdentifier() { + return this->browser_view->GetBrowser()->GetIdentifier(); +} + +void Browser::WindowDelegate::SendProcessMessage(CefProcessId target_process, CefRefPtr message) { + this->browser_view->GetBrowser()->GetMainFrame()->SendProcessMessage(target_process, message); } void Browser::WindowDelegate::OnWindowCreated(CefRefPtr window) { @@ -57,7 +63,15 @@ bool Browser::WindowDelegate::CanMinimize(CefRefPtr) { } bool Browser::WindowDelegate::CanClose(CefRefPtr) { - return true; + if (this->closing) { + return true; + } else { + // CEF will call CefLifeSpanHandler::DoClose (implemented in Client), giving us a chance to + // do cleanup, then set this->closing to true, then call Close() again. + // This strategy is suggested by official examples eg cefsimple + // https://github.com/chromiumembedded/cef/blob/5563/tests/cefsimple/simple_app.cc#L38-L45 + return this->browser_view->GetBrowser()->GetHost()->TryCloseBrowser(); + } } CefSize Browser::WindowDelegate::GetPreferredSize(CefRefPtr) { diff --git a/src/browser/window_delegate.hxx b/src/browser/window_delegate.hxx index e0bff99..080f7a8 100644 --- a/src/browser/window_delegate.hxx +++ b/src/browser/window_delegate.hxx @@ -27,11 +27,14 @@ namespace Browser { CefSize GetMaximumSize(CefRefPtr) override; void Close(); + int GetBrowserIdentifier(); + void SendProcessMessage(CefProcessId, CefRefPtr); private: CefRefPtr window; CefRefPtr browser_view; CefRefPtr browser_view_delegate; + bool closing; IMPLEMENT_REFCOUNTING(WindowDelegate); DISALLOW_COPY_AND_ASSIGN(WindowDelegate);