extension_devtools_bridge.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
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/extensions/extension_devtools_bridge.h" 6 7#include "base/message_loop.h" 8#include "base/string_util.h" 9#include "chrome/browser/debugger/devtools_manager.h" 10#include "chrome/browser/extensions/extension_devtools_events.h" 11#include "chrome/browser/extensions/extension_devtools_manager.h" 12#include "chrome/browser/extensions/extension_tabs_module.h" 13#include "chrome/browser/profile.h" 14#include "chrome/browser/tab_contents/tab_contents.h" 15#include "chrome/common/devtools_messages.h" 16 17ExtensionDevToolsBridge::ExtensionDevToolsBridge(int tab_id, 18 Profile* profile) 19 : tab_id_(tab_id), 20 profile_(profile), 21 on_page_event_name_( 22 ExtensionDevToolsEvents::OnPageEventNameForTab(tab_id)), 23 on_tab_close_event_name_( 24 ExtensionDevToolsEvents::OnTabCloseEventNameForTab(tab_id)) { 25 extension_devtools_manager_ = profile_->GetExtensionDevToolsManager(); 26 DCHECK(extension_devtools_manager_.get()); 27} 28 29ExtensionDevToolsBridge::~ExtensionDevToolsBridge() { 30} 31 32bool ExtensionDevToolsBridge::RegisterAsDevToolsClientHost() { 33 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 34 35 Browser* browser; 36 TabStripModel* tab_strip; 37 TabContents* contents; 38 int tab_index; 39 if (ExtensionTabUtil::GetTabById(tab_id_, profile_, true, 40 &browser, &tab_strip, 41 &contents, &tab_index)) { 42 DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); 43 devtools_manager->RegisterDevToolsClientHostFor( 44 contents->render_view_host(), this); 45 devtools_manager->ForwardToDevToolsAgent( 46 this, 47 DevToolsAgentMsg_SetApuAgentEnabled(true)); 48 return true; 49 } 50 return false; 51} 52 53void ExtensionDevToolsBridge::UnregisterAsDevToolsClientHost() { 54 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 55 56 NotifyCloseListener(); 57} 58 59// If the tab we are looking at is going away then we fire a closing event at 60// the extension. 61void ExtensionDevToolsBridge::InspectedTabClosing() { 62 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 63 64 // TODO(knorton): Remove this event in favor of the standard tabs.onRemoved 65 // event in extensions. 66 std::string json("[{}]"); 67 profile_->GetExtensionMessageService()->DispatchEventToRenderers( 68 on_tab_close_event_name_, json, profile_->IsOffTheRecord(), GURL()); 69 70 // This may result in this object being destroyed. 71 extension_devtools_manager_->BridgeClosingForTab(tab_id_); 72} 73 74void ExtensionDevToolsBridge::SendMessageToClient(const IPC::Message& msg) { 75 IPC_BEGIN_MESSAGE_MAP(ExtensionDevToolsBridge, msg) 76 IPC_MESSAGE_HANDLER(DevToolsClientMsg_RpcMessage, OnRpcMessage); 77 IPC_MESSAGE_UNHANDLED_ERROR() 78 IPC_END_MESSAGE_MAP() 79} 80 81static const char kApuAgentClassName[] = "ApuAgentDelegate"; 82static const char kApuPageEventMessageName[] = "dispatchToApu"; 83 84void ExtensionDevToolsBridge::OnRpcMessage(const DevToolsMessageData& data) { 85 DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 86 87 if (data.class_name == kApuAgentClassName 88 && data.method_name == kApuPageEventMessageName) { 89 std::string json = StringPrintf("[%s]", data.arguments[0].c_str()); 90 profile_->GetExtensionMessageService()->DispatchEventToRenderers( 91 on_page_event_name_, json, profile_->IsOffTheRecord(), GURL()); 92 } 93} 94 95