| Index: chrome/browser/extensions/extension_devtools_bridge.cc
|
| diff --git a/chrome/browser/extensions/extension_devtools_bridge.cc b/chrome/browser/extensions/extension_devtools_bridge.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2ac456fa8bc889d925230e1f95c73a446b2abd1e
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/extension_devtools_bridge.cc
|
| @@ -0,0 +1,104 @@
|
| +// Copyright (c) 2009 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/extensions/extension_devtools_bridge.h"
|
| +
|
| +#include "base/message_loop.h"
|
| +#include "base/string_util.h"
|
| +#include "chrome/browser/debugger/devtools_manager.h"
|
| +#include "chrome/browser/extensions/extension_devtools_events.h"
|
| +#include "chrome/browser/extensions/extension_devtools_manager.h"
|
| +#include "chrome/browser/extensions/extension_tabs_module.h"
|
| +#include "chrome/browser/profile.h"
|
| +#include "chrome/browser/tab_contents/tab_contents.h"
|
| +#include "chrome/common/devtools_messages.h"
|
| +
|
| +ExtensionDevToolsBridge::ExtensionDevToolsBridge(int tab_id,
|
| + Profile* profile)
|
| + : tab_id_(tab_id),
|
| + inspected_rvh_(NULL),
|
| + profile_(profile),
|
| + on_page_event_name_(
|
| + ExtensionDevToolsEvents::OnPageEventNameForTab(tab_id)),
|
| + on_tab_url_change_event_name_(
|
| + ExtensionDevToolsEvents::OnTabUrlChangeEventNameForTab(tab_id)),
|
| + on_tab_close_event_name_(
|
| + ExtensionDevToolsEvents::OnTabCloseEventNameForTab(tab_id)) {
|
| + extension_devtools_manager_ = profile_->GetExtensionDevToolsManager();
|
| + DCHECK(extension_devtools_manager_.get());
|
| +}
|
| +
|
| +ExtensionDevToolsBridge::~ExtensionDevToolsBridge() {
|
| +}
|
| +
|
| +bool ExtensionDevToolsBridge::RegisterAsDevToolsClientHost() {
|
| + DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
|
| +
|
| + Browser* browser;
|
| + TabStripModel* tab_strip;
|
| + TabContents* contents;
|
| + int tab_index;
|
| + if (ExtensionTabUtil::GetTabById(tab_id_, profile_, &browser, &tab_strip,
|
| + &contents, &tab_index)) {
|
| + inspected_rvh_ = contents->render_view_host();
|
| + DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor(
|
| + inspected_rvh_, this);
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +void ExtensionDevToolsBridge::UnregisterAsDevToolsClientHost() {
|
| + DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
|
| +
|
| + if (inspected_rvh_) {
|
| + DevToolsManager::GetInstance()->UnregisterDevToolsClientHostFor(
|
| + inspected_rvh_);
|
| + inspected_rvh_ = NULL;
|
| + }
|
| +}
|
| +
|
| +// If the tab we are looking at is going away then we fire a closing event at
|
| +// the extension.
|
| +void ExtensionDevToolsBridge::InspectedTabClosing() {
|
| + DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
|
| +
|
| + std::string json("[{}]");
|
| + profile_->GetExtensionMessageService()->
|
| + DispatchEventToRenderers(on_tab_close_event_name_, json);
|
| +
|
| + // This may result in this object being destroyed.
|
| + extension_devtools_manager_->BridgeClosingForTab(tab_id_);
|
| +}
|
| +
|
| +void ExtensionDevToolsBridge::SendMessageToClient(const IPC::Message& msg) {
|
| + IPC_BEGIN_MESSAGE_MAP(ExtensionDevToolsBridge, msg)
|
| + IPC_MESSAGE_HANDLER(DevToolsClientMsg_RpcMessage, OnRpcMessage);
|
| + IPC_MESSAGE_UNHANDLED_ERROR()
|
| + IPC_END_MESSAGE_MAP()
|
| +}
|
| +
|
| +static const char kTimelineAgentClassName[] = "TimelineAgentClass";
|
| +static const char kPageEventMessageName[] = "PageEventMessage";
|
| +static const char kTabUrlChangeEventMessageName[] = "TabUrlChangeEventMessage";
|
| +
|
| +void ExtensionDevToolsBridge::OnRpcMessage(const std::string& class_name,
|
| + const std::string& message_name,
|
| + const std::string& msg) {
|
| + DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
|
| + // TODO(jamesr): Update the filtering and message creation logic once
|
| + // the TimelineAgent lands in WebKit.
|
| + if (class_name == kTimelineAgentClassName) {
|
| + if (message_name == kPageEventMessageName) {
|
| + std::string json = StringPrintf("[{\"record\": \"%s\"}]", msg.c_str());
|
| + profile_->GetExtensionMessageService()->
|
| + DispatchEventToRenderers(on_page_event_name_, json);
|
| + } else if (message_name == kTabUrlChangeEventMessageName) {
|
| + std::string json = StringPrintf("[{\"record\": \"%s\"}]", msg.c_str());
|
| + profile_->GetExtensionMessageService()->
|
| + DispatchEventToRenderers(on_tab_url_change_event_name_, json);
|
| + }
|
| + }
|
| +}
|
| +
|
|
|