Home | History | Annotate | Download | only in child
      1 // Copyright (c) 2012 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 #ifndef CONTENT_CHILD_WEBMESSAGEPORTCHANNEL_IMPL_H_
      6 #define CONTENT_CHILD_WEBMESSAGEPORTCHANNEL_IMPL_H_
      7 
      8 #include <queue>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/strings/string16.h"
     14 #include "base/synchronization/lock.h"
     15 #include "ipc/ipc_listener.h"
     16 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
     17 
     18 namespace base {
     19 class MessageLoopProxy;
     20 }
     21 
     22 namespace content {
     23 class ChildThread;
     24 
     25 // This is thread safe.
     26 class WebMessagePortChannelImpl
     27     : public blink::WebMessagePortChannel,
     28       public IPC::Listener,
     29       public base::RefCountedThreadSafe<WebMessagePortChannelImpl> {
     30  public:
     31   explicit WebMessagePortChannelImpl(base::MessageLoopProxy* child_thread_loop);
     32   WebMessagePortChannelImpl(int route_id,
     33                             int message_port_id,
     34                             base::MessageLoopProxy* child_thread_loop);
     35 
     36   static void CreatePair(base::MessageLoopProxy* child_thread_loop,
     37                          blink::WebMessagePortChannel** channel1,
     38                          blink::WebMessagePortChannel** channel2);
     39 
     40   // Extracts port IDs for passing on to the browser process, and queues any
     41   // received messages. Takes ownership of the passed array (and deletes it).
     42   static std::vector<int> ExtractMessagePortIDs(
     43       blink::WebMessagePortChannelArray* channels);
     44 
     45   // Queues received and incoming messages until there are no more in-flight
     46   // messages, then sends all of them to the browser process.
     47   void QueueMessages();
     48   int message_port_id() const { return message_port_id_; }
     49 
     50  private:
     51   friend class base::RefCountedThreadSafe<WebMessagePortChannelImpl>;
     52   virtual ~WebMessagePortChannelImpl();
     53 
     54   // WebMessagePortChannel implementation.
     55   virtual void setClient(blink::WebMessagePortChannelClient* client);
     56   virtual void destroy();
     57   virtual void postMessage(const blink::WebString& message,
     58                            blink::WebMessagePortChannelArray* channels);
     59   virtual bool tryGetMessage(blink::WebString* message,
     60                              blink::WebMessagePortChannelArray& channels);
     61 
     62   void Init();
     63   void Entangle(scoped_refptr<WebMessagePortChannelImpl> channel);
     64   void Send(IPC::Message* message);
     65   void PostMessage(const base::string16& message,
     66                    blink::WebMessagePortChannelArray* channels);
     67 
     68   // IPC::Listener implementation.
     69   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     70 
     71   void OnMessage(const base::string16& message,
     72                  const std::vector<int>& sent_message_port_ids,
     73                  const std::vector<int>& new_routing_ids);
     74   void OnMessagesQueued();
     75 
     76   struct Message {
     77     Message();
     78     ~Message();
     79 
     80     base::string16 message;
     81     std::vector<WebMessagePortChannelImpl*> ports;
     82   };
     83 
     84   typedef std::queue<Message> MessageQueue;
     85   MessageQueue message_queue_;
     86 
     87   blink::WebMessagePortChannelClient* client_;
     88   base::Lock lock_;  // Locks access to above.
     89 
     90   int route_id_;  // The routing id for this object.
     91   int message_port_id_;  // A globally unique identifier for this message port.
     92   scoped_refptr<base::MessageLoopProxy> child_thread_loop_;
     93 
     94   DISALLOW_COPY_AND_ASSIGN(WebMessagePortChannelImpl);
     95 };
     96 
     97 }  // namespace content
     98 
     99 #endif  // CONTENT_CHILD_WEBMESSAGEPORTCHANNEL_IMPL_H_
    100