Index: content/renderer/queue_message_swap_promise.cc |
diff --git a/content/renderer/queue_message_swap_promise.cc b/content/renderer/queue_message_swap_promise.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f57654b105629b22a6b7cf39d081447a2db66abc |
--- /dev/null |
+++ b/content/renderer/queue_message_swap_promise.cc |
@@ -0,0 +1,63 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/renderer/queue_message_swap_promise.h" |
+#include "content/renderer/gpu/frame_swap_message_queue.h" |
+#include "ipc/ipc_sync_message_filter.h" |
+ |
+namespace content { |
+ |
+QueueMessageSwapPromise::QueueMessageSwapPromise( |
+ scoped_refptr<IPC::SyncMessageFilter> message_sender, |
+ scoped_refptr<content::FrameSwapMessageQueue> message_queue, |
+ int source_frame_number) |
+ : message_sender_(message_sender), |
+ message_queue_(message_queue), |
+ source_frame_number_(source_frame_number), |
+#ifndef NDEBUG |
+ completed_(false) |
+#endif |
+{ |
+ DCHECK(message_sender_.get()); |
+ DCHECK(message_queue_.get()); |
+} |
+ |
+QueueMessageSwapPromise::~QueueMessageSwapPromise() { |
+ // The promise should have either been kept or broken before it's deleted. |
+ DCHECK(completed_); |
+} |
+ |
+void QueueMessageSwapPromise::DidSwap(cc::CompositorFrameMetadata* metadata) { |
+ DCHECK(!completed_); |
+ message_queue_->AdvanceToFrame(source_frame_number_); |
+ // The OutputSurface will take care of the Drain+Send. |
+ PromiseCompleted(); |
+} |
+ |
+void QueueMessageSwapPromise::DidNotSwap(DidNotSwapReason reason) { |
+ DCHECK(!completed_); |
+ // This will also send messages explicitly queued with the WITH_NEXT_SWAP |
+ // policy. It makes sense to send them if reason == SWAP_FAILS, but they may |
+ // end up being sent prematurely if reason == COMMIT_FAILS. |
+ ScopedVector<IPC::Message> messages; |
+ message_queue_->AdvanceToFrame(source_frame_number_); |
+ scoped_ptr<content::FrameSwapMessageQueue::SendMessageScope> |
+ send_message_scope = message_queue_->AcquireSendMessageScope(); |
+ message_queue_->DrainMessages(&messages); |
+ for (ScopedVector<IPC::Message>::iterator i = messages.begin(); |
+ i != messages.end(); |
+ ++i) { |
+ message_sender_->Send(*i); |
+ } |
+ messages.weak_clear(); |
+ PromiseCompleted(); |
+} |
+ |
+void QueueMessageSwapPromise::PromiseCompleted() { |
+#ifndef NDEBUG |
+ completed_ = true; |
+#endif |
+} |
+ |
+} // namespace content |