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

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

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