mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			156 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
diff --git content/browser/web_contents/web_contents_impl.cc content/browser/web_contents/web_contents_impl.cc
 | 
						|
index 21cac3c4da2a..a612822d5d57 100644
 | 
						|
--- content/browser/web_contents/web_contents_impl.cc
 | 
						|
+++ content/browser/web_contents/web_contents_impl.cc
 | 
						|
@@ -2131,21 +2131,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());
 | 
						|
 
 | 
						|
@@ -2844,6 +2853,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();
 | 
						|
@@ -2876,7 +2894,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_impl->GetRenderViewHost()->GetWidget(), false);
 | 
						|
+          new_contents_impl->GetRenderViewHost()->GetWidget(), nullptr);
 | 
						|
     }
 | 
						|
     // Save the created window associated with the route so we can show it
 | 
						|
     // later.
 | 
						|
@@ -6516,7 +6534,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 df508da0aef2..f6f4bf42b108 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),
 | 
						|
       desired_renderer_state(kOkayToHaveRendererProcess),
 | 
						|
-      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 367705d05ebc..7e25a0de3020 100644
 | 
						|
--- content/public/browser/web_contents.h
 | 
						|
+++ content/public/browser/web_contents.h
 | 
						|
@@ -76,9 +76,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 23c2a2bdaa77..67fd2a66cab4 100644
 | 
						|
--- content/public/browser/web_contents_delegate.h
 | 
						|
+++ content/public/browser/web_contents_delegate.h
 | 
						|
@@ -59,10 +59,12 @@ class FileSelectListener;
 | 
						|
 class JavaScriptDialogManager;
 | 
						|
 class RenderFrameHost;
 | 
						|
 class RenderProcessHost;
 | 
						|
+class RenderViewHostDelegateView;
 | 
						|
 class RenderWidgetHost;
 | 
						|
 class SessionStorageNamespace;
 | 
						|
 class SiteInstance;
 | 
						|
 class WebContentsImpl;
 | 
						|
+class WebContentsView;
 | 
						|
 struct ContextMenuParams;
 | 
						|
 struct DropData;
 | 
						|
 struct NativeWebKeyboardEvent;
 | 
						|
@@ -334,6 +336,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,
 |