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) {