| 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 |