Skip to content

Commit

Permalink
Support close request from web
Browse files Browse the repository at this point in the history
  • Loading branch information
tishion committed Nov 6, 2023
1 parent f10e668 commit e6e2cd6
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 6 deletions.
1 change: 1 addition & 0 deletions include/CefViewBrowserClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class CefViewBrowserClient

private:
bool is_closing_;
bool close_by_native_;
bool initial_navigation_;

std::unordered_map<int, CefRefPtr<CefBrowser>> browser_map_;
Expand Down
2 changes: 2 additions & 0 deletions include/CefViewBrowserClientDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ class CefViewBrowserClientDelegateInterface

virtual bool doClose(CefRefPtr<CefBrowser> browser) = 0;

virtual bool requestClose(CefRefPtr<CefBrowser> browser) = 0;

virtual void onBeforeClose(CefRefPtr<CefBrowser> browser) = 0;
#pragma endregion

Expand Down
2 changes: 2 additions & 0 deletions src/CefView/CefBrowserApp/CefViewBrowserClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
CefViewBrowserClient::CefViewBrowserClient(CefRefPtr<CefViewBrowserApp> app,
CefViewBrowserClientDelegateInterface::RefPtr delegate)
: is_closing_(false)
, close_by_native_(false)
, initial_navigation_(true)
, app_(app)
, client_delegate_(delegate)
Expand All @@ -39,6 +40,7 @@ CefViewBrowserClient::~CefViewBrowserClient()
void
CefViewBrowserClient::CloseAllBrowsers()
{
close_by_native_ = true;
auto browsers = browser_map_;
for (auto& kv : browsers) {
kv.second->StopLoad();
Expand Down
24 changes: 18 additions & 6 deletions src/CefView/CefBrowserApp/CefViewBrowserClient_LifeSpanHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,17 +89,29 @@ CefViewBrowserClient::DoClose(CefRefPtr<CefBrowser> 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
Expand Down

0 comments on commit e6e2cd6

Please sign in to comment.