#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"
#include "wtf/CurrentTime.h"
#include "wtf/DateMath.h"
-namespace WebCore {
+namespace blink {
namespace TimelineAgentState {
static const char enabled[] = "enabled";
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)
};
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
{
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)
{
}
+ void trace(Visitor*);
+
TimelineRecordStack recordStack;
bool inKnownLayerTask;
unsigned long long decodedPixelRefId;
{
}
+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();
void InspectorTimelineAgent::clearFrontend()
{
ErrorString error;
- RefPtr<TypeBuilder::Array<TimelineEvent> > events;
- stop(&error, events);
+ stop(&error);
disable(&error);
m_frontend = 0;
}
// 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);
}
}
else
m_maxCallStackDepth = 5;
- if (bufferEvents && *bufferEvents) {
+ if (asBool(bufferEvents)) {
m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create();
m_lastProgressTimestamp = timestamp();
}
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();
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();
}
}
-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);
return;
}
innerStop(false);
- if (m_bufferedEvents)
- events = m_bufferedEvents.release();
m_liveEvents.clear();
}
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();
}
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);
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;
}
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)
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);
}
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