1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionsPorts service: wires extension message ports through the
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// devtools remote protocol, allowing an external client program to
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// exchange messages with Chrome extensions.
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_DEBUGGER_EXTENSION_PORTS_REMOTE_SERVICE_H_
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_DEBUGGER_EXTENSION_PORTS_REMOTE_SERVICE_H_
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_remote.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_message_service.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "ipc/ipc_message.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DevToolsProtocolHandler;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DevToolsRemoteMessage;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DictionaryValue;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ListValue;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Value;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionPortsRemoteService : public DevToolsRemoteListener,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    public IPC::Message::Sender {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Specifies a tool name ("ExtensionPorts") handled by this class.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const std::string kToolName;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |delegate| (never NULL) is the protocol handler instance which
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // dispatches messages to this service.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The ownership of |delegate| is NOT transferred to this class.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ExtensionPortsRemoteService(DevToolsProtocolHandler* delegate);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // DevToolsRemoteListener methods:
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Processes |message| from the external client (where the tool is
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // "ExtensionPorts").
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void HandleMessage(const DevToolsRemoteMessage& message);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets invoked on the external client socket connection loss.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Closes open message ports.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnConnectionLost();
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // IPC::Message::Sender methods:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is the callback through which the ExtensionMessageService
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // passes us messages from extensions as well as disconnect events.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Send(IPC::Message* msg);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Operation result returned in the "result" field in messages sent
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the external client.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef enum {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RESULT_OK = 0,
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RESULT_UNKNOWN_COMMAND,
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RESULT_NO_SERVICE,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RESULT_PARAMETER_ERROR,
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RESULT_UNKNOWN_PORT,
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RESULT_TAB_NOT_FOUND,
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RESULT_CONNECT_FAILED,  // probably extension ID not found.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } Result;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~ExtensionPortsRemoteService();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sends a JSON message with the |response| to the external client.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |tool| and |destination| are used as the respective header values.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SendResponse(const Value& response,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const std::string& tool,
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const std::string& destination);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles a message from the ExtensionMessageService.
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void OnExtensionMessageInvoke(const std::string& extension_id,
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                const std::string& function_name,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const ListValue& args,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const GURL& event_url);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles a message sent from an extension through the
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ExtensionMessageService, to be passed to the external client.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnExtensionMessage(const std::string& message, int port_id);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles a disconnect event sent from the ExtensionMessageService.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnExtensionPortDisconnected(int port_id);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation for the commands we can receive from the external client.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Opens a channel to an extension.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ConnectCommand(DictionaryValue* content, DictionaryValue* response);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disconnects a message port.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DisconnectCommand(int port_id, DictionaryValue* response);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sends a message to an extension through an established message port.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PostMessageCommand(int port_id, DictionaryValue* content,
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          DictionaryValue* response);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The delegate is used to send responses and events back to the
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // external client, and to resolve tab IDs.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DevToolsProtocolHandler* delegate_;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set of message port IDs we successfully opened.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::set<int> PortIdSet;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PortIdSet openPortIds_;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<ExtensionMessageService> service_;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionPortsRemoteService);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_DEBUGGER_EXTENSION_PORTS_REMOTE_SERVICE_H_
111