| 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/child/push_messaging/push_dispatcher.h" | 5 #include "content/child/push_messaging/push_dispatcher.h" |
| 6 | 6 |
| 7 #include "content/child/push_messaging/push_provider.h" | 7 #include "content/child/push_messaging/push_provider.h" |
| 8 #include "content/common/push_messaging_messages.h" | 8 #include "content/common/push_messaging_messages.h" |
| 9 | 9 |
| 10 namespace content { | 10 namespace content { |
| 11 | 11 |
| 12 PushDispatcher::PushDispatcher(ThreadSafeSender* thread_safe_sender) | 12 PushDispatcher::PushDispatcher(ThreadSafeSender* thread_safe_sender) |
| 13 : WorkerThreadMessageFilter(thread_safe_sender), next_request_id_(0) { | 13 : WorkerThreadMessageFilter(thread_safe_sender), next_request_id_(0) { |
| 14 } | 14 } |
| 15 | 15 |
| 16 PushDispatcher::~PushDispatcher() { | 16 PushDispatcher::~PushDispatcher() { |
| 17 } | 17 } |
| 18 | 18 |
| 19 int PushDispatcher::GenerateRequestId(int thread_id) { | 19 int PushDispatcher::GenerateRequestId(int thread_id) { |
| 20 base::AutoLock lock(request_id_map_lock_); | 20 base::AutoLock lock(request_id_map_lock_); |
| 21 request_id_map_[next_request_id_] = thread_id; | 21 request_id_map_[next_request_id_] = thread_id; |
| 22 return next_request_id_++; | 22 return next_request_id_++; |
| 23 } | 23 } |
| 24 | 24 |
| 25 bool PushDispatcher::ShouldHandleMessage(const IPC::Message& msg) const { | 25 bool PushDispatcher::ShouldHandleMessage(const IPC::Message& msg) const { |
| 26 // Note that not all Push API IPC messages flow through this class. A subset | 26 // Note that not all Push API IPC messages flow through this class. A subset |
| 27 // of the API functionality requires a direct association with a document and | 27 // of the API functionality requires a direct association with a document and |
| 28 // a frame, and for those cases the IPC messages are handled by a | 28 // a frame, and for those cases the IPC messages are handled by a |
| 29 // RenderFrameObserver. | 29 // RenderFrameObserver. |
| 30 return msg.type() == PushMessagingMsg_RegisterFromWorkerSuccess::ID || | 30 return msg.type() == PushMessagingMsg_SubscribeFromWorkerSuccess::ID || |
| 31 msg.type() == PushMessagingMsg_RegisterFromWorkerError::ID || | 31 msg.type() == PushMessagingMsg_SubscribeFromWorkerError::ID || |
| 32 msg.type() == PushMessagingMsg_GetRegistrationSuccess::ID || | 32 msg.type() == PushMessagingMsg_GetRegistrationSuccess::ID || |
| 33 msg.type() == PushMessagingMsg_GetRegistrationError::ID || | 33 msg.type() == PushMessagingMsg_GetRegistrationError::ID || |
| 34 msg.type() == PushMessagingMsg_GetPermissionStatusSuccess::ID || | 34 msg.type() == PushMessagingMsg_GetPermissionStatusSuccess::ID || |
| 35 msg.type() == PushMessagingMsg_GetPermissionStatusError::ID || | 35 msg.type() == PushMessagingMsg_GetPermissionStatusError::ID || |
| 36 msg.type() == PushMessagingMsg_UnregisterSuccess::ID || | 36 msg.type() == PushMessagingMsg_UnsubscribeSuccess::ID || |
| 37 msg.type() == PushMessagingMsg_UnregisterError::ID; | 37 msg.type() == PushMessagingMsg_UnsubscribeError::ID; |
| 38 } | 38 } |
| 39 | 39 |
| 40 void PushDispatcher::OnFilteredMessageReceived(const IPC::Message& msg) { | 40 void PushDispatcher::OnFilteredMessageReceived(const IPC::Message& msg) { |
| 41 bool handled = PushProvider::ThreadSpecificInstance( | 41 bool handled = PushProvider::ThreadSpecificInstance( |
| 42 thread_safe_sender(), this)->OnMessageReceived(msg); | 42 thread_safe_sender(), this)->OnMessageReceived(msg); |
| 43 DCHECK(handled); | 43 DCHECK(handled); |
| 44 } | 44 } |
| 45 | 45 |
| 46 bool PushDispatcher::GetWorkerThreadIdForMessage(const IPC::Message& msg, | 46 bool PushDispatcher::GetWorkerThreadIdForMessage(const IPC::Message& msg, |
| 47 int* ipc_thread_id) { | 47 int* ipc_thread_id) { |
| 48 int request_id = -1; | 48 int request_id = -1; |
| 49 | 49 |
| 50 const bool success = PickleIterator(msg).ReadInt(&request_id); | 50 const bool success = PickleIterator(msg).ReadInt(&request_id); |
| 51 DCHECK(success); | 51 DCHECK(success); |
| 52 | 52 |
| 53 base::AutoLock lock(request_id_map_lock_); | 53 base::AutoLock lock(request_id_map_lock_); |
| 54 auto it = request_id_map_.find(request_id); | 54 auto it = request_id_map_.find(request_id); |
| 55 if (it != request_id_map_.end()) { | 55 if (it != request_id_map_.end()) { |
| 56 *ipc_thread_id = it->second; | 56 *ipc_thread_id = it->second; |
| 57 request_id_map_.erase(it); | 57 request_id_map_.erase(it); |
| 58 return true; | 58 return true; |
| 59 } | 59 } |
| 60 return false; | 60 return false; |
| 61 } | 61 } |
| 62 | 62 |
| 63 } // namespace content | 63 } // namespace content |
| OLD | NEW |