Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Unified Diff: content/browser/debugger/devtools_window.cc

Issue 7322004: DevTools: devtools manager should know nothing about DevToolsWindow (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments addressed Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/debugger/devtools_window.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/debugger/devtools_window.cc
diff --git a/content/browser/debugger/devtools_window.cc b/content/browser/debugger/devtools_window.cc
index 96af885f9f1587603778cc1df3a1c31e296c6411..ba633243a70139c39ad1e464e43ead12f04f45bc 100644
--- a/content/browser/debugger/devtools_window.cc
+++ b/content/browser/debugger/devtools_window.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <algorithm>
+
#include "base/command_line.h"
#include "base/json/json_writer.h"
#include "base/stringprintf.h"
@@ -24,6 +26,7 @@
#include "chrome/common/pref_names.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/url_constants.h"
+#include "content/browser/browsing_instance.h"
#include "content/browser/debugger/devtools_manager.h"
#include "content/browser/debugger/devtools_window.h"
#include "content/browser/in_process_webkit/session_storage_namespace.h"
@@ -39,29 +42,61 @@
const char DevToolsWindow::kDevToolsApp[] = "DevToolsApp";
+DevToolsWindow::DevToolsWindowList DevToolsWindow::instances_;
+
// static
TabContentsWrapper* DevToolsWindow::GetDevToolsContents(
TabContents* inspected_tab) {
- if (!inspected_tab) {
+ if (!inspected_tab)
return NULL;
- }
- if (!DevToolsManager::GetInstance())
+ DevToolsManager* manager = DevToolsManager::GetInstance();
+ if (!manager)
return NULL; // Happens only in tests.
- DevToolsClientHost* client_host = DevToolsManager::GetInstance()->
- GetDevToolsClientHostFor(inspected_tab->render_view_host());
- if (!client_host) {
+ DevToolsClientHost* client_host = manager->
+ GetDevToolsClientHostFor(inspected_tab->render_view_host());
+ DevToolsWindow* window = AsDevToolsWindow(client_host);
+ if (!window || !window->is_docked())
return NULL;
- }
+ return window->tab_contents();
+}
- DevToolsWindow* window = client_host->AsDevToolsWindow();
- if (!window || !window->is_docked()) {
- return NULL;
+// static
+DevToolsWindow* DevToolsWindow::FindDevToolsWindow(
+ RenderViewHost* window_rvh) {
+ for (DevToolsWindowList::iterator it = instances_.begin();
+ it != instances_.end(); ++it) {
+ if ((*it)->GetRenderViewHost() == window_rvh)
+ return *it;
}
- return window->tab_contents();
+ return NULL;
+}
+
+// static
+DevToolsWindow* DevToolsWindow::OpenDevToolsWindow(
+ RenderViewHost* inspected_rvh) {
+ return ToggleDevToolsWindow(inspected_rvh, true,
+ DEVTOOLS_TOGGLE_ACTION_NONE);
+}
+
+// static
+DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow(
+ RenderViewHost* inspected_rvh,
+ DevToolsToggleAction action) {
+ return ToggleDevToolsWindow(inspected_rvh, false, action);
}
+void DevToolsWindow::InspectElement(RenderViewHost* inspected_rvh,
+ int x,
+ int y) {
+ DevToolsManager::GetInstance()->SendInspectElement(inspected_rvh, x, y);
+ // TODO(loislo): we should initiate DevTools window opening from within
+ // renderer. Otherwise, we still can hit a race condition here.
+ OpenDevToolsWindow(inspected_rvh);
+}
+
+
DevToolsWindow::DevToolsWindow(Profile* profile,
RenderViewHost* inspected_rvh,
bool docked)
@@ -98,13 +133,16 @@ DevToolsWindow::DevToolsWindow(Profile* profile,
TabContents* tab = inspected_rvh->delegate()->GetAsTabContents();
if (tab)
inspected_tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab);
-}
-DevToolsWindow::~DevToolsWindow() {
+ instances_.push_back(this);
}
-DevToolsWindow* DevToolsWindow::AsDevToolsWindow() {
- return this;
+DevToolsWindow::~DevToolsWindow() {
+ DevToolsWindowList::iterator it = std::find(instances_.begin(),
+ instances_.end(),
+ this);
+ DCHECK(it != instances_.end());
+ instances_.erase(it);
}
void DevToolsWindow::SendMessageToClient(const IPC::Message& message) {
@@ -196,6 +234,12 @@ void DevToolsWindow::Activate() {
void DevToolsWindow::SetDocked(bool docked) {
if (docked_ == docked)
return;
+
+ if (!inspected_tab_)
+ return;
+
+ profile_->GetPrefs()->SetBoolean(prefs::kDevToolsOpenDocked, docked);
+
if (docked && (!GetInspectedBrowserWindow() ||
IsInspectedBrowserPopupOrPanel())) {
// Cannot dock, avoid window flashing due to close-reopen cycle.
@@ -478,3 +522,49 @@ void DevToolsWindow::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {
inspected_window->HandleKeyboardEvent(event);
}
}
+
+// static
+DevToolsWindow* DevToolsWindow::ToggleDevToolsWindow(
+ RenderViewHost* inspected_rvh,
+ bool force_open,
+ DevToolsToggleAction action) {
+ DevToolsManager* manager = DevToolsManager::GetInstance();
+
+ DevToolsClientHost* host = manager->GetDevToolsClientHostFor(inspected_rvh);
+ DevToolsWindow* window = AsDevToolsWindow(host);
+ if (host != NULL && window == NULL) {
+ // Break remote debugging / extension debugging session.
+ manager->UnregisterDevToolsClientHostFor(inspected_rvh);
+ }
+
+ bool do_open = force_open;
+ if (!window) {
+ Profile* profile = inspected_rvh->process()->profile();
+ bool docked = profile->GetPrefs()->GetBoolean(prefs::kDevToolsOpenDocked);
+ window = new DevToolsWindow(profile, inspected_rvh, docked);
+ manager->RegisterDevToolsClientHostFor(inspected_rvh, window);
+ do_open = true;
+ }
+
+ // If window is docked and visible, we hide it on toggle. If window is
+ // undocked, we show (activate) it.
+ if (!window->is_docked() || do_open)
+ window->Show(action);
+ else
+ manager->UnregisterDevToolsClientHostFor(inspected_rvh);
+
+ return window;
+}
+
+// static
+DevToolsWindow* DevToolsWindow::AsDevToolsWindow(
+ DevToolsClientHost* client_host) {
+ if (!client_host)
+ return NULL;
+ DevToolsWindowList::iterator it = std::find(instances_.begin(),
+ instances_.end(),
+ client_host);
+ if (it == instances_.end())
+ return NULL;
+ return *it;
+}
« no previous file with comments | « content/browser/debugger/devtools_window.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698