Chromium Code Reviews| 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 30 matching lines...) Expand all Loading... | |
| 41 #include "core/inspector/InspectorPageAgent.h" | 41 #include "core/inspector/InspectorPageAgent.h" |
| 42 #include "core/inspector/InspectorState.h" | 42 #include "core/inspector/InspectorState.h" |
| 43 #include "core/inspector/InstrumentingAgents.h" | 43 #include "core/inspector/InstrumentingAgents.h" |
| 44 #include "core/inspector/ScriptCallStack.h" | 44 #include "core/inspector/ScriptCallStack.h" |
| 45 #include "core/inspector/TimelineRecordFactory.h" | 45 #include "core/inspector/TimelineRecordFactory.h" |
| 46 #include "core/inspector/TimelineTraceEventProcessor.h" | 46 #include "core/inspector/TimelineTraceEventProcessor.h" |
| 47 #include "core/loader/DocumentLoader.h" | 47 #include "core/loader/DocumentLoader.h" |
| 48 #include "core/page/DOMWindow.h" | 48 #include "core/page/DOMWindow.h" |
| 49 #include "core/page/Frame.h" | 49 #include "core/page/Frame.h" |
| 50 #include "core/page/FrameView.h" | 50 #include "core/page/FrameView.h" |
| 51 #include "core/page/PageConsole.h" | |
| 51 #include "core/platform/MemoryUsageSupport.h" | 52 #include "core/platform/MemoryUsageSupport.h" |
| 52 #include "core/platform/chromium/TraceEvent.h" | 53 #include "core/platform/chromium/TraceEvent.h" |
| 53 #include "core/platform/network/ResourceRequest.h" | 54 #include "core/platform/network/ResourceRequest.h" |
| 54 #include "core/rendering/RenderObject.h" | 55 #include "core/rendering/RenderObject.h" |
| 55 #include "core/rendering/RenderView.h" | 56 #include "core/rendering/RenderView.h" |
| 56 #include "core/xml/XMLHttpRequest.h" | 57 #include "core/xml/XMLHttpRequest.h" |
| 57 | 58 |
| 58 #include "wtf/CurrentTime.h" | 59 #include "wtf/CurrentTime.h" |
| 59 | 60 |
| 60 namespace WebCore { | 61 namespace WebCore { |
| 61 | 62 |
| 62 namespace TimelineAgentState { | 63 namespace TimelineAgentState { |
| 63 static const char timelineAgentEnabled[] = "timelineAgentEnabled"; | 64 static const char startedFromProtocol[] = "startedFromProtocol"; |
| 64 static const char timelineMaxCallStackDepth[] = "timelineMaxCallStackDepth"; | 65 static const char timelineMaxCallStackDepth[] = "timelineMaxCallStackDepth"; |
| 65 static const char includeDomCounters[] = "includeDomCounters"; | 66 static const char includeDomCounters[] = "includeDomCounters"; |
| 66 static const char includeNativeMemoryStatistics[] = "includeNativeMemoryStatisti cs"; | 67 static const char includeNativeMemoryStatistics[] = "includeNativeMemoryStatisti cs"; |
| 67 } | 68 } |
| 68 | 69 |
| 69 // Must be kept in sync with WebInspector.TimelineModel.RecordType in TimelineMo del.js | 70 // Must be kept in sync with WebInspector.TimelineModel.RecordType in TimelineMo del.js |
| 70 namespace TimelineRecordType { | 71 namespace TimelineRecordType { |
| 71 static const char Program[] = "Program"; | 72 static const char Program[] = "Program"; |
| 72 | 73 |
| 73 static const char EventDispatch[] = "EventDispatch"; | 74 static const char EventDispatch[] = "EventDispatch"; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 188 void InspectorTimelineAgent::clearFrontend() | 189 void InspectorTimelineAgent::clearFrontend() |
| 189 { | 190 { |
| 190 ErrorString error; | 191 ErrorString error; |
| 191 stop(&error); | 192 stop(&error); |
| 192 releaseNodeIds(); | 193 releaseNodeIds(); |
| 193 m_frontend = 0; | 194 m_frontend = 0; |
| 194 } | 195 } |
| 195 | 196 |
| 196 void InspectorTimelineAgent::restore() | 197 void InspectorTimelineAgent::restore() |
| 197 { | 198 { |
| 198 if (m_state->getBoolean(TimelineAgentState::timelineAgentEnabled)) { | 199 if (m_state->getBoolean(TimelineAgentState::startedFromProtocol)) { |
| 199 m_maxCallStackDepth = m_state->getLong(TimelineAgentState::timelineMaxCa llStackDepth); | 200 m_maxCallStackDepth = m_state->getLong(TimelineAgentState::timelineMaxCa llStackDepth); |
| 200 ErrorString error; | 201 ErrorString error; |
| 201 bool includeDomCounters = m_state->getBoolean(TimelineAgentState::includ eDomCounters); | 202 bool includeDomCounters = m_state->getBoolean(TimelineAgentState::includ eDomCounters); |
| 202 bool includeNativeMemoryStatistics = m_state->getBoolean(TimelineAgentSt ate::includeNativeMemoryStatistics); | 203 bool includeNativeMemoryStatistics = m_state->getBoolean(TimelineAgentSt ate::includeNativeMemoryStatistics); |
| 203 start(&error, &m_maxCallStackDepth, &includeDomCounters, &includeNativeM emoryStatistics); | 204 start(&error, &m_maxCallStackDepth, &includeDomCounters, &includeNativeM emoryStatistics); |
| 204 } | 205 } |
| 205 } | 206 } |
| 206 | 207 |
| 207 void InspectorTimelineAgent::start(ErrorString*, const int* maxCallStackDepth, c onst bool* includeDomCounters, const bool* includeNativeMemoryStatistics) | 208 void InspectorTimelineAgent::start(ErrorString*, const int* maxCallStackDepth, c onst bool* includeDomCounters, const bool* includeNativeMemoryStatistics) |
| 208 { | 209 { |
| 209 if (!m_frontend) | 210 if (!m_frontend) |
| 210 return; | 211 return; |
| 212 m_state->setBoolean(TimelineAgentState::startedFromProtocol, true); | |
| 213 | |
| 214 if (m_isStarted) | |
| 215 return; | |
| 211 | 216 |
| 212 releaseNodeIds(); | 217 releaseNodeIds(); |
| 213 if (maxCallStackDepth && *maxCallStackDepth >= 0) | 218 if (maxCallStackDepth && *maxCallStackDepth >= 0) |
| 214 m_maxCallStackDepth = *maxCallStackDepth; | 219 m_maxCallStackDepth = *maxCallStackDepth; |
| 215 else | 220 else |
| 216 m_maxCallStackDepth = 5; | 221 m_maxCallStackDepth = 5; |
| 217 m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallSta ckDepth); | 222 m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallSta ckDepth); |
| 218 m_state->setBoolean(TimelineAgentState::includeDomCounters, includeDomCounte rs && *includeDomCounters); | 223 m_state->setBoolean(TimelineAgentState::includeDomCounters, includeDomCounte rs && *includeDomCounters); |
| 219 m_state->setBoolean(TimelineAgentState::includeNativeMemoryStatistics, inclu deNativeMemoryStatistics && *includeNativeMemoryStatistics); | 224 m_state->setBoolean(TimelineAgentState::includeNativeMemoryStatistics, inclu deNativeMemoryStatistics && *includeNativeMemoryStatistics); |
| 225 innerStart(false); | |
| 226 } | |
| 227 | |
| 228 void InspectorTimelineAgent::innerStart(bool fromConsole) | |
| 229 { | |
| 230 if (m_isStarted) | |
| 231 return; | |
| 232 m_isStarted = true; | |
| 233 | |
| 220 m_timeConverter.reset(); | 234 m_timeConverter.reset(); |
| 221 | |
| 222 m_instrumentingAgents->setInspectorTimelineAgent(this); | 235 m_instrumentingAgents->setInspectorTimelineAgent(this); |
| 223 ScriptGCEvent::addEventListener(this); | 236 ScriptGCEvent::addEventListener(this); |
| 224 m_state->setBoolean(TimelineAgentState::timelineAgentEnabled, true); | |
| 225 if (m_client && m_pageAgent) | 237 if (m_client && m_pageAgent) |
| 226 m_traceEventProcessor = adoptRef(new TimelineTraceEventProcessor(m_weakF actory.createWeakPtr(), m_client)); | 238 m_traceEventProcessor = adoptRef(new TimelineTraceEventProcessor(m_weakF actory.createWeakPtr(), m_client)); |
| 239 m_frontend->started(&fromConsole); | |
| 227 } | 240 } |
| 228 | 241 |
| 229 void InspectorTimelineAgent::stop(ErrorString*) | 242 void InspectorTimelineAgent::stop(ErrorString*) |
| 230 { | 243 { |
| 231 if (!m_state->getBoolean(TimelineAgentState::timelineAgentEnabled)) | 244 innerStop(false); |
| 245 m_state->setBoolean(TimelineAgentState::startedFromProtocol, false); | |
| 246 } | |
| 247 | |
| 248 void InspectorTimelineAgent::innerStop(bool fromConsole) | |
| 249 { | |
| 250 if (!m_isStarted) | |
| 232 return; | 251 return; |
| 252 m_isStarted = false; | |
| 233 | 253 |
| 234 if (m_traceEventProcessor) { | 254 if (m_traceEventProcessor) { |
| 235 m_traceEventProcessor->shutdown(); | 255 m_traceEventProcessor->shutdown(); |
| 236 m_traceEventProcessor.clear(); | 256 m_traceEventProcessor.clear(); |
| 237 } | 257 } |
| 238 m_weakFactory.revokeAll(); | 258 m_weakFactory.revokeAll(); |
| 239 m_instrumentingAgents->setInspectorTimelineAgent(0); | 259 m_instrumentingAgents->setInspectorTimelineAgent(0); |
| 240 ScriptGCEvent::removeEventListener(this); | 260 ScriptGCEvent::removeEventListener(this); |
| 241 | 261 |
| 242 clearRecordStack(); | 262 clearRecordStack(); |
| 243 m_gcEvents.clear(); | 263 m_gcEvents.clear(); |
| 244 | 264 |
| 245 m_state->setBoolean(TimelineAgentState::timelineAgentEnabled, false); | 265 for (size_t i = 0; i < m_consoleTimelines.size(); ++i) { |
| 266 String message = String::format("Timeline '%s' terminated.", m_consoleTi melines[i].utf8().data()); | |
| 267 page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message); | |
| 268 } | |
| 269 m_consoleTimelines.clear(); | |
| 270 | |
| 271 m_frontend->stopped(&fromConsole); | |
| 246 } | 272 } |
| 247 | 273 |
| 248 void InspectorTimelineAgent::didBeginFrame() | 274 void InspectorTimelineAgent::didBeginFrame() |
| 249 { | 275 { |
| 250 TRACE_EVENT_INSTANT0("webkit", InstrumentationEvents::BeginFrame); | 276 TRACE_EVENT_INSTANT0("webkit", InstrumentationEvents::BeginFrame); |
| 251 m_pendingFrameRecord = TimelineRecordFactory::createGenericRecord(timestamp( ), 0, TimelineRecordType::BeginFrame); | 277 m_pendingFrameRecord = TimelineRecordFactory::createGenericRecord(timestamp( ), 0, TimelineRecordType::BeginFrame); |
| 252 } | 278 } |
| 253 | 279 |
| 254 void InspectorTimelineAgent::didCancelFrame() | 280 void InspectorTimelineAgent::didCancelFrame() |
| 255 { | 281 { |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 542 finishTime = loader->timing()->monotonicTimeToPseudoWallTime(monotonicFi nishTime); | 568 finishTime = loader->timing()->monotonicTimeToPseudoWallTime(monotonicFi nishTime); |
| 543 | 569 |
| 544 didFinishLoadingResource(identifier, false, finishTime, loader->frame()); | 570 didFinishLoadingResource(identifier, false, finishTime, loader->frame()); |
| 545 } | 571 } |
| 546 | 572 |
| 547 void InspectorTimelineAgent::didFailLoading(unsigned long identifier, DocumentLo ader* loader, const ResourceError& error) | 573 void InspectorTimelineAgent::didFailLoading(unsigned long identifier, DocumentLo ader* loader, const ResourceError& error) |
| 548 { | 574 { |
| 549 didFinishLoadingResource(identifier, true, 0, loader->frame()); | 575 didFinishLoadingResource(identifier, true, 0, loader->frame()); |
| 550 } | 576 } |
| 551 | 577 |
| 552 void InspectorTimelineAgent::consoleTimeStamp(ScriptExecutionContext* context, P assRefPtr<ScriptArguments> arguments) | 578 void InspectorTimelineAgent::consoleTimeStamp(ScriptExecutionContext* context, c onst String& title) |
| 553 { | 579 { |
| 554 String message; | 580 appendRecord(TimelineRecordFactory::createTimeStampData(title), TimelineReco rdType::TimeStamp, true, frameForScriptExecutionContext(context)); |
| 555 arguments->getFirstArgumentAsString(message); | |
| 556 appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRe cordType::TimeStamp, true, frameForScriptExecutionContext(context)); | |
| 557 } | 581 } |
| 558 | 582 |
| 559 void InspectorTimelineAgent::startConsoleTiming(ScriptExecutionContext* context, const String& message) | 583 void InspectorTimelineAgent::consoleTime(ScriptExecutionContext* context, const String& message) |
| 560 { | 584 { |
| 561 appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRe cordType::Time, true, frameForScriptExecutionContext(context)); | 585 appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRe cordType::Time, true, frameForScriptExecutionContext(context)); |
| 562 } | 586 } |
| 563 | 587 |
| 564 void InspectorTimelineAgent::stopConsoleTiming(ScriptExecutionContext* context, const String& message, PassRefPtr<ScriptCallStack> stack) | 588 void InspectorTimelineAgent::consoleTimeEnd(ScriptExecutionContext* context, con st String& message, ScriptState*) |
| 565 { | 589 { |
| 566 appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRe cordType::TimeEnd, true, frameForScriptExecutionContext(context)); | 590 appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRe cordType::TimeEnd, true, frameForScriptExecutionContext(context)); |
| 567 } | 591 } |
| 568 | 592 |
| 593 void InspectorTimelineAgent::consoleTimeline(ScriptExecutionContext* context, co nst String& title, ScriptState* state) | |
| 594 { | |
| 595 String message = String::format("Timeline '%s' started.", title.utf8().data( )); | |
| 596 page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, mes sage, String(), 0, 0, 0, state); | |
| 597 m_consoleTimelines.append(title); | |
|
yurys
2013/09/06 07:56:45
What is the expected behavior when same timeline i
pfeldman
2013/09/06 16:10:30
console.timeline("one")
console.timeline("one")
co
| |
| 598 innerStart(true); | |
| 599 appendRecord(TimelineRecordFactory::createTimeStampData(title), TimelineReco rdType::TimeStamp, true, frameForScriptExecutionContext(context)); | |
| 600 } | |
| 601 | |
| 602 void InspectorTimelineAgent::consoleTimelineEnd(ScriptExecutionContext* context, const String& title, ScriptState* state) | |
| 603 { | |
| 604 size_t index = m_consoleTimelines.find(title); | |
| 605 if (index == notFound) { | |
| 606 String message = String::format("Timeline '%s' was not started.", title. utf8().data()); | |
| 607 page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message, String(), 0, 0, 0, state); | |
| 608 return; | |
| 609 } | |
| 610 | |
| 611 appendRecord(TimelineRecordFactory::createTimeStampData(title), TimelineReco rdType::TimeStamp, true, frameForScriptExecutionContext(context)); | |
| 612 m_consoleTimelines.remove(index); | |
| 613 if (!m_consoleTimelines.size() && !m_state->getBoolean(TimelineAgentState::s tartedFromProtocol)) | |
| 614 innerStop(true); | |
| 615 | |
| 616 String message = String::format("Timeline '%s' finished.", title.utf8().data ()); | |
| 617 page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, mes sage, String(), 0, 0, 0, state); | |
| 618 } | |
| 569 | 619 |
| 570 void InspectorTimelineAgent::domContentLoadedEventFired(Frame* frame) | 620 void InspectorTimelineAgent::domContentLoadedEventFired(Frame* frame) |
| 571 { | 621 { |
| 572 bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame( )); | 622 bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame( )); |
| 573 appendRecord(TimelineRecordFactory::createMarkData(isMainFrame), TimelineRec ordType::MarkDOMContent, false, frame); | 623 appendRecord(TimelineRecordFactory::createMarkData(isMainFrame), TimelineRec ordType::MarkDOMContent, false, frame); |
| 574 } | 624 } |
| 575 | 625 |
| 576 void InspectorTimelineAgent::loadEventFired(Frame* frame) | 626 void InspectorTimelineAgent::loadEventFired(Frame* frame) |
| 577 { | 627 { |
| 578 bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame( )); | 628 bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame( )); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 722 , m_domAgent(domAgent) | 772 , m_domAgent(domAgent) |
| 723 , m_frontend(0) | 773 , m_frontend(0) |
| 724 , m_id(1) | 774 , m_id(1) |
| 725 , m_maxCallStackDepth(5) | 775 , m_maxCallStackDepth(5) |
| 726 , m_platformInstrumentationClientInstalledAtStackDepth(0) | 776 , m_platformInstrumentationClientInstalledAtStackDepth(0) |
| 727 , m_inspectorType(type) | 777 , m_inspectorType(type) |
| 728 , m_client(client) | 778 , m_client(client) |
| 729 , m_weakFactory(this) | 779 , m_weakFactory(this) |
| 730 , m_styleRecalcElementCounter(0) | 780 , m_styleRecalcElementCounter(0) |
| 731 , m_layerTreeId(0) | 781 , m_layerTreeId(0) |
| 782 , m_isStarted(false) | |
| 732 { | 783 { |
| 733 } | 784 } |
| 734 | 785 |
| 735 void InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const Str ing& type, bool captureCallStack, Frame* frame) | 786 void InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const Str ing& type, bool captureCallStack, Frame* frame) |
| 736 { | 787 { |
| 737 pushGCEventRecords(); | 788 pushGCEventRecords(); |
| 738 RefPtr<JSONObject> record = TimelineRecordFactory::createGenericRecord(times tamp(), captureCallStack ? m_maxCallStackDepth : 0, type); | 789 RefPtr<JSONObject> record = TimelineRecordFactory::createGenericRecord(times tamp(), captureCallStack ? m_maxCallStackDepth : 0, type); |
| 739 record->setObject("data", data); | 790 record->setObject("data", data); |
| 740 setFrameIdentifier(record.get(), frame); | 791 setFrameIdentifier(record.get(), frame); |
| 741 addRecordToTimeline(record.release()); | 792 addRecordToTimeline(record.release()); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 809 return m_timeConverter.fromMonotonicallyIncreasingTime(WTF::monotonicallyInc reasingTime()); | 860 return m_timeConverter.fromMonotonicallyIncreasingTime(WTF::monotonicallyInc reasingTime()); |
| 810 } | 861 } |
| 811 | 862 |
| 812 Page* InspectorTimelineAgent::page() | 863 Page* InspectorTimelineAgent::page() |
| 813 { | 864 { |
| 814 return m_pageAgent ? m_pageAgent->page() : 0; | 865 return m_pageAgent ? m_pageAgent->page() : 0; |
| 815 } | 866 } |
| 816 | 867 |
| 817 } // namespace WebCore | 868 } // namespace WebCore |
| 818 | 869 |
| OLD | NEW |