Refactoring: Move MessagePort-related IPCs and handling them away from Worker-related classes.

MessagePorts can also be used by non-workers.

This is part of a series of changes to fix cross-process MessagePorts. This CL
contains no functional changes.

BUG=278336

Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=228448

Review URL: https://codereview.chromium.org/25299002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@228662 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/browser/message_port_service.h b/content/browser/message_port_service.h
new file mode 100644
index 0000000..55e536c
--- /dev/null
+++ b/content/browser/message_port_service.h
@@ -0,0 +1,78 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
+#define CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
+
+#include <map>
+#include <utility>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/memory/singleton.h"
+#include "base/strings/string16.h"
+#include "ipc/ipc_message.h"
+
+namespace content {
+class MessagePortMessageFilter;
+
+class MessagePortService {
+ public:
+  typedef std::vector<std::pair<string16, std::vector<int> > > QueuedMessages;
+
+  // Returns the MessagePortService singleton.
+  static MessagePortService* GetInstance();
+
+  // These methods correspond to the message port related IPCs.
+  void Create(int route_id,
+              MessagePortMessageFilter* filter,
+              int* message_port_id);
+  void Destroy(int message_port_id);
+  void Entangle(int local_message_port_id, int remote_message_port_id);
+  void PostMessage(int sender_message_port_id,
+                   const string16& message,
+                   const std::vector<int>& sent_message_port_ids);
+  void QueueMessages(int message_port_id);
+  void SendQueuedMessages(int message_port_id,
+                          const QueuedMessages& queued_messages);
+
+  // Updates the information needed to reach a message port when it's sent to a
+  // (possibly different) process.
+  void UpdateMessagePort(
+      int message_port_id,
+      MessagePortMessageFilter* filter,
+      int routing_id);
+
+  void OnMessagePortMessageFilterClosing(MessagePortMessageFilter* filter);
+
+  // Attempts to send the queued messages for a message port.
+  void SendQueuedMessagesIfPossible(int message_port_id);
+
+ private:
+  friend struct DefaultSingletonTraits<MessagePortService>;
+
+  MessagePortService();
+  ~MessagePortService();
+
+  void PostMessageTo(int message_port_id,
+                     const string16& message,
+                     const std::vector<int>& sent_message_port_ids);
+
+  // Handles the details of removing a message port id. Before calling this,
+  // verify that the message port id exists.
+  void Erase(int message_port_id);
+
+  struct MessagePort;
+  typedef std::map<int, MessagePort> MessagePorts;
+  MessagePorts message_ports_;
+
+  // We need globally unique identifiers for each message port.
+  int next_message_port_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(MessagePortService);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_