web_contents.patch 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Anonymous <[email protected]>
  3. Date: Thu, 20 Sep 2018 17:46:53 -0700
  4. Subject: web_contents.patch
  5. diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
  6. index fbc1dc348385a9a1b97405342ded52e2308baf2c..b894dbb3d435ed3302bdd8e667ac0e628404a932 100644
  7. --- a/content/browser/web_contents/web_contents_impl.cc
  8. +++ b/content/browser/web_contents/web_contents_impl.cc
  9. @@ -2137,6 +2137,12 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
  10. std::string unique_name;
  11. frame_tree_.root()->SetFrameName(params.main_frame_name, unique_name);
  12. + if (params.view && params.delegate_view) {
  13. + view_.reset(params.view);
  14. + render_view_host_delegate_view_ = params.delegate_view;
  15. + }
  16. +
  17. + if (!view_) {
  18. WebContentsViewDelegate* delegate =
  19. GetContentClient()->browser()->GetWebContentsViewDelegate(this);
  20. @@ -2152,6 +2158,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
  21. &render_view_host_delegate_view_);
  22. }
  23. }
  24. + } // !view_
  25. CHECK(render_view_host_delegate_view_);
  26. CHECK(view_.get());
  27. diff --git a/content/browser/web_contents/web_contents_view_guest.cc b/content/browser/web_contents/web_contents_view_guest.cc
  28. index ecaf30bcb7b916a92a69641dd7b96a3633d407c0..0af625928ca6227a21cd4263a14a42b72095399c 100644
  29. --- a/content/browser/web_contents/web_contents_view_guest.cc
  30. +++ b/content/browser/web_contents/web_contents_view_guest.cc
  31. @@ -68,19 +68,27 @@ gfx::NativeWindow WebContentsViewGuest::GetTopLevelNativeWindow() const {
  32. void WebContentsViewGuest::OnGuestAttached(WebContentsView* parent_view) {
  33. #if defined(USE_AURA)
  34. + if (!platform_view_->GetNativeView())
  35. + return;
  36. // In aura, ScreenPositionClient doesn't work properly if we do
  37. // not have the native view associated with this WebContentsViewGuest in the
  38. // view hierarchy. We add this view as embedder's child here.
  39. // This would go in WebContentsViewGuest::CreateView, but that is too early to
  40. // access embedder_web_contents(). Therefore, we do it here.
  41. - parent_view->GetNativeView()->AddChild(platform_view_->GetNativeView());
  42. + if (parent_view->GetNativeView() != platform_view_->GetNativeView()) {
  43. + parent_view->GetNativeView()->AddChild(platform_view_->GetNativeView());
  44. + }
  45. #endif // defined(USE_AURA)
  46. }
  47. void WebContentsViewGuest::OnGuestDetached(WebContentsView* old_parent_view) {
  48. #if defined(USE_AURA)
  49. - old_parent_view->GetNativeView()->RemoveChild(
  50. - platform_view_->GetNativeView());
  51. + if (!platform_view_->GetNativeView())
  52. + return;
  53. + if (old_parent_view->GetNativeView() != platform_view_->GetNativeView()) {
  54. + old_parent_view->GetNativeView()->RemoveChild(
  55. + platform_view_->GetNativeView());
  56. + }
  57. #endif // defined(USE_AURA)
  58. }
  59. @@ -132,11 +140,22 @@ RenderWidgetHostViewBase* WebContentsViewGuest::CreateViewForWidget(
  60. render_widget_host->GetView());
  61. }
  62. + RenderWidgetHost* embedder_render_widget_host =
  63. + guest_->embedder_web_contents()->GetRenderViewHost()->GetWidget();
  64. + RenderWidgetHostViewBase* embedder_render_widget_host_view =
  65. + static_cast<RenderWidgetHostViewBase*>(
  66. + embedder_render_widget_host->GetView());
  67. RenderWidgetHostViewBase* platform_widget =
  68. - platform_view_->CreateViewForWidget(render_widget_host, true);
  69. -
  70. - return RenderWidgetHostViewGuest::Create(render_widget_host, guest_,
  71. - platform_widget->GetWeakPtr());
  72. + embedder_render_widget_host_view->CreateViewForWidget(
  73. + render_widget_host,
  74. + embedder_render_widget_host,
  75. + platform_view_.get());
  76. + RenderWidgetHostViewGuest* guest_view = RenderWidgetHostViewGuest::Create(
  77. + render_widget_host, guest_, platform_widget->GetWeakPtr());
  78. + platform_widget->InitAsGuest(embedder_render_widget_host->GetView(),
  79. + guest_view);
  80. +
  81. + return guest_view;
  82. }
  83. RenderWidgetHostViewBase* WebContentsViewGuest::CreateViewForChildWidget(
  84. diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
  85. index b5ff1cc5d6f60d22839b9bc06ab4e2c55d9cc6c7..d22f0dcefa2a8ccb13d4d993bc37241beb664757 100644
  86. --- a/content/public/browser/web_contents.h
  87. +++ b/content/public/browser/web_contents.h
  88. @@ -78,9 +78,12 @@ class BrowserPluginGuestDelegate;
  89. class InterstitialPage;
  90. class RenderFrameHost;
  91. class RenderViewHost;
  92. +class RenderViewHostDelegateView;
  93. class RenderWidgetHost;
  94. class RenderWidgetHostView;
  95. +class RenderWidgetHostViewBase;
  96. class WebContentsDelegate;
  97. +class WebContentsView;
  98. struct CustomContextMenuContext;
  99. struct DropData;
  100. struct MHTMLGenerationParams;
  101. @@ -216,6 +219,10 @@ class WebContents : public PageNavigator,
  102. kInitializeAndWarmupRendererProcess,
  103. } desired_renderer_state;
  104. + // Optionally specify the view and delegate view.
  105. + content::WebContentsView* view = nullptr;
  106. + content::RenderViewHostDelegateView* delegate_view = nullptr;
  107. +
  108. // Sandboxing flags set on the new WebContents.
  109. blink::WebSandboxFlags starting_sandbox_flags;