Index: content/browser/devtools/devtools_manager.cc |
diff --git a/content/browser/devtools/devtools_manager.cc b/content/browser/devtools/devtools_manager.cc |
index 6d8da5399e650920f57b84b69e2f36ba01b09f7c..bdef4afb819bbae40afffaf0917c3d74b1508cc7 100644 |
--- a/content/browser/devtools/devtools_manager.cc |
+++ b/content/browser/devtools/devtools_manager.cc |
@@ -6,10 +6,10 @@ |
#include "base/bind.h" |
#include "base/message_loop/message_loop.h" |
+#include "content/browser/devtools/devtools_agent_host_impl.h" |
#include "content/browser/devtools/devtools_netlog_observer.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/content_browser_client.h" |
-#include "content/public/browser/devtools_manager_delegate.h" |
namespace content { |
@@ -20,31 +20,105 @@ DevToolsManager* DevToolsManager::GetInstance() { |
DevToolsManager::DevToolsManager() |
: delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()), |
- client_count_(0) { |
+ update_target_list_required_(false), |
+ update_target_list_scheduled_(false), |
+ update_target_list_callback_(base::Bind( |
+ &DevToolsManager::UpdateTargetListThrottled, |
+ base::Unretained(this))) { |
} |
DevToolsManager::~DevToolsManager() { |
- DCHECK(!client_count_); |
+ DCHECK(!attached_hosts_.size()); |
+ update_target_list_callback_.Cancel(); |
} |
-void DevToolsManager::OnClientAttached() { |
- if (!client_count_) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, |
- FROM_HERE, |
- base::Bind(&DevToolsNetLogObserver::Attach)); |
+void DevToolsManager::RenderViewCreated( |
+ WebContents* web_contents, RenderViewHost* rvh) { |
+ if (observer_list_.might_have_observers()) { |
+ // Force agent host creation. |
+ DevToolsAgentHost::GetOrCreateFor(web_contents); |
} |
- client_count_++; |
} |
-void DevToolsManager::OnClientDetached() { |
- client_count_--; |
- if (!client_count_) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, |
- FROM_HERE, |
- base::Bind(&DevToolsNetLogObserver::Detach)); |
+void DevToolsManager::AgentHostChanged( |
+ scoped_refptr<DevToolsAgentHost> agent_host) { |
+ bool was_attached = |
+ attached_hosts_.find(agent_host.get()) != attached_hosts_.end(); |
+ if (agent_host->IsAttached() && !was_attached) { |
+ if (!attached_hosts_.size()) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&DevToolsNetLogObserver::Attach)); |
+ } |
+ attached_hosts_.insert(agent_host.get()); |
+ } else if (!agent_host->IsAttached() && was_attached) { |
+ attached_hosts_.erase(agent_host.get()); |
+ if (!attached_hosts_.size()) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&DevToolsNetLogObserver::Detach)); |
+ } |
} |
+ |
+ UpdateTargetList(); |
+} |
+ |
+void DevToolsManager::AddObserver(Observer* observer) { |
+ observer_list_.AddObserver(observer); |
+ UpdateTargetList(); |
+} |
+ |
+void DevToolsManager::RemoveObserver(Observer* observer) { |
+ observer_list_.RemoveObserver(observer); |
+} |
+ |
+void DevToolsManager::UpdateTargetList() { |
+ if (!observer_list_.might_have_observers()) |
+ return; |
+ |
+ update_target_list_required_ = true; |
+ if (!update_target_list_scheduled_) |
+ UpdateTargetListThrottled(); |
+} |
+ |
+void DevToolsManager::UpdateTargetListThrottled() { |
+ if (!update_target_list_required_) { |
+ update_target_list_scheduled_ = false; |
+ return; |
+ } |
+ |
+ update_target_list_scheduled_ = true; |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ update_target_list_callback_.callback(), |
+ observer_throttle_interval_); |
+ |
+ update_target_list_required_ = false; |
+ if (!delegate_) { |
+ Observer::TargetList empty_list; |
+ NotifyTargetListChanged(empty_list); |
+ return; |
+ } |
+ delegate_->EnumerateTargets(base::Bind( |
+ &DevToolsManager::NotifyTargetListChanged, |
+ base::Unretained(this))); |
+} |
+ |
+void DevToolsManager::NotifyTargetListChanged( |
+ const Observer::TargetList& targets) { |
+ FOR_EACH_OBSERVER(Observer, observer_list_, TargetListChanged(targets)); |
+} |
+ |
+// static |
+base::TimeDelta DevToolsManager::observer_throttle_interval_ = |
+ base::TimeDelta::FromMilliseconds(500); |
+ |
+// static |
+void DevToolsManager::SetObserverThrottleIntervalForTest( |
+ base::TimeDelta interval) { |
+ observer_throttle_interval_ = interval; |
} |
} // namespace content |