diff options
30 files changed, 561 insertions, 242 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index 452e94d..baf46a6 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -14,6 +14,7 @@ #include "chrome/browser/browser_shutdown.h" #include "chrome/browser/browser_window.h" #include "chrome/browser/character_encoding.h" +#include "chrome/browser/debugger/devtools_manager.h" #include "chrome/browser/dom_ui/downloads_ui.h" #include "chrome/browser/dom_ui/history_ui.h" #include "chrome/browser/dom_ui/new_tab_ui.h" @@ -941,7 +942,7 @@ void Browser::OpenDebuggerWindow() { if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableOutOfProcessDevTools)) { WebContents* wc = current_tab->AsWebContents(); - wc->view()->OpenDeveloperTools(); + g_browser_process->devtools_manager()->ShowDevToolsForWebContents(wc); } else { // Only one debugger instance can exist at a time right now. // TODO(erikkay): need an alert, dialog, something diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h index 6eee7a7..d5758f0 100644 --- a/chrome/browser/browser_process.h +++ b/chrome/browser/browser_process.h @@ -17,6 +17,7 @@ class AutomationProviderList; class ClipboardService; +class DevToolsManager; class DownloadRequestManager; class GoogleURLTracker; class IconManager; @@ -77,6 +78,7 @@ class BrowserProcess { virtual ProfileManager* profile_manager() = 0; virtual PrefService* local_state() = 0; virtual DebuggerWrapper* debugger_wrapper() = 0; + virtual DevToolsManager* devtools_manager() = 0; virtual ClipboardService* clipboard_service() = 0; // Returns the thread that we perform I/O coordination on (network requests, diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 4730c93..d11ae1d 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc @@ -11,6 +11,7 @@ #include "chrome/browser/browser_trial.h" #include "chrome/browser/chrome_thread.h" #include "chrome/browser/debugger/debugger_wrapper.h" +#include "chrome/browser/debugger/devtools_manager.h" #include "chrome/browser/download/download_file.h" #include "chrome/browser/download/save_file_manager.h" #include "chrome/browser/google_url_tracker.h" @@ -105,6 +106,7 @@ BrowserProcessImpl::BrowserProcessImpl(const CommandLine& command_line) broker_services_(NULL), created_icon_manager_(false), created_debugger_wrapper_(false), + created_devtools_manager_(false), module_ref_count_(0), memory_model_(MEDIUM_MEMORY_MODEL), checked_for_new_frames_(false), @@ -358,6 +360,12 @@ void BrowserProcessImpl::CreateDebuggerWrapper(int port) { debugger_wrapper_ = new DebuggerWrapper(port); } +void BrowserProcessImpl::CreateDevToolsManager() { + DCHECK(!devtools_manager_.get()); + created_devtools_manager_ = true; + devtools_manager_.reset(new DevToolsManager()); +} + void BrowserProcessImpl::CreateAcceleratorHandler() { #if defined(OS_WIN) DCHECK(accelerator_handler_.get() == NULL); diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h index 882b890..313abad 100644 --- a/chrome/browser/browser_process_impl.h +++ b/chrome/browser/browser_process_impl.h @@ -102,6 +102,13 @@ class BrowserProcessImpl : public BrowserProcess, public NonThreadSafe { return debugger_wrapper_.get(); } + virtual DevToolsManager* devtools_manager() { + DCHECK(CalledOnValidThread()); + if (!created_devtools_manager_) + CreateDevToolsManager(); + return devtools_manager_.get(); + } + virtual ClipboardService* clipboard_service() { DCHECK(CalledOnValidThread()); return clipboard_service_.get(); @@ -191,6 +198,7 @@ class BrowserProcessImpl : public BrowserProcess, public NonThreadSafe { void CreateViewedPageTracker(); void CreateIconManager(); void CreateDebuggerWrapper(int port); + void CreateDevToolsManager(); void CreateAcceleratorHandler(); void CreateGoogleURLTracker(); @@ -226,6 +234,9 @@ class BrowserProcessImpl : public BrowserProcess, public NonThreadSafe { bool created_debugger_wrapper_; scoped_refptr<DebuggerWrapper> debugger_wrapper_; + bool created_devtools_manager_; + scoped_ptr<DevToolsManager> devtools_manager_; + scoped_ptr<ClipboardService> clipboard_service_; scoped_ptr<AutomationProviderList> automation_provider_list_; diff --git a/chrome/browser/debugger/debugger.scons b/chrome/browser/debugger/debugger.scons index 3b0cb2f..adcc4a7 100644 --- a/chrome/browser/debugger/debugger.scons +++ b/chrome/browser/debugger/debugger.scons @@ -53,10 +53,11 @@ input_files = ChromeFileList([ 'debugger_window.h', 'debugger_wrapper.cc', 'debugger_wrapper.h', - 'dev_tools_view.cc', - 'dev_tools_view.h', - 'dev_tools_window.cc', - 'dev_tools_window.h', + 'devtools_manager.h', + 'devtools_manager.cc', + 'devtools_view.cc', + 'devtools_view.h', + 'devtools_window.h', ]) if env.Bit('linux'): @@ -64,8 +65,10 @@ if env.Bit('linux'): input_files.Remove( 'debugger_view.cc', 'debugger_window.cc', - 'dev_tools_view.cc', - 'dev_tools_window.cc', + 'devtools_view.cc', + ) + input_files.Append( + 'devtools_window_gtk.cc', ) if env.Bit('mac'): @@ -76,10 +79,13 @@ if env.Bit('mac'): 'debugger_node.cc', 'debugger_view.cc', 'debugger_window.cc', - 'dev_tools_view.cc', - 'dev_tools_window.cc', + 'devtools_view.cc', + ) + input_files.Append( + 'devtools_window_mac.cc', ) + if not env.Bit('mac'): # TODO(port): Enable for Mac. env.ChromeLibrary('debugger', input_files) diff --git a/chrome/browser/debugger/debugger.vcproj b/chrome/browser/debugger/debugger.vcproj index 3cd3e16..8fdb2f5 100644 --- a/chrome/browser/debugger/debugger.vcproj +++ b/chrome/browser/debugger/debugger.vcproj @@ -206,19 +206,31 @@ > </File> <File - RelativePath=".\dev_tools_view.cc" + RelativePath=".\devtools_manager.cc" > </File> <File - RelativePath=".\dev_tools_view.h" + RelativePath=".\devtools_manager.h" > </File> <File - RelativePath=".\dev_tools_window.cc" + RelativePath=".\devtools_view.cc" > </File> <File - RelativePath=".\dev_tools_window.h" + RelativePath=".\devtools_view.h" + > + </File> + <File + RelativePath=".\devtools_window.h" + > + </File> + <File + RelativePath=".\devtools_window_win.cc" + > + </File> + <File + RelativePath=".\devtools_window_win.h" > </File> </Files> diff --git a/chrome/browser/debugger/dev_tools_window.cc b/chrome/browser/debugger/dev_tools_window.cc deleted file mode 100644 index 9add6d0..0000000 --- a/chrome/browser/debugger/dev_tools_window.cc +++ /dev/null @@ -1,52 +0,0 @@ -// 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. - -#include "chrome/browser/debugger/dev_tools_window.h" - -#include "chrome/browser/debugger/dev_tools_view.h" -#include "chrome/views/window.h" - -DevToolsWindow::DevToolsWindow() : window_(NULL), tools_view_(NULL) { -} - -DevToolsWindow::~DevToolsWindow() { -} - -void DevToolsWindow::Show(int inspected_process_id, - int inspected_view_id) { - if (window_) { - window_->Show(); - return; - } - - tools_view_ = new DevToolsView(inspected_process_id, inspected_view_id); - window_ = views::Window::CreateChromeWindow(NULL, gfx::Rect(), this); - window_->Show(); -} - -void DevToolsWindow::SendDevToolsClientMessage(const IPC::Message& message) { - if (!tools_view_) - return; - tools_view_->SendDevToolsClientMessage(message); -} - -std::wstring DevToolsWindow::GetWindowTitle() const { - return L"Developer Tools"; -} - -void DevToolsWindow::WindowClosing() { - if (tools_view_) { - tools_view_->OnWindowClosing(); - tools_view_ = NULL; - window_ = NULL; - } -} - -bool DevToolsWindow::CanResize() const { - return true; -} - -views::View* DevToolsWindow::GetContentsView() { - return tools_view_; -} diff --git a/chrome/browser/debugger/dev_tools_window.h b/chrome/browser/debugger/dev_tools_window.h deleted file mode 100644 index d20a801..0000000 --- a/chrome/browser/debugger/dev_tools_window.h +++ /dev/null @@ -1,45 +0,0 @@ -// 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_DEV_TOOLS_WINDOW_H_ -#define CHROME_BROWSER_DEBUGGER_DEV_TOOLS_WINDOW_H_ - -#include "base/basictypes.h" - -#include "chrome/views/window_delegate.h" - -namespace IPC { -class Message; -} -namespace views { -class Window; -} -class DevToolsView; -class TabContents; - -class DevToolsWindow : public views::WindowDelegate { - public: - DevToolsWindow(); - virtual ~DevToolsWindow(); - - // Show inspector window for the tab - void Show(int inspected_process_id, - int inspected_view_id); - - void SendDevToolsClientMessage(const IPC::Message& message); - - private: - // views::WindowDelegate methods: - virtual std::wstring GetWindowTitle() const; - virtual void WindowClosing(); - virtual bool CanResize() const; - virtual views::View* GetContentsView(); - - views::Window* window_; - DevToolsView* tools_view_; - - DISALLOW_COPY_AND_ASSIGN(DevToolsWindow); -}; - -#endif // CHROME_BROWSER_DEBUGGER_DEV_TOOLS_WINDOW_H_ diff --git a/chrome/browser/debugger/devtools_manager.cc b/chrome/browser/debugger/devtools_manager.cc new file mode 100644 index 0000000..41d0f7a --- /dev/null +++ b/chrome/browser/debugger/devtools_manager.cc @@ -0,0 +1,202 @@ +// 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. + +#include "chrome/browser/debugger/devtools_manager.h" + +#include "chrome/browser/browser_process.h" +#include "chrome/browser/debugger/devtools_window.h" +#include "chrome/browser/renderer_host/render_view_host.h" +#include "chrome/browser/tab_contents/render_view_host_manager.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/tab_contents/web_contents.h" +#include "chrome/common/notification_registrar.h" +#include "chrome/common/notification_type.h" + + +class DevToolsInstanceDescriptorImpl : public DevToolsInstanceDescriptor { + public: + explicit DevToolsInstanceDescriptorImpl( + NavigationController* navigation_controller) + : navigation_controller_(navigation_controller), + devtools_host_(NULL), + devtools_window_(NULL) { + } + virtual ~DevToolsInstanceDescriptorImpl() {} + + virtual void SetDevToolsHost(RenderViewHost* render_view_host) { + devtools_host_ = render_view_host; + } + + virtual void SetDevToolsWindow(DevToolsWindow* window) { + devtools_window_ = window; + } + + virtual void Destroy() { + DevToolsManager* manager = g_browser_process->devtools_manager(); + DCHECK(manager); + if (manager) { + manager->RemoveDescriptor(this); + } + delete this; + } + + RenderViewHost* devtools_host() const { + return devtools_host_; + } + + DevToolsWindow* devtools_window() const { + return devtools_window_; + } + + NavigationController* navigation_controller() const { + return navigation_controller_; + } + + private: + NavigationController* navigation_controller_; + RenderViewHost* devtools_host_; + DevToolsWindow* devtools_window_; + + DISALLOW_COPY_AND_ASSIGN(DevToolsInstanceDescriptorImpl); +}; + +DevToolsManager::DevToolsManager() : web_contents_listeners_(NULL) { +} + +DevToolsManager::~DevToolsManager() { + DCHECK(!web_contents_listeners_.get()) << + "All devtools windows must alredy have been closed."; +} + +void DevToolsManager::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + DCHECK(type == NotificationType::WEB_CONTENTS_DISCONNECTED); + Source<WebContents> src(source); + NavigationController* controller = src->controller(); + DescriptorMap::const_iterator it = + navcontroller_to_descriptor_.find(controller); + if (it == navcontroller_to_descriptor_.end()) { + return; + } + bool active = (controller->active_contents() == src.ptr()); + if (!active) { + return; + } + // Active tab contents disconnecting from its renderer means that the tab + // is closing so we are closing devtools as well. + it->second->devtools_window()->Close(); +} + +void DevToolsManager::ShowDevToolsForWebContents(WebContents* web_contents) { + NavigationController* navigation_controller = web_contents->controller(); + + DevToolsWindow* window(NULL); + DevToolsInstanceDescriptorImpl* desc(NULL); + DescriptorMap::const_iterator it = + navcontroller_to_descriptor_.find(navigation_controller); + if (it != navcontroller_to_descriptor_.end()) { + desc = it->second; + window = desc->devtools_window(); + } else { + desc = new DevToolsInstanceDescriptorImpl(navigation_controller); + navcontroller_to_descriptor_[navigation_controller] = desc; + + StartListening(navigation_controller); + + window = DevToolsWindow::Create(desc); + } + + window->Show(); +} + +void DevToolsManager::ForwardToDevToolsAgent(RenderViewHost* from, + const IPC::Message& message) { + NavigationController* nav_controller(NULL); + for (DescriptorMap::const_iterator it = navcontroller_to_descriptor_.begin(); + it != navcontroller_to_descriptor_.end(); + ++it) { + if (it->second->devtools_host() == from) { + nav_controller = it->second->navigation_controller(); + break; + } + } + + if (!nav_controller) { + NOTREACHED(); + return; + } + + // TODO(yurys): notify client that the agent is no longer available + TabContents* tc = nav_controller->active_contents(); + if (!tc) { + return; + } + WebContents* wc = tc->AsWebContents(); + if (!wc) { + return; + } + RenderViewHost* target_host = wc->render_view_host(); + if (!target_host) { + return; + } + + IPC::Message* m = new IPC::Message(message); + m->set_routing_id(target_host->routing_id()); + target_host->Send(m); +} + +void DevToolsManager::ForwardToDevToolsClient(RenderViewHost* from, + const IPC::Message& message) { + WebContents* wc = from->delegate()->GetAsWebContents(); + if (!wc) { + NOTREACHED(); + return; + } + + NavigationController* navigation_controller = wc->controller(); + + DescriptorMap::const_iterator it = + navcontroller_to_descriptor_.find(navigation_controller); + if (it == navcontroller_to_descriptor_.end()) { + NOTREACHED(); + return; + } + + RenderViewHost* target_host = it->second->devtools_host(); + IPC::Message* m = new IPC::Message(message); + m->set_routing_id(target_host->routing_id()); + target_host->Send(m); +} + +void DevToolsManager::RemoveDescriptor( + DevToolsInstanceDescriptorImpl* descriptor) { + NavigationController* navigation_controller = + descriptor->navigation_controller(); + // This should be done before StopListening as the latter checks number of + // alive devtools instances. + navcontroller_to_descriptor_.erase(navigation_controller); + StopListening(navigation_controller); +} + + +void DevToolsManager::StartListening( + NavigationController* navigation_controller) { + // TODO(yurys): add render host change listener + if (!web_contents_listeners_.get()) { + web_contents_listeners_.reset(new NotificationRegistrar); + web_contents_listeners_->Add( + this, + NotificationType::WEB_CONTENTS_DISCONNECTED, + NotificationService::AllSources()); + } +} + +void DevToolsManager::StopListening( + NavigationController* navigation_controller) { + DCHECK(web_contents_listeners_.get()); + if (navcontroller_to_descriptor_.empty()) { + web_contents_listeners_.reset(); + } +} 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_ diff --git a/chrome/browser/debugger/dev_tools_view.cc b/chrome/browser/debugger/devtools_view.cc index f0f6234..8305f2a 100644 --- a/chrome/browser/debugger/dev_tools_view.cc +++ b/chrome/browser/debugger/devtools_view.cc @@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/debugger/dev_tools_view.h" +#include "chrome/browser/debugger/devtools_view.h" #include <string> #include "chrome/browser/browser_list.h" +#include "chrome/browser/debugger/devtools_manager.h" #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/web_contents.h" #include "chrome/browser/views/tab_contents_container_view.h" @@ -14,9 +15,8 @@ #include "chrome/common/render_messages.h" #include "chrome/common/url_constants.h" -DevToolsView::DevToolsView(int inspected_process_id, int inspected_view_id) - : inspected_process_id_(inspected_process_id), - inspected_view_id_(inspected_view_id), +DevToolsView::DevToolsView(DevToolsInstanceDescriptor* descriptor) + : descriptor_(descriptor), web_contents_(NULL) { web_container_ = new TabContentsContainerView(); AddChildView(web_container_); @@ -25,16 +25,6 @@ DevToolsView::DevToolsView(int inspected_process_id, int inspected_view_id) DevToolsView::~DevToolsView() { } -void DevToolsView::SendDevToolsClientMessage(const IPC::Message& message) { - if (!web_contents_) { - NOTREACHED(); - return; - } - IPC::Message* copy = new IPC::Message(message); - copy->set_routing_id(web_contents_->render_view_host()->routing_id()); - web_contents_->render_view_host()->Send(copy); -} - std::string DevToolsView::GetClassName() const { return "DevToolsView"; } @@ -68,8 +58,7 @@ void DevToolsView::Init() { web_contents_->set_delegate(this); web_container_->SetTabContents(web_contents_); web_contents_->render_view_host()->AllowDOMUIBindings(); - web_contents_->render_view_host()->SetInspectedView(inspected_process_id_, - inspected_view_id_); + descriptor_->SetDevToolsHost(web_contents_->render_view_host()); // chrome-ui://devtools/tools.html GURL contents(std::string(chrome::kChromeUIScheme) + "://" + @@ -81,6 +70,11 @@ void DevToolsView::Init() { } void DevToolsView::OnWindowClosing() { + DCHECK(descriptor_) << "OnWindowClosing is called twice"; + if (descriptor_) { + descriptor_->Destroy(); + descriptor_ = NULL; + } web_container_->SetTabContents(NULL); // detach last (and only) tab web_contents_->CloseContents(); // destroy the tab and navigation controller } diff --git a/chrome/browser/debugger/dev_tools_view.h b/chrome/browser/debugger/devtools_view.h index 2ab0a37..2dc956c 100644 --- a/chrome/browser/debugger/dev_tools_view.h +++ b/chrome/browser/debugger/devtools_view.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_DEBUGGER_DEV_TOOLS_VIEW_H_ -#define CHROME_BROWSER_DEBUGGER_DEV_TOOLS_VIEW_H_ +#ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_VIEW_H_ +#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_VIEW_H_ #include <string> @@ -12,20 +12,16 @@ #include "chrome/browser/tab_contents/tab_contents_delegate.h" #include "chrome/views/view.h" -namespace IPC { -class Message; -} +class DevToolsInstanceDescriptor; class TabContentsContainerView; class WebContents; class DevToolsView : public views::View, public TabContentsDelegate { public: - explicit DevToolsView(int inspected_process_id, int inspected_view_id); + explicit DevToolsView(DevToolsInstanceDescriptor* descriptor); virtual ~DevToolsView(); - void SendDevToolsClientMessage(const IPC::Message& message); - // Destroy content views when the window is closing. void OnWindowClosing(); @@ -67,12 +63,11 @@ class DevToolsView : public views::View, void Init(); - const int inspected_process_id_; - const int inspected_view_id_; + DevToolsInstanceDescriptor* descriptor_; WebContents* web_contents_; TabContentsContainerView* web_container_; DISALLOW_COPY_AND_ASSIGN(DevToolsView); }; -#endif // CHROME_BROWSER_DEBUGGER_DEV_TOOLS_VIEW_H_ +#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_VIEW_H_ diff --git a/chrome/browser/debugger/devtools_window.h b/chrome/browser/debugger/devtools_window.h new file mode 100644 index 0000000..fb6379bca --- /dev/null +++ b/chrome/browser/debugger/devtools_window.h @@ -0,0 +1,28 @@ +// 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_DEV_TOOLS_WINDOW_H_ +#define CHROME_BROWSER_DEBUGGER_DEV_TOOLS_WINDOW_H_ + +#include "base/basictypes.h" + +class DevToolsInstanceDescriptor; + +class DevToolsWindow { + public: + static DevToolsWindow* Create(DevToolsInstanceDescriptor* descriptor); + virtual ~DevToolsWindow() {} + + // Show developer tools window. + virtual void Show() = 0; + virtual void Close() = 0; + + protected: + DevToolsWindow() {} + + private: + DISALLOW_COPY_AND_ASSIGN(DevToolsWindow); +}; + +#endif // CHROME_BROWSER_DEBUGGER_DEV_TOOLS_WINDOW_H_ diff --git a/chrome/browser/debugger/devtools_window_gtk.cc b/chrome/browser/debugger/devtools_window_gtk.cc new file mode 100644 index 0000000..be7096d --- /dev/null +++ b/chrome/browser/debugger/devtools_window_gtk.cc @@ -0,0 +1,13 @@ +// 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. + +#include "chrome/browser/debugger/devtools_window.h" + +#include "base/logging.h" + +// static +DevToolsWindow* DevToolsWindow::Create(DevToolsInstanceDescriptor* descriptor) { + NOTIMPLEMENTED(); + return NULL; +} diff --git a/chrome/browser/debugger/devtools_window_mac.cc b/chrome/browser/debugger/devtools_window_mac.cc new file mode 100644 index 0000000..be7096d --- /dev/null +++ b/chrome/browser/debugger/devtools_window_mac.cc @@ -0,0 +1,13 @@ +// 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. + +#include "chrome/browser/debugger/devtools_window.h" + +#include "base/logging.h" + +// static +DevToolsWindow* DevToolsWindow::Create(DevToolsInstanceDescriptor* descriptor) { + NOTIMPLEMENTED(); + return NULL; +} diff --git a/chrome/browser/debugger/devtools_window_win.cc b/chrome/browser/debugger/devtools_window_win.cc new file mode 100644 index 0000000..4b258e7 --- /dev/null +++ b/chrome/browser/debugger/devtools_window_win.cc @@ -0,0 +1,70 @@ +// 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. + +#include "chrome/browser/debugger/devtools_window_win.h" + +#include "chrome/browser/debugger/devtools_manager.h" +#include "chrome/browser/debugger/devtools_view.h" +#include "chrome/views/window.h" + + +// static +DevToolsWindow* DevToolsWindow::Create(DevToolsInstanceDescriptor* descriptor) { + DevToolsView* view = new DevToolsView(descriptor); + DevToolsWindowWin* window = new DevToolsWindowWin(view); + descriptor->SetDevToolsWindow(window); + views::Window::CreateChromeWindow(NULL, gfx::Rect(), window); + return window; +} + +DevToolsWindowWin::DevToolsWindowWin(DevToolsView* view) + : tools_view_(view) { +} + +DevToolsWindowWin::~DevToolsWindowWin() { + DCHECK(!tools_view_); +} + +void DevToolsWindowWin::Show() { + if (window()) { + window()->Show(); + } else { + NOTREACHED(); + } +} + +void DevToolsWindowWin::Close() { + if (window()) { + window()->Close(); + } else { + NOTREACHED(); + } +} + +std::wstring DevToolsWindowWin::GetWindowTitle() const { + return L"Developer Tools"; +} + +void DevToolsWindowWin::WindowClosing() { + if (tools_view_) { + ReleaseWindow(); + tools_view_->OnWindowClosing(); + tools_view_ = NULL; + } else { + NOTREACHED() << "WindowClosing called twice."; + } +} + +bool DevToolsWindowWin::CanResize() const { + return true; +} + +views::View* DevToolsWindowWin::GetContentsView() { + return tools_view_; +} + +void DevToolsWindowWin::DeleteDelegate() { + DCHECK(!tools_view_) << "WindowClosing should have been called."; + delete this; +} diff --git a/chrome/browser/debugger/devtools_window_win.h b/chrome/browser/debugger/devtools_window_win.h new file mode 100644 index 0000000..f7be1aa --- /dev/null +++ b/chrome/browser/debugger/devtools_window_win.h @@ -0,0 +1,44 @@ +// 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_WINDOW_WIN_H_ +#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_WINDOW_WIN_H_ + +#include "base/basictypes.h" +#include "chrome/browser/debugger/devtools_window.h" +#include "chrome/views/window_delegate.h" + +namespace views { +class Window; +} +class DevToolsInstanceDescriptor; +class DevToolsView; +class TabContents; + +class DevToolsWindowWin : public DevToolsWindow, + public views::WindowDelegate { + public: + virtual ~DevToolsWindowWin(); + + // Show developer tools window. + virtual void Show(); + virtual void Close(); + + private: + friend class DevToolsWindow; + explicit DevToolsWindowWin(DevToolsView* view); + + // views::WindowDelegate methods: + virtual std::wstring GetWindowTitle() const; + virtual void WindowClosing(); + virtual bool CanResize() const; + virtual views::View* GetContentsView(); + virtual void DeleteDelegate(); + + DevToolsView* tools_view_; + + DISALLOW_COPY_AND_ASSIGN(DevToolsWindowWin); +}; + +#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_WINDOW_WIN_H_ diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 8e2beec..04855e4 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -13,6 +13,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/cross_site_request_manager.h" #include "chrome/browser/debugger/debugger_wrapper.h" +#include "chrome/browser/debugger/devtools_manager.h" #include "chrome/browser/profile.h" #include "chrome/browser/metrics/user_metrics.h" #include "chrome/browser/renderer_host/renderer_security_policy.h" @@ -97,9 +98,7 @@ RenderViewHost::RenderViewHost(SiteInstance* instance, run_modal_reply_msg_(NULL), has_unload_listener_(false), is_waiting_for_unload_ack_(false), - are_javascript_messages_suppressed_(false), - inspected_process_id_(-1), - inspected_view_id_(-1) { + are_javascript_messages_suppressed_(false) { DCHECK(instance_); DCHECK(delegate_); if (modal_dialog_event == NULL) @@ -1188,26 +1187,12 @@ void RenderViewHost::DidDebugAttach() { } } -void RenderViewHost::SetInspectedView(int inspected_process_id, - int inspected_view_id) { - inspected_process_id_ = inspected_process_id; - inspected_view_id_ = inspected_view_id; -} - void RenderViewHost::OnForwardToDevToolsAgent(const IPC::Message& message) { - RenderViewHost* host = RenderViewHost::FromID(inspected_process_id_, - inspected_view_id_); - if (!host) - return; - IPC::Message* m = new IPC::Message(message); - m->set_routing_id(inspected_view_id_); - host->Send(m); + g_browser_process->devtools_manager()->ForwardToDevToolsAgent(this, message); } void RenderViewHost::OnForwardToDevToolsClient(const IPC::Message& message) { - RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); - if (view) - view->ForwardMessageToDevToolsClient(message); + g_browser_process->devtools_manager()->ForwardToDevToolsClient(this, message); } void RenderViewHost::OnUserMetricsRecordAction(const std::wstring& action) { diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index a050a63..0ac63f8 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -326,11 +326,6 @@ class RenderViewHost : public RenderWidgetHost { // Must be called before CreateRenderView(). void AllowExtensionBindings(); - // Tells the renderer which render view should be inspected by developer - // tools loaded in it. This method should be called before renderer is - // created. - void SetInspectedView(int inspected_process_id, int inspected_view_id); - // Sets a property with the given name and value on the DOM UI binding object. // Must call AllowDOMUIBindings() on this renderer first. void SetDOMUIProperty(const std::string& name, const std::string& value); @@ -628,12 +623,6 @@ class RenderViewHost : public RenderWidgetHost { bool are_javascript_messages_suppressed_; - // When this renderer hosts developer tools this two fields contain rerndeder - // process id and render view id of the page being inspected. Both fieldes - // are -1 if the content of this renderer is not developer tools frontend. - int inspected_process_id_; - int inspected_view_id_; - DISALLOW_EVIL_CONSTRUCTORS(RenderViewHost); }; diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index ebd9202..9215f6a 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -115,11 +115,6 @@ class RenderViewHostDelegate { // specified events. This gives an opportunity to the browser to process the // event (used for keyboard shortcuts). virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) = 0; - - // Forwards message to DevToolsClient in developer tools window open for - // this page. - virtual void ForwardMessageToDevToolsClient( - const IPC::Message& message) = 0; }; // Interface for saving web pages. diff --git a/chrome/browser/tab_contents/interstitial_page.cc b/chrome/browser/tab_contents/interstitial_page.cc index a4e4f5b..2a63a41 100644 --- a/chrome/browser/tab_contents/interstitial_page.cc +++ b/chrome/browser/tab_contents/interstitial_page.cc @@ -84,7 +84,6 @@ class InterstitialPage::InterstitialPageRVHViewDelegate virtual void UpdateDragCursor(bool is_drop_target); virtual void TakeFocus(bool reverse); virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event); - virtual void ForwardMessageToDevToolsClient(const IPC::Message& message); virtual void OnFindReply(int request_id, int number_of_matches, const gfx::Rect& selection_rect, @@ -486,11 +485,6 @@ void InterstitialPage::InterstitialPageRVHViewDelegate::HandleKeyboardEvent( interstitial_page_->tab()->GetViewDelegate()->HandleKeyboardEvent(event); } -void InterstitialPage::InterstitialPageRVHViewDelegate:: - ForwardMessageToDevToolsClient(const IPC::Message& message) { - NOTREACHED() << "InterstitialPage does not support developer tools content."; -} - void InterstitialPage::InterstitialPageRVHViewDelegate::OnFindReply( int request_id, int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update) { diff --git a/chrome/browser/tab_contents/web_contents_view.h b/chrome/browser/tab_contents/web_contents_view.h index 52fceba..f63a3ee 100644 --- a/chrome/browser/tab_contents/web_contents_view.h +++ b/chrome/browser/tab_contents/web_contents_view.h @@ -108,13 +108,6 @@ class WebContentsView : public RenderViewHostDelegate::View { // RenderWidgetHost is deleted. Removes |host| from internal maps. void RenderWidgetHostDestroyed(RenderWidgetHost* host); - // Opens developer tools window for the page. - virtual void OpenDeveloperTools() = 0; - - // Forwards message to DevToolsClient in developer tools window open for this - // page. - virtual void ForwardMessageToDevToolsClient(const IPC::Message& message) = 0; - // Sets focus to the appropriate element when the tab contents is shown the // first time. virtual void SetInitialFocus() = 0; diff --git a/chrome/browser/tab_contents/web_contents_view_gtk.cc b/chrome/browser/tab_contents/web_contents_view_gtk.cc index e550174..7b6cf18 100644 --- a/chrome/browser/tab_contents/web_contents_view_gtk.cc +++ b/chrome/browser/tab_contents/web_contents_view_gtk.cc @@ -121,15 +121,6 @@ void WebContentsViewGtk::SizeContents(const gfx::Size& size) { NOTIMPLEMENTED(); } -void WebContentsViewGtk::OpenDeveloperTools() { - NOTIMPLEMENTED(); -} - -void WebContentsViewGtk::ForwardMessageToDevToolsClient( - const IPC::Message& message) { - NOTIMPLEMENTED(); -} - void WebContentsViewGtk::FindInPage(const Browser& browser, bool find_next, bool forward_direction) { NOTIMPLEMENTED(); diff --git a/chrome/browser/tab_contents/web_contents_view_gtk.h b/chrome/browser/tab_contents/web_contents_view_gtk.h index ec71c49..f218fee 100644 --- a/chrome/browser/tab_contents/web_contents_view_gtk.h +++ b/chrome/browser/tab_contents/web_contents_view_gtk.h @@ -33,8 +33,6 @@ class WebContentsViewGtk : public WebContentsView { virtual void SetPageTitle(const std::wstring& title); virtual void Invalidate(); virtual void SizeContents(const gfx::Size& size); - virtual void OpenDeveloperTools(); - virtual void ForwardMessageToDevToolsClient(const IPC::Message& message); virtual void FindInPage(const Browser& browser, bool find_next, bool forward_direction); virtual void HideFindBar(bool end_session); diff --git a/chrome/browser/tab_contents/web_contents_view_mac.h b/chrome/browser/tab_contents/web_contents_view_mac.h index e7bffac..352f5bc 100644 --- a/chrome/browser/tab_contents/web_contents_view_mac.h +++ b/chrome/browser/tab_contents/web_contents_view_mac.h @@ -50,8 +50,6 @@ class WebContentsViewMac : public WebContentsView, virtual void SetPageTitle(const std::wstring& title); virtual void Invalidate(); virtual void SizeContents(const gfx::Size& size); - virtual void OpenDeveloperTools(); - virtual void ForwardMessageToDevToolsClient(const IPC::Message& message); virtual void FindInPage(const Browser& browser, bool find_next, bool forward_direction); virtual void HideFindBar(bool end_session); diff --git a/chrome/browser/tab_contents/web_contents_view_mac.mm b/chrome/browser/tab_contents/web_contents_view_mac.mm index b607697..efde5a5 100644 --- a/chrome/browser/tab_contents/web_contents_view_mac.mm +++ b/chrome/browser/tab_contents/web_contents_view_mac.mm @@ -104,15 +104,6 @@ void WebContentsViewMac::SizeContents(const gfx::Size& size) { NOTIMPLEMENTED(); // Leaving the hack unimplemented. } -void WebContentsViewMac::OpenDeveloperTools() { - NOTIMPLEMENTED(); -} - -void WebContentsViewMac::ForwardMessageToDevToolsClient( - const IPC::Message& message) { - NOTIMPLEMENTED(); -} - void WebContentsViewMac::FindInPage(const Browser& browser, bool find_next, bool forward_direction) { if (!find_bar_.get()) { diff --git a/chrome/browser/tab_contents/web_contents_view_win.cc b/chrome/browser/tab_contents/web_contents_view_win.cc index 927f612..f087a2c 100644 --- a/chrome/browser/tab_contents/web_contents_view_win.cc +++ b/chrome/browser/tab_contents/web_contents_view_win.cc @@ -9,7 +9,6 @@ #include "chrome/browser/bookmarks/bookmark_drag_data.h" #include "chrome/browser/browser.h" // TODO(beng): this dependency is awful. #include "chrome/browser/browser_process.h" -#include "chrome/browser/debugger/dev_tools_window.h" #include "chrome/browser/dom_ui/dom_ui_host.h" #include "chrome/browser/download/download_request_manager.h" #include "chrome/browser/renderer_host/render_process_host.h" @@ -224,26 +223,6 @@ void WebContentsViewWin::SizeContents(const gfx::Size& size) { WasSized(size); } -void WebContentsViewWin::OpenDeveloperTools() { - if (!dev_tools_window_.get()) - dev_tools_window_.reset(new DevToolsWindow); - - RenderViewHost* host = web_contents_->render_view_host(); - if (!host) - return; - - dev_tools_window_->Show(host->process()->pid(), host->routing_id()); -} - -void WebContentsViewWin::ForwardMessageToDevToolsClient( - const IPC::Message& message) { - if (!dev_tools_window_.get()) { - NOTREACHED() << "Developer tools window is not open."; - return; - } - dev_tools_window_->SendDevToolsClientMessage(message); -} - void WebContentsViewWin::SetInitialFocus() { if (web_contents_->AsDOMUIContents()) web_contents_->AsDOMUIContents()->SetInitialFocus(); diff --git a/chrome/browser/tab_contents/web_contents_view_win.h b/chrome/browser/tab_contents/web_contents_view_win.h index cd26bb7..e4f9e45 100644 --- a/chrome/browser/tab_contents/web_contents_view_win.h +++ b/chrome/browser/tab_contents/web_contents_view_win.h @@ -10,7 +10,6 @@ #include "chrome/browser/tab_contents/web_contents_view.h" #include "chrome/views/widget_win.h" -class DevToolsWindow; class SadTabView; struct WebDropData; class WebDropTarget; @@ -41,8 +40,6 @@ class WebContentsViewWin : public WebContentsView, virtual void SetPageTitle(const std::wstring& title); virtual void Invalidate(); virtual void SizeContents(const gfx::Size& size); - virtual void OpenDeveloperTools(); - virtual void ForwardMessageToDevToolsClient(const IPC::Message& message); virtual void SetInitialFocus(); virtual void StoreFocus(); virtual void RestoreFocus(); @@ -103,9 +100,6 @@ class WebContentsViewWin : public WebContentsView, WebContents* web_contents_; - // Allows to show exactly one developer tools window for this page. - scoped_ptr<DevToolsWindow> dev_tools_window_; - // A drop target object that handles drags over this WebContents. scoped_refptr<WebDropTarget> drop_target_; diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index f8990f4..a11cccc 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -528,10 +528,14 @@ 'browser/debugger/debugger_window.h', 'browser/debugger/debugger_wrapper.cc', 'browser/debugger/debugger_wrapper.h', - 'browser/debugger/dev_tools_window.cc', - 'browser/debugger/dev_tools_window.h', - 'browser/debugger/dev_tools_view.cc', - 'browser/debugger/dev_tools_view.h', + 'browser/debugger/devtools_manager.h', + 'browser/debugger/devtools_manager.cc', + 'browser/debugger/devtools_window.h', + 'browser/debugger/devtools_window_gtk.cc', + 'browser/debugger/devtools_window_mac.cc', + 'browser/debugger/devtools_window_win.cc', + 'browser/debugger/devtools_view.cc', + 'browser/debugger/devtools_view.h', 'browser/dock_info.cc', 'browser/dock_info.h', 'browser/dom_operation_notification_details.h', @@ -1269,10 +1273,10 @@ 'browser/browser_accessibility_manager.cc', 'browser/debugger/debugger_view.cc', 'browser/debugger/debugger_window.cc', - 'browser/debugger/dev_tools_view.cc', - 'browser/debugger/dev_tools_view.h', - 'browser/debugger/dev_tools_window.cc', - 'browser/debugger/dev_tools_window.h', + 'browser/debugger/devtools_view.cc', + 'browser/debugger/devtools_view.h', + 'browser/debugger/devtools_window_gtk.cc', + 'browser/debugger/devtools_window_win.cc', 'browser/dock_info.cc', 'browser/dom_ui/html_dialog_contents.cc', 'browser/drag_utils.cc', diff --git a/chrome/test/testing_browser_process.h b/chrome/test/testing_browser_process.h index 0cbe91b..e2fff16 100644 --- a/chrome/test/testing_browser_process.h +++ b/chrome/test/testing_browser_process.h @@ -75,6 +75,10 @@ class TestingBrowserProcess : public BrowserProcess { return NULL; } + virtual DevToolsManager* devtools_manager() { + return NULL; + } + virtual ClipboardService* clipboard_service() { return NULL; } |