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.
9 #include "core/inspector/InspectorTracingAgent.h"
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"
19 namespace TracingAgentState {
20 const char sessionId[] = "sessionId";
21 const char tracingStartedFromProtocol[] = "tracingStartedFromProtocol";
22 const char tracingStarted[] = "tracingStarted";
26 const char devtoolsMetadataEventCategory[] = TRACE_DISABLED_BY_DEFAULT("devtools.timeline");
29 InspectorTracingAgent::InspectorTracingAgent(InspectorClient* client, InspectorWorkerAgent* workerAgent)
30 : InspectorBaseAgent<InspectorTracingAgent>("Tracing")
34 , m_workerAgent(workerAgent)
38 void InspectorTracingAgent::restore()
43 void InspectorTracingAgent::start(ErrorString*, const String& categoryFilter, const String&, const double*)
45 m_state->setBoolean(TracingAgentState::tracingStartedFromProtocol, true);
46 innerStart(categoryFilter, false);
49 void InspectorTracingAgent::end(ErrorString* errorString)
51 m_state->setBoolean(TracingAgentState::tracingStarted, false);
52 m_consoleTimelines.clear();
53 notifyTracingStopped();
56 void InspectorTracingAgent::innerStart(const String& categoryFilter, bool fromConsole)
58 m_state->setString(TracingAgentState::sessionId, IdentifiersFactory::createIdentifier());
59 m_state->setBoolean(TracingAgentState::tracingStarted, true);
60 m_client->enableTracing(categoryFilter);
62 m_frontend->started(fromConsole, sessionId());
65 String InspectorTracingAgent::sessionId()
67 return m_state->getString(TracingAgentState::sessionId);
70 void InspectorTracingAgent::emitMetadataEvents()
72 if (!m_state->getBoolean(TracingAgentState::tracingStarted))
74 TRACE_EVENT_INSTANT1(devtoolsMetadataEventCategory, "TracingStartedInPage", "sessionId", sessionId().utf8());
76 setLayerTreeId(m_layerTreeId);
77 m_workerAgent->setTracingSessionId(sessionId());
80 void InspectorTracingAgent::setLayerTreeId(int layerTreeId)
82 m_layerTreeId = layerTreeId;
83 TRACE_EVENT_INSTANT2(devtoolsMetadataEventCategory, "SetLayerTreeId", "sessionId", sessionId().utf8(), "layerTreeId", m_layerTreeId);
86 void InspectorTracingAgent::consoleTimeline(const String& title)
88 m_consoleTimelines.append(title);
89 if (m_state->getBoolean(TracingAgentState::tracingStarted))
91 innerStart("-*,disabled-by-default-devtools.timeline", true);
94 void InspectorTracingAgent::consoleTimelineEnd(const String& title)
96 size_t index = m_consoleTimelines.find(title);
97 if (index == kNotFound)
100 m_consoleTimelines.remove(index);
101 if (!m_consoleTimelines.size()
102 && m_state->getBoolean(TracingAgentState::tracingStarted)
103 && !m_state->getBoolean(TracingAgentState::tracingStartedFromProtocol))
104 notifyTracingStopped();
105 m_state->setBoolean(TracingAgentState::tracingStarted, false);
108 void InspectorTracingAgent::notifyTracingStopped()
110 m_frontend->stopped();
111 m_workerAgent->setTracingSessionId(String());
114 void InspectorTracingAgent::setFrontend(InspectorFrontend* frontend)
116 m_frontend = frontend->tracing();