Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / inspector / InspectorTimelineAgent.cpp
index 6c43308..3e03db9 100644 (file)
@@ -37,6 +37,7 @@
 #include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
+#include "core/inspector/ConsoleMessage.h"
 #include "core/inspector/IdentifiersFactory.h"
 #include "core/inspector/InspectorClient.h"
 #include "core/inspector/InspectorCounters.h"
@@ -62,7 +63,7 @@
 #include "wtf/CurrentTime.h"
 #include "wtf/DateMath.h"
 
-namespace WebCore {
+namespace blink {
 
 namespace TimelineAgentState {
 static const char enabled[] = "enabled";
@@ -141,6 +142,37 @@ static const char EmbedderCallback[] = "EmbedderCallback";
 
 using TypeBuilder::Timeline::TimelineEvent;
 
+class InspectorTimelineAgentTraceEventListener : public TraceEventDispatcher::TraceEventListener {
+public:
+    typedef void (InspectorTimelineAgent::*TraceEventHandlerMethod)(const TraceEventDispatcher::TraceEvent&);
+    static PassOwnPtrWillBeRawPtr<InspectorTimelineAgentTraceEventListener> create(InspectorTimelineAgent* instance, TraceEventHandlerMethod method)
+    {
+        return adoptPtrWillBeNoop(new InspectorTimelineAgentTraceEventListener(instance, method));
+    }
+    virtual void call(const TraceEventDispatcher::TraceEvent& event) OVERRIDE
+    {
+        (m_instance->*m_method)(event);
+    }
+    virtual void* target() OVERRIDE
+    {
+        return m_instance;
+    }
+    virtual void trace(Visitor* visitor) OVERRIDE
+    {
+        visitor->trace(m_instance);
+        TraceEventDispatcher::TraceEventListener::trace(visitor);
+    }
+
+private:
+    InspectorTimelineAgentTraceEventListener(InspectorTimelineAgent* instance, TraceEventHandlerMethod method)
+        : m_instance(instance)
+        , m_method(method)
+    {
+    }
+    RawPtrWillBeMember<InspectorTimelineAgent> m_instance;
+    TraceEventHandlerMethod m_method;
+};
+
 struct TimelineRecordEntry {
     TimelineRecordEntry(PassRefPtr<TimelineEvent> record, PassRefPtr<JSONObject> data, PassRefPtr<TypeBuilder::Array<TimelineEvent> > children, const String& type)
         : record(record)
@@ -158,12 +190,13 @@ struct TimelineRecordEntry {
 };
 
 class TimelineRecordStack {
+    DISALLOW_ALLOCATION();
 private:
     struct Entry {
         Entry(PassRefPtr<TimelineEvent> record, const String& type)
             : record(record)
             , children(TypeBuilder::Array<TimelineEvent>::create())
-#ifndef NDEBUG
+#if ENABLE(ASSERT)
             , type(type)
 #endif
         {
@@ -171,31 +204,35 @@ private:
 
         RefPtr<TimelineEvent> record;
         RefPtr<TypeBuilder::Array<TimelineEvent> > children;
-#ifndef NDEBUG
+#if ENABLE(ASSERT)
         String type;
 #endif
     };
 
 public:
-    TimelineRecordStack() : m_timelineAgent(0) { }
-    TimelineRecordStack(InspectorTimelineAgent*);
+    TimelineRecordStack() : m_timelineAgent(nullptr) { }
+    explicit TimelineRecordStack(InspectorTimelineAgent*);
 
     void addScopedRecord(PassRefPtr<TimelineEvent> record, const String& type);
     void closeScopedRecord(double endTime);
     void addInstantRecord(PassRefPtr<TimelineEvent> record);
 
-#ifndef NDEBUG
+#if ENABLE(ASSERT)
     bool isOpenRecordOfType(const String& type);
 #endif
 
+    void trace(Visitor*);
+
 private:
     void send(PassRefPtr<JSONObject>);
 
-    InspectorTimelineAgent* m_timelineAgent;
+    RawPtrWillBeMember<InspectorTimelineAgent> m_timelineAgent;
     Vector<Entry> m_stack;
 };
 
 struct TimelineThreadState {
+    ALLOW_ONLY_INLINE_ALLOCATION();
+public:
     TimelineThreadState() { }
 
     TimelineThreadState(InspectorTimelineAgent* timelineAgent)
@@ -205,6 +242,8 @@ struct TimelineThreadState {
     {
     }
 
+    void trace(Visitor*);
+
     TimelineRecordStack recordStack;
     bool inKnownLayerTask;
     unsigned long long decodedPixelRefId;
@@ -261,6 +300,16 @@ InspectorTimelineAgent::~InspectorTimelineAgent()
 {
 }
 
+void InspectorTimelineAgent::trace(Visitor* visitor)
+{
+    visitor->trace(m_pageAgent);
+    visitor->trace(m_layerTreeAgent);
+#if ENABLE(OILPAN)
+    visitor->trace(m_threadStates);
+#endif
+    InspectorBaseAgent::trace(visitor);
+}
+
 void InspectorTimelineAgent::setFrontend(InspectorFrontend* frontend)
 {
     m_frontend = frontend->timeline();
@@ -269,8 +318,7 @@ void InspectorTimelineAgent::setFrontend(InspectorFrontend* frontend)
 void InspectorTimelineAgent::clearFrontend()
 {
     ErrorString error;
-    RefPtr<TypeBuilder::Array<TimelineEvent> > events;
-    stop(&error, events);
+    stop(&error);
     disable(&error);
     m_frontend = 0;
 }
@@ -288,7 +336,7 @@ void InspectorTimelineAgent::restore()
         // Tell front-end timline is no longer collecting.
         m_state->setBoolean(TimelineAgentState::started, false);
         bool fromConsole = true;
-        m_frontend->stopped(&fromConsole);
+        m_frontend->stopped(&fromConsole, nullptr);
     }
 }
 
@@ -318,7 +366,7 @@ void InspectorTimelineAgent::start(ErrorString* errorString, const int* maxCallS
     else
         m_maxCallStackDepth = 5;
 
-    if (bufferEvents && *bufferEvents) {
+    if (asBool(bufferEvents)) {
         m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create();
         m_lastProgressTimestamp = timestamp();
     }
@@ -327,9 +375,9 @@ void InspectorTimelineAgent::start(ErrorString* errorString, const int* maxCallS
         setLiveEvents(*liveEvents);
 
     m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallStackDepth);
-    m_state->setBoolean(TimelineAgentState::includeCounters, includeCounters && *includeCounters);
-    m_state->setBoolean(TimelineAgentState::includeGPUEvents, includeGPUEvents && *includeGPUEvents);
-    m_state->setBoolean(TimelineAgentState::bufferEvents, bufferEvents && *bufferEvents);
+    m_state->setBoolean(TimelineAgentState::includeCounters, asBool(includeCounters));
+    m_state->setBoolean(TimelineAgentState::includeGPUEvents, asBool(includeGPUEvents));
+    m_state->setBoolean(TimelineAgentState::bufferEvents, asBool(bufferEvents));
     m_state->setString(TimelineAgentState::liveEvents, liveEvents ? *liveEvents : "");
 
     innerStart();
@@ -351,23 +399,23 @@ 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::RequestMainThreadFrame, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onRequestMainThreadFrame, m_client);
-        dispatcher->addListener(InstrumentationEvents::ActivateLayerTree, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onActivateLayerTree, m_client);
-        dispatcher->addListener(InstrumentationEvents::DrawFrame, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onDrawFrame, 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);
-        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onDecodeLazyPixelRefBegin, m_client);
-        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onDecodeLazyPixelRefEnd, m_client);
-        dispatcher->addListener(PlatformInstrumentation::LazyPixelRef, TRACE_EVENT_PHASE_DELETE_OBJECT, this, &InspectorTimelineAgent::onLazyPixelRefDeleted, m_client);
-        dispatcher->addListener(InstrumentationEvents::EmbedderCallback, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onEmbedderCallbackBegin, m_client);
-        dispatcher->addListener(InstrumentationEvents::EmbedderCallback, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onEmbedderCallbackEnd, m_client);
+        dispatcher->addListener(InstrumentationEvents::BeginFrame, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onBeginImplSideFrame), m_client);
+        dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onPaintSetupBegin), m_client);
+        dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onPaintSetupEnd), m_client);
+        dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onRasterTaskBegin), m_client);
+        dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onRasterTaskEnd), m_client);
+        dispatcher->addListener(InstrumentationEvents::Layer, TRACE_EVENT_PHASE_DELETE_OBJECT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onLayerDeleted), m_client);
+        dispatcher->addListener(InstrumentationEvents::RequestMainThreadFrame, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onRequestMainThreadFrame), m_client);
+        dispatcher->addListener(InstrumentationEvents::ActivateLayerTree, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onActivateLayerTree), m_client);
+        dispatcher->addListener(InstrumentationEvents::DrawFrame, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDrawFrame), m_client);
+        dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onImageDecodeBegin), m_client);
+        dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onImageDecodeEnd), m_client);
+        dispatcher->addListener(PlatformInstrumentation::DrawLazyPixelRefEvent, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDrawLazyPixelRef), m_client);
+        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDecodeLazyPixelRefBegin), m_client);
+        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDecodeLazyPixelRefEnd), m_client);
+        dispatcher->addListener(PlatformInstrumentation::LazyPixelRef, TRACE_EVENT_PHASE_DELETE_OBJECT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onLazyPixelRefDeleted), m_client);
+        dispatcher->addListener(InstrumentationEvents::EmbedderCallback, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onEmbedderCallbackBegin), m_client);
+        dispatcher->addListener(InstrumentationEvents::EmbedderCallback, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onEmbedderCallbackEnd), m_client);
 
         if (m_state->getBoolean(TimelineAgentState::includeGPUEvents)) {
             m_pendingGPURecord.clear();
@@ -376,7 +424,7 @@ void InspectorTimelineAgent::innerStart()
     }
 }
 
-void InspectorTimelineAgent::stop(ErrorString* errorString, RefPtr<TypeBuilder::Array<TimelineEvent> >& events)
+void InspectorTimelineAgent::stop(ErrorString* errorString)
 {
     m_state->setBoolean(TimelineAgentState::startedFromProtocol, false);
     m_state->setBoolean(TimelineAgentState::bufferEvents, false);
@@ -387,8 +435,6 @@ void InspectorTimelineAgent::stop(ErrorString* errorString, RefPtr<TypeBuilder::
         return;
     }
     innerStop(false);
-    if (m_bufferedEvents)
-        events = m_bufferedEvents.release();
     m_liveEvents.clear();
 }
 
@@ -415,11 +461,11 @@ void InspectorTimelineAgent::innerStop(bool fromConsole)
 
     for (size_t i = 0; i < m_consoleTimelines.size(); ++i) {
         String message = String::format("Timeline '%s' terminated.", m_consoleTimelines[i].utf8().data());
-        mainFrame()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message);
+        mainFrame()->console().addMessage(ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message));
     }
     m_consoleTimelines.clear();
 
-    m_frontend->stopped(&fromConsole);
+    m_frontend->stopped(&fromConsole, m_bufferedEvents.release());
     if (m_overlay)
         m_overlay->finishedRecordingProfile();
 }
@@ -778,9 +824,15 @@ void InspectorTimelineAgent::consoleTimeline(ExecutionContext* context, const St
         return;
 
     String message = String::format("Timeline '%s' started.", title.utf8().data());
-    mainFrame()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message, String(), 0, 0, nullptr, scriptState);
+
+    RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message);
+    consoleMessage->setScriptState(scriptState);
+    mainFrame()->console().addMessage(consoleMessage.release());
     m_consoleTimelines.append(title);
     if (!isStarted()) {
+        m_state->setBoolean(TimelineAgentState::bufferEvents, true);
+        m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create();
+
         innerStart();
         bool fromConsole = true;
         m_frontend->started(&fromConsole);
@@ -796,7 +848,9 @@ void InspectorTimelineAgent::consoleTimelineEnd(ExecutionContext* context, const
     size_t index = m_consoleTimelines.find(title);
     if (index == kNotFound) {
         String message = String::format("Timeline '%s' was not started.", title.utf8().data());
-        mainFrame()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message, String(), 0, 0, nullptr, scriptState);
+        RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message);
+        consoleMessage->setScriptState(scriptState);
+        mainFrame()->console().addMessage(consoleMessage.release());
         return;
     }
 
@@ -807,7 +861,9 @@ void InspectorTimelineAgent::consoleTimelineEnd(ExecutionContext* context, const
         unwindRecordStack();
         innerStop(true);
     }
-    mainFrame()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message, String(), 0, 0, nullptr, scriptState);
+    RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message);
+    consoleMessage->setScriptState(scriptState);
+    mainFrame()->console().addMessage(consoleMessage.release());
 }
 
 void InspectorTimelineAgent::domContentLoadedEventFired(LocalFrame* frame)
@@ -1268,7 +1324,7 @@ void InspectorTimelineAgent::setLiveEvents(const String& liveEvents)
     if (liveEvents.isNull() || liveEvents.isEmpty())
         return;
     Vector<String> eventList;
-    liveEvents.split(",", eventList);
+    liveEvents.split(',', eventList);
     for (Vector<String>::iterator it = eventList.begin(); it != eventList.end(); ++it)
         m_liveEvents.add(*it);
 }
@@ -1303,12 +1359,21 @@ void TimelineRecordStack::addInstantRecord(PassRefPtr<TimelineEvent> record)
         m_stack.last().children->addItem(record);
 }
 
-#ifndef NDEBUG
+#if ENABLE(ASSERT)
 bool TimelineRecordStack::isOpenRecordOfType(const String& type)
 {
     return !m_stack.isEmpty() && m_stack.last().type == type;
 }
 #endif
 
-} // namespace WebCore
+void TimelineRecordStack::trace(Visitor* visitor)
+{
+    visitor->trace(m_timelineAgent);
+}
+
+void TimelineThreadState::trace(Visitor* visitor)
+{
+    visitor->trace(recordStack);
+}
 
+} // namespace blink