blob: 5440aeac2de62351c596b05638422f1d925daebe [file] [log] [blame]
//
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "config.h"
#include "core/inspector/InspectorTracingAgent.h"
#include "core/inspector/IdentifiersFactory.h"
#include "core/inspector/InspectorClient.h"
#include "core/inspector/InspectorState.h"
#include "core/inspector/InspectorWorkerAgent.h"
#include "platform/TraceEvent.h"
namespace blink {
namespace TracingAgentState {
const char sessionId[] = "sessionId";
const char tracingStartedFromProtocol[] = "tracingStartedFromProtocol";
const char tracingStarted[] = "tracingStarted";
}
namespace {
const char devtoolsMetadataEventCategory[] = TRACE_DISABLED_BY_DEFAULT("devtools.timeline");
}
InspectorTracingAgent::InspectorTracingAgent(InspectorClient* client, InspectorWorkerAgent* workerAgent)
: InspectorBaseAgent<InspectorTracingAgent>("Tracing")
, m_layerTreeId(0)
, m_client(client)
, m_frontend(0)
, m_workerAgent(workerAgent)
{
}
void InspectorTracingAgent::restore()
{
emitMetadataEvents();
}
void InspectorTracingAgent::start(ErrorString*, const String& categoryFilter, const String&, const double*)
{
m_state->setBoolean(TracingAgentState::tracingStartedFromProtocol, true);
innerStart(categoryFilter, false);
}
void InspectorTracingAgent::end(ErrorString* errorString)
{
m_state->setBoolean(TracingAgentState::tracingStarted, false);
m_consoleTimelines.clear();
notifyTracingStopped();
}
void InspectorTracingAgent::innerStart(const String& categoryFilter, bool fromConsole)
{
m_state->setString(TracingAgentState::sessionId, IdentifiersFactory::createIdentifier());
m_state->setBoolean(TracingAgentState::tracingStarted, true);
m_client->enableTracing(categoryFilter);
emitMetadataEvents();
m_frontend->started(fromConsole, sessionId());
}
String InspectorTracingAgent::sessionId()
{
return m_state->getString(TracingAgentState::sessionId);
}
void InspectorTracingAgent::emitMetadataEvents()
{
if (!m_state->getBoolean(TracingAgentState::tracingStarted))
return;
TRACE_EVENT_INSTANT1(devtoolsMetadataEventCategory, "TracingStartedInPage", "sessionId", sessionId().utf8());
if (m_layerTreeId)
setLayerTreeId(m_layerTreeId);
m_workerAgent->setTracingSessionId(sessionId());
}
void InspectorTracingAgent::setLayerTreeId(int layerTreeId)
{
m_layerTreeId = layerTreeId;
TRACE_EVENT_INSTANT2(devtoolsMetadataEventCategory, "SetLayerTreeId", "sessionId", sessionId().utf8(), "layerTreeId", m_layerTreeId);
}
void InspectorTracingAgent::consoleTimeline(const String& title)
{
m_consoleTimelines.append(title);
if (m_state->getBoolean(TracingAgentState::tracingStarted))
return;
innerStart("-*,disabled-by-default-devtools.timeline", true);
}
void InspectorTracingAgent::consoleTimelineEnd(const String& title)
{
size_t index = m_consoleTimelines.find(title);
if (index == kNotFound)
return;
m_consoleTimelines.remove(index);
if (!m_consoleTimelines.size()
&& m_state->getBoolean(TracingAgentState::tracingStarted)
&& !m_state->getBoolean(TracingAgentState::tracingStartedFromProtocol))
notifyTracingStopped();
m_state->setBoolean(TracingAgentState::tracingStarted, false);
}
void InspectorTracingAgent::notifyTracingStopped()
{
m_frontend->stopped();
m_workerAgent->setTracingSessionId(String());
}
void InspectorTracingAgent::setFrontend(InspectorFrontend* frontend)
{
m_frontend = frontend->tracing();
}
}