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_;