OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/renderer/gpu/queue_message_swap_promise.h" | 5 #include "content/renderer/gpu/queue_message_swap_promise.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "cc/output/swap_promise.h" | 10 #include "cc/output/swap_promise.h" |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 QueueMessageImpl(new IPC::Message(messages_[i]), | 108 QueueMessageImpl(new IPC::Message(messages_[i]), |
109 data[i].policy, | 109 data[i].policy, |
110 data[i].source_frame_number).release()); | 110 data[i].source_frame_number).release()); |
111 } | 111 } |
112 } | 112 } |
113 | 113 |
114 void CleanupPromises() { | 114 void CleanupPromises() { |
115 for (ScopedVector<cc::SwapPromise>::iterator i = promises_.begin(); | 115 for (ScopedVector<cc::SwapPromise>::iterator i = promises_.begin(); |
116 i != promises_.end(); | 116 i != promises_.end(); |
117 ++i) { | 117 ++i) { |
118 if (*i) | 118 if (*i) { |
| 119 (*i)->DidActivate(); |
119 (*i)->DidSwap(NULL); | 120 (*i)->DidSwap(NULL); |
| 121 } |
120 } | 122 } |
121 } | 123 } |
122 | 124 |
123 protected: | 125 protected: |
124 void VisualStateSwapPromiseDidNotSwap( | 126 void VisualStateSwapPromiseDidNotSwap( |
125 cc::SwapPromise::DidNotSwapReason reason); | 127 cc::SwapPromise::DidNotSwapReason reason); |
126 | 128 |
127 base::MessageLoop message_loop_; | 129 base::MessageLoop message_loop_; |
128 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_; | 130 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_; |
129 scoped_refptr<TestSyncMessageFilter> sync_message_filter_; | 131 scoped_refptr<TestSyncMessageFilter> sync_message_filter_; |
130 std::vector<IPC::Message> messages_; | 132 std::vector<IPC::Message> messages_; |
131 ScopedVector<cc::SwapPromise> promises_; | 133 ScopedVector<cc::SwapPromise> promises_; |
132 | 134 |
133 private: | 135 private: |
134 ScopedVector<IPC::Message> next_swap_messages_; | 136 ScopedVector<IPC::Message> next_swap_messages_; |
135 | 137 |
136 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest); | 138 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest); |
137 }; | 139 }; |
138 | 140 |
139 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) { | 141 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) { |
140 QueueMessageData data[] = { | 142 QueueMessageData data[] = { |
141 /* { policy, source_frame_number } */ | 143 /* { policy, source_frame_number } */ |
142 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, | 144 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, |
143 }; | 145 }; |
144 QueueMessages(data, arraysize(data)); | 146 QueueMessages(data, arraysize(data)); |
145 | 147 |
146 ASSERT_TRUE(promises_[0]); | 148 ASSERT_TRUE(promises_[0]); |
| 149 promises_[0]->DidActivate(); |
| 150 promises_[0]->DidSwap(NULL); |
| 151 |
147 EXPECT_TRUE(DirectSendMessages().empty()); | 152 EXPECT_TRUE(DirectSendMessages().empty()); |
148 EXPECT_FALSE(frame_swap_message_queue_->Empty()); | 153 EXPECT_FALSE(frame_swap_message_queue_->Empty()); |
| 154 // frame_swap_message_queue_->DidSwap(1); |
149 EXPECT_TRUE(NextSwapHasMessage(messages_[0])); | 155 EXPECT_TRUE(NextSwapHasMessage(messages_[0])); |
150 | |
151 CleanupPromises(); | |
152 } | 156 } |
153 | 157 |
154 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) { | 158 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) { |
155 QueueMessageData data[] = { | 159 QueueMessageData data[] = { |
156 /* { policy, source_frame_number } */ | 160 /* { policy, source_frame_number } */ |
157 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, | 161 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, |
158 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, | 162 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, |
159 }; | 163 }; |
160 QueueMessages(data, arraysize(data)); | 164 QueueMessages(data, arraysize(data)); |
161 | 165 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) { | 198 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) { |
195 QueueMessageData data[] = { | 199 QueueMessageData data[] = { |
196 /* { policy, source_frame_number } */ | 200 /* { policy, source_frame_number } */ |
197 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, | 201 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, |
198 }; | 202 }; |
199 QueueMessages(data, arraysize(data)); | 203 QueueMessages(data, arraysize(data)); |
200 | 204 |
201 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS); | 205 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS); |
202 EXPECT_TRUE(DirectSendMessages().empty()); | 206 EXPECT_TRUE(DirectSendMessages().empty()); |
203 EXPECT_FALSE(frame_swap_message_queue_->Empty()); | 207 EXPECT_FALSE(frame_swap_message_queue_->Empty()); |
| 208 frame_swap_message_queue_->DidSwap(2); |
204 EXPECT_TRUE(NextSwapHasMessage(messages_[0])); | 209 EXPECT_TRUE(NextSwapHasMessage(messages_[0])); |
205 } | 210 } |
206 | 211 |
207 TEST_F(QueueMessageSwapPromiseTest, | 212 TEST_F(QueueMessageSwapPromiseTest, |
208 VisualStateQueuesMessageWhenCommitRequested) { | 213 VisualStateQueuesMessageWhenCommitRequested) { |
209 QueueMessageData data[] = { | 214 QueueMessageData data[] = { |
210 /* { policy, source_frame_number } */ | 215 /* { policy, source_frame_number } */ |
211 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, | 216 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, |
212 }; | 217 }; |
213 QueueMessages(data, arraysize(data)); | 218 QueueMessages(data, arraysize(data)); |
(...skipping 15 matching lines...) Expand all Loading... |
229 }; | 234 }; |
230 QueueMessages(data, arraysize(data)); | 235 QueueMessages(data, arraysize(data)); |
231 | 236 |
232 EXPECT_TRUE(DirectSendMessages().empty()); | 237 EXPECT_TRUE(DirectSendMessages().empty()); |
233 EXPECT_FALSE(frame_swap_message_queue_->Empty()); | 238 EXPECT_FALSE(frame_swap_message_queue_->Empty()); |
234 EXPECT_FALSE(NextSwapHasMessage(messages_[1])); | 239 EXPECT_FALSE(NextSwapHasMessage(messages_[1])); |
235 | 240 |
236 CleanupPromises(); | 241 CleanupPromises(); |
237 } | 242 } |
238 | 243 |
239 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidSwap) { | 244 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidActivate) { |
240 QueueMessageData data[] = { | 245 QueueMessageData data[] = { |
241 /* { policy, source_frame_number } */ | 246 /* { policy, source_frame_number } */ |
242 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, | 247 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, |
243 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, | 248 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, |
244 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2}, | 249 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2}, |
245 }; | 250 }; |
246 QueueMessages(data, arraysize(data)); | 251 QueueMessages(data, arraysize(data)); |
247 | 252 |
| 253 promises_[0]->DidActivate(); |
248 promises_[0]->DidSwap(NULL); | 254 promises_[0]->DidSwap(NULL); |
249 ASSERT_FALSE(promises_[1]); | 255 ASSERT_FALSE(promises_[1]); |
250 ScopedVector<IPC::Message> messages; | 256 ScopedVector<IPC::Message> messages; |
251 messages.swap(NextSwapMessages()); | 257 messages.swap(NextSwapMessages()); |
252 EXPECT_EQ(2u, messages.size()); | 258 EXPECT_EQ(2u, messages.size()); |
253 EXPECT_TRUE(ContainsMessage(messages, messages_[0])); | 259 EXPECT_TRUE(ContainsMessage(messages, messages_[0])); |
254 EXPECT_TRUE(ContainsMessage(messages, messages_[1])); | 260 EXPECT_TRUE(ContainsMessage(messages, messages_[1])); |
255 EXPECT_FALSE(ContainsMessage(messages, messages_[2])); | 261 EXPECT_FALSE(ContainsMessage(messages, messages_[2])); |
256 | 262 |
257 promises_[2]->DidSwap(NULL); | 263 promises_[2]->DidActivate(); |
| 264 promises_[2]->DidNotSwap(cc::SwapPromise::SWAP_FAILS); |
258 messages.swap(NextSwapMessages()); | 265 messages.swap(NextSwapMessages()); |
259 EXPECT_EQ(1u, messages.size()); | 266 EXPECT_EQ(1u, messages.size()); |
260 EXPECT_TRUE(ContainsMessage(messages, messages_[2])); | 267 EXPECT_TRUE(ContainsMessage(messages, messages_[2])); |
261 | 268 |
262 EXPECT_TRUE(DirectSendMessages().empty()); | 269 EXPECT_TRUE(DirectSendMessages().empty()); |
263 EXPECT_TRUE(NextSwapMessages().empty()); | 270 EXPECT_TRUE(NextSwapMessages().empty()); |
264 EXPECT_TRUE(frame_swap_message_queue_->Empty()); | 271 EXPECT_TRUE(frame_swap_message_queue_->Empty()); |
265 } | 272 } |
266 | 273 |
267 void QueueMessageSwapPromiseTest::VisualStateSwapPromiseDidNotSwap( | 274 void QueueMessageSwapPromiseTest::VisualStateSwapPromiseDidNotSwap( |
268 cc::SwapPromise::DidNotSwapReason reason) { | 275 cc::SwapPromise::DidNotSwapReason reason) { |
269 QueueMessageData data[] = { | 276 QueueMessageData data[] = { |
270 /* { policy, source_frame_number } */ | 277 /* { policy, source_frame_number } */ |
271 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, | 278 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, |
272 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, | 279 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, |
273 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2}, | 280 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2}, |
274 }; | 281 }; |
275 QueueMessages(data, arraysize(data)); | 282 QueueMessages(data, arraysize(data)); |
276 | 283 |
| 284 // If we fail to swap with COMMIT_FAILS or ACTIVATE_FAILS, then |
| 285 // messages are delivered by the RenderFrameHostImpl destructor, |
| 286 // rather than directly by the swap promise. |
| 287 bool msg_delivered = reason != cc::SwapPromise::COMMIT_FAILS && |
| 288 reason != cc::SwapPromise::ACTIVATION_FAILS; |
| 289 |
277 promises_[0]->DidNotSwap(reason); | 290 promises_[0]->DidNotSwap(reason); |
278 ASSERT_FALSE(promises_[1]); | 291 ASSERT_FALSE(promises_[1]); |
279 EXPECT_TRUE(NextSwapMessages().empty()); | 292 EXPECT_TRUE(NextSwapMessages().empty()); |
280 EXPECT_EQ(2u, DirectSendMessages().size()); | 293 EXPECT_EQ(msg_delivered, ContainsMessage(DirectSendMessages(), messages_[0])); |
281 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0])); | 294 EXPECT_EQ(msg_delivered, ContainsMessage(DirectSendMessages(), messages_[1])); |
282 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[1])); | |
283 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[2])); | 295 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[2])); |
284 | 296 |
285 promises_[2]->DidNotSwap(reason); | 297 promises_[2]->DidNotSwap(reason); |
286 EXPECT_TRUE(NextSwapMessages().empty()); | 298 EXPECT_TRUE(NextSwapMessages().empty()); |
287 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[2])); | 299 EXPECT_EQ(msg_delivered, ContainsMessage(DirectSendMessages(), messages_[2])); |
288 | 300 |
289 EXPECT_TRUE(NextSwapMessages().empty()); | 301 EXPECT_TRUE(NextSwapMessages().empty()); |
290 EXPECT_TRUE(frame_swap_message_queue_->Empty()); | 302 EXPECT_EQ(msg_delivered, frame_swap_message_queue_->Empty()); |
291 } | 303 } |
292 | 304 |
293 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidNotSwapNoUpdate) { | 305 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidNotSwapNoUpdate) { |
294 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE); | 306 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE); |
295 } | 307 } |
296 | 308 |
297 TEST_F(QueueMessageSwapPromiseTest, | 309 TEST_F(QueueMessageSwapPromiseTest, |
298 VisualStateSwapPromiseDidNotSwapCommitFails) { | 310 VisualStateSwapPromiseDidNotSwapCommitFails) { |
299 // COMMIT_FAILS is treated differently: | 311 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::COMMIT_FAILS); |
300 // If we fail to swap with COMMIT_FAILS, then the renderer is | |
301 // shutting down, which implies that the RenderFrameHostImpl | |
302 // destructor will eventually be called, firing the remaining | |
303 // response callbacks (with swap_success = false) itself. | |
304 QueueMessageData data[] = { | |
305 /* { policy, source_frame_number } */ | |
306 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, | |
307 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, | |
308 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2}, | |
309 }; | |
310 QueueMessages(data, arraysize(data)); | |
311 | |
312 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS); | |
313 ASSERT_FALSE(promises_[1]); | |
314 EXPECT_TRUE(NextSwapMessages().empty()); | |
315 EXPECT_EQ(0u, DirectSendMessages().size()); | |
316 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[0])); | |
317 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[1])); | |
318 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[2])); | |
319 | |
320 promises_[2]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS); | |
321 EXPECT_TRUE(NextSwapMessages().empty()); | |
322 EXPECT_FALSE(ContainsMessage(DirectSendMessages(), messages_[2])); | |
323 | |
324 EXPECT_TRUE(NextSwapMessages().empty()); | |
325 EXPECT_FALSE(frame_swap_message_queue_->Empty()); | |
326 } | 312 } |
327 | 313 |
328 TEST_F(QueueMessageSwapPromiseTest, VisalStateSwapPromiseDidNotSwapSwapFails) { | 314 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidNotSwapSwapFails) { |
329 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS); | 315 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS); |
330 } | 316 } |
331 | 317 |
| 318 TEST_F(QueueMessageSwapPromiseTest, |
| 319 VisualStateSwapPromiseDidNotSwapActivationFails) { |
| 320 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::ACTIVATION_FAILS); |
| 321 } |
| 322 |
332 } // namespace content | 323 } // namespace content |
OLD | NEW |