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

Unified Diff: content/browser/devtools/devtools_http_handler_impl.cc

Issue 12319114: Extract debugger target enumeration into a separate class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@debugger
Patch Set: Fixed compile Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
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..7d4800cbb1dcb032c7c6ccc0b4b336753ddd4fa0 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"
@@ -58,43 +49,23 @@ namespace {
static const char* kDevToolsHandlerThreadName = "Chrome_DevToolsHandlerThread";
+static const char* kThumbUrlPrefix = "/thumb/";
+
class DevToolsDefaultBindingHandler
: public DevToolsHttpHandler::DevToolsAgentHostBinding {
public:
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->GetId();
}
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 +127,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
@@ -307,15 +296,20 @@ void DevToolsHttpHandlerImpl::OnHttpRequest(
return;
}
- if (info.path.find("/thumb/") == 0) {
+ if (info.path.find(kThumbUrlPrefix) == 0) {
// Thumbnail request.
+ const std::string target_id = info.path.substr(strlen(kThumbUrlPrefix));
+ DevToolsAgentHost* agent_host = binding_->ForIdentifier(target_id);
+ GURL page_url;
+ if (agent_host)
+ page_url = agent_host->GetUrl();
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
base::Bind(&DevToolsHttpHandlerImpl::OnThumbnailRequestUI,
this,
connection_id,
- info));
+ page_url));
return;
}
@@ -394,55 +388,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 +471,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();
pfeldman 2013/03/05 12:06:41 This should be its private detail.
Vladislav Kaznacheev 2013/03/05 13:35:44 Moved into begin() On 2013/03/05 12:06:41, pfeldma
+ for (DevToolsTargetList::AgentsMap::iterator it = target_list->begin();
+ it != target_list->end(); ++it) {
+ DevToolsAgentHost* agent_host = it->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 +502,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;
}
@@ -587,17 +542,8 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
}
void DevToolsHttpHandlerImpl::OnThumbnailRequestUI(
- int connection_id,
- const net::HttpServerRequestInfo& info) {
- std::string prefix = "/thumb/";
- size_t pos = info.path.find(prefix);
- if (pos != 0) {
- Send404(connection_id);
- return;
- }
-
- std::string page_url = info.path.substr(prefix.length());
- std::string data = delegate_->GetPageThumbnailData(GURL(page_url));
+ int connection_id, const GURL& page_url) {
+ std::string data = delegate_->GetPageThumbnailData(page_url);
if (!data.empty())
Send200(connection_id, data, "image/png");
else
@@ -837,59 +783,30 @@ 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->GetTitle());
+ dictionary->SetString("url", agent_host->GetUrl().spec());
+ switch (delegate_->GetTargetType(agent_host->GetRenderViewHost())) {
case DevToolsHttpHandlerDelegate::kTargetTypeTab:
- page_info.type = "page";
+ dictionary->SetString("type", "page");
break;
default:
- page_info.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();
- }
+ dictionary->SetString("type", "other");
}
- 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);
+ dictionary->SetString("thumbnailUrl", std::string(kThumbUrlPrefix) + id);
+ dictionary->SetString("faviconUrl", agent_host->GetFaviconUrl().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);
}

Powered by Google App Engine
This is Rietveld 408576698