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#ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_PROTOCOL_HANDLER_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_PROTOCOL_HANDLER_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/hash_tables.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_remote.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/listen_socket.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InspectableTabProxy; 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DevToolsRemoteListenSocket; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DevToolsRemoteMessage; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Dispatches DevToolsRemoteMessages to their appropriate handlers (Tools) 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// based on the "Tool" message header value. 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DevToolsProtocolHandler 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : public DevToolsRemoteListener, 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public OutboundSocketDelegate { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef base::hash_map< std::string, scoped_refptr<DevToolsRemoteListener> > 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ToolToListenerMap; 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static scoped_refptr<DevToolsProtocolHandler> Start(int port); 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Called from the main thread in order to stop protocol handler. 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Will schedule tear down task on IO thread. 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Stop(); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Registers a |listener| to handle messages for a certain |tool_name| Tool. 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |listener| is the new message handler to register. 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // As DevToolsRemoteListener inherits base::RefCountedThreadSafe, 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // you should have no problems with ownership and destruction. 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |tool_name| is the name of the Tool to associate the listener with. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RegisterDestination(DevToolsRemoteListener* listener, 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tool_name); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Unregisters a |listener| so that it will no longer handle messages 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // directed to the specified |tool_name| tool. 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UnregisterDestination(DevToolsRemoteListener* listener, 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& tool_name); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InspectableTabProxy* inspectable_tab_proxy() { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return inspectable_tab_proxy_.get(); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // DevToolsRemoteListener interface 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void HandleMessage(const DevToolsRemoteMessage& message); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnAcceptConnection(ListenSocket *connection); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnConnectionLost(); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // OutboundSocketDelegate interface 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Send(const DevToolsRemoteMessage& message); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen explicit DevToolsProtocolHandler(int port); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~DevToolsProtocolHandler(); 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void Start(); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Init(); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Teardown(); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int port_; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ToolToListenerMap tool_to_listener_map_; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<ListenSocket> connection_; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<DevToolsRemoteListenSocket> server_; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<InspectableTabProxy> inspectable_tab_proxy_; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(DevToolsProtocolHandler); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_PROTOCOL_HANDLER_H_ 77