Index: Source/core/inspector/InspectorTimelineAgent.cpp |
diff --git a/Source/core/inspector/InspectorTimelineAgent.cpp b/Source/core/inspector/InspectorTimelineAgent.cpp |
index a7cd43cdda13b02d8cb3e20d0057e5eb966911f7..c808cb05d1012674276019ec7124c5786cc69431 100644 |
--- a/Source/core/inspector/InspectorTimelineAgent.cpp |
+++ b/Source/core/inspector/InspectorTimelineAgent.cpp |
@@ -77,7 +77,6 @@ namespace TimelineRecordType { |
static const char Program[] = "Program"; |
static const char EventDispatch[] = "EventDispatch"; |
-static const char BeginFrame[] = "BeginFrame"; |
static const char ScheduleStyleRecalculation[] = "ScheduleStyleRecalculation"; |
static const char RecalculateStyles[] = "RecalculateStyles"; |
static const char InvalidateLayout[] = "InvalidateLayout"; |
@@ -125,10 +124,12 @@ static const char WebSocketReceiveHandshakeResponse[] = "WebSocketReceiveHandsha |
static const char WebSocketDestroy[] = "WebSocketDestroy"; |
// Event names visible to other modules. |
+const char ActivateLayerTree[] = "ActivateLayerTree"; |
+const char BeginFrame[] = "BeginFrame"; |
const char DecodeImage[] = "DecodeImage"; |
+const char GPUTask[] = "GPUTask"; |
const char Rasterize[] = "Rasterize"; |
const char PaintSetup[] = "PaintSetup"; |
-const char GPUTask[] = "GPUTask"; |
} |
namespace { |
@@ -350,11 +351,13 @@ void InspectorTimelineAgent::innerStart() |
ScriptGCEvent::addEventListener(this); |
if (m_client) { |
TraceEventDispatcher* dispatcher = TraceEventDispatcher::instance(); |
+ dispatcher->addListener(InstrumentationEvents::BeginFrame, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onBeginImplSideFrame, m_client); |
dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onPaintSetupBegin, m_client); |
dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onPaintSetupEnd, m_client); |
dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onRasterTaskBegin, m_client); |
dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onRasterTaskEnd, m_client); |
dispatcher->addListener(InstrumentationEvents::Layer, TRACE_EVENT_PHASE_DELETE_OBJECT, this, &InspectorTimelineAgent::onLayerDeleted, m_client); |
+ dispatcher->addListener(InstrumentationEvents::ActivateLayerTree, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onActivateLayerTree, m_client); |
dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onImageDecodeBegin, m_client); |
dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onImageDecodeEnd, m_client); |
dispatcher->addListener(PlatformInstrumentation::DrawLazyPixelRefEvent, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onDrawLazyPixelRef, m_client); |
@@ -885,6 +888,15 @@ void InspectorTimelineAgent::didCloseWebSocket(Document* document, unsigned long |
appendRecord(TimelineRecordFactory::createGenericWebSocketData(identifier), TimelineRecordType::WebSocketDestroy, true, document->frame()); |
} |
+void InspectorTimelineAgent::onBeginImplSideFrame(const TraceEventDispatcher::TraceEvent& event) |
+{ |
+ unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId); |
+ if (layerTreeId != m_layerTreeId) |
+ return; |
+ TimelineThreadState& state = threadState(event.threadIdentifier()); |
+ state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::BeginFrame)); |
+} |
+ |
void InspectorTimelineAgent::onPaintSetupBegin(const TraceEventDispatcher::TraceEvent& event) |
{ |
ASSERT(!m_paintSetupStart); |
@@ -950,6 +962,16 @@ void InspectorTimelineAgent::onImageDecodeEnd(const TraceEventDispatcher::TraceE |
state.recordStack.closeScopedRecord(m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp())); |
} |
+void InspectorTimelineAgent::onActivateLayerTree(const TraceEventDispatcher::TraceEvent& event) |
+{ |
+ unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId); |
+ if (layerTreeId != m_layerTreeId) |
+ return; |
+ unsigned long long frameId = event.asUInt(InstrumentationEventArguments::FrameId); |
+ TimelineThreadState& state = threadState(event.threadIdentifier()); |
+ state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::ActivateLayerTree, TimelineRecordFactory::createFrameData(frameId))); |
+} |
+ |
void InspectorTimelineAgent::onLayerDeleted(const TraceEventDispatcher::TraceEvent& event) |
{ |
unsigned long long id = event.id(); |
@@ -1209,6 +1231,12 @@ Page* InspectorTimelineAgent::page() |
return m_pageAgent ? m_pageAgent->page() : 0; |
} |
+PassRefPtr<JSONObject> InspectorTimelineAgent::createRecordForEvent(const TraceEventDispatcher::TraceEvent& event, const String& type, PassRefPtr<JSONObject> data) |
+{ |
+ double timeestamp = m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp()); |
+ return TimelineRecordFactory::createBackgroundRecord(timeestamp, String::number(event.threadIdentifier()), type, data); |
+} |
+ |
TimelineRecordStack::TimelineRecordStack(InspectorTimelineAgent* timelineAgent) |
: m_timelineAgent(timelineAgent) |
{ |