Chromium Code Reviews| Index: content/shell/browser/shell_devtools_frontend.cc |
| diff --git a/content/shell/browser/shell_devtools_frontend.cc b/content/shell/browser/shell_devtools_frontend.cc |
| index a6bead64ffbe3ae8ddf232723c8ef1e70c7e4117..36455eeebf752cd7b624cd649971ca5c6117e687 100644 |
| --- a/content/shell/browser/shell_devtools_frontend.cc |
| +++ b/content/shell/browser/shell_devtools_frontend.cc |
| @@ -23,6 +23,8 @@ |
| #include "content/shell/browser/webkit_test_controller.h" |
| #include "content/shell/common/shell_switches.h" |
| #include "net/base/filename_util.h" |
| +#include "net/http/http_response_headers.h" |
| +#include "net/url_request/url_fetcher.h" |
| namespace content { |
| @@ -111,7 +113,6 @@ void ShellDevToolsFrontend::HandleMessageFromDevToolsFrontend( |
| if (!agent_host_) |
| return; |
| std::string method; |
| - int id = 0; |
| base::ListValue* params = NULL; |
| base::DictionaryValue* dict = NULL; |
| scoped_ptr<base::Value> parsed_message(base::JSONReader::Read(message)); |
| @@ -120,6 +121,8 @@ void ShellDevToolsFrontend::HandleMessageFromDevToolsFrontend( |
| !dict->GetString("method", &method)) { |
| return; |
| } |
| + int id = 0; |
| + dict->GetInteger("id", &id); |
| dict->GetList("params", ¶ms); |
| std::string browser_message; |
| @@ -129,11 +132,35 @@ void ShellDevToolsFrontend::HandleMessageFromDevToolsFrontend( |
| } else if (method == "loadCompleted") { |
| web_contents()->GetMainFrame()->ExecuteJavaScript( |
| base::ASCIIToUTF16("DevToolsAPI.setUseSoftMenu(true);")); |
| + } else if (method == "loadNetworkResource" && params->GetSize() == 2) { |
| + // TODO(pfeldman): handle some of the embedder messages in content. |
| + std::string url; |
| + std::string headers; |
| + if (!params->GetString(0, &url) || |
| + !params->GetString(1, &headers)) { |
| + return; |
| + } |
| + GURL gurl(url); |
| + if (!gurl.is_valid()) { |
| + std::string code = base::StringPrintf( |
| + "DevToolsAPI.embedderMessageAck(%d, { statusCode: 404 });", id); |
| + web_contents()->GetMainFrame()->ExecuteJavaScript( |
| + base::UTF8ToUTF16(code)); |
| + return; |
| + } |
| + |
| + net::URLFetcher* fetcher = |
| + net::URLFetcher::Create(gurl, net::URLFetcher::GET, this); |
|
dgozman
2015/02/27 12:22:04
Delete pending fetchers in destructor.
pfeldman
2015/02/27 12:54:47
Done.
|
| + pending_requests_[fetcher] = id; |
| + fetcher->SetRequestContext(web_contents()->GetBrowserContext()-> |
| + GetRequestContext()); |
| + fetcher->SetExtraRequestHeaders(headers); |
| + fetcher->Start(); |
| + return; |
| } else { |
| return; |
| } |
| - dict->GetInteger("id", &id); |
| if (id) { |
| std::string code = "DevToolsAPI.embedderMessageAck(" + |
| base::IntToString(id) + ",\"\");"; |
| @@ -169,6 +196,42 @@ void ShellDevToolsFrontend::DispatchProtocolMessage( |
| } |
| } |
| +void ShellDevToolsFrontend::OnURLFetchComplete(const net::URLFetcher* source) { |
| + // TODO(pfeldman): this is a copy of chrome's devtools_ui_bindings.cc. |
| + // We should handle some of the commands including this one in content. |
| + DCHECK(source); |
| + PendingRequestsMap::iterator it = pending_requests_.find(source); |
| + DCHECK(it != pending_requests_.end()); |
| + |
| + std::string body; |
| + source->GetResponseAsString(&body); |
| + |
| + base::DictionaryValue response; |
| + base::DictionaryValue* headers = new base::DictionaryValue(); |
| + net::HttpResponseHeaders* rh = source->GetResponseHeaders(); |
| + response.SetInteger("statusCode", rh ? rh->response_code() : 200); |
| + response.Set("headers", headers); |
| + response.SetString("body", body); |
| + |
| + void* iterator = NULL; |
| + std::string name; |
| + std::string value; |
| + while (rh && rh->EnumerateHeaderLines(&iterator, &name, &value)) |
| + headers->SetString(name, value); |
| + |
| + std::string json; |
| + base::JSONWriter::Write(&response, &json); |
| + |
| + std::string message = base::StringPrintf( |
| + "DevToolsAPI.embedderMessageAck(%d, %s)", |
| + it->second, |
| + json.c_str()); |
| + web_contents()->GetMainFrame()-> |
| + ExecuteJavaScript(base::UTF8ToUTF16(message)); |
| + |
| + pending_requests_.erase(it); |
| +} |
| + |
| void ShellDevToolsFrontend::AttachTo(WebContents* inspected_contents) { |
| DisconnectFromTarget(); |
| agent_host_ = DevToolsAgentHost::GetOrCreateFor(inspected_contents); |