summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpfeldman <pfeldman@chromium.org>2014-10-16 08:11:59 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-16 15:12:18 +0000
commit20f2492c84dc4ab5588b4034f952a99737d37472 (patch)
treedcd559f16884fbe427244ec153495704cbe01b96
parent87ccb1133a179c1145b91b16f83cb71090835981 (diff)
downloadchromium_src-20f2492c84dc4ab5588b4034f952a99737d37472.zip
chromium_src-20f2492c84dc4ab5588b4034f952a99737d37472.tar.gz
chromium_src-20f2492c84dc4ab5588b4034f952a99737d37472.tar.bz2
DevTools: add support for chunked protocol messages.
TBR=jochen BUG=423738 Review URL: https://codereview.chromium.org/656033005 Cr-Commit-Position: refs/heads/master@{#299896}
-rw-r--r--chrome/browser/devtools/devtools_ui_bindings.cc19
-rw-r--r--content/browser/devtools/embedded_worker_devtools_agent_host.cc8
-rw-r--r--content/browser/devtools/embedded_worker_devtools_agent_host.h3
-rw-r--r--content/browser/devtools/ipc_devtools_agent_host.cc29
-rw-r--r--content/browser/devtools/ipc_devtools_agent_host.h7
-rw-r--r--content/browser/devtools/render_view_devtools_agent_host.cc14
-rw-r--r--content/browser/devtools/render_view_devtools_agent_host.h4
-rw-r--r--content/child/shared_worker_devtools_agent.cc16
-rw-r--r--content/common/devtools_messages.h9
-rw-r--r--content/renderer/devtools/devtools_agent.cc17
-rw-r--r--content/renderer/devtools/devtools_client.h3
-rw-r--r--content/renderer/service_worker/embedded_worker_context_client.cc18
12 files changed, 129 insertions, 18 deletions
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index cab3394..f39841a 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -66,6 +66,8 @@ static const char kFrontendHostMethod[] = "method";
static const char kFrontendHostParams[] = "params";
static const char kTitleFormat[] = "Developer Tools - %s";
+const size_t kMaxMessageChunkSize = IPC::Channel::kMaximumMessageSize / 4;
+
typedef std::vector<DevToolsUIBindings*> DevToolsUIBindingsList;
base::LazyInstance<DevToolsUIBindingsList>::Leaky g_instances =
LAZY_INSTANCE_INITIALIZER;
@@ -437,9 +439,20 @@ void DevToolsUIBindings::HandleMessageFromDevToolsFrontendToBackend(
void DevToolsUIBindings::DispatchProtocolMessage(
content::DevToolsAgentHost* agent_host, const std::string& message) {
DCHECK(agent_host == agent_host_.get());
- base::StringValue message_value(message);
- CallClientFunction("InspectorFrontendAPI.dispatchMessage",
- &message_value, NULL, NULL);
+
+ if (message.length() < kMaxMessageChunkSize) {
+ base::StringValue message_value(message);
+ CallClientFunction("InspectorFrontendAPI.dispatchMessage",
+ &message_value, NULL, NULL);
+ return;
+ }
+
+ base::FundamentalValue total_size(static_cast<int>(message.length()));
+ for (size_t pos = 0; pos < message.length(); pos += kMaxMessageChunkSize) {
+ base::StringValue message_value(message.substr(pos, kMaxMessageChunkSize));
+ CallClientFunction("InspectorFrontendAPI.dispatchMessageChunk",
+ &message_value, pos ? NULL : &total_size, NULL);
+ }
}
void DevToolsUIBindings::AgentHostClosed(
diff --git a/content/browser/devtools/embedded_worker_devtools_agent_host.cc b/content/browser/devtools/embedded_worker_devtools_agent_host.cc
index da04726..d197825 100644
--- a/content/browser/devtools/embedded_worker_devtools_agent_host.cc
+++ b/content/browser/devtools/embedded_worker_devtools_agent_host.cc
@@ -219,8 +219,12 @@ void EmbeddedWorkerDevToolsAgentHost::WorkerCreated() {
}
void EmbeddedWorkerDevToolsAgentHost::OnDispatchOnInspectorFrontend(
- const std::string& message) {
- SendMessageToClient(message);
+ const std::string& message,
+ uint32 total_size) {
+ if (!IsAttached())
+ return;
+
+ ProcessChunkedMessageFromAgent(message, total_size);
}
void EmbeddedWorkerDevToolsAgentHost::OnSaveAgentRuntimeState(
diff --git a/content/browser/devtools/embedded_worker_devtools_agent_host.h b/content/browser/devtools/embedded_worker_devtools_agent_host.h
index f977cfc..eff3fff 100644
--- a/content/browser/devtools/embedded_worker_devtools_agent_host.h
+++ b/content/browser/devtools/embedded_worker_devtools_agent_host.h
@@ -68,7 +68,8 @@ class EmbeddedWorkerDevToolsAgentHost : public IPCDevToolsAgentHost,
void AttachToWorker();
void DetachFromWorker();
void WorkerCreated();
- void OnDispatchOnInspectorFrontend(const std::string& message);
+ void OnDispatchOnInspectorFrontend(const std::string& message,
+ uint32 total_size);
void OnSaveAgentRuntimeState(const std::string& state);
scoped_ptr<SharedWorkerInstance> shared_worker_;
diff --git a/content/browser/devtools/ipc_devtools_agent_host.cc b/content/browser/devtools/ipc_devtools_agent_host.cc
index 18c362e..9218d58 100644
--- a/content/browser/devtools/ipc_devtools_agent_host.cc
+++ b/content/browser/devtools/ipc_devtools_agent_host.cc
@@ -29,6 +29,10 @@ void IPCDevToolsAgentHost::InspectElement(int x, int y) {
GetId(), x, y));
}
+IPCDevToolsAgentHost::IPCDevToolsAgentHost()
+ : message_buffer_size_(0) {
+}
+
IPCDevToolsAgentHost::~IPCDevToolsAgentHost() {
}
@@ -38,4 +42,29 @@ void IPCDevToolsAgentHost::Reattach(const std::string& saved_agent_state) {
OnClientAttached();
}
+void IPCDevToolsAgentHost::ProcessChunkedMessageFromAgent(
+ const std::string& message, uint32 total_size) {
+ if (total_size && total_size == message.length()) {
+ DCHECK(message_buffer_size_ == 0);
+ SendMessageToClient(message);
+ return;
+ }
+
+ if (total_size) {
+ DCHECK(message_buffer_size_ == 0);
+ message_buffer_ = std::string();
+ message_buffer_.reserve(total_size);
+ message_buffer_size_ = total_size;
+ }
+
+ message_buffer_.append(message);
+
+ if (message_buffer_.size() >= message_buffer_size_) {
+ DCHECK(message_buffer_.size() == message_buffer_size_);
+ SendMessageToClient(message_buffer_);
+ message_buffer_ = std::string();
+ message_buffer_size_ = 0;
+ }
+}
+
} // namespace content
diff --git a/content/browser/devtools/ipc_devtools_agent_host.h b/content/browser/devtools/ipc_devtools_agent_host.h
index fce9783..3195080 100644
--- a/content/browser/devtools/ipc_devtools_agent_host.h
+++ b/content/browser/devtools/ipc_devtools_agent_host.h
@@ -22,13 +22,20 @@ class CONTENT_EXPORT IPCDevToolsAgentHost : public DevToolsAgentHostImpl {
virtual void InspectElement(int x, int y) override;
protected:
+ IPCDevToolsAgentHost();
virtual ~IPCDevToolsAgentHost();
void Reattach(const std::string& saved_agent_state);
+ void ProcessChunkedMessageFromAgent(const std::string& message,
+ uint32 total_size);
virtual void SendMessageToAgent(IPC::Message* msg) = 0;
virtual void OnClientAttached() = 0;
virtual void OnClientDetached() = 0;
+
+ private:
+ std::string message_buffer_;
+ uint32 message_buffer_size_;
};
} // namespace content
diff --git a/content/browser/devtools/render_view_devtools_agent_host.cc b/content/browser/devtools/render_view_devtools_agent_host.cc
index 79bb7e4..2aafc38 100644
--- a/content/browser/devtools/render_view_devtools_agent_host.cc
+++ b/content/browser/devtools/render_view_devtools_agent_host.cc
@@ -124,7 +124,7 @@ RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderViewHost* rvh)
handler_impl_->SetPowerHandler(power_handler_.get());
SetRenderViewHost(rvh);
DevToolsProtocol::Notifier notifier(base::Bind(
- &RenderViewDevToolsAgentHost::OnDispatchOnInspectorFrontend,
+ &RenderViewDevToolsAgentHost::DispatchOnInspectorFrontend,
base::Unretained(this)));
handler_impl_->SetNotifier(notifier);
tracing_handler_->SetNotifier(notifier);
@@ -164,7 +164,7 @@ void RenderViewDevToolsAgentHost::DispatchProtocolMessage(
overridden_response = handler_impl_->HandleCommand(command);
if (overridden_response.get()) {
if (!overridden_response->is_async_promise())
- OnDispatchOnInspectorFrontend(overridden_response->Serialize());
+ DispatchOnInspectorFrontend(overridden_response->Serialize());
return;
}
}
@@ -494,8 +494,16 @@ void RenderViewDevToolsAgentHost::OnSaveAgentRuntimeState(
}
void RenderViewDevToolsAgentHost::OnDispatchOnInspectorFrontend(
+ const std::string& message,
+ uint32 total_size) {
+ if (!IsAttached() || !render_view_host_)
+ return;
+ ProcessChunkedMessageFromAgent(message, total_size);
+}
+
+void RenderViewDevToolsAgentHost::DispatchOnInspectorFrontend(
const std::string& message) {
- if (!render_view_host_)
+ if (!IsAttached() || !render_view_host_)
return;
SendMessageToClient(message);
}
diff --git a/content/browser/devtools/render_view_devtools_agent_host.h b/content/browser/devtools/render_view_devtools_agent_host.h
index df10986..dcbe426 100644
--- a/content/browser/devtools/render_view_devtools_agent_host.h
+++ b/content/browser/devtools/render_view_devtools_agent_host.h
@@ -102,7 +102,9 @@ class CONTENT_EXPORT RenderViewDevToolsAgentHost
void OnSwapCompositorFrame(const IPC::Message& message);
bool OnSetTouchEventEmulationEnabled(const IPC::Message& message);
- void OnDispatchOnInspectorFrontend(const std::string& message);
+ void OnDispatchOnInspectorFrontend(const std::string& message,
+ uint32 total_size);
+ void DispatchOnInspectorFrontend(const std::string& message);
void OnSaveAgentRuntimeState(const std::string& state);
void ClientDetachedFromRenderer();
diff --git a/content/child/shared_worker_devtools_agent.cc b/content/child/shared_worker_devtools_agent.cc
index cec6e56..06283ed 100644
--- a/content/child/shared_worker_devtools_agent.cc
+++ b/content/child/shared_worker_devtools_agent.cc
@@ -6,6 +6,7 @@
#include "content/child/child_thread.h"
#include "content/common/devtools_messages.h"
+#include "ipc/ipc_channel.h"
#include "third_party/WebKit/public/platform/WebCString.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/web/WebSharedWorker.h"
@@ -15,6 +16,9 @@ using blink::WebString;
namespace content {
+static const size_t kMaxMessageChunkSize =
+ IPC::Channel::kMaximumMessageSize / 4;
+
SharedWorkerDevToolsAgent::SharedWorkerDevToolsAgent(
int route_id,
WebSharedWorker* webworker)
@@ -43,9 +47,19 @@ bool SharedWorkerDevToolsAgent::OnMessageReceived(const IPC::Message& message) {
void SharedWorkerDevToolsAgent::SendDevToolsMessage(
const blink::WebString& message) {
+ std::string msg(message.utf8());
+ if (message.length() < kMaxMessageChunkSize) {
+ Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(
+ route_id_, msg, msg.size()));
+ return;
+ }
+
+ for (size_t pos = 0; pos < msg.length(); pos += kMaxMessageChunkSize) {
Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(
route_id_,
- message.utf8()));
+ msg.substr(pos, kMaxMessageChunkSize),
+ pos ? 0 : msg.size()));
+ }
}
void SharedWorkerDevToolsAgent::SaveDevToolsAgentState(
diff --git a/content/common/devtools_messages.h b/content/common/devtools_messages.h
index 3e14864..b7512a9 100644
--- a/content/common/devtools_messages.h
+++ b/content/common/devtools_messages.h
@@ -55,8 +55,13 @@
// These are messages sent from DevToolsAgent to DevToolsClient through the
// browser.
// WebKit-level transport.
-IPC_MESSAGE_ROUTED1(DevToolsClientMsg_DispatchOnInspectorFrontend,
- std::string /* message */)
+
+// Sends response from the agent to the client. Supports chunked encoding.
+// First (the only) chunk arrives with the |total_size| != 0,
+// remaining chunks arrive with |total_size| == 0.
+IPC_MESSAGE_ROUTED2(DevToolsClientMsg_DispatchOnInspectorFrontend,
+ std::string /* message */,
+ uint32 /* total_size */)
//-----------------------------------------------------------------------------
// These are messages sent from DevToolsClient to DevToolsAgent through the
diff --git a/content/renderer/devtools/devtools_agent.cc b/content/renderer/devtools/devtools_agent.cc
index 7cf4676..4ec305f 100644
--- a/content/renderer/devtools/devtools_agent.cc
+++ b/content/renderer/devtools/devtools_agent.cc
@@ -52,6 +52,8 @@ base::subtle::AtomicWord DevToolsAgent::event_callback_;
namespace {
+const size_t kMaxMessageChunkSize = IPC::Channel::kMaximumMessageSize / 4;
+
class WebKitClientMessageLoopImpl
: public WebDevToolsAgentClient::WebKitClientMessageLoop {
public:
@@ -116,8 +118,19 @@ bool DevToolsAgent::OnMessageReceived(const IPC::Message& message) {
void DevToolsAgent::sendMessageToInspectorFrontend(
const blink::WebString& message) {
- Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(routing_id(),
- message.utf8()));
+ std::string msg(message.utf8());
+ if (msg.length() < kMaxMessageChunkSize) {
+ Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(
+ routing_id(), msg, msg.size()));
+ return;
+ }
+
+ for (size_t pos = 0; pos < msg.length(); pos += kMaxMessageChunkSize) {
+ Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(
+ routing_id(),
+ msg.substr(pos, kMaxMessageChunkSize),
+ pos ? 0 : msg.size()));
+ }
}
long DevToolsAgent::processId() {
diff --git a/content/renderer/devtools/devtools_client.h b/content/renderer/devtools/devtools_client.h
index f0321859b..bf6e077 100644
--- a/content/renderer/devtools/devtools_client.h
+++ b/content/renderer/devtools/devtools_client.h
@@ -41,7 +41,8 @@ class CONTENT_EXPORT DevToolsClient
virtual bool isUnderTest() override;
- void OnDispatchOnInspectorFrontend(const std::string& message);
+ void OnDispatchOnInspectorFrontend(const std::string& message,
+ uint32 total_size);
scoped_ptr<blink::WebDevToolsFrontend> web_tools_frontend_;
diff --git a/content/renderer/service_worker/embedded_worker_context_client.cc b/content/renderer/service_worker/embedded_worker_context_client.cc
index 9dba6cb..f9d5834 100644
--- a/content/renderer/service_worker/embedded_worker_context_client.cc
+++ b/content/renderer/service_worker/embedded_worker_context_client.cc
@@ -36,6 +36,8 @@ namespace content {
namespace {
+const size_t kMaxMessageChunkSize = IPC::Channel::kMaximumMessageSize / 4;
+
// For now client must be a per-thread instance.
// TODO(kinuko): This needs to be refactored when we start using thread pool
// or having multiple clients per one thread.
@@ -243,8 +245,20 @@ void EmbeddedWorkerContextClient::reportConsoleMessage(
void EmbeddedWorkerContextClient::dispatchDevToolsMessage(
const blink::WebString& message) {
- sender_->Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(
- worker_devtools_agent_route_id_, message.utf8()));
+ std::string msg(message.utf8());
+
+ if (msg.length() < kMaxMessageChunkSize) {
+ sender_->Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(
+ worker_devtools_agent_route_id_, msg, msg.size()));
+ return;
+ }
+
+ for (size_t pos = 0; pos < msg.length(); pos += kMaxMessageChunkSize) {
+ sender_->Send(new DevToolsClientMsg_DispatchOnInspectorFrontend(
+ worker_devtools_agent_route_id_,
+ msg.substr(pos, kMaxMessageChunkSize),
+ pos ? 0 : msg.size()));
+ }
}
void EmbeddedWorkerContextClient::saveDevToolsAgentState(