Commit ab284130 authored by aandrey@chromium.org's avatar aandrey@chromium.org

DevTools: Instrument GenericEventQueue for async stacks.

This adds async stacks support for the following DOM events:
- audio & video events (play, pause, ratechange, etc.)
- TrackList events: addtrack, removetrack
- MediaSource events (sourceopen and etc.)
- autocomplete and others

BUG=272416
R=yurys, pfeldman@chromium.org

Review URL: https://codereview.chromium.org/335963004

git-svn-id: svn://svn.chromium.org/blink/trunk@176523 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 8bf9d983
...@@ -15,4 +15,10 @@ Call stack: ...@@ -15,4 +15,10 @@ Call stack:
1) doTestSelectionChange (async-callstack-events.html:31) 1) doTestSelectionChange (async-callstack-events.html:31)
2) testFunction (async-callstack-events.html:11) 2) testFunction (async-callstack-events.html:11)
Call stack:
0) onVideoPlay (async-callstack-events.html:64)
[play]
0) doTestMediaEvents (async-callstack-events.html:58)
1) testFunction (async-callstack-events.html:11)
...@@ -51,9 +51,22 @@ function onHashChange() ...@@ -51,9 +51,22 @@ function onHashChange()
debugger; debugger;
} }
function doTestMediaEvents()
{
var video = document.getElementById("video");
video.addEventListener("play", onVideoPlay, false);
video.play();
}
function onVideoPlay()
{
video.removeEventListener("play", onVideoPlay, false);
debugger;
}
var test = function() var test = function()
{ {
var totalDebuggerStatements = 2; var totalDebuggerStatements = 3;
var maxAsyncCallStackDepth = 4; var maxAsyncCallStackDepth = 4;
InspectorTest.runAsyncCallStacksTest(totalDebuggerStatements, maxAsyncCallStackDepth); InspectorTest.runAsyncCallStacksTest(totalDebuggerStatements, maxAsyncCallStackDepth);
} }
...@@ -62,6 +75,7 @@ var test = function() ...@@ -62,6 +75,7 @@ var test = function()
</head> </head>
<body onload="runTest()"> <body onload="runTest()">
<video id="video" src="../../../media/content/test.ogv"></video>
<p id="content"> <p id="content">
Tests asynchronous call stacks for various DOM events. Tests asynchronous call stacks for various DOM events.
</p> </p>
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "core/events/GenericEventQueue.h" #include "core/events/GenericEventQueue.h"
#include "core/events/Event.h" #include "core/events/Event.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "platform/TraceEvent.h" #include "platform/TraceEvent.h"
namespace WebCore { namespace WebCore {
...@@ -64,6 +65,7 @@ bool GenericEventQueue::enqueueEvent(PassRefPtrWillBeRawPtr<Event> event) ...@@ -64,6 +65,7 @@ bool GenericEventQueue::enqueueEvent(PassRefPtrWillBeRawPtr<Event> event)
event->setTarget(nullptr); event->setTarget(nullptr);
TRACE_EVENT_ASYNC_BEGIN1("event", "GenericEventQueue:enqueueEvent", event.get(), "type", event->type().ascii()); TRACE_EVENT_ASYNC_BEGIN1("event", "GenericEventQueue:enqueueEvent", event.get(), "type", event->type().ascii());
InspectorInstrumentation::didEnqueueEvent(event->target() ? event->target() : m_owner.get(), event.get());
m_pendingEvents.append(event); m_pendingEvents.append(event);
if (!m_timer.isActive()) if (!m_timer.isActive())
...@@ -77,6 +79,7 @@ bool GenericEventQueue::cancelEvent(Event* event) ...@@ -77,6 +79,7 @@ bool GenericEventQueue::cancelEvent(Event* event)
bool found = m_pendingEvents.contains(event); bool found = m_pendingEvents.contains(event);
if (found) { if (found) {
InspectorInstrumentation::didRemoveEvent(event->target() ? event->target() : m_owner.get(), event);
m_pendingEvents.remove(m_pendingEvents.find(event)); m_pendingEvents.remove(m_pendingEvents.find(event));
TRACE_EVENT_ASYNC_END2("event", "GenericEventQueue:enqueueEvent", event, "type", event->type().ascii(), "status", "cancelled"); TRACE_EVENT_ASYNC_END2("event", "GenericEventQueue:enqueueEvent", event, "type", event->type().ascii(), "status", "cancelled");
} }
...@@ -101,8 +104,9 @@ void GenericEventQueue::timerFired(Timer<GenericEventQueue>*) ...@@ -101,8 +104,9 @@ void GenericEventQueue::timerFired(Timer<GenericEventQueue>*)
EventTarget* target = event->target() ? event->target() : m_owner.get(); EventTarget* target = event->target() ? event->target() : m_owner.get();
CString type(event->type().ascii()); CString type(event->type().ascii());
TRACE_EVENT_ASYNC_STEP_INTO1("event", "GenericEventQueue:enqueueEvent", event, "dispatch", "type", type); TRACE_EVENT_ASYNC_STEP_INTO1("event", "GenericEventQueue:enqueueEvent", event, "dispatch", "type", type);
target->dispatchEvent(pendingEvents[i].release()); target->dispatchEvent(pendingEvents[i]);
TRACE_EVENT_ASYNC_END1("event", "GenericEventQueue:enqueueEvent", event, "type", type); TRACE_EVENT_ASYNC_END1("event", "GenericEventQueue:enqueueEvent", event, "type", type);
InspectorInstrumentation::didRemoveEvent(target, event);
} }
} }
...@@ -119,6 +123,7 @@ void GenericEventQueue::cancelAllEvents() ...@@ -119,6 +123,7 @@ void GenericEventQueue::cancelAllEvents()
for (size_t i = 0; i < m_pendingEvents.size(); ++i) { for (size_t i = 0; i < m_pendingEvents.size(); ++i) {
Event* event = m_pendingEvents[i].get(); Event* event = m_pendingEvents[i].get();
TRACE_EVENT_ASYNC_END2("event", "GenericEventQueue:enqueueEvent", event, "type", event->type().ascii(), "status", "cancelled"); TRACE_EVENT_ASYNC_END2("event", "GenericEventQueue:enqueueEvent", event, "type", event->type().ascii(), "status", "cancelled");
InspectorInstrumentation::didRemoveEvent(event->target() ? event->target() : m_owner.get(), event);
} }
m_pendingEvents.clear(); m_pendingEvents.clear();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment