alloy: Fix FrameHandlerTest failures with BackForwardCache enabled (see issue #2421)
To test: Run `ceftests --gtest_filter=FrameHandlerTest.OrderSub* --enable-features=BackForwardCache`
This commit is contained in:
parent
7a56371b84
commit
db807e804a
|
@ -365,6 +365,10 @@ void CefBrowserContentsDelegate::DidFinishNavigation(
|
||||||
(error_code == net::OK ? navigation_handle->GetURL() : GURL());
|
(error_code == net::OK ? navigation_handle->GetURL() : GURL());
|
||||||
|
|
||||||
auto browser_info = browser_info_;
|
auto browser_info = browser_info_;
|
||||||
|
if (!browser_info->browser()) {
|
||||||
|
// Ignore notifications when the browser is closing.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// May return NULL when starting a new navigation if the previous navigation
|
// May return NULL when starting a new navigation if the previous navigation
|
||||||
// caused the renderer process to crash during load.
|
// caused the renderer process to crash during load.
|
||||||
|
|
|
@ -798,6 +798,7 @@ void CefBrowserHostBase::OnBeforeClose() {
|
||||||
handler->OnBeforeClose(this);
|
handler->OnBeforeClose(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
browser_info_->SetClosing();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserHostBase::OnBrowserDestroyed() {
|
void CefBrowserHostBase::OnBrowserDestroyed() {
|
||||||
|
|
|
@ -41,7 +41,9 @@ CefBrowserInfo::~CefBrowserInfo() {
|
||||||
|
|
||||||
CefRefPtr<CefBrowserHostBase> CefBrowserInfo::browser() const {
|
CefRefPtr<CefBrowserHostBase> CefBrowserInfo::browser() const {
|
||||||
base::AutoLock lock_scope(lock_);
|
base::AutoLock lock_scope(lock_);
|
||||||
return browser_;
|
if (!is_closing_)
|
||||||
|
return browser_;
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserInfo::SetBrowser(CefRefPtr<CefBrowserHostBase> browser) {
|
void CefBrowserInfo::SetBrowser(CefRefPtr<CefBrowserHostBase> browser) {
|
||||||
|
@ -71,6 +73,12 @@ void CefBrowserInfo::SetBrowser(CefRefPtr<CefBrowserHostBase> browser) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefBrowserInfo::SetClosing() {
|
||||||
|
base::AutoLock lock_scope(lock_);
|
||||||
|
DCHECK(!is_closing_);
|
||||||
|
is_closing_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
void CefBrowserInfo::MaybeCreateFrame(content::RenderFrameHost* host,
|
void CefBrowserInfo::MaybeCreateFrame(content::RenderFrameHost* host,
|
||||||
bool is_guest_view) {
|
bool is_guest_view) {
|
||||||
CEF_REQUIRE_UIT();
|
CEF_REQUIRE_UIT();
|
||||||
|
@ -228,7 +236,7 @@ void CefBrowserInfo::RemoveFrame(content::RenderFrameHost* host) {
|
||||||
CefRefPtr<CefFrameHostImpl> CefBrowserInfo::GetMainFrame() {
|
CefRefPtr<CefFrameHostImpl> CefBrowserInfo::GetMainFrame() {
|
||||||
NotificationStateLock lock_scope(this);
|
NotificationStateLock lock_scope(this);
|
||||||
// Early exit if called post-destruction.
|
// Early exit if called post-destruction.
|
||||||
if (!browser_)
|
if (!browser_ || is_closing_)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
CHECK(main_frame_);
|
CHECK(main_frame_);
|
||||||
|
|
|
@ -52,6 +52,13 @@ class CefBrowserInfo : public base::RefCountedThreadSafe<CefBrowserInfo> {
|
||||||
// (to set) and DestroyBrowser (to clear).
|
// (to set) and DestroyBrowser (to clear).
|
||||||
void SetBrowser(CefRefPtr<CefBrowserHostBase> browser);
|
void SetBrowser(CefRefPtr<CefBrowserHostBase> browser);
|
||||||
|
|
||||||
|
// Called after OnBeforeClose and before SetBrowser(nullptr). This will cause
|
||||||
|
// browser() and GetMainFrame() to return nullptr as expected by
|
||||||
|
// CefFrameHandler callbacks. Note that this differs from calling
|
||||||
|
// SetBrowser(nullptr) because the WebContents has not yet been destroyed and
|
||||||
|
// further frame-related callbacks are expected.
|
||||||
|
void SetClosing();
|
||||||
|
|
||||||
// Ensure that a frame record exists for |host|. Called for the main frame
|
// Ensure that a frame record exists for |host|. Called for the main frame
|
||||||
// when the RenderView is created, or for a sub-frame when the associated
|
// when the RenderView is created, or for a sub-frame when the associated
|
||||||
// RenderFrame is created in the renderer process.
|
// RenderFrame is created in the renderer process.
|
||||||
|
@ -239,6 +246,9 @@ class CefBrowserInfo : public base::RefCountedThreadSafe<CefBrowserInfo> {
|
||||||
// The current main frame.
|
// The current main frame.
|
||||||
CefRefPtr<CefFrameHostImpl> main_frame_;
|
CefRefPtr<CefFrameHostImpl> main_frame_;
|
||||||
|
|
||||||
|
// True if the browser is currently closing.
|
||||||
|
bool is_closing_ = false;
|
||||||
|
|
||||||
// Only accessed on the UI thread.
|
// Only accessed on the UI thread.
|
||||||
std::vector<CefDraggableRegion> draggable_regions_;
|
std::vector<CefDraggableRegion> draggable_regions_;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue