Chromium Code Reviews| Index: content/renderer/child_frame_compositing_helper.cc |
| diff --git a/content/renderer/child_frame_compositing_helper.cc b/content/renderer/child_frame_compositing_helper.cc |
| index 4ac2315b6fa2d9ac92545a44cd8f294d6ad92d34..140df062671f7570f262d4ba517efc724a96fd51 100644 |
| --- a/content/renderer/child_frame_compositing_helper.cc |
| +++ b/content/renderer/child_frame_compositing_helper.cc |
| @@ -9,6 +9,7 @@ |
| #include "cc/layers/delegated_frame_resource_collection.h" |
| #include "cc/layers/delegated_renderer_layer.h" |
| #include "cc/layers/solid_color_layer.h" |
| +#include "cc/layers/surface_layer.h" |
| #include "cc/output/context_provider.h" |
| #include "cc/output/copy_output_request.h" |
| #include "cc/output/copy_output_result.h" |
| @@ -34,7 +35,8 @@ ChildFrameCompositingHelper* |
| ChildFrameCompositingHelper::CreateForBrowserPlugin( |
| const base::WeakPtr<BrowserPlugin>& browser_plugin) { |
| return new ChildFrameCompositingHelper( |
| - browser_plugin, NULL, NULL, browser_plugin->render_frame_routing_id()); |
| + browser_plugin, nullptr, nullptr, |
| + browser_plugin->render_frame_routing_id()); |
| } |
| ChildFrameCompositingHelper* |
| @@ -63,19 +65,19 @@ ChildFrameCompositingHelper::ChildFrameCompositingHelper( |
| ChildFrameCompositingHelper::~ChildFrameCompositingHelper() { |
| if (resource_collection_.get()) |
| - resource_collection_->SetClient(NULL); |
| + resource_collection_->SetClient(nullptr); |
| } |
| BrowserPluginManager* ChildFrameCompositingHelper::GetBrowserPluginManager() { |
| if (!browser_plugin_) |
| - return NULL; |
| + return nullptr; |
| return BrowserPluginManager::Get(); |
| } |
| blink::WebPluginContainer* ChildFrameCompositingHelper::GetContainer() { |
| if (!browser_plugin_) |
| - return NULL; |
| + return nullptr; |
| return browser_plugin_->container(); |
| } |
| @@ -135,15 +137,14 @@ void ChildFrameCompositingHelper::EnableCompositing(bool enable) { |
| if (enable && !background_layer_.get()) { |
| background_layer_ = cc::SolidColorLayer::Create(); |
| background_layer_->SetMasksToBounds(true); |
| - background_layer_->SetBackgroundColor( |
| - SkColorSetARGBInline(255, 255, 255, 255)); |
| + background_layer_->SetBackgroundColor(SkColorSetARGBInline(255, 0, 128, 0)); |
| web_layer_.reset(new cc_blink::WebLayerImpl(background_layer_)); |
| } |
| if (GetContainer()) { |
| - GetContainer()->setWebLayer(enable ? web_layer_.get() : NULL); |
| + GetContainer()->setWebLayer(enable ? web_layer_.get() : nullptr); |
| } else if (frame_) { |
| - frame_->setRemoteWebLayer(enable ? web_layer_.get() : NULL); |
| + frame_->setRemoteWebLayer(enable ? web_layer_.get() : nullptr); |
| } |
| } |
| @@ -172,16 +173,17 @@ void ChildFrameCompositingHelper::OnContainerDestroy() { |
| DidCommitCompositorFrame(); |
| if (GetContainer()) |
| - GetContainer()->setWebLayer(NULL); |
| + GetContainer()->setWebLayer(nullptr); |
| if (resource_collection_.get()) |
| - resource_collection_->SetClient(NULL); |
| + resource_collection_->SetClient(nullptr); |
| ack_pending_ = false; |
| - resource_collection_ = NULL; |
| - frame_provider_ = NULL; |
| - delegated_layer_ = NULL; |
| - background_layer_ = NULL; |
| + resource_collection_ = nullptr; |
| + frame_provider_ = nullptr; |
| + delegated_layer_ = nullptr; |
| + background_layer_ = nullptr; |
| + surface_layer_ = nullptr; |
| web_layer_.reset(); |
| } |
| @@ -199,6 +201,11 @@ void ChildFrameCompositingHelper::OnCompositorFrameSwapped( |
| int host_id, |
| base::SharedMemoryHandle handle) { |
| cc::DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); |
| + |
| + // Surface IDs and compositor frames should never be received |
| + // interchangeably. |
| + DCHECK(!surface_layer_.get()); |
| + |
| // Do nothing if we are getting destroyed or have no frame data. |
| if (!frame_data || !background_layer_.get()) |
| return; |
| @@ -216,16 +223,16 @@ void ChildFrameCompositingHelper::OnCompositorFrameSwapped( |
| // case we should recreate the DelegatedRendererLayer, to avoid matching |
| // resources from the old one with resources from the new one which would |
| // have the same id. |
| - frame_provider_ = NULL; |
| + frame_provider_ = nullptr; |
| // Drop the cc::DelegatedFrameResourceCollection so that we will not return |
| // any resources from the old output surface with the new output surface id. |
| if (resource_collection_.get()) { |
| - resource_collection_->SetClient(NULL); |
| + resource_collection_->SetClient(nullptr); |
| if (resource_collection_->LoseAllResources()) |
| SendReturnedDelegatedResources(); |
| - resource_collection_ = NULL; |
| + resource_collection_ = nullptr; |
| } |
| last_output_surface_id_ = output_surface_id; |
| last_route_id_ = route_id; |
| @@ -258,9 +265,67 @@ void ChildFrameCompositingHelper::OnCompositorFrameSwapped( |
| ack_pending_ = true; |
| } |
| +// static |
| +void ChildFrameCompositingHelper::SatisfyCallback( |
| + ChildFrameCompositingHelper* helper, |
| + cc::SurfaceSequence sequence) { |
| + if (helper->render_frame_proxy_) { |
| + helper->render_frame_proxy_->Send( |
| + new FrameHostMsg_SatisfySequence(helper->host_routing_id_, sequence)); |
| + } |
| +} |
| + |
| +// static |
| +void ChildFrameCompositingHelper::RequireCallback( |
| + ChildFrameCompositingHelper* helper, |
| + cc::SurfaceId id, |
| + cc::SurfaceSequence sequence) { |
| + if (helper->render_frame_proxy_) { |
| + helper->render_frame_proxy_->Send(new FrameHostMsg_RequireSequence( |
| + helper->host_routing_id_, id, sequence)); |
| + } |
| +} |
| + |
| +void ChildFrameCompositingHelper::OnSetSurface( |
| + const cc::SurfaceId& surface_id, |
| + const gfx::Size& frame_size, |
| + float scale_factor, |
| + const cc::SurfaceSequence& sequence) { |
| + // Surface IDs and compositor frames should never be received |
| + // interchangably. |
| + DCHECK(!delegated_layer_.get()); |
| + |
| + // Do nothing if we are getting destroyed. |
| + if (!background_layer_.get()) |
| + return; |
| + |
| + if (!surface_layer_.get()) { |
| + cc::SurfaceLayer::SatisfyCallback satisfy_callback = base::Bind( |
|
jbauman
2015/05/01 23:58:10
I think we'll need to plumb down this renderer's s
kenrb
2015/05/05 16:24:38
I see what you mean. Would this be another paramet
|
| + &ChildFrameCompositingHelper::SatisfyCallback, base::Unretained(this)); |
| + cc::SurfaceLayer::RequireCallback require_callback = base::Bind( |
| + &ChildFrameCompositingHelper::RequireCallback, base::Unretained(this)); |
| + surface_layer_ = |
| + cc::SurfaceLayer::Create(satisfy_callback, require_callback); |
| + } |
| + surface_layer_->SetSurfaceId(surface_id, scale_factor, frame_size); |
| + UpdateVisibility(true); |
| + SetContentsOpaque(opaque_); |
| + background_layer_->AddChild(surface_layer_); |
| + |
| + // The RWHV creates a destruction dependency on the surface that needs to be |
| + // satisfied. |
| + render_frame_proxy_->Send( |
| + new FrameHostMsg_SatisfySequence(host_routing_id_, sequence)); |
| + |
| + CheckSizeAndAdjustLayerProperties(frame_size, scale_factor, |
| + surface_layer_.get()); |
| +} |
| + |
| void ChildFrameCompositingHelper::UpdateVisibility(bool visible) { |
| if (delegated_layer_.get()) |
| delegated_layer_->SetIsDrawable(visible); |
| + if (surface_layer_.get()) |
| + surface_layer_->SetIsDrawable(visible); |
| } |
| void ChildFrameCompositingHelper::UnusedResourcesAreAvailable() { |
| @@ -287,6 +352,8 @@ void ChildFrameCompositingHelper::SetContentsOpaque(bool opaque) { |
| opaque_ = opaque; |
| if (delegated_layer_.get()) |
| delegated_layer_->SetContentsOpaque(opaque_); |
| + if (surface_layer_.get()) |
| + surface_layer_->SetContentsOpaque(opaque_); |
| } |
| } // namespace content |