Index: chrome/browser/devtools/devtools_targets_ui.cc |
diff --git a/chrome/browser/devtools/devtools_targets_ui.cc b/chrome/browser/devtools/devtools_targets_ui.cc |
index 69f4ec2343c31a674de6f068204b3ff66926e7ee..15e017696e948a69db2ad9e17d4cfb5e81ac0737 100644 |
--- a/chrome/browser/devtools/devtools_targets_ui.cc |
+++ b/chrome/browser/devtools/devtools_targets_ui.cc |
@@ -30,9 +30,8 @@ using content::BrowserThread; |
namespace { |
const char kTargetSourceField[] = "source"; |
-const char kTargetSourceRenderer[] = "renderers"; |
-const char kTargetSourceWorker[] = "workers"; |
-const char kTargetSourceAdb[] = "adb"; |
+const char kTargetSourceLocal[] = "local"; |
+const char kTargetSourceRemote[] = "remote"; |
const char kTargetIdField[] = "id"; |
const char kTargetTypeField[] = "type"; |
@@ -80,95 +79,6 @@ class CancelableTimer { |
base::WeakPtrFactory<CancelableTimer> weak_factory_; |
}; |
-// RenderViewHostTargetsUIHandler --------------------------------------------- |
- |
-class RenderViewHostTargetsUIHandler |
- : public DevToolsTargetsUIHandler, |
- public content::NotificationObserver { |
- public: |
- explicit RenderViewHostTargetsUIHandler(const Callback& callback); |
- virtual ~RenderViewHostTargetsUIHandler(); |
- |
- private: |
- // content::NotificationObserver overrides. |
- virtual void Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) OVERRIDE; |
- |
- void UpdateTargets(); |
- |
- content::NotificationRegistrar notification_registrar_; |
- scoped_ptr<CancelableTimer> timer_; |
-}; |
- |
-RenderViewHostTargetsUIHandler::RenderViewHostTargetsUIHandler( |
- const Callback& callback) |
- : DevToolsTargetsUIHandler(kTargetSourceRenderer, callback) { |
- notification_registrar_.Add(this, |
- content::NOTIFICATION_WEB_CONTENTS_CONNECTED, |
- content::NotificationService::AllSources()); |
- notification_registrar_.Add(this, |
- content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED, |
- content::NotificationService::AllSources()); |
- notification_registrar_.Add(this, |
- content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
- content::NotificationService::AllSources()); |
- UpdateTargets(); |
-} |
- |
-RenderViewHostTargetsUIHandler::~RenderViewHostTargetsUIHandler() { |
- notification_registrar_.RemoveAll(); |
-} |
- |
-void RenderViewHostTargetsUIHandler::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- const int kUpdateDelay = 100; |
- timer_.reset( |
- new CancelableTimer( |
- base::Bind(&RenderViewHostTargetsUIHandler::UpdateTargets, |
- base::Unretained(this)), |
- base::TimeDelta::FromMilliseconds(kUpdateDelay))); |
-} |
- |
-void RenderViewHostTargetsUIHandler::UpdateTargets() { |
- base::ListValue list_value; |
- |
- std::map<std::string, base::DictionaryValue*> id_to_descriptor; |
- |
- DevToolsTargetImpl::List targets = |
- DevToolsTargetImpl::EnumerateWebContentsTargets(); |
- |
- STLDeleteValues(&targets_); |
- for (DevToolsTargetImpl::List::iterator it = targets.begin(); |
- it != targets.end(); ++it) { |
- DevToolsTargetImpl* target = *it; |
- targets_[target->GetId()] = target; |
- id_to_descriptor[target->GetId()] = Serialize(*target); |
- } |
- |
- for (TargetMap::iterator it(targets_.begin()); it != targets_.end(); ++it) { |
- DevToolsTargetImpl* target = it->second; |
- base::DictionaryValue* descriptor = id_to_descriptor[target->GetId()]; |
- |
- std::string parent_id = target->GetParentId(); |
- if (parent_id.empty() || id_to_descriptor.count(parent_id) == 0) { |
- list_value.Append(descriptor); |
- } else { |
- base::DictionaryValue* parent = id_to_descriptor[parent_id]; |
- base::ListValue* guests = NULL; |
- if (!parent->GetList(kGuestList, &guests)) { |
- guests = new base::ListValue(); |
- parent->Set(kGuestList, guests); |
- } |
- guests->Append(descriptor); |
- } |
- } |
- |
- SendSerializedTargets(list_value); |
-} |
- |
// WorkerObserver ------------------------------------------------------------- |
class WorkerObserver |
@@ -177,7 +87,7 @@ class WorkerObserver |
public: |
WorkerObserver() {} |
- void Start(DevToolsTargetImpl::Callback callback) { |
+ void Start(base::Closure callback) { |
DCHECK(callback_.is_null()); |
DCHECK(!callback.is_null()); |
callback_ = callback; |
@@ -188,19 +98,12 @@ class WorkerObserver |
void Stop() { |
DCHECK(!callback_.is_null()); |
- callback_ = DevToolsTargetImpl::Callback(); |
+ callback_ = base::Closure(); |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
base::Bind(&WorkerObserver::StopOnIOThread, this)); |
} |
- void Enumerate() { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&WorkerObserver::EnumerateOnIOThread, |
- this)); |
- } |
- |
private: |
friend class base::RefCountedThreadSafe<WorkerObserver>; |
virtual ~WorkerObserver() {} |
@@ -211,74 +114,145 @@ class WorkerObserver |
const base::string16& name, |
int process_id, |
int route_id) OVERRIDE { |
- EnumerateOnIOThread(); |
+ NotifyOnIOThread(); |
} |
virtual void WorkerDestroyed(int process_id, int route_id) OVERRIDE { |
- EnumerateOnIOThread(); |
+ NotifyOnIOThread(); |
} |
void StartOnIOThread() { |
content::WorkerService::GetInstance()->AddObserver(this); |
- EnumerateOnIOThread(); |
} |
void StopOnIOThread() { |
content::WorkerService::GetInstance()->RemoveObserver(this); |
} |
- void EnumerateOnIOThread() { |
+ void NotifyOnIOThread() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DevToolsTargetImpl::EnumerateWorkerTargets( |
- base::Bind(&WorkerObserver::RespondOnUIThread, this)); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&WorkerObserver::NotifyOnUIThread, this)); |
} |
- void RespondOnUIThread(const DevToolsTargetImpl::List& targets) { |
+ void NotifyOnUIThread() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
if (callback_.is_null()) |
return; |
- callback_.Run(targets); |
+ callback_.Run(); |
} |
- DevToolsTargetImpl::Callback callback_; |
+ // Accessed on UI thread. |
+ base::Closure callback_; |
}; |
-// WorkerTargetsUIHandler ----------------------------------------------------- |
+// LocalTargetsUIHandler --------------------------------------------- |
-class WorkerTargetsUIHandler |
- : public DevToolsTargetsUIHandler { |
+class LocalTargetsUIHandler |
+ : public DevToolsTargetsUIHandler, |
+ public content::NotificationObserver { |
public: |
- explicit WorkerTargetsUIHandler(const Callback& callback); |
- virtual ~WorkerTargetsUIHandler(); |
+ explicit LocalTargetsUIHandler(const Callback& callback); |
+ virtual ~LocalTargetsUIHandler(); |
- private: |
- void UpdateTargets(const DevToolsTargetImpl::List& targets); |
+private: |
+ // content::NotificationObserver overrides. |
+ virtual void Observe(int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) OVERRIDE; |
+ void ScheduleUpdate(); |
+ void UpdateTargets(); |
+ void SendTargets(const DevToolsTargetImpl::List& targets); |
+ |
+ content::NotificationRegistrar notification_registrar_; |
+ scoped_ptr<CancelableTimer> timer_; |
scoped_refptr<WorkerObserver> observer_; |
+ base::WeakPtrFactory<LocalTargetsUIHandler> weak_factory_; |
}; |
-WorkerTargetsUIHandler::WorkerTargetsUIHandler(const Callback& callback) |
- : DevToolsTargetsUIHandler(kTargetSourceWorker, callback), |
- observer_(new WorkerObserver()) { |
- observer_->Start(base::Bind(&WorkerTargetsUIHandler::UpdateTargets, |
+LocalTargetsUIHandler::LocalTargetsUIHandler( |
+ const Callback& callback) |
+ : DevToolsTargetsUIHandler(kTargetSourceLocal, callback), |
+ observer_(new WorkerObserver()), |
+ weak_factory_(this) { |
+ notification_registrar_.Add(this, |
+ content::NOTIFICATION_WEB_CONTENTS_CONNECTED, |
+ content::NotificationService::AllSources()); |
+ notification_registrar_.Add(this, |
+ content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED, |
+ content::NotificationService::AllSources()); |
+ notification_registrar_.Add(this, |
+ content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
+ content::NotificationService::AllSources()); |
+ observer_->Start(base::Bind(&LocalTargetsUIHandler::ScheduleUpdate, |
base::Unretained(this))); |
+ UpdateTargets(); |
} |
-WorkerTargetsUIHandler::~WorkerTargetsUIHandler() { |
+LocalTargetsUIHandler::~LocalTargetsUIHandler() { |
+ notification_registrar_.RemoveAll(); |
observer_->Stop(); |
} |
-void WorkerTargetsUIHandler::UpdateTargets( |
+void LocalTargetsUIHandler::Observe( |
+ int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ ScheduleUpdate(); |
+} |
+ |
+void LocalTargetsUIHandler::ScheduleUpdate() { |
+ const int kUpdateDelay = 100; |
+ timer_.reset( |
+ new CancelableTimer( |
+ base::Bind(&LocalTargetsUIHandler::UpdateTargets, |
+ base::Unretained(this)), |
+ base::TimeDelta::FromMilliseconds(kUpdateDelay))); |
+} |
+ |
+void LocalTargetsUIHandler::UpdateTargets() { |
+ DevToolsTargetImpl::EnumerateAllTargets(base::Bind( |
+ &LocalTargetsUIHandler::SendTargets, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
+void LocalTargetsUIHandler::SendTargets( |
const DevToolsTargetImpl::List& targets) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
base::ListValue list_value; |
+ std::map<std::string, base::DictionaryValue*> id_to_descriptor; |
+ |
STLDeleteValues(&targets_); |
for (DevToolsTargetImpl::List::const_iterator it = targets.begin(); |
it != targets.end(); ++it) { |
DevToolsTargetImpl* target = *it; |
- list_value.Append(Serialize(*target)); |
+ if (target->GetType() == DevToolsTargetImpl::kTargetTypeServiceWorker) |
+ continue; |
targets_[target->GetId()] = target; |
+ id_to_descriptor[target->GetId()] = Serialize(*target); |
+ } |
+ |
+ for (TargetMap::iterator it(targets_.begin()); it != targets_.end(); ++it) { |
+ DevToolsTargetImpl* target = it->second; |
+ if (target->GetType() == DevToolsTargetImpl::kTargetTypeServiceWorker) |
+ continue; |
+ base::DictionaryValue* descriptor = id_to_descriptor[target->GetId()]; |
+ |
+ std::string parent_id = target->GetParentId(); |
+ if (parent_id.empty() || id_to_descriptor.count(parent_id) == 0) { |
+ list_value.Append(descriptor); |
+ } else { |
+ base::DictionaryValue* parent = id_to_descriptor[parent_id]; |
+ base::ListValue* guests = NULL; |
+ if (!parent->GetList(kGuestList, &guests)) { |
+ guests = new base::ListValue(); |
+ parent->Set(kGuestList, guests); |
+ } |
+ guests->Append(descriptor); |
+ } |
} |
+ |
SendSerializedTargets(list_value); |
} |
@@ -312,7 +286,7 @@ class AdbTargetsUIHandler |
AdbTargetsUIHandler::AdbTargetsUIHandler(const Callback& callback, |
Profile* profile) |
- : DevToolsTargetsUIHandler(kTargetSourceAdb, callback), |
+ : DevToolsTargetsUIHandler(kTargetSourceRemote, callback), |
profile_(profile) { |
DevToolsAndroidBridge* android_bridge = |
DevToolsAndroidBridge::Factory::GetForProfile(profile_); |
@@ -449,18 +423,10 @@ DevToolsTargetsUIHandler::~DevToolsTargetsUIHandler() { |
// static |
scoped_ptr<DevToolsTargetsUIHandler> |
-DevToolsTargetsUIHandler::CreateForRenderers( |
- const DevToolsTargetsUIHandler::Callback& callback) { |
- return scoped_ptr<DevToolsTargetsUIHandler>( |
- new RenderViewHostTargetsUIHandler(callback)); |
-} |
- |
-// static |
-scoped_ptr<DevToolsTargetsUIHandler> |
-DevToolsTargetsUIHandler::CreateForWorkers( |
+DevToolsTargetsUIHandler::CreateForLocal( |
const DevToolsTargetsUIHandler::Callback& callback) { |
return scoped_ptr<DevToolsTargetsUIHandler>( |
- new WorkerTargetsUIHandler(callback)); |
+ new LocalTargetsUIHandler(callback)); |
} |
// static |