[DevTools] Fixes for running the browser_tests and the headless_browsertests
This is for --enable-internal-devtools-binary-protocol. In DevToolsSession, handle messages to proxy delegates correctly. In HeadlessDevToolsSession, check the switch when parsing messages. I've also uploaded a patch that hardcodes the flag so that the bots can try it with the flag enabled. https://chromium-review.googlesource.com/c/chromium/src/+/1542299 Change-Id: I7d2515849571f0e5465afe0528d72a6f35d1fcf0 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1541862 Commit-Queue: Johannes Henkel <johannes@chromium.org> Reviewed-by: Dmitry Gozman <dgozman@chromium.org> Cr-Commit-Position: refs/heads/master@{#645455}
This commit is contained in:

committed by
Commit Bot

parent
8a8caf5ca8
commit
8934ec60db
content/browser/devtools
headless/lib/browser/protocol
@ -141,6 +141,18 @@ void DevToolsSession::MojoConnectionDestroyed() {
|
|||||||
// The client of the devtools session will call this method to send a message
|
// The client of the devtools session will call this method to send a message
|
||||||
// to handlers / agents that the session is connected with.
|
// to handlers / agents that the session is connected with.
|
||||||
bool DevToolsSession::DispatchProtocolMessage(const std::string& message) {
|
bool DevToolsSession::DispatchProtocolMessage(const std::string& message) {
|
||||||
|
// If the session is in proxy mode, then |message| will be sent to
|
||||||
|
// an external session, so it needs to be sent as JSON.
|
||||||
|
// TODO(dgozman): revisit the proxy delegate.
|
||||||
|
if (proxy_delegate_) {
|
||||||
|
if (client_->UsesBinaryProtocol()) {
|
||||||
|
DCHECK(IsCBOR(message));
|
||||||
|
proxy_delegate_->SendMessageToBackend(this, ConvertCBORToJSON(message));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
proxy_delegate_->SendMessageToBackend(this, message);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
std::string converted_cbor_message;
|
std::string converted_cbor_message;
|
||||||
const std::string* message_to_send = &message;
|
const std::string* message_to_send = &message;
|
||||||
if (EnableInternalDevToolsBinaryProtocol()) {
|
if (EnableInternalDevToolsBinaryProtocol()) {
|
||||||
@ -153,15 +165,6 @@ bool DevToolsSession::DispatchProtocolMessage(const std::string& message) {
|
|||||||
message_to_send = &converted_cbor_message;
|
message_to_send = &converted_cbor_message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (proxy_delegate_) {
|
|
||||||
// TODO(dgozman): revisit the proxy delegate.
|
|
||||||
// TODO(johannes): Should we send CBOR to an external backend? Maybe not!
|
|
||||||
// Revisit this when EnableInternalDevToolsBinaryProtocol() is on
|
|
||||||
// unconditionally. Note: we assume that child sessions are not forwarding.
|
|
||||||
proxy_delegate_->SendMessageToBackend(this, *message_to_send);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<protocol::DictionaryValue> value =
|
std::unique_ptr<protocol::DictionaryValue> value =
|
||||||
protocol::DictionaryValue::cast(protocol::StringUtil::parseMessage(
|
protocol::DictionaryValue::cast(protocol::StringUtil::parseMessage(
|
||||||
message, client_->UsesBinaryProtocol()));
|
message, client_->UsesBinaryProtocol()));
|
||||||
@ -345,7 +348,20 @@ void DevToolsSession::DispatchProtocolNotification(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DevToolsSession::DispatchOnClientHost(const std::string& message) {
|
void DevToolsSession::DispatchOnClientHost(const std::string& message) {
|
||||||
client_->DispatchProtocolMessage(agent_host_, message);
|
if (!EnableInternalDevToolsBinaryProtocol()) {
|
||||||
|
client_->DispatchProtocolMessage(agent_host_, message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// |message| either comes from a web socket, in which case it's JSON.
|
||||||
|
// Or it comes from another devtools_session, in which case it may be CBOR
|
||||||
|
// already. We auto-detect and convert to what the client wants as needed.
|
||||||
|
if (client_->UsesBinaryProtocol()) {
|
||||||
|
client_->DispatchProtocolMessage(
|
||||||
|
agent_host_, IsCBOR(message) ? message : ConvertJSONToCBOR(message));
|
||||||
|
} else {
|
||||||
|
client_->DispatchProtocolMessage(
|
||||||
|
agent_host_, !IsCBOR(message) ? message : ConvertCBORToJSON(message));
|
||||||
|
}
|
||||||
// |this| may be deleted at this point.
|
// |this| may be deleted at this point.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,8 +4,10 @@
|
|||||||
|
|
||||||
#include "headless/lib/browser/protocol/headless_devtools_session.h"
|
#include "headless/lib/browser/protocol/headless_devtools_session.h"
|
||||||
|
|
||||||
|
#include "base/command_line.h"
|
||||||
#include "content/public/browser/devtools_agent_host.h"
|
#include "content/public/browser/devtools_agent_host.h"
|
||||||
#include "content/public/browser/devtools_agent_host_client.h"
|
#include "content/public/browser/devtools_agent_host_client.h"
|
||||||
|
#include "content/public/common/content_switches.h"
|
||||||
#include "headless/lib/browser/protocol/browser_handler.h"
|
#include "headless/lib/browser/protocol/browser_handler.h"
|
||||||
#include "headless/lib/browser/protocol/headless_handler.h"
|
#include "headless/lib/browser/protocol/headless_handler.h"
|
||||||
#include "headless/lib/browser/protocol/page_handler.h"
|
#include "headless/lib/browser/protocol/page_handler.h"
|
||||||
@ -13,6 +15,11 @@
|
|||||||
|
|
||||||
namespace headless {
|
namespace headless {
|
||||||
namespace protocol {
|
namespace protocol {
|
||||||
|
static bool EnableInternalDevToolsBinaryProtocol() {
|
||||||
|
static bool enabled = base::CommandLine::ForCurrentProcess()->HasSwitch(
|
||||||
|
::switches::kEnableInternalDevToolsBinaryProtocol);
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
HeadlessDevToolsSession::HeadlessDevToolsSession(
|
HeadlessDevToolsSession::HeadlessDevToolsSession(
|
||||||
base::WeakPtr<HeadlessBrowserImpl> browser,
|
base::WeakPtr<HeadlessBrowserImpl> browser,
|
||||||
@ -53,7 +60,8 @@ void HeadlessDevToolsSession::HandleCommand(
|
|||||||
std::string unused;
|
std::string unused;
|
||||||
std::unique_ptr<protocol::DictionaryValue> value =
|
std::unique_ptr<protocol::DictionaryValue> value =
|
||||||
protocol::DictionaryValue::cast(protocol::StringUtil::parseMessage(
|
protocol::DictionaryValue::cast(protocol::StringUtil::parseMessage(
|
||||||
message, client_->UsesBinaryProtocol()));
|
message, client_->UsesBinaryProtocol() ||
|
||||||
|
EnableInternalDevToolsBinaryProtocol()));
|
||||||
if (!dispatcher_->parseCommand(value.get(), &call_id, &unused))
|
if (!dispatcher_->parseCommand(value.get(), &call_id, &unused))
|
||||||
return;
|
return;
|
||||||
pending_commands_[call_id] = std::move(callback);
|
pending_commands_[call_id] = std::move(callback);
|
||||||
|
Reference in New Issue
Block a user