Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Implements the Chrome Extensions Debugger API. | 5 // Implements the Chrome Extensions Debugger API. |
| 6 | 6 |
| 7 #include "chrome/browser/extensions/api/debugger/debugger_api.h" | 7 #include "chrome/browser/extensions/api/debugger/debugger_api.h" |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 #include "chrome/browser/extensions/extension_tab_util.h" | 27 #include "chrome/browser/extensions/extension_tab_util.h" |
| 28 #include "chrome/browser/infobars/infobar.h" | 28 #include "chrome/browser/infobars/infobar.h" |
| 29 #include "chrome/browser/profiles/profile.h" | 29 #include "chrome/browser/profiles/profile.h" |
| 30 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" | 30 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" |
| 31 #include "chrome/common/chrome_notification_types.h" | 31 #include "chrome/common/chrome_notification_types.h" |
| 32 #include "chrome/common/chrome_switches.h" | 32 #include "chrome/common/chrome_switches.h" |
| 33 #include "chrome/common/extensions/extension.h" | 33 #include "chrome/common/extensions/extension.h" |
| 34 #include "content/public/browser/devtools_agent_host.h" | 34 #include "content/public/browser/devtools_agent_host.h" |
| 35 #include "content/public/browser/devtools_client_host.h" | 35 #include "content/public/browser/devtools_client_host.h" |
| 36 #include "content/public/browser/devtools_manager.h" | 36 #include "content/public/browser/devtools_manager.h" |
| 37 #include "content/public/browser/devtools_target_list.h" | |
| 37 #include "content/public/browser/notification_service.h" | 38 #include "content/public/browser/notification_service.h" |
| 38 #include "content/public/browser/notification_source.h" | 39 #include "content/public/browser/notification_source.h" |
| 39 #include "content/public/browser/render_process_host.h" | 40 #include "content/public/browser/render_process_host.h" |
| 40 #include "content/public/browser/render_view_host.h" | 41 #include "content/public/browser/render_view_host.h" |
| 41 #include "content/public/browser/render_widget_host.h" | 42 #include "content/public/browser/render_widget_host.h" |
| 42 #include "content/public/browser/web_contents.h" | 43 #include "content/public/browser/web_contents.h" |
| 43 #include "content/public/common/content_client.h" | 44 #include "content/public/common/content_client.h" |
| 44 #include "content/public/common/url_constants.h" | 45 #include "content/public/common/url_constants.h" |
| 45 #include "extensions/common/error_utils.h" | 46 #include "extensions/common/error_utils.h" |
| 46 #include "grit/generated_resources.h" | 47 #include "grit/generated_resources.h" |
| 47 #include "ui/base/l10n/l10n_util.h" | 48 #include "ui/base/l10n/l10n_util.h" |
| 48 #include "webkit/glue/webkit_glue.h" | 49 #include "webkit/glue/webkit_glue.h" |
| 49 | 50 |
| 50 using content::DevToolsAgentHost; | 51 using content::DevToolsAgentHost; |
| 51 using content::DevToolsClientHost; | 52 using content::DevToolsClientHost; |
| 52 using content::DevToolsManager; | 53 using content::DevToolsManager; |
| 54 using content::DevToolsTargetList; | |
| 53 using content::RenderProcessHost; | 55 using content::RenderProcessHost; |
| 54 using content::RenderViewHost; | 56 using content::RenderViewHost; |
| 55 using content::RenderWidgetHost; | 57 using content::RenderWidgetHost; |
| 56 using content::WebContents; | 58 using content::WebContents; |
| 57 using extensions::ErrorUtils; | 59 using extensions::ErrorUtils; |
| 58 | 60 |
| 59 namespace keys = debugger_api_constants; | 61 namespace keys = debugger_api_constants; |
| 60 namespace Attach = extensions::api::debugger::Attach; | 62 namespace Attach = extensions::api::debugger::Attach; |
| 61 namespace Detach = extensions::api::debugger::Detach; | 63 namespace Detach = extensions::api::debugger::Detach; |
| 62 namespace OnDetach = extensions::api::debugger::OnDetach; | 64 namespace OnDetach = extensions::api::debugger::OnDetach; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 if (rvh && WebContents::FromRenderViewHost(rvh) == contents) | 178 if (rvh && WebContents::FromRenderViewHost(rvh) == contents) |
| 177 return static_cast<ExtensionDevToolsClientHost*>(*it); | 179 return static_cast<ExtensionDevToolsClientHost*>(*it); |
| 178 } | 180 } |
| 179 return NULL; | 181 return NULL; |
| 180 } | 182 } |
| 181 | 183 |
| 182 private: | 184 private: |
| 183 std::set<DevToolsClientHost*> client_hosts_; | 185 std::set<DevToolsClientHost*> client_hosts_; |
| 184 }; | 186 }; |
| 185 | 187 |
| 188 static extensions::ExtensionHost* GetExtensionBackgroundHost( | |
| 189 WebContents* web_contents) { | |
| 190 Profile* profile = | |
| 191 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | |
| 192 if (!profile) | |
| 193 return NULL; | |
| 194 | |
| 195 extensions::ExtensionHost* extension_host = | |
| 196 extensions::ExtensionSystem::Get(profile)->process_manager()-> | |
| 197 GetBackgroundHostForExtension(web_contents->GetURL().host()); | |
| 198 | |
| 199 if (extension_host && extension_host->host_contents() == web_contents) | |
| 200 return extension_host; | |
| 201 | |
| 202 return NULL; | |
| 203 } | |
| 204 | |
| 205 static base::DictionaryValue* SerializeTargetInfo(DevToolsAgentHost* agent) { | |
| 206 base::DictionaryValue* dictionary = new base::DictionaryValue; | |
| 207 | |
| 208 dictionary->SetString("id", | |
| 209 DevToolsTargetList::GetInstance()->GetIdentifier(agent)); | |
| 210 | |
| 211 WebContents* web_contents = | |
| 212 WebContents::FromRenderViewHost(agent->GetRenderViewHost()); | |
| 213 extensions::ExtensionHost* extension_host = | |
| 214 GetExtensionBackgroundHost(web_contents); | |
| 215 if (extension_host) { | |
| 216 dictionary->SetString("type", "extension"); | |
|
pfeldman
2013/03/01 08:49:30
So remote debugging won't know that it is extensio
Vladislav Kaznacheev
2013/03/01 12:58:35
When I was adding 'type' to the remote debugging p
| |
| 217 dictionary->SetString("title", extension_host->extension()->name()); | |
| 218 } else { | |
| 219 dictionary->SetString("type", "page"); | |
| 220 dictionary->SetString("title", agent->title()); | |
| 221 } | |
| 222 | |
| 223 dictionary->SetBoolean("attached", agent->attached()); | |
| 224 dictionary->SetString("url", agent->url().spec()); | |
| 225 dictionary->SetString("thumbnailUrl", agent->thumbnail_url().spec()); | |
| 226 dictionary->SetString("faviconUrl", agent->favicon_url().spec()); | |
| 227 | |
| 228 return dictionary; | |
| 229 } | |
| 230 | |
| 186 } // namespace | 231 } // namespace |
| 187 | 232 |
| 188 static void CopyDebuggee(Debuggee & dst, const Debuggee& src) { | 233 static void CopyDebuggee(Debuggee & dst, const Debuggee& src) { |
| 189 if (src.tab_id) | 234 if (src.tab_id) |
| 190 dst.tab_id.reset(new int(*src.tab_id)); | 235 dst.tab_id.reset(new int(*src.tab_id)); |
| 191 if (src.extension_id) | 236 if (src.extension_id) |
| 192 dst.extension_id.reset(new std::string(*src.extension_id)); | 237 dst.extension_id.reset(new std::string(*src.extension_id)); |
| 238 if (src.target_id) | |
| 239 dst.target_id.reset(new std::string(*src.target_id)); | |
| 193 } | 240 } |
| 194 | 241 |
| 195 ExtensionDevToolsClientHost::ExtensionDevToolsClientHost( | 242 ExtensionDevToolsClientHost::ExtensionDevToolsClientHost( |
| 196 WebContents* web_contents, | 243 WebContents* web_contents, |
| 197 const std::string& extension_id, | 244 const std::string& extension_id, |
| 198 const std::string& extension_name, | 245 const std::string& extension_name, |
| 199 const Debuggee& debuggee) | 246 const Debuggee& debuggee) |
| 200 : web_contents_(web_contents), | 247 : web_contents_(web_contents), |
| 201 extension_id_(extension_id), | 248 extension_id_(extension_id), |
| 202 last_request_id_(0), | 249 last_request_id_(0), |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 424 DebuggerFunction::DebuggerFunction() | 471 DebuggerFunction::DebuggerFunction() |
| 425 : contents_(0), | 472 : contents_(0), |
| 426 client_host_(0) { | 473 client_host_(0) { |
| 427 } | 474 } |
| 428 | 475 |
| 429 void DebuggerFunction::FormatErrorMessage(const std::string& format) { | 476 void DebuggerFunction::FormatErrorMessage(const std::string& format) { |
| 430 error_ = ErrorUtils::FormatErrorMessage( | 477 error_ = ErrorUtils::FormatErrorMessage( |
| 431 format, | 478 format, |
| 432 debuggee_.tab_id ? | 479 debuggee_.tab_id ? |
| 433 keys::kTabTargetType : | 480 keys::kTabTargetType : |
| 434 keys::kExtensionTargetType, | 481 debuggee_.extension_id ? |
| 482 keys::kExtensionTargetType : | |
| 483 keys::kOpaqueTargetType, | |
| 435 debuggee_.tab_id ? | 484 debuggee_.tab_id ? |
| 436 base::IntToString(*debuggee_.tab_id) : | 485 base::IntToString(*debuggee_.tab_id) : |
| 437 *debuggee_.extension_id); | 486 debuggee_.extension_id ? |
| 487 *debuggee_.extension_id : | |
| 488 *debuggee_.target_id); | |
| 438 } | 489 } |
| 439 | 490 |
| 440 bool DebuggerFunction::InitWebContents() { | 491 bool DebuggerFunction::InitWebContents() { |
| 441 // Find the WebContents that contains this tab id. | 492 // Find the WebContents that contains this tab id. |
| 442 contents_ = NULL; | 493 contents_ = NULL; |
| 443 if (debuggee_.tab_id) { | 494 if (debuggee_.tab_id) { |
| 444 WebContents* web_contents = NULL; | 495 WebContents* web_contents = NULL; |
| 445 bool result = ExtensionTabUtil::GetTabById( | 496 bool result = ExtensionTabUtil::GetTabById( |
| 446 *debuggee_.tab_id, profile(), include_incognito(), NULL, NULL, | 497 *debuggee_.tab_id, profile(), include_incognito(), NULL, NULL, |
| 447 &web_contents, NULL); | 498 &web_contents, NULL); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 476 if (host) { | 527 if (host) { |
| 477 contents_ = WebContents::FromRenderViewHost(host->render_view_host()); | 528 contents_ = WebContents::FromRenderViewHost(host->render_view_host()); |
| 478 if (contents_) | 529 if (contents_) |
| 479 return true; | 530 return true; |
| 480 } | 531 } |
| 481 | 532 |
| 482 FormatErrorMessage(keys::kNoTargetError); | 533 FormatErrorMessage(keys::kNoTargetError); |
| 483 return false; | 534 return false; |
| 484 } | 535 } |
| 485 | 536 |
| 537 if (debuggee_.target_id) { | |
| 538 DevToolsAgentHost* agent_host = | |
| 539 DevToolsTargetList::GetInstance()->ForIdentifier(*debuggee_.target_id); | |
| 540 if (agent_host) { | |
| 541 contents_ = WebContents::FromRenderViewHost( | |
| 542 agent_host->GetRenderViewHost()); | |
| 543 | |
| 544 if (GetExtensionBackgroundHost(contents_) && | |
| 545 !CommandLine::ForCurrentProcess()-> | |
| 546 HasSwitch(switches::kSilentDebuggerExtensionAPI)) { | |
| 547 error_ = ErrorUtils::FormatErrorMessage( | |
| 548 keys::kSilentDebuggingRequired, | |
| 549 switches::kSilentDebuggerExtensionAPI); | |
| 550 return false; | |
| 551 } | |
| 552 return true; | |
| 553 } | |
| 554 FormatErrorMessage(keys::kNoTargetError); | |
| 555 return false; | |
| 556 } | |
| 557 | |
| 486 error_ = keys::kInvalidTargetError; | 558 error_ = keys::kInvalidTargetError; |
| 487 return false; | 559 return false; |
| 488 } | 560 } |
| 489 | 561 |
| 490 bool DebuggerFunction::InitClientHost() { | 562 bool DebuggerFunction::InitClientHost() { |
| 491 if (!InitWebContents()) | 563 if (!InitWebContents()) |
| 492 return false; | 564 return false; |
| 493 | 565 |
| 494 // Don't fetch rvh from the contents since it'll be wrong upon navigation. | 566 // Don't fetch rvh from the contents since it'll be wrong upon navigation. |
| 495 client_host_ = AttachedClientHosts::GetInstance()->Lookup(contents_); | 567 client_host_ = AttachedClientHosts::GetInstance()->Lookup(contents_); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 585 } | 657 } |
| 586 | 658 |
| 587 DictionaryValue* result_body; | 659 DictionaryValue* result_body; |
| 588 SendCommand::Results::Result result; | 660 SendCommand::Results::Result result; |
| 589 if (response->GetDictionary("result", &result_body)) | 661 if (response->GetDictionary("result", &result_body)) |
| 590 result.additional_properties.Swap(result_body); | 662 result.additional_properties.Swap(result_body); |
| 591 | 663 |
| 592 results_ = SendCommand::Results::Create(result); | 664 results_ = SendCommand::Results::Create(result); |
| 593 SendResponse(true); | 665 SendResponse(true); |
| 594 } | 666 } |
| 667 | |
| 668 DebuggerGetTargetsFunction::DebuggerGetTargetsFunction() {} | |
| 669 | |
| 670 DebuggerGetTargetsFunction::~DebuggerGetTargetsFunction() {} | |
| 671 | |
| 672 bool DebuggerGetTargetsFunction::RunImpl() { | |
| 673 base::ListValue* results_list = new ListValue(); | |
| 674 | |
| 675 DevToolsTargetList::AgentsMap& agents_map = | |
| 676 DevToolsTargetList::GetInstance()->GetAgentsMap(); | |
| 677 | |
| 678 for (DevToolsTargetList::iterator i = agents_map.begin(); | |
| 679 i != agents_map.end(); ++i) | |
| 680 results_list->Append(SerializeTargetInfo(i->second)); | |
| 681 | |
| 682 SetResult(results_list); | |
| 683 SendResponse(true); | |
| 684 return true; | |
| 685 } | |
| OLD | NEW |