Commit 0e432e4d authored by Stefan Zager's avatar Stefan Zager Committed by Chromium LUCI CQ

Don't let blink compositor set contents_opaque for remote frames

Currently, the only case where remote frames let the blink compositor
set contents_opaque for a remote frame is when displaying the sad
tab graphic for a crashed frame. The sad tab graphic is not opaque,
and we shouldn't ever set contents_opaque on its layer, regardless of
the style of its containing <iframe> element.

Bug: 1069546

Change-Id: I04636d2b6cead84d224913563fd6e9bab34069d1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2606659Reviewed-by: default avatardanakj <danakj@chromium.org>
Reviewed-by: default avatarXianzhu Wang <wangxianzhu@chromium.org>
Commit-Queue: Stefan Zager <szager@chromium.org>
Cr-Commit-Position: refs/heads/master@{#840045}
parent 453cf195
...@@ -42,10 +42,8 @@ void ChildFrameCompositingHelper::ChildFrameGone( ...@@ -42,10 +42,8 @@ void ChildFrameCompositingHelper::ChildFrameGone(
crash_ui_layer_->SetMasksToBounds(true); crash_ui_layer_->SetMasksToBounds(true);
crash_ui_layer_->SetIsDrawable(true); crash_ui_layer_->SetIsDrawable(true);
bool prevent_contents_opaque_changes = false;
bool is_surface_layer = false; bool is_surface_layer = false;
child_frame_compositor_->SetLayer( child_frame_compositor_->SetLayer(crash_ui_layer_, is_surface_layer);
crash_ui_layer_, prevent_contents_opaque_changes, is_surface_layer);
} }
void ChildFrameCompositingHelper::SetSurfaceId( void ChildFrameCompositingHelper::SetSurfaceId(
...@@ -66,9 +64,7 @@ void ChildFrameCompositingHelper::SetSurfaceId( ...@@ -66,9 +64,7 @@ void ChildFrameCompositingHelper::SetSurfaceId(
// TODO(lfg): Investigate if it's possible to propagate the information // TODO(lfg): Investigate if it's possible to propagate the information
// about the child surface's opacity. https://crbug.com/629851. // about the child surface's opacity. https://crbug.com/629851.
bool prevent_contents_opaque_changes = true;
child_frame_compositor_->SetLayer(surface_layer_, child_frame_compositor_->SetLayer(surface_layer_,
prevent_contents_opaque_changes,
true /* is_surface_layer */); true /* is_surface_layer */);
UpdateVisibility(true); UpdateVisibility(true);
......
...@@ -23,7 +23,6 @@ class MockChildFrameCompositor : public ChildFrameCompositor { ...@@ -23,7 +23,6 @@ class MockChildFrameCompositor : public ChildFrameCompositor {
cc::Layer* GetLayer() override { return layer_.get(); } cc::Layer* GetLayer() override { return layer_.get(); }
void SetLayer(scoped_refptr<cc::Layer> layer, void SetLayer(scoped_refptr<cc::Layer> layer,
bool prevent_contents_opaque_changes,
bool is_surface_layer) override { bool is_surface_layer) override {
layer_ = std::move(layer); layer_ = std::move(layer);
} }
......
...@@ -20,7 +20,6 @@ class ChildFrameCompositor { ...@@ -20,7 +20,6 @@ class ChildFrameCompositor {
// Passes ownership of a cc::Layer to the ChildFrameCompositor. // Passes ownership of a cc::Layer to the ChildFrameCompositor.
virtual void SetLayer(scoped_refptr<cc::Layer> layer, virtual void SetLayer(scoped_refptr<cc::Layer> layer,
bool prevent_contents_opaque_changes,
bool is_surface_layer) = 0; bool is_surface_layer) = 0;
// Returns a sad page bitmap used when the child frame has crashed. // Returns a sad page bitmap used when the child frame has crashed.
......
...@@ -669,17 +669,14 @@ cc::Layer* RenderFrameProxy::GetLayer() { ...@@ -669,17 +669,14 @@ cc::Layer* RenderFrameProxy::GetLayer() {
} }
void RenderFrameProxy::SetLayer(scoped_refptr<cc::Layer> layer, void RenderFrameProxy::SetLayer(scoped_refptr<cc::Layer> layer,
bool prevent_contents_opaque_changes,
bool is_surface_layer) { bool is_surface_layer) {
// |ancestor_web_frame_widget_| can be null if this is a proxy for a remote // |ancestor_web_frame_widget_| can be null if this is a proxy for a remote
// main frame, or a subframe of that proxy. However, we should not be setting // main frame, or a subframe of that proxy. However, we should not be setting
// a layer on such a proxy (the layer is used for embedding a child proxy). // a layer on such a proxy (the layer is used for embedding a child proxy).
DCHECK(ancestor_web_frame_widget_); DCHECK(ancestor_web_frame_widget_);
if (web_frame()) { if (web_frame())
web_frame()->SetCcLayer(layer.get(), prevent_contents_opaque_changes, web_frame()->SetCcLayer(layer.get(), is_surface_layer);
is_surface_layer);
}
embedded_layer_ = std::move(layer); embedded_layer_ = std::move(layer);
} }
......
...@@ -233,9 +233,7 @@ class CONTENT_EXPORT RenderFrameProxy : public IPC::Listener, ...@@ -233,9 +233,7 @@ class CONTENT_EXPORT RenderFrameProxy : public IPC::Listener,
// ChildFrameCompositor: // ChildFrameCompositor:
cc::Layer* GetLayer() override; cc::Layer* GetLayer() override;
void SetLayer(scoped_refptr<cc::Layer> layer, void SetLayer(scoped_refptr<cc::Layer> layer, bool is_surface_layer) override;
bool prevent_contents_opaque_changes,
bool is_surface_layer) override;
SkBitmap* GetSadPageBitmap() override; SkBitmap* GetSadPageBitmap() override;
const viz::LocalSurfaceId& GetLocalSurfaceId() const; const viz::LocalSurfaceId& GetLocalSurfaceId() const;
......
...@@ -100,9 +100,7 @@ class WebRemoteFrame : public WebFrame { ...@@ -100,9 +100,7 @@ class WebRemoteFrame : public WebFrame {
WebFrame* opener) = 0; WebFrame* opener) = 0;
// Layer for the in-process compositor. // Layer for the in-process compositor.
virtual void SetCcLayer(cc::Layer*, virtual void SetCcLayer(cc::Layer*, bool is_surface_layer) = 0;
bool prevent_contents_opaque_changes,
bool is_surface_layer) = 0;
// Set security origin replicated from another process. // Set security origin replicated from another process.
virtual void SetReplicatedOrigin( virtual void SetReplicatedOrigin(
......
...@@ -242,7 +242,7 @@ bool RemoteFrame::DetachImpl(FrameDetachType type) { ...@@ -242,7 +242,7 @@ bool RemoteFrame::DetachImpl(FrameDetachType type) {
// of all these objects. Break the cycle by notifying of detachment. // of all these objects. Break the cycle by notifying of detachment.
To<RemoteDOMWindow>(dom_window_.Get())->FrameDetached(); To<RemoteDOMWindow>(dom_window_.Get())->FrameDetached();
if (cc_layer_) if (cc_layer_)
SetCcLayer(nullptr, false, false); SetCcLayer(nullptr, false);
receiver_.reset(); receiver_.reset();
main_frame_receiver_.reset(); main_frame_receiver_.reset();
...@@ -772,13 +772,10 @@ bool RemoteFrame::IsIgnoredForHitTest() const { ...@@ -772,13 +772,10 @@ bool RemoteFrame::IsIgnoredForHitTest() const {
!visible_to_hit_testing_; !visible_to_hit_testing_;
} }
void RemoteFrame::SetCcLayer(cc::Layer* cc_layer, void RemoteFrame::SetCcLayer(cc::Layer* cc_layer, bool is_surface_layer) {
bool prevent_contents_opaque_changes,
bool is_surface_layer) {
DCHECK(Owner()); DCHECK(Owner());
cc_layer_ = cc_layer; cc_layer_ = cc_layer;
prevent_contents_opaque_changes_ = prevent_contents_opaque_changes;
is_surface_layer_ = is_surface_layer; is_surface_layer_ = is_surface_layer;
if (cc_layer_) { if (cc_layer_) {
if (is_surface_layer) { if (is_surface_layer) {
......
...@@ -81,13 +81,8 @@ class CORE_EXPORT RemoteFrame final : public Frame, ...@@ -81,13 +81,8 @@ class CORE_EXPORT RemoteFrame final : public Frame,
void AddResourceTimingFromChild( void AddResourceTimingFromChild(
mojom::blink::ResourceTimingInfoPtr timing) override; mojom::blink::ResourceTimingInfoPtr timing) override;
void SetCcLayer(cc::Layer*, void SetCcLayer(cc::Layer*, bool is_surface_layer);
bool prevent_contents_opaque_changes,
bool is_surface_layer);
cc::Layer* GetCcLayer() const { return cc_layer_; } cc::Layer* GetCcLayer() const { return cc_layer_; }
bool WebLayerHasFixedContentsOpaque() const {
return prevent_contents_opaque_changes_;
}
void AdvanceFocus(mojom::blink::FocusType, LocalFrame* source); void AdvanceFocus(mojom::blink::FocusType, LocalFrame* source);
...@@ -218,7 +213,6 @@ class CORE_EXPORT RemoteFrame final : public Frame, ...@@ -218,7 +213,6 @@ class CORE_EXPORT RemoteFrame final : public Frame,
Member<RemoteFrameView> view_; Member<RemoteFrameView> view_;
RemoteSecurityContext security_context_; RemoteSecurityContext security_context_;
cc::Layer* cc_layer_ = nullptr; cc::Layer* cc_layer_ = nullptr;
bool prevent_contents_opaque_changes_ = false;
bool is_surface_layer_ = false; bool is_surface_layer_ = false;
ParsedFeaturePolicy feature_policy_header_; ParsedFeaturePolicy feature_policy_header_;
String unique_name_; String unique_name_;
......
...@@ -252,10 +252,8 @@ WebRemoteFrame* WebRemoteFrameImpl::CreateRemoteChild( ...@@ -252,10 +252,8 @@ WebRemoteFrame* WebRemoteFrameImpl::CreateRemoteChild(
} }
void WebRemoteFrameImpl::SetCcLayer(cc::Layer* layer, void WebRemoteFrameImpl::SetCcLayer(cc::Layer* layer,
bool prevent_contents_opaque_changes,
bool is_surface_layer) { bool is_surface_layer) {
GetFrame()->SetCcLayer(layer, prevent_contents_opaque_changes, GetFrame()->SetCcLayer(layer, is_surface_layer);
is_surface_layer);
} }
void WebRemoteFrameImpl::SetCoreFrame(RemoteFrame* frame) { void WebRemoteFrameImpl::SetCoreFrame(RemoteFrame* frame) {
......
...@@ -82,9 +82,7 @@ class CORE_EXPORT WebRemoteFrameImpl final ...@@ -82,9 +82,7 @@ class CORE_EXPORT WebRemoteFrameImpl final
AssociatedInterfaceProvider*, AssociatedInterfaceProvider*,
const base::UnguessableToken& frame_token, const base::UnguessableToken& frame_token,
WebFrame* opener) override; WebFrame* opener) override;
void SetCcLayer(cc::Layer*, void SetCcLayer(cc::Layer*, bool is_surface_layer) override;
bool prevent_contents_opaque_changes,
bool is_surface_layer) override;
void SetReplicatedOrigin( void SetReplicatedOrigin(
const WebSecurityOrigin&, const WebSecurityOrigin&,
bool is_potentially_trustworthy_opaque_origin) override; bool is_potentially_trustworthy_opaque_origin) override;
......
...@@ -409,8 +409,7 @@ bool CompositedLayerMapping::UpdateGraphicsLayerConfiguration( ...@@ -409,8 +409,7 @@ bool CompositedLayerMapping::UpdateGraphicsLayerConfiguration(
} else if (auto* frame_owner = } else if (auto* frame_owner =
DynamicTo<HTMLFrameOwnerElement>(layout_object.GetNode())) { DynamicTo<HTMLFrameOwnerElement>(layout_object.GetNode())) {
if (auto* remote = DynamicTo<RemoteFrame>(frame_owner->ContentFrame())) { if (auto* remote = DynamicTo<RemoteFrame>(frame_owner->ContentFrame())) {
graphics_layer_->SetContentsToCcLayer( graphics_layer_->SetContentsToCcLayer(remote->GetCcLayer(), true);
remote->GetCcLayer(), remote->WebLayerHasFixedContentsOpaque());
} }
} }
} else if (IsA<LayoutVideo>(layout_object)) { } else if (IsA<LayoutVideo>(layout_object)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment