Chromium Code Reviews| 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 ebbc10207223aa9f07f5fed2ca7ee92480921f65..6576c0a31050d95d21fc9d71aecc111444d84f64 100644 |
| --- a/chrome/browser/extensions/api/debugger/debugger_api.cc |
| +++ b/chrome/browser/extensions/api/debugger/debugger_api.cc |
| @@ -47,8 +47,11 @@ |
| #include "extensions/browser/extension_registry.h" |
| #include "extensions/browser/extension_registry_observer.h" |
| #include "extensions/browser/extension_system.h" |
| +#include "extensions/common/constants.h" |
| #include "extensions/common/error_utils.h" |
| #include "extensions/common/extension.h" |
| +#include "extensions/common/permissions/permissions_data.h" |
| +#include "extensions/common/switches.h" |
| #include "grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| @@ -300,6 +303,15 @@ ExtensionDevToolsClientHost* AttachedClientHosts::Lookup( |
| return NULL; |
| } |
| +// Returns true if the given |extension| is allowed to run the debugger on |
| +// other extensions' pages. |
| +bool CanRunOnOtherExtensionPages(const Extension* extension) { |
|
meacer
2014/06/24 18:15:54
nit: CanDebugExtensionPages sounds slightly more d
not at google - send to devlin
2014/06/24 18:35:08
+1
though I'm still worried that a blacklist is j
Devlin
2014/06/24 18:45:40
Done.
Devlin
2014/06/24 18:49:08
I'm not entirely sure I follow - won't it _still_
not at google - send to devlin
2014/06/24 19:07:51
IsRestricted would be checked from CanAccessPage,
Devlin
2014/06/24 19:54:55
Done...
|
| + return extension->permissions_data()->CanExecuteScriptEverywhere( |
|
meacer
2014/06/24 18:15:54
Static method, you can use PermissionsData::CanExe
Devlin
2014/06/24 18:45:40
Whoops! Done.
|
| + extension) || |
| + base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kExtensionsOnChromeURLs); |
|
meacer
2014/06/24 18:15:54
Is kExtensionsOnChromeURLs the right switch? Looks
not at google - send to devlin
2014/06/24 18:35:08
kSilentDebuggerExtensionAPI is subtly different, a
Devlin
2014/06/24 18:45:40
I'm not sure - the chrome urls switch was taken fr
|
| +} |
| + |
| } // namespace |
| @@ -503,6 +515,7 @@ void DebuggerFunction::FormatErrorMessage(const std::string& format) { |
| } |
| bool DebuggerFunction::InitAgentHost() { |
| + const Extension* extension = GetExtension(); |
| if (debuggee_.tab_id) { |
| WebContents* web_contents = NULL; |
| bool result = ExtensionTabUtil::GetTabById(*debuggee_.tab_id, |
| @@ -513,15 +526,26 @@ bool DebuggerFunction::InitAgentHost() { |
| &web_contents, |
| NULL); |
| if (result && web_contents) { |
| - if (content::HasWebUIScheme(web_contents->GetURL())) { |
| + GURL url = web_contents->GetVisibleURL(); |
|
meacer
2014/06/24 18:54:27
Better to use GetLastCommittedURL instead.
Devlin
2014/06/24 19:54:55
Agreed. And tried that first. Unfortunately, thi
|
| + if (content::HasWebUIScheme(url)) { |
| error_ = ErrorUtils::FormatErrorMessage( |
| keys::kAttachToWebUIError, |
| web_contents->GetURL().scheme()); |
| return false; |
| } |
| + if (url.SchemeIs(kExtensionScheme) && url.host() != extension->id() && |
| + !CanRunOnOtherExtensionPages(extension)) { |
| + error_ = keys::kAttachToOtherExtensionError; |
| + return false; |
| + } |
| agent_host_ = DevToolsAgentHost::GetOrCreateFor(web_contents); |
| } |
| } else if (debuggee_.extension_id) { |
| + if (*debuggee_.extension_id != extension->id() && |
| + !CanRunOnOtherExtensionPages(extension)) { |
| + error_ = keys::kAttachToOtherExtensionError; |
| + return false; |
| + } |
| ExtensionHost* extension_host = |
| ExtensionSystem::Get(GetProfile()) |
| ->process_manager() |
| @@ -588,25 +612,26 @@ bool DebuggerAttachFunction::RunAsync() { |
| return false; |
| } |
| + const Extension* extension = GetExtension(); |
| infobars::InfoBar* infobar = NULL; |
| if (!CommandLine::ForCurrentProcess()-> |
| - HasSwitch(switches::kSilentDebuggerExtensionAPI)) { |
| + HasSwitch(::switches::kSilentDebuggerExtensionAPI)) { |
|
meacer
2014/06/24 18:54:27
Is this flag going to be redundant with this chang
Devlin
2014/06/24 19:54:55
Hmm... good question.
The thing is, we don't even
|
| // Do not attach to the target if for any reason the infobar cannot be shown |
| // for this WebContents instance. |
| infobar = ExtensionDevToolsInfoBarDelegate::Create( |
| - agent_host_->GetRenderViewHost(), GetExtension()->name()); |
| + agent_host_->GetRenderViewHost(), extension->name()); |
| if (!infobar) { |
| error_ = ErrorUtils::FormatErrorMessage( |
| keys::kSilentDebuggingRequired, |
| - switches::kSilentDebuggerExtensionAPI); |
| + ::switches::kSilentDebuggerExtensionAPI); |
| return false; |
| } |
| } |
| new ExtensionDevToolsClientHost(GetProfile(), |
| agent_host_.get(), |
| - GetExtension()->id(), |
| - GetExtension()->name(), |
| + extension->id(), |
| + extension->name(), |
| debuggee_, |
| infobar); |
| SendResponse(true); |