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

Side by Side Diff: services/ui/ws/frame_generator_unittest.cc

Issue 2890913002: Add CompositorFrameSinkClientBinding To Be Used By FrameGenerator (Closed)
Patch Set: virtual destructor Created 3 years, 7 months 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
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "services/ui/ws/frame_generator.h" 5 #include "services/ui/ws/frame_generator.h"
6 6
7 #include "base/debug/stack_trace.h"
7 #include "base/macros.h" 8 #include "base/macros.h"
8 #include "cc/output/compositor_frame_sink.h" 9 #include "cc/output/compositor_frame_sink.h"
9 #include "cc/scheduler/begin_frame_source.h" 10 #include "cc/scheduler/begin_frame_source.h"
10 #include "cc/test/begin_frame_args_test.h" 11 #include "cc/test/begin_frame_args_test.h"
11 #include "cc/test/fake_external_begin_frame_source.h" 12 #include "cc/test/fake_external_begin_frame_source.h"
12 #include "services/ui/ws/server_window.h" 13 #include "services/ui/ws/server_window.h"
13 #include "services/ui/ws/server_window_delegate.h" 14 #include "services/ui/ws/server_window_delegate.h"
14 #include "services/ui/ws/test_utils.h" 15 #include "services/ui/ws/test_utils.h"
16 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
16 18
19 using testing::_;
20
17 namespace ui { 21 namespace ui {
18 namespace ws { 22 namespace ws {
19 namespace test { 23 namespace test {
20 24
21 // TestServerWindowDelegate implements ServerWindowDelegate and returns nullptrs 25 // TestServerWindowDelegate implements ServerWindowDelegate and returns nullptrs
22 // when either of the methods from the interface is called. 26 // when either of the methods from the interface is called.
23 class TestServerWindowDelegate : public ServerWindowDelegate { 27 class TestServerWindowDelegate : public ServerWindowDelegate {
24 public: 28 public:
25 TestServerWindowDelegate() {} 29 TestServerWindowDelegate() {}
26 ~TestServerWindowDelegate() override {} 30 ~TestServerWindowDelegate() override {}
27 31
28 // ServerWindowDelegate implementation: 32 // ServerWindowDelegate implementation:
29 cc::mojom::FrameSinkManager* GetFrameSinkManager() override { 33 cc::mojom::FrameSinkManager* GetFrameSinkManager() override {
30 return nullptr; 34 return nullptr;
31 } 35 }
32 36
33 ServerWindow* GetRootWindow(const ServerWindow* window) override { 37 ServerWindow* GetRootWindow(const ServerWindow* window) override {
34 return nullptr; 38 return nullptr;
35 } 39 }
36 40
37 private: 41 private:
38 DISALLOW_COPY_AND_ASSIGN(TestServerWindowDelegate); 42 DISALLOW_COPY_AND_ASSIGN(TestServerWindowDelegate);
39 }; 43 };
40 44
41 // FakeCompositorFrameSink observes a FakeExternalBeginFrameSource and receives 45 // TestClientBinding Observes a BeginFrame and accepts CompositorFrame submitted
42 // CompositorFrames from a FrameGenerator. 46 // from FrameGenerator. It provides a way to inspect CompositorFrames.
43 class FakeCompositorFrameSink : public cc::CompositorFrameSink, 47 class TestClientBinding : public CompositorFrameSinkClientBinding,
44 public cc::BeginFrameObserver, 48 public cc::BeginFrameObserver {
45 public cc::ExternalBeginFrameSourceClient {
46 public: 49 public:
47 FakeCompositorFrameSink() 50 explicit TestClientBinding(
48 : cc::CompositorFrameSink(nullptr, nullptr, nullptr, nullptr) {} 51 cc::mojom::MojoCompositorFrameSinkClient* sink_client)
52 : sink_client_(sink_client) {}
53 ~TestClientBinding() override = default;
49 54
50 // cc::CompositorFrameSink implementation: 55 // CompositorFrameSinkClientBinding implementation:
51 bool BindToClient(cc::CompositorFrameSinkClient* client) override { 56 void SubmitCompositorFrame(cc::CompositorFrame frame) override {
52 if (!cc::CompositorFrameSink::BindToClient(client)) 57 SubmitCompositorFrameInternal();
53 return false; 58 last_frame_ = std::move(frame);
54 59 begin_frame_source_->DidFinishFrame(this,
55 external_begin_frame_source_ = 60 last_frame_.metadata.begin_frame_ack);
56 base::MakeUnique<cc::ExternalBeginFrameSource>(this);
57 client_->SetBeginFrameSource(external_begin_frame_source_.get());
58 return true;
59 } 61 }
60 62
61 void DetachFromClient() override { 63 void SetNeedsBeginFrame(bool needs_begin_frame) override {
62 cc::CompositorFrameSink::DetachFromClient(); 64 if (needs_begin_frame == observing_begin_frames_)
65 return;
66
67 observing_begin_frames_ = needs_begin_frame;
68 if (needs_begin_frame) {
69 begin_frame_source_->AddObserver(this);
70 } else
71 begin_frame_source_->RemoveObserver(this);
63 } 72 }
64 73
65 void SubmitCompositorFrame(cc::CompositorFrame frame) override { 74 MOCK_METHOD0(SubmitCompositorFrameInternal, void());
Fady Samuel 2017/05/17 20:11:43 I think we prefer not to use GMOCK in ws code?
Alex Z. 2017/05/17 20:21:18 The frames_submitted_ is restored. Is there any re
66 ++number_frames_received_;
67 last_frame_ = std::move(frame);
68 }
69 75
70 // cc::BeginFrameObserver implementation. 76 // cc::BeginFrameObserver implementation.
71 void OnBeginFrame(const cc::BeginFrameArgs& args) override { 77 void OnBeginFrame(const cc::BeginFrameArgs& args) override {
72 external_begin_frame_source_->OnBeginFrame(args); 78 sink_client_->OnBeginFrame(args);
73 last_begin_frame_args_ = args; 79 last_begin_frame_args_ = args;
74 } 80 }
75 81
76 const cc::BeginFrameArgs& LastUsedBeginFrameArgs() const override { 82 const cc::BeginFrameArgs& LastUsedBeginFrameArgs() const override {
77 return last_begin_frame_args_; 83 return last_begin_frame_args_;
78 } 84 }
79 85
80 void OnBeginFrameSourcePausedChanged(bool paused) override {} 86 void OnBeginFrameSourcePausedChanged(bool paused) override {}
81 87
82 // cc::ExternalBeginFrameSourceClient implementation: 88 void SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) {
83 void OnNeedsBeginFrames(bool needs_begin_frames) override { 89 begin_frame_source_ = begin_frame_source;
84 needs_begin_frames_ = needs_begin_frames;
85 UpdateNeedsBeginFramesInternal();
86 } 90 }
87 91
88 void OnDidFinishFrame(const cc::BeginFrameAck& ack) override { 92 const cc::RenderPassList& last_render_pass_list() const {
89 begin_frame_source_->DidFinishFrame(this, ack); 93 return last_frame_.render_pass_list;
90 }
91
92 void SetBeginFrameSource(cc::BeginFrameSource* source) {
93 if (begin_frame_source_ && observing_begin_frames_) {
94 begin_frame_source_->RemoveObserver(this);
95 observing_begin_frames_ = false;
96 }
97 begin_frame_source_ = source;
98 UpdateNeedsBeginFramesInternal();
99 } 94 }
100 95
101 const cc::CompositorFrameMetadata& last_metadata() const { 96 const cc::CompositorFrameMetadata& last_metadata() const {
102 return last_frame_.metadata; 97 return last_frame_.metadata;
103 } 98 }
104 99
105 const cc::RenderPassList& last_render_pass_list() const {
106 return last_frame_.render_pass_list;
107 }
108
109 int number_frames_received() { return number_frames_received_; }
110
111 private: 100 private:
112 void UpdateNeedsBeginFramesInternal() { 101 cc::mojom::MojoCompositorFrameSinkClient* sink_client_;
113 if (!begin_frame_source_) 102 cc::BeginFrameArgs last_begin_frame_args_;
114 return; 103 cc::CompositorFrame last_frame_;
115
116 if (needs_begin_frames_ == observing_begin_frames_)
117 return;
118
119 observing_begin_frames_ = needs_begin_frames_;
120 if (needs_begin_frames_) {
121 begin_frame_source_->AddObserver(this);
122 } else {
123 begin_frame_source_->RemoveObserver(this);
124 }
125 }
126
127 int number_frames_received_ = 0;
128 std::unique_ptr<cc::ExternalBeginFrameSource> external_begin_frame_source_;
129 cc::BeginFrameSource* begin_frame_source_ = nullptr; 104 cc::BeginFrameSource* begin_frame_source_ = nullptr;
130 cc::BeginFrameArgs last_begin_frame_args_;
131 bool observing_begin_frames_ = false; 105 bool observing_begin_frames_ = false;
132 bool needs_begin_frames_ = false;
133 cc::CompositorFrame last_frame_;
134
135 DISALLOW_COPY_AND_ASSIGN(FakeCompositorFrameSink);
136 }; 106 };
137 107
138 class FrameGeneratorTest : public testing::Test { 108 class FrameGeneratorTest : public testing::Test {
139 public: 109 public:
140 FrameGeneratorTest() {} 110 FrameGeneratorTest() {}
141 ~FrameGeneratorTest() override {} 111 ~FrameGeneratorTest() override = default;
142 112
143 // testing::Test overrides: 113 // testing::Test overrides:
144 void SetUp() override { 114 void SetUp() override {
145 testing::Test::SetUp(); 115 testing::Test::SetUp();
146 116
147 std::unique_ptr<FakeCompositorFrameSink> compositor_frame_sink =
148 base::MakeUnique<FakeCompositorFrameSink>();
149 compositor_frame_sink_ = compositor_frame_sink.get();
150
151 constexpr float kRefreshRate = 0.f; 117 constexpr float kRefreshRate = 0.f;
152 constexpr bool kTickAutomatically = false; 118 constexpr bool kTickAutomatically = false;
119 frame_generator_ = base::MakeUnique<FrameGenerator>();
153 begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>( 120 begin_frame_source_ = base::MakeUnique<cc::FakeExternalBeginFrameSource>(
154 kRefreshRate, kTickAutomatically); 121 kRefreshRate, kTickAutomatically);
155 compositor_frame_sink_->SetBeginFrameSource(begin_frame_source_.get());
156 server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>();
157 frame_generator_ =
158 base::MakeUnique<FrameGenerator>(std::move(compositor_frame_sink));
159 frame_generator_->OnWindowSizeChanged(gfx::Size(1, 2));
160 }; 122 };
161 123
162 void InitWithSurfaceInfo() { 124 void InitWithSurfaceInfo(std::unique_ptr<TestClientBinding> client_binding) {
163 // FrameGenerator requires a valid SurfaceInfo before generating 125 // FrameGenerator requires a valid SurfaceInfo before generating
164 // CompositorFrames. 126 // CompositorFrames.
127 TestClientBinding* binding = client_binding.get();
128 client_binding->SetBeginFrameSource(begin_frame_source_.get());
129 frame_generator_->Bind(std::move(client_binding));
165 const cc::SurfaceId kArbitrarySurfaceId( 130 const cc::SurfaceId kArbitrarySurfaceId(
166 cc::FrameSinkId(1, 1), 131 cc::FrameSinkId(1, 1),
167 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 132 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
168 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 133 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
169 gfx::Size(100, 100)); 134 gfx::Size(100, 100));
170 135 frame_generator_->OnSurfaceCreated(kArbitrarySurfaceInfo);
171 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); 136 EXPECT_CALL(*binding, SubmitCompositorFrameInternal());
172 IssueBeginFrame(); 137 IssueBeginFrame();
173 EXPECT_EQ(1, NumberOfFramesReceived());
174 }
175
176 int NumberOfFramesReceived() {
177 return compositor_frame_sink_->number_frames_received();
178 } 138 }
179 139
180 void IssueBeginFrame() { 140 void IssueBeginFrame() {
181 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting( 141 begin_frame_source_->TestOnBeginFrame(cc::CreateBeginFrameArgsForTesting(
182 BEGINFRAME_FROM_HERE, 0, next_sequence_number_)); 142 BEGINFRAME_FROM_HERE, 0, next_sequence_number_));
183 ++next_sequence_number_; 143 ++next_sequence_number_;
184 } 144 }
185 145
186 FrameGenerator* frame_generator() { return frame_generator_.get(); } 146 const cc::BeginFrameAck& LastBeginFrameAck(
187 147 TestClientBinding* test_client_binding) {
188 const cc::CompositorFrameMetadata& LastMetadata() const { 148 return begin_frame_source_->LastAckForObserver(test_client_binding);
189 return compositor_frame_sink_->last_metadata();
190 } 149 }
191 150
192 const cc::RenderPassList& LastRenderPassList() const { 151 FrameGenerator* frame_generator() { return frame_generator_.get(); }
193 return compositor_frame_sink_->last_render_pass_list(); 152 cc::BeginFrameSource* begin_frame_source() {
194 } 153 return begin_frame_source_.get();
195
196 const cc::BeginFrameAck& LastBeginFrameAck() {
197 return begin_frame_source_->LastAckForObserver(compositor_frame_sink_);
198 } 154 }
199 155
200 private: 156 private:
201 FakeCompositorFrameSink* compositor_frame_sink_ = nullptr;
202 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; 157 std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_;
203 std::unique_ptr<TestServerWindowDelegate> server_window_delegate_;
204 std::unique_ptr<FrameGenerator> frame_generator_; 158 std::unique_ptr<FrameGenerator> frame_generator_;
205 int next_sequence_number_ = 1; 159 int next_sequence_number_ = 1;
206 160
207 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); 161 DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest);
208 }; 162 };
209 163
210 TEST_F(FrameGeneratorTest, InvalidSurfaceInfo) {
211 // After SetUP(), frame_generator() has its |is_window_visible_| set to true
212 // and |bounds_| to an arbitrary non-empty gfx::Rect but not a valid
213 // SurfaceInfo. frame_generator() should not request BeginFrames in this
214 // state.
215 IssueBeginFrame();
216 EXPECT_EQ(0, NumberOfFramesReceived());
217 }
218
219 TEST_F(FrameGeneratorTest, OnSurfaceCreated) { 164 TEST_F(FrameGeneratorTest, OnSurfaceCreated) {
220 EXPECT_EQ(0, NumberOfFramesReceived()); 165 std::unique_ptr<TestClientBinding> test_client_binding =
221 166 base::MakeUnique<TestClientBinding>(frame_generator());
167 test_client_binding->SetBeginFrameSource(begin_frame_source());
168 TestClientBinding* binding = test_client_binding.get();
169 frame_generator()->Bind(std::move(test_client_binding));
222 // FrameGenerator does not request BeginFrames upon creation. 170 // FrameGenerator does not request BeginFrames upon creation.
223 IssueBeginFrame(); 171 IssueBeginFrame();
224 EXPECT_EQ(0, NumberOfFramesReceived()); 172 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck(binding));
225 EXPECT_EQ(cc::BeginFrameAck(), LastBeginFrameAck());
226 173
227 const cc::SurfaceId kArbitrarySurfaceId( 174 const cc::SurfaceId kArbitrarySurfaceId(
228 cc::FrameSinkId(1, 1), 175 cc::FrameSinkId(1, 1),
229 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 176 cc::LocalSurfaceId(1, base::UnguessableToken::Create()));
230 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, 177 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
231 gfx::Size(100, 100)); 178 gfx::Size(100, 100));
232 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); 179 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
233 EXPECT_EQ(0, NumberOfFramesReceived()); 180 frame_generator()->OnWindowSizeChanged(gfx::Size(1, 2));
234 181
182 EXPECT_CALL(*binding, SubmitCompositorFrameInternal());
235 IssueBeginFrame(); 183 IssueBeginFrame();
236 EXPECT_EQ(1, NumberOfFramesReceived());
237 184
238 // Verify that the CompositorFrame refers to the window manager's surface via 185 // Verify that the CompositorFrame refers to the window manager's surface via
239 // referenced_surfaces. 186 // referenced_surfaces.
240 const cc::CompositorFrameMetadata& last_metadata = LastMetadata(); 187 const cc::CompositorFrameMetadata& last_metadata = binding->last_metadata();
241 const std::vector<cc::SurfaceId>& referenced_surfaces = 188 const std::vector<cc::SurfaceId>& referenced_surfaces =
242 last_metadata.referenced_surfaces; 189 last_metadata.referenced_surfaces;
243 EXPECT_EQ(1lu, referenced_surfaces.size()); 190 EXPECT_EQ(1lu, referenced_surfaces.size());
244 EXPECT_EQ(kArbitrarySurfaceId, referenced_surfaces.front()); 191 EXPECT_EQ(kArbitrarySurfaceId, referenced_surfaces.front());
245 192
246 cc::BeginFrameAck expected_ack(0, 2, 2, true); 193 cc::BeginFrameAck expected_ack(0, 2, 2, true);
247 EXPECT_EQ(expected_ack, LastBeginFrameAck()); 194 EXPECT_EQ(expected_ack, LastBeginFrameAck(binding));
248 EXPECT_EQ(expected_ack, last_metadata.begin_frame_ack); 195 EXPECT_EQ(expected_ack, last_metadata.begin_frame_ack);
249 196
250 // FrameGenerator stops requesting BeginFrames after submitting a 197 // FrameGenerator stops requesting BeginFrames after submitting a
251 // CompositorFrame. 198 // CompositorFrame.
252 IssueBeginFrame(); 199 IssueBeginFrame();
253 EXPECT_EQ(1, NumberOfFramesReceived()); 200 EXPECT_EQ(expected_ack, LastBeginFrameAck(binding));
254 EXPECT_EQ(expected_ack, LastBeginFrameAck());
255 } 201 }
256 202
257 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) { 203 TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) {
258 EXPECT_EQ(0, NumberOfFramesReceived()); 204 std::unique_ptr<TestClientBinding> test_client_binding =
259 const cc::SurfaceId kArbitrarySurfaceId( 205 base::MakeUnique<TestClientBinding>(frame_generator());
260 cc::FrameSinkId(1, 1), 206 TestClientBinding* binding = test_client_binding.get();
261 cc::LocalSurfaceId(1, base::UnguessableToken::Create())); 207 InitWithSurfaceInfo(std::move(test_client_binding));
262 const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f,
263 gfx::Size(100, 100));
264 constexpr float kDefaultScaleFactor = 1.0f; 208 constexpr float kDefaultScaleFactor = 1.0f;
265 constexpr float kArbitraryScaleFactor = 0.5f; 209 constexpr float kArbitraryScaleFactor = 0.5f;
266 210
267 // A valid SurfaceInfo is required before setting device scale factor.
268 frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo);
269 IssueBeginFrame();
270 EXPECT_EQ(1, NumberOfFramesReceived());
271
272 // FrameGenerator stops requesting BeginFrames after receiving one.
273 IssueBeginFrame();
274 EXPECT_EQ(1, NumberOfFramesReceived());
275
276 // FrameGenerator does not request BeginFrames if its device scale factor 211 // FrameGenerator does not request BeginFrames if its device scale factor
277 // remains unchanged. 212 // remains unchanged.
278 frame_generator()->SetDeviceScaleFactor(kDefaultScaleFactor); 213 frame_generator()->SetDeviceScaleFactor(kDefaultScaleFactor);
279 IssueBeginFrame(); 214 IssueBeginFrame();
280 EXPECT_EQ(1, NumberOfFramesReceived()); 215 const cc::CompositorFrameMetadata& last_metadata = binding->last_metadata();
281 const cc::CompositorFrameMetadata& last_metadata = LastMetadata();
282 EXPECT_EQ(kDefaultScaleFactor, last_metadata.device_scale_factor); 216 EXPECT_EQ(kDefaultScaleFactor, last_metadata.device_scale_factor);
283 217
218 EXPECT_CALL(*binding, SubmitCompositorFrameInternal());
284 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor); 219 frame_generator()->SetDeviceScaleFactor(kArbitraryScaleFactor);
285 IssueBeginFrame(); 220 IssueBeginFrame();
286 EXPECT_EQ(2, NumberOfFramesReceived()); 221 const cc::CompositorFrameMetadata& second_last_metadata =
287 const cc::CompositorFrameMetadata& second_last_metadata = LastMetadata(); 222 binding->last_metadata();
288 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor); 223 EXPECT_EQ(kArbitraryScaleFactor, second_last_metadata.device_scale_factor);
289 } 224 }
290 225
291 TEST_F(FrameGeneratorTest, SetHighContrastMode) { 226 TEST_F(FrameGeneratorTest, SetHighContrastMode) {
292 InitWithSurfaceInfo(); 227 std::unique_ptr<TestClientBinding> test_client_binding =
228 base::MakeUnique<TestClientBinding>(frame_generator());
229 TestClientBinding* binding = test_client_binding.get();
230 InitWithSurfaceInfo(std::move(test_client_binding));
293 231
294 // Changing high contrast mode should trigger a BeginFrame. 232 // Changing high contrast mode should trigger a BeginFrame.
233 EXPECT_CALL(*binding, SubmitCompositorFrameInternal());
295 frame_generator()->SetHighContrastMode(true); 234 frame_generator()->SetHighContrastMode(true);
296 IssueBeginFrame(); 235 IssueBeginFrame();
297 EXPECT_EQ(2, NumberOfFramesReceived());
298 236
299 // Verify that the last frame has an invert filter. 237 // Verify that the last frame has an invert filter.
300 const cc::RenderPassList& render_pass_list = LastRenderPassList(); 238 const cc::RenderPassList& render_pass_list = binding->last_render_pass_list();
301 const cc::FilterOperations expected_filters( 239 const cc::FilterOperations expected_filters(
302 {cc::FilterOperation::CreateInvertFilter(1.f)}); 240 {cc::FilterOperation::CreateInvertFilter(1.f)});
303 EXPECT_EQ(expected_filters, render_pass_list.front()->filters); 241 EXPECT_EQ(expected_filters, render_pass_list.front()->filters);
304 } 242 }
305 243
306 TEST_F(FrameGeneratorTest, WindowBoundsChanged) { 244 TEST_F(FrameGeneratorTest, WindowBoundsChanged) {
307 InitWithSurfaceInfo(); 245 std::unique_ptr<TestClientBinding> test_client_binding =
246 base::MakeUnique<TestClientBinding>(frame_generator());
247 TestClientBinding* binding = test_client_binding.get();
248 InitWithSurfaceInfo(std::move(test_client_binding));
308 249
309 // Window bounds change triggers a BeginFrame. 250 // Window bounds change triggers a BeginFrame.
310 constexpr int expected_render_pass_id = 1; 251 constexpr int expected_render_pass_id = 1;
311 const gfx::Size kArbitrarySize(3, 4); 252 const gfx::Size kArbitrarySize(3, 4);
253 EXPECT_CALL(*binding, SubmitCompositorFrameInternal());
312 frame_generator()->OnWindowSizeChanged(kArbitrarySize); 254 frame_generator()->OnWindowSizeChanged(kArbitrarySize);
313 IssueBeginFrame(); 255 IssueBeginFrame();
314 EXPECT_EQ(2, NumberOfFramesReceived()); 256 cc::RenderPass* received_render_pass =
315 cc::RenderPass* received_render_pass = LastRenderPassList().front().get(); 257 binding->last_render_pass_list().front().get();
316 EXPECT_EQ(expected_render_pass_id, received_render_pass->id); 258 EXPECT_EQ(expected_render_pass_id, received_render_pass->id);
317 EXPECT_EQ(kArbitrarySize, received_render_pass->output_rect.size()); 259 EXPECT_EQ(kArbitrarySize, received_render_pass->output_rect.size());
318 EXPECT_EQ(kArbitrarySize, received_render_pass->damage_rect.size()); 260 EXPECT_EQ(kArbitrarySize, received_render_pass->damage_rect.size());
319 EXPECT_EQ(gfx::Transform(), received_render_pass->transform_to_root_target); 261 EXPECT_EQ(gfx::Transform(), received_render_pass->transform_to_root_target);
320 } 262 }
321 263
322 // Change window bounds twice before issuing a BeginFrame. The CompositorFrame 264 // Change window bounds twice before issuing a BeginFrame. The CompositorFrame
323 // submitted by frame_generator() should only has the second bounds. 265 // submitted by frame_generator() should only has the second bounds.
324 TEST_F(FrameGeneratorTest, WindowBoundsChangedTwice) { 266 TEST_F(FrameGeneratorTest, WindowBoundsChangedTwice) {
325 InitWithSurfaceInfo(); 267 std::unique_ptr<TestClientBinding> test_client_binding =
268 base::MakeUnique<TestClientBinding>(frame_generator());
269 TestClientBinding* binding = test_client_binding.get();
270 InitWithSurfaceInfo(std::move(test_client_binding));
326 271
327 const gfx::Size kArbitrarySize(3, 4); 272 const gfx::Size kArbitrarySize(3, 4);
328 const gfx::Size kAnotherArbitrarySize(5, 6); 273 const gfx::Size kAnotherArbitrarySize(5, 6);
274 EXPECT_CALL(*binding, SubmitCompositorFrameInternal());
329 frame_generator()->OnWindowSizeChanged(kArbitrarySize); 275 frame_generator()->OnWindowSizeChanged(kArbitrarySize);
330 frame_generator()->OnWindowSizeChanged(kAnotherArbitrarySize); 276 frame_generator()->OnWindowSizeChanged(kAnotherArbitrarySize);
331 IssueBeginFrame(); 277 IssueBeginFrame();
332 EXPECT_EQ(2, NumberOfFramesReceived()); 278 cc::RenderPass* received_render_pass =
333 cc::RenderPass* received_render_pass = LastRenderPassList().front().get(); 279 binding->last_render_pass_list().front().get();
334 EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->output_rect.size()); 280 EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->output_rect.size());
335 EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->damage_rect.size()); 281 EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->damage_rect.size());
336 282
337 // frame_generator() stops requesting BeginFrames after getting one. 283 // frame_generator() stops requesting BeginFrames after getting one.
338 IssueBeginFrame(); 284 IssueBeginFrame();
339 EXPECT_EQ(2, NumberOfFramesReceived());
340 } 285 }
341 286
342 TEST_F(FrameGeneratorTest, WindowDamaged) { 287 TEST_F(FrameGeneratorTest, WindowDamaged) {
343 InitWithSurfaceInfo(); 288 std::unique_ptr<TestClientBinding> test_client_binding =
289 base::MakeUnique<TestClientBinding>(frame_generator());
290 TestClientBinding* binding = test_client_binding.get();
291 InitWithSurfaceInfo(std::move(test_client_binding));
344 292
293 EXPECT_CALL(*binding, SubmitCompositorFrameInternal());
345 frame_generator()->OnWindowDamaged(); 294 frame_generator()->OnWindowDamaged();
346 IssueBeginFrame(); 295 IssueBeginFrame();
347 EXPECT_EQ(2, NumberOfFramesReceived());
348 } 296 }
349 297
350 } // namespace test 298 } // namespace test
351 } // namespace ws 299 } // namespace ws
352 } // namespace ui 300 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698