1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/renderer/pepper/pepper_browser_connection.h" 6 7 #include <limits> 8 9 #include "base/logging.h" 10 #include "content/common/view_messages.h" 11 #include "content/renderer/pepper/pepper_in_process_router.h" 12 #include "content/renderer/render_frame_impl.h" 13 #include "ipc/ipc_message_macros.h" 14 #include "ppapi/proxy/ppapi_messages.h" 15 #include "ppapi/proxy/resource_message_params.h" 16 17 namespace content { 18 19 PepperBrowserConnection::PepperBrowserConnection(RenderFrame* render_frame) 20 : RenderFrameObserver(render_frame), 21 RenderFrameObserverTracker<PepperBrowserConnection>(render_frame), 22 next_sequence_number_(1) { 23 } 24 25 PepperBrowserConnection::~PepperBrowserConnection() { 26 } 27 28 bool PepperBrowserConnection::OnMessageReceived(const IPC::Message& msg) { 29 // Check if the message is an in-process reply. 30 if (PepperInProcessRouter::OnPluginMsgReceived(msg)) 31 return true; 32 33 bool handled = true; 34 IPC_BEGIN_MESSAGE_MAP(PepperBrowserConnection, msg) 35 IPC_MESSAGE_HANDLER(PpapiHostMsg_CreateResourceHostsFromHostReply, 36 OnMsgCreateResourceHostsFromHostReply) 37 IPC_MESSAGE_UNHANDLED(handled = false) 38 IPC_END_MESSAGE_MAP() 39 return handled; 40 } 41 42 void PepperBrowserConnection::DidCreateInProcessInstance( 43 PP_Instance instance, 44 int render_view_id, 45 const GURL& document_url, 46 const GURL& plugin_url) { 47 Send(new ViewHostMsg_DidCreateInProcessInstance( 48 instance, 49 // Browser provides the render process id. 50 PepperRendererInstanceData(0, 51 render_view_id, 52 document_url, 53 plugin_url))); 54 } 55 56 void PepperBrowserConnection::DidDeleteInProcessInstance(PP_Instance instance) { 57 Send(new ViewHostMsg_DidDeleteInProcessInstance(instance)); 58 } 59 60 void PepperBrowserConnection::SendBrowserCreate( 61 int child_process_id, 62 PP_Instance instance, 63 const std::vector<IPC::Message>& nested_msgs, 64 const PendingResourceIDCallback& callback) { 65 int32_t sequence_number = GetNextSequence(); 66 pending_create_map_[sequence_number] = callback; 67 ppapi::proxy::ResourceMessageCallParams params(0, sequence_number); 68 Send(new PpapiHostMsg_CreateResourceHostsFromHost( 69 routing_id(), 70 child_process_id, 71 params, 72 instance, 73 nested_msgs)); 74 } 75 76 void PepperBrowserConnection::OnMsgCreateResourceHostsFromHostReply( 77 int32_t sequence_number, 78 const std::vector<int>& pending_resource_host_ids) { 79 // Check that the message is destined for the plugin this object is associated 80 // with. 81 std::map<int32_t, PendingResourceIDCallback>::iterator it = 82 pending_create_map_.find(sequence_number); 83 if (it != pending_create_map_.end()) { 84 it->second.Run(pending_resource_host_ids); 85 pending_create_map_.erase(it); 86 } else { 87 NOTREACHED(); 88 } 89 } 90 91 int32_t PepperBrowserConnection::GetNextSequence() { 92 // Return the value with wraparound, making sure we don't make a sequence 93 // number with a 0 ID. Note that signed wraparound is undefined in C++ so we 94 // manually check. 95 int32_t ret = next_sequence_number_; 96 if (next_sequence_number_ == std::numeric_limits<int32_t>::max()) 97 next_sequence_number_ = 1; // Skip 0 which is invalid. 98 else 99 next_sequence_number_++; 100 return ret; 101 } 102 103 } // namespace content 104