Index: content/renderer/gpu/compositor_forwarding_message_filter.cc |
diff --git a/content/renderer/gpu/compositor_forwarding_message_filter.cc b/content/renderer/gpu/compositor_forwarding_message_filter.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ff657dc58f6706d48e8e76b77f6efaceced523a3 |
--- /dev/null |
+++ b/content/renderer/gpu/compositor_forwarding_message_filter.cc |
@@ -0,0 +1,79 @@ |
+// 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/gpu//compositor_forwarding_message_filter.h" |
+ |
+#include "base/bind.h" |
+#include "base/location.h" |
+#include "content/common/view_messages.h" |
+#include "ipc/ipc_message.h" |
+ |
+namespace content { |
+ |
+CompositorForwardingMessageFilter::CompositorForwardingMessageFilter( |
+ base::TaskRunner* compositor_task_runner) |
+ : compositor_task_runner_(compositor_task_runner) { |
+ DCHECK(compositor_task_runner_.get()); |
+ // This check will only be used by functions running on compositor thread. |
+ compositor_thread_checker_.DetachFromThread(); |
+} |
+ |
+CompositorForwardingMessageFilter::~CompositorForwardingMessageFilter() { |
+} |
+ |
+void CompositorForwardingMessageFilter::AddHandlerOnCompositorThread( |
+ int routing_id, |
+ const Handler& handler) { |
+ DCHECK(compositor_thread_checker_.CalledOnValidThread()); |
+ DCHECK(!handler.is_null()); |
+ multi_handlers_.insert(std::make_pair(routing_id, handler)); |
+} |
+ |
+void CompositorForwardingMessageFilter::RemoveHandlerOnCompositorThread( |
+ int routing_id, |
+ const Handler& handler) { |
+ DCHECK(compositor_thread_checker_.CalledOnValidThread()); |
+ auto handlers = multi_handlers_.equal_range(routing_id); |
+ for (auto it = handlers.first; it != handlers.second; ++it) { |
+ if (it->second.Equals(handler)) { |
+ multi_handlers_.erase(it); |
+ return; |
+ } |
+ } |
+ NOTREACHED(); |
+} |
+ |
+bool CompositorForwardingMessageFilter::OnMessageReceived( |
+ const IPC::Message& message) { |
+ switch(message.type()) { |
+ case ViewMsg_BeginFrame::ID: // Fall through. |
+ case ViewMsg_ReclaimCompositorResources::ID: // Fall through. |
+ case ViewMsg_SwapCompositorFrameAck::ID: // Fall through. |
+ case ViewMsg_UpdateVSyncParameters::ID: |
+ break; |
+ default: |
+ return false; |
+ } |
+ |
+ compositor_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &CompositorForwardingMessageFilter::ProcessMessageOnCompositorThread, |
+ this, |
+ message)); |
+ return true; |
+} |
+ |
+void CompositorForwardingMessageFilter::ProcessMessageOnCompositorThread( |
+ const IPC::Message& message) { |
+ DCHECK(compositor_thread_checker_.CalledOnValidThread()); |
+ auto handlers = multi_handlers_.equal_range(message.routing_id()); |
+ if (handlers.first == handlers.second) |
+ return; |
+ |
+ for (auto it = handlers.first; it != handlers.second; ++it) |
+ it->second.Run(message); |
+} |
+ |
+} // namespace content |