DevTools: Update tracing process filters when process is ready.
Drive-by: Fix a failing DCHECK on Pid() invoked on a non-ready process.
BUG=848398,849887
Change-Id: I1df89b5027ec5ed85235566427dd767ade092fa0
Reviewed-on: https://chromium-review.googlesource.com/1128055
Reviewed-by: Dmitry Gozman <dgozman@chromium.org>
Commit-Queue: Alexei Filippov <alph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#573099}
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc
index 102dc1b0..cd976a5 100644
--- a/content/browser/devtools/protocol/tracing_handler.cc
+++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -412,31 +412,50 @@
}
void TracingHandler::SetupProcessFilter(
- RenderFrameHostImpl* new_render_frame_host) {
+ RenderFrameHost* new_render_frame_host) {
if (!frame_tree_node_)
return;
base::ProcessId browser_pid = base::Process::Current().Pid();
std::unordered_set<base::ProcessId> included_process_ids({browser_pid});
- if (new_render_frame_host) {
- included_process_ids.insert(
- new_render_frame_host->GetProcess()->GetProcess().Pid());
- }
+ if (new_render_frame_host)
+ AppendProcessId(new_render_frame_host, &included_process_ids);
for (FrameTreeNode* node :
frame_tree_node_->frame_tree()->SubtreeNodes(frame_tree_node_)) {
RenderFrameHost* frame_host = node->current_frame_host();
- if (!frame_host)
- continue;
- const base::Process& process_handle =
- frame_host->GetProcess()->GetProcess();
- if (process_handle.IsValid())
- included_process_ids.insert(process_handle.Pid());
+ if (frame_host)
+ AppendProcessId(frame_host, &included_process_ids);
}
trace_config_.SetProcessFilterConfig(
base::trace_event::TraceConfig::ProcessFilterConfig(
included_process_ids));
}
+void TracingHandler::AppendProcessId(
+ RenderFrameHost* render_frame_host,
+ std::unordered_set<base::ProcessId>* process_set) {
+ RenderProcessHost* process_host = render_frame_host->GetProcess();
+ if (process_host->GetProcess().IsValid()) {
+ process_set->insert(process_host->GetProcess().Pid());
+ } else {
+ process_host->PostTaskWhenProcessIsReady(
+ base::BindOnce(&TracingHandler::OnProcessReady,
+ weak_factory_.GetWeakPtr(), process_host));
+ }
+}
+
+void TracingHandler::OnProcessReady(RenderProcessHost* process_host) {
+ if (!did_initiate_recording_)
+ return;
+ std::unordered_set<base::ProcessId> included_process_ids(
+ {process_host->GetProcess().Pid()});
+ trace_config_.SetProcessFilterConfig(
+ base::trace_event::TraceConfig::ProcessFilterConfig(
+ included_process_ids));
+ TracingController::GetInstance()->StartTracing(
+ trace_config_, base::RepeatingCallback<void()>());
+}
+
void TracingHandler::End(std::unique_ptr<EndCallback> callback) {
// Startup tracing triggered by --trace-config-file is a special case, where
// tracing is started automatically upon browser startup and can be stopped
diff --git a/content/browser/devtools/protocol/tracing_handler.h b/content/browser/devtools/protocol/tracing_handler.h
index f2b33d6..c6312f2 100644
--- a/content/browser/devtools/protocol/tracing_handler.h
+++ b/content/browser/devtools/protocol/tracing_handler.h
@@ -11,6 +11,7 @@
#include <memory>
#include <set>
#include <string>
+#include <unordered_set>
#include <vector>
#include "base/gtest_prod_util.h"
@@ -37,6 +38,8 @@
class DevToolsIOContext;
class FrameTreeNode;
class NavigationHandleImpl;
+class RenderFrameHost;
+class RenderProcessHost;
namespace protocol {
@@ -113,7 +116,10 @@
CONTENT_EXPORT static base::trace_event::TraceConfig
GetTraceConfigFromDevToolsConfig(
const base::DictionaryValue& devtools_config);
- void SetupProcessFilter(RenderFrameHostImpl*);
+ void SetupProcessFilter(RenderFrameHost*);
+ void AppendProcessId(RenderFrameHost*,
+ std::unordered_set<base::ProcessId>* process_set);
+ void OnProcessReady(RenderProcessHost*);
std::unique_ptr<base::Timer> buffer_usage_poll_timer_;