diff options
Diffstat (limited to 'chrome/browser/debugger/devtools_manager.h')
-rw-r--r-- | chrome/browser/debugger/devtools_manager.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/chrome/browser/debugger/devtools_manager.h b/chrome/browser/debugger/devtools_manager.h new file mode 100644 index 0000000..ebacc5e --- /dev/null +++ b/chrome/browser/debugger/devtools_manager.h @@ -0,0 +1,102 @@ +// 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 "base/basictypes.h" +#include "base/scoped_ptr.h" +#include "chrome/common/notification_service.h" + +namespace IPC { +class Message; +} + +class DevToolsInstanceDescriptorImpl; +class DevToolsWindow; +class NavigationController; +class NotificationRegistrar; +class RenderViewHost; +class WebContents; + +// This class is a singleton that manages DevToolsWindow instances and routes +// messages between developer tools clients and agents. +class DevToolsManager : public NotificationObserver { + public: + DevToolsManager(); + virtual ~DevToolsManager(); + + // Opend developer tools window for |web_contents|. If there is already + // one it will be revealed otherwise a new instance will be created. The + // devtools window is actually opened for the tab owning |web_contents|. If + // navigation occurs in it causing change of contents in the tab the devtools + // window will attach to the new contents. When the tab is closed the manager + // will close related devtools window. + void ShowDevToolsForWebContents(WebContents* web_contents); + + void ForwardToDevToolsAgent(RenderViewHost* from, + const IPC::Message& message); + void ForwardToDevToolsClient(RenderViewHost* from, + const IPC::Message& message); + + private: + // NotificationObserver override. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + friend class DevToolsInstanceDescriptorImpl; + + // This method is called by DevToolsInstanceDescriptorImpl when it's about + // to be destroyed. It will remove all references from the manager to the + // descriptor and unregister all listeners related to the descriptor. + void RemoveDescriptor(DevToolsInstanceDescriptorImpl* descriptor); + + void StartListening(NavigationController* navigation_controller); + void StopListening(NavigationController* navigation_controller); + + // This object is not NULL iff there is at least one open DevToolsWindow. + scoped_ptr<NotificationRegistrar> web_contents_listeners_; + + // This maps is for tracking devtools instances opened for browser tabs. It + // allows us to have at most one devtools window per tab. + // We use NavigationController* as key because it survives crosee-site + // navigation in cases when tab contents may change. + // + // This map doesn't own its values but DevToolsInstanceDescriptorImpl is + // expected to call RemoveDescriptor before dying to remove itself from the + // map. + typedef std::map<NavigationController*, + DevToolsInstanceDescriptorImpl*> DescriptorMap; + DescriptorMap navcontroller_to_descriptor_; + + DISALLOW_COPY_AND_ASSIGN(DevToolsManager); +}; + + +// Incapsulates information about devtools window instance necessary for +// routing devtools messages and managing the window. It should be initialized +// by DevToolsWindow concrete implementation. +class DevToolsInstanceDescriptor { + public: + DevToolsInstanceDescriptor() {} + + virtual void SetDevToolsHost(RenderViewHost* render_view_host) = 0; + virtual void SetDevToolsWindow(DevToolsWindow* window) = 0; + + // This method is called when DevToolsWindow is closing and the descriptor + // becomes invalid. It will clean up DevToolsManager and delete this instance. + virtual void Destroy() = 0; + + protected: + // This method should be called from Destroy only. + virtual ~DevToolsInstanceDescriptor() {} + + private: + DISALLOW_COPY_AND_ASSIGN(DevToolsInstanceDescriptor); +}; + +#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_MANAGER_H_ |