1// Copyright (c) 2009 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 CHROME_BROWSER_DEBUGGER_INSPECTABLE_TAB_PROXY_H_
6#define CHROME_BROWSER_DEBUGGER_INSPECTABLE_TAB_PROXY_H_
7#pragma once
8
9#include <string>
10
11#include "base/basictypes.h"
12#include "base/hash_tables.h"
13#include "chrome/browser/debugger/devtools_client_host.h"
14
15class DebuggerRemoteService;
16class DevToolsClientHost;
17class DevToolsClientHostImpl;
18class NavigationController;
19struct DevToolsMessageData;
20
21// Proxies debugged tabs' NavigationControllers using their UIDs.
22// Keeps track of tabs being debugged so that we can detach from
23// them on remote debugger connection loss.
24class InspectableTabProxy {
25 public:
26  typedef base::hash_map<int32, NavigationController*> ControllersMap;
27  typedef base::hash_map<int32, DevToolsClientHostImpl*> IdToClientHostMap;
28
29  InspectableTabProxy();
30  virtual ~InspectableTabProxy();
31
32  // Returns a map of NavigationControllerKeys to NavigationControllers
33  // for all Browser instances. Clients should not keep the result around
34  // for extended periods of time as tabs might get closed thus invalidating
35  // the map.
36  const ControllersMap& controllers_map();
37
38  // Returns a DevToolsClientHostImpl for the given tab |id|.
39  DevToolsClientHostImpl* ClientHostForTabId(int32 id);
40
41  // Creates a new DevToolsClientHost implementor instance.
42  // |id| is the UID of the tab to debug.
43  // |service| is the DebuggerRemoteService instance the DevToolsClient
44  //         messages shall be dispatched to.
45  DevToolsClientHost* NewClientHost(int32 id,
46                                    DebuggerRemoteService* service);
47
48  // Gets invoked when a remote debugger is detached. In this case we should
49  // send the corresponding message to the V8 debugger for each of the tabs
50  // the debugger is attached to, and invoke InspectedTabClosing().
51  void OnRemoteDebuggerDetached();
52
53 private:
54  ControllersMap controllers_map_;
55  IdToClientHostMap id_to_client_host_map_;
56  DISALLOW_COPY_AND_ASSIGN(InspectableTabProxy);
57};
58
59
60// An internal implementation of DevToolsClientHost that delegates
61// messages sent for DevToolsClient to a DebuggerShell instance.
62class DevToolsClientHostImpl : public DevToolsClientHost {
63 public:
64  DevToolsClientHostImpl(
65    int32 id,
66    DebuggerRemoteService* service,
67    InspectableTabProxy::IdToClientHostMap* map);
68  ~DevToolsClientHostImpl();
69
70  DebuggerRemoteService* debugger_remote_service() {
71    return service_;
72  }
73
74  void Close();
75
76  // DevToolsClientHost interface
77  virtual void InspectedTabClosing();
78  virtual void SendMessageToClient(const IPC::Message& msg);
79  virtual void TabReplaced(TabContentsWrapper* new_tab);
80
81 private:
82  // Message handling routines
83  void OnDebuggerOutput(const std::string& msg);
84  virtual void FrameNavigating(const std::string& url);
85  void TabClosed();
86
87  int32 id_;
88  DebuggerRemoteService* service_;
89  InspectableTabProxy::IdToClientHostMap* map_;
90};
91
92#endif  // CHROME_BROWSER_DEBUGGER_INSPECTABLE_TAB_PROXY_H_
93