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