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