diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc index a3ff7b5dece60..f524e08b1ff08 100644 --- content/browser/web_contents/web_contents_impl.cc +++ content/browser/web_contents/web_contents_impl.cc @@ -2971,6 +2971,12 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { params.renderer_initiated_creation, params.main_frame_name, GetOriginalOpener()); + if (params.view && params.delegate_view) { + view_.reset(params.view); + render_view_host_delegate_view_ = params.delegate_view; + } + + if (!view_) { WebContentsViewDelegate* delegate = GetContentClient()->browser()->GetWebContentsViewDelegate(this); @@ -2981,6 +2987,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { view_.reset(CreateWebContentsView(this, delegate, &render_view_host_delegate_view_)); } + } CHECK(render_view_host_delegate_view_); CHECK(view_.get()); @@ -3854,6 +3861,15 @@ FrameTree* WebContentsImpl::CreateNewWindow( // objects. create_params.renderer_initiated_creation = !is_new_browsing_instance; + if (delegate_) { + delegate_->GetCustomWebContentsView(this, + params.target_url, + render_process_id, + opener->GetRoutingID(), + &create_params.view, + &create_params.delegate_view); + } + std::unique_ptr new_contents; if (!is_guest) { create_params.context = view_->GetNativeView(); @@ -7672,6 +7688,8 @@ void WebContentsImpl::OnAdvanceFocus(RenderFrameHostImpl* source_rfh) { GetFocusedWebContents() == GetOuterWebContents()) { SetAsFocusedWebContentsIfNecessary(); } + + observers_.NotifyObservers(&WebContentsObserver::OnFrameFocused, source_rfh); } void WebContentsImpl::OnFocusedElementChangedInFrame( diff --git content/public/browser/web_contents.h content/public/browser/web_contents.h index 6d1587c1d7e36..a998ec5a27543 100644 --- content/public/browser/web_contents.h +++ content/public/browser/web_contents.h @@ -93,10 +93,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; @@ -234,6 +236,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 f04506bf8b64f..936f86af74eda 100644 --- content/public/browser/web_contents_delegate.h +++ content/public/browser/web_contents_delegate.h @@ -58,10 +58,12 @@ class EyeDropperListener; class FileSelectListener; class JavaScriptDialogManager; class RenderFrameHost; +class RenderViewHostDelegateView; class RenderWidgetHost; class SessionStorageNamespace; class SiteInstance; class WebContentsImpl; +class WebContentsView; struct ContextMenuParams; struct DropData; struct MediaPlayerWatchTime; @@ -344,6 +346,14 @@ class CONTENT_EXPORT WebContentsDelegate { const StoragePartitionId& partition_id, 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 fe2f6632ad95d..0c6a1e77caec1 100644 --- content/public/browser/web_contents_observer.h +++ content/public/browser/web_contents_observer.h @@ -739,6 +739,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