| // Copyright (c) 2011 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_ |
| #pragma once |
| |
| #include <map> |
| #include <string> |
| |
| #include "base/memory/ref_counted.h" |
| #include "chrome/browser/debugger/devtools_client_host.h" |
| #include "chrome/browser/debugger/devtools_toggle_action.h" |
| #include "content/common/notification_observer.h" |
| #include "content/common/notification_registrar.h" |
| #include "webkit/glue/resource_loader_bridge.h" |
| |
| namespace IPC { |
| class Message; |
| } |
| |
| class DevToolsNetLogObserver; |
| class GURL; |
| class IOThread; |
| class PrefService; |
| class RenderViewHost; |
| class TabContentsWraper; |
| |
| using webkit_glue::ResourceLoaderBridge; |
| |
| typedef std::map<std::string, std::string> DevToolsRuntimeProperties; |
| |
| // This class is a singleton that manages DevToolsClientHost instances and |
| // routes messages between developer tools clients and agents. |
| class DevToolsManager : public DevToolsClientHost::CloseListener, |
| public NotificationObserver, |
| public base::RefCounted<DevToolsManager> { |
| public: |
| static DevToolsManager* GetInstance(); |
| |
| static void RegisterUserPrefs(PrefService* prefs); |
| |
| 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 RequestDockWindow(RenderViewHost* client_rvn); |
| void RequestUndockWindow(RenderViewHost* client_rvn); |
| |
| void OpenDevToolsWindow(RenderViewHost* inspected_rvh); |
| void ToggleDevToolsWindow(RenderViewHost* inspected_rvh, |
| DevToolsToggleAction action); |
| void RuntimePropertyChanged(RenderViewHost* inspected_rvh, |
| const std::string& name, |
| const std::string& value); |
| |
| // 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); |
| |
| // Invoked when a tab is replaced by another tab. This is triggered by |
| // TabStripModel::ReplaceTabContentsAt. |
| void TabReplaced(TabContentsWrapper* old_tab, TabContentsWrapper* new_tab); |
| |
| // Detaches client host and returns cookie that can be used in |
| // AttachClientHost. |
| int DetachClientHost(RenderViewHost* from_rvh); |
| |
| // Attaches orphan client host to new render view host. |
| void AttachClientHost(int client_host_cookie, |
| RenderViewHost* to_rvh); |
| |
| // Closes all open developer tools windows. |
| void CloseAllClientHosts(); |
| |
| private: |
| friend class base::RefCounted<DevToolsManager>; |
| |
| virtual ~DevToolsManager(); |
| |
| // 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); |
| |
| // Overridden from NotificationObserver: |
| virtual void Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details); |
| |
| // Returns RenderViewHost for the tab that is inspected by devtools |
| // client hosted by DevToolsClientHost. |
| RenderViewHost* GetInspectedRenderViewHost(DevToolsClientHost* client_host); |
| |
| void SendAttachToAgent(RenderViewHost* inspected_rvh); |
| void SendDetachToAgent(RenderViewHost* inspected_rvh); |
| |
| void ForceReopenWindow(); |
| |
| DevToolsClientHost* FindOwnerDevToolsClientHost(RenderViewHost* client_rvh); |
| |
| void ToggleDevToolsWindow(RenderViewHost* inspected_rvh, |
| bool force_open, |
| DevToolsToggleAction action); |
| |
| void ReopenWindow(RenderViewHost* client_rvh, bool docked); |
| |
| void BindClientHost(RenderViewHost* inspected_rvh, |
| DevToolsClientHost* client_host, |
| const DevToolsRuntimeProperties& runtime_properties); |
| |
| void UnbindClientHost(RenderViewHost* inspected_rvh, |
| DevToolsClientHost* client_host); |
| |
| // These two maps are for tracking dependencies between inspected tabs and |
| // their DevToolsClientHosts. They are useful for routing devtools messages |
| // and allow us to have at most one devtools client host per tab. |
| // |
| // 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::map<RenderViewHost*, DevToolsRuntimeProperties> |
| RuntimePropertiesMap; |
| RuntimePropertiesMap runtime_properties_map_; |
| |
| RenderViewHost* inspected_rvh_for_reopen_; |
| bool in_initial_show_; |
| |
| typedef std::map<int, |
| std::pair<DevToolsClientHost*, DevToolsRuntimeProperties> > |
| OrphanClientHosts; |
| OrphanClientHosts orphan_client_hosts_; |
| int last_orphan_cookie_; |
| |
| NotificationRegistrar registrar_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DevToolsManager); |
| }; |
| |
| #endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_ |