Home | History | Annotate | Download | only in pepper
      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 PepperBrowserConnection::~PepperBrowserConnection() {}
     25 
     26 bool PepperBrowserConnection::OnMessageReceived(const IPC::Message& msg) {
     27   // Check if the message is an in-process reply.
     28   if (PepperInProcessRouter::OnPluginMsgReceived(msg))
     29     return true;
     30 
     31   bool handled = true;
     32   IPC_BEGIN_MESSAGE_MAP(PepperBrowserConnection, msg)
     33     IPC_MESSAGE_HANDLER(PpapiHostMsg_CreateResourceHostsFromHostReply,
     34                         OnMsgCreateResourceHostsFromHostReply)
     35     IPC_MESSAGE_UNHANDLED(handled = false)
     36   IPC_END_MESSAGE_MAP()
     37   return handled;
     38 }
     39 
     40 void PepperBrowserConnection::DidCreateInProcessInstance(
     41     PP_Instance instance,
     42     int render_frame_id,
     43     const GURL& document_url,
     44     const GURL& plugin_url) {
     45   Send(new ViewHostMsg_DidCreateInProcessInstance(
     46       instance,
     47       // Browser provides the render process id.
     48       PepperRendererInstanceData(
     49           0, render_frame_id, document_url, plugin_url)));
     50 }
     51 
     52 void PepperBrowserConnection::DidDeleteInProcessInstance(PP_Instance instance) {
     53   Send(new ViewHostMsg_DidDeleteInProcessInstance(instance));
     54 }
     55 
     56 void PepperBrowserConnection::SendBrowserCreate(
     57     int child_process_id,
     58     PP_Instance instance,
     59     const std::vector<IPC::Message>& nested_msgs,
     60     const PendingResourceIDCallback& callback) {
     61   int32_t sequence_number = GetNextSequence();
     62   pending_create_map_[sequence_number] = callback;
     63   ppapi::proxy::ResourceMessageCallParams params(0, sequence_number);
     64   Send(new PpapiHostMsg_CreateResourceHostsFromHost(
     65       routing_id(), child_process_id, params, instance, nested_msgs));
     66 }
     67 
     68 void PepperBrowserConnection::OnMsgCreateResourceHostsFromHostReply(
     69     int32_t sequence_number,
     70     const std::vector<int>& pending_resource_host_ids) {
     71   // Check that the message is destined for the plugin this object is associated
     72   // with.
     73   std::map<int32_t, PendingResourceIDCallback>::iterator it =
     74       pending_create_map_.find(sequence_number);
     75   if (it != pending_create_map_.end()) {
     76     it->second.Run(pending_resource_host_ids);
     77     pending_create_map_.erase(it);
     78   } else {
     79     NOTREACHED();
     80   }
     81 }
     82 
     83 int32_t PepperBrowserConnection::GetNextSequence() {
     84   // Return the value with wraparound, making sure we don't make a sequence
     85   // number with a 0 ID. Note that signed wraparound is undefined in C++ so we
     86   // manually check.
     87   int32_t ret = next_sequence_number_;
     88   if (next_sequence_number_ == std::numeric_limits<int32_t>::max())
     89     next_sequence_number_ = 1;  // Skip 0 which is invalid.
     90   else
     91     next_sequence_number_++;
     92   return ret;
     93 }
     94 
     95 }  // namespace content
     96