1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
// Copyright (c) 2009 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 CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_
#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_
#include <map>
#include <set>
#include <string>
#include "base/ref_counted.h"
#include "chrome/browser/debugger/devtools_client_host.h"
namespace IPC {
class Message;
}
class GURL;
class PrefService;
class RenderViewHost;
// This class is a singleton that manages DevToolsClientHost instances and
// routes messages between developer tools clients and agents.
class DevToolsManager : public DevToolsClientHost::CloseListener,
public base::RefCounted<DevToolsManager> {
public:
static DevToolsManager* GetInstance();
static void RegisterUserPrefs(PrefService* prefs);
DevToolsManager();
virtual ~DevToolsManager();
// Returns DevToolsClientHost registered for |inspected_rvh| or NULL if
// there is no alive DevToolsClientHost registered for |inspected_rvh|.
DevToolsClientHost* GetDevToolsClientHostFor(RenderViewHost* inspected_rvh);
// Registers new DevToolsClientHost for |inspected_rvh|. There must be no
// other DevToolsClientHosts registered for the RenderViewHost at the moment.
void RegisterDevToolsClientHostFor(RenderViewHost* inspected_rvh,
DevToolsClientHost* client_host);
void UnregisterDevToolsClientHostFor(RenderViewHost* inspected_rvh);
void ForwardToDevToolsAgent(RenderViewHost* client_rvh,
const IPC::Message& message);
void ForwardToDevToolsAgent(DevToolsClientHost* from,
const IPC::Message& message);
void ForwardToDevToolsClient(RenderViewHost* inspected_rvh,
const IPC::Message& message);
void ActivateWindow(RenderViewHost* client_rvn);
void CloseWindow(RenderViewHost* client_rvn);
void DockWindow(RenderViewHost* client_rvn);
void UndockWindow(RenderViewHost* client_rvn);
void OpenDevToolsWindow(RenderViewHost* inspected_rvh);
void ToggleDevToolsWindow(RenderViewHost* inspected_rvh, bool open_console);
void RuntimeFeatureStateChanged(RenderViewHost* inspected_rvh,
const std::string& feature,
bool enabled);
// Starts element inspection in the devtools client.
// Creates one by means of OpenDevToolsWindow if no client
// exists.
void InspectElement(RenderViewHost* inspected_rvh, int x, int y);
// Sends 'Attach' message to the agent using |dest_rvh| in case
// there is a DevToolsClientHost registered for the |inspected_rvh|.
void OnNavigatingToPendingEntry(RenderViewHost* inspected_rvh,
RenderViewHost* dest_rvh,
const GURL& gurl);
// Detaches client host and returns cookie that can be used in
// AttachClientHost.
int DetachClientHost(RenderViewHost* from_rvh);
// Attaches dangling client host to new render view host.
void AttachClientHost(int client_host_cookie,
RenderViewHost* to_rvh);
private:
// DevToolsClientHost::CloseListener override.
// This method will remove all references from the manager to the
// DevToolsClientHost and unregister all listeners related to the
// DevToolsClientHost.
virtual void ClientHostClosing(DevToolsClientHost* host);
// Returns RenderViewHost for the tab that is inspected by devtools
// client hosted by DevToolsClientHost.
RenderViewHost* GetInspectedRenderViewHost(DevToolsClientHost* client_host);
void SendAttachToAgent(RenderViewHost* inspected_rvh,
const std::set<std::string>& runtime_features);
void SendDetachToAgent(RenderViewHost* inspected_rvh);
void ForceReopenWindow();
DevToolsClientHost* FindOnwerDevToolsClientHost(RenderViewHost* client_rvh);
void ToggleDevToolsWindow(RenderViewHost* inspected_rvh,
bool force_open,
bool open_console);
void ReopenWindow(RenderViewHost* client_rvh, bool docked);
void CloseWindow(DevToolsClientHost* client_host);
// These two maps are for tracking dependencies between inspected tabs and
// their DevToolsClientHosts. They are usful for routing devtools messages
// and allow us to have at most one devtools client host per tab. We use
// NavigationController* as key because it survives crosee-site navigation in
// cases when tab contents may change.
//
// DevToolsManager start listening to DevToolsClientHosts when they are put
// into these maps and removes them when they are closing.
typedef std::map<RenderViewHost*, DevToolsClientHost*>
InspectedRvhToClientHostMap;
InspectedRvhToClientHostMap inspected_rvh_to_client_host_;
typedef std::map<DevToolsClientHost*, RenderViewHost*>
ClientHostToInspectedRvhMap;
ClientHostToInspectedRvhMap client_host_to_inspected_rvh_;
typedef std::set<std::string> RuntimeFeatures;
typedef std::map<RenderViewHost*, RuntimeFeatures>
RuntimeFeaturesMap;
RuntimeFeaturesMap runtime_features_;
RenderViewHost* inspected_rvh_for_reopen_;
bool in_initial_show_;
typedef std::map<int, std::pair<DevToolsClientHost*, RuntimeFeatures> >
DanglingClientHosts;
DanglingClientHosts dangling_client_hosts_;
int last_dangling_cookie_;
DISALLOW_COPY_AND_ASSIGN(DevToolsManager);
};
#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_
|