inspectable_tab_proxy.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/debugger/inspectable_tab_proxy.h"
6
7#include "base/string_number_conversions.h"
8#include "base/string_util.h"
9#include "chrome/browser/browser_list.h"
10#include "chrome/browser/debugger/debugger_remote_service.h"
11#include "chrome/browser/debugger/devtools_client_host.h"
12#include "chrome/browser/sessions/session_id.h"
13#include "chrome/browser/tab_contents/tab_contents.h"
14#include "chrome/browser/tabs/tab_strip_model.h"
15#include "chrome/browser/ui/browser.h"
16#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
17#include "chrome/common/devtools_messages.h"
18
19DevToolsClientHostImpl::DevToolsClientHostImpl(
20    int32 id,
21    DebuggerRemoteService* service,
22    InspectableTabProxy::IdToClientHostMap* map)
23    : id_(id),
24      service_(service),
25      map_(map) {}
26
27DevToolsClientHostImpl::~DevToolsClientHostImpl() {
28  map_->erase(this->id_);
29}
30
31// The debugged tab has closed.
32void DevToolsClientHostImpl::InspectedTabClosing() {
33  TabClosed();
34  delete this;
35}
36
37// The remote debugger has detached.
38void DevToolsClientHostImpl::Close() {
39  NotifyCloseListener();
40  delete this;
41}
42
43void DevToolsClientHostImpl::SendMessageToClient(
44    const IPC::Message& msg) {
45  // TODO(prybin): Restore FrameNavigate.
46  IPC_BEGIN_MESSAGE_MAP(DevToolsClientHostImpl, msg)
47    IPC_MESSAGE_HANDLER(DevToolsClientMsg_DebuggerOutput, OnDebuggerOutput);
48    IPC_MESSAGE_UNHANDLED_ERROR()
49  IPC_END_MESSAGE_MAP()
50}
51
52
53void DevToolsClientHostImpl::OnDebuggerOutput(const std::string& data) {
54  service_->DebuggerOutput(id_, data);
55}
56
57void DevToolsClientHostImpl::FrameNavigate(const std::string& url) {
58  service_->FrameNavigate(id_, url);
59}
60
61void DevToolsClientHostImpl::TabClosed() {
62  service_->TabClosed(id_);
63}
64
65InspectableTabProxy::InspectableTabProxy() {}
66
67InspectableTabProxy::~InspectableTabProxy() {}
68
69const InspectableTabProxy::ControllersMap&
70    InspectableTabProxy::controllers_map() {
71  controllers_map_.clear();
72  for (BrowserList::const_iterator it = BrowserList::begin(),
73       end = BrowserList::end(); it != end; ++it) {
74    TabStripModel* model = (*it)->tabstrip_model();
75    for (int i = 0, size = model->count(); i < size; ++i) {
76      NavigationController& controller =
77          model->GetTabContentsAt(i)->controller();
78      controllers_map_[controller.session_id().id()] = &controller;
79    }
80  }
81  return controllers_map_;
82}
83
84DevToolsClientHostImpl* InspectableTabProxy::ClientHostForTabId(
85    int32 id) {
86  InspectableTabProxy::IdToClientHostMap::const_iterator it =
87      id_to_client_host_map_.find(id);
88  if (it == id_to_client_host_map_.end()) {
89    return NULL;
90  }
91  return it->second;
92}
93
94DevToolsClientHost* InspectableTabProxy::NewClientHost(
95    int32 id,
96    DebuggerRemoteService* service) {
97  DevToolsClientHostImpl* client_host =
98      new DevToolsClientHostImpl(id, service, &id_to_client_host_map_);
99  id_to_client_host_map_[id] = client_host;
100  return client_host;
101}
102
103void InspectableTabProxy::OnRemoteDebuggerDetached() {
104  while (id_to_client_host_map_.size() > 0) {
105    IdToClientHostMap::iterator it = id_to_client_host_map_.begin();
106    it->second->debugger_remote_service()->DetachFromTab(
107        base::IntToString(it->first), NULL);
108  }
109}
110