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

Side by Side Diff: content/browser/devtools/devtools_manager.cc

Issue 577923002: [DevTools] Implement DevToolsManager::Observer which notifies about target updates. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@move-enumerate-to-dtm-delegate
Patch Set: fixed test flakiness Created 6 years, 2 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
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 #include "content/browser/devtools/devtools_manager.h" 5 #include "content/browser/devtools/devtools_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "content/browser/devtools/devtools_agent_host_impl.h"
9 #include "content/browser/devtools/devtools_netlog_observer.h" 10 #include "content/browser/devtools/devtools_netlog_observer.h"
10 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/browser_thread.h"
11 #include "content/public/browser/content_browser_client.h" 12 #include "content/public/browser/content_browser_client.h"
12 #include "content/public/browser/devtools_manager_delegate.h" 13 #include "content/public/browser/devtools_target.h"
13 14
14 namespace content { 15 namespace content {
15 16
16 // static 17 // static
17 DevToolsManager* DevToolsManager::GetInstance() { 18 DevToolsManager* DevToolsManager::GetInstance() {
18 return Singleton<DevToolsManager>::get(); 19 return Singleton<DevToolsManager>::get();
19 } 20 }
20 21
21 DevToolsManager::DevToolsManager() 22 DevToolsManager::DevToolsManager()
22 : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()), 23 : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()),
23 client_count_(0) { 24 update_target_list_required_(false),
25 update_target_list_scheduled_(false),
26 update_target_list_callback_(base::Bind(
27 &DevToolsManager::UpdateTargetListThrottled,
28 base::Unretained(this))) {
24 } 29 }
25 30
26 DevToolsManager::~DevToolsManager() { 31 DevToolsManager::~DevToolsManager() {
27 DCHECK(!client_count_); 32 DCHECK(!attached_hosts_.size());
33 update_target_list_callback_.Cancel();
28 } 34 }
29 35
30 void DevToolsManager::OnClientAttached() { 36 void DevToolsManager::RenderViewCreated(
31 if (!client_count_) { 37 WebContents* web_contents, RenderViewHost* rvh) {
32 BrowserThread::PostTask( 38 if (observer_list_.might_have_observers()) {
33 BrowserThread::IO, 39 // Force agent host creation.
34 FROM_HERE, 40 DevToolsAgentHost::GetOrCreateFor(web_contents);
35 base::Bind(&DevToolsNetLogObserver::Attach));
36 }
37 client_count_++;
38 }
39
40 void DevToolsManager::OnClientDetached() {
41 client_count_--;
42 if (!client_count_) {
43 BrowserThread::PostTask(
44 BrowserThread::IO,
45 FROM_HERE,
46 base::Bind(&DevToolsNetLogObserver::Detach));
47 } 41 }
48 } 42 }
49 43
44 void DevToolsManager::AgentHostChanged(
45 scoped_refptr<DevToolsAgentHost> agent_host) {
46 bool was_attached =
47 attached_hosts_.find(agent_host.get()) != attached_hosts_.end();
48 if (agent_host->IsAttached() && !was_attached) {
49 if (!attached_hosts_.size()) {
50 BrowserThread::PostTask(
51 BrowserThread::IO,
52 FROM_HERE,
53 base::Bind(&DevToolsNetLogObserver::Attach));
54 }
55 attached_hosts_.insert(agent_host.get());
56 } else if (!agent_host->IsAttached() && was_attached) {
57 attached_hosts_.erase(agent_host.get());
58 if (!attached_hosts_.size()) {
59 BrowserThread::PostTask(
60 BrowserThread::IO,
61 FROM_HERE,
62 base::Bind(&DevToolsNetLogObserver::Detach));
63 }
64 }
65
66 UpdateTargetList();
67 }
68
69 void DevToolsManager::AddObserver(Observer* observer) {
70 observer_list_.AddObserver(observer);
71 UpdateTargetList();
72 }
73
74 void DevToolsManager::RemoveObserver(Observer* observer) {
75 observer_list_.RemoveObserver(observer);
76 }
77
78 void DevToolsManager::UpdateTargetList() {
79 if (!observer_list_.might_have_observers())
80 return;
81
82 update_target_list_required_ = true;
83 if (!update_target_list_scheduled_)
84 UpdateTargetListThrottled();
85 }
86
87 void DevToolsManager::UpdateTargetListThrottled() {
88 if (!update_target_list_required_) {
89 update_target_list_scheduled_ = false;
90 return;
91 }
92
93 update_target_list_scheduled_ = true;
94 base::MessageLoop::current()->PostDelayedTask(
95 FROM_HERE,
96 update_target_list_callback_.callback(),
97 observer_throttle_interval_);
98
99 update_target_list_required_ = false;
100 if (!delegate_) {
101 Observer::TargetList empty_list;
102 NotifyTargetListChanged(empty_list);
103 return;
104 }
105 delegate_->EnumerateTargets(base::Bind(
106 &DevToolsManager::NotifyTargetListChanged,
107 base::Unretained(this)));
108 }
109
110 void DevToolsManager::NotifyTargetListChanged(
111 const Observer::TargetList& targets) {
112 FOR_EACH_OBSERVER(Observer, observer_list_, TargetListChanged(targets));
113 STLDeleteContainerPointers(targets.begin(), targets.end());
114 }
115
116 // static
117 base::TimeDelta DevToolsManager::observer_throttle_interval_ =
118 base::TimeDelta::FromMilliseconds(500);
119
120 // static
121 void DevToolsManager::SetObserverThrottleIntervalForTest(
122 base::TimeDelta interval) {
123 observer_throttle_interval_ = interval;
124 }
125
50 } // namespace content 126 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/devtools/devtools_manager.h ('k') | content/browser/devtools/devtools_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698