diff options
-rw-r--r-- | chrome/browser/debugger/devtools_window.cc | 42 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_window.h | 2 | ||||
-rw-r--r-- | content/browser/debugger/devtools_client_host.cc | 33 | ||||
-rw-r--r-- | content/browser/debugger/devtools_client_host.h | 8 |
4 files changed, 61 insertions, 24 deletions
diff --git a/chrome/browser/debugger/devtools_window.cc b/chrome/browser/debugger/devtools_window.cc index c89a391..1df3ee7 100644 --- a/chrome/browser/debugger/devtools_window.cc +++ b/chrome/browser/debugger/devtools_window.cc @@ -6,7 +6,6 @@ #include "base/command_line.h" #include "base/json/json_writer.h" -#include "base/lazy_instance.h" #include "base/stringprintf.h" #include "base/string_number_conversions.h" #include "base/utf_string_conversions.h" @@ -45,13 +44,6 @@ #include "content/public/common/bindings_policy.h" #include "grit/generated_resources.h" -typedef std::vector<DevToolsWindow*> DevToolsWindowList; -namespace { -base::LazyInstance<DevToolsWindowList, - base::LeakyLazyInstanceTraits<DevToolsWindowList> > - g_instances = LAZY_INSTANCE_INITIALIZER; -} // namespace - const char DevToolsWindow::kDevToolsApp[] = "DevToolsApp"; // static @@ -68,6 +60,9 @@ TabContentsWrapper* DevToolsWindow::GetDevToolsContents( return NULL; DevToolsManager* manager = DevToolsManager::GetInstance(); + if (!manager) + return NULL; // Happens only in tests. + DevToolsClientHost* client_host = manager-> GetDevToolsClientHostFor(inspected_tab->render_view_host()); DevToolsWindow* window = AsDevToolsWindow(client_host); @@ -77,6 +72,15 @@ TabContentsWrapper* DevToolsWindow::GetDevToolsContents( } // static +DevToolsWindow* DevToolsWindow::FindDevToolsWindow( + RenderViewHost* window_rvh) { + DevToolsClientHost* client_host = + DevToolsClientHost::FindOwnerClientHost(window_rvh); + return client_host != NULL ? DevToolsWindow::AsDevToolsWindow(client_host) + : NULL; +} + +// static DevToolsWindow* DevToolsWindow::OpenDevToolsWindowForWorker( Profile* profile, DevToolsAgentHost* worker_agent) { @@ -159,7 +163,6 @@ DevToolsWindow::DevToolsWindow(TabContentsWrapper* tab_contents, docked_(docked), is_loaded_(false), action_on_load_(DEVTOOLS_TOGGLE_ACTION_NONE) { - g_instances.Get().push_back(this); // Wipe out page icon so that the default application icon is used. NavigationEntry* entry = tab_contents_->controller().GetActiveEntry(); entry->favicon().set_bitmap(SkBitmap()); @@ -188,12 +191,6 @@ DevToolsWindow::DevToolsWindow(TabContentsWrapper* tab_contents, } DevToolsWindow::~DevToolsWindow() { - DevToolsWindowList& instances = g_instances.Get(); - DevToolsWindowList::iterator it = std::find(instances.begin(), - instances.end(), - this); - DCHECK(it != instances.end()); - instances.erase(it); } void DevToolsWindow::SendMessageToClient(const IPC::Message& message) { @@ -234,6 +231,10 @@ void DevToolsWindow::TabReplaced(TabContents* new_tab) { inspected_tab_ = new_tab_wrapper; } +RenderViewHost* DevToolsWindow::GetClientRenderViewHost() { + return tab_contents_->render_view_host(); +} + void DevToolsWindow::Show(DevToolsToggleAction action) { if (docked_) { Browser* inspected_browser; @@ -645,15 +646,10 @@ DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow( // static DevToolsWindow* DevToolsWindow::AsDevToolsWindow( DevToolsClientHost* client_host) { - if (!client_host || g_instances == NULL) + if (!client_host) return NULL; - DevToolsWindowList& instances = g_instances.Get(); - for (DevToolsWindowList::iterator it = instances.begin(); - it != instances.end(); ++it) { - DevToolsClientHost* client = *it; - if (client == client_host) - return *it; - } + if (client_host->GetClientRenderViewHost() != NULL) + return static_cast<DevToolsWindow*>(client_host); return NULL; } diff --git a/chrome/browser/debugger/devtools_window.h b/chrome/browser/debugger/devtools_window.h index ba348b5..8bdd58f 100644 --- a/chrome/browser/debugger/devtools_window.h +++ b/chrome/browser/debugger/devtools_window.h @@ -43,6 +43,7 @@ class DevToolsWindow static const char kDevToolsApp[]; static void RegisterUserPrefs(PrefService* prefs); static TabContentsWrapper* GetDevToolsContents(TabContents* inspected_tab); + static DevToolsWindow* FindDevToolsWindow(RenderViewHost* window_rvh); static DevToolsWindow* OpenDevToolsWindowForWorker( Profile* profile, @@ -59,6 +60,7 @@ class DevToolsWindow virtual void SendMessageToClient(const IPC::Message& message) OVERRIDE; virtual void InspectedTabClosing() OVERRIDE; virtual void TabReplaced(TabContents* new_tab) OVERRIDE; + virtual RenderViewHost* GetClientRenderViewHost() OVERRIDE; RenderViewHost* GetRenderViewHost(); void Show(DevToolsToggleAction action); diff --git a/content/browser/debugger/devtools_client_host.cc b/content/browser/debugger/devtools_client_host.cc index 68fa25f..3ff2c54 100644 --- a/content/browser/debugger/devtools_client_host.cc +++ b/content/browser/debugger/devtools_client_host.cc @@ -2,14 +2,45 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "content/browser/debugger/devtools_client_host.h" +#include <algorithm> +#include "base/lazy_instance.h" +#include "base/logging.h" +#include "content/browser/debugger/devtools_client_host.h" #include "content/browser/debugger/devtools_manager.h" +typedef std::vector<DevToolsClientHost*> DevToolsClientHostList; +namespace { +base::LazyInstance<DevToolsClientHostList, + base::LeakyLazyInstanceTraits<DevToolsClientHostList> > + g_instances = LAZY_INSTANCE_INITIALIZER; +} // namespace + +// static +DevToolsClientHost* DevToolsClientHost::FindOwnerClientHost( + RenderViewHost* client_rvh) { + for (DevToolsClientHostList::iterator it = g_instances.Get().begin(); + it != g_instances.Get().end(); ++it) { + if ((*it)->GetClientRenderViewHost() == client_rvh) + return *it; + } + return NULL; +} + DevToolsClientHost::~DevToolsClientHost() { + DevToolsClientHostList::iterator it = std::find(g_instances.Get().begin(), + g_instances.Get().end(), + this); + DCHECK(it != g_instances.Get().end()); + g_instances.Get().erase(it); +} + +RenderViewHost* DevToolsClientHost::GetClientRenderViewHost() { + return NULL; } DevToolsClientHost::DevToolsClientHost() : close_listener_(NULL) { + g_instances.Get().push_back(this); } void DevToolsClientHost::ForwardToDevToolsAgent(const IPC::Message& message) { diff --git a/content/browser/debugger/devtools_client_host.h b/content/browser/debugger/devtools_client_host.h index 0ae8c1b..16e4d89 100644 --- a/content/browser/debugger/devtools_client_host.h +++ b/content/browser/debugger/devtools_client_host.h @@ -7,6 +7,7 @@ #pragma once #include <string> +#include <vector> #include "base/basictypes.h" #include "content/common/content_export.h" @@ -15,6 +16,7 @@ namespace IPC { class Message; } +class RenderViewHost; class TabContents; // Describes interface for managing devtools clients from browser process. There @@ -31,6 +33,8 @@ class CONTENT_EXPORT DevToolsClientHost { DISALLOW_COPY_AND_ASSIGN(CloseListener); }; + static DevToolsClientHost* FindOwnerClientHost(RenderViewHost* client_rvh); + virtual ~DevToolsClientHost(); // This method is called when tab inspected by this devtools client is @@ -52,6 +56,10 @@ class CONTENT_EXPORT DevToolsClientHost { // TabStripModel::ReplaceTabContentsAt. virtual void TabReplaced(TabContents* new_tab) = 0; + // Returns client (front-end) RenderViewHost implementation of this + // client host if applicable. NULL otherwise. + virtual RenderViewHost* GetClientRenderViewHost(); + protected: DevToolsClientHost(); |