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