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