From 5065aba1b4d1b6758b0924494f7a5622c8394314 Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Wed, 24 Apr 2024 17:23:47 -0400 Subject: [PATCH] Remove explicit tracking of guest view frames This is no longer required now that we have implicit exclusion of certain frame types including guest view frames. Rename GuestView to ExcludedView in the renderer process. --- .../browser/alloy/alloy_browser_host_impl.cc | 6 +- libcef/browser/browser_contents_delegate.cc | 5 +- libcef/browser/browser_context.cc | 6 +- libcef/browser/browser_context.h | 6 +- libcef/browser/browser_frame.cc | 10 +- libcef/browser/browser_frame.h | 2 +- libcef/browser/browser_host_base.cc | 22 ++-- libcef/browser/browser_host_base.h | 8 +- libcef/browser/browser_info.cc | 65 ++++-------- libcef/browser/browser_info.h | 25 ++--- libcef/browser/browser_info_manager.cc | 100 ++++++------------ libcef/browser/browser_info_manager.h | 31 +++--- .../chrome/chrome_context_menu_handler.cc | 2 +- ...me_mime_handler_view_guest_delegate_cef.cc | 29 +---- ...ome_mime_handler_view_guest_delegate_cef.h | 6 +- libcef/browser/extensions/extension_system.cc | 4 +- .../mime_handler_view_guest_delegate.cc | 31 +----- .../mime_handler_view_guest_delegate.h | 6 +- libcef/browser/javascript_dialog_manager.cc | 6 +- .../resource_request_handler_wrapper.cc | 4 +- libcef/browser/request_context_impl.cc | 12 +-- libcef/browser/request_context_impl.h | 16 ++- libcef/common/mojom/cef.mojom | 2 +- libcef/renderer/render_manager.cc | 59 ++++++----- libcef/renderer/render_manager.h | 21 ++-- patch/patch.cfg | 3 +- .../mime_handler_view_guest_1565_2727.patch | 53 +--------- 27 files changed, 166 insertions(+), 374 deletions(-) diff --git a/libcef/browser/alloy/alloy_browser_host_impl.cc b/libcef/browser/alloy/alloy_browser_host_impl.cc index ec4635032..c7a864ce5 100644 --- a/libcef/browser/alloy/alloy_browser_host_impl.cc +++ b/libcef/browser/alloy/alloy_browser_host_impl.cc @@ -16,6 +16,7 @@ #include "libcef/browser/browser_info_manager.h" #include "libcef/browser/browser_platform_delegate.h" #include "libcef/browser/context.h" +#include "libcef/browser/extensions/browser_extensions_util.h" #include "libcef/browser/hang_monitor.h" #include "libcef/browser/media_access_query.h" #include "libcef/browser/osr/osr_util.h" @@ -604,9 +605,8 @@ void AlloyBrowserHostImpl::CancelContextMenu() { bool AlloyBrowserHostImpl::MaybeAllowNavigation( content::RenderFrameHost* opener, const content::OpenURLParams& params) { - bool is_guest_view = false; - GetFrameForHost(opener, &is_guest_view); - + const bool is_guest_view = extensions::IsBrowserPluginGuest( + content::WebContents::FromRenderFrameHost(opener)); if (is_guest_view && !params.is_pdf && !params.url.SchemeIs(extensions::kExtensionScheme) && !params.url.SchemeIs(content::kChromeUIScheme)) { diff --git a/libcef/browser/browser_contents_delegate.cc b/libcef/browser/browser_contents_delegate.cc index c95016d33..a895225c3 100644 --- a/libcef/browser/browser_contents_delegate.cc +++ b/libcef/browser/browser_contents_delegate.cc @@ -94,8 +94,7 @@ void CefBrowserContentsDelegate::ObserveWebContents( // Make sure MaybeCreateFrame is called at least one time. // Create the frame representation before OnAfterCreated is called for a new // browser. - browser_info_->MaybeCreateFrame(new_contents->GetPrimaryMainFrame(), - false /* is_guest_view */); + browser_info_->MaybeCreateFrame(new_contents->GetPrimaryMainFrame()); // Make sure RenderWidgetCreated is called at least one time. This Observer // is registered too late to catch the initial creation. @@ -319,7 +318,7 @@ void CefBrowserContentsDelegate::DraggableRegionsChanged( void CefBrowserContentsDelegate::RenderFrameCreated( content::RenderFrameHost* render_frame_host) { - browser_info_->MaybeCreateFrame(render_frame_host, false /* is_guest_view */); + browser_info_->MaybeCreateFrame(render_frame_host); if (render_frame_host->GetParent() == nullptr) { auto render_view_host = render_frame_host->GetRenderViewHost(); auto base_background_color = platform_delegate()->GetBackgroundColor(); diff --git a/libcef/browser/browser_context.cc b/libcef/browser/browser_context.cc index 877bb239e..29ea61c8e 100644 --- a/libcef/browser/browser_context.cc +++ b/libcef/browser/browser_context.cc @@ -283,8 +283,7 @@ std::vector CefBrowserContext::GetAll() { void CefBrowserContext::OnRenderFrameCreated( CefRequestContextImpl* request_context, const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view) { + bool is_main_frame) { CEF_REQUIRE_UIT(); DCHECK(frame_util::IsValidGlobalId(global_id)); @@ -302,8 +301,7 @@ void CefBrowserContext::OnRenderFrameCreated( void CefBrowserContext::OnRenderFrameDeleted( CefRequestContextImpl* request_context, const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view) { + bool is_main_frame) { CEF_REQUIRE_UIT(); DCHECK(frame_util::IsValidGlobalId(global_id)); diff --git a/libcef/browser/browser_context.h b/libcef/browser/browser_context.h index 21d19bac1..7158c9f46 100644 --- a/libcef/browser/browser_context.h +++ b/libcef/browser/browser_context.h @@ -132,14 +132,12 @@ class CefBrowserContext { // Called from CefRequestContextImpl::OnRenderFrameCreated. void OnRenderFrameCreated(CefRequestContextImpl* request_context, const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view); + bool is_main_frame); // Called from CefRequestContextImpl::OnRenderFrameDeleted. void OnRenderFrameDeleted(CefRequestContextImpl* request_context, const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view); + bool is_main_frame); // Returns the handler that matches the specified IDs. Pass -1 for unknown // values. If |require_frame_match| is true only exact matches will be diff --git a/libcef/browser/browser_frame.cc b/libcef/browser/browser_frame.cc index 8106eaa01..caf739a1b 100644 --- a/libcef/browser/browser_frame.cc +++ b/libcef/browser/browser_frame.cc @@ -59,10 +59,10 @@ void CefBrowserFrame::FrameAttached( bool reattached) { // Always send to the newly created RFH, which may be speculative when // navigating cross-origin. - bool excluded_type; - if (auto host = GetFrameHost(/*prefer_speculative=*/true, &excluded_type)) { + bool is_excluded; + if (auto host = GetFrameHost(/*prefer_speculative=*/true, &is_excluded)) { host->FrameAttached(std::move(render_frame), reattached); - } else if (excluded_type) { + } else if (is_excluded) { VLOG(1) << "frame " << frame_util::GetFrameDebugString( render_frame_host()->GetGlobalFrameToken()) @@ -82,8 +82,8 @@ void CefBrowserFrame::UpdateDraggableRegions( CefRefPtr CefBrowserFrame::GetFrameHost( bool prefer_speculative, - bool* excluded_type) const { + bool* is_excluded) const { return CefBrowserInfoManager::GetFrameHost( render_frame_host(), prefer_speculative, - /*browser_info=*/nullptr, excluded_type); + /*browser_info=*/nullptr, is_excluded); } diff --git a/libcef/browser/browser_frame.h b/libcef/browser/browser_frame.h index be5df7734..0ac6826a9 100644 --- a/libcef/browser/browser_frame.h +++ b/libcef/browser/browser_frame.h @@ -49,7 +49,7 @@ class CefBrowserFrame bool ShouldCloseOnFinishNavigation() const override { return false; } CefRefPtr GetFrameHost(bool prefer_speculative, - bool* excluded_type = nullptr) const; + bool* is_excluded = nullptr) const; }; #endif // CEF_LIBCEF_BROWSER_BROWSER_FRAME_H_ diff --git a/libcef/browser/browser_host_base.cc b/libcef/browser/browser_host_base.cc index 1e9a522dc..d3fa4f83f 100644 --- a/libcef/browser/browser_host_base.cc +++ b/libcef/browser/browser_host_base.cc @@ -126,9 +126,9 @@ CefRefPtr CefBrowserHostBase::GetBrowserForContents( return browser; } - // Try the owner WebContents if |contents| originates from a guest view such - // as the PDF viewer or Print Preview. - // This is safe to call even if Alloy extensions are disabled. + // Try the owner WebContents if |contents| originates from an excluded view + // such as the PDF viewer or Print Preview. This is safe to call even if Alloy + // extensions are disabled. if (auto* owner_contents = extensions::GetOwnerForGuestContents(contents)) { return WebContentsUserDataAdapter::Get(owner_contents); } @@ -153,8 +153,7 @@ CefRefPtr CefBrowserHostBase::GetBrowserForGlobalId( return GetBrowserForHost(render_frame_host); } else { // Use the thread-safe approach. - auto info = CefBrowserInfoManager::GetInstance()->GetBrowserInfo(global_id, - nullptr); + auto info = CefBrowserInfoManager::GetInstance()->GetBrowserInfo(global_id); if (info) { auto browser = info->browser(); if (!browser) { @@ -185,8 +184,8 @@ CefRefPtr CefBrowserHostBase::GetBrowserForGlobalToken( return GetBrowserForHost(render_frame_host); } else { // Use the thread-safe approach. - auto info = CefBrowserInfoManager::GetInstance()->GetBrowserInfo( - global_token, nullptr); + auto info = + CefBrowserInfoManager::GetInstance()->GetBrowserInfo(global_token); if (info) { auto browser = info->browser(); if (!browser) { @@ -1121,24 +1120,23 @@ void CefBrowserHostBase::OnWebContentsDestroyed( content::WebContents* web_contents) {} CefRefPtr CefBrowserHostBase::GetFrameForHost( - const content::RenderFrameHost* host, - bool* is_guest_view) { + const content::RenderFrameHost* host) { CEF_REQUIRE_UIT(); if (!host) { return nullptr; } - return browser_info_->GetFrameForHost(host, is_guest_view); + return browser_info_->GetFrameForHost(host); } CefRefPtr CefBrowserHostBase::GetFrameForGlobalId( const content::GlobalRenderFrameHostId& global_id) { - return browser_info_->GetFrameForGlobalId(global_id, nullptr); + return browser_info_->GetFrameForGlobalId(global_id); } CefRefPtr CefBrowserHostBase::GetFrameForGlobalToken( const content::GlobalRenderFrameHostToken& global_token) { - return browser_info_->GetFrameForGlobalToken(global_token, nullptr); + return browser_info_->GetFrameForGlobalToken(global_token); } void CefBrowserHostBase::AddObserver(Observer* observer) { diff --git a/libcef/browser/browser_host_base.h b/libcef/browser/browser_host_base.h index 4e81698ea..39ef0cf29 100644 --- a/libcef/browser/browser_host_base.h +++ b/libcef/browser/browser_host_base.h @@ -286,12 +286,8 @@ class CefBrowserHostBase : public CefBrowserHost, void OnWebContentsDestroyed(content::WebContents* web_contents) override; // Returns the frame object matching the specified |host| or nullptr if no - // match is found. Nullptr will also be returned if a guest view match is - // found because we don't create frame objects for guest views. If - // |is_guest_view| is non-nullptr it will be set to true in this case. Must be - // called on the UI thread. - CefRefPtr GetFrameForHost(const content::RenderFrameHost* host, - bool* is_guest_view = nullptr); + // match is found. Must be called on the UI thread. + CefRefPtr GetFrameForHost(const content::RenderFrameHost* host); // Returns the frame associated with the specified global ID/token. See // documentation on RenderFrameHost::GetFrameTreeNodeId/Token() for why the diff --git a/libcef/browser/browser_info.cc b/libcef/browser/browser_info.cc index 7c0de9e80..ea2ca4f8e 100644 --- a/libcef/browser/browser_info.cc +++ b/libcef/browser/browser_info.cc @@ -95,8 +95,7 @@ void CefBrowserInfo::SetClosing() { is_closing_ = true; } -void CefBrowserInfo::MaybeCreateFrame(content::RenderFrameHost* host, - bool is_guest_view) { +void CefBrowserInfo::MaybeCreateFrame(content::RenderFrameHost* host) { CEF_REQUIRE_UIT(); if (CefBrowserInfoManager::IsExcludedFrameHost(host)) { @@ -129,11 +128,10 @@ void CefBrowserInfo::MaybeCreateFrame(content::RenderFrameHost* host, #if DCHECK_IS_ON() // Check that the frame info hasn't changed unexpectedly. DCHECK_EQ(info->global_id_, global_id); - DCHECK_EQ(info->is_guest_view_, is_guest_view); DCHECK_EQ(info->is_main_frame_, is_main_frame); #endif - if (!info->is_guest_view_ && info->is_speculative_ && !is_speculative) { + if (info->is_speculative_ && !is_speculative) { // Upgrade the frame info from speculative to non-speculative. if (info->is_main_frame_) { // Set the main frame object. @@ -147,28 +145,23 @@ void CefBrowserInfo::MaybeCreateFrame(content::RenderFrameHost* host, auto frame_info = new FrameInfo; frame_info->host_ = host; frame_info->global_id_ = global_id; - frame_info->is_guest_view_ = is_guest_view; frame_info->is_main_frame_ = is_main_frame; frame_info->is_speculative_ = is_speculative; - // Guest views don't get their own CefBrowser or CefFrame objects. - if (!is_guest_view) { - // Create a new frame object. - frame_info->frame_ = new CefFrameHostImpl(this, host); - MaybeNotifyFrameCreated(frame_info->frame_); - if (is_main_frame && !is_speculative) { - SetMainFrame(browser_, frame_info->frame_); - } - -#if DCHECK_IS_ON() - // Check that the frame info hasn't changed unexpectedly. - DCHECK(host->GetGlobalFrameToken() == *frame_info->frame_->frame_token()); - DCHECK_EQ(frame_info->is_main_frame_, frame_info->frame_->IsMain()); -#endif + // Create a new frame object. + frame_info->frame_ = new CefFrameHostImpl(this, host); + MaybeNotifyFrameCreated(frame_info->frame_); + if (is_main_frame && !is_speculative) { + SetMainFrame(browser_, frame_info->frame_); } - browser_->request_context()->OnRenderFrameCreated(global_id, is_main_frame, - is_guest_view); +#if DCHECK_IS_ON() + // Check that the frame info hasn't changed unexpectedly. + DCHECK(host->GetGlobalFrameToken() == *frame_info->frame_->frame_token()); + DCHECK_EQ(frame_info->is_main_frame_, frame_info->frame_->IsMain()); +#endif + + browser_->request_context()->OnRenderFrameCreated(global_id, is_main_frame); // Populate the lookup maps. frame_id_map_.insert(std::make_pair(global_id, frame_info)); @@ -238,8 +231,8 @@ void CefBrowserInfo::RemoveFrame(content::RenderFrameHost* host) { auto frame_info = it->second; - browser_->request_context()->OnRenderFrameDeleted( - global_id, frame_info->is_main_frame_, frame_info->is_guest_view_); + browser_->request_context()->OnRenderFrameDeleted(global_id, + frame_info->is_main_frame_); // Remove from the lookup maps. frame_id_map_.erase(it); @@ -290,29 +283,19 @@ CefRefPtr CefBrowserInfo::CreateTempSubFrame( CefRefPtr CefBrowserInfo::GetFrameForHost( const content::RenderFrameHost* host, - bool* is_guest_view, bool prefer_speculative) const { - if (is_guest_view) { - *is_guest_view = false; - } - if (!host) { return nullptr; } return GetFrameForGlobalId( - const_cast(host)->GetGlobalId(), is_guest_view, + const_cast(host)->GetGlobalId(), prefer_speculative); } CefRefPtr CefBrowserInfo::GetFrameForGlobalId( const content::GlobalRenderFrameHostId& global_id, - bool* is_guest_view, bool prefer_speculative) const { - if (is_guest_view) { - *is_guest_view = false; - } - if (!frame_util::IsValidGlobalId(global_id)) { return nullptr; } @@ -323,13 +306,6 @@ CefRefPtr CefBrowserInfo::GetFrameForGlobalId( if (it != frame_id_map_.end()) { const auto info = it->second; - if (info->is_guest_view_) { - if (is_guest_view) { - *is_guest_view = true; - } - return nullptr; - } - if (info->is_speculative_ && !prefer_speculative) { if (info->is_main_frame_ && main_frame_) { // Always prefer the non-speculative main frame. @@ -349,12 +325,7 @@ CefRefPtr CefBrowserInfo::GetFrameForGlobalId( CefRefPtr CefBrowserInfo::GetFrameForGlobalToken( const content::GlobalRenderFrameHostToken& global_token, - bool* is_guest_view, bool prefer_speculative) const { - if (is_guest_view) { - *is_guest_view = false; - } - if (!frame_util::IsValidGlobalToken(global_token)) { return nullptr; } @@ -370,7 +341,7 @@ CefRefPtr CefBrowserInfo::GetFrameForGlobalToken( global_id = it->second; } - return GetFrameForGlobalId(global_id, is_guest_view, prefer_speculative); + return GetFrameForGlobalId(global_id, prefer_speculative); } CefBrowserInfo::FrameHostList CefBrowserInfo::GetAllFrames() const { diff --git a/libcef/browser/browser_info.h b/libcef/browser/browser_info.h index b980fdae3..0383812f1 100644 --- a/libcef/browser/browser_info.h +++ b/libcef/browser/browser_info.h @@ -67,10 +67,8 @@ class CefBrowserInfo : public base::RefCountedThreadSafe { // 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 // RenderFrame is created in the renderer process. - // Called from CefBrowserContentsDelegate::RenderFrameCreated (is_guest_view = - // false) or CefMimeHandlerViewGuestDelegate::OnGuestAttached (is_guest_view = - // true). - void MaybeCreateFrame(content::RenderFrameHost* host, bool is_guest_view); + // Called from CefBrowserContentsDelegate::RenderFrameCreated. + void MaybeCreateFrame(content::RenderFrameHost* host); // Used to track state changes such as entering/exiting the BackForwardCache. // Called from CefBrowserContentsDelegate::RenderFrameHostStateChanged. @@ -102,32 +100,22 @@ class CefBrowserInfo : public base::RefCountedThreadSafe { const content::GlobalRenderFrameHostId& parent_global_id); // Returns the frame object matching the specified host or nullptr if no match - // is found. Nullptr will also be returned if a guest view match is found - // because we don't create frame objects for guest views. If |is_guest_view| - // is non-nullptr it will be set to true in this case. Must be called on the - // UI thread. + // is found. Must be called on the UI thread. CefRefPtr GetFrameForHost( const content::RenderFrameHost* host, - bool* is_guest_view = nullptr, bool prefer_speculative = false) const; // Returns the frame object matching the specified ID/token or nullptr if no - // match is found. Nullptr will also be returned if a guest view match is - // found because we don't create frame objects for guest views. If - // |is_guest_view| is non-nullptr it will be set to true in this case. Safe to - // call from any thread. + // match is found. Safe to call from any thread. CefRefPtr GetFrameForGlobalId( const content::GlobalRenderFrameHostId& global_id, - bool* is_guest_view = nullptr, bool prefer_speculative = false) const; CefRefPtr GetFrameForGlobalToken( const content::GlobalRenderFrameHostToken& global_token, - bool* is_guest_view = nullptr, bool prefer_speculative = false) const; - // Returns all non-speculative frame objects that currently exist. Guest views - // will be excluded because they don't have a frame object. Safe to call from - // any thread. + // Returns all non-speculative frame objects that currently exist. Safe to + // call from any thread. using FrameHostList = std::set>; FrameHostList GetAllFrames() const; @@ -184,7 +172,6 @@ class CefBrowserInfo : public base::RefCountedThreadSafe { content::RenderFrameHost* host_; content::GlobalRenderFrameHostId global_id_; - bool is_guest_view_; bool is_main_frame_; bool is_speculative_; bool is_in_bfcache_ = false; diff --git a/libcef/browser/browser_info_manager.cc b/libcef/browser/browser_info_manager.cc index b5b225217..20f169523 100644 --- a/libcef/browser/browser_info_manager.cc +++ b/libcef/browser/browser_info_manager.cc @@ -97,7 +97,7 @@ scoped_refptr CefBrowserInfoManager::CreatePopupBrowserInfo( // Continue any pending NewBrowserInfo request. ContinueNewBrowserInfo(frame_host->GetGlobalFrameToken(), browser_info, - /*is_guest_view=*/false); + /*is_excluded=*/false); return browser_info; } @@ -307,15 +307,13 @@ void CefBrowserInfoManager::OnGetNewBrowserInfo( base::AutoLock lock_scope(browser_info_lock_); - bool is_guest_view = false; - scoped_refptr browser_info = - GetBrowserInfoInternal(global_token, &is_guest_view); + GetBrowserInfoInternal(global_token); if (browser_info) { // Send the response immediately. - SendNewBrowserInfoResponse(browser_info, is_guest_view, std::move(callback), - callback_runner); + SendNewBrowserInfoResponse(browser_info, /*is_excluded=*/false, + std::move(callback), callback_runner); return; } @@ -347,7 +345,7 @@ void CefBrowserInfoManager::OnGetNewBrowserInfo( kNewBrowserInfoResponseTimeoutMs); } - // Check for PDF viewer or print preview frames. + // Check for excluded content (PDF viewer or print preview). CEF_POST_TASK( CEF_UIT, base::BindOnce( @@ -369,29 +367,27 @@ void CefBrowserInfoManager::CheckExcludedNewBrowserInfoOnUIThread( return; } - // PDF viewer and print preview create multiple renderer processes. Not all - // of those processes are currently tracked by CefBrowserInfo, so we also - // treat frames from untracked processes (like the print preview dialog) as - // guest views in the renderer process. + // PDF viewer and print preview create multiple renderer processes. These + // excluded processes are not tracked by CefBrowserInfo. CefBrowserInfo* browser_info; - bool excluded_type; - GetFrameHost(rfh, /*prefer_speculative=*/true, &browser_info, &excluded_type); - if (browser_info && excluded_type) { + bool is_excluded; + GetFrameHost(rfh, /*prefer_speculative=*/true, &browser_info, &is_excluded); + if (browser_info && is_excluded) { g_info_manager->ContinueNewBrowserInfo(global_token, browser_info, - /*is_guest_view=*/true); + /*is_excluded=*/true); } } void CefBrowserInfoManager::ContinueNewBrowserInfo( const content::GlobalRenderFrameHostToken& global_token, scoped_refptr browser_info, - bool is_guest_view) { + bool is_excluded) { base::AutoLock lock_scope(browser_info_lock_); // Continue any pending NewBrowserInfo request. auto it = pending_new_browser_info_map_.find(global_token); if (it != pending_new_browser_info_map_.end()) { - SendNewBrowserInfoResponse(browser_info, is_guest_view, + SendNewBrowserInfoResponse(browser_info, is_excluded, std::move(it->second->callback), it->second->callback_runner); pending_new_browser_info_map_.erase(it); @@ -444,17 +440,15 @@ void CefBrowserInfoManager::DestroyAllBrowsers() { } scoped_refptr CefBrowserInfoManager::GetBrowserInfo( - const content::GlobalRenderFrameHostId& global_id, - bool* is_guest_view) { + const content::GlobalRenderFrameHostId& global_id) { base::AutoLock lock_scope(browser_info_lock_); - return GetBrowserInfoInternal(global_id, is_guest_view); + return GetBrowserInfoInternal(global_id); } scoped_refptr CefBrowserInfoManager::GetBrowserInfo( - const content::GlobalRenderFrameHostToken& global_token, - bool* is_guest_view) { + const content::GlobalRenderFrameHostToken& global_token) { base::AutoLock lock_scope(browser_info_lock_); - return GetBrowserInfoInternal(global_token, is_guest_view); + return GetBrowserInfoInternal(global_token); } bool CefBrowserInfoManager::MaybeAllowNavigation( @@ -496,7 +490,7 @@ CefRefPtr CefBrowserInfoManager::GetFrameHost( content::RenderFrameHost* rfh, bool prefer_speculative, CefBrowserInfo** browser_info, - bool* excluded_type) { + bool* is_excluded) { CEF_REQUIRE_UIT(); DCHECK(rfh); @@ -510,28 +504,22 @@ CefRefPtr CefBrowserInfoManager::GetFrameHost( bool excluded = is_pdf_process || is_browser_process_guest || is_print_preview_dialog; - bool guest_view = false; CefRefPtr frame; // A BrowserHost may match an excluded RFH type. Some associations are // registered directly via CefBrowserInfo::MaybeCreateFrame and some are // discovered indirectly via extensions::GetOwnerForGuestContents. auto browser = CefBrowserHostBase::GetBrowserForHost(rfh); - if (browser) { - frame = browser->browser_info()->GetFrameForHost(rfh, &guest_view, - prefer_speculative); - excluded |= guest_view; - - // A FrameHost should never exist for an excluded type. - DCHECK(!frame || !excluded); + if (browser && !excluded) { + frame = browser->browser_info()->GetFrameForHost(rfh, prefer_speculative); } if (browser_info) { *browser_info = browser ? browser->browser_info().get() : nullptr; } - if (excluded_type) { - *excluded_type = excluded; + if (is_excluded) { + *is_excluded = excluded; } if (VLOG_IS_ON(1)) { @@ -539,9 +527,7 @@ CefRefPtr CefBrowserInfoManager::GetFrameHost( frame_util::GetFrameDebugString(rfh->GetGlobalFrameToken()); const bool is_main = rfh->GetParent() == nullptr; - VLOG(1) << "frame " << debug_string - << " registered_guest_view=" << guest_view - << ", pdf_process=" << is_pdf_process + VLOG(1) << "frame " << debug_string << ", pdf_process=" << is_pdf_process << ", browser_process_guest=" << is_browser_process_guest << ", print_preview_dialog=" << is_print_preview_dialog << ", main=" << is_main << (browser ? "" : ", has no BrowserHost") @@ -686,26 +672,16 @@ CefBrowserInfoManager::PopPendingPopup(PendingPopup::Step previous_step_alloy, } scoped_refptr CefBrowserInfoManager::GetBrowserInfoInternal( - const content::GlobalRenderFrameHostId& global_id, - bool* is_guest_view) { + const content::GlobalRenderFrameHostId& global_id) { browser_info_lock_.AssertAcquired(); - if (is_guest_view) { - *is_guest_view = false; - } - if (!frame_util::IsValidGlobalId(global_id)) { return nullptr; } for (const auto& browser_info : browser_info_list_) { - bool is_guest_view_tmp; - auto frame = - browser_info->GetFrameForGlobalId(global_id, &is_guest_view_tmp); - if (frame || is_guest_view_tmp) { - if (is_guest_view) { - *is_guest_view = is_guest_view_tmp; - } + auto frame = browser_info->GetFrameForGlobalId(global_id); + if (frame) { return browser_info; } } @@ -714,26 +690,16 @@ scoped_refptr CefBrowserInfoManager::GetBrowserInfoInternal( } scoped_refptr CefBrowserInfoManager::GetBrowserInfoInternal( - const content::GlobalRenderFrameHostToken& global_token, - bool* is_guest_view) { + const content::GlobalRenderFrameHostToken& global_token) { browser_info_lock_.AssertAcquired(); - if (is_guest_view) { - *is_guest_view = false; - } - if (!frame_util::IsValidGlobalToken(global_token)) { return nullptr; } for (const auto& browser_info : browser_info_list_) { - bool is_guest_view_tmp; - auto frame = - browser_info->GetFrameForGlobalToken(global_token, &is_guest_view_tmp); - if (frame || is_guest_view_tmp) { - if (is_guest_view) { - *is_guest_view = is_guest_view_tmp; - } + auto frame = browser_info->GetFrameForGlobalToken(global_token); + if (frame) { return browser_info; } } @@ -744,20 +710,20 @@ scoped_refptr CefBrowserInfoManager::GetBrowserInfoInternal( // static void CefBrowserInfoManager::SendNewBrowserInfoResponse( scoped_refptr browser_info, - bool is_guest_view, + bool is_excluded, cef::mojom::BrowserManager::GetNewBrowserInfoCallback callback, scoped_refptr callback_runner) { if (!callback_runner->RunsTasksInCurrentSequence()) { callback_runner->PostTask( FROM_HERE, base::BindOnce(&CefBrowserInfoManager::SendNewBrowserInfoResponse, - browser_info, is_guest_view, std::move(callback), + browser_info, is_excluded, std::move(callback), callback_runner)); return; } auto params = cef::mojom::NewBrowserInfo::New(); - params->is_guest_view = is_guest_view; + params->is_excluded = is_excluded; if (browser_info) { params->browser_id = browser_info->browser_id(); @@ -783,7 +749,7 @@ void CefBrowserInfoManager::SendNewBrowserInfoResponse( // static void CefBrowserInfoManager::CancelNewBrowserInfoResponse( PendingNewBrowserInfo* pending_info) { - SendNewBrowserInfoResponse(/*browser_info=*/nullptr, /*is_guest_view=*/false, + SendNewBrowserInfoResponse(/*browser_info=*/nullptr, /*is_excluded=*/false, std::move(pending_info->callback), pending_info->callback_runner); } diff --git a/libcef/browser/browser_info_manager.h b/libcef/browser/browser_info_manager.h index 2e5fe85c0..9b4d4a8c9 100644 --- a/libcef/browser/browser_info_manager.h +++ b/libcef/browser/browser_info_manager.h @@ -110,9 +110,9 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver { // browser info to the renderer process. If the browser info already exists // the response will be sent immediately. Otherwise, the response will be sent // when CreatePopupBrowserInfo creates the browser info. The info will already - // exist for explicitly created browsers and guest views. It may sometimes - // already exist for traditional popup browsers depending on timing. See - // comments on PendingPopup for more information. + // exist for explicitly created browsers. It may sometimes already exist for + // traditional popup browsers depending on timing. See comments on + // PendingPopup for more information. void OnGetNewBrowserInfo( const content::GlobalRenderFrameHostToken& global_token, cef::mojom::BrowserManager::GetNewBrowserInfoCallback callback); @@ -127,15 +127,10 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver { // Returns the CefBrowserInfo matching the specified ID/token or nullptr if no // match is found. It is allowed to add new callers of this method but // consider using CefBrowserHostBase::GetBrowserForGlobalId/Token() instead. - // If |is_guest_view| is non-nullptr it will be set to true if the ID/token - // matches a guest view associated with the returned browser info instead of - // the browser itself. scoped_refptr GetBrowserInfo( - const content::GlobalRenderFrameHostId& global_id, - bool* is_guest_view = nullptr); + const content::GlobalRenderFrameHostId& global_id); scoped_refptr GetBrowserInfo( - const content::GlobalRenderFrameHostToken& global_token, - bool* is_guest_view = nullptr); + const content::GlobalRenderFrameHostToken& global_token); // Returns all existing CefBrowserInfo objects. using BrowserInfoList = std::list>; @@ -152,13 +147,13 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver { bool use_default_browser_creation); // Returns the FrameHost associated with |rfh|, if any. |browser_info| and - // |excluded_type| will be populated if non-nullptr. An excluded type will not + // |is_excluded| will be populated if non-nullptr. An excluded type will not // have a FrameHost but |browser_info| may still be populated if the // association is known. static CefRefPtr GetFrameHost(content::RenderFrameHost* rfh, bool prefer_speculative, CefBrowserInfo** browser_info, - bool* excluded_type); + bool* is_excluded); // Returns true if |rfh| should be excluded (no FrameHost created). static bool IsExcludedFrameHost(content::RenderFrameHost* rfh); @@ -171,7 +166,7 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver { // - CanCreateWindow (UIT): // Provides an opportunity to cancel the popup (calls OnBeforePopup) and // creates the new platform delegate for the popup. If the popup owner is - // an extension guest view then the popup is canceled and + // an extension guest view (PDF viewer) then the popup is canceled and // WebContentsDelegate::OpenURLFromTab is called via the // CefBrowserHostBase::MaybeAllowNavigation implementation. // And then the following calls may occur at the same time: @@ -237,11 +232,9 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver { // Retrieves the BrowserInfo matching the specified ID/token. scoped_refptr GetBrowserInfoInternal( - const content::GlobalRenderFrameHostId& global_id, - bool* is_guest_view); + const content::GlobalRenderFrameHostId& global_id); scoped_refptr GetBrowserInfoInternal( - const content::GlobalRenderFrameHostToken& global_token, - bool* is_guest_view); + const content::GlobalRenderFrameHostToken& global_token); // Check for excluded frames that can be responded to immediately. static void CheckExcludedNewBrowserInfoOnUIThread( @@ -250,12 +243,12 @@ class CefBrowserInfoManager : public content::RenderProcessHostObserver { void ContinueNewBrowserInfo( const content::GlobalRenderFrameHostToken& global_token, scoped_refptr browser_info, - bool is_guest_view); + bool is_excluded); // Send the response for a pending OnGetNewBrowserInfo request. static void SendNewBrowserInfoResponse( scoped_refptr browser_info, - bool is_guest_view, + bool is_excluded, cef::mojom::BrowserManager::GetNewBrowserInfoCallback callback, scoped_refptr callback_runner); diff --git a/libcef/browser/chrome/chrome_context_menu_handler.cc b/libcef/browser/chrome/chrome_context_menu_handler.cc index 9defbcadd..eacd6eae8 100644 --- a/libcef/browser/chrome/chrome_context_menu_handler.cc +++ b/libcef/browser/chrome/chrome_context_menu_handler.cc @@ -256,7 +256,7 @@ class CefContextMenuObserver : public RenderViewContextMenuObserver, // May return nullptr if the frame is destroyed while the menu is pending. auto* rfh = context_menu_->GetRenderFrameHost(); if (rfh) { - // May return nullptr for guest views. + // May return nullptr for excluded views. frame = browser_->GetFrameForHost(rfh); } if (!frame) { diff --git a/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.cc b/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.cc index 0dc43381e..ace733691 100644 --- a/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.cc +++ b/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.cc @@ -6,7 +6,6 @@ #include "libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.h" #include "libcef/browser/browser_host_base.h" -#include "libcef/browser/browser_info.h" #include "libcef/browser/chrome/chrome_context_menu_handler.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" @@ -15,37 +14,11 @@ namespace extensions { ChromeMimeHandlerViewGuestDelegateCef::ChromeMimeHandlerViewGuestDelegateCef( MimeHandlerViewGuest* guest) - : guest_(guest), owner_web_contents_(guest_->owner_web_contents()) {} + : owner_web_contents_(guest->owner_web_contents()) {} ChromeMimeHandlerViewGuestDelegateCef:: ~ChromeMimeHandlerViewGuestDelegateCef() = default; -void ChromeMimeHandlerViewGuestDelegateCef::OnGuestAttached() { - content::WebContents* web_contents = guest_->web_contents(); - DCHECK(web_contents); - - auto owner_browser = - CefBrowserHostBase::GetBrowserForContents(owner_web_contents_); - DCHECK(owner_browser); - - // Associate guest state information with the owner browser. - owner_browser->browser_info()->MaybeCreateFrame( - web_contents->GetPrimaryMainFrame(), true /* is_guest_view */); -} - -void ChromeMimeHandlerViewGuestDelegateCef::OnGuestDetached() { - content::WebContents* web_contents = guest_->web_contents(); - DCHECK(web_contents); - - auto owner_browser = - CefBrowserHostBase::GetBrowserForContents(owner_web_contents_); - DCHECK(owner_browser); - - // Disassociate guest state information with the owner browser. - owner_browser->browser_info()->RemoveFrame( - web_contents->GetPrimaryMainFrame()); -} - bool ChromeMimeHandlerViewGuestDelegateCef::HandleContextMenu( content::RenderFrameHost& render_frame_host, const content::ContextMenuParams& params) { diff --git a/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.h b/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.h index cf13b1238..d3ee13df3 100644 --- a/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.h +++ b/libcef/browser/chrome/extensions/chrome_mime_handler_view_guest_delegate_cef.h @@ -7,10 +7,11 @@ #define CEF_LIBCEF_BROWSER_CHROME_EXTENSIONS_CHROME_MIME_HANDLER_VIEW_GUEST_DELEGATE_CEF_H_ #include "chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h" -#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" namespace extensions { +class MimeHandlerViewGuest; + class ChromeMimeHandlerViewGuestDelegateCef : public ChromeMimeHandlerViewGuestDelegate { public: @@ -24,13 +25,10 @@ class ChromeMimeHandlerViewGuestDelegateCef ~ChromeMimeHandlerViewGuestDelegateCef() override; // MimeHandlerViewGuestDelegate methods. - void OnGuestAttached() override; - void OnGuestDetached() override; bool HandleContextMenu(content::RenderFrameHost& render_frame_host, const content::ContextMenuParams& params) override; private: - MimeHandlerViewGuest* guest_; // Owns us. content::WebContents* owner_web_contents_; }; diff --git a/libcef/browser/extensions/extension_system.cc b/libcef/browser/extensions/extension_system.cc index 01fba44ca..9dafaa36a 100644 --- a/libcef/browser/extensions/extension_system.cc +++ b/libcef/browser/extensions/extension_system.cc @@ -209,8 +209,8 @@ void CefExtensionSystem::Init() { // MimeHandlerViewGuest and CefMimeHandlerViewGuestDelegate in the browser // process. // 11.MimeHandlerViewGuest::CreateWebContents creates a new guest WebContents - // (is_guest_view=true) to host the PDF extension and the PDF resource - // stream is retrieved via MimeHandlerStreamManager::ReleaseStream. + // to host the PDF extension and the PDF resource stream is retrieved via + // MimeHandlerStreamManager::ReleaseStream. // 12.MimeHandlerViewGuest::DidAttachToEmbedder calls // CefMimeHandlerViewGuestDelegate::OnGuestAttached to associate the guest // WebContents routing IDs with the owner CefBrowser. MimeHandlerViewGuest diff --git a/libcef/browser/extensions/mime_handler_view_guest_delegate.cc b/libcef/browser/extensions/mime_handler_view_guest_delegate.cc index 9c947bb3e..429f1042a 100644 --- a/libcef/browser/extensions/mime_handler_view_guest_delegate.cc +++ b/libcef/browser/extensions/mime_handler_view_guest_delegate.cc @@ -6,9 +6,6 @@ #include "libcef/browser/extensions/mime_handler_view_guest_delegate.h" #include "libcef/browser/alloy/alloy_browser_host_impl.h" -#include "libcef/browser/alloy/alloy_content_browser_client.h" -#include "libcef/browser/browser_context.h" -#include "libcef/browser/browser_info.h" #include "libcef/browser/osr/web_contents_view_osr.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" @@ -17,7 +14,7 @@ namespace extensions { CefMimeHandlerViewGuestDelegate::CefMimeHandlerViewGuestDelegate( MimeHandlerViewGuest* guest) - : guest_(guest), owner_web_contents_(guest_->owner_web_contents()) {} + : owner_web_contents_(guest->owner_web_contents()) {} CefMimeHandlerViewGuestDelegate::~CefMimeHandlerViewGuestDelegate() = default; @@ -37,32 +34,6 @@ void CefMimeHandlerViewGuestDelegate::OverrideWebContentsCreateParams( } } -void CefMimeHandlerViewGuestDelegate::OnGuestAttached() { - content::WebContents* web_contents = guest_->web_contents(); - DCHECK(web_contents); - - CefRefPtr owner_browser = - AlloyBrowserHostImpl::GetBrowserForContents(owner_web_contents_); - DCHECK(owner_browser); - - // Associate guest state information with the owner browser. - owner_browser->browser_info()->MaybeCreateFrame( - web_contents->GetPrimaryMainFrame(), true /* is_guest_view */); -} - -void CefMimeHandlerViewGuestDelegate::OnGuestDetached() { - content::WebContents* web_contents = guest_->web_contents(); - DCHECK(web_contents); - - CefRefPtr owner_browser = - AlloyBrowserHostImpl::GetBrowserForContents(owner_web_contents_); - DCHECK(owner_browser); - - // Disassociate guest state information with the owner browser. - owner_browser->browser_info()->RemoveFrame( - web_contents->GetPrimaryMainFrame()); -} - bool CefMimeHandlerViewGuestDelegate::HandleContextMenu( content::RenderFrameHost& render_frame_host, const content::ContextMenuParams& params) { diff --git a/libcef/browser/extensions/mime_handler_view_guest_delegate.h b/libcef/browser/extensions/mime_handler_view_guest_delegate.h index 96b413b76..e7db6c327 100644 --- a/libcef/browser/extensions/mime_handler_view_guest_delegate.h +++ b/libcef/browser/extensions/mime_handler_view_guest_delegate.h @@ -6,7 +6,6 @@ #ifndef CEF_LIBCEF_BROWSER_EXTENSIONS_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_ #define CEF_LIBCEF_BROWSER_EXTENSIONS_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_ -#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h" namespace content { @@ -15,6 +14,8 @@ struct ContextMenuParams; namespace extensions { +class MimeHandlerViewGuest; + class CefMimeHandlerViewGuestDelegate : public MimeHandlerViewGuestDelegate { public: explicit CefMimeHandlerViewGuestDelegate(MimeHandlerViewGuest* guest); @@ -29,13 +30,10 @@ class CefMimeHandlerViewGuestDelegate : public MimeHandlerViewGuestDelegate { // MimeHandlerViewGuestDelegate methods. void OverrideWebContentsCreateParams( content::WebContents::CreateParams* params) override; - void OnGuestAttached() override; - void OnGuestDetached() override; bool HandleContextMenu(content::RenderFrameHost& render_frame_host, const content::ContextMenuParams& params) override; private: - MimeHandlerViewGuest* guest_; // Owns us. content::WebContents* owner_web_contents_; }; diff --git a/libcef/browser/javascript_dialog_manager.cc b/libcef/browser/javascript_dialog_manager.cc index 14b26df85..509047bb8 100644 --- a/libcef/browser/javascript_dialog_manager.cc +++ b/libcef/browser/javascript_dialog_manager.cc @@ -69,9 +69,9 @@ javascript_dialogs::TabModalDialogManager* GetTabModalDialogManager( return manager; } - // Try the owner WebContents if the dialog originates from a guest view such - // as the PDF viewer or Print Preview. - // This is safe to call even if Alloy extensions are disabled. + // Try the owner WebContents if the dialog originates from an excluded view + // such as the PDF viewer or Print Preview. This is safe to call even if Alloy + // extensions are disabled. if (auto* owner_contents = extensions::GetOwnerForGuestContents(web_contents)) { return javascript_dialogs::TabModalDialogManager::FromWebContents( diff --git a/libcef/browser/net_service/resource_request_handler_wrapper.cc b/libcef/browser/net_service/resource_request_handler_wrapper.cc index 77ae449de..bc823f6ea 100644 --- a/libcef/browser/net_service/resource_request_handler_wrapper.cc +++ b/libcef/browser/net_service/resource_request_handler_wrapper.cc @@ -1336,7 +1336,7 @@ std::unique_ptr CreateInterceptedRequestHandler( if (frame) { browserPtr = CefBrowserHostBase::GetBrowserForHost(frame); if (browserPtr) { - // May return nullptr for guest view requests. + // May return nullptr for excluded view requests. framePtr = browserPtr->GetFrameForHost(frame); if (!framePtr) { framePtr = browserPtr->GetMainFrame(); @@ -1407,7 +1407,7 @@ std::unique_ptr CreateInterceptedRequestHandler( browserPtr = CefBrowserHostBase::GetBrowserForHost(frame); if (browserPtr) { - // May return nullptr for guest view requests. + // May return nullptr for excluded view requests. framePtr = browserPtr->GetFrameForHost(frame); if (!framePtr) { framePtr = browserPtr->GetMainFrame(); diff --git a/libcef/browser/request_context_impl.cc b/libcef/browser/request_context_impl.cc index 057625b73..15cdc5b7a 100644 --- a/libcef/browser/request_context_impl.cc +++ b/libcef/browser/request_context_impl.cc @@ -702,18 +702,14 @@ cef_color_variant_t CefRequestContextImpl::GetChromeColorSchemeVariant() { void CefRequestContextImpl::OnRenderFrameCreated( const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view) { - browser_context_->OnRenderFrameCreated(this, global_id, is_main_frame, - is_guest_view); + bool is_main_frame) { + browser_context_->OnRenderFrameCreated(this, global_id, is_main_frame); } void CefRequestContextImpl::OnRenderFrameDeleted( const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view) { - browser_context_->OnRenderFrameDeleted(this, global_id, is_main_frame, - is_guest_view); + bool is_main_frame) { + browser_context_->OnRenderFrameDeleted(this, global_id, is_main_frame); } // static diff --git a/libcef/browser/request_context_impl.h b/libcef/browser/request_context_impl.h index 804c1c843..9890fb8a1 100644 --- a/libcef/browser/request_context_impl.h +++ b/libcef/browser/request_context_impl.h @@ -139,19 +139,15 @@ class CefRequestContextImpl : public CefRequestContext { const CefRequestContextSettings& settings() const { return config_.settings; } - // Called from CefBrowserContentsDelegate::RenderFrameCreated or - // CefMimeHandlerViewGuestDelegate::OnGuestAttached when a render frame is - // created. + // Called from CefBrowserContentsDelegate::RenderFrameCreated when a render + // frame is created. void OnRenderFrameCreated(const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view); + bool is_main_frame); - // Called from CefBrowserContentsDelegate::RenderFrameDeleted or - // CefMimeHandlerViewGuestDelegate::OnGuestDetached when a render frame is - // deleted. + // Called from CefBrowserContentsDelegate::RenderFrameDeleted when a render + // frame is deleted. void OnRenderFrameDeleted(const content::GlobalRenderFrameHostId& global_id, - bool is_main_frame, - bool is_guest_view); + bool is_main_frame); private: friend class CefRequestContext; diff --git a/libcef/common/mojom/cef.mojom b/libcef/common/mojom/cef.mojom index 821073371..75dc10bb1 100644 --- a/libcef/common/mojom/cef.mojom +++ b/libcef/common/mojom/cef.mojom @@ -119,7 +119,7 @@ struct NewBrowserInfo { bool? is_popup; bool? is_windowless; bool? print_preview_enabled; - bool is_guest_view; + bool is_excluded; mojo_base.mojom.DictionaryValue? extra_info; }; diff --git a/libcef/renderer/render_manager.cc b/libcef/renderer/render_manager.cc index eeadcf4c7..57cd712bb 100644 --- a/libcef/renderer/render_manager.cc +++ b/libcef/renderer/render_manager.cc @@ -52,13 +52,13 @@ CefRenderManager* g_manager = nullptr; } // namespace -// Placeholder object for guest views. -class CefGuestView : public blink::WebViewObserver { +// Placeholder object for excluded views. +class CefExcludedView : public blink::WebViewObserver { public: - CefGuestView(CefRenderManager* manager, - blink::WebView* web_view, - std::optional is_windowless, - std::optional print_preview_enabled) + CefExcludedView(CefRenderManager* manager, + blink::WebView* web_view, + std::optional is_windowless, + std::optional print_preview_enabled) : blink::WebViewObserver(web_view), manager_(manager), is_windowless_(is_windowless), @@ -71,7 +71,7 @@ class CefGuestView : public blink::WebViewObserver { private: // RenderViewObserver methods. - void OnDestruct() override { manager_->OnGuestViewDestroyed(this); } + void OnDestruct() override { manager_->OnExcludedViewDestroyed(this); } CefRenderManager* const manager_; const std::optional is_windowless_; @@ -306,8 +306,8 @@ CefRefPtr CefRenderManager::MaybeCreateBrowser( return nullptr; } - // Don't create another browser or guest view object if one already exists for - // the view. + // Don't create another browser or excluded view object if one already exists + // for the view. auto browser = GetBrowserForView(web_view); if (browser) { if (is_windowless) { @@ -319,13 +319,13 @@ CefRefPtr CefRenderManager::MaybeCreateBrowser( return browser; } - auto guest_view = GetGuestViewForView(web_view); - if (guest_view) { + auto excluded_view = GetExcludedViewForView(web_view); + if (excluded_view) { if (is_windowless) { - *is_windowless = guest_view->is_windowless(); + *is_windowless = excluded_view->is_windowless(); } if (print_preview_enabled) { - *print_preview_enabled = guest_view->print_preview_enabled(); + *print_preview_enabled = excluded_view->print_preview_enabled(); } return nullptr; } @@ -346,14 +346,14 @@ CefRefPtr CefRenderManager::MaybeCreateBrowser( *print_preview_enabled = params->print_preview_enabled; } - if (params->is_guest_view || params->browser_id < 0) { - // Don't create a CefBrowser for a guest view (PDF renderer, PDF extension - // or print preview dialog), or if the new browser info response has timed - // out. - guest_views_.insert(std::make_pair( + if (params->is_excluded || params->browser_id < 0) { + // Don't create a CefBrowser for excluded content (PDF renderer, PDF + // extension or print preview dialog), or if the new browser info response + // has timed out. + excluded_views_.insert(std::make_pair( web_view, - std::make_unique(this, web_view, params->is_windowless, - params->print_preview_enabled))); + std::make_unique(this, web_view, params->is_windowless, + params->print_preview_enabled))); return nullptr; } @@ -398,26 +398,27 @@ void CefRenderManager::OnBrowserDestroyed(CefBrowserImpl* browser) { DCHECK(false); } -CefGuestView* CefRenderManager::GetGuestViewForView(blink::WebView* view) { +CefExcludedView* CefRenderManager::GetExcludedViewForView( + blink::WebView* view) { CEF_REQUIRE_RT_RETURN(nullptr); - GuestViewMap::const_iterator it = guest_views_.find(view); - if (it != guest_views_.end()) { + ExcludedViewMap::const_iterator it = excluded_views_.find(view); + if (it != excluded_views_.end()) { return it->second.get(); } return nullptr; } -void CefRenderManager::OnGuestViewDestroyed(CefGuestView* guest_view) { - GuestViewMap::iterator it = guest_views_.begin(); - for (; it != guest_views_.end(); ++it) { - if (it->second.get() == guest_view) { - guest_views_.erase(it); +void CefRenderManager::OnExcludedViewDestroyed(CefExcludedView* excluded_view) { + ExcludedViewMap::iterator it = excluded_views_.begin(); + for (; it != excluded_views_.end(); ++it) { + if (it->second.get() == excluded_view) { + excluded_views_.erase(it); return; } } - // No guest view was found in the map. + // No excluded view was found in the map. DCHECK(false); } diff --git a/libcef/renderer/render_manager.h b/libcef/renderer/render_manager.h index 38448dada..8589dcaa7 100644 --- a/libcef/renderer/render_manager.h +++ b/libcef/renderer/render_manager.h @@ -31,7 +31,7 @@ class BinderMap; } // namespace mojo class CefBrowserImpl; -class CefGuestView; +class CefExcludedView; class CefRenderFrameObserver; // Singleton object for managing BrowserImpl instances. Only accessed on the @@ -77,7 +77,7 @@ class CefRenderManager : public cef::mojom::RenderManager { private: friend class CefBrowserImpl; - friend class CefGuestView; + friend class CefExcludedView; // Binds receivers for the RenderManager interface. void BindReceiver(mojo::PendingReceiver receiver); @@ -91,7 +91,7 @@ class CefRenderManager : public cef::mojom::RenderManager { void WebKitInitialized(); // Maybe create a new browser object, return the existing one, or return - // nullptr for guest views. + // nullptr for excluded views. CefRefPtr MaybeCreateBrowser( blink::WebView* web_view, content::RenderFrame* render_frame, @@ -102,19 +102,20 @@ class CefRenderManager : public cef::mojom::RenderManager { // Called from CefBrowserImpl::OnDestruct(). void OnBrowserDestroyed(CefBrowserImpl* browser); - // Returns the guest view associated with the specified RenderView if any. - CefGuestView* GetGuestViewForView(blink::WebView* view); + // Returns the excluded view associated with the specified RenderView if any. + CefExcludedView* GetExcludedViewForView(blink::WebView* view); - // Called from CefGuestView::OnDestruct(). - void OnGuestViewDestroyed(CefGuestView* guest_view); + // Called from CefExcludedView::OnDestruct(). + void OnExcludedViewDestroyed(CefExcludedView* excluded_view); // Map of RenderView pointers to CefBrowserImpl references. using BrowserMap = std::map>; BrowserMap browsers_; - // Map of RenderView poiners to CefGuestView implementations. - using GuestViewMap = std::map>; - GuestViewMap guest_views_; + // Map of RenderView poiners to CefExcludedView implementations. + using ExcludedViewMap = + std::map>; + ExcludedViewMap excluded_views_; // Cross-origin white list entries that need to be registered with WebKit. std::vector diff --git a/patch/patch.cfg b/patch/patch.cfg index ab7110b3e..075ca7fb8 100644 --- a/patch/patch.cfg +++ b/patch/patch.cfg @@ -150,8 +150,7 @@ patches = [ 'name': 'web_contents_1257_1565', }, { - # Support custom RenderWidgetHostViewOSR for MimeHandlerViewGuest and - # expose OnGuestAttached/Detached notifications. + # Support custom RenderWidgetHostViewOSR for MimeHandlerViewGuest. # https://github.com/chromiumembedded/cef/issues/1565 # https://github.com/chromiumembedded/cef/issues/2727 'name': 'mime_handler_view_guest_1565_2727', diff --git a/patch/patches/mime_handler_view_guest_1565_2727.patch b/patch/patches/mime_handler_view_guest_1565_2727.patch index 42ed85959..ea05b6610 100644 --- a/patch/patches/mime_handler_view_guest_1565_2727.patch +++ b/patch/patches/mime_handler_view_guest_1565_2727.patch @@ -12,7 +12,7 @@ index 285dc38950991..326646bb585da 100644 virtual ~WebContentsView() = default; diff --git extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc -index bd8b5ddfd8659..0f1e6e2ed9ea2 100644 +index bd8b5ddfd8659..767c0ec89ef7a 100644 --- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc +++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc @@ -205,6 +205,8 @@ void MimeHandlerViewGuest::CreateWebContents( @@ -24,51 +24,8 @@ index bd8b5ddfd8659..0f1e6e2ed9ea2 100644 std::move(callback).Run(std::move(owned_this), WebContents::CreateWithSessionStorage( params, owner_web_contents() -@@ -213,6 +215,10 @@ void MimeHandlerViewGuest::CreateWebContents( - } - - void MimeHandlerViewGuest::DidAttachToEmbedder() { -+ is_guest_attached_ = true; -+ if (delegate_) -+ delegate_->OnGuestAttached(); -+ - DCHECK(stream_->handler_url().SchemeIs(extensions::kExtensionScheme)); - GetController().LoadURL(stream_->handler_url(), content::Referrer(), - ui::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string()); -@@ -489,6 +495,14 @@ void MimeHandlerViewGuest::DidFinishNavigation( - } - } - -+void MimeHandlerViewGuest::WebContentsDestroyed() { -+ if (is_guest_attached_ && delegate_) -+ delegate_->OnGuestDetached(); -+ -+ // May delete |this|. -+ GuestView::WebContentsDestroyed(); -+} -+ - void MimeHandlerViewGuest::FuseBeforeUnloadControl( - mojo::PendingReceiver receiver) { - if (!pending_before_unload_control_) -diff --git extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h -index f0b71aba6dfb4..a8b4b6dc27fa7 100644 ---- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h -+++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h -@@ -198,10 +198,12 @@ class MimeHandlerViewGuest - void ReadyToCommitNavigation( - content::NavigationHandle* navigation_handle) final; - void DidFinishNavigation(content::NavigationHandle* navigation_handle) final; -+ void WebContentsDestroyed() override; - - std::unique_ptr delegate_; - std::unique_ptr stream_; - -+ bool is_guest_attached_ = false; - bool is_guest_fullscreen_ = false; - bool is_embedder_fullscreen_ = false; - bool plugin_can_save_ = false; diff --git extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h -index 7f59e7925084e..777b8a3cf103a 100644 +index 7f59e7925084e..e3e69dc6d3a43 100644 --- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h +++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h @@ -7,6 +7,8 @@ @@ -80,17 +37,13 @@ index 7f59e7925084e..777b8a3cf103a 100644 namespace content { class RenderFrameHost; struct ContextMenuParams; -@@ -25,6 +27,14 @@ class MimeHandlerViewGuestDelegate { +@@ -25,6 +27,10 @@ class MimeHandlerViewGuestDelegate { virtual ~MimeHandlerViewGuestDelegate() {} + // Provides an opportunity to supply a custom view implementation. + virtual void OverrideWebContentsCreateParams( + content::WebContents::CreateParams* params) {} -+ -+ // Called when a guest is attached or detached. -+ virtual void OnGuestAttached() {} -+ virtual void OnGuestDetached() {} + // Handles context menu, or returns false if unhandled. //