OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 } | 263 } |
264 | 264 |
265 void InspectorTimelineAgent::pushGCEventRecords() | 265 void InspectorTimelineAgent::pushGCEventRecords() |
266 { | 266 { |
267 if (!m_gcEvents.size()) | 267 if (!m_gcEvents.size()) |
268 return; | 268 return; |
269 | 269 |
270 GCEvents events = m_gcEvents; | 270 GCEvents events = m_gcEvents; |
271 m_gcEvents.clear(); | 271 m_gcEvents.clear(); |
272 for (GCEvents::iterator i = events.begin(); i != events.end(); ++i) { | 272 for (GCEvents::iterator i = events.begin(); i != events.end(); ++i) { |
273 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecor
d(m_timeConverter.fromMonotonicallyIncreasingTime(i->startTime), m_maxCallStackD
epth, TimelineRecordType::GCEvent, TimelineRecordFactory::createGCEventData(i->c
ollectedBytes)); | 273 double ts = m_timeConverter.fromMonotonicallyIncreasingTime(i->startTime
); |
| 274 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecor
d(ts, m_maxCallStackDepth, TimelineRecordType::GCEvent, TimelineRecordFactory::c
reateGCEventData(i->collectedBytes)); |
274 record->setEndTime(m_timeConverter.fromMonotonicallyIncreasingTime(i->en
dTime)); | 275 record->setEndTime(m_timeConverter.fromMonotonicallyIncreasingTime(i->en
dTime)); |
275 addRecordToTimeline(record.release()); | 276 addRecordToTimeline(record.release(), ts); |
276 } | 277 } |
277 } | 278 } |
278 | 279 |
279 void InspectorTimelineAgent::didGC(double startTime, double endTime, size_t coll
ectedBytesCount) | 280 void InspectorTimelineAgent::didGC(double startTime, double endTime, size_t coll
ectedBytesCount) |
280 { | 281 { |
281 m_gcEvents.append(TimelineGCEvent(startTime, endTime, collectedBytesCount)); | 282 m_gcEvents.append(TimelineGCEvent(startTime, endTime, collectedBytesCount)); |
282 } | 283 } |
283 | 284 |
284 InspectorTimelineAgent::~InspectorTimelineAgent() | 285 InspectorTimelineAgent::~InspectorTimelineAgent() |
285 { | 286 { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 *errorString = "Timeline is already started"; | 338 *errorString = "Timeline is already started"; |
338 return; | 339 return; |
339 } | 340 } |
340 | 341 |
341 releaseNodeIds(); | 342 releaseNodeIds(); |
342 if (maxCallStackDepth && *maxCallStackDepth >= 0) | 343 if (maxCallStackDepth && *maxCallStackDepth >= 0) |
343 m_maxCallStackDepth = *maxCallStackDepth; | 344 m_maxCallStackDepth = *maxCallStackDepth; |
344 else | 345 else |
345 m_maxCallStackDepth = 5; | 346 m_maxCallStackDepth = 5; |
346 | 347 |
347 if (bufferEvents && *bufferEvents) | 348 if (bufferEvents && *bufferEvents) { |
348 m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create(); | 349 m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create(); |
| 350 m_lastProgressTimestamp = timestamp(); |
| 351 } |
| 352 |
349 if (liveEvents) | 353 if (liveEvents) |
350 setLiveEvents(*liveEvents); | 354 setLiveEvents(*liveEvents); |
351 | 355 |
352 m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallSta
ckDepth); | 356 m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallSta
ckDepth); |
353 m_state->setBoolean(TimelineAgentState::includeCounters, includeCounters &&
*includeCounters); | 357 m_state->setBoolean(TimelineAgentState::includeCounters, includeCounters &&
*includeCounters); |
354 m_state->setBoolean(TimelineAgentState::includeGPUEvents, includeGPUEvents &
& *includeGPUEvents); | 358 m_state->setBoolean(TimelineAgentState::includeGPUEvents, includeGPUEvents &
& *includeGPUEvents); |
355 m_state->setBoolean(TimelineAgentState::bufferEvents, bufferEvents && *buffe
rEvents); | 359 m_state->setBoolean(TimelineAgentState::bufferEvents, bufferEvents && *buffe
rEvents); |
356 m_state->setString(TimelineAgentState::liveEvents, liveEvents ? *liveEvents
: ""); | 360 m_state->setString(TimelineAgentState::liveEvents, liveEvents ? *liveEvents
: ""); |
357 | 361 |
358 innerStart(); | 362 innerStart(); |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 double paintSetupStart = m_paintSetupStart; | 590 double paintSetupStart = m_paintSetupStart; |
587 m_paintSetupStart = 0; | 591 m_paintSetupStart = 0; |
588 if (graphicsLayer) { | 592 if (graphicsLayer) { |
589 int layerIdentifier = graphicsLayer->platformLayer()->id(); | 593 int layerIdentifier = graphicsLayer->platformLayer()->id(); |
590 int nodeIdentifier = nodeId(renderer); | 594 int nodeIdentifier = nodeId(renderer); |
591 ASSERT(layerIdentifier && nodeIdentifier); | 595 ASSERT(layerIdentifier && nodeIdentifier); |
592 m_layerToNodeMap.set(layerIdentifier, nodeIdentifier); | 596 m_layerToNodeMap.set(layerIdentifier, nodeIdentifier); |
593 if (paintSetupStart) { | 597 if (paintSetupStart) { |
594 RefPtr<TimelineEvent> paintSetupRecord = TimelineRecordFactory::crea
teGenericRecord(paintSetupStart, 0, TimelineRecordType::PaintSetup, TimelineReco
rdFactory::createLayerData(nodeIdentifier)); | 598 RefPtr<TimelineEvent> paintSetupRecord = TimelineRecordFactory::crea
teGenericRecord(paintSetupStart, 0, TimelineRecordType::PaintSetup, TimelineReco
rdFactory::createLayerData(nodeIdentifier)); |
595 paintSetupRecord->setEndTime(m_paintSetupEnd); | 599 paintSetupRecord->setEndTime(m_paintSetupEnd); |
596 addRecordToTimeline(paintSetupRecord); | 600 addRecordToTimeline(paintSetupRecord, paintSetupStart); |
597 } | 601 } |
598 } | 602 } |
599 pushCurrentRecord(JSONObject::create(), TimelineRecordType::Paint, true, fra
me, true); | 603 pushCurrentRecord(JSONObject::create(), TimelineRecordType::Paint, true, fra
me, true); |
600 } | 604 } |
601 | 605 |
602 void InspectorTimelineAgent::didPaint(RenderObject* renderer, const GraphicsLaye
r* graphicsLayer, GraphicsContext*, const LayoutRect& clipRect) | 606 void InspectorTimelineAgent::didPaint(RenderObject* renderer, const GraphicsLaye
r* graphicsLayer, GraphicsContext*, const LayoutRect& clipRect) |
603 { | 607 { |
604 TimelineRecordEntry& entry = m_recordStack.last(); | 608 TimelineRecordEntry& entry = m_recordStack.last(); |
605 ASSERT(entry.type == TimelineRecordType::Paint); | 609 ASSERT(entry.type == TimelineRecordType::Paint); |
606 FloatQuad quad; | 610 FloatQuad quad; |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ti
mestamp, 0, TimelineRecordType::EmbedderCallback, data); | 1090 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ti
mestamp, 0, TimelineRecordType::EmbedderCallback, data); |
1087 state.recordStack.addScopedRecord(record, TimelineRecordType::EmbedderCallba
ck); | 1091 state.recordStack.addScopedRecord(record, TimelineRecordType::EmbedderCallba
ck); |
1088 } | 1092 } |
1089 | 1093 |
1090 void InspectorTimelineAgent::onEmbedderCallbackEnd(const TraceEventDispatcher::T
raceEvent& event) | 1094 void InspectorTimelineAgent::onEmbedderCallbackEnd(const TraceEventDispatcher::T
raceEvent& event) |
1091 { | 1095 { |
1092 TimelineThreadState& state = threadState(event.threadIdentifier()); | 1096 TimelineThreadState& state = threadState(event.threadIdentifier()); |
1093 state.recordStack.closeScopedRecord(m_timeConverter.fromMonotonicallyIncreas
ingTime(event.timestamp())); | 1097 state.recordStack.closeScopedRecord(m_timeConverter.fromMonotonicallyIncreas
ingTime(event.timestamp())); |
1094 } | 1098 } |
1095 | 1099 |
1096 void InspectorTimelineAgent::addRecordToTimeline(PassRefPtr<TimelineEvent> recor
d) | 1100 void InspectorTimelineAgent::addRecordToTimeline(PassRefPtr<TimelineEvent> recor
d, double ts) |
1097 { | 1101 { |
1098 commitFrameRecord(); | 1102 commitFrameRecord(); |
1099 innerAddRecordToTimeline(record); | 1103 innerAddRecordToTimeline(record); |
| 1104 if (m_bufferedEvents && ts - m_lastProgressTimestamp > 300) { |
| 1105 m_lastProgressTimestamp = ts; |
| 1106 m_frontend->progress(m_bufferedEvents->length()); |
| 1107 } |
1100 } | 1108 } |
1101 | 1109 |
1102 void InspectorTimelineAgent::innerAddRecordToTimeline(PassRefPtr<TimelineEvent>
record) | 1110 void InspectorTimelineAgent::innerAddRecordToTimeline(PassRefPtr<TimelineEvent>
record) |
1103 { | 1111 { |
1104 if (m_recordStack.isEmpty()) { | 1112 if (m_recordStack.isEmpty()) { |
1105 TraceEventDispatcher::instance()->processBackgroundEvents(); | 1113 TraceEventDispatcher::instance()->processBackgroundEvents(); |
1106 sendEvent(record); | 1114 sendEvent(record); |
1107 } else { | 1115 } else { |
1108 setCounters(record.get()); | 1116 setCounters(record.get()); |
1109 TimelineRecordEntry& parent = m_recordStack.last(); | 1117 TimelineRecordEntry& parent = m_recordStack.last(); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 m_recordStack.removeLast(); | 1171 m_recordStack.removeLast(); |
1164 while (entry.type != type && entry.skipWhenUnbalanced && !m_recordStack.
isEmpty()) { | 1172 while (entry.type != type && entry.skipWhenUnbalanced && !m_recordStack.
isEmpty()) { |
1165 // Discard pending skippable entry, paste its children inplace. | 1173 // Discard pending skippable entry, paste its children inplace. |
1166 if (entry.children) | 1174 if (entry.children) |
1167 m_recordStack.last().children->concat(entry.children); | 1175 m_recordStack.last().children->concat(entry.children); |
1168 entry = m_recordStack.last(); | 1176 entry = m_recordStack.last(); |
1169 m_recordStack.removeLast(); | 1177 m_recordStack.removeLast(); |
1170 } | 1178 } |
1171 ASSERT(entry.type == type); | 1179 ASSERT(entry.type == type); |
1172 entry.record->setChildren(entry.children); | 1180 entry.record->setChildren(entry.children); |
1173 entry.record->setEndTime(timestamp()); | 1181 double ts = timestamp(); |
| 1182 entry.record->setEndTime(ts); |
1174 ptrdiff_t usedHeapSizeDelta = getUsedHeapSize() - entry.usedHeapSizeAtSt
art; | 1183 ptrdiff_t usedHeapSizeDelta = getUsedHeapSize() - entry.usedHeapSizeAtSt
art; |
1175 if (usedHeapSizeDelta) | 1184 if (usedHeapSizeDelta) |
1176 entry.record->setUsedHeapSizeDelta(usedHeapSizeDelta); | 1185 entry.record->setUsedHeapSizeDelta(usedHeapSizeDelta); |
1177 addRecordToTimeline(entry.record); | 1186 addRecordToTimeline(entry.record, ts); |
1178 } | 1187 } |
1179 } | 1188 } |
1180 | 1189 |
1181 void InspectorTimelineAgent::unwindRecordStack() | 1190 void InspectorTimelineAgent::unwindRecordStack() |
1182 { | 1191 { |
1183 while (!m_recordStack.isEmpty()) { | 1192 while (!m_recordStack.isEmpty()) { |
1184 TimelineRecordEntry& entry = m_recordStack.last(); | 1193 TimelineRecordEntry& entry = m_recordStack.last(); |
1185 didCompleteCurrentRecord(entry.type); | 1194 didCompleteCurrentRecord(entry.type); |
1186 } | 1195 } |
1187 } | 1196 } |
1188 | 1197 |
1189 InspectorTimelineAgent::InspectorTimelineAgent(InspectorPageAgent* pageAgent, In
spectorDOMAgent* domAgent, InspectorLayerTreeAgent* layerTreeAgent, | 1198 InspectorTimelineAgent::InspectorTimelineAgent(InspectorPageAgent* pageAgent, In
spectorDOMAgent* domAgent, InspectorLayerTreeAgent* layerTreeAgent, |
1190 InspectorOverlay* overlay, InspectorType type, InspectorClient* client) | 1199 InspectorOverlay* overlay, InspectorType type, InspectorClient* client) |
1191 : InspectorBaseAgent<InspectorTimelineAgent>("Timeline") | 1200 : InspectorBaseAgent<InspectorTimelineAgent>("Timeline") |
1192 , m_pageAgent(pageAgent) | 1201 , m_pageAgent(pageAgent) |
1193 , m_domAgent(domAgent) | 1202 , m_domAgent(domAgent) |
1194 , m_layerTreeAgent(layerTreeAgent) | 1203 , m_layerTreeAgent(layerTreeAgent) |
1195 , m_frontend(0) | 1204 , m_frontend(0) |
1196 , m_client(client) | 1205 , m_client(client) |
1197 , m_overlay(overlay) | 1206 , m_overlay(overlay) |
1198 , m_inspectorType(type) | 1207 , m_inspectorType(type) |
1199 , m_id(1) | 1208 , m_id(1) |
1200 , m_layerTreeId(0) | 1209 , m_layerTreeId(0) |
1201 , m_maxCallStackDepth(5) | 1210 , m_maxCallStackDepth(5) |
1202 , m_platformInstrumentationClientInstalledAtStackDepth(0) | 1211 , m_platformInstrumentationClientInstalledAtStackDepth(0) |
1203 , m_imageBeingPainted(0) | 1212 , m_imageBeingPainted(0) |
1204 , m_paintSetupStart(0) | 1213 , m_paintSetupStart(0) |
1205 , m_styleRecalcElementCounter(0) | 1214 , m_styleRecalcElementCounter(0) |
1206 , m_mayEmitFirstPaint(false) | 1215 , m_mayEmitFirstPaint(false) |
| 1216 , m_lastProgressTimestamp(0) |
1207 { | 1217 { |
1208 } | 1218 } |
1209 | 1219 |
1210 void InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const Str
ing& type, bool captureCallStack, LocalFrame* frame) | 1220 void InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const Str
ing& type, bool captureCallStack, LocalFrame* frame) |
1211 { | 1221 { |
1212 pushGCEventRecords(); | 1222 pushGCEventRecords(); |
1213 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ti
mestamp(), captureCallStack ? m_maxCallStackDepth : 0, type, data); | 1223 double ts = timestamp(); |
| 1224 RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ts
, captureCallStack ? m_maxCallStackDepth : 0, type, data); |
1214 setFrameIdentifier(record.get(), frame); | 1225 setFrameIdentifier(record.get(), frame); |
1215 addRecordToTimeline(record.release()); | 1226 addRecordToTimeline(record.release(), ts); |
1216 } | 1227 } |
1217 | 1228 |
1218 void InspectorTimelineAgent::sendEvent(PassRefPtr<TimelineEvent> record) | 1229 void InspectorTimelineAgent::sendEvent(PassRefPtr<TimelineEvent> record) |
1219 { | 1230 { |
1220 RefPtr<TimelineEvent> retain = record; | 1231 RefPtr<TimelineEvent> retain = record; |
1221 if (m_bufferedEvents) { | 1232 if (m_bufferedEvents) { |
1222 m_bufferedEvents->addItem(retain); | 1233 m_bufferedEvents->addItem(retain); |
1223 if (!m_liveEvents.contains(TimelineRecordFactory::type(retain.get()))) | 1234 if (!m_liveEvents.contains(TimelineRecordFactory::type(retain.get()))) |
1224 return; | 1235 return; |
1225 } | 1236 } |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1354 | 1365 |
1355 #ifndef NDEBUG | 1366 #ifndef NDEBUG |
1356 bool TimelineRecordStack::isOpenRecordOfType(const String& type) | 1367 bool TimelineRecordStack::isOpenRecordOfType(const String& type) |
1357 { | 1368 { |
1358 return !m_stack.isEmpty() && m_stack.last().type == type; | 1369 return !m_stack.isEmpty() && m_stack.last().type == type; |
1359 } | 1370 } |
1360 #endif | 1371 #endif |
1361 | 1372 |
1362 } // namespace WebCore | 1373 } // namespace WebCore |
1363 | 1374 |
OLD | NEW |