1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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/debugger/debugger_remote_service.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_client_host.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sessions/session_id.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tabs/tab_strip_model.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/devtools_messages.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDevToolsClientHostImpl::DevToolsClientHostImpl(
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int32 id,
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DebuggerRemoteService* service,
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    InspectableTabProxy::IdToClientHostMap* map)
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : id_(id),
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      service_(service),
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      map_(map) {}
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
26731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDevToolsClientHostImpl::~DevToolsClientHostImpl() {
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  map_->erase(this->id_);
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The debugged tab has closed.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::InspectedTabClosing() {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabClosed();
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete this;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The remote debugger has detached.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::Close() {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotifyCloseListener();
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete this;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::SendMessageToClient(
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const IPC::Message& msg) {
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(prybin): Restore FrameNavigate.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPC_BEGIN_MESSAGE_MAP(DevToolsClientHostImpl, msg)
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    IPC_MESSAGE_HANDLER(DevToolsClientMsg_DebuggerOutput, OnDebuggerOutput);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    IPC_MESSAGE_UNHANDLED_ERROR()
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPC_END_MESSAGE_MAP()
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DevToolsClientHostImpl::TabReplaced(TabContentsWrapper* new_tab) {
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  map_->erase(id_);
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  id_ = new_tab->controller().session_id().id();
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  (*map_)[id_] = this;
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DevToolsClientHostImpl::OnDebuggerOutput(const std::string& data) {
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  service_->DebuggerOutput(id_, data);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DevToolsClientHostImpl::FrameNavigating(const std::string& url) {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service_->FrameNavigate(id_, url);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsClientHostImpl::TabClosed() {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service_->TabClosed(id_);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickInspectableTabProxy::InspectableTabProxy() {}
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
71731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickInspectableTabProxy::~InspectableTabProxy() {}
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst InspectableTabProxy::ControllersMap&
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    InspectableTabProxy::controllers_map() {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controllers_map_.clear();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (BrowserList::const_iterator it = BrowserList::begin(),
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       end = BrowserList::end(); it != end; ++it) {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabStripModel* model = (*it)->tabstrip_model();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0, size = model->count(); i < size; ++i) {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NavigationController& controller =
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          model->GetTabContentsAt(i)->controller();
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controllers_map_[controller.session_id().id()] = &controller;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return controllers_map_;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDevToolsClientHostImpl* InspectableTabProxy::ClientHostForTabId(
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int32 id) {
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InspectableTabProxy::IdToClientHostMap::const_iterator it =
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      id_to_client_host_map_.find(id);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (it == id_to_client_host_map_.end()) {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return it->second;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDevToolsClientHost* InspectableTabProxy::NewClientHost(
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int32 id,
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DebuggerRemoteService* service) {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DevToolsClientHostImpl* client_host =
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new DevToolsClientHostImpl(id, service, &id_to_client_host_map_);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id_to_client_host_map_[id] = client_host;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return client_host;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InspectableTabProxy::OnRemoteDebuggerDetached() {
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  while (!id_to_client_host_map_.empty()) {
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    IdToClientHostMap::iterator it = id_to_client_host_map_.begin();
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    it->second->debugger_remote_service()->DetachFromTab(
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::IntToString(it->first), NULL);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
114