cef/patch/patches/browser_plugin_guest_1565.p...

345 lines
17 KiB
Diff
Raw Normal View History

2017-02-10 23:44:11 +01:00
diff --git content/browser/browser_plugin/browser_plugin_guest.cc content/browser/browser_plugin/browser_plugin_guest.cc
index 5ec2e8461380..4ba494dad4ba 100644
2017-02-10 23:44:11 +01:00
--- content/browser/browser_plugin/browser_plugin_guest.cc
+++ content/browser/browser_plugin/browser_plugin_guest.cc
@@ -348,8 +348,11 @@ void BrowserPluginGuest::InitInternal(
2017-02-10 23:44:11 +01:00
static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
}
2017-02-10 23:44:11 +01:00
- 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.
@@ -862,10 +865,19 @@ void BrowserPluginGuest::OnWillAttachComplete(
2017-02-10 23:44:11 +01:00
static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
if (!web_contents()->GetRenderViewHost()->GetWidget()->GetView()) {
2017-02-10 23:44:11 +01:00
web_contents_view->CreateViewForWidget(
- web_contents()->GetRenderViewHost()->GetWidget(), true);
2017-02-10 23:44:11 +01:00
+ 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;
2017-02-10 23:44:11 +01:00
diff --git content/browser/frame_host/interstitial_page_impl.cc content/browser/frame_host/interstitial_page_impl.cc
index dbc6281ef737..e413bf418b25 100644
2017-02-10 23:44:11 +01:00
--- content/browser/frame_host/interstitial_page_impl.cc
+++ content/browser/frame_host/interstitial_page_impl.cc
@@ -632,7 +632,7 @@ WebContentsView* InterstitialPageImpl::CreateWebContentsView() {
2017-02-10 23:44:11 +01:00
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);
2017-02-10 23:44:11 +01:00
diff --git content/browser/web_contents/web_contents_view.h content/browser/web_contents/web_contents_view.h
index 5426d600906c..4bf4537514eb 100644
2017-02-10 23:44:11 +01:00
--- 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 {
2017-02-10 23:44:11 +01:00
// 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 non-top-level widget and receives messages
// for it.
2017-02-10 23:44:11 +01:00
diff --git content/browser/web_contents/web_contents_view_aura.cc content/browser/web_contents/web_contents_view_aura.cc
index 3ae2cd85d98e..d1eaec9bd939 100644
2017-02-10 23:44:11 +01:00
--- content/browser/web_contents/web_contents_view_aura.cc
+++ content/browser/web_contents/web_contents_view_aura.cc
@@ -867,7 +867,8 @@ void WebContentsViewAura::CreateView(const gfx::Size& initial_size,
2017-02-10 23:44:11 +01:00
}
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
@@ -879,6 +880,7 @@ RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget(
render_widget_host->GetView());
2017-02-10 23:44:11 +01:00
}
+ const bool is_guest_view_hack = !!embedder_render_widget_host;
2017-02-10 23:44:11 +01:00
RenderWidgetHostViewAura* view =
g_create_render_widget_host_view
? g_create_render_widget_host_view(render_widget_host,
2017-02-10 23:44:11 +01:00
diff --git content/browser/web_contents/web_contents_view_aura.h content/browser/web_contents/web_contents_view_aura.h
index c917d912bbdf..36b9d9b8e3e9 100644
2017-02-10 23:44:11 +01:00
--- content/browser/web_contents/web_contents_view_aura.h
+++ content/browser/web_contents/web_contents_view_aura.h
@@ -110,7 +110,7 @@ class CONTENT_EXPORT WebContentsViewAura
2017-02-10 23:44:11 +01:00
gfx::NativeView context) override;
RenderWidgetHostViewBase* CreateViewForWidget(
RenderWidgetHost* render_widget_host,
- bool is_guest_view_hack) override;
+ RenderWidgetHost* embedder_render_widget_host) override;
RenderWidgetHostViewBase* CreateViewForChildWidget(
2017-02-10 23:44:11 +01:00
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 7b339bf9407a..ffb0668ecf74 100644
2017-02-10 23:44:11 +01:00
--- 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,
2017-02-10 23:44:11 +01:00
RenderWidgetHostViewBase* WebContentsViewChildFrame::CreateViewForWidget(
RenderWidgetHost* render_widget_host,
- bool is_guest_view_hack) {
+ RenderWidgetHost* embedder_render_widget_host) {
return RenderWidgetHostViewChildFrame::Create(render_widget_host);
}
2017-02-10 23:44:11 +01:00
diff --git content/browser/web_contents/web_contents_view_child_frame.h content/browser/web_contents/web_contents_view_child_frame.h
index e82cced4364b..7ed27a6b39b3 100644
2017-02-10 23:44:11 +01:00
--- 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,
2017-02-10 23:44:11 +01:00
gfx::NativeView context) override;
RenderWidgetHostViewBase* CreateViewForWidget(
RenderWidgetHost* render_widget_host,
- bool is_guest_view_hack) override;
+ RenderWidgetHost* embedder_render_widget_host) override;
RenderWidgetHostViewBase* CreateViewForChildWidget(
2017-02-10 23:44:11 +01:00
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 5de4d7cf8a7a..e24e5c88d8dc 100644
2017-02-10 23:44:11 +01:00
--- content/browser/web_contents/web_contents_view_guest.cc
+++ content/browser/web_contents/web_contents_view_guest.cc
@@ -69,6 +69,8 @@ gfx::NativeWindow WebContentsViewGuest::GetTopLevelNativeWindow() const {
2017-02-10 23:44:11 +01:00
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.
@@ -80,6 +82,8 @@ void WebContentsViewGuest::OnGuestAttached(WebContentsView* parent_view) {
}
2017-02-10 23:44:11 +01:00
void WebContentsViewGuest::OnGuestDetached(WebContentsView* old_parent_view) {
+ if (!platform_view_->GetNativeView())
+ return;
#if defined(USE_AURA)
if (!features::IsMultiProcessMash()) {
old_parent_view->GetNativeView()->RemoveChild(
@@ -124,7 +128,8 @@ void WebContentsViewGuest::CreateView(const gfx::Size& initial_size,
2017-02-10 23:44:11 +01:00
}
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
@@ -136,11 +141,19 @@ RenderWidgetHostViewBase* WebContentsViewGuest::CreateViewForWidget(
2017-02-10 23:44:11 +01:00
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);
+
2017-02-10 23:44:11 +01:00
+ return guest_view;
}
RenderWidgetHostViewBase* WebContentsViewGuest::CreateViewForChildWidget(
2017-02-10 23:44:11 +01:00
diff --git content/browser/web_contents/web_contents_view_guest.h content/browser/web_contents/web_contents_view_guest.h
index 1f0e661628aa..f896c842ff0d 100644
2017-02-10 23:44:11 +01:00
--- 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,
2017-02-10 23:44:11 +01:00
gfx::NativeView context) override;
RenderWidgetHostViewBase* CreateViewForWidget(
RenderWidgetHost* render_widget_host,
- bool is_guest_view_hack) override;
+ RenderWidgetHost* embedder_render_widget_host) override;
RenderWidgetHostViewBase* CreateViewForChildWidget(
2017-02-10 23:44:11 +01:00
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 c0c553023138..39b8fe0bd57c 100644
2017-02-10 23:44:11 +01:00
--- content/browser/web_contents/web_contents_view_mac.h
+++ content/browser/web_contents/web_contents_view_mac.h
@@ -74,7 +74,7 @@ class WebContentsViewMac : public WebContentsView,
2017-02-10 23:44:11 +01:00
gfx::NativeView context) override;
RenderWidgetHostViewBase* CreateViewForWidget(
RenderWidgetHost* render_widget_host,
- bool is_guest_view_hack) override;
+ RenderWidgetHost* embedder_render_widget_host) override;
RenderWidgetHostViewBase* CreateViewForChildWidget(
2017-02-10 23:44:11 +01:00
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 7f4308b56a14..d17b8b8ef44d 100644
2017-02-10 23:44:11 +01:00
--- content/browser/web_contents/web_contents_view_mac.mm
+++ content/browser/web_contents/web_contents_view_mac.mm
@@ -312,7 +312,8 @@ void WebContentsViewMac::CreateView(
2017-02-10 23:44:11 +01:00
}
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
@@ -324,6 +325,7 @@ RenderWidgetHostViewBase* WebContentsViewMac::CreateViewForWidget(
render_widget_host->GetView());
2017-02-10 23:44:11 +01:00
}
+ 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,
2017-02-10 23:44:11 +01:00
diff --git content/public/browser/browser_plugin_guest_delegate.h content/public/browser/browser_plugin_guest_delegate.h
index bf2226b53dd7..782a320ab788 100644
2017-02-10 23:44:11 +01:00
--- 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.
2017-02-10 23:44:11 +01:00
+ 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).
2017-02-10 23:44:11 +01:00
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 7a1f8c1caffd..a6bff0e50a04 100644
2017-02-10 23:44:11 +01:00
--- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
+++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
@@ -208,6 +208,8 @@ void MimeHandlerViewGuest::CreateWebContents(
2017-02-10 23:44:11 +01:00
WebContents::CreateParams params(browser_context(),
guest_site_instance.get());
params.guest_delegate = this;
+ if (delegate_)
+ delegate_->OverrideWebContentsCreateParams(&params);
// TODO(erikchen): Fix ownership semantics for guest views.
// https://crbug.com/832879.
std::move(callback).Run(
@@ -252,6 +254,18 @@ bool MimeHandlerViewGuest::ShouldDestroyOnDetach() const {
return true;
2017-02-10 23:44:11 +01:00
}
+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 cfa759b4b826..4d53d6bcc492 100644
2017-02-10 23:44:11 +01:00
--- extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
+++ extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
@@ -114,6 +114,10 @@ class MimeHandlerViewGuest
2017-02-10 23:44:11 +01:00
bool ZoomPropagatesFromEmbedderToGuest() const final;
bool ShouldDestroyOnDetach() const final;
2017-02-10 23:44:11 +01:00
+ // 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
2017-02-10 23:44:11 +01:00
--- 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 {
2017-02-10 23:44:11 +01:00
MimeHandlerViewGuestDelegate() {}
virtual ~MimeHandlerViewGuestDelegate() {}
2017-02-10 23:44:11 +01:00
+ // 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) {}
+
2017-02-10 23:44:11 +01:00
// Handles context menu, or returns false if unhandled.
virtual bool HandleContextMenu(content::WebContents* web_contents,
const content::ContextMenuParams& params);