diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc index c1ae2a911735..e45e3e388a5e 100644 --- content/browser/web_contents/web_contents_impl.cc +++ content/browser/web_contents/web_contents_impl.cc @@ -1783,6 +1783,12 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { std::string unique_name; frame_tree_.root()->SetFrameName(params.main_frame_name, unique_name); + 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); @@ -1837,6 +1843,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { GetRenderViewHost()->DispatchRenderViewCreated(); GetRenderManager()->current_frame_host()->SetRenderFrameCreated(true); } + } // Create the renderer process in advance if requested. if (params.initialize_renderer) { @@ -2349,6 +2356,15 @@ void WebContentsImpl::CreateNewWindow( create_params.renderer_initiated_creation = main_frame_route_id != MSG_ROUTING_NONE; + if (delegate_) { + delegate_->GetCustomWebContentsView(this, + params.target_url, + render_process_id, + opener->GetRoutingID(), + &create_params.view, + &create_params.delegate_view); + } + WebContentsImpl* new_contents = nullptr; if (!is_guest) { create_params.context = view_->GetNativeView(); @@ -2378,7 +2394,7 @@ void 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. new_view->CreateViewForWidget( - new_contents->GetRenderViewHost()->GetWidget(), false); + new_contents->GetRenderViewHost()->GetWidget(), nullptr); } // Save the created window associated with the route so we can show it // later. @@ -5546,7 +5562,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); // Now that the RenderView has been created, we need to tell it its size. if (rwh_view) diff --git content/public/browser/web_contents.cc content/public/browser/web_contents.cc index 53d56abb35a3..d7b955f42ca5 100644 --- content/public/browser/web_contents.cc +++ content/public/browser/web_contents.cc @@ -30,7 +30,9 @@ WebContents::CreateParams::CreateParams(BrowserContext* context, context(nullptr), renderer_initiated_creation(false), initialize_renderer(false), - starting_sandbox_flags(blink::WebSandboxFlags::kNone) {} + starting_sandbox_flags(blink::WebSandboxFlags::kNone), + view(nullptr), + delegate_view(nullptr) {} WebContents::CreateParams::CreateParams(const CreateParams& other) = default; diff --git content/public/browser/web_contents.h content/public/browser/web_contents.h index d6252667ed68..83265f9b6b41 100644 --- content/public/browser/web_contents.h +++ content/public/browser/web_contents.h @@ -68,9 +68,11 @@ class BrowserPluginGuestDelegate; class InterstitialPage; class RenderFrameHost; class RenderViewHost; +class RenderViewHostDelegateView; class RenderWidgetHost; class RenderWidgetHostView; class WebContentsDelegate; +class WebContentsView; struct CustomContextMenuContext; struct DropData; struct Manifest; @@ -173,6 +175,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; }; // Creates a new WebContents. diff --git content/public/browser/web_contents_delegate.h content/public/browser/web_contents_delegate.h index 37db677b7438..4f4a8574e47d 100644 --- content/public/browser/web_contents_delegate.h +++ content/public/browser/web_contents_delegate.h @@ -43,11 +43,13 @@ namespace content { class ColorChooser; class JavaScriptDialogManager; class RenderFrameHost; +class RenderViewHostDelegateView; class RenderWidgetHost; class SessionStorageNamespace; class SiteInstance; class WebContents; class WebContentsImpl; +class WebContentsView; struct ColorSuggestion; struct ContextMenuParams; struct DropData; @@ -308,6 +310,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,