Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4524)

Unified Diff: chrome/browser/extensions/api/debugger/debugger_api.cc

Issue 10947037: DevTools: provide the debugger detach reason in chrome.debugger.onDetach extension API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reviewer comments addressed. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/api/debugger/debugger_api.h ('k') | chrome/common/extensions/api/debugger.json » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/api/debugger/debugger_api.cc
diff --git a/chrome/browser/extensions/api/debugger/debugger_api.cc b/chrome/browser/extensions/api/debugger/debugger_api.cc
index e2330f84f498724989aa98994c00fb88ed2e5c79..7ef6aad7630511ba58189ecc93b098ffbb7e14b5 100644
--- a/chrome/browser/extensions/api/debugger/debugger_api.cc
+++ b/chrome/browser/extensions/api/debugger/debugger_api.cc
@@ -55,13 +55,20 @@ namespace OnDetach = extensions::api::debugger::OnDetach;
namespace OnEvent = extensions::api::debugger::OnEvent;
namespace SendCommand = extensions::api::debugger::SendCommand;
+class ExtensionDevToolsClientHost;
+
class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate {
public:
ExtensionDevToolsInfoBarDelegate(
InfoBarTabHelper* infobar_helper,
- const std::string& client_name);
+ const std::string& client_name,
+ ExtensionDevToolsClientHost* client_host);
virtual ~ExtensionDevToolsInfoBarDelegate();
+ // Notifies infobar delegate that associated DevToolsClientHost will be
+ // destroyed.
+ void DiscardClientHost();
+
private:
// ConfirmInfoBarDelegate:
virtual bool ShouldExpire(
@@ -69,8 +76,11 @@ class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate {
virtual int GetButtons() const OVERRIDE;
virtual Type GetInfoBarType() const OVERRIDE;
virtual string16 GetMessageText() const OVERRIDE;
+ virtual void InfoBarDismissed() OVERRIDE;
+ virtual bool Cancel() OVERRIDE;
std::string client_name_;
+ ExtensionDevToolsClientHost* client_host_;
DISALLOW_COPY_AND_ASSIGN(ExtensionDevToolsInfoBarDelegate);
};
@@ -91,6 +101,10 @@ class ExtensionDevToolsClientHost : public DevToolsClientHost,
const std::string& method,
SendCommand::Params::CommandParams* command_params);
+ // Mark methods below determine the connection termination reason.
+ void MarkAsReplaced();
+ void MarkAsDismissed();
+
// DevToolsClientHost interface
virtual void InspectedContentsClosing() OVERRIDE;
virtual void DispatchOnInspectorFrontend(const std::string& message) OVERRIDE;
@@ -114,6 +128,7 @@ class ExtensionDevToolsClientHost : public DevToolsClientHost,
PendingRequests;
PendingRequests pending_requests_;
ExtensionDevToolsInfoBarDelegate* infobar_delegate_;
+ OnDetach::Reason detach_reason_;
DISALLOW_COPY_AND_ASSIGN(ExtensionDevToolsClientHost);
};
@@ -137,6 +152,16 @@ class AttachedClientHosts {
client_hosts_.erase(client_host);
}
+ ExtensionDevToolsClientHost* AsExtensionDevToolsClientHost(
+ DevToolsClientHost* client_host) {
+ for (std::set<DevToolsClientHost*>::iterator it = client_hosts_.begin();
+ it != client_hosts_.end(); ++it) {
+ if (client_host == *it)
+ return static_cast<ExtensionDevToolsClientHost*>(*it);
+ }
+ return NULL;
+ }
+
ExtensionDevToolsClientHost* Lookup(WebContents* contents) {
for (std::set<DevToolsClientHost*>::iterator it = client_hosts_.begin();
it != client_hosts_.end(); ++it) {
@@ -167,7 +192,8 @@ ExtensionDevToolsClientHost::ExtensionDevToolsClientHost(
extension_id_(extension_id),
tab_id_(tab_id),
last_request_id_(0),
- infobar_delegate_(NULL) {
+ infobar_delegate_(NULL),
+ detach_reason_(OnDetach::REASON_TARGET_CLOSED) {
AttachedClientHosts::GetInstance()->Add(this);
// Detach from debugger when extension unloads.
@@ -183,8 +209,9 @@ ExtensionDevToolsClientHost::ExtensionDevToolsClientHost(
InfoBarTabHelper* infobar_helper =
TabContents::FromWebContents(web_contents_)->infobar_tab_helper();
- infobar_delegate_ =
- new ExtensionDevToolsInfoBarDelegate(infobar_helper, extension_name);
+ infobar_delegate_ = new ExtensionDevToolsInfoBarDelegate(infobar_helper,
+ extension_name,
+ this);
if (infobar_helper->AddInfoBar(infobar_delegate_)) {
registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
content::Source<InfoBarTabHelper>(infobar_helper));
@@ -199,6 +226,7 @@ ExtensionDevToolsClientHost::~ExtensionDevToolsClientHost() {
registrar_.RemoveAll();
if (infobar_delegate_) {
+ infobar_delegate_->DiscardClientHost();
TabContents* tab_contents = TabContents::FromWebContents(web_contents_);
InfoBarTabHelper* helper = tab_contents->infobar_tab_helper();
if (helper)
@@ -247,14 +275,22 @@ void ExtensionDevToolsClientHost::SendMessageToBackend(
DevToolsManager::GetInstance()->DispatchOnInspectorBackend(this, json_args);
}
+void ExtensionDevToolsClientHost::MarkAsReplaced() {
+ detach_reason_ = OnDetach::REASON_REPLACED_WITH_DEVTOOLS;
+}
+
+void ExtensionDevToolsClientHost::MarkAsDismissed() {
+ detach_reason_ = OnDetach::REASON_CANCELED_BY_USER;
+}
+
void ExtensionDevToolsClientHost::SendDetachedEvent() {
Profile* profile =
Profile::FromBrowserContext(web_contents_->GetBrowserContext());
if (profile != NULL && profile->GetExtensionEventRouter()) {
Debuggee debuggee;
debuggee.tab_id = tab_id_;
-
- scoped_ptr<base::ListValue> args(OnDetach::Create(debuggee));
+ scoped_ptr<base::ListValue> args(OnDetach::Create(debuggee,
+ detach_reason_));
profile->GetExtensionEventRouter()->DispatchEventToExtension(
extension_id_, keys::kOnDetach, args.Pass(), profile, GURL());
}
@@ -322,14 +358,20 @@ void ExtensionDevToolsClientHost::DispatchOnInspectorFrontend(
ExtensionDevToolsInfoBarDelegate::ExtensionDevToolsInfoBarDelegate(
InfoBarTabHelper* infobar_helper,
- const std::string& client_name)
+ const std::string& client_name,
+ ExtensionDevToolsClientHost* client_host)
: ConfirmInfoBarDelegate(infobar_helper),
- client_name_(client_name) {
+ client_name_(client_name),
+ client_host_(client_host) {
}
ExtensionDevToolsInfoBarDelegate::~ExtensionDevToolsInfoBarDelegate() {
}
+void ExtensionDevToolsInfoBarDelegate::DiscardClientHost() {
+ client_host_ = NULL;
+}
+
bool ExtensionDevToolsInfoBarDelegate::ShouldExpire(
const content::LoadCommittedDetails& details) const {
return false;
@@ -348,6 +390,17 @@ string16 ExtensionDevToolsInfoBarDelegate::GetMessageText() const {
UTF8ToUTF16(client_name_));
}
+void ExtensionDevToolsInfoBarDelegate::InfoBarDismissed() {
+ if (client_host_)
+ client_host_->MarkAsDismissed();
+}
+
+bool ExtensionDevToolsInfoBarDelegate::Cancel() {
+ if (client_host_)
+ client_host_->MarkAsDismissed();
+ return true;
+}
+
DebuggerFunction::DebuggerFunction()
: contents_(0),
tab_id_(0),
@@ -488,3 +541,12 @@ void SendCommandDebuggerFunction::SendResponseBody(
results_ = SendCommand::Results::Create(result);
SendResponse(true);
}
+
+// static
+void DebuggerApi::MarkDevToolsClientHostAsReplaced(
+ DevToolsClientHost* client_host) {
+ ExtensionDevToolsClientHost* host = AttachedClientHosts::GetInstance()->
+ AsExtensionDevToolsClientHost(client_host);
+ if (host)
+ host->MarkAsReplaced();
+}
« no previous file with comments | « chrome/browser/extensions/api/debugger/debugger_api.h ('k') | chrome/common/extensions/api/debugger.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698