mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc
 | |
| index aa2aeccdf7b2..d5409dc4f41b 100644
 | |
| --- content/browser/web_contents/web_contents_impl.cc
 | |
| +++ content/browser/web_contents/web_contents_impl.cc
 | |
| @@ -2163,21 +2163,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());
 | |
|  
 | |
| @@ -2891,6 +2900,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
 | |
| @@ -2936,7 +2954,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.
 | |
| @@ -6629,7 +6647,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,
 |