From e6e2cd60b3cb4e37f62eef2fd90ea5c54ca65b0f Mon Sep 17 00:00:00 2001 From: Sheen Tian Date: Thu, 28 Sep 2023 23:40:36 +0800 Subject: [PATCH] Support close request from web --- include/CefViewBrowserClient.h | 1 + include/CefViewBrowserClientDelegate.h | 2 ++ .../CefBrowserApp/CefViewBrowserClient.cpp | 2 ++ .../CefViewBrowserClient_LifeSpanHandler.cpp | 24 ++++++++++++++----- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/include/CefViewBrowserClient.h b/include/CefViewBrowserClient.h index 9f9a62c..0cf8e99 100644 --- a/include/CefViewBrowserClient.h +++ b/include/CefViewBrowserClient.h @@ -49,6 +49,7 @@ class CefViewBrowserClient private: bool is_closing_; + bool close_by_native_; bool initial_navigation_; std::unordered_map> browser_map_; diff --git a/include/CefViewBrowserClientDelegate.h b/include/CefViewBrowserClientDelegate.h index 6cee693..5fdfbb9 100644 --- a/include/CefViewBrowserClientDelegate.h +++ b/include/CefViewBrowserClientDelegate.h @@ -141,6 +141,8 @@ class CefViewBrowserClientDelegateInterface virtual bool doClose(CefRefPtr browser) = 0; + virtual bool requestClose(CefRefPtr browser) = 0; + virtual void onBeforeClose(CefRefPtr browser) = 0; #pragma endregion diff --git a/src/CefView/CefBrowserApp/CefViewBrowserClient.cpp b/src/CefView/CefBrowserApp/CefViewBrowserClient.cpp index 8de2ffd..d593713 100644 --- a/src/CefView/CefBrowserApp/CefViewBrowserClient.cpp +++ b/src/CefView/CefBrowserApp/CefViewBrowserClient.cpp @@ -16,6 +16,7 @@ CefViewBrowserClient::CefViewBrowserClient(CefRefPtr app, CefViewBrowserClientDelegateInterface::RefPtr delegate) : is_closing_(false) + , close_by_native_(false) , initial_navigation_(true) , app_(app) , client_delegate_(delegate) @@ -39,6 +40,7 @@ CefViewBrowserClient::~CefViewBrowserClient() void CefViewBrowserClient::CloseAllBrowsers() { + close_by_native_ = true; auto browsers = browser_map_; for (auto& kv : browsers) { kv.second->StopLoad(); diff --git a/src/CefView/CefBrowserApp/CefViewBrowserClient_LifeSpanHandler.cpp b/src/CefView/CefBrowserApp/CefViewBrowserClient_LifeSpanHandler.cpp index 87bd734..177f26d 100644 --- a/src/CefView/CefBrowserApp/CefViewBrowserClient_LifeSpanHandler.cpp +++ b/src/CefView/CefBrowserApp/CefViewBrowserClient_LifeSpanHandler.cpp @@ -89,17 +89,29 @@ CefViewBrowserClient::DoClose(CefRefPtr browser) { CEF_REQUIRE_UI_THREAD(); - if (!browser->IsPopup()) { - is_closing_ = true; + bool ignoreClose = false; + + if (browser->IsPopup()) { + return ignoreClose; } auto delegate = client_delegate_.lock(); if (delegate) - return delegate->doClose(browser); + { + if (close_by_native_) { + // close by native + ignoreClose = delegate->doClose(browser); + } else { + // close request from web + ignoreClose = delegate->requestClose(browser); + } + } + + if (!ignoreClose) { + is_closing_ = true; + } - // Allow the close. For windowed browsers this will result in the OS close - // event being sent. - return false; + return ignoreClose; } void