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

Unified Diff: chrome/browser/debugger/devtools_manager.cc

Issue 50009: Allow different types of devtools client (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 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 | « chrome/browser/debugger/devtools_manager.h ('k') | chrome/browser/debugger/devtools_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/debugger/devtools_manager.cc
===================================================================
--- chrome/browser/debugger/devtools_manager.cc (revision 12273)
+++ chrome/browser/debugger/devtools_manager.cc (working copy)
@@ -5,132 +5,89 @@
#include "chrome/browser/debugger/devtools_manager.h"
#include "chrome/browser/debugger/devtools_window.h"
+#include "chrome/browser/debugger/devtools_client_host.h"
#include "chrome/browser/renderer_host/render_view_host.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(
- DevToolsManager* manager,
- NavigationController* navigation_controller)
- : manager_(manager),
- 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() {
- 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:
- DevToolsManager* manager_;
- NavigationController* navigation_controller_;
- RenderViewHost* devtools_host_;
- DevToolsWindow* devtools_window_;
-
- DISALLOW_COPY_AND_ASSIGN(DevToolsInstanceDescriptorImpl);
-};
-
-DevToolsManager::DevToolsManager(DevToolsWindowFactory* factory)
- : web_contents_listeners_(NULL),
- devtools_window_factory_(factory) {
+DevToolsManager::DevToolsManager() : web_contents_listeners_(NULL) {
}
DevToolsManager::~DevToolsManager() {
DCHECK(!web_contents_listeners_.get()) <<
- "All devtools windows must alredy have been closed.";
+ "All devtools client hosts must alredy have been destroyed.";
+ DCHECK(navcontroller_to_client_host_.empty());
+ DCHECK(client_host_to_navcontroller_.empty());
}
-DevToolsWindow* DevToolsManager::CreateDevToolsWindow(
- DevToolsInstanceDescriptor* descriptor) {
- if (devtools_window_factory_) {
- return devtools_window_factory_->CreateDevToolsWindow(descriptor);
- } else {
- return DevToolsWindow::Create(descriptor);
- }
-}
-
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()) {
+ DevToolsClientHost* client_host = GetDevToolsClientHostFor(*src.ptr());
+ if (!client_host) {
return;
}
+
+ NavigationController* controller = src->controller();
bool active = (controller->active_contents() == src.ptr());
- if (!active) {
- return;
+ if (active) {
+ // Active tab contents disconnecting from its renderer means that the tab
+ // is closing.
+ client_host->InspectedTabClosing();
}
- // 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();
+DevToolsClientHost* DevToolsManager::GetDevToolsClientHostFor(
+ const WebContents& web_contents) {
+ NavigationController* navigation_controller = web_contents.controller();
+ ClientHostMap::const_iterator it =
+ navcontroller_to_client_host_.find(navigation_controller);
+ if (it != navcontroller_to_client_host_.end()) {
+ return it->second;
+ }
+ return NULL;
+}
- 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(this, navigation_controller);
- navcontroller_to_descriptor_[navigation_controller] = desc;
+void DevToolsManager::RegisterDevToolsClientHostFor(
+ const WebContents& web_contents,
+ DevToolsClientHost* client_host) {
+ DCHECK(!GetDevToolsClientHostFor(web_contents));
- StartListening(navigation_controller);
+ NavigationController* navigation_controller = web_contents.controller();
+ navcontroller_to_client_host_[navigation_controller] = client_host;
+ client_host_to_navcontroller_[client_host] = navigation_controller;
+ client_host->set_close_listener(this);
- window = CreateDevToolsWindow(desc);
- }
-
- window->Show();
+ StartListening(navigation_controller);
}
-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();
+void DevToolsManager::ForwardToDevToolsAgent(
+ const RenderViewHost& client_rvh,
+ const IPC::Message& message) {
+ for (ClientHostMap::const_iterator it =
+ navcontroller_to_client_host_.begin();
+ it != navcontroller_to_client_host_.end();
++it) {
- if (it->second->devtools_host() == from) {
- nav_controller = it->second->navigation_controller();
- break;
+ DevToolsWindow* win = it->second->AsDevToolsWindow();
+ if (!win) {
+ continue;
}
+ if (win->HasRenderViewHost(client_rvh)) {
+ ForwardToDevToolsAgent(*win, message);
+ return;
+ }
}
+}
+void DevToolsManager::ForwardToDevToolsAgent(const DevToolsClientHost& from,
+ const IPC::Message& message) {
+ NavigationController* nav_controller =
+ GetDevToolsAgentNavigationController(from);
if (!nav_controller) {
NOTREACHED();
return;
@@ -155,39 +112,43 @@
target_host->Send(m);
}
-void DevToolsManager::ForwardToDevToolsClient(RenderViewHost* from,
+void DevToolsManager::ForwardToDevToolsClient(const RenderViewHost& from,
const IPC::Message& message) {
- WebContents* wc = from->delegate()->GetAsWebContents();
+ 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()) {
+ DevToolsClientHost* target_host = GetDevToolsClientHostFor(*wc);
+ if (!target_host) {
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);
+ target_host->SendMessageToClient(message);
}
-void DevToolsManager::RemoveDescriptor(
- DevToolsInstanceDescriptorImpl* descriptor) {
- NavigationController* navigation_controller =
- descriptor->navigation_controller();
+void DevToolsManager::ClientHostClosing(DevToolsClientHost* host) {
+ NavigationController* controller = GetDevToolsAgentNavigationController(
+ *host);
+ DCHECK(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);
+ navcontroller_to_client_host_.erase(controller);
+ client_host_to_navcontroller_.erase(host);
+
+ StopListening(controller);
}
+NavigationController* DevToolsManager::GetDevToolsAgentNavigationController(
+ const DevToolsClientHost& client_host) {
+ NavControllerMap::const_iterator it =
+ client_host_to_navcontroller_.find(&client_host);
+ if (it != client_host_to_navcontroller_.end()) {
+ return it->second;
+ }
+ return NULL;
+}
void DevToolsManager::StartListening(
NavigationController* navigation_controller) {
@@ -204,7 +165,8 @@
void DevToolsManager::StopListening(
NavigationController* navigation_controller) {
DCHECK(web_contents_listeners_.get());
- if (navcontroller_to_descriptor_.empty()) {
+ if (navcontroller_to_client_host_.empty()) {
+ DCHECK(client_host_to_navcontroller_.empty());
web_contents_listeners_.reset();
}
}
« no previous file with comments | « chrome/browser/debugger/devtools_manager.h ('k') | chrome/browser/debugger/devtools_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698