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