• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_
6 #define CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_
7 #pragma once
8 
9 #include <map>
10 #include <string>
11 
12 #include "base/memory/ref_counted.h"
13 #include "chrome/browser/debugger/devtools_client_host.h"
14 #include "chrome/browser/debugger/devtools_toggle_action.h"
15 #include "content/common/notification_observer.h"
16 #include "content/common/notification_registrar.h"
17 #include "webkit/glue/resource_loader_bridge.h"
18 
19 namespace IPC {
20 class Message;
21 }
22 
23 class DevToolsNetLogObserver;
24 class GURL;
25 class IOThread;
26 class PrefService;
27 class RenderViewHost;
28 class TabContentsWraper;
29 
30 using webkit_glue::ResourceLoaderBridge;
31 
32 typedef std::map<std::string, std::string> DevToolsRuntimeProperties;
33 
34 // This class is a singleton that manages DevToolsClientHost instances and
35 // routes messages between developer tools clients and agents.
36 class DevToolsManager : public DevToolsClientHost::CloseListener,
37                         public NotificationObserver,
38                         public base::RefCounted<DevToolsManager> {
39  public:
40   static DevToolsManager* GetInstance();
41 
42   static void RegisterUserPrefs(PrefService* prefs);
43 
44   DevToolsManager();
45 
46   // Returns DevToolsClientHost registered for |inspected_rvh| or NULL if
47   // there is no alive DevToolsClientHost registered for |inspected_rvh|.
48   DevToolsClientHost* GetDevToolsClientHostFor(RenderViewHost* inspected_rvh);
49 
50   // Registers new DevToolsClientHost for |inspected_rvh|. There must be no
51   // other DevToolsClientHosts registered for the RenderViewHost at the moment.
52   void RegisterDevToolsClientHostFor(RenderViewHost* inspected_rvh,
53                                      DevToolsClientHost* client_host);
54   void UnregisterDevToolsClientHostFor(RenderViewHost* inspected_rvh);
55 
56   void ForwardToDevToolsAgent(RenderViewHost* client_rvh,
57                               const IPC::Message& message);
58   void ForwardToDevToolsAgent(DevToolsClientHost* from,
59                               const IPC::Message& message);
60   void ForwardToDevToolsClient(RenderViewHost* inspected_rvh,
61                                const IPC::Message& message);
62 
63   void ActivateWindow(RenderViewHost* client_rvn);
64   void CloseWindow(RenderViewHost* client_rvn);
65   void RequestDockWindow(RenderViewHost* client_rvn);
66   void RequestUndockWindow(RenderViewHost* client_rvn);
67 
68   void OpenDevToolsWindow(RenderViewHost* inspected_rvh);
69   void ToggleDevToolsWindow(RenderViewHost* inspected_rvh,
70                             DevToolsToggleAction action);
71   void RuntimePropertyChanged(RenderViewHost* inspected_rvh,
72                               const std::string& name,
73                               const std::string& value);
74 
75   // Starts element inspection in the devtools client.
76   // Creates one by means of OpenDevToolsWindow if no client
77   // exists.
78   void InspectElement(RenderViewHost* inspected_rvh, int x, int y);
79 
80   // Sends 'Attach' message to the agent using |dest_rvh| in case
81   // there is a DevToolsClientHost registered for the |inspected_rvh|.
82   void OnNavigatingToPendingEntry(RenderViewHost* inspected_rvh,
83                                   RenderViewHost* dest_rvh,
84                                   const GURL& gurl);
85 
86   // Invoked when a tab is replaced by another tab. This is triggered by
87   // TabStripModel::ReplaceTabContentsAt.
88   void TabReplaced(TabContentsWrapper* old_tab, TabContentsWrapper* new_tab);
89 
90   // Detaches client host and returns cookie that can be used in
91   // AttachClientHost.
92   int DetachClientHost(RenderViewHost* from_rvh);
93 
94   // Attaches orphan client host to new render view host.
95   void AttachClientHost(int client_host_cookie,
96                         RenderViewHost* to_rvh);
97 
98   // Closes all open developer tools windows.
99   void CloseAllClientHosts();
100 
101  private:
102   friend class base::RefCounted<DevToolsManager>;
103 
104   virtual ~DevToolsManager();
105 
106   // DevToolsClientHost::CloseListener override.
107   // This method will remove all references from the manager to the
108   // DevToolsClientHost and unregister all listeners related to the
109   // DevToolsClientHost.
110   virtual void ClientHostClosing(DevToolsClientHost* host);
111 
112   // Overridden from NotificationObserver:
113   virtual void Observe(NotificationType type,
114                        const NotificationSource& source,
115                        const NotificationDetails& details);
116 
117   // Returns RenderViewHost for the tab that is inspected by devtools
118   // client hosted by DevToolsClientHost.
119   RenderViewHost* GetInspectedRenderViewHost(DevToolsClientHost* client_host);
120 
121   void SendAttachToAgent(RenderViewHost* inspected_rvh);
122   void SendDetachToAgent(RenderViewHost* inspected_rvh);
123 
124   void ForceReopenWindow();
125 
126   DevToolsClientHost* FindOwnerDevToolsClientHost(RenderViewHost* client_rvh);
127 
128   void ToggleDevToolsWindow(RenderViewHost* inspected_rvh,
129                             bool force_open,
130                             DevToolsToggleAction action);
131 
132   void ReopenWindow(RenderViewHost* client_rvh, bool docked);
133 
134   void BindClientHost(RenderViewHost* inspected_rvh,
135                       DevToolsClientHost* client_host,
136                       const DevToolsRuntimeProperties& runtime_properties);
137 
138   void UnbindClientHost(RenderViewHost* inspected_rvh,
139                         DevToolsClientHost* client_host);
140 
141   // These two maps are for tracking dependencies between inspected tabs and
142   // their DevToolsClientHosts. They are useful for routing devtools messages
143   // and allow us to have at most one devtools client host per tab.
144   //
145   // DevToolsManager start listening to DevToolsClientHosts when they are put
146   // into these maps and removes them when they are closing.
147   typedef std::map<RenderViewHost*, DevToolsClientHost*>
148       InspectedRvhToClientHostMap;
149   InspectedRvhToClientHostMap inspected_rvh_to_client_host_;
150 
151   typedef std::map<DevToolsClientHost*, RenderViewHost*>
152       ClientHostToInspectedRvhMap;
153   ClientHostToInspectedRvhMap client_host_to_inspected_rvh_;
154 
155   typedef std::map<RenderViewHost*, DevToolsRuntimeProperties>
156       RuntimePropertiesMap;
157   RuntimePropertiesMap runtime_properties_map_;
158 
159   RenderViewHost* inspected_rvh_for_reopen_;
160   bool in_initial_show_;
161 
162   typedef std::map<int,
163                    std::pair<DevToolsClientHost*, DevToolsRuntimeProperties> >
164       OrphanClientHosts;
165   OrphanClientHosts orphan_client_hosts_;
166   int last_orphan_cookie_;
167 
168   NotificationRegistrar registrar_;
169 
170   DISALLOW_COPY_AND_ASSIGN(DevToolsManager);
171 };
172 
173 #endif  // CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_
174