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

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

Issue 11033046: DevTools: [remote debugging] introduce json/new and json/close for creating and closing the tabs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review comments addressed Created 8 years, 2 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/debugger/devtools_http_handler_impl.cc
diff --git a/content/browser/debugger/devtools_http_handler_impl.cc b/content/browser/debugger/devtools_http_handler_impl.cc
index 0cfd50fa21c1ad672ae5c0afaa223191dcc71258..70c0bf33b7b0996b100886ed9c8de6c5174c36b5 100644
--- a/content/browser/debugger/devtools_http_handler_impl.cc
+++ b/content/browser/debugger/devtools_http_handler_impl.cc
@@ -218,6 +218,30 @@ static std::string GetMimeType(const std::string& filename) {
void DevToolsHttpHandlerImpl::OnHttpRequest(
int connection_id,
const net::HttpServerRequestInfo& info) {
+ if (info.path.find("/json/new") == 0) {
+ // New page request.
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&DevToolsHttpHandlerImpl::OnNewTargetRequestUI,
+ this,
+ connection_id,
+ info));
+ return;
+ }
+
+ if (info.path.find("/json/close/") == 0) {
+ // Close page request.
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&DevToolsHttpHandlerImpl::OnCloseTargetRequestUI,
+ this,
+ connection_id,
+ info));
+ return;
+ }
+
if (info.path.find("/json") == 0) {
// Pages discovery json request.
BrowserThread::PostTask(
@@ -228,7 +252,9 @@ void DevToolsHttpHandlerImpl::OnHttpRequest(
connection_id,
info));
return;
- } else if (info.path.find("/thumb/") == 0) {
+ }
+
+ if (info.path.find("/thumb/") == 0) {
// Thumbnail request.
BrowserThread::PostTask(
BrowserThread::UI,
@@ -352,31 +378,7 @@ DevToolsHttpHandlerImpl::PageList DevToolsHttpHandlerImpl::GeneratePageList() {
RenderViewHost* host =
RenderViewHost::From(const_cast<RenderWidgetHost*>(widget));
- content::RenderViewHostDelegate* host_delegate = host->GetDelegate();
-
- DevToolsAgentHost* agent =
- DevToolsAgentHostRegistry::GetDevToolsAgentHost(host);
- DevToolsClientHost* client_host = DevToolsManager::GetInstance()->
- GetDevToolsClientHostFor(agent);
- PageInfo page_info;
- page_info.id = binding_->GetIdentifier(host);
- page_info.attached = client_host != NULL;
- page_info.url = host_delegate->GetURL().spec();
-
- 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();
- }
- }
- page_list.push_back(page_info);
+ page_list.push_back(CreatePageInfo(host));
}
}
std::sort(page_list.begin(), page_list.end(), SortPageListByTime);
@@ -400,39 +402,38 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
PageList page_list = GeneratePageList();
ListValue json_pages_list;
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);
- page_info->SetString("url", i->url);
- page_info->SetString("thumbnailUrl", i->thumbnail_url);
- page_info->SetString("faviconUrl", i->favicon_url);
- if (!i->attached) {
- page_info->SetString("webSocketDebuggerUrl",
- base::StringPrintf("ws://%s/devtools/page/%s",
- host.c_str(),
- i->id.c_str()));
- std::string devtools_frontend_url = GetFrontendURLInternal(i->id.c_str(),
- host);
- page_info->SetString("devtoolsFrontendUrl", devtools_frontend_url);
- }
- }
+ for (PageList::iterator i = page_list.begin(); i != page_list.end(); ++i)
+ json_pages_list.Append(SerializePageInfo(*i, host));
+ SendJson(connection_id, info, json_pages_list);
+}
- std::string response;
- base::JSONWriter::WriteWithOptions(&json_pages_list,
- base::JSONWriter::OPTIONS_PRETTY_PRINT,
- &response);
+void DevToolsHttpHandlerImpl::OnNewTargetRequestUI(
+ int connection_id,
+ const net::HttpServerRequestInfo& info) {
+ RenderViewHost* rvh = delegate_->CreateNewTarget();
+ if (!rvh) {
+ Send500(connection_id, "Could not create new page");
+ return;
+ }
+ PageInfo page_info = CreatePageInfo(rvh);
+ std::string host = info.headers["Host"];
+ scoped_ptr<DictionaryValue> dictionary(SerializePageInfo(page_info, host));
+ SendJson(connection_id, info, *dictionary);
+}
- size_t jsonp_pos = info.path.find("?jsonp=");
- if (jsonp_pos == std::string::npos) {
- Send200(connection_id, response, "application/json; charset=UTF-8");
+void DevToolsHttpHandlerImpl::OnCloseTargetRequestUI(
+ int connection_id,
+ const net::HttpServerRequestInfo& info) {
+ std::string prefix = "/json/close/";
+ std::string page_id = info.path.substr(prefix.length());
+ RenderViewHost* rvh = binding_->ForIdentifier(page_id);
+ if (!rvh) {
+ Send500(connection_id, "No such target id: " + page_id);
return;
}
- std::string jsonp = info.path.substr(jsonp_pos + 7);
- response = StringPrintf("%s(%s);", jsonp.c_str(), response.c_str());
- Send200(connection_id, response, "text/javascript; charset=UTF-8");
+ rvh->ClosePage();
+ Send200(connection_id, "Target is closing");
}
void DevToolsHttpHandlerImpl::OnThumbnailRequestUI(
@@ -547,8 +548,8 @@ void DevToolsHttpHandlerImpl::TeardownAndRelease() {
}
void DevToolsHttpHandlerImpl::Send200(int connection_id,
- const std::string& data,
- const std::string& mime_type) {
+ const std::string& data,
+ const std::string& mime_type) {
thread_->message_loop()->PostTask(
FROM_HERE,
base::Bind(&net::HttpServer::Send200,
@@ -558,6 +559,25 @@ void DevToolsHttpHandlerImpl::Send200(int connection_id,
mime_type));
}
+void DevToolsHttpHandlerImpl::SendJson(int connection_id,
+ const net::HttpServerRequestInfo& info,
+ const Value& value) {
+ std::string response;
+ base::JSONWriter::WriteWithOptions(&value,
+ base::JSONWriter::OPTIONS_PRETTY_PRINT,
+ &response);
+
+ size_t jsonp_pos = info.path.find("?jsonp=");
+ if (jsonp_pos == std::string::npos) {
+ Send200(connection_id, response, "application/json; charset=UTF-8");
+ return;
+ }
+
+ std::string jsonp = info.path.substr(jsonp_pos + 7);
+ response = StringPrintf("%s(%s);", jsonp.c_str(), response.c_str());
+ Send200(connection_id, response, "text/javascript; charset=UTF-8");
+}
+
void DevToolsHttpHandlerImpl::Send404(int connection_id) {
thread_->message_loop()->PostTask(
FROM_HERE,
@@ -581,4 +601,54 @@ void DevToolsHttpHandlerImpl::AcceptWebSocket(
connection_id, request));
}
+DevToolsHttpHandlerImpl::PageInfo
+DevToolsHttpHandlerImpl::CreatePageInfo(RenderViewHost* rvh)
+{
+ content::RenderViewHostDelegate* host_delegate = rvh->GetDelegate();
+ DevToolsAgentHost* agent =
+ DevToolsAgentHostRegistry::GetDevToolsAgentHost(rvh);
+ DevToolsClientHost* client_host = DevToolsManager::GetInstance()->
+ GetDevToolsClientHostFor(agent);
+ PageInfo page_info;
+ page_info.id = binding_->GetIdentifier(rvh);
+ page_info.attached = client_host != NULL;
+ page_info.url = host_delegate->GetURL().spec();
+
+ 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;
+}
+
+DictionaryValue* DevToolsHttpHandlerImpl::SerializePageInfo(
+ const PageInfo& page_info,
+ const std::string& host) {
+ DictionaryValue* dictionary = new DictionaryValue;
+ dictionary->SetString("title", page_info.title);
+ dictionary->SetString("url", page_info.url);
+ dictionary->SetString("thumbnailUrl", page_info.thumbnail_url);
+ dictionary->SetString("faviconUrl", page_info.favicon_url);
+ if (!page_info.attached) {
+ dictionary->SetString("webSocketDebuggerUrl",
+ base::StringPrintf("ws://%s/devtools/page/%s",
+ host.c_str(),
+ page_info.id.c_str()));
+ std::string devtools_frontend_url = GetFrontendURLInternal(
+ page_info.id.c_str(),
+ host);
+ dictionary->SetString("devtoolsFrontendUrl", devtools_frontend_url);
+ }
+ return dictionary;
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698