Index: chrome/browser/extensions/extension_debugger_api.cc |
diff --git a/chrome/browser/extensions/extension_debugger_api.cc b/chrome/browser/extensions/extension_debugger_api.cc |
deleted file mode 100644 |
index 6e59f22468537a0c1e9de7be9bb4d855dd174f7b..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/extension_debugger_api.cc |
+++ /dev/null |
@@ -1,492 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-// Implements the Chrome Extensions Debugger API. |
- |
-#include "chrome/browser/extensions/extension_debugger_api.h" |
- |
-#include <map> |
-#include <set> |
- |
-#include "base/json/json_reader.h" |
-#include "base/json/json_writer.h" |
-#include "base/memory/singleton.h" |
-#include "base/string_number_conversions.h" |
-#include "base/utf_string_conversions.h" |
-#include "base/values.h" |
-#include "chrome/browser/extensions/extension_debugger_api_constants.h" |
-#include "chrome/browser/extensions/extension_event_router.h" |
-#include "chrome/browser/extensions/extension_tab_util.h" |
-#include "chrome/browser/infobars/infobar.h" |
-#include "chrome/browser/infobars/infobar_tab_helper.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/tab_contents/confirm_infobar_delegate.h" |
-#include "chrome/browser/ui/tab_contents/tab_contents.h" |
-#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "chrome/common/extensions/extension.h" |
-#include "chrome/common/extensions/extension_error_utils.h" |
-#include "content/public/browser/devtools_agent_host_registry.h" |
-#include "content/public/browser/devtools_client_host.h" |
-#include "content/public/browser/devtools_manager.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/common/content_client.h" |
-#include "grit/generated_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "webkit/glue/webkit_glue.h" |
- |
-using content::DevToolsAgentHost; |
-using content::DevToolsAgentHostRegistry; |
-using content::DevToolsClientHost; |
-using content::DevToolsManager; |
-using content::WebContents; |
- |
-namespace keys = extension_debugger_api_constants; |
- |
- |
-class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate { |
- public: |
- ExtensionDevToolsInfoBarDelegate( |
- InfoBarTabHelper* infobar_helper, |
- const std::string& client_name); |
- virtual ~ExtensionDevToolsInfoBarDelegate(); |
- |
- private: |
- // ConfirmInfoBarDelegate: |
- virtual bool ShouldExpire( |
- const content::LoadCommittedDetails& details) const OVERRIDE; |
- virtual int GetButtons() const OVERRIDE; |
- virtual Type GetInfoBarType() const OVERRIDE; |
- virtual string16 GetMessageText() const OVERRIDE; |
- |
- std::string client_name_; |
- DISALLOW_COPY_AND_ASSIGN(ExtensionDevToolsInfoBarDelegate); |
-}; |
- |
-class ExtensionDevToolsClientHost : public DevToolsClientHost, |
- public content::NotificationObserver { |
- public: |
- ExtensionDevToolsClientHost(WebContents* web_contents, |
- const std::string& extension_id, |
- const std::string& extension_name, |
- int tab_id); |
- |
- ~ExtensionDevToolsClientHost(); |
- |
- bool MatchesContentsAndExtensionId(WebContents* web_contents, |
- const std::string& extension_id); |
- void Close(); |
- void SendMessageToBackend(SendCommandDebuggerFunction* function, |
- const std::string& method, |
- Value* params); |
- |
- // DevToolsClientHost interface |
- virtual void InspectedContentsClosing() OVERRIDE; |
- virtual void DispatchOnInspectorFrontend(const std::string& message) OVERRIDE; |
- virtual void ContentsReplaced(WebContents* web_contents) OVERRIDE; |
- virtual void FrameNavigating(const std::string& url) OVERRIDE {} |
- |
- private: |
- void SendDetachedEvent(); |
- |
- // content::NotificationObserver implementation. |
- virtual void Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details); |
- |
- WebContents* web_contents_; |
- std::string extension_id_; |
- int tab_id_; |
- content::NotificationRegistrar registrar_; |
- int last_request_id_; |
- typedef std::map<int, scoped_refptr<SendCommandDebuggerFunction> > |
- PendingRequests; |
- PendingRequests pending_requests_; |
- ExtensionDevToolsInfoBarDelegate* infobar_delegate_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ExtensionDevToolsClientHost); |
-}; |
- |
-namespace { |
- |
-static Value* CreateDebuggeeId(int tab_id) { |
- DictionaryValue* debuggeeId = new DictionaryValue(); |
- debuggeeId->SetInteger(keys::kTabIdKey, tab_id); |
- return debuggeeId; |
-} |
- |
-class AttachedClientHosts { |
- public: |
- AttachedClientHosts() {} |
- |
- // Returns the singleton instance of this class |
- static AttachedClientHosts* GetInstance() { |
- return Singleton<AttachedClientHosts>::get(); |
- } |
- |
- void Add(ExtensionDevToolsClientHost* client_host) { |
- client_hosts_.insert(client_host); |
- } |
- |
- void Remove(ExtensionDevToolsClientHost* client_host) { |
- client_hosts_.erase(client_host); |
- } |
- |
- ExtensionDevToolsClientHost* Lookup(WebContents* contents) { |
- for (std::set<DevToolsClientHost*>::iterator it = client_hosts_.begin(); |
- it != client_hosts_.end(); ++it) { |
- DevToolsAgentHost* agent_host = |
- DevToolsManager::GetInstance()->GetDevToolsAgentHostFor(*it); |
- if (!agent_host) |
- continue; |
- content::RenderViewHost* rvh = |
- DevToolsAgentHostRegistry::GetRenderViewHost(agent_host); |
- if (rvh && WebContents::FromRenderViewHost(rvh) == contents) |
- return static_cast<ExtensionDevToolsClientHost*>(*it); |
- } |
- return NULL; |
- } |
- |
- private: |
- std::set<DevToolsClientHost*> client_hosts_; |
-}; |
- |
-} // namespace |
- |
-ExtensionDevToolsClientHost::ExtensionDevToolsClientHost( |
- WebContents* web_contents, |
- const std::string& extension_id, |
- const std::string& extension_name, |
- int tab_id) |
- : web_contents_(web_contents), |
- extension_id_(extension_id), |
- tab_id_(tab_id), |
- last_request_id_(0), |
- infobar_delegate_(NULL) { |
- AttachedClientHosts::GetInstance()->Add(this); |
- |
- // Detach from debugger when extension unloads. |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
- content::Source<Profile>(profile)); |
- |
- // Attach to debugger and tell it we are ready. |
- DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost( |
- web_contents_->GetRenderViewHost()); |
- DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor(agent, this); |
- |
- InfoBarTabHelper* infobar_helper = |
- TabContents::FromWebContents(web_contents_)->infobar_tab_helper(); |
- infobar_delegate_ = |
- new ExtensionDevToolsInfoBarDelegate(infobar_helper, extension_name); |
- if (infobar_helper->AddInfoBar(infobar_delegate_)) { |
- registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
- content::Source<InfoBarTabHelper>(infobar_helper)); |
- } else { |
- infobar_delegate_ = NULL; |
- } |
-} |
- |
-ExtensionDevToolsClientHost::~ExtensionDevToolsClientHost() { |
- // Ensure calling RemoveInfoBar() below won't result in Observe() trying to |
- // Close() us. |
- registrar_.RemoveAll(); |
- |
- if (infobar_delegate_) { |
- TabContents* tab_contents = TabContents::FromWebContents(web_contents_); |
- InfoBarTabHelper* helper = tab_contents->infobar_tab_helper(); |
- if (helper) |
- helper->RemoveInfoBar(infobar_delegate_); |
- } |
- AttachedClientHosts::GetInstance()->Remove(this); |
-} |
- |
-bool ExtensionDevToolsClientHost::MatchesContentsAndExtensionId( |
- WebContents* web_contents, |
- const std::string& extension_id) { |
- return web_contents == web_contents_ && extension_id_ == extension_id; |
-} |
- |
-// DevToolsClientHost interface |
-void ExtensionDevToolsClientHost::InspectedContentsClosing() { |
- SendDetachedEvent(); |
- delete this; |
-} |
- |
-void ExtensionDevToolsClientHost::ContentsReplaced(WebContents* web_contents) { |
- web_contents_ = web_contents; |
-} |
- |
-void ExtensionDevToolsClientHost::Close() { |
- DevToolsManager::GetInstance()->ClientHostClosing(this); |
- delete this; |
-} |
- |
-void ExtensionDevToolsClientHost::SendMessageToBackend( |
- SendCommandDebuggerFunction* function, |
- const std::string& method, |
- Value* params) { |
- DictionaryValue protocol_request; |
- int request_id = ++last_request_id_; |
- pending_requests_[request_id] = function; |
- protocol_request.SetInteger("id", request_id); |
- protocol_request.SetString("method", method); |
- if (params) |
- protocol_request.Set("params", params->DeepCopy()); |
- |
- std::string json_args; |
- base::JSONWriter::Write(&protocol_request, &json_args); |
- DevToolsManager::GetInstance()->DispatchOnInspectorBackend(this, json_args); |
-} |
- |
-void ExtensionDevToolsClientHost::SendDetachedEvent() { |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
- if (profile != NULL && profile->GetExtensionEventRouter()) { |
- ListValue args; |
- args.Append(CreateDebuggeeId(tab_id_)); |
- |
- std::string json_args; |
- base::JSONWriter::Write(&args, &json_args); |
- |
- profile->GetExtensionEventRouter()->DispatchEventToExtension( |
- extension_id_, keys::kOnDetach, json_args, profile, GURL()); |
- } |
-} |
- |
-void ExtensionDevToolsClientHost::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) { |
- std::string id = |
- content::Details<extensions::UnloadedExtensionInfo>(details)-> |
- extension->id(); |
- if (id == extension_id_) |
- Close(); |
- } else { |
- DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type); |
- if (content::Details<InfoBarRemovedDetails>(details)->first == |
- infobar_delegate_) { |
- infobar_delegate_ = NULL; |
- SendDetachedEvent(); |
- Close(); |
- } |
- } |
-} |
- |
-void ExtensionDevToolsClientHost::DispatchOnInspectorFrontend( |
- const std::string& message) { |
- Profile* profile = |
- Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
- if (profile == NULL || !profile->GetExtensionEventRouter()) |
- return; |
- |
- scoped_ptr<Value> result(base::JSONReader::Read(message)); |
- if (!result->IsType(Value::TYPE_DICTIONARY)) |
- return; |
- DictionaryValue* dictionary = static_cast<DictionaryValue*>(result.get()); |
- |
- int id; |
- if (!dictionary->GetInteger("id", &id)) { |
- std::string method_name; |
- if (!dictionary->GetString("method", &method_name)) |
- return; |
- |
- ListValue args; |
- args.Append(CreateDebuggeeId(tab_id_)); |
- args.Append(Value::CreateStringValue(method_name)); |
- Value* params_value; |
- if (dictionary->Get("params", ¶ms_value)) |
- args.Append(params_value->DeepCopy()); |
- |
- std::string json_args; |
- base::JSONWriter::Write(&args, &json_args); |
- |
- profile->GetExtensionEventRouter()->DispatchEventToExtension( |
- extension_id_, keys::kOnEvent, json_args, profile, GURL()); |
- } else { |
- SendCommandDebuggerFunction* function = pending_requests_[id]; |
- if (!function) |
- return; |
- |
- function->SendResponseBody(dictionary); |
- pending_requests_.erase(id); |
- } |
-} |
- |
-ExtensionDevToolsInfoBarDelegate::ExtensionDevToolsInfoBarDelegate( |
- InfoBarTabHelper* infobar_helper, |
- const std::string& client_name) |
- : ConfirmInfoBarDelegate(infobar_helper), |
- client_name_(client_name) { |
-} |
- |
-ExtensionDevToolsInfoBarDelegate::~ExtensionDevToolsInfoBarDelegate() { |
-} |
- |
-bool ExtensionDevToolsInfoBarDelegate::ShouldExpire( |
- const content::LoadCommittedDetails& details) const { |
- return false; |
-} |
- |
-int ExtensionDevToolsInfoBarDelegate::GetButtons() const { |
- return BUTTON_CANCEL; |
-} |
- |
-InfoBarDelegate::Type ExtensionDevToolsInfoBarDelegate::GetInfoBarType() const { |
- return WARNING_TYPE; |
-} |
- |
-string16 ExtensionDevToolsInfoBarDelegate::GetMessageText() const { |
- return l10n_util::GetStringFUTF16(IDS_DEV_TOOLS_INFOBAR_LABEL, |
- UTF8ToUTF16(client_name_)); |
-} |
- |
-DebuggerFunction::DebuggerFunction() |
- : contents_(0), |
- tab_id_(0), |
- client_host_(0) { |
-} |
- |
-bool DebuggerFunction::InitTabContents() { |
- Value* debuggee; |
- EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &debuggee)); |
- |
- DictionaryValue* dict = static_cast<DictionaryValue*>(debuggee); |
- EXTENSION_FUNCTION_VALIDATE(dict->GetInteger(keys::kTabIdKey, &tab_id_)); |
- |
- // Find the TabContents that contains this tab id. |
- contents_ = NULL; |
- TabContents* tab_contents = NULL; |
- bool result = ExtensionTabUtil::GetTabById( |
- tab_id_, profile(), include_incognito(), NULL, NULL, &tab_contents, NULL); |
- if (!result || !tab_contents) { |
- error_ = ExtensionErrorUtils::FormatErrorMessage( |
- keys::kNoTabError, |
- base::IntToString(tab_id_)); |
- return false; |
- } |
- contents_ = tab_contents->web_contents(); |
- |
- if (content::GetContentClient()->HasWebUIScheme( |
- contents_->GetURL())) { |
- error_ = ExtensionErrorUtils::FormatErrorMessage( |
- keys::kAttachToWebUIError, |
- contents_->GetURL().scheme()); |
- return false; |
- } |
- |
- return true; |
-} |
- |
-bool DebuggerFunction::InitClientHost() { |
- if (!InitTabContents()) |
- return false; |
- |
- // Don't fetch rvh from the contents since it'll be wrong upon navigation. |
- client_host_ = AttachedClientHosts::GetInstance()->Lookup(contents_); |
- |
- if (!client_host_ || |
- !client_host_->MatchesContentsAndExtensionId(contents_, |
- GetExtension()->id())) { |
- error_ = ExtensionErrorUtils::FormatErrorMessage( |
- keys::kNotAttachedError, |
- base::IntToString(tab_id_)); |
- return false; |
- } |
- return true; |
-} |
- |
-AttachDebuggerFunction::AttachDebuggerFunction() {} |
- |
-AttachDebuggerFunction::~AttachDebuggerFunction() {} |
- |
-bool AttachDebuggerFunction::RunImpl() { |
- if (!InitTabContents()) |
- return false; |
- |
- std::string version; |
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &version)); |
- |
- if (!webkit_glue::IsInspectorProtocolVersionSupported(version)) { |
- error_ = ExtensionErrorUtils::FormatErrorMessage( |
- keys::kProtocolVersionNotSupportedError, |
- version); |
- return false; |
- } |
- |
- DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost( |
- contents_->GetRenderViewHost()); |
- DevToolsClientHost* client_host = DevToolsManager::GetInstance()-> |
- GetDevToolsClientHostFor(agent); |
- |
- if (client_host != NULL) { |
- error_ = ExtensionErrorUtils::FormatErrorMessage( |
- keys::kAlreadyAttachedError, |
- base::IntToString(tab_id_)); |
- return false; |
- } |
- |
- new ExtensionDevToolsClientHost(contents_, |
- GetExtension()->id(), |
- GetExtension()->name(), |
- tab_id_); |
- SendResponse(true); |
- return true; |
-} |
- |
-DetachDebuggerFunction::DetachDebuggerFunction() {} |
- |
-DetachDebuggerFunction::~DetachDebuggerFunction() {} |
- |
-bool DetachDebuggerFunction::RunImpl() { |
- if (!InitClientHost()) |
- return false; |
- |
- client_host_->Close(); |
- SendResponse(true); |
- return true; |
-} |
- |
-SendCommandDebuggerFunction::SendCommandDebuggerFunction() {} |
- |
-SendCommandDebuggerFunction::~SendCommandDebuggerFunction() {} |
- |
-bool SendCommandDebuggerFunction::RunImpl() { |
- |
- if (!InitClientHost()) |
- return false; |
- |
- std::string method; |
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &method)); |
- |
- Value *params; |
- if (!args_->Get(2, ¶ms)) |
- params = NULL; |
- |
- client_host_->SendMessageToBackend(this, method, params); |
- return true; |
-} |
- |
-void SendCommandDebuggerFunction::SendResponseBody( |
- DictionaryValue* dictionary) { |
- Value* error_body; |
- if (dictionary->Get("error", &error_body)) { |
- base::JSONWriter::Write(error_body, &error_); |
- SendResponse(false); |
- return; |
- } |
- |
- Value* result_body; |
- if (dictionary->Get("result", &result_body)) |
- result_.reset(result_body->DeepCopy()); |
- else |
- result_.reset(new DictionaryValue()); |
- SendResponse(true); |
-} |