Pass the right WebWidget to RenderWidget.

Previously, a WebViewImpl was being passed as a WebWidget to RenderWidget, even
though WebViewImpl shouldn't even be a WebWidget. This CL passes a
WebViewFrameWidget to RenderWidget.

This CL begins, but does not finish fixing RenderWidget usage of WebWidget. The
implementation of RenderWidget still fetches the WebView's MainFrameWidget,
which is still a reference to a WebView.

Change-Id: I62a44f50eba231e0096ebb5e5e353d3fbc7fb85d
Bug: 995981, 419087
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1764611
Commit-Queue: Erik Chen <erikchen@chromium.org>
Commit-Queue: Daniel Cheng <dcheng@chromium.org>
Auto-Submit: Erik Chen <erikchen@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#689720}
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 33bc68ee..d3af84b 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1470,8 +1470,7 @@
   auto* web_frame_widget = blink::WebFrameWidget::CreateForMainFrame(
       render_view->GetWidget(), web_frame);
 
-  render_widget->Init(std::move(show_callback),
-                      render_view->webview()->MainFrameWidget());
+  render_widget->Init(std::move(show_callback), web_frame_widget);
 
   render_view->AttachWebFrameWidget(web_frame_widget);
   // TODO(crbug.com/419087): This was added in 6ccadf770766e89c3 to prevent an
diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm
index 9da1eb2..9c243947 100644
--- a/content/renderer/render_view_browsertest_mac.mm
+++ b/content/renderer/render_view_browsertest_mac.mm
@@ -165,7 +165,7 @@
       main_frame->GetRoutingID(), 123, true, FrameReplicationState()));
 
   // We no longer have a frame widget.
-  EXPECT_FALSE(GetWebWidget()->IsWebFrameWidget());
+  EXPECT_FALSE(GetWebWidget());
 
   int routing_id = view->GetRoutingID();
   // Now simulate some TextInputClientMac IPCs. These will be handled by
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 90bf220..3be1be68 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1524,6 +1524,7 @@
   // The previous WebFrameWidget must already be detached by CloseForFrame().
   DCHECK(!frame_widget_);
   frame_widget_ = frame_widget;
+  GetWidget()->SetWebWidgetInternal(frame_widget);
 
   // Initialization for the WebFrameWidget that should only occur for the main
   // frame, and that uses types not allowed in blink. This should maybe be
@@ -1539,6 +1540,9 @@
   DCHECK(frame_widget_);
   frame_widget_->Close();
   frame_widget_ = nullptr;
+
+  // This just clears the webwidget_internal_ member from RenderWidget.
+  GetWidget()->SetWebWidgetInternal(nullptr);
 }
 
 void RenderViewImpl::SetZoomLevel(double zoom_level) {
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 1b7e8547..bc9ea8c 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -3871,4 +3871,8 @@
   return weak_ptr_factory_.GetWeakPtr();
 }
 
+void RenderWidget::SetWebWidgetInternal(blink::WebWidget* web_widget) {
+  webwidget_internal_ = web_widget;
+}
+
 }  // namespace content
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index a3e8ae6..b35d5f83a 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -708,6 +708,12 @@
 
   base::WeakPtr<RenderWidget> AsWeakPtr();
 
+  // TODO(https://crbug.com/995981): Eventually, the lifetime of RenderWidget
+  // should be tied to the lifetime of the WebWidget. In the short term, for
+  // main frames, the RenderView has to explicitly set/unset the WebWidget on
+  // attach/detach.
+  void SetWebWidgetInternal(blink::WebWidget* web_widget);
+
  protected:
   // Notify subclasses that we initiated the paint operation.
   virtual void DidInitiatePaint() {}
diff --git a/content/renderer/text_input_client_observer.cc b/content/renderer/text_input_client_observer.cc
index 21c4924..757411ee 100644
--- a/content/renderer/text_input_client_observer.cc
+++ b/content/renderer/text_input_client_observer.cc
@@ -81,7 +81,10 @@
   // case there is actually a WebFrameWidget to be used. In the future we should
   // separate these states and then this can return null if frozen *and there is
   // no provisional main frame attached to the RenderWidget*.
-  if (!widget->IsWebFrameWidget())
+  // TODO(https://crbug.com/995981): The lifetime of the WebFrameWidget should
+  // eventually be tied to the lifetime of the RenderWidget so we should not
+  // need a null !widget check.
+  if (!widget || !widget->IsWebFrameWidget())
     return nullptr;
   return static_cast<blink::WebFrameWidget*>(widget);
 }
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
index f99e3bdfe..8f7e233 100644
--- a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
+++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
@@ -171,10 +171,8 @@
   return web_view_->ScrollFocusedEditableElementIntoView();
 }
 
-void WebViewFrameWidget::SetAnimationHost(cc::AnimationHost*) {
-  // The WebViewImpl already has its AnimationHost, the WebWidgetClient thus
-  // does not initialize and set another one here.
-  NOTREACHED();
+void WebViewFrameWidget::SetAnimationHost(cc::AnimationHost* host) {
+  web_view_->SetAnimationHost(host);
 }
 
 void WebViewFrameWidget::SetRootGraphicsLayer(GraphicsLayer* layer) {