1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/embedded_frame_sink_impl.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "components/viz/host/host_frame_sink_manager.h"
11
12 namespace content {
13
EmbeddedFrameSinkImpl(viz::HostFrameSinkManager * host_frame_sink_manager,const viz::FrameSinkId & parent_frame_sink_id,const viz::FrameSinkId & frame_sink_id,mojo::PendingRemote<blink::mojom::EmbeddedFrameSinkClient> client,DestroyCallback destroy_callback)14 EmbeddedFrameSinkImpl::EmbeddedFrameSinkImpl(
15 viz::HostFrameSinkManager* host_frame_sink_manager,
16 const viz::FrameSinkId& parent_frame_sink_id,
17 const viz::FrameSinkId& frame_sink_id,
18 mojo::PendingRemote<blink::mojom::EmbeddedFrameSinkClient> client,
19 DestroyCallback destroy_callback)
20 : host_frame_sink_manager_(host_frame_sink_manager),
21 parent_frame_sink_id_(parent_frame_sink_id),
22 frame_sink_id_(frame_sink_id) {
23 client_.Bind(std::move(client));
24 client_.set_disconnect_handler(std::move(destroy_callback));
25 host_frame_sink_manager_->RegisterFrameSinkId(
26 frame_sink_id_, this, viz::ReportFirstSurfaceActivation::kNo);
27 host_frame_sink_manager_->SetFrameSinkDebugLabel(frame_sink_id_,
28 "EmbeddedFrameSinkImpl");
29 }
30
~EmbeddedFrameSinkImpl()31 EmbeddedFrameSinkImpl::~EmbeddedFrameSinkImpl() {
32 if (has_created_compositor_frame_sink_) {
33 host_frame_sink_manager_->UnregisterFrameSinkHierarchy(
34 parent_frame_sink_id_, frame_sink_id_);
35 }
36 host_frame_sink_manager_->InvalidateFrameSinkId(frame_sink_id_);
37 }
38
CreateCompositorFrameSink(mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient> client,mojo::PendingReceiver<viz::mojom::CompositorFrameSink> receiver)39 void EmbeddedFrameSinkImpl::CreateCompositorFrameSink(
40 mojo::PendingRemote<viz::mojom::CompositorFrameSinkClient> client,
41 mojo::PendingReceiver<viz::mojom::CompositorFrameSink> receiver) {
42 // We might recreate the CompositorFrameSink on context loss or GPU crash.
43 // Only register frame sink hierarchy the first time.
44 if (!has_created_compositor_frame_sink_) {
45 // The request to create an embedded frame sink and the lifetime of the
46 // parent are controlled by different IPC channels. It's possible the parent
47 // FrameSinkId has been invalidated by the time this request has arrived. In
48 // that case, drop the request since there is no embedder.
49 if (!host_frame_sink_manager_->RegisterFrameSinkHierarchy(
50 parent_frame_sink_id_, frame_sink_id_)) {
51 return;
52 }
53 }
54
55 host_frame_sink_manager_->CreateCompositorFrameSink(
56 frame_sink_id_, std::move(receiver), std::move(client));
57
58 has_created_compositor_frame_sink_ = true;
59 }
60
ConnectToEmbedder(mojo::PendingReceiver<blink::mojom::SurfaceEmbedder> surface_embedder_receiver)61 void EmbeddedFrameSinkImpl::ConnectToEmbedder(
62 mojo::PendingReceiver<blink::mojom::SurfaceEmbedder>
63 surface_embedder_receiver) {
64 client_->BindSurfaceEmbedder(std::move(surface_embedder_receiver));
65 }
66
OnFirstSurfaceActivation(const viz::SurfaceInfo & surface_info)67 void EmbeddedFrameSinkImpl::OnFirstSurfaceActivation(
68 const viz::SurfaceInfo& surface_info) {}
69
OnFrameTokenChanged(uint32_t frame_token)70 void EmbeddedFrameSinkImpl::OnFrameTokenChanged(uint32_t frame_token) {
71 // TODO(yiyix, fsamuel): To complete plumbing of frame tokens for offscreen
72 // canvas
73 }
74
75 } // namespace content
76