mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Add notification for aborted popups (fixes #3776)
Pass a new |popup_id| parameter to OnBeforePopup and call a new OnBeforePopupAborted callback if the popup is aborted before OnAfterCreated is called for the popup browser. Add new CefBrowserHost::GetBrowserByIdentifier and GetOpenerIdentifier methods to assist with retrieval of associated browsers. In cefclient, clean up state when a popup is aborted and close any associated popup browsers when the opener browser is closed. This also works when running with `--use-default-popup`.
This commit is contained in:
@ -924,6 +924,7 @@ bool ClientHandler::OnPreKeyEvent(CefRefPtr<CefBrowser> browser,
|
||||
bool ClientHandler::OnBeforePopup(
|
||||
CefRefPtr<CefBrowser> browser,
|
||||
CefRefPtr<CefFrame> frame,
|
||||
int popup_id,
|
||||
const CefString& target_url,
|
||||
const CefString& target_frame_name,
|
||||
CefLifeSpanHandler::WindowOpenDisposition target_disposition,
|
||||
@ -944,13 +945,20 @@ bool ClientHandler::OnBeforePopup(
|
||||
|
||||
// Potentially create a new RootWindow for the popup browser that will be
|
||||
// created asynchronously.
|
||||
CreatePopupWindow(browser, /*is_devtools=*/false, popupFeatures, windowInfo,
|
||||
client, settings);
|
||||
CreatePopupWindow(browser, popup_id, /*is_devtools=*/false, popupFeatures,
|
||||
windowInfo, client, settings);
|
||||
|
||||
// Allow popup creation.
|
||||
return false;
|
||||
}
|
||||
|
||||
void ClientHandler::OnBeforePopupAborted(CefRefPtr<CefBrowser> browser,
|
||||
int popup_id) {
|
||||
CEF_REQUIRE_UI_THREAD();
|
||||
MainContext::Get()->GetRootWindowManager()->AbortOrClosePopup(
|
||||
browser->GetIdentifier(), popup_id);
|
||||
}
|
||||
|
||||
void ClientHandler::OnBeforeDevToolsPopup(
|
||||
CefRefPtr<CefBrowser> browser,
|
||||
CefWindowInfo& windowInfo,
|
||||
@ -962,8 +970,8 @@ void ClientHandler::OnBeforeDevToolsPopup(
|
||||
|
||||
// Potentially create a new RootWindow for the DevTools popup browser that
|
||||
// will be created immediately after this method returns.
|
||||
if (!CreatePopupWindow(browser, /*is_devtools=*/true, CefPopupFeatures(),
|
||||
windowInfo, client, settings)) {
|
||||
if (!CreatePopupWindow(browser, /*popup_id=*/-1, /*is_devtools=*/true,
|
||||
CefPopupFeatures(), windowInfo, client, settings)) {
|
||||
*use_default_window = true;
|
||||
}
|
||||
}
|
||||
@ -998,6 +1006,10 @@ bool ClientHandler::DoClose(CefRefPtr<CefBrowser> browser) {
|
||||
|
||||
void ClientHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
|
||||
CEF_REQUIRE_UI_THREAD();
|
||||
|
||||
// Close all popups that have this browser as the opener.
|
||||
OnBeforePopupAborted(browser, /*popup_id=*/-1);
|
||||
|
||||
BaseClientHandler::OnBeforeClose(browser);
|
||||
NotifyBrowserClosed(browser);
|
||||
}
|
||||
@ -1308,6 +1320,7 @@ void ClientHandler::ShowSSLInformation(CefRefPtr<CefBrowser> browser) {
|
||||
}
|
||||
|
||||
bool ClientHandler::CreatePopupWindow(CefRefPtr<CefBrowser> browser,
|
||||
int popup_id,
|
||||
bool is_devtools,
|
||||
const CefPopupFeatures& popupFeatures,
|
||||
CefWindowInfo& windowInfo,
|
||||
@ -1320,7 +1333,8 @@ bool ClientHandler::CreatePopupWindow(CefRefPtr<CefBrowser> browser,
|
||||
// May return nullptr if UseDefaultPopup() returns true.
|
||||
return !!MainContext::Get()->GetRootWindowManager()->CreateRootWindowAsPopup(
|
||||
use_views_, use_alloy_style_, with_controls_ && !is_devtools, is_osr_,
|
||||
is_devtools, popupFeatures, windowInfo, client, settings);
|
||||
browser->GetIdentifier(), popup_id, is_devtools, popupFeatures,
|
||||
windowInfo, client, settings);
|
||||
}
|
||||
|
||||
void ClientHandler::NotifyBrowserCreated(CefRefPtr<CefBrowser> browser) {
|
||||
|
Reference in New Issue
Block a user