inspectable_tab_proxy.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/inspectable_tab_proxy.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_list.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/debugger_remote_service.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_client_host.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sessions/session_id.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_contents.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tabs/tab_strip_model.h"
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/devtools_messages.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDevToolsClientHostImpl::DevToolsClientHostImpl(
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int32 id,
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DebuggerRemoteService* service,
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    InspectableTabProxy::IdToClientHostMap* map)
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : id_(id),
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      service_(service),
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      map_(map) {}
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
27731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDevToolsClientHostImpl::~DevToolsClientHostImpl() {
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  map_->erase(this->id_);
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The debugged tab has closed.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::InspectedTabClosing() {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabClosed();
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete this;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The remote debugger has detached.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::Close() {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotifyCloseListener();
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete this;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::SendMessageToClient(
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const IPC::Message& msg) {
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(prybin): Restore FrameNavigate.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPC_BEGIN_MESSAGE_MAP(DevToolsClientHostImpl, msg)
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    IPC_MESSAGE_HANDLER(DevToolsClientMsg_DebuggerOutput, OnDebuggerOutput);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    IPC_MESSAGE_UNHANDLED_ERROR()
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPC_END_MESSAGE_MAP()
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DevToolsClientHostImpl::OnDebuggerOutput(const std::string& data) {
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  service_->DebuggerOutput(id_, data);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::FrameNavigate(const std::string& url) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service_->FrameNavigate(id_, url);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::TabClosed() {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service_->TabClosed(id_);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickInspectableTabProxy::InspectableTabProxy() {}
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
67731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickInspectableTabProxy::~InspectableTabProxy() {}
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst InspectableTabProxy::ControllersMap&
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    InspectableTabProxy::controllers_map() {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controllers_map_.clear();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (BrowserList::const_iterator it = BrowserList::begin(),
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       end = BrowserList::end(); it != end; ++it) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabStripModel* model = (*it)->tabstrip_model();
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0, size = model->count(); i < size; ++i) {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NavigationController& controller =
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          model->GetTabContentsAt(i)->controller();
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controllers_map_[controller.session_id().id()] = &controller;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return controllers_map_;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDevToolsClientHostImpl* InspectableTabProxy::ClientHostForTabId(
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int32 id) {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InspectableTabProxy::IdToClientHostMap::const_iterator it =
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      id_to_client_host_map_.find(id);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (it == id_to_client_host_map_.end()) {
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return it->second;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDevToolsClientHost* InspectableTabProxy::NewClientHost(
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int32 id,
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DebuggerRemoteService* service) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DevToolsClientHostImpl* client_host =
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new DevToolsClientHostImpl(id, service, &id_to_client_host_map_);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id_to_client_host_map_[id] = client_host;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return client_host;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InspectableTabProxy::OnRemoteDebuggerDetached() {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (id_to_client_host_map_.size() > 0) {
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    IdToClientHostMap::iterator it = id_to_client_host_map_.begin();
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    it->second->debugger_remote_service()->DetachFromTab(
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::IntToString(it->first), NULL);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
110