mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			345 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			345 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff --git content/browser/browser_plugin/browser_plugin_guest.cc content/browser/browser_plugin/browser_plugin_guest.cc
 | |
| index 2cf5621ae33f..7a5d79ed09e4 100644
 | |
| --- content/browser/browser_plugin/browser_plugin_guest.cc
 | |
| +++ content/browser/browser_plugin/browser_plugin_guest.cc
 | |
| @@ -312,8 +312,11 @@ void BrowserPluginGuest::InitInternal(
 | |
|            static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
 | |
|      }
 | |
|  
 | |
| -    if (owner_web_contents_ && new_view)
 | |
| +    if (owner_web_contents_ && new_view) {
 | |
|        new_view->OnGuestDetached(owner_web_contents_->GetView());
 | |
| +      if (delegate_)
 | |
| +        delegate_->OnGuestDetached(owner_web_contents_->GetView());
 | |
| +    }
 | |
|  
 | |
|      // Once a BrowserPluginGuest has an embedder WebContents, it's considered to
 | |
|      // be attached.
 | |
| @@ -787,10 +790,19 @@ void BrowserPluginGuest::OnWillAttachComplete(
 | |
|          static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
 | |
|      if (!web_contents()->GetRenderViewHost()->GetWidget()->GetView()) {
 | |
|        web_contents_view->CreateViewForWidget(
 | |
| -          web_contents()->GetRenderViewHost()->GetWidget(), true);
 | |
| +          web_contents()->GetRenderViewHost()->GetWidget(),
 | |
| +          embedder_web_contents->GetRenderViewHost()->GetWidget());
 | |
|      }
 | |
|    }
 | |
|  
 | |
| +  if (delegate_) {
 | |
| +    // Notify the delegate here instead of in InitInternal because InitInternal
 | |
| +    // will now be called from Init before GuestViewBase::CompleteInit has set
 | |
| +    // web_contents() to the guest WebContents. This behavior change is due to
 | |
| +    // https://crrev.com/07263b56.
 | |
| +    delegate_->OnGuestAttached(embedder_web_contents->GetView());
 | |
| +  }
 | |
| +
 | |
|    InitInternal(params, embedder_web_contents);
 | |
|  
 | |
|    attached_ = true;
 | |
| diff --git content/browser/frame_host/interstitial_page_impl.cc content/browser/frame_host/interstitial_page_impl.cc
 | |
| index ad9de41d1e3e..a87ec19a5f54 100644
 | |
| --- content/browser/frame_host/interstitial_page_impl.cc
 | |
| +++ content/browser/frame_host/interstitial_page_impl.cc
 | |
| @@ -622,7 +622,7 @@ WebContentsView* InterstitialPageImpl::CreateWebContentsView() {
 | |
|    WebContentsView* wcv =
 | |
|        static_cast<WebContentsImpl*>(web_contents())->GetView();
 | |
|    RenderWidgetHostViewBase* view =
 | |
| -      wcv->CreateViewForWidget(render_view_host_->GetWidget(), false);
 | |
| +      wcv->CreateViewForWidget(render_view_host_->GetWidget(), nullptr);
 | |
|    render_view_host_->GetWidget()->SetView(view);
 | |
|    render_view_host_->GetMainFrame()->AllowBindings(
 | |
|        BINDINGS_POLICY_DOM_AUTOMATION);
 | |
| diff --git content/browser/web_contents/web_contents_view.h content/browser/web_contents/web_contents_view.h
 | |
| index cf8c74f4c744..b8cefb4b154b 100644
 | |
| --- content/browser/web_contents/web_contents_view.h
 | |
| +++ content/browser/web_contents/web_contents_view.h
 | |
| @@ -24,7 +24,7 @@ struct ScreenInfo;
 | |
|  // The WebContentsView is an interface that is implemented by the platform-
 | |
|  // dependent web contents views. The WebContents uses this interface to talk to
 | |
|  // them.
 | |
| -class WebContentsView {
 | |
| +class CONTENT_EXPORT WebContentsView {
 | |
|   public:
 | |
|    virtual ~WebContentsView() {}
 | |
|  
 | |
| @@ -88,13 +88,9 @@ class WebContentsView {
 | |
|    // Sets up the View that holds the rendered web page, receives messages for
 | |
|    // it and contains page plugins. The host view should be sized to the current
 | |
|    // size of the WebContents.
 | |
| -  //
 | |
| -  // |is_guest_view_hack| is temporary hack and will be removed once
 | |
| -  // RenderWidgetHostViewGuest is not dependent on platform view.
 | |
| -  // TODO(lazyboy): Remove |is_guest_view_hack| once http://crbug.com/330264 is
 | |
| -  // fixed.
 | |
|    virtual RenderWidgetHostViewBase* CreateViewForWidget(
 | |
| -      RenderWidgetHost* render_widget_host, bool is_guest_view_hack) = 0;
 | |
| +      RenderWidgetHost* render_widget_host,
 | |
| +      RenderWidgetHost* embedder_render_widget_host) = 0;
 | |
|  
 | |
|    // Creates a new View that holds a popup and receives messages for it.
 | |
|    virtual RenderWidgetHostViewBase* CreateViewForPopupWidget(
 | |
| diff --git content/browser/web_contents/web_contents_view_aura.cc content/browser/web_contents/web_contents_view_aura.cc
 | |
| index 617bfe3a5d24..b8c801e26b5e 100644
 | |
| --- content/browser/web_contents/web_contents_view_aura.cc
 | |
| +++ content/browser/web_contents/web_contents_view_aura.cc
 | |
| @@ -781,7 +781,8 @@ void WebContentsViewAura::CreateView(const gfx::Size& initial_size,
 | |
|  }
 | |
|  
 | |
|  RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget(
 | |
| -    RenderWidgetHost* render_widget_host, bool is_guest_view_hack) {
 | |
| +    RenderWidgetHost* render_widget_host,
 | |
| +    RenderWidgetHost* embedder_render_widget_host) {
 | |
|    if (render_widget_host->GetView()) {
 | |
|      // During testing, the view will already be set up in most cases to the
 | |
|      // test view, so we don't want to clobber it with a real one. To verify that
 | |
| @@ -793,6 +794,7 @@ RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget(
 | |
|          render_widget_host->GetView());
 | |
|    }
 | |
|  
 | |
| +  const bool is_guest_view_hack = !!embedder_render_widget_host;
 | |
|    RenderWidgetHostViewAura* view =
 | |
|        g_create_render_widget_host_view
 | |
|            ? g_create_render_widget_host_view(render_widget_host,
 | |
| diff --git content/browser/web_contents/web_contents_view_aura.h content/browser/web_contents/web_contents_view_aura.h
 | |
| index 82807c7f77fd..60bd9ceaf9ee 100644
 | |
| --- content/browser/web_contents/web_contents_view_aura.h
 | |
| +++ content/browser/web_contents/web_contents_view_aura.h
 | |
| @@ -114,7 +114,7 @@ class CONTENT_EXPORT WebContentsViewAura
 | |
|                    gfx::NativeView context) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForWidget(
 | |
|        RenderWidgetHost* render_widget_host,
 | |
| -      bool is_guest_view_hack) override;
 | |
| +      RenderWidgetHost* embedder_render_widget_host) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForPopupWidget(
 | |
|        RenderWidgetHost* render_widget_host) override;
 | |
|    void SetPageTitle(const base::string16& title) override;
 | |
| diff --git content/browser/web_contents/web_contents_view_child_frame.cc content/browser/web_contents/web_contents_view_child_frame.cc
 | |
| index e95c31d677f5..2e14ca1fabcf 100644
 | |
| --- content/browser/web_contents/web_contents_view_child_frame.cc
 | |
| +++ content/browser/web_contents/web_contents_view_child_frame.cc
 | |
| @@ -84,7 +84,7 @@ void WebContentsViewChildFrame::CreateView(const gfx::Size& initial_size,
 | |
|  
 | |
|  RenderWidgetHostViewBase* WebContentsViewChildFrame::CreateViewForWidget(
 | |
|      RenderWidgetHost* render_widget_host,
 | |
| -    bool is_guest_view_hack) {
 | |
| +    RenderWidgetHost* embedder_render_widget_host) {
 | |
|    return RenderWidgetHostViewChildFrame::Create(render_widget_host);
 | |
|  }
 | |
|  
 | |
| diff --git content/browser/web_contents/web_contents_view_child_frame.h content/browser/web_contents/web_contents_view_child_frame.h
 | |
| index 17275be93025..6c73effc578b 100644
 | |
| --- content/browser/web_contents/web_contents_view_child_frame.h
 | |
| +++ content/browser/web_contents/web_contents_view_child_frame.h
 | |
| @@ -40,7 +40,7 @@ class WebContentsViewChildFrame : public WebContentsView,
 | |
|                    gfx::NativeView context) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForWidget(
 | |
|        RenderWidgetHost* render_widget_host,
 | |
| -      bool is_guest_view_hack) override;
 | |
| +      RenderWidgetHost* embedder_render_widget_host) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForPopupWidget(
 | |
|        RenderWidgetHost* render_widget_host) override;
 | |
|    void SetPageTitle(const base::string16& title) override;
 | |
| diff --git content/browser/web_contents/web_contents_view_guest.cc content/browser/web_contents/web_contents_view_guest.cc
 | |
| index f6a43ca61131..21b61264d99f 100644
 | |
| --- content/browser/web_contents/web_contents_view_guest.cc
 | |
| +++ content/browser/web_contents/web_contents_view_guest.cc
 | |
| @@ -67,6 +67,8 @@ gfx::NativeWindow WebContentsViewGuest::GetTopLevelNativeWindow() const {
 | |
|  
 | |
|  void WebContentsViewGuest::OnGuestAttached(WebContentsView* parent_view) {
 | |
|  #if defined(USE_AURA)
 | |
| +  if (!platform_view_->GetNativeView())
 | |
| +    return;
 | |
|    // In aura, ScreenPositionClient doesn't work properly if we do
 | |
|    // not have the native view associated with this WebContentsViewGuest in the
 | |
|    // view hierarchy. We add this view as embedder's child here.
 | |
| @@ -78,6 +80,8 @@ void WebContentsViewGuest::OnGuestAttached(WebContentsView* parent_view) {
 | |
|  }
 | |
|  
 | |
|  void WebContentsViewGuest::OnGuestDetached(WebContentsView* old_parent_view) {
 | |
| +  if (!platform_view_->GetNativeView())
 | |
| +    return;
 | |
|  #if defined(USE_AURA)
 | |
|    if (features::IsAshInBrowserProcess()) {
 | |
|      old_parent_view->GetNativeView()->RemoveChild(
 | |
| @@ -132,7 +136,8 @@ void WebContentsViewGuest::CreateView(const gfx::Size& initial_size,
 | |
|  }
 | |
|  
 | |
|  RenderWidgetHostViewBase* WebContentsViewGuest::CreateViewForWidget(
 | |
| -    RenderWidgetHost* render_widget_host, bool is_guest_view_hack) {
 | |
| +    RenderWidgetHost* render_widget_host,
 | |
| +    RenderWidgetHost* embedder_render_widget_host) {
 | |
|    if (render_widget_host->GetView()) {
 | |
|      // During testing, the view will already be set up in most cases to the
 | |
|      // test view, so we don't want to clobber it with a real one. To verify that
 | |
| @@ -144,11 +149,19 @@ RenderWidgetHostViewBase* WebContentsViewGuest::CreateViewForWidget(
 | |
|          render_widget_host->GetView());
 | |
|    }
 | |
|  
 | |
| +  embedder_render_widget_host =
 | |
| +      guest_->embedder_web_contents()->GetRenderViewHost()->GetWidget();
 | |
|    RenderWidgetHostViewBase* platform_widget =
 | |
| -      platform_view_->CreateViewForWidget(render_widget_host, true);
 | |
| +      platform_view_->CreateViewForWidget(render_widget_host,
 | |
| +                                          embedder_render_widget_host);
 | |
|  
 | |
| -  return RenderWidgetHostViewGuest::Create(render_widget_host, guest_,
 | |
| -                                           platform_widget->GetWeakPtr());
 | |
| +  RenderWidgetHostViewGuest* guest_view =
 | |
| +      RenderWidgetHostViewGuest::Create(render_widget_host, guest_,
 | |
| +                                        platform_widget->GetWeakPtr());
 | |
| +  platform_widget->InitAsGuest(embedder_render_widget_host->GetView(),
 | |
| +                               guest_view);
 | |
| +
 | |
| +  return guest_view;
 | |
|  }
 | |
|  
 | |
|  RenderWidgetHostViewBase* WebContentsViewGuest::CreateViewForPopupWidget(
 | |
| diff --git content/browser/web_contents/web_contents_view_guest.h content/browser/web_contents/web_contents_view_guest.h
 | |
| index 4a06fe5f6880..ecad941c2638 100644
 | |
| --- content/browser/web_contents/web_contents_view_guest.h
 | |
| +++ content/browser/web_contents/web_contents_view_guest.h
 | |
| @@ -58,7 +58,7 @@ class WebContentsViewGuest : public WebContentsView,
 | |
|                    gfx::NativeView context) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForWidget(
 | |
|        RenderWidgetHost* render_widget_host,
 | |
| -      bool is_guest_view_hack) override;
 | |
| +      RenderWidgetHost* embedder_render_widget_host) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForPopupWidget(
 | |
|        RenderWidgetHost* render_widget_host) override;
 | |
|    void SetPageTitle(const base::string16& title) override;
 | |
| diff --git content/browser/web_contents/web_contents_view_mac.h content/browser/web_contents/web_contents_view_mac.h
 | |
| index 4640550b8484..efa2496b6317 100644
 | |
| --- content/browser/web_contents/web_contents_view_mac.h
 | |
| +++ content/browser/web_contents/web_contents_view_mac.h
 | |
| @@ -93,7 +93,7 @@ class WebContentsViewMac : public WebContentsView,
 | |
|                    gfx::NativeView context) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForWidget(
 | |
|        RenderWidgetHost* render_widget_host,
 | |
| -      bool is_guest_view_hack) override;
 | |
| +      RenderWidgetHost* embedder_render_widget_host) override;
 | |
|    RenderWidgetHostViewBase* CreateViewForPopupWidget(
 | |
|        RenderWidgetHost* render_widget_host) override;
 | |
|    void SetPageTitle(const base::string16& title) override;
 | |
| diff --git content/browser/web_contents/web_contents_view_mac.mm content/browser/web_contents/web_contents_view_mac.mm
 | |
| index 00b2d2a729da..cb8a81ed8ee2 100644
 | |
| --- content/browser/web_contents/web_contents_view_mac.mm
 | |
| +++ content/browser/web_contents/web_contents_view_mac.mm
 | |
| @@ -348,7 +348,8 @@ void WebContentsViewMac::CreateView(
 | |
|  }
 | |
|  
 | |
|  RenderWidgetHostViewBase* WebContentsViewMac::CreateViewForWidget(
 | |
| -    RenderWidgetHost* render_widget_host, bool is_guest_view_hack) {
 | |
| +    RenderWidgetHost* render_widget_host,
 | |
| +    RenderWidgetHost* embedder_render_widget_host) {
 | |
|    if (render_widget_host->GetView()) {
 | |
|      // During testing, the view will already be set up in most cases to the
 | |
|      // test view, so we don't want to clobber it with a real one. To verify that
 | |
| @@ -360,6 +361,7 @@ RenderWidgetHostViewBase* WebContentsViewMac::CreateViewForWidget(
 | |
|          render_widget_host->GetView());
 | |
|    }
 | |
|  
 | |
| +  const bool is_guest_view_hack = !!embedder_render_widget_host;
 | |
|    RenderWidgetHostViewMac* view =
 | |
|        g_create_render_widget_host_view
 | |
|            ? g_create_render_widget_host_view(render_widget_host,
 | |
| diff --git content/public/browser/browser_plugin_guest_delegate.h content/public/browser/browser_plugin_guest_delegate.h
 | |
| index d05dd5421458..fa13775f0512 100644
 | |
| --- content/public/browser/browser_plugin_guest_delegate.h
 | |
| +++ content/public/browser/browser_plugin_guest_delegate.h
 | |
| @@ -19,6 +19,7 @@ namespace content {
 | |
|  class GuestHost;
 | |
|  class RenderWidgetHost;
 | |
|  class SiteInstance;
 | |
| +class WebContentsView;
 | |
|  
 | |
|  // Objects implement this interface to get notified about changes in the guest
 | |
|  // WebContents and to provide necessary functionality.
 | |
| @@ -67,6 +68,10 @@ class CONTENT_EXPORT BrowserPluginGuestDelegate {
 | |
|    // content module.
 | |
|    virtual void SetGuestHost(GuestHost* guest_host) {}
 | |
|  
 | |
| +  // Called when a guest is attached or detached.
 | |
| +  virtual void OnGuestAttached(content::WebContentsView* parent_view) {}
 | |
| +  virtual void OnGuestDetached(content::WebContentsView* parent_view) {}
 | |
| +
 | |
|    // TODO(ekaramad): A short workaround to force some types of guests to use
 | |
|    // a BrowserPlugin even when we are using cross process frames for guests. It
 | |
|    // should be removed after resolving https://crbug.com/642826).
 | |
| diff --git extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
 | |
| index 5adcb212aaaf..c899de6d9a80 100644
 | |
| --- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
 | |
| +++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
 | |
| @@ -193,6 +193,8 @@ void MimeHandlerViewGuest::CreateWebContents(
 | |
|    WebContents::CreateParams params(browser_context(),
 | |
|                                     guest_site_instance.get());
 | |
|    params.guest_delegate = this;
 | |
| +  if (delegate_)
 | |
| +    delegate_->OverrideWebContentsCreateParams(¶ms);
 | |
|    // TODO(erikchen): Fix ownership semantics for guest views.
 | |
|    // https://crbug.com/832879.
 | |
|    std::move(callback).Run(
 | |
| @@ -232,6 +234,18 @@ bool MimeHandlerViewGuest::ShouldDestroyOnDetach() const {
 | |
|    return true;
 | |
|  }
 | |
|  
 | |
| +void MimeHandlerViewGuest::OnGuestAttached(
 | |
| +    content::WebContentsView* parent_view) {
 | |
| +  if (delegate_)
 | |
| +    delegate_->OnGuestAttached(parent_view);
 | |
| +}
 | |
| +
 | |
| +void MimeHandlerViewGuest::OnGuestDetached(
 | |
| +    content::WebContentsView* parent_view) {
 | |
| +  if (delegate_)
 | |
| +    delegate_->OnGuestDetached(parent_view);
 | |
| +}
 | |
| +
 | |
|  WebContents* MimeHandlerViewGuest::OpenURLFromTab(
 | |
|      WebContents* source,
 | |
|      const content::OpenURLParams& params) {
 | |
| diff --git extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
 | |
| index adcb0864ba28..f0ba4efc277a 100644
 | |
| --- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
 | |
| +++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
 | |
| @@ -108,6 +108,10 @@ class MimeHandlerViewGuest :
 | |
|    bool ZoomPropagatesFromEmbedderToGuest() const final;
 | |
|    bool ShouldDestroyOnDetach() const final;
 | |
|  
 | |
| +  // content::BrowserPluginGuestDelegate implementation
 | |
| +  void OnGuestAttached(content::WebContentsView* parent_view) override;
 | |
| +  void OnGuestDetached(content::WebContentsView* parent_view) override;
 | |
| +
 | |
|    // WebContentsDelegate implementation.
 | |
|    content::WebContents* OpenURLFromTab(
 | |
|        content::WebContents* source,
 | |
| diff --git extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h
 | |
| index 0928bf2f44da..e9542785ec8a 100644
 | |
| --- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h
 | |
| +++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h
 | |
| @@ -6,9 +6,9 @@
 | |
|  #define EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_
 | |
|  
 | |
|  #include "base/macros.h"
 | |
| +#include "content/public/browser/web_contents.h"
 | |
|  
 | |
|  namespace content {
 | |
| -class WebContents;
 | |
|  struct ContextMenuParams;
 | |
|  }  // namespace content
 | |
|  
 | |
| @@ -20,6 +20,14 @@ class MimeHandlerViewGuestDelegate {
 | |
|    MimeHandlerViewGuestDelegate() {}
 | |
|    virtual ~MimeHandlerViewGuestDelegate() {}
 | |
|  
 | |
| +  // Provides an opportunity to supply a custom view implementation.
 | |
| +  virtual void OverrideWebContentsCreateParams(
 | |
| +      content::WebContents::CreateParams* params) {}
 | |
| +
 | |
| +  // Called when a guest is attached or detached.
 | |
| +  virtual void OnGuestAttached(content::WebContentsView* parent_view) {}
 | |
| +  virtual void OnGuestDetached(content::WebContentsView* parent_view) {}
 | |
| +
 | |
|    // Handles context menu, or returns false if unhandled.
 | |
|    virtual bool HandleContextMenu(content::WebContents* web_contents,
 | |
|                                   const content::ContextMenuParams& params);
 |