diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc index 812cfe34f691..308fde5e82d6 100644 --- content/browser/web_contents/web_contents_impl.cc +++ content/browser/web_contents/web_contents_impl.cc @@ -2156,21 +2156,30 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { std::string unique_name; frame_tree_.root()->SetFrameName(params.main_frame_name, unique_name); - WebContentsViewDelegate* delegate = - GetContentClient()->browser()->GetWebContentsViewDelegate(this); + if (params.view && params.delegate_view) { + view_.reset(params.view); + render_view_host_delegate_view_ = params.delegate_view; + } - if (GuestMode::IsCrossProcessFrameGuest(this)) { - view_.reset(new WebContentsViewChildFrame( - this, delegate, &render_view_host_delegate_view_)); - } else { - view_.reset(CreateWebContentsView(this, delegate, - &render_view_host_delegate_view_)); - if (browser_plugin_guest_) { - view_ = std::make_unique( - this, browser_plugin_guest_.get(), std::move(view_), - &render_view_host_delegate_view_); + if (!view_) { + WebContentsViewDelegate* delegate = + GetContentClient()->browser()->GetWebContentsViewDelegate(this); + + if (GuestMode::IsCrossProcessFrameGuest(this)) { + view_.reset(new WebContentsViewChildFrame( + this, delegate, &render_view_host_delegate_view_)); + } else { + view_.reset(CreateWebContentsView(this, delegate, + &render_view_host_delegate_view_)); } } + + if (browser_plugin_guest_ && !GuestMode::IsCrossProcessFrameGuest(this)) { + view_.reset(new WebContentsViewGuest(this, browser_plugin_guest_.get(), + std::move(view_), + &render_view_host_delegate_view_)); + } + CHECK(render_view_host_delegate_view_); CHECK(view_.get()); @@ -2871,6 +2880,15 @@ RenderFrameHostDelegate* 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); + } + // If |is_new_browsing_instance| is true, defer routing_id allocation // to the WebContentsImpl::Create() call. This is required because with // a new browsing instance, WebContentsImpl::Create() may elect a different @@ -2916,7 +2934,7 @@ RenderFrameHostDelegate* WebContentsImpl::CreateNewWindow( // TODO(brettw): It seems bogus that we have to call this function on the // newly created object and give it one of its own member variables. RenderWidgetHostView* widget_view = new_view->CreateViewForWidget( - new_contents_impl->GetRenderViewHost()->GetWidget(), false); + new_contents_impl->GetRenderViewHost()->GetWidget(), nullptr); if (!renderer_started_hidden) { // RenderWidgets for frames always initialize as hidden. If the renderer // created this window as visible, then we show it here. @@ -6599,7 +6617,7 @@ InterstitialPageImpl* WebContentsImpl::GetInterstitialForRenderManager() { void WebContentsImpl::CreateRenderWidgetHostViewForRenderManager( RenderViewHost* render_view_host) { RenderWidgetHostViewBase* rwh_view = - view_->CreateViewForWidget(render_view_host->GetWidget(), false); + view_->CreateViewForWidget(render_view_host->GetWidget(), nullptr); rwh_view->SetSize(GetSizeForNewRenderView(true)); } diff --git content/public/browser/web_contents.cc content/public/browser/web_contents.cc index 2e133afb8da8..e9a88a6bb96b 100644 --- content/public/browser/web_contents.cc +++ content/public/browser/web_contents.cc @@ -31,6 +31,8 @@ WebContents::CreateParams::CreateParams(BrowserContext* context, renderer_initiated_creation(false), desired_renderer_state(kOkayToHaveRendererProcess), starting_sandbox_flags(blink::WebSandboxFlags::kNone), + view(nullptr), + delegate_view(nullptr), is_never_visible(false) {} WebContents::CreateParams::CreateParams(const CreateParams& other) = default; diff --git content/public/browser/web_contents.h content/public/browser/web_contents.h index 075dd2545430..53b4cfb790c8 100644 --- content/public/browser/web_contents.h +++ content/public/browser/web_contents.h @@ -79,9 +79,11 @@ class BrowserPluginGuestDelegate; class InterstitialPage; class RenderFrameHost; class RenderViewHost; +class RenderViewHostDelegateView; class RenderWidgetHost; class RenderWidgetHostView; class WebContentsDelegate; +class WebContentsView; struct CustomContextMenuContext; struct DropData; struct MHTMLGenerationParams; @@ -217,6 +219,10 @@ class WebContents : public PageNavigator, // Sandboxing flags set on the new WebContents. blink::WebSandboxFlags starting_sandbox_flags; + // Optionally specify the view and delegate view. + content::WebContentsView* view; + content::RenderViewHostDelegateView* delegate_view; + // 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 dedaf25af5ba..4133b980bebb 100644 --- content/public/browser/web_contents_delegate.h +++ content/public/browser/web_contents_delegate.h @@ -57,10 +57,12 @@ class ColorChooser; class FileSelectListener; class JavaScriptDialogManager; class RenderFrameHost; +class RenderViewHostDelegateView; class RenderWidgetHost; class SessionStorageNamespace; class SiteInstance; class WebContentsImpl; +class WebContentsView; struct ContextMenuParams; struct DropData; struct NativeWebKeyboardEvent; @@ -327,6 +329,14 @@ class CONTENT_EXPORT WebContentsDelegate { const std::string& 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,