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

Side by Side Diff: chrome/browser/extensions/api/debugger/debugger_api.cc

Issue 449043002: [DevTools] Make DevTools clients talk directly to DevToolsAgentHost instead of using DevToolsManage… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 6 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 13 matching lines...) Expand all
24 #include "chrome/browser/extensions/api/debugger/debugger_api_constants.h" 24 #include "chrome/browser/extensions/api/debugger/debugger_api_constants.h"
25 #include "chrome/browser/extensions/extension_service.h" 25 #include "chrome/browser/extensions/extension_service.h"
26 #include "chrome/browser/extensions/extension_tab_util.h" 26 #include "chrome/browser/extensions/extension_tab_util.h"
27 #include "chrome/browser/infobars/infobar_service.h" 27 #include "chrome/browser/infobars/infobar_service.h"
28 #include "chrome/browser/profiles/profile.h" 28 #include "chrome/browser/profiles/profile.h"
29 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 29 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
30 #include "chrome/common/chrome_switches.h" 30 #include "chrome/common/chrome_switches.h"
31 #include "components/infobars/core/confirm_infobar_delegate.h" 31 #include "components/infobars/core/confirm_infobar_delegate.h"
32 #include "components/infobars/core/infobar.h" 32 #include "components/infobars/core/infobar.h"
33 #include "content/public/browser/devtools_agent_host.h" 33 #include "content/public/browser/devtools_agent_host.h"
34 #include "content/public/browser/devtools_client_host.h"
35 #include "content/public/browser/devtools_http_handler.h" 34 #include "content/public/browser/devtools_http_handler.h"
36 #include "content/public/browser/devtools_manager.h"
37 #include "content/public/browser/notification_service.h" 35 #include "content/public/browser/notification_service.h"
38 #include "content/public/browser/notification_source.h" 36 #include "content/public/browser/notification_source.h"
39 #include "content/public/browser/render_process_host.h" 37 #include "content/public/browser/render_process_host.h"
40 #include "content/public/browser/render_view_host.h" 38 #include "content/public/browser/render_view_host.h"
41 #include "content/public/browser/render_widget_host.h" 39 #include "content/public/browser/render_widget_host.h"
42 #include "content/public/browser/web_contents.h" 40 #include "content/public/browser/web_contents.h"
43 #include "content/public/common/content_client.h" 41 #include "content/public/common/content_client.h"
44 #include "content/public/common/url_utils.h" 42 #include "content/public/common/url_utils.h"
45 #include "extensions/browser/event_router.h" 43 #include "extensions/browser/event_router.h"
46 #include "extensions/browser/extension_host.h" 44 #include "extensions/browser/extension_host.h"
47 #include "extensions/browser/extension_registry.h" 45 #include "extensions/browser/extension_registry.h"
48 #include "extensions/browser/extension_registry_observer.h" 46 #include "extensions/browser/extension_registry_observer.h"
49 #include "extensions/browser/extension_system.h" 47 #include "extensions/browser/extension_system.h"
50 #include "extensions/common/constants.h" 48 #include "extensions/common/constants.h"
51 #include "extensions/common/error_utils.h" 49 #include "extensions/common/error_utils.h"
52 #include "extensions/common/extension.h" 50 #include "extensions/common/extension.h"
53 #include "extensions/common/manifest_constants.h" 51 #include "extensions/common/manifest_constants.h"
54 #include "extensions/common/permissions/permissions_data.h" 52 #include "extensions/common/permissions/permissions_data.h"
55 #include "extensions/common/switches.h" 53 #include "extensions/common/switches.h"
56 #include "grit/generated_resources.h" 54 #include "grit/generated_resources.h"
57 #include "ui/base/l10n/l10n_util.h" 55 #include "ui/base/l10n/l10n_util.h"
58 56
59 using content::DevToolsAgentHost; 57 using content::DevToolsAgentHost;
60 using content::DevToolsClientHost;
61 using content::DevToolsHttpHandler; 58 using content::DevToolsHttpHandler;
62 using content::DevToolsManager;
63 using content::RenderProcessHost; 59 using content::RenderProcessHost;
64 using content::RenderViewHost; 60 using content::RenderViewHost;
65 using content::RenderWidgetHost; 61 using content::RenderWidgetHost;
66 using content::WebContents; 62 using content::WebContents;
67 63
68 namespace keys = debugger_api_constants; 64 namespace keys = debugger_api_constants;
69 namespace Attach = extensions::api::debugger::Attach; 65 namespace Attach = extensions::api::debugger::Attach;
70 namespace Detach = extensions::api::debugger::Detach; 66 namespace Detach = extensions::api::debugger::Detach;
71 namespace OnDetach = extensions::api::debugger::OnDetach; 67 namespace OnDetach = extensions::api::debugger::OnDetach;
72 namespace OnEvent = extensions::api::debugger::OnEvent; 68 namespace OnEvent = extensions::api::debugger::OnEvent;
73 namespace SendCommand = extensions::api::debugger::SendCommand; 69 namespace SendCommand = extensions::api::debugger::SendCommand;
74 70
75 namespace extensions { 71 namespace extensions {
76 class ExtensionRegistry; 72 class ExtensionRegistry;
77 73
78 // ExtensionDevToolsClientHost ------------------------------------------------ 74 // ExtensionDevToolsClientHost ------------------------------------------------
79 75
80 class ExtensionDevToolsClientHost : public DevToolsClientHost, 76 class ExtensionDevToolsClientHost : public DevToolsAgentHost::Client,
81 public content::NotificationObserver, 77 public content::NotificationObserver,
82 public ExtensionRegistryObserver { 78 public ExtensionRegistryObserver {
83 public: 79 public:
84 ExtensionDevToolsClientHost(Profile* profile, 80 ExtensionDevToolsClientHost(Profile* profile,
85 DevToolsAgentHost* agent_host, 81 DevToolsAgentHost* agent_host,
86 const std::string& extension_id, 82 const std::string& extension_id,
87 const std::string& extension_name, 83 const std::string& extension_name,
88 const Debuggee& debuggee, 84 const Debuggee& debuggee,
89 infobars::InfoBar* infobar); 85 infobars::InfoBar* infobar);
90 86
91 virtual ~ExtensionDevToolsClientHost(); 87 virtual ~ExtensionDevToolsClientHost();
92 88
93 const std::string& extension_id() { return extension_id_; } 89 const std::string& extension_id() { return extension_id_; }
90 DevToolsAgentHost* agent_host() { return agent_host_.get(); }
94 void Close(); 91 void Close();
95 void SendMessageToBackend(DebuggerSendCommandFunction* function, 92 void SendMessageToBackend(DebuggerSendCommandFunction* function,
96 const std::string& method, 93 const std::string& method,
97 SendCommand::Params::CommandParams* command_params); 94 SendCommand::Params::CommandParams* command_params);
98 95
99 // Marks connection as to-be-terminated by the user. 96 // Marks connection as to-be-terminated by the user.
100 void MarkAsDismissed(); 97 void MarkAsDismissed();
101 98
102 // DevToolsClientHost interface 99 // DevToolsAgentHost::Client interface.
103 virtual void InspectedContentsClosing() OVERRIDE; 100 virtual void AgentHostDetached(
104 virtual void DispatchOnInspectorFrontend(const std::string& message) OVERRIDE; 101 DevToolsAgentHost* agent_host,
105 virtual void ReplacedWithAnotherClient() OVERRIDE; 102 DevToolsAgentHost::DetachReason reason) OVERRIDE;
103 virtual void SendMessageFromAgentHost(
104 DevToolsAgentHost* agent_host,
105 const std::string& message) OVERRIDE;
106 106
107 private: 107 private:
108 void SendDetachedEvent(); 108 void SendDetachedEvent();
109 109
110 // content::NotificationObserver implementation. 110 // content::NotificationObserver implementation.
111 virtual void Observe(int type, 111 virtual void Observe(int type,
112 const content::NotificationSource& source, 112 const content::NotificationSource& source,
113 const content::NotificationDetails& details) OVERRIDE; 113 const content::NotificationDetails& details) OVERRIDE;
114 114
115 // ExtensionRegistryObserver implementation. 115 // ExtensionRegistryObserver implementation.
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 client_hosts_.insert(client_host); 286 client_hosts_.insert(client_host);
287 } 287 }
288 288
289 void AttachedClientHosts::Remove(ExtensionDevToolsClientHost* client_host) { 289 void AttachedClientHosts::Remove(ExtensionDevToolsClientHost* client_host) {
290 client_hosts_.erase(client_host); 290 client_hosts_.erase(client_host);
291 } 291 }
292 292
293 ExtensionDevToolsClientHost* AttachedClientHosts::Lookup( 293 ExtensionDevToolsClientHost* AttachedClientHosts::Lookup(
294 DevToolsAgentHost* agent_host, 294 DevToolsAgentHost* agent_host,
295 const std::string& extension_id) { 295 const std::string& extension_id) {
296 DevToolsManager* manager = DevToolsManager::GetInstance();
297 for (ClientHosts::iterator it = client_hosts_.begin(); 296 for (ClientHosts::iterator it = client_hosts_.begin();
298 it != client_hosts_.end(); ++it) { 297 it != client_hosts_.end(); ++it) {
299 ExtensionDevToolsClientHost* client_host = *it; 298 ExtensionDevToolsClientHost* client_host = *it;
300 if (manager->GetDevToolsAgentHostFor(client_host) == agent_host && 299 if (client_host->agent_host() == agent_host &&
301 client_host->extension_id() == extension_id) 300 client_host->extension_id() == extension_id)
302 return client_host; 301 return client_host;
303 } 302 }
304 return NULL; 303 return NULL;
305 } 304 }
306 305
307 } // namespace 306 } // namespace
308 307
309 308
310 // ExtensionDevToolsClientHost ------------------------------------------------ 309 // ExtensionDevToolsClientHost ------------------------------------------------
(...skipping 20 matching lines...) Expand all
331 // from there. 330 // from there.
332 extension_registry_observer_.Add(ExtensionRegistry::Get(profile_)); 331 extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
333 332
334 // RVH-based agents disconnect from their clients when the app is terminating 333 // RVH-based agents disconnect from their clients when the app is terminating
335 // but shared worker-based agents do not. 334 // but shared worker-based agents do not.
336 // Disconnect explicitly to make sure that |this| observer is not leaked. 335 // Disconnect explicitly to make sure that |this| observer is not leaked.
337 registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, 336 registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING,
338 content::NotificationService::AllSources()); 337 content::NotificationService::AllSources());
339 338
340 // Attach to debugger and tell it we are ready. 339 // Attach to debugger and tell it we are ready.
341 DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor( 340 agent_host_->AttachClient(this);
342 agent_host_.get(), this);
343 341
344 if (infobar_) { 342 if (infobar_) {
345 static_cast<ExtensionDevToolsInfoBarDelegate*>( 343 static_cast<ExtensionDevToolsInfoBarDelegate*>(
346 infobar_->delegate())->set_client_host(this); 344 infobar_->delegate())->set_client_host(this);
347 registrar_.Add( 345 registrar_.Add(
348 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 346 this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
349 content::Source<InfoBarService>(InfoBarService::FromWebContents( 347 content::Source<InfoBarService>(InfoBarService::FromWebContents(
350 WebContents::FromRenderViewHost( 348 WebContents::FromRenderViewHost(
351 agent_host_->GetRenderViewHost())))); 349 agent_host_->GetRenderViewHost()))));
352 } 350 }
353 } 351 }
354 352
355 ExtensionDevToolsClientHost::~ExtensionDevToolsClientHost() { 353 ExtensionDevToolsClientHost::~ExtensionDevToolsClientHost() {
356 // Ensure calling RemoveInfoBar() below won't result in Observe() trying to 354 // Ensure calling RemoveInfoBar() below won't result in Observe() trying to
357 // Close() us. 355 // Close() us.
358 registrar_.RemoveAll(); 356 registrar_.RemoveAll();
359 357
360 if (infobar_) { 358 if (infobar_) {
361 static_cast<ExtensionDevToolsInfoBarDelegate*>( 359 static_cast<ExtensionDevToolsInfoBarDelegate*>(
362 infobar_->delegate())->set_client_host(NULL); 360 infobar_->delegate())->set_client_host(NULL);
363 InfoBarService* infobar_service = InfoBarService::FromWebContents( 361 InfoBarService* infobar_service = InfoBarService::FromWebContents(
364 WebContents::FromRenderViewHost(agent_host_->GetRenderViewHost())); 362 WebContents::FromRenderViewHost(agent_host_->GetRenderViewHost()));
365 infobar_service->RemoveInfoBar(infobar_); 363 infobar_service->RemoveInfoBar(infobar_);
366 } 364 }
367 AttachedClientHosts::GetInstance()->Remove(this); 365 AttachedClientHosts::GetInstance()->Remove(this);
368 } 366 }
369 367
370 // DevToolsClientHost interface 368 // DevToolsAgentHost::Client implementation.
371 void ExtensionDevToolsClientHost::InspectedContentsClosing() { 369 void ExtensionDevToolsClientHost::AgentHostDetached(
372 SendDetachedEvent(); 370 DevToolsAgentHost* agent_host, DevToolsAgentHost::DetachReason reason) {
371 DCHECK(agent_host == agent_host_.get());
372 if (reason != DevToolsAgentHost::DETACHED_BY_CLIENT) {
373 if (reason == DevToolsAgentHost::REPLACED_WITH_ANOTHER_CLIENT)
374 detach_reason_ = OnDetach::REASON_REPLACED_WITH_DEVTOOLS;
375 SendDetachedEvent();
376 }
377 agent_host_ = NULL;
373 delete this; 378 delete this;
pfeldman 2014/08/07 15:40:30 Are you now deleting things twice?
dgozman 2014/08/07 16:51:52 Yes, fixed.
374 } 379 }
375 380
376 void ExtensionDevToolsClientHost::ReplacedWithAnotherClient() {
377 detach_reason_ = OnDetach::REASON_REPLACED_WITH_DEVTOOLS;
378 }
379
380 void ExtensionDevToolsClientHost::Close() { 381 void ExtensionDevToolsClientHost::Close() {
381 DevToolsManager::GetInstance()->ClientHostClosing(this); 382 agent_host_->DetachClient();
382 delete this; 383 delete this;
383 } 384 }
384 385
385 void ExtensionDevToolsClientHost::SendMessageToBackend( 386 void ExtensionDevToolsClientHost::SendMessageToBackend(
386 DebuggerSendCommandFunction* function, 387 DebuggerSendCommandFunction* function,
387 const std::string& method, 388 const std::string& method,
388 SendCommand::Params::CommandParams* command_params) { 389 SendCommand::Params::CommandParams* command_params) {
389 base::DictionaryValue protocol_request; 390 base::DictionaryValue protocol_request;
390 int request_id = ++last_request_id_; 391 int request_id = ++last_request_id_;
391 pending_requests_[request_id] = function; 392 pending_requests_[request_id] = function;
392 protocol_request.SetInteger("id", request_id); 393 protocol_request.SetInteger("id", request_id);
393 protocol_request.SetString("method", method); 394 protocol_request.SetString("method", method);
394 if (command_params) { 395 if (command_params) {
395 protocol_request.Set("params", 396 protocol_request.Set("params",
396 command_params->additional_properties.DeepCopy()); 397 command_params->additional_properties.DeepCopy());
397 } 398 }
398 399
399 std::string json_args; 400 std::string json_args;
400 base::JSONWriter::Write(&protocol_request, &json_args); 401 base::JSONWriter::Write(&protocol_request, &json_args);
401 DevToolsManager::GetInstance()->DispatchOnInspectorBackend(this, json_args); 402 agent_host_->DispatchOnInspectorBackend(json_args);
402 } 403 }
403 404
404 void ExtensionDevToolsClientHost::MarkAsDismissed() { 405 void ExtensionDevToolsClientHost::MarkAsDismissed() {
405 detach_reason_ = OnDetach::REASON_CANCELED_BY_USER; 406 detach_reason_ = OnDetach::REASON_CANCELED_BY_USER;
406 } 407 }
407 408
408 void ExtensionDevToolsClientHost::SendDetachedEvent() { 409 void ExtensionDevToolsClientHost::SendDetachedEvent() {
409 if (!EventRouter::Get(profile_)) 410 if (!EventRouter::Get(profile_))
410 return; 411 return;
411 412
(...skipping 27 matching lines...) Expand all
439 infobar_ = NULL; 440 infobar_ = NULL;
440 SendDetachedEvent(); 441 SendDetachedEvent();
441 Close(); 442 Close();
442 } 443 }
443 break; 444 break;
444 default: 445 default:
445 NOTREACHED(); 446 NOTREACHED();
446 } 447 }
447 } 448 }
448 449
449 void ExtensionDevToolsClientHost::DispatchOnInspectorFrontend( 450 void ExtensionDevToolsClientHost::SendMessageFromAgentHost(
450 const std::string& message) { 451 DevToolsAgentHost* agent_host, const std::string& message) {
452 DCHECK(agent_host == agent_host_.get());
451 if (!EventRouter::Get(profile_)) 453 if (!EventRouter::Get(profile_))
452 return; 454 return;
453 455
454 scoped_ptr<base::Value> result(base::JSONReader::Read(message)); 456 scoped_ptr<base::Value> result(base::JSONReader::Read(message));
455 if (!result->IsType(base::Value::TYPE_DICTIONARY)) 457 if (!result->IsType(base::Value::TYPE_DICTIONARY))
456 return; 458 return;
457 base::DictionaryValue* dictionary = 459 base::DictionaryValue* dictionary =
458 static_cast<base::DictionaryValue*>(result.get()); 460 static_cast<base::DictionaryValue*>(result.get());
459 461
460 int id; 462 int id;
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 const std::vector<DevToolsTargetImpl*>& target_list) { 747 const std::vector<DevToolsTargetImpl*>& target_list) {
746 scoped_ptr<base::ListValue> result(new base::ListValue()); 748 scoped_ptr<base::ListValue> result(new base::ListValue());
747 for (size_t i = 0; i < target_list.size(); ++i) 749 for (size_t i = 0; i < target_list.size(); ++i)
748 result->Append(SerializeTarget(*target_list[i])); 750 result->Append(SerializeTarget(*target_list[i]));
749 STLDeleteContainerPointers(target_list.begin(), target_list.end()); 751 STLDeleteContainerPointers(target_list.begin(), target_list.end());
750 SetResult(result.release()); 752 SetResult(result.release());
751 SendResponse(true); 753 SendResponse(true);
752 } 754 }
753 755
754 } // namespace extensions 756 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698