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

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

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

Powered by Google App Engine
This is Rietveld 408576698