1//
2// Copyright 2014 The Chromium Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7#include "config.h"
8
9#include "core/inspector/InspectorTracingAgent.h"
10
11#include "core/inspector/IdentifiersFactory.h"
12#include "core/inspector/InspectorClient.h"
13#include "core/inspector/InspectorState.h"
14#include "core/inspector/InspectorWorkerAgent.h"
15#include "platform/TraceEvent.h"
16
17namespace blink {
18
19namespace TracingAgentState {
20const char sessionId[] = "sessionId";
21const char tracingStarted[] = "tracingStarted";
22}
23
24namespace {
25const char devtoolsMetadataEventCategory[] = TRACE_DISABLED_BY_DEFAULT("devtools.timeline");
26}
27
28InspectorTracingAgent::InspectorTracingAgent(InspectorClient* client, InspectorWorkerAgent* workerAgent)
29    : InspectorBaseAgent<InspectorTracingAgent>("Tracing")
30    , m_layerTreeId(0)
31    , m_client(client)
32    , m_frontend(0)
33    , m_workerAgent(workerAgent)
34{
35}
36
37void InspectorTracingAgent::restore()
38{
39    emitMetadataEvents();
40}
41
42void InspectorTracingAgent::start(ErrorString*, const String& categoryFilter, const String&, const double*)
43{
44    if (m_state->getBoolean(TracingAgentState::tracingStarted))
45        return;
46    m_state->setString(TracingAgentState::sessionId, IdentifiersFactory::createIdentifier());
47    m_state->setBoolean(TracingAgentState::tracingStarted, true);
48    m_client->enableTracing(categoryFilter);
49    emitMetadataEvents();
50}
51
52void InspectorTracingAgent::end(ErrorString* errorString)
53{
54    m_client->disableTracing();
55    m_state->setBoolean(TracingAgentState::tracingStarted, false);
56    m_workerAgent->setTracingSessionId(String());
57}
58
59String InspectorTracingAgent::sessionId()
60{
61    return m_state->getString(TracingAgentState::sessionId);
62}
63
64void InspectorTracingAgent::emitMetadataEvents()
65{
66    if (!m_state->getBoolean(TracingAgentState::tracingStarted))
67        return;
68    TRACE_EVENT_INSTANT1(devtoolsMetadataEventCategory, "TracingStartedInPage", "sessionId", sessionId().utf8());
69    if (m_layerTreeId)
70        setLayerTreeId(m_layerTreeId);
71    m_workerAgent->setTracingSessionId(sessionId());
72}
73
74void InspectorTracingAgent::setLayerTreeId(int layerTreeId)
75{
76    m_layerTreeId = layerTreeId;
77    TRACE_EVENT_INSTANT2(devtoolsMetadataEventCategory, "SetLayerTreeId", "sessionId", sessionId().utf8(), "layerTreeId", m_layerTreeId);
78}
79
80void InspectorTracingAgent::setFrontend(InspectorFrontend* frontend)
81{
82    m_frontend = frontend->tracing();
83}
84
85}
86