| Index: content/browser/devtools/devtools_http_handler_impl.cc
|
| diff --git a/content/browser/devtools/devtools_http_handler_impl.cc b/content/browser/devtools/devtools_http_handler_impl.cc
|
| index 665d01f9cfe6dbdcb2b36fe61406819b961eb5c6..d8c36220de402057361c1980c77b2f9c5904459b 100644
|
| --- a/content/browser/devtools/devtools_http_handler_impl.cc
|
| +++ b/content/browser/devtools/devtools_http_handler_impl.cc
|
| @@ -15,11 +15,7 @@
|
| #include "base/logging.h"
|
| #include "base/message_loop_proxy.h"
|
| #include "base/string_number_conversions.h"
|
| -#include "base/stringprintf.h"
|
| #include "base/threading/thread.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "base/values.h"
|
| -#include "content/browser/devtools/devtools_agent_host_impl.h"
|
| #include "content/browser/devtools/devtools_browser_target.h"
|
| #include "content/browser/devtools/devtools_tracing_handler.h"
|
| #include "content/browser/web_contents/web_contents_impl.h"
|
| @@ -27,20 +23,15 @@
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/devtools_agent_host.h"
|
| #include "content/public/browser/devtools_client_host.h"
|
| -#include "content/public/browser/devtools_http_handler_delegate.h"
|
| #include "content/public/browser/devtools_manager.h"
|
| -#include "content/public/browser/favicon_status.h"
|
| -#include "content/public/browser/navigation_entry.h"
|
| +#include "content/public/browser/devtools_target_list.h"
|
| #include "content/public/browser/notification_service.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/render_widget_host.h"
|
| #include "content/public/common/content_client.h"
|
| #include "content/public/common/url_constants.h"
|
| #include "googleurl/src/gurl.h"
|
| #include "grit/devtools_resources_map.h"
|
| -#include "net/base/escape.h"
|
| #include "net/base/io_buffer.h"
|
| #include "net/base/ip_endpoint.h"
|
| #include "net/server/http_server_request_info.h"
|
| @@ -64,37 +55,15 @@ class DevToolsDefaultBindingHandler
|
| DevToolsDefaultBindingHandler() {
|
| }
|
|
|
| - void GarbageCollect() {
|
| - AgentsMap::iterator it = agents_map_.begin();
|
| - while (it != agents_map_.end()) {
|
| - if (!it->second->GetRenderViewHost())
|
| - agents_map_.erase(it++);
|
| - else
|
| - ++it;
|
| - }
|
| - }
|
| -
|
| virtual std::string GetIdentifier(DevToolsAgentHost* agent_host) OVERRIDE {
|
| - GarbageCollect();
|
| - DevToolsAgentHostImpl* agent_host_impl =
|
| - static_cast<DevToolsAgentHostImpl*>(agent_host);
|
| - std::string id = base::StringPrintf("%d", agent_host_impl->id());
|
| - agents_map_[id] = agent_host;
|
| - return id;
|
| + DevToolsTargetList::GetInstance()->Register(agent_host);
|
| + return agent_host->id();
|
| }
|
|
|
| virtual DevToolsAgentHost* ForIdentifier(
|
| const std::string& identifier) OVERRIDE {
|
| - GarbageCollect();
|
| - AgentsMap::iterator it = agents_map_.find(identifier);
|
| - if (it != agents_map_.end())
|
| - return it->second;
|
| - return NULL;
|
| + return DevToolsTargetList::GetInstance()->Lookup(identifier);
|
| }
|
| -
|
| - private:
|
| - typedef std::map<std::string, scoped_refptr<DevToolsAgentHost> > AgentsMap;
|
| - AgentsMap agents_map_;
|
| };
|
|
|
| // An internal implementation of DevToolsClientHost that delegates
|
| @@ -156,6 +125,24 @@ class DevToolsClientHostImpl : public DevToolsClientHost {
|
| std::string detach_reason_;
|
| };
|
|
|
| +static base::TimeTicks GetLastSelectedTime(DevToolsAgentHost* agent) {
|
| + RenderViewHost* rvh = agent->GetRenderViewHost();
|
| + if (!rvh)
|
| + return base::TimeTicks();
|
| +
|
| + WebContents* web_contents = rvh->GetDelegate()->GetAsWebContents();
|
| + if (!web_contents)
|
| + return base::TimeTicks();
|
| +
|
| + return web_contents->GetLastSelectedTime();
|
| +}
|
| +
|
| +typedef std::pair<DevToolsAgentHost*, base::TimeTicks> PageInfo;
|
| +
|
| +static bool TimeComparator(const PageInfo& info1, const PageInfo& info2) {
|
| + return info1.second > info2.second;
|
| +}
|
| +
|
| } // namespace
|
|
|
| // static
|
| @@ -394,55 +381,6 @@ void DevToolsHttpHandlerImpl::OnClose(int connection_id) {
|
| connection_id));
|
| }
|
|
|
| -struct DevToolsHttpHandlerImpl::PageInfo {
|
| - PageInfo()
|
| - : attached(false) {
|
| - }
|
| -
|
| - std::string id;
|
| - std::string url;
|
| - std::string type;
|
| - bool attached;
|
| - std::string title;
|
| - std::string thumbnail_url;
|
| - std::string favicon_url;
|
| - base::TimeTicks last_selected_time;
|
| -};
|
| -
|
| -// static
|
| -bool DevToolsHttpHandlerImpl::SortPageListByTime(const PageInfo& info1,
|
| - const PageInfo& info2) {
|
| - return info1.last_selected_time > info2.last_selected_time;
|
| -}
|
| -
|
| -DevToolsHttpHandlerImpl::PageList DevToolsHttpHandlerImpl::GeneratePageList() {
|
| - PageList page_list;
|
| - for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
|
| - !it.IsAtEnd(); it.Advance()) {
|
| - RenderProcessHost* render_process_host = it.GetCurrentValue();
|
| - DCHECK(render_process_host);
|
| -
|
| - // Ignore processes that don't have a connection, such as crashed contents.
|
| - if (!render_process_host->HasConnection())
|
| - continue;
|
| -
|
| - RenderProcessHost::RenderWidgetHostsIterator rwit(
|
| - render_process_host->GetRenderWidgetHostsIterator());
|
| - for (; !rwit.IsAtEnd(); rwit.Advance()) {
|
| - const RenderWidgetHost* widget = rwit.GetCurrentValue();
|
| - DCHECK(widget);
|
| - if (!widget || !widget->IsRenderView())
|
| - continue;
|
| -
|
| - RenderViewHost* host =
|
| - RenderViewHost::From(const_cast<RenderWidgetHost*>(widget));
|
| - page_list.push_back(CreatePageInfo(host, delegate_->GetTargetType(host)));
|
| - }
|
| - }
|
| - std::sort(page_list.begin(), page_list.end(), SortPageListByTime);
|
| - return page_list;
|
| -}
|
| -
|
| std::string DevToolsHttpHandlerImpl::GetFrontendURLInternal(
|
| const std::string rvh_id,
|
| const std::string& host) {
|
| @@ -526,11 +464,23 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
|
| }
|
|
|
| if (command == "list") {
|
| - PageList page_list = GeneratePageList();
|
| + typedef std::vector<PageInfo> PageList;
|
| + PageList page_list;
|
| +
|
| + DevToolsTargetList* target_list = DevToolsTargetList::GetInstance();
|
| + target_list->Refresh();
|
| + for (DevToolsTargetList::AgentsMap::iterator i = target_list->begin();
|
| + i != target_list->end(); ++i) {
|
| + DevToolsAgentHost* agent_host = i->second;
|
| + page_list.push_back(
|
| + PageInfo(agent_host, GetLastSelectedTime(agent_host)));
|
| + }
|
| + std::sort(page_list.begin(), page_list.end(), TimeComparator);
|
| +
|
| base::ListValue json_pages_list;
|
| std::string host = info.headers["Host"];
|
| for (PageList::iterator i = page_list.begin(); i != page_list.end(); ++i)
|
| - json_pages_list.Append(SerializePageInfo(*i, host));
|
| + json_pages_list.Append(SerializePageInfo(i->first, host));
|
| SendJson(connection_id, net::HTTP_OK, &json_pages_list, "", jsonp);
|
| return;
|
| }
|
| @@ -545,11 +495,9 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
|
| jsonp);
|
| return;
|
| }
|
| - PageInfo page_info =
|
| - CreatePageInfo(rvh, DevToolsHttpHandlerDelegate::kTargetTypeTab);
|
| std::string host = info.headers["Host"];
|
| scoped_ptr<base::DictionaryValue> dictionary(
|
| - SerializePageInfo(page_info, host));
|
| + SerializePageInfo(DevToolsAgentHost::GetFor(rvh), host));
|
| SendJson(connection_id, net::HTTP_OK, dictionary.get(), "", jsonp);
|
| return;
|
| }
|
| @@ -837,59 +785,32 @@ void DevToolsHttpHandlerImpl::AcceptWebSocket(
|
| connection_id, request));
|
| }
|
|
|
| -DevToolsHttpHandlerImpl::PageInfo
|
| -DevToolsHttpHandlerImpl::CreatePageInfo(RenderViewHost* rvh,
|
| - DevToolsHttpHandlerDelegate::TargetType type) {
|
| - RenderViewHostDelegate* host_delegate = rvh->GetDelegate();
|
| - scoped_refptr<DevToolsAgentHost> agent(DevToolsAgentHost::GetFor(rvh));
|
| - DevToolsClientHost* client_host = DevToolsManager::GetInstance()->
|
| - GetDevToolsClientHostFor(agent);
|
| - PageInfo page_info;
|
| - page_info.id = binding_->GetIdentifier(agent);
|
| - page_info.attached = client_host != NULL;
|
| - page_info.url = host_delegate->GetURL().spec();
|
| -
|
| - switch (type) {
|
| +base::DictionaryValue* DevToolsHttpHandlerImpl::SerializePageInfo(
|
| + DevToolsAgentHost* agent_host,
|
| + const std::string& host) {
|
| + base::DictionaryValue* dictionary = new base::DictionaryValue;
|
| + dictionary->SetString("title", agent_host->title());
|
| + dictionary->SetString("url", agent_host->url().spec());
|
| + switch (delegate_->GetTargetType(agent_host->GetRenderViewHost())) {
|
| case DevToolsHttpHandlerDelegate::kTargetTypeTab:
|
| - page_info.type = "page";
|
| + dictionary->SetString("type", "page");
|
| break;
|
| default:
|
| - page_info.type = "other";
|
| + dictionary->SetString("type", "other");
|
| }
|
| -
|
| - WebContents* web_contents = host_delegate->GetAsWebContents();
|
| - if (web_contents) {
|
| - page_info.title = UTF16ToUTF8(
|
| - net::EscapeForHTML(web_contents->GetTitle()));
|
| - page_info.last_selected_time = web_contents->GetLastSelectedTime();
|
| -
|
| - NavigationController& controller = web_contents->GetController();
|
| - NavigationEntry* entry = controller.GetActiveEntry();
|
| - if (entry != NULL && entry->GetURL().is_valid()) {
|
| - page_info.thumbnail_url = "/thumb/" + entry->GetURL().spec();
|
| - page_info.favicon_url = entry->GetFavicon().url.spec();
|
| - }
|
| - }
|
| - return page_info;
|
| -}
|
| -
|
| -base::DictionaryValue* DevToolsHttpHandlerImpl::SerializePageInfo(
|
| - const PageInfo& page_info,
|
| - const std::string& host) {
|
| - base::DictionaryValue* dictionary = new base::DictionaryValue;
|
| - dictionary->SetString("title", page_info.title);
|
| - dictionary->SetString("url", page_info.url);
|
| - dictionary->SetString("type", page_info.type);
|
| - dictionary->SetString("id", page_info.id);
|
| - dictionary->SetString("thumbnailUrl", page_info.thumbnail_url);
|
| - dictionary->SetString("faviconUrl", page_info.favicon_url);
|
| - if (!page_info.attached) {
|
| + std::string id = binding_->GetIdentifier(agent_host);
|
| + dictionary->SetString("id", id);
|
| + const GURL thumbnail_url = agent_host->thumbnail_url();
|
| + dictionary->SetString("thumbnailUrl",
|
| + std::string("/") + thumbnail_url.host() + thumbnail_url.path());
|
| + dictionary->SetString("faviconUrl", agent_host->favicon_url().spec());
|
| + if (!DevToolsManager::GetInstance()->GetDevToolsClientHostFor(agent_host)) {
|
| dictionary->SetString("webSocketDebuggerUrl",
|
| base::StringPrintf("ws://%s/devtools/page/%s",
|
| host.c_str(),
|
| - page_info.id.c_str()));
|
| + id.c_str()));
|
| std::string devtools_frontend_url = GetFrontendURLInternal(
|
| - page_info.id.c_str(),
|
| + id.c_str(),
|
| host);
|
| dictionary->SetString("devtoolsFrontendUrl", devtools_frontend_url);
|
| }
|
|
|