| diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc |
| index 355f0d796d3c6..d8c047d6173e3 100644 |
| --- content/browser/web_contents/web_contents_impl.cc |
| +++ content/browser/web_contents/web_contents_impl.cc |
| @@ -3348,6 +3348,12 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params, |
| params.main_frame_name, GetOpener(), primary_main_frame_policy, |
| base::UnguessableToken::Create()); |
| |
| + if (params.view && params.delegate_view) { |
| + view_.reset(params.view); |
| + render_view_host_delegate_view_ = params.delegate_view; |
| + } |
| + |
| + if (!view_) { |
| std::unique_ptr<WebContentsViewDelegate> delegate = |
| GetContentClient()->browser()->GetWebContentsViewDelegate(this); |
| |
| @@ -3358,6 +3364,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params, |
| view_ = CreateWebContentsView(this, std::move(delegate), |
| &render_view_host_delegate_view_); |
| } |
| + } |
| CHECK(render_view_host_delegate_view_); |
| CHECK(view_.get()); |
| |
| @@ -3548,6 +3555,9 @@ void WebContentsImpl::RenderWidgetCreated( |
| OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::RenderWidgetCreated", |
| "render_widget_host", render_widget_host); |
| created_widgets_.insert(render_widget_host); |
| + |
| + observers_.NotifyObservers( |
| + &WebContentsObserver::RenderWidgetCreated, render_widget_host); |
| } |
| |
| void WebContentsImpl::RenderWidgetDeleted( |
| @@ -3868,6 +3878,10 @@ void WebContentsImpl::SetWindowShowState(ui::WindowShowState state) { |
| |
| ui::WindowShowState WebContentsImpl::GetWindowShowState() { |
| aura::Window* window = GetTopLevelNativeWindow(); |
| + if (!window) { |
| + // |window| will be nullptr with CEF windowless rendering. |
| + return ui::SHOW_STATE_DEFAULT; |
| + } |
| return wm::GetWindowState(window); |
| } |
| #endif |
| @@ -4335,6 +4349,15 @@ FrameTree* WebContentsImpl::CreateNewWindow( |
| create_params.picture_in_picture_options = *(params.pip_options); |
| } |
| |
| + if (delegate_) { |
| + delegate_->GetCustomWebContentsView(this, |
| + params.target_url, |
| + render_process_id, |
| + opener->GetRoutingID(), |
| + &create_params.view, |
| + &create_params.delegate_view); |
| + } |
| + |
| // Check whether there is an available prerendered page for this navigation if |
| // this is not for guest. If it exists, take WebContents pre-created for |
| // hosting the prerendered page instead of creating new WebContents. |
| @@ -8342,6 +8365,9 @@ void WebContentsImpl::SetFocusedFrame(FrameTreeNode* node, |
| } |
| |
| CloseListenerManager::DidChangeFocusedFrame(this); |
| + |
| + observers_.NotifyObservers(&WebContentsObserver::OnFrameFocused, |
| + node->current_frame_host()); |
| } |
| |
| void WebContentsImpl::DidCallFocus() { |
| diff --git content/public/browser/web_contents.h content/public/browser/web_contents.h |
| index d3d0b0aab60e9..79938331d05f1 100644 |
| --- content/public/browser/web_contents.h |
| +++ content/public/browser/web_contents.h |
| @@ -98,10 +98,12 @@ class BrowserContext; |
| class BrowserPluginGuestDelegate; |
| class RenderFrameHost; |
| class RenderViewHost; |
| +class RenderViewHostDelegateView; |
| class RenderWidgetHostView; |
| class ScreenOrientationDelegate; |
| class SiteInstance; |
| class WebContentsDelegate; |
| +class WebContentsView; |
| class WebUI; |
| struct DropData; |
| struct MHTMLGenerationParams; |
| @@ -244,6 +246,10 @@ class WebContents : public PageNavigator, |
| network::mojom::WebSandboxFlags starting_sandbox_flags = |
| network::mojom::WebSandboxFlags::kNone; |
| |
| + // Optionally specify the view and delegate view. |
| + content::WebContentsView* view = nullptr; |
| + content::RenderViewHostDelegateView* delegate_view = nullptr; |
| + |
| // Value used to set the last time the WebContents was made active, this is |
| // the value that'll be returned by GetLastActiveTime(). If this is left |
| // default initialized then the value is not passed on to the WebContents |
| diff --git content/public/browser/web_contents_delegate.h content/public/browser/web_contents_delegate.h |
| index 0fa12e6a5dd2e..6461d84aa3ac9 100644 |
| --- content/public/browser/web_contents_delegate.h |
| +++ content/public/browser/web_contents_delegate.h |
| @@ -59,9 +59,11 @@ class EyeDropperListener; |
| class FileSelectListener; |
| class JavaScriptDialogManager; |
| class RenderFrameHost; |
| +class RenderViewHostDelegateView; |
| class RenderWidgetHost; |
| class SessionStorageNamespace; |
| class SiteInstance; |
| +class WebContentsView; |
| struct ContextMenuParams; |
| struct DropData; |
| struct MediaPlayerWatchTime; |
| @@ -344,6 +346,14 @@ class CONTENT_EXPORT WebContentsDelegate { |
| const StoragePartitionConfig& partition_config, |
| SessionStorageNamespace* session_storage_namespace); |
| |
| + virtual void GetCustomWebContentsView( |
| + WebContents* web_contents, |
| + const GURL& target_url, |
| + int opener_render_process_id, |
| + int opener_render_frame_id, |
| + content::WebContentsView** view, |
| + content::RenderViewHostDelegateView** delegate_view) {} |
| + |
| // Notifies the delegate about the creation of a new WebContents. This |
| // typically happens when popups are created. |
| virtual void WebContentsCreated(WebContents* source_contents, |
| diff --git content/public/browser/web_contents_observer.h content/public/browser/web_contents_observer.h |
| index c3d701fc68db0..f0be70560e6ea 100644 |
| --- content/public/browser/web_contents_observer.h |
| +++ content/public/browser/web_contents_observer.h |
| @@ -221,6 +221,9 @@ class CONTENT_EXPORT WebContentsObserver { |
| virtual void OnCaptureHandleConfigUpdate( |
| const blink::mojom::CaptureHandleConfig& config) {} |
| |
| + // This method is invoked when a RenderWidget is created. |
| + virtual void RenderWidgetCreated(RenderWidgetHost* render_widget_host) {} |
| + |
| // This method is invoked when the `blink::WebView` of the current |
| // RenderViewHost is ready, e.g. because we recreated it after a crash. |
| virtual void RenderViewReady() {} |
| @@ -825,6 +828,10 @@ class CONTENT_EXPORT WebContentsObserver { |
| // WebContents has gained/lost focus. |
| virtual void OnFocusChangedInPage(FocusedNodeDetails* details) {} |
| |
| + // Notification that |render_frame_host| for this WebContents has gained |
| + // focus. |
| + virtual void OnFrameFocused(RenderFrameHost* render_frame_host) {} |
| + |
| // Notifies that the manifest URL for the main frame changed to |
| // |manifest_url|. This will be invoked when a document with a manifest loads |
| // or when the manifest URL changes (possibly to nothing). It is not invoked |