diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/graphics/surface_layer_bridge.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/graphics/surface_layer_bridge.cc | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/graphics/surface_layer_bridge.cc b/chromium/third_party/blink/renderer/platform/graphics/surface_layer_bridge.cc new file mode 100644 index 00000000000..f46a7d111e2 --- /dev/null +++ b/chromium/third_party/blink/renderer/platform/graphics/surface_layer_bridge.cc @@ -0,0 +1,103 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/platform/graphics/surface_layer_bridge.h" + +#include "base/feature_list.h" +#include "cc/layers/layer.h" +#include "cc/layers/solid_color_layer.h" +#include "cc/layers/surface_layer.h" +#include "components/viz/common/surfaces/surface_id.h" +#include "components/viz/common/surfaces/surface_info.h" +#include "media/base/media_switches.h" +#include "third_party/blink/public/platform/interface_provider.h" +#include "third_party/blink/public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom-blink.h" +#include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/public/platform/web_compositor_support.h" +#include "third_party/blink/public/platform/web_layer.h" +#include "third_party/blink/public/platform/web_layer_tree_view.h" +#include "third_party/blink/renderer/platform/mojo/mojo_helper.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" +#include "ui/gfx/geometry/size.h" + +namespace blink { + +SurfaceLayerBridge::SurfaceLayerBridge(WebLayerTreeView* layer_tree_view, + WebSurfaceLayerBridgeObserver* observer) + : observer_(observer), + binding_(this), + frame_sink_id_(Platform::Current()->GenerateFrameSinkId()), + parent_frame_sink_id_(layer_tree_view ? layer_tree_view->GetFrameSinkId() + : viz::FrameSinkId()) { + mojom::blink::OffscreenCanvasProviderPtr provider; + Platform::Current()->GetInterfaceProvider()->GetInterface( + mojo::MakeRequest(&provider)); + // TODO(xlai): Ensure OffscreenCanvas commit() is still functional when a + // frame-less HTML canvas's document is reparenting under another frame. + // See crbug.com/683172. + blink::mojom::blink::OffscreenCanvasSurfaceClientPtr client; + binding_.Bind(mojo::MakeRequest(&client)); + provider->CreateOffscreenCanvasSurface(parent_frame_sink_id_, frame_sink_id_, + std::move(client)); +} + +SurfaceLayerBridge::~SurfaceLayerBridge() { + observer_ = nullptr; +} + +void SurfaceLayerBridge::CreateSolidColorLayer() { + cc_layer_ = cc::SolidColorLayer::Create(); + cc_layer_->SetBackgroundColor(SK_ColorTRANSPARENT); + + web_layer_ = Platform::Current()->CompositorSupport()->CreateLayerFromCCLayer( + cc_layer_.get()); + + if (observer_) + observer_->RegisterContentsLayer(web_layer_.get()); +} + +void SurfaceLayerBridge::OnFirstSurfaceActivation( + const viz::SurfaceInfo& surface_info) { + if (!current_surface_id_.is_valid() && surface_info.is_valid()) { + // First time a SurfaceId is received. + current_surface_id_ = surface_info.id(); + if (web_layer_) { + if (observer_) + observer_->UnregisterContentsLayer(web_layer_.get()); + web_layer_->RemoveFromParent(); + } + + scoped_refptr<cc::SurfaceLayer> surface_layer = cc::SurfaceLayer::Create(); + surface_layer->SetPrimarySurfaceId( + surface_info.id(), cc::DeadlinePolicy::UseDefaultDeadline()); + surface_layer->SetFallbackSurfaceId(surface_info.id()); + surface_layer->SetStretchContentToFillBounds(true); + surface_layer->SetIsDrawable(true); + cc_layer_ = surface_layer; + + web_layer_ = + Platform::Current()->CompositorSupport()->CreateLayerFromCCLayer( + cc_layer_.get()); + if (observer_) + observer_->RegisterContentsLayer(web_layer_.get()); + } else if (current_surface_id_ != surface_info.id()) { + // A different SurfaceId is received, prompting change to existing + // SurfaceLayer. + current_surface_id_ = surface_info.id(); + cc::SurfaceLayer* surface_layer = + static_cast<cc::SurfaceLayer*>(cc_layer_.get()); + surface_layer->SetPrimarySurfaceId( + surface_info.id(), cc::DeadlinePolicy::UseDefaultDeadline()); + surface_layer->SetFallbackSurfaceId(surface_info.id()); + } + + if (observer_) { + observer_->OnWebLayerUpdated(); + observer_->OnSurfaceIdUpdated(surface_info.id()); + } + + cc_layer_->SetBounds(surface_info.size_in_pixels()); +} + +} // namespace blink |