Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(406)

Side by Side Diff: content/browser/renderer_host/offscreen_canvas_surface_manager_unittest.cc

Issue 2479563005: Create manager to track OffscreenCanvasSurfaceImpl instances (Closed)
Patch Set: fix Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 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/browser_thread_impl.h"
6 #include "content/browser/compositor/test/no_transport_image_transport_factory.h "
7 #include "content/browser/renderer_host/offscreen_canvas_compositor_frame_sink.h "
8 #include "content/browser/renderer_host/offscreen_canvas_surface_impl.h"
9 #include "content/browser/renderer_host/offscreen_canvas_surface_manager.h"
10 #include "mojo/public/cpp/bindings/binding.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 #if defined(OS_ANDROID)
14 #include "content/test/mock_gpu_channel_establish_factory.h"
15 #else
16 #include "content/browser/compositor/image_transport_factory.h"
17 #endif
18
19 namespace content {
20
21 class MockMojoCompositorFrameSinkClient
22 : public cc::mojom::MojoCompositorFrameSinkClient {
23 public:
24 MockMojoCompositorFrameSinkClient() : binding_(this) {}
25 ~MockMojoCompositorFrameSinkClient() override {}
26
27 cc::mojom::MojoCompositorFrameSinkClientPtr GetProxy() {
28 return binding_.CreateInterfacePtrAndBind();
29 }
30
31 void DidReceiveCompositorFrameAck() override {}
32 void OnBeginFrame(const cc::BeginFrameArgs& args) override {}
33 void ReclaimResources(const cc::ReturnedResourceArray& resources) override {}
34
35 private:
36 mojo::Binding<cc::mojom::MojoCompositorFrameSinkClient> binding_;
37 };
38
39 class OffscreenCanvasSurfaceManagerTest : public testing::Test {
40 public:
41 int getNumSurfaceImplInstances() {
42 return OffscreenCanvasSurfaceManager::GetInstance()
43 ->registered_surface_instances_.size();
44 }
45 int getNumCompositorFrameSinkInstances() {
46 return OffscreenCanvasSurfaceManager::GetInstance()
47 ->registered_compositor_frame_sink_instances_.size();
48 }
49 const cc::SurfaceId getCurrentSurfaceId() { return current_surface_id_; }
50 void setSurfaceId(const cc::SurfaceId& surface_id) {
51 current_surface_id_ = surface_id;
52 }
53
54 protected:
55 void SetUp() override;
56 void TearDown() override;
57
58 private:
59 cc::SurfaceId current_surface_id_;
60 std::unique_ptr<BrowserThreadImpl> ui_thread_;
61 base::MessageLoopForUI message_loop_;
62 #if defined(OS_ANDROID)
63 MockGpuChannelEstablishFactory gpu_channel_factory_;
64 #endif
65 };
66
67 void OffscreenCanvasSurfaceManagerTest::SetUp() {
68 #if defined(OS_ANDROID)
69 ContextProviderFactoryImpl::Initialize(&gpu_channel_factory_);
70 ui::ContextProviderFactory::SetInstance(
71 ContextProviderFactoryImpl::GetInstance());
72 #else
73 ImageTransportFactory::InitializeForUnitTests(
74 std::unique_ptr<ImageTransportFactory>(
75 new NoTransportImageTransportFactory));
76 #endif
77 ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI, &message_loop_));
78 }
79
80 void OffscreenCanvasSurfaceManagerTest::TearDown() {
81 OffscreenCanvasSurfaceManager::Terminate();
82 #if defined(OS_ANDROID)
83 ui::ContextProviderFactory::SetInstance(nullptr);
84 ContextProviderFactoryImpl::Terminate();
85 #else
86 ImageTransportFactory::Terminate();
87 #endif
88 }
89
90 // This test mimics the workflow of OffscreenCanvas.commit() on renderer
91 // process.
92 TEST_F(OffscreenCanvasSurfaceManagerTest,
93 SingleHTMLCanvasElementTransferToOffscreen) {
94 // Assume that HTMLCanvasElement.transferControlToOffscreen() is triggered and
95 // it will invoke GetSurfaceId function on OffscreenCanvasSurfaceImpl to
96 // obtain a unique SurfaceId from browser.
97 std::unique_ptr<OffscreenCanvasSurfaceImpl> surface_impl =
98 base::WrapUnique(new OffscreenCanvasSurfaceImpl());
99 surface_impl->GetSurfaceId(
100 base::Bind(&OffscreenCanvasSurfaceManagerTest::setSurfaceId,
101 base::Unretained(this)));
102
103 EXPECT_TRUE(this->getCurrentSurfaceId().is_valid());
104 EXPECT_EQ(1, this->getNumSurfaceImplInstances());
105 cc::FrameSinkId frame_sink_id = surface_impl.get()->frame_sink_id();
106 EXPECT_EQ(frame_sink_id, this->getCurrentSurfaceId().frame_sink_id());
107 EXPECT_EQ(surface_impl.get(),
108 OffscreenCanvasSurfaceManager::GetInstance()->GetSurfaceInstance(
109 frame_sink_id));
110
111 // Next, after the SurfaceId is passed onto OffscreenCanvas on worker, it will
112 // request browser side to create a OffscreenCanvasCompositorFrameSink with
113 // the given SurfaceId.
114 MockMojoCompositorFrameSinkClient client_service;
115 std::unique_ptr<OffscreenCanvasCompositorFrameSink> compositor_frame_sink =
116 base::WrapUnique(new OffscreenCanvasCompositorFrameSink(
117 this->getCurrentSurfaceId(), client_service.GetProxy()));
118 EXPECT_EQ(1, this->getNumCompositorFrameSinkInstances());
119 EXPECT_EQ(compositor_frame_sink.get(),
120 OffscreenCanvasSurfaceManager::GetInstance()
121 ->GetCompositorFrameSinkInstance(frame_sink_id));
122
123 surface_impl = nullptr;
124 EXPECT_EQ(0, this->getNumSurfaceImplInstances());
125
126 compositor_frame_sink = nullptr;
127 EXPECT_EQ(0, this->getNumCompositorFrameSinkInstances());
128 }
129
130 TEST_F(OffscreenCanvasSurfaceManagerTest,
131 MultiHTMLCanvasElementTransferToOffscreen) {
132 // Same scenario as above test except that now we have two HTMLCanvasElement
133 // transferControlToOffscreen at the same time.
134 std::unique_ptr<OffscreenCanvasSurfaceImpl> surface_impl_a =
135 base::WrapUnique(new OffscreenCanvasSurfaceImpl());
136 surface_impl_a->GetSurfaceId(
137 base::Bind(&OffscreenCanvasSurfaceManagerTest::setSurfaceId,
138 base::Unretained(this)));
139 cc::SurfaceId surface_id_a = this->getCurrentSurfaceId();
140
141 EXPECT_TRUE(surface_id_a.is_valid());
142
143 std::unique_ptr<OffscreenCanvasSurfaceImpl> surface_impl_b =
144 base::WrapUnique(new OffscreenCanvasSurfaceImpl());
145 surface_impl_b->GetSurfaceId(
146 base::Bind(&OffscreenCanvasSurfaceManagerTest::setSurfaceId,
147 base::Unretained(this)));
148 cc::SurfaceId surface_id_b = this->getCurrentSurfaceId();
149
150 EXPECT_TRUE(surface_id_b.is_valid());
151 EXPECT_NE(surface_id_a, surface_id_b);
152
153 EXPECT_EQ(2, this->getNumSurfaceImplInstances());
154 EXPECT_EQ(surface_impl_a.get(),
155 OffscreenCanvasSurfaceManager::GetInstance()->GetSurfaceInstance(
156 surface_id_a.frame_sink_id()));
157 EXPECT_EQ(surface_impl_b.get(),
158 OffscreenCanvasSurfaceManager::GetInstance()->GetSurfaceInstance(
159 surface_id_b.frame_sink_id()));
160
161 // Next, one of the transferred OffscreenCanvas does commit().
162 MockMojoCompositorFrameSinkClient client_service_a;
163 std::unique_ptr<OffscreenCanvasCompositorFrameSink> compositor_frame_sink_a =
164 base::WrapUnique(new OffscreenCanvasCompositorFrameSink(
165 surface_id_a, client_service_a.GetProxy()));
166 EXPECT_EQ(1, this->getNumCompositorFrameSinkInstances());
167 EXPECT_EQ(compositor_frame_sink_a.get(),
168 OffscreenCanvasSurfaceManager::GetInstance()
169 ->GetCompositorFrameSinkInstance(surface_id_a.frame_sink_id()));
170
171 // Another transferred OffscreenCanvas also does commit().
172 MockMojoCompositorFrameSinkClient client_service_b;
173 std::unique_ptr<OffscreenCanvasCompositorFrameSink> compositor_frame_sink_b =
174 base::WrapUnique(new OffscreenCanvasCompositorFrameSink(
175 surface_id_b, client_service_b.GetProxy()));
176 EXPECT_EQ(2, this->getNumCompositorFrameSinkInstances());
177 EXPECT_EQ(compositor_frame_sink_b.get(),
178 OffscreenCanvasSurfaceManager::GetInstance()
179 ->GetCompositorFrameSinkInstance(surface_id_b.frame_sink_id()));
180
181 surface_impl_a = nullptr;
182 EXPECT_EQ(1, this->getNumSurfaceImplInstances());
183 surface_impl_b = nullptr;
184 EXPECT_EQ(0, this->getNumSurfaceImplInstances());
185
186 compositor_frame_sink_a = nullptr;
187 EXPECT_EQ(1, this->getNumCompositorFrameSinkInstances());
188 compositor_frame_sink_b = nullptr;
189 EXPECT_EQ(0, this->getNumCompositorFrameSinkInstances());
190 }
191
192 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698