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