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

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: rebased Created 6 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 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 13
14 namespace content { 14 namespace content {
15 15
16 // static 16 // static
17 DevToolsManager* DevToolsManager::GetInstance() { 17 DevToolsManager* DevToolsManager::GetInstance() {
18 return Singleton<DevToolsManager>::get(); 18 return Singleton<DevToolsManager>::get();
19 } 19 }
20 20
21 DevToolsManager::DevToolsManager() 21 DevToolsManager::DevToolsManager()
22 : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()), 22 : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()),
23 client_count_(0) { 23 update_target_list_required_(false),
24 update_target_list_scheduled_(false),
25 update_target_list_callback_(base::Bind(
26 &DevToolsManager::UpdateTargetListThrottled,
27 base::Unretained(this))) {
24 } 28 }
25 29
26 DevToolsManager::~DevToolsManager() { 30 DevToolsManager::~DevToolsManager() {
27 DCHECK(!client_count_); 31 DCHECK(!attached_hosts_.size());
32 update_target_list_callback_.Cancel();
28 } 33 }
29 34
30 void DevToolsManager::OnClientAttached() { 35 void DevToolsManager::RenderViewCreated(
31 if (!client_count_) { 36 WebContents* web_contents, RenderViewHost* rvh) {
32 BrowserThread::PostTask( 37 if (observer_list_.might_have_observers()) {
33 BrowserThread::IO, 38 // Force agent host creation.
34 FROM_HERE, 39 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 } 40 }
48 } 41 }
49 42
43 void DevToolsManager::AgentHostChanged(
44 scoped_refptr<DevToolsAgentHost> agent_host) {
45 bool was_attached =
46 attached_hosts_.find(agent_host.get()) != attached_hosts_.end();
47 if (agent_host->IsAttached() && !was_attached) {
48 if (!attached_hosts_.size()) {
49 BrowserThread::PostTask(
50 BrowserThread::IO,
51 FROM_HERE,
52 base::Bind(&DevToolsNetLogObserver::Attach));
53 }
54 attached_hosts_.insert(agent_host.get());
55 } else if (!agent_host->IsAttached() && was_attached) {
56 attached_hosts_.erase(agent_host.get());
57 if (!attached_hosts_.size()) {
58 BrowserThread::PostTask(
59 BrowserThread::IO,
60 FROM_HERE,
61 base::Bind(&DevToolsNetLogObserver::Detach));
62 }
63 }
64
65 UpdateTargetList();
66 }
67
68 void DevToolsManager::AddObserver(Observer* observer) {
69 observer_list_.AddObserver(observer);
70 UpdateTargetList();
71 }
72
73 void DevToolsManager::RemoveObserver(Observer* observer) {
74 observer_list_.RemoveObserver(observer);
75 }
76
77 void DevToolsManager::UpdateTargetList() {
78 if (!observer_list_.might_have_observers())
79 return;
80
81 update_target_list_required_ = true;
82 if (!update_target_list_scheduled_)
83 UpdateTargetListThrottled();
84 }
85
86 void DevToolsManager::UpdateTargetListThrottled() {
87 if (!update_target_list_required_) {
88 update_target_list_scheduled_ = false;
89 return;
90 }
91
92 update_target_list_scheduled_ = true;
93 base::MessageLoop::current()->PostDelayedTask(
94 FROM_HERE,
95 update_target_list_callback_.callback(),
96 observer_throttle_interval_);
97
98 update_target_list_required_ = false;
99 if (!delegate_) {
100 Observer::TargetList empty_list;
101 NotifyTargetListChanged(empty_list);
102 return;
103 }
104 delegate_->EnumerateTargets(base::Bind(
105 &DevToolsManager::NotifyTargetListChanged,
106 base::Unretained(this)));
107 }
108
109 void DevToolsManager::NotifyTargetListChanged(
110 const Observer::TargetList& targets) {
111 FOR_EACH_OBSERVER(Observer, observer_list_, TargetListChanged(targets));
112 }
113
114 // static
115 base::TimeDelta DevToolsManager::observer_throttle_interval_ =
116 base::TimeDelta::FromMilliseconds(500);
117
118 // static
119 void DevToolsManager::SetObserverThrottleIntervalForTest(
120 base::TimeDelta interval) {
121 observer_throttle_interval_ = interval;
122 }
123
50 } // namespace content 124 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698