| Index: content/browser/browser_main_loop.cc
 | 
| diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
 | 
| index 8030f7c9e2464ca54f96d2ac110a182376ae7ac7..bba31d2a778b3bf1608b46741bf955bb74d62adb 100644
 | 
| --- a/content/browser/browser_main_loop.cc
 | 
| +++ b/content/browser/browser_main_loop.cc
 | 
| @@ -75,6 +75,7 @@
 | 
|  #include "content/browser/service_manager/service_manager_context.h"
 | 
|  #include "content/browser/speech/speech_recognition_manager_impl.h"
 | 
|  #include "content/browser/startup_task_runner.h"
 | 
| +#include "content/browser/tracing/tracing_controller_impl.h"
 | 
|  #include "content/browser/utility_process_host_impl.h"
 | 
|  #include "content/browser/webui/content_web_ui_controller_factory.h"
 | 
|  #include "content/browser/webui/url_data_manager.h"
 | 
| @@ -103,6 +104,9 @@
 | 
|  #include "net/ssl/ssl_config_service.h"
 | 
|  #include "ppapi/features/features.h"
 | 
|  #include "services/resource_coordinator/memory/coordinator/coordinator_impl.h"
 | 
| +#include "services/resource_coordinator/public/cpp/tracing/chrome_agent.h"
 | 
| +#include "services/resource_coordinator/public/interfaces/tracing/tracing.mojom.h"
 | 
| +#include "services/resource_coordinator/tracing/coordinator_impl.h"
 | 
|  #include "services/service_manager/runner/common/client_util.h"
 | 
|  #include "skia/ext/event_tracer_impl.h"
 | 
|  #include "skia/ext/skia_memory_dump_provider.h"
 | 
| @@ -725,35 +729,6 @@ void BrowserMainLoop::PostMainMessageLoopStart() {
 | 
|    if (parts_)
 | 
|      parts_->PostMainMessageLoopStart();
 | 
|  
 | 
| -  // Start startup tracing through TracingController's interface. TraceLog has
 | 
| -  // been enabled in content_main_runner where threads are not available. Now We
 | 
| -  // need to start tracing for all other tracing agents, which require threads.
 | 
| -  if (parsed_command_line_.HasSwitch(switches::kTraceStartup)) {
 | 
| -    base::trace_event::TraceConfig trace_config(
 | 
| -        parsed_command_line_.GetSwitchValueASCII(switches::kTraceStartup),
 | 
| -        base::trace_event::RECORD_UNTIL_FULL);
 | 
| -    TracingController::GetInstance()->StartTracing(
 | 
| -        trace_config,
 | 
| -        TracingController::StartTracingDoneCallback());
 | 
| -  } else if (parsed_command_line_.HasSwitch(switches::kTraceToConsole)) {
 | 
| -      TracingController::GetInstance()->StartTracing(
 | 
| -          tracing::GetConfigForTraceToConsole(),
 | 
| -          TracingController::StartTracingDoneCallback());
 | 
| -  } else if (tracing::TraceConfigFile::GetInstance()->IsEnabled()) {
 | 
| -    // This checks kTraceConfigFile switch.
 | 
| -    TracingController::GetInstance()->StartTracing(
 | 
| -        tracing::TraceConfigFile::GetInstance()->GetTraceConfig(),
 | 
| -        TracingController::StartTracingDoneCallback());
 | 
| -  }
 | 
| -  // Start tracing to a file for certain duration if needed. Only do this after
 | 
| -  // starting the main message loop to avoid calling
 | 
| -  // MessagePumpForUI::ScheduleWork() before MessagePumpForUI::Start() as it
 | 
| -  // will crash the browser.
 | 
| -  if (is_tracing_startup_for_duration_) {
 | 
| -    TRACE_EVENT0("startup", "BrowserMainLoop::InitStartupTracingForDuration");
 | 
| -    InitStartupTracingForDuration(parsed_command_line_);
 | 
| -  }
 | 
| -
 | 
|  #if defined(OS_ANDROID)
 | 
|    {
 | 
|      TRACE_EVENT0("startup",
 | 
| @@ -1393,6 +1368,48 @@ int BrowserMainLoop::BrowserThreadsStarted() {
 | 
|    // so this cannot happen any earlier than now.
 | 
|    InitializeMojo();
 | 
|  
 | 
| +  if (service_manager::ServiceManagerIsRemote()) {
 | 
| +    service_manager::Connector* connector =
 | 
| +        content::ServiceManagerConnection::GetForProcess()->GetConnector();
 | 
| +    TracingControllerImpl::GetInstance()->Initialize(connector);
 | 
| +
 | 
| +    resource_coordinator::tracing::mojom::AgentSetPtr agent_set;
 | 
| +    connector->BindInterface("tracing", mojo::MakeRequest(&agent_set));
 | 
| +    resource_coordinator::tracing::ChromeAgent::InitializeIfNeeded(
 | 
| +        std::move(agent_set));
 | 
| +  } else {
 | 
| +    tracing_coordinator_ =
 | 
| +        base::MakeUnique<resource_coordinator::tracing::CoordinatorImpl>();
 | 
| +    TracingControllerImpl::GetInstance()->Initialize(nullptr);
 | 
| +  }
 | 
| +  // Start startup tracing through TracingController's interface. TraceLog has
 | 
| +  // been enabled in content_main_runner where threads are not available. Now We
 | 
| +  // need to start tracing for all other tracing agents, which require threads.
 | 
| +  if (parsed_command_line_.HasSwitch(switches::kTraceStartup)) {
 | 
| +    base::trace_event::TraceConfig trace_config(
 | 
| +        parsed_command_line_.GetSwitchValueASCII(switches::kTraceStartup),
 | 
| +        base::trace_event::RECORD_UNTIL_FULL);
 | 
| +    TracingControllerImpl::GetInstance()->StartTracing(
 | 
| +        trace_config, TracingControllerImpl::StartTracingDoneCallback());
 | 
| +  } else if (parsed_command_line_.HasSwitch(switches::kTraceToConsole)) {
 | 
| +    TracingControllerImpl::GetInstance()->StartTracing(
 | 
| +        tracing::GetConfigForTraceToConsole(),
 | 
| +        TracingControllerImpl::StartTracingDoneCallback());
 | 
| +  } else if (tracing::TraceConfigFile::GetInstance()->IsEnabled()) {
 | 
| +    // This checks kTraceConfigFile switch.
 | 
| +    TracingControllerImpl::GetInstance()->StartTracing(
 | 
| +        tracing::TraceConfigFile::GetInstance()->GetTraceConfig(),
 | 
| +        TracingControllerImpl::StartTracingDoneCallback());
 | 
| +  }
 | 
| +  // Start tracing to a file for certain duration if needed. Only do this after
 | 
| +  // starting the main message loop to avoid calling
 | 
| +  // MessagePumpForUI::ScheduleWork() before MessagePumpForUI::Start() as it
 | 
| +  // will crash the browser.
 | 
| +  if (is_tracing_startup_for_duration_) {
 | 
| +    TRACE_EVENT0("startup", "BrowserMainLoop::InitStartupTracingForDuration");
 | 
| +    InitStartupTracingForDuration(parsed_command_line_);
 | 
| +  }
 | 
| +
 | 
|  #if defined(USE_AURA)
 | 
|    if (service_manager::ServiceManagerIsRemote()) {
 | 
|      base::CommandLine::ForCurrentProcess()->AppendSwitch(
 | 
| @@ -1752,8 +1769,8 @@ void BrowserMainLoop::EndStartupTracing() {
 | 
|    DCHECK(is_tracing_startup_for_duration_);
 | 
|  
 | 
|    is_tracing_startup_for_duration_ = false;
 | 
| -  TracingController::GetInstance()->StopTracing(
 | 
| -      TracingController::CreateFileSink(
 | 
| +  TracingControllerImpl::GetInstance()->StopTracing(
 | 
| +      TracingControllerImpl::CreateFileSink(
 | 
|            startup_trace_file_,
 | 
|            base::Bind(OnStoppedStartupTracing, startup_trace_file_)));
 | 
|  }
 | 
| 
 |