| Index: headless/lib/browser/headless_devtools_client_impl.cc
|
| diff --git a/headless/lib/browser/headless_devtools_client_impl.cc b/headless/lib/browser/headless_devtools_client_impl.cc
|
| index 0fe3f9845a793e020a26962fc8dede231e61a2c7..b9fc56b67d45aff1ad2bbe4e1991c1e8d7d8b203 100644
|
| --- a/headless/lib/browser/headless_devtools_client_impl.cc
|
| +++ b/headless/lib/browser/headless_devtools_client_impl.cc
|
| @@ -83,29 +83,60 @@ void HeadlessDevToolsClientImpl::DispatchProtocolMessage(
|
| DCHECK_EQ(agent_host_, agent_host);
|
| std::unique_ptr<base::Value> message =
|
| base::JSONReader::Read(json_message, base::JSON_PARSE_RFC);
|
| - base::DictionaryValue* message_dict;
|
| + const base::DictionaryValue* message_dict;
|
| if (!message || !message->GetAsDictionary(&message_dict)) {
|
| NOTREACHED() << "Badly formed reply";
|
| return;
|
| }
|
| + if (!DispatchMessageReply(*message_dict) && !DispatchEvent(*message_dict))
|
| + DLOG(ERROR) << "Unhandled protocol message: " << json_message;
|
| +}
|
| +
|
| +bool HeadlessDevToolsClientImpl::DispatchMessageReply(
|
| + const base::DictionaryValue& message_dict) {
|
| int id = 0;
|
| - DCHECK(message_dict->GetInteger("id", &id));
|
| + if (!message_dict.GetInteger("id", &id))
|
| + return false;
|
| auto it = pending_messages_.find(id);
|
| if (it == pending_messages_.end()) {
|
| NOTREACHED() << "Unexpected reply";
|
| - return;
|
| + return false;
|
| }
|
| if (!it->second.callback_with_result.is_null()) {
|
| - base::DictionaryValue* result_dict;
|
| - if (!message_dict->GetDictionary("result", &result_dict)) {
|
| + const base::DictionaryValue* result_dict;
|
| + if (!message_dict.GetDictionary("result", &result_dict)) {
|
| NOTREACHED() << "Badly formed reply result";
|
| - return;
|
| + return false;
|
| }
|
| it->second.callback_with_result.Run(*result_dict);
|
| } else if (!it->second.callback.is_null()) {
|
| it->second.callback.Run();
|
| }
|
| pending_messages_.erase(it);
|
| + return true;
|
| +}
|
| +
|
| +bool HeadlessDevToolsClientImpl::DispatchEvent(
|
| + const base::DictionaryValue& message_dict) {
|
| + std::string method;
|
| + if (!message_dict.GetString("method", &method))
|
| + return false;
|
| + auto it = event_handlers_.find(method);
|
| + if (it == event_handlers_.end()) {
|
| + NOTREACHED() << "Unknown event: " << method;
|
| + return false;
|
| + }
|
| + if (!it->second.callback_with_result.is_null()) {
|
| + const base::DictionaryValue* result_dict;
|
| + if (!message_dict.GetDictionary("params", &result_dict)) {
|
| + NOTREACHED() << "Badly formed event parameters";
|
| + return false;
|
| + }
|
| + it->second.callback_with_result.Run(*result_dict);
|
| + } else if (!it->second.callback.is_null()) {
|
| + it->second.callback.Run();
|
| + }
|
| + return true;
|
| }
|
|
|
| void HeadlessDevToolsClientImpl::AgentHostClosed(
|
| @@ -241,7 +272,7 @@ void HeadlessDevToolsClientImpl::FinalizeAndSendMessage(
|
| message->SetInteger("id", id);
|
| std::string json_message;
|
| base::JSONWriter::Write(*message, &json_message);
|
| - pending_messages_[id] = PendingMessage(callback);
|
| + pending_messages_[id] = Callback(callback);
|
| agent_host_->DispatchProtocolMessage(json_message);
|
| }
|
|
|
| @@ -290,23 +321,34 @@ void HeadlessDevToolsClientImpl::SendMessage(const char* method,
|
| SendMessageWithoutParams(method, std::move(callback));
|
| }
|
|
|
| -HeadlessDevToolsClientImpl::PendingMessage::PendingMessage() {}
|
| +void HeadlessDevToolsClientImpl::RegisterEventHandler(
|
| + const char* method,
|
| + base::Callback<void()> callback) {
|
| + DCHECK(event_handlers_.find(method) == event_handlers_.end());
|
| + event_handlers_[method] = Callback(callback);
|
| +}
|
| +
|
| +void HeadlessDevToolsClientImpl::RegisterEventHandler(
|
| + const char* method,
|
| + base::Callback<void(const base::Value&)> callback) {
|
| + DCHECK(event_handlers_.find(method) == event_handlers_.end());
|
| + event_handlers_[method] = Callback(callback);
|
| +}
|
| +
|
| +HeadlessDevToolsClientImpl::Callback::Callback() {}
|
|
|
| -HeadlessDevToolsClientImpl::PendingMessage::PendingMessage(
|
| - PendingMessage&& other) = default;
|
| +HeadlessDevToolsClientImpl::Callback::Callback(Callback&& other) = default;
|
|
|
| -HeadlessDevToolsClientImpl::PendingMessage::PendingMessage(
|
| - base::Callback<void()> callback)
|
| +HeadlessDevToolsClientImpl::Callback::Callback(base::Callback<void()> callback)
|
| : callback(callback) {}
|
|
|
| -HeadlessDevToolsClientImpl::PendingMessage::PendingMessage(
|
| +HeadlessDevToolsClientImpl::Callback::Callback(
|
| base::Callback<void(const base::Value&)> callback)
|
| : callback_with_result(callback) {}
|
|
|
| -HeadlessDevToolsClientImpl::PendingMessage::~PendingMessage() {}
|
| +HeadlessDevToolsClientImpl::Callback::~Callback() {}
|
|
|
| -HeadlessDevToolsClientImpl::PendingMessage&
|
| -HeadlessDevToolsClientImpl::PendingMessage::operator=(PendingMessage&& other) =
|
| - default;
|
| +HeadlessDevToolsClientImpl::Callback& HeadlessDevToolsClientImpl::Callback::
|
| +operator=(Callback&& other) = default;
|
|
|
| } // namespace headless
|
|
|