Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / devtools / devtools_targets_ui.cc
index 5ffdb2d..e5d96c9 100644 (file)
@@ -8,9 +8,10 @@
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
-#include "chrome/browser/devtools/devtools_adb_bridge.h"
+#include "base/version.h"
+#include "chrome/browser/devtools/device/devtools_android_bridge.h"
 #include "chrome/browser/devtools/devtools_target_impl.h"
-#include "chrome/browser/devtools/port_forwarding_controller.h"
+#include "chrome/common/chrome_version_info.h"
 #include "content/public/browser/browser_child_process_observer.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_data.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_source.h"
 #include "content/public/browser/notification_types.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/web_contents.h"
 #include "content/public/browser/worker_service.h"
 #include "content/public/browser/worker_service_observer.h"
 #include "content/public/common/process_type.h"
 #include "net/base/escape.h"
 
 using content::BrowserThread;
-using content::WebContents;
 
 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";
@@ -50,12 +46,13 @@ const char kGuestList[] = "guests";
 const char kAdbModelField[] = "adbModel";
 const char kAdbConnectedField[] = "adbConnected";
 const char kAdbSerialField[] = "adbSerial";
-const char kAdbPortStatus[] = "adbPortStatus";
 const char kAdbBrowsersList[] = "browsers";
+const char kAdbDeviceIdFormat[] = "device:%s";
 
 const char kAdbBrowserNameField[] = "adbBrowserName";
 const char kAdbBrowserVersionField[] = "adbBrowserVersion";
 const char kAdbBrowserChromeVersionField[] = "adbBrowserChromeVersion";
+const char kCompatibleVersion[] = "compatibleVersion";
 const char kAdbPagesList[] = "pages";
 
 const char kAdbScreenWidthField[] = "adbScreenWidth";
@@ -73,7 +70,7 @@ class CancelableTimer {
         FROM_HERE,
         base::Bind(&CancelableTimer::Fire, weak_factory_.GetWeakPtr()),
         delay);
-  };
+  }
 
  private:
   void Fire() { callback_.Run(); }
@@ -82,109 +79,6 @@ class CancelableTimer {
   base::WeakPtrFactory<CancelableTimer> weak_factory_;
 };
 
-// RenderViewHostTargetsUIHandler ---------------------------------------------
-
-class RenderViewHostTargetsUIHandler
-    : public DevToolsTargetsUIHandler,
-      public content::NotificationObserver {
- public:
-  explicit RenderViewHostTargetsUIHandler(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(
-    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() {
-  scoped_ptr<base::ListValue> list_value(new base::ListValue());
-
-  std::map<WebContents*, base::DictionaryValue*> web_contents_to_descriptor_;
-  std::vector<DevToolsTargetImpl*> guest_targets;
-
-  DevToolsTargetImpl::List targets =
-      DevToolsTargetImpl::EnumerateRenderViewHostTargets();
-
-  STLDeleteValues(&targets_);
-  for (DevToolsTargetImpl::List::iterator it = targets.begin();
-      it != targets.end(); ++it) {
-    scoped_ptr<DevToolsTargetImpl> target(*it);
-    content::RenderViewHost* rvh = target->GetRenderViewHost();
-    if (!rvh)
-      continue;
-    WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
-    if (!web_contents)
-      continue;
-
-    DevToolsTargetImpl* target_ptr = target.get();
-    targets_[target_ptr->GetId()] = target.release();
-    if (rvh->GetProcess()->IsGuest()) {
-      guest_targets.push_back(target_ptr);
-    } else {
-      base::DictionaryValue* descriptor = Serialize(*target_ptr);
-      list_value->Append(descriptor);
-      web_contents_to_descriptor_[web_contents] = descriptor;
-    }
-  }
-
-  // Add the list of guest-views to each of its embedders.
-  for (std::vector<DevToolsTargetImpl*>::iterator it(guest_targets.begin());
-       it != guest_targets.end(); ++it) {
-    DevToolsTargetImpl* guest = (*it);
-    WebContents* guest_web_contents =
-        WebContents::FromRenderViewHost(guest->GetRenderViewHost());
-    WebContents* embedder = guest_web_contents->GetEmbedderWebContents();
-    if (embedder && web_contents_to_descriptor_.count(embedder) > 0) {
-      base::DictionaryValue* parent = web_contents_to_descriptor_[embedder];
-      base::ListValue* guests = NULL;
-      if (!parent->GetList(kGuestList, &guests)) {
-        guests = new base::ListValue();
-        parent->Set(kGuestList, guests);
-      }
-      guests->Append(Serialize(*guest));
-    }
-  }
-
-  SendSerializedTargets(list_value.Pass());
-}
-
 // WorkerObserver -------------------------------------------------------------
 
 class WorkerObserver
@@ -193,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;
@@ -204,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() {}
@@ -227,205 +114,283 @@ 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
+class LocalTargetsUIHandler
     : public DevToolsTargetsUIHandler,
-      public content::BrowserChildProcessObserver {
+      public content::NotificationObserver {
  public:
-  explicit WorkerTargetsUIHandler(Callback callback);
-  virtual ~WorkerTargetsUIHandler();
+  explicit LocalTargetsUIHandler(const Callback& callback);
+  virtual ~LocalTargetsUIHandler();
 
- private:
-  // content::BrowserChildProcessObserver overrides.
-  virtual void BrowserChildProcessHostConnected(
-      const content::ChildProcessData& data) OVERRIDE;
-  virtual void BrowserChildProcessHostDisconnected(
-      const content::ChildProcessData& data) OVERRIDE;
+  // DevToolsTargetsUIHandler overrides.
+  virtual void ForceUpdate() OVERRIDE;
+
+private:
+  // content::NotificationObserver overrides.
+  virtual void Observe(int type,
+                       const content::NotificationSource& source,
+                       const content::NotificationDetails& details) OVERRIDE;
 
-  void UpdateTargets(const DevToolsTargetImpl::List& targets);
+  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(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)));
-  BrowserChildProcessObserver::Add(this);
+  UpdateTargets();
 }
 
-WorkerTargetsUIHandler::~WorkerTargetsUIHandler() {
-  BrowserChildProcessObserver::Remove(this);
+LocalTargetsUIHandler::~LocalTargetsUIHandler() {
+  notification_registrar_.RemoveAll();
   observer_->Stop();
 }
 
-void WorkerTargetsUIHandler::BrowserChildProcessHostConnected(
-    const content::ChildProcessData& data) {
-  if (data.process_type == content::PROCESS_TYPE_WORKER)
-    observer_->Enumerate();
+void LocalTargetsUIHandler::Observe(
+    int type,
+    const content::NotificationSource& source,
+    const content::NotificationDetails& details) {
+  ScheduleUpdate();
 }
 
-void WorkerTargetsUIHandler::BrowserChildProcessHostDisconnected(
-    const content::ChildProcessData& data) {
-  if (data.process_type == content::PROCESS_TYPE_WORKER)
-    observer_->Enumerate();
+void LocalTargetsUIHandler::ForceUpdate() {
+  ScheduleUpdate();
 }
 
-void WorkerTargetsUIHandler::UpdateTargets(
+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));
-  scoped_ptr<base::ListValue> list_value(new base::ListValue());
+  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));
     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.Pass());
+
+  SendSerializedTargets(list_value);
 }
 
 // AdbTargetsUIHandler --------------------------------------------------------
 
 class AdbTargetsUIHandler
-    : public DevToolsRemoteTargetsUIHandler,
-      public DevToolsAdbBridge::Listener {
+    : public DevToolsTargetsUIHandler,
+      public DevToolsAndroidBridge::DeviceListListener {
  public:
-  AdbTargetsUIHandler(Callback callback, Profile* profile);
+  AdbTargetsUIHandler(const Callback& callback, Profile* profile);
   virtual ~AdbTargetsUIHandler();
 
   virtual void Open(const std::string& browser_id,
-                    const std::string& url) OVERRIDE;
+                    const std::string& url,
+                    const DevToolsTargetsUIHandler::TargetCallback&) OVERRIDE;
+
+  virtual scoped_refptr<content::DevToolsAgentHost> GetBrowserAgentHost(
+      const std::string& browser_id) OVERRIDE;
 
  private:
-  // DevToolsAdbBridge::Listener overrides.
-  virtual void RemoteDevicesChanged(
-      DevToolsAdbBridge::RemoteDevices* devices) OVERRIDE;
+  // DevToolsAndroidBridge::Listener overrides.
+  virtual void DeviceListChanged(
+      const DevToolsAndroidBridge::RemoteDevices& devices) OVERRIDE;
 
   Profile* profile_;
 
   typedef std::map<std::string,
-      scoped_refptr<DevToolsAdbBridge::RemoteBrowser> > RemoteBrowsers;
+      scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> > RemoteBrowsers;
   RemoteBrowsers remote_browsers_;
 };
 
-AdbTargetsUIHandler::AdbTargetsUIHandler(Callback callback, Profile* profile)
-    : DevToolsRemoteTargetsUIHandler(kTargetSourceAdb, callback),
+AdbTargetsUIHandler::AdbTargetsUIHandler(const Callback& callback,
+                                         Profile* profile)
+    : DevToolsTargetsUIHandler(kTargetSourceRemote, callback),
       profile_(profile) {
-  DevToolsAdbBridge* adb_bridge =
-      DevToolsAdbBridge::Factory::GetForProfile(profile_);
-  if (adb_bridge)
-    adb_bridge->AddListener(this);
+  DevToolsAndroidBridge* android_bridge =
+      DevToolsAndroidBridge::Factory::GetForProfile(profile_);
+  if (android_bridge)
+    android_bridge->AddDeviceListListener(this);
 }
 
 AdbTargetsUIHandler::~AdbTargetsUIHandler() {
-  DevToolsAdbBridge* adb_bridge =
-      DevToolsAdbBridge::Factory::GetForProfile(profile_);
-  if (adb_bridge)
-    adb_bridge->RemoveListener(this);
+  DevToolsAndroidBridge* android_bridge =
+      DevToolsAndroidBridge::Factory::GetForProfile(profile_);
+  if (android_bridge)
+    android_bridge->RemoveDeviceListListener(this);
 }
 
-void AdbTargetsUIHandler::Open(const std::string& browser_id,
-                           const std::string& url) {
+static void CallOnTarget(
+    const DevToolsTargetsUIHandler::TargetCallback& callback,
+    DevToolsAndroidBridge::RemotePage* page) {
+  scoped_ptr<DevToolsAndroidBridge::RemotePage> my_page(page);
+  callback.Run(my_page ? my_page->GetTarget() : NULL);
+}
+
+void AdbTargetsUIHandler::Open(
+    const std::string& browser_id,
+    const std::string& url,
+    const DevToolsTargetsUIHandler::TargetCallback& callback) {
   RemoteBrowsers::iterator it = remote_browsers_.find(browser_id);
   if (it !=  remote_browsers_.end())
-    it->second->Open(url);
+    it->second->Open(url, base::Bind(&CallOnTarget, callback));
 }
 
-void AdbTargetsUIHandler::RemoteDevicesChanged(
-    DevToolsAdbBridge::RemoteDevices* devices) {
-  PortForwardingController* port_forwarding_controller =
-      PortForwardingController::Factory::GetForProfile(profile_);
-  PortForwardingController::DevicesStatus port_forwarding_status;
-  if (port_forwarding_controller)
-    port_forwarding_status =
-        port_forwarding_controller->UpdateDeviceList(*devices);
+scoped_refptr<content::DevToolsAgentHost>
+AdbTargetsUIHandler::GetBrowserAgentHost(
+    const std::string& browser_id) {
+  RemoteBrowsers::iterator it = remote_browsers_.find(browser_id);
+  return it != remote_browsers_.end() ? it->second->GetAgentHost() : NULL;
+}
 
+void AdbTargetsUIHandler::DeviceListChanged(
+    const DevToolsAndroidBridge::RemoteDevices& devices) {
   remote_browsers_.clear();
   STLDeleteValues(&targets_);
 
-  scoped_ptr<base::ListValue> device_list(new base::ListValue());
-  for (DevToolsAdbBridge::RemoteDevices::iterator dit = devices->begin();
-       dit != devices->end(); ++dit) {
-    DevToolsAdbBridge::RemoteDevice* device = dit->get();
+  base::ListValue device_list;
+  for (DevToolsAndroidBridge::RemoteDevices::const_iterator dit =
+      devices.begin(); dit != devices.end(); ++dit) {
+    DevToolsAndroidBridge::RemoteDevice* device = dit->get();
     base::DictionaryValue* device_data = new base::DictionaryValue();
-    device_data->SetString(kAdbModelField, device->GetModel());
-    device_data->SetString(kAdbSerialField, device->GetSerial());
-    device_data->SetBoolean(kAdbConnectedField, device->IsConnected());
+    device_data->SetString(kAdbModelField, device->model());
+    device_data->SetString(kAdbSerialField, device->serial());
+    device_data->SetBoolean(kAdbConnectedField, device->is_connected());
     std::string device_id = base::StringPrintf(
-        "device:%s",
-        device->GetSerial().c_str());
+        kAdbDeviceIdFormat,
+        device->serial().c_str());
     device_data->SetString(kTargetIdField, device_id);
     base::ListValue* browser_list = new base::ListValue();
     device_data->Set(kAdbBrowsersList, browser_list);
 
-    DevToolsAdbBridge::RemoteBrowsers& browsers = device->browsers();
-    for (DevToolsAdbBridge::RemoteBrowsers::iterator bit =
+    DevToolsAndroidBridge::RemoteBrowsers& browsers = device->browsers();
+    for (DevToolsAndroidBridge::RemoteBrowsers::iterator bit =
         browsers.begin(); bit != browsers.end(); ++bit) {
-      DevToolsAdbBridge::RemoteBrowser* browser = bit->get();
+      DevToolsAndroidBridge::RemoteBrowser* browser = bit->get();
       base::DictionaryValue* browser_data = new base::DictionaryValue();
       browser_data->SetString(kAdbBrowserNameField, browser->display_name());
       browser_data->SetString(kAdbBrowserVersionField, browser->version());
-      DevToolsAdbBridge::RemoteBrowser::ParsedVersion parsed =
+      DevToolsAndroidBridge::RemoteBrowser::ParsedVersion parsed =
           browser->GetParsedVersion();
       browser_data->SetInteger(
           kAdbBrowserChromeVersionField,
           browser->IsChrome() && !parsed.empty() ? parsed[0] : 0);
       std::string browser_id = base::StringPrintf(
           "browser:%s:%s:%s:%s",
-          device->GetSerial().c_str(), // Ensure uniqueness across devices.
+          device->serial().c_str(), // Ensure uniqueness across devices.
           browser->display_name().c_str(),  // Sort by display name.
           browser->version().c_str(),  // Then by version.
           browser->socket().c_str());  // Ensure uniqueness on the device.
       browser_data->SetString(kTargetIdField, browser_id);
       browser_data->SetString(kTargetSourceField, source_id());
-      remote_browsers_[browser_id] = browser;
-      base::ListValue* page_list = new base::ListValue();
-      browser_data->Set(kAdbPagesList, page_list);
 
-      DevToolsTargetImpl::List pages = browser->CreatePageTargets();
-      for (DevToolsTargetImpl::List::iterator it =
+      base::Version remote_version;
+      remote_version = base::Version(browser->version());
+
+      chrome::VersionInfo version_info;
+      base::Version local_version(version_info.Version());
+
+      browser_data->SetBoolean(kCompatibleVersion,
+          (!remote_version.IsValid()) || (!local_version.IsValid()) ||
+          remote_version.components()[0] <= local_version.components()[0]);
+
+      base::ListValue* page_list = new base::ListValue();
+      remote_browsers_[browser_id] = browser;
+            browser_data->Set(kAdbPagesList, page_list);
+      std::vector<DevToolsAndroidBridge::RemotePage*> pages =
+          browser->CreatePages();
+      for (std::vector<DevToolsAndroidBridge::RemotePage*>::iterator it =
           pages.begin(); it != pages.end(); ++it) {
-        DevToolsTargetImpl* target =  *it;
+        DevToolsAndroidBridge::RemotePage* page =  *it;
+        DevToolsTargetImpl* target = page->GetTarget();
         base::DictionaryValue* target_data = Serialize(*target);
         target_data->SetBoolean(
             kAdbAttachedForeignField,
             target->IsAttached() &&
-                !DevToolsAdbBridge::HasDevToolsWindow(target->GetId()));
+                !DevToolsAndroidBridge::HasDevToolsWindow(target->GetId()));
         // Pass the screen size in the target object to make sure that
         // the caching logic does not prevent the target item from updating
         // when the screen size changes.
@@ -438,25 +403,9 @@ void AdbTargetsUIHandler::RemoteDevicesChanged(
       browser_list->Append(browser_data);
     }
 
-    if (port_forwarding_controller) {
-      PortForwardingController::DevicesStatus::iterator sit =
-          port_forwarding_status.find(device->GetSerial());
-      if (sit != port_forwarding_status.end()) {
-        base::DictionaryValue* port_status_dict = new base::DictionaryValue();
-        typedef PortForwardingController::PortStatusMap StatusMap;
-        const StatusMap& port_status = sit->second;
-        for (StatusMap::const_iterator it = port_status.begin();
-             it != port_status.end(); ++it) {
-          port_status_dict->SetInteger(
-              base::StringPrintf("%d", it->first), it->second);
-        }
-        device_data->Set(kAdbPortStatus, port_status_dict);
-      }
-    }
-
-    device_list->Append(device_data);
+    device_list.Append(device_data);
   }
-  SendSerializedTargets(device_list.Pass());
+  SendSerializedTargets(device_list);
 }
 
 } // namespace
@@ -465,7 +414,7 @@ void AdbTargetsUIHandler::RemoteDevicesChanged(
 
 DevToolsTargetsUIHandler::DevToolsTargetsUIHandler(
     const std::string& source_id,
-    Callback callback)
+    const Callback& callback)
     : source_id_(source_id),
       callback_(callback) {
 }
@@ -476,77 +425,97 @@ DevToolsTargetsUIHandler::~DevToolsTargetsUIHandler() {
 
 // static
 scoped_ptr<DevToolsTargetsUIHandler>
-DevToolsTargetsUIHandler::CreateForRenderers(
-    DevToolsTargetsUIHandler::Callback callback) {
+DevToolsTargetsUIHandler::CreateForLocal(
+    const DevToolsTargetsUIHandler::Callback& callback) {
   return scoped_ptr<DevToolsTargetsUIHandler>(
-      new RenderViewHostTargetsUIHandler(callback));
+      new LocalTargetsUIHandler(callback));
 }
 
 // static
 scoped_ptr<DevToolsTargetsUIHandler>
-DevToolsTargetsUIHandler::CreateForWorkers(
-    DevToolsTargetsUIHandler::Callback callback) {
+DevToolsTargetsUIHandler::CreateForAdb(
+    const DevToolsTargetsUIHandler::Callback& callback, Profile* profile) {
   return scoped_ptr<DevToolsTargetsUIHandler>(
-      new WorkerTargetsUIHandler(callback));
-}
-
-void DevToolsTargetsUIHandler::Inspect(const std::string& target_id,
-                                            Profile* profile) {
-  TargetMap::iterator it = targets_.find(target_id);
-  if (it != targets_.end())
-    it->second->Inspect(profile);
+      new AdbTargetsUIHandler(callback, profile));
 }
 
-void DevToolsTargetsUIHandler::Activate(const std::string& target_id) {
+DevToolsTargetImpl* DevToolsTargetsUIHandler::GetTarget(
+    const std::string& target_id) {
   TargetMap::iterator it = targets_.find(target_id);
   if (it != targets_.end())
-    it->second->Activate();
+    return it->second;
+  return NULL;
 }
 
-void DevToolsTargetsUIHandler::Close(const std::string& target_id) {
-  TargetMap::iterator it = targets_.find(target_id);
-  if (it != targets_.end())
-    it->second->Close();
+void DevToolsTargetsUIHandler::Open(const std::string& browser_id,
+                                    const std::string& url,
+                                    const TargetCallback& callback) {
+  callback.Run(NULL);
 }
 
-void DevToolsTargetsUIHandler::Reload(const std::string& target_id) {
-  TargetMap::iterator it = targets_.find(target_id);
-  if (it != targets_.end())
-    it->second->Reload();
+scoped_refptr<content::DevToolsAgentHost>
+DevToolsTargetsUIHandler::GetBrowserAgentHost(const std::string& browser_id) {
+  return NULL;
 }
 
-base::DictionaryValue*
-DevToolsTargetsUIHandler::Serialize(
+base::DictionaryValue* DevToolsTargetsUIHandler::Serialize(
     const DevToolsTargetImpl& target) {
   base::DictionaryValue* target_data = new base::DictionaryValue();
   target_data->SetString(kTargetSourceField, source_id_);
   target_data->SetString(kTargetIdField, target.GetId());
   target_data->SetString(kTargetTypeField, target.GetType());
   target_data->SetBoolean(kAttachedField, target.IsAttached());
-  target_data->SetString(kUrlField, target.GetUrl().spec());
+  target_data->SetString(kUrlField, target.GetURL().spec());
   target_data->SetString(kNameField, net::EscapeForHTML(target.GetTitle()));
-  target_data->SetString(kFaviconUrlField, target.GetFaviconUrl().spec());
+  target_data->SetString(kFaviconUrlField, target.GetFaviconURL().spec());
   target_data->SetString(kDescriptionField, target.GetDescription());
   return target_data;
 }
 
 void DevToolsTargetsUIHandler::SendSerializedTargets(
-    scoped_ptr<base::ListValue> list) {
-  callback_.Run(source_id_, list.Pass());
+    const base::ListValue& list) {
+  callback_.Run(source_id_, list);
+}
+
+void DevToolsTargetsUIHandler::ForceUpdate() {
 }
 
-// DevToolsRemoteTargetsUIHandler ---------------------------------------------
+// PortForwardingStatusSerializer ---------------------------------------------
 
-DevToolsRemoteTargetsUIHandler::DevToolsRemoteTargetsUIHandler(
-    const std::string& source_id,
-    Callback callback)
-    : DevToolsTargetsUIHandler(source_id, callback) {
+PortForwardingStatusSerializer::PortForwardingStatusSerializer(
+    const Callback& callback, Profile* profile)
+      : callback_(callback),
+        profile_(profile) {
+  DevToolsAndroidBridge* android_bridge =
+      DevToolsAndroidBridge::Factory::GetForProfile(profile_);
+  if (android_bridge)
+    android_bridge->AddPortForwardingListener(this);
 }
 
-// static
-scoped_ptr<DevToolsRemoteTargetsUIHandler>
-DevToolsRemoteTargetsUIHandler::CreateForAdb(
-    DevToolsTargetsUIHandler::Callback callback, Profile* profile) {
-  return scoped_ptr<DevToolsRemoteTargetsUIHandler>(
-      new AdbTargetsUIHandler(callback, profile));
+PortForwardingStatusSerializer::~PortForwardingStatusSerializer() {
+  DevToolsAndroidBridge* android_bridge =
+      DevToolsAndroidBridge::Factory::GetForProfile(profile_);
+  if (android_bridge)
+    android_bridge->RemovePortForwardingListener(this);
+}
+
+void PortForwardingStatusSerializer::PortStatusChanged(
+    const DevicesStatus& status) {
+  base::DictionaryValue result;
+  for (DevicesStatus::const_iterator sit = status.begin();
+      sit != status.end(); ++sit) {
+    base::DictionaryValue* device_status_dict = new base::DictionaryValue();
+    const PortStatusMap& device_status_map = sit->second;
+    for (PortStatusMap::const_iterator it = device_status_map.begin();
+         it != device_status_map.end(); ++it) {
+      device_status_dict->SetInteger(
+          base::StringPrintf("%d", it->first), it->second);
+    }
+
+    std::string device_id = base::StringPrintf(
+        kAdbDeviceIdFormat,
+        sit->first.c_str());
+    result.Set(device_id, device_status_dict);
+  }
+  callback_.Run(result);
 }