| 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 |