Move SetBackgroundColor handling from RenderViewImpl to RenderWidget
The SetBackgroundColor IPC has been recently moved from RenderView
to RenderWidget, but the RenderWidget still delegates handling of it
back to the RenderView. The RenderView then sets the background color
on its |frame_widget_| which is a WebFrameWidget attached to it in
RenderViewImpl::Initialize() via RenderFrameImpl::CreateMainFrame().
All RenderViewImpls do have a frame_widget_, since RenderViewImpl
ends up setting that. So RenderWidget::GetWebWidget() will always
return that frame_widget_ once RenderViewImpl::Initialize() has
completed. There is a space of time after RenderWidget::Init()
but inside RenderViewImpl::Initialize() where it would return
a different WebWidget (the WebWidget on the WebViewImpl directly),
but SetBackgroundOpaque IPC will not be received and handled during
that time.
So it is safe to use the frame_widget_ from the RenderViewImpl via
RenderWidget::GetWebWidget() directly. And thus RenderWidget can
set the background opaque on its WebFrameWidget without going
through RenderViewImpl (other than to get the WebWidget).
[email protected]
Bug: 419087
Change-Id: I65bf680a24a6312f1c1d569d2023666cbc53e8f6
Reviewed-on: https://chromium-review.googlesource.com/1239169
Reviewed-by: Avi Drissman <[email protected]>
Commit-Queue: danakj <[email protected]>
Cr-Commit-Position: refs/heads/master@{#594058}
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 16ee5cf..77f9bd6 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -912,8 +912,24 @@
}
void RenderWidget::OnSetBackgroundOpaque(bool opaque) {
- if (owner_delegate_)
- owner_delegate_->SetBackgroundOpaqueForWidget(opaque);
+ // Background opaque-ness modification is only supported for the main frame.
+ // The |owner_delegate_| is used as proxy for this RenderWidget being attached
+ // to the main frame.
+ if (!owner_delegate_)
+ return;
+
+ blink::WebWidget* web_widget = GetWebWidget();
+ // This is true since we only do this for RenderWidgets attached to the main
+ // frame.
+ DCHECK(web_widget->IsWebFrameWidget());
+ auto* web_frame_widget = static_cast<blink::WebFrameWidget*>(web_widget);
+ if (opaque) {
+ web_frame_widget->ClearBaseBackgroundColorOverride();
+ web_frame_widget->ClearBackgroundColorOverride();
+ } else {
+ web_frame_widget->SetBaseBackgroundColorOverride(SK_ColorTRANSPARENT);
+ web_frame_widget->SetBackgroundColorOverride(SK_ColorTRANSPARENT);
+ }
}
void RenderWidget::OnSetFocus(bool enable) {