#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 WebCore {
+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)
+InspectorTracingAgent::InspectorTracingAgent(InspectorClient* client, InspectorWorkerAgent* workerAgent)
: InspectorBaseAgent<InspectorTracingAgent>("Tracing")
, m_layerTreeId(0)
, m_client(client)
+ , m_frontend(0)
+ , m_workerAgent(workerAgent)
{
}
emitMetadataEvents();
}
-void InspectorTracingAgent::start(ErrorString*, const String& categoryFilter, const String&, const double*, String* outSessionId)
+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();
- *outSessionId = sessionId();
+ m_frontend->started(fromConsole, sessionId());
}
String InspectorTracingAgent::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)
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();
+}
+
}