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

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

Issue 2867073006: Adds a /json/protocol endpoint to serve the DevTools protocol (Closed)
Patch Set: try a different dependancy Created 3 years, 7 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.cc
diff --git a/content/browser/devtools/devtools_http_handler.cc b/content/browser/devtools/devtools_http_handler.cc
index 7f06067c4027bdfad4d5cb598bc4dbb44db21958..81eda4cf756bd4c9c2d6edacfd51e1f19d3ec09f 100644
--- a/content/browser/devtools/devtools_http_handler.cc
+++ b/content/browser/devtools/devtools_http_handler.cc
@@ -14,6 +14,7 @@
#include "base/json/json_writer.h"
#include "base/location.h"
#include "base/logging.h"
+#include "base/memory/ref_counted_memory.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
@@ -23,10 +24,12 @@
#include "build/build_config.h"
#include "content/browser/devtools/devtools_http_handler.h"
#include "content/browser/devtools/devtools_manager.h"
+#include "content/browser/devtools/grit/devtools_resources.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/devtools_external_agent_proxy_delegate.h"
#include "content/public/browser/devtools_manager_delegate.h"
#include "content/public/browser/devtools_socket_factory.h"
+#include "content/public/common/content_client.h"
#include "content/public/common/url_constants.h"
#include "content/public/common/user_agent.h"
#include "net/base/escape.h"
@@ -37,6 +40,7 @@
#include "net/server/http_server_request_info.h"
#include "net/server/http_server_response_info.h"
#include "net/socket/server_socket.h"
+#include "third_party/brotli/include/brotli/decode.h"
#include "v8/include/v8-version-string.h"
#if defined(OS_ANDROID)
@@ -534,6 +538,11 @@ void DevToolsHttpHandler::OnJsonRequest(
return;
}
+ if (command == "protocol") {
+ DecompressAndSendJsonProtocol(connection_id);
+ return;
+ }
+
if (command == "list") {
DevToolsManager* manager = DevToolsManager::GetInstance();
DevToolsAgentHost::List list =
@@ -607,6 +616,47 @@ void DevToolsHttpHandler::OnJsonRequest(
return;
}
+void DevToolsHttpHandler::DecompressAndSendJsonProtocol(int connection_id) {
+ scoped_refptr<base::RefCountedMemory> raw_bytes =
+ GetContentClient()->GetDataResourceBytes(COMPRESSED_PROTOCOL_JSON);
+ const uint8_t* next_encoded_byte = raw_bytes->front();
+ size_t input_size_remaining = raw_bytes->size();
+ BrotliDecoderState* decoder = BrotliDecoderCreateInstance(
+ nullptr /* no custom allocator */, nullptr /* no custom deallocator */,
+ nullptr /* no custom memory handle */);
+ CHECK(!!decoder);
+ std::vector<std::string> decoded_parts;
+ size_t decompressed_size = 0;
+ while (!BrotliDecoderIsFinished(decoder)) {
+ size_t output_size_remaining = 0;
+ CHECK(BrotliDecoderDecompressStream(
+ decoder, &input_size_remaining, &next_encoded_byte,
+ &output_size_remaining, nullptr,
+ nullptr) != BROTLI_DECODER_RESULT_ERROR);
+ const uint8_t* output_buffer =
+ BrotliDecoderTakeOutput(decoder, &output_size_remaining);
+ decoded_parts.emplace_back(reinterpret_cast<const char*>(output_buffer),
+ output_size_remaining);
+ decompressed_size += output_size_remaining;
+ }
+ BrotliDecoderDestroyInstance(decoder);
+
+ // Ideally we'd use a StringBuilder here but there isn't one in base/.
+ std::string json_protocol;
+ json_protocol.reserve(decompressed_size);
+ for (const std::string& part : decoded_parts) {
+ json_protocol.append(part);
+ }
+
+ net::HttpServerResponseInfo response(net::HTTP_OK);
+ response.SetBody(json_protocol, "application/json; charset=UTF-8");
+
+ thread_->task_runner()->PostTask(
+ FROM_HERE,
+ base::Bind(&ServerWrapper::SendResponse,
+ base::Unretained(server_wrapper_), connection_id, response));
+}
+
void DevToolsHttpHandler::RespondToJsonList(
int connection_id,
const std::string& host,

Powered by Google App Engine
This is Rietveld 408576698