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

Unified Diff: headless/lib/browser/headless_devtools_client_impl.cc

Issue 2200663002: HeadlessDevToolsClientImpl::DispatchEvent to post a task (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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: 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 7179071b68d23da09b60b6c6fa3178df66106b13..166c47b5e4450c6cd533c8723866fbb0fdb016ca 100644
--- a/headless/lib/browser/headless_devtools_client_impl.cc
+++ b/headless/lib/browser/headless_devtools_client_impl.cc
@@ -6,10 +6,12 @@
#include <memory>
+#include "base/bind.h"
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/memory/ptr_util.h"
#include "base/values.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/devtools_agent_host.h"
namespace headless {
@@ -60,7 +62,10 @@ HeadlessDevToolsClientImpl::HeadlessDevToolsClientImpl()
security_domain_(this),
service_worker_domain_(this),
tracing_domain_(this),
- worker_domain_(this) {}
+ worker_domain_(this),
+ browser_main_thread_(content::BrowserThread::GetTaskRunnerForThread(
+ content::BrowserThread::UI)),
+ weak_ptr_factory_(this) {}
HeadlessDevToolsClientImpl::~HeadlessDevToolsClientImpl() {}
@@ -90,8 +95,10 @@ void HeadlessDevToolsClientImpl::DispatchProtocolMessage(
NOTREACHED() << "Badly formed reply";
return;
}
- if (!DispatchMessageReply(*message_dict) && !DispatchEvent(*message_dict))
+ if (!DispatchMessageReply(*message_dict) &&
+ !DispatchEvent(std::move(message), *message_dict)) {
DLOG(ERROR) << "Unhandled protocol message: " << json_message;
+ }
}
bool HeadlessDevToolsClientImpl::DispatchMessageReply(
@@ -120,6 +127,7 @@ bool HeadlessDevToolsClientImpl::DispatchMessageReply(
}
bool HeadlessDevToolsClientImpl::DispatchEvent(
+ std::unique_ptr<base::Value> owning_message,
const base::DictionaryValue& message_dict) {
std::string method;
if (!message_dict.GetString("method", &method))
@@ -135,11 +143,24 @@ bool HeadlessDevToolsClientImpl::DispatchEvent(
NOTREACHED() << "Badly formed event parameters";
return false;
}
- it->second.Run(*result_dict);
+ // DevTools assumes event handling is async so we must post a task here or
+ // we risk breaking things.
+ browser_main_thread_->PostTask(
+ FROM_HERE, base::Bind(&HeadlessDevToolsClientImpl::DispatchEventTask,
+ weak_ptr_factory_.GetWeakPtr(),
+ base::Passed(std::move(owning_message)),
+ &it->second, result_dict));
Sami 2016/08/01 11:05:02 Might need to change the "auto it" above to "const
alex clarke (OOO till 29th) 2016/08/01 15:37:02 As discussed offline I did something similar to na
}
return true;
}
+void HeadlessDevToolsClientImpl::DispatchEventTask(
+ std::unique_ptr<base::Value> owning_message,
+ base::Callback<void(const base::Value&)>* callback,
+ const base::DictionaryValue* result_dict) {
+ callback->Run(*result_dict);
+}
+
void HeadlessDevToolsClientImpl::AgentHostClosed(
content::DevToolsAgentHost* agent_host,
bool replaced_with_another_client) {

Powered by Google App Engine
This is Rietveld 408576698