| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/debugger/inspectable_tab_proxy.h" |
| |
| #include "base/string_number_conversions.h" |
| #include "base/string_util.h" |
| #include "chrome/browser/debugger/debugger_remote_service.h" |
| #include "chrome/browser/debugger/devtools_client_host.h" |
| #include "chrome/browser/sessions/session_id.h" |
| #include "chrome/browser/tabs/tab_strip_model.h" |
| #include "chrome/browser/ui/browser_list.h" |
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| #include "chrome/common/devtools_messages.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| |
| DevToolsClientHostImpl::DevToolsClientHostImpl( |
| int32 id, |
| DebuggerRemoteService* service, |
| InspectableTabProxy::IdToClientHostMap* map) |
| : id_(id), |
| service_(service), |
| map_(map) {} |
| |
| DevToolsClientHostImpl::~DevToolsClientHostImpl() { |
| map_->erase(this->id_); |
| } |
| |
| // The debugged tab has closed. |
| void DevToolsClientHostImpl::InspectedTabClosing() { |
| TabClosed(); |
| delete this; |
| } |
| |
| // The remote debugger has detached. |
| void DevToolsClientHostImpl::Close() { |
| NotifyCloseListener(); |
| delete this; |
| } |
| |
| void DevToolsClientHostImpl::SendMessageToClient( |
| const IPC::Message& msg) { |
| // TODO(prybin): Restore FrameNavigate. |
| IPC_BEGIN_MESSAGE_MAP(DevToolsClientHostImpl, msg) |
| IPC_MESSAGE_HANDLER(DevToolsClientMsg_DebuggerOutput, OnDebuggerOutput); |
| IPC_MESSAGE_UNHANDLED_ERROR() |
| IPC_END_MESSAGE_MAP() |
| } |
| |
| void DevToolsClientHostImpl::TabReplaced(TabContentsWrapper* new_tab) { |
| map_->erase(id_); |
| id_ = new_tab->controller().session_id().id(); |
| (*map_)[id_] = this; |
| } |
| |
| void DevToolsClientHostImpl::OnDebuggerOutput(const std::string& data) { |
| service_->DebuggerOutput(id_, data); |
| } |
| |
| void DevToolsClientHostImpl::FrameNavigating(const std::string& url) { |
| service_->FrameNavigate(id_, url); |
| } |
| |
| void DevToolsClientHostImpl::TabClosed() { |
| service_->TabClosed(id_); |
| } |
| |
| InspectableTabProxy::InspectableTabProxy() {} |
| |
| InspectableTabProxy::~InspectableTabProxy() {} |
| |
| const InspectableTabProxy::ControllersMap& |
| InspectableTabProxy::controllers_map() { |
| controllers_map_.clear(); |
| for (BrowserList::const_iterator it = BrowserList::begin(), |
| end = BrowserList::end(); it != end; ++it) { |
| TabStripModel* model = (*it)->tabstrip_model(); |
| for (int i = 0, size = model->count(); i < size; ++i) { |
| NavigationController& controller = |
| model->GetTabContentsAt(i)->controller(); |
| controllers_map_[controller.session_id().id()] = &controller; |
| } |
| } |
| return controllers_map_; |
| } |
| |
| DevToolsClientHostImpl* InspectableTabProxy::ClientHostForTabId( |
| int32 id) { |
| InspectableTabProxy::IdToClientHostMap::const_iterator it = |
| id_to_client_host_map_.find(id); |
| if (it == id_to_client_host_map_.end()) { |
| return NULL; |
| } |
| return it->second; |
| } |
| |
| DevToolsClientHost* InspectableTabProxy::NewClientHost( |
| int32 id, |
| DebuggerRemoteService* service) { |
| DevToolsClientHostImpl* client_host = |
| new DevToolsClientHostImpl(id, service, &id_to_client_host_map_); |
| id_to_client_host_map_[id] = client_host; |
| return client_host; |
| } |
| |
| void InspectableTabProxy::OnRemoteDebuggerDetached() { |
| while (!id_to_client_host_map_.empty()) { |
| IdToClientHostMap::iterator it = id_to_client_host_map_.begin(); |
| it->second->debugger_remote_service()->DetachFromTab( |
| base::IntToString(it->first), NULL); |
| } |
| } |