| Index: content/browser/debugger/devtools_http_handler_impl.cc
|
| ===================================================================
|
| --- content/browser/debugger/devtools_http_handler_impl.cc (revision 133927)
|
| +++ content/browser/debugger/devtools_http_handler_impl.cc (working copy)
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "content/browser/debugger/devtools_http_handler_impl.h"
|
|
|
| +#include <algorithm>
|
| #include <utility>
|
|
|
| #include "base/bind.h"
|
| @@ -44,6 +45,37 @@
|
|
|
| namespace {
|
|
|
| +class DevToolsDefaultBindingHandler
|
| + : public DevToolsHttpHandler::RenderViewHostBinding {
|
| + public:
|
| + DevToolsDefaultBindingHandler() {
|
| + }
|
| +
|
| + virtual std::string GetIdentifier(RenderViewHost* rvh) OVERRIDE {
|
| + int process_id = rvh->GetProcess()->GetID();
|
| + int routing_id = rvh->GetRoutingID();
|
| + return base::StringPrintf("%d_%d", process_id, routing_id);
|
| + }
|
| +
|
| + virtual RenderViewHost* ForIdentifier(
|
| + const std::string& identifier) OVERRIDE {
|
| + size_t pos = identifier.find("_");
|
| + if (pos == std::string::npos)
|
| + return NULL;
|
| +
|
| + int process_id;
|
| + if (!base::StringToInt(identifier.substr(0, pos), &process_id))
|
| + return NULL;
|
| +
|
| + int routing_id;
|
| + if (!base::StringToInt(identifier.substr(pos+1), &routing_id))
|
| + return NULL;
|
| +
|
| + return RenderViewHost::FromID(process_id, routing_id);
|
| + }
|
| +};
|
| +
|
| +
|
| // An internal implementation of DevToolsClientHost that delegates
|
| // messages sent for DevToolsClient to a DebuggerShell instance.
|
| class DevToolsClientHostImpl : public DevToolsClientHost {
|
| @@ -128,6 +160,14 @@
|
| base::Bind(&DevToolsHttpHandlerImpl::TeardownAndRelease, this));
|
| }
|
|
|
| +void DevToolsHttpHandlerImpl::SetRenderViewHostBinding(
|
| + RenderViewHostBinding* binding) {
|
| + if (binding)
|
| + binding_ = binding;
|
| + else
|
| + binding_ = default_binding_.get();
|
| +}
|
| +
|
| static std::string PathWithoutParams(const std::string& path) {
|
| size_t query_position = path.find("?");
|
| if (query_position != std::string::npos)
|
| @@ -262,14 +302,12 @@
|
| connection_id));
|
| }
|
|
|
| -struct DevToolsHttpHandlerImpl::PageInfo
|
| -{
|
| +struct DevToolsHttpHandlerImpl::PageInfo {
|
| PageInfo()
|
| - : id(0),
|
| - attached(false) {
|
| + : attached(false) {
|
| }
|
|
|
| - int id;
|
| + std::string id;
|
| std::string url;
|
| bool attached;
|
| std::string title;
|
| @@ -285,7 +323,6 @@
|
| }
|
|
|
| DevToolsHttpHandlerImpl::PageList DevToolsHttpHandlerImpl::GeneratePageList() {
|
| - ResetRenderViewHostBinding();
|
| PageList page_list;
|
| for (RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
|
| !it.IsAtEnd(); it.Advance()) {
|
| @@ -313,7 +350,7 @@
|
| DevToolsClientHost* client_host = DevToolsManager::GetInstance()->
|
| GetDevToolsClientHostFor(agent);
|
| PageInfo page_info;
|
| - page_info.id = BindRenderViewHost(host);
|
| + page_info.id = binding_->GetIdentifier(host);
|
| page_info.attached = client_host != NULL;
|
| page_info.url = host_delegate->GetURL().spec();
|
|
|
| @@ -345,7 +382,6 @@
|
| std::string host = info.headers["Host"];
|
| for (PageList::iterator i = page_list.begin();
|
| i != page_list.end(); ++i) {
|
| -
|
| DictionaryValue* page_info = new DictionaryValue;
|
| json_pages_list.Append(page_info);
|
| page_info->SetString("title", i->title);
|
| @@ -354,15 +390,15 @@
|
| page_info->SetString("faviconUrl", i->favicon_url);
|
| if (!i->attached) {
|
| page_info->SetString("webSocketDebuggerUrl",
|
| - base::StringPrintf("ws://%s/devtools/page/%d",
|
| + base::StringPrintf("ws://%s/devtools/page/%s",
|
| host.c_str(),
|
| - i->id));
|
| + i->id.c_str()));
|
| std::string devtools_frontend_url = base::StringPrintf(
|
| - "%s%sws=%s/devtools/page/%d",
|
| + "%s%sws=%s/devtools/page/%s",
|
| overridden_frontend_url_.c_str(),
|
| overridden_frontend_url_.find("?") == std::string::npos ? "?" : "&",
|
| host.c_str(),
|
| - i->id);
|
| + i->id.c_str());
|
| page_info->SetString("devtoolsFrontendUrl", devtools_frontend_url);
|
| }
|
| }
|
| @@ -383,14 +419,9 @@
|
| Send404(connection_id);
|
| return;
|
| }
|
| +
|
| std::string page_id = request.path.substr(prefix.length());
|
| - int id = 0;
|
| - if (!base::StringToInt(page_id, &id)) {
|
| - Send500(connection_id, "Invalid page id: " + page_id);
|
| - return;
|
| - }
|
| -
|
| - RenderViewHost* rvh = GetBoundRenderViewHost(id);
|
| + RenderViewHost* rvh = binding_->ForIdentifier(page_id);
|
| if (!rvh) {
|
| Send500(connection_id, "No such target id: " + page_id);
|
| return;
|
| @@ -510,6 +541,9 @@
|
| if (overridden_frontend_url_.empty())
|
| overridden_frontend_url_ = "/devtools/devtools.html";
|
|
|
| + default_binding_.reset(new DevToolsDefaultBindingHandler);
|
| + binding_ = default_binding_.get();
|
| +
|
| AddRef();
|
| }
|
|
|
| @@ -589,20 +623,4 @@
|
| connection_id, request));
|
| }
|
|
|
| -size_t DevToolsHttpHandlerImpl::BindRenderViewHost(RenderViewHost* rvh) {
|
| - Target target = std::make_pair(rvh->GetProcess()->GetID(),
|
| - rvh->GetRoutingID());
|
| - targets_.push_back(target);
|
| - return targets_.size() - 1;
|
| -}
|
| -
|
| -RenderViewHost* DevToolsHttpHandlerImpl::GetBoundRenderViewHost(size_t id) {
|
| - return RenderViewHost::FromID(targets_[id].first,
|
| - targets_[id].second);
|
| -}
|
| -
|
| -void DevToolsHttpHandlerImpl::ResetRenderViewHostBinding() {
|
| - targets_.clear();
|
| -}
|
| -
|
| } // namespace content
|
|
|