mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			156 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc
 | |
| index dde4f26a40c3..9249b0cbb6a1 100644
 | |
| --- content/browser/web_contents/web_contents_impl.cc
 | |
| +++ content/browser/web_contents/web_contents_impl.cc
 | |
| @@ -1797,21 +1797,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<WebContentsViewGuest>(
 | |
| -          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());
 | |
|  
 | |
| @@ -2418,6 +2427,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);
 | |
| +  }
 | |
| +
 | |
|    std::unique_ptr<WebContents> new_contents;
 | |
|    if (!is_guest) {
 | |
|      create_params.context = view_->GetNativeView();
 | |
| @@ -2448,7 +2466,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.
 | |
| @@ -5742,7 +5760,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 c4a7f3173b98..d42beefe4589 100644
 | |
| --- content/public/browser/web_contents.h
 | |
| +++ content/public/browser/web_contents.h
 | |
| @@ -74,9 +74,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;
 | |
| @@ -178,6 +180,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 4fc457c9e413..79a6dbf5b3a5 100644
 | |
| --- content/public/browser/web_contents_delegate.h
 | |
| +++ content/public/browser/web_contents_delegate.h
 | |
| @@ -47,10 +47,12 @@ class ColorChooser;
 | |
|  class JavaScriptDialogManager;
 | |
|  class RenderFrameHost;
 | |
|  class RenderProcessHost;
 | |
| +class RenderViewHostDelegateView;
 | |
|  class RenderWidgetHost;
 | |
|  class SessionStorageNamespace;
 | |
|  class SiteInstance;
 | |
|  class WebContentsImpl;
 | |
| +class WebContentsView;
 | |
|  struct ContextMenuParams;
 | |
|  struct DropData;
 | |
|  struct FileChooserParams;
 | |
| @@ -313,6 +315,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,
 |