#include "config.h"
#include "core/dom/ScriptedAnimationController.h"
+#include "core/css/MediaQueryListListener.h"
#include "core/dom/Document.h"
#include "core/dom/RequestAnimationFrameCallback.h"
#include "core/events/Event.h"
-#include "core/frame/DOMWindow.h"
+#include "core/frame/LocalDOMWindow.h"
#include "core/frame/FrameView.h"
#include "core/inspector/InspectorInstrumentation.h"
+#include "core/inspector/InspectorTraceEvents.h"
#include "core/loader/DocumentLoader.h"
+#include "platform/Logging.h"
-namespace WebCore {
+namespace blink {
std::pair<EventTarget*, StringImpl*> eventTargetKey(const Event* event)
{
{
}
+void ScriptedAnimationController::trace(Visitor* visitor)
+{
+#if ENABLE(OILPAN)
+ visitor->trace(m_callbacks);
+ visitor->trace(m_callbacksToInvoke);
+ visitor->trace(m_document);
+ visitor->trace(m_eventQueue);
+ visitor->trace(m_mediaQueryListListeners);
+ visitor->trace(m_perFrameEvents);
+#endif
+}
+
void ScriptedAnimationController::suspend()
{
++m_suspendCount;
scheduleAnimationIfNeeded();
}
-ScriptedAnimationController::CallbackId ScriptedAnimationController::registerCallback(PassOwnPtr<RequestAnimationFrameCallback> callback)
+void ScriptedAnimationController::dispatchEventsAndCallbacksForPrinting()
+{
+ dispatchEvents();
+ callMediaQueryListListeners();
+}
+
+ScriptedAnimationController::CallbackId ScriptedAnimationController::registerCallback(RequestAnimationFrameCallback* callback)
{
ScriptedAnimationController::CallbackId id = ++m_nextCallbackId;
callback->m_cancelled = false;
m_callbacks.append(callback);
scheduleAnimationIfNeeded();
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "RequestAnimationFrame", "data", InspectorAnimationFrameEvent::data(m_document, id));
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack());
+ // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
InspectorInstrumentation::didRequestAnimationFrame(m_document, id);
return id;
{
for (size_t i = 0; i < m_callbacks.size(); ++i) {
if (m_callbacks[i]->m_id == id) {
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "CancelAnimationFrame", "data", InspectorAnimationFrameEvent::data(m_document, id));
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack());
+ // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
InspectorInstrumentation::didCancelAnimationFrame(m_document, id);
m_callbacks.remove(i);
return;
}
for (size_t i = 0; i < m_callbacksToInvoke.size(); ++i) {
if (m_callbacksToInvoke[i]->m_id == id) {
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "CancelAnimationFrame", "data", InspectorAnimationFrameEvent::data(m_document, id));
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "CallStack", "stack", InspectorCallStackEvent::currentCallStack());
+ // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
InspectorInstrumentation::didCancelAnimationFrame(m_document, id);
m_callbacksToInvoke[i]->m_cancelled = true;
// will be removed at the end of executeCallbacks()
void ScriptedAnimationController::dispatchEvents()
{
- Vector<RefPtr<Event> > events;
+ WillBeHeapVector<RefPtrWillBeMember<Event> > events;
events.swap(m_eventQueue);
m_perFrameEvents.clear();
// FIXME: we should figure out how to make dispatchEvent properly virtual to avoid
// special casting window.
// FIXME: We should not fire events for nodes that are no longer in the tree.
- if (DOMWindow* window = eventTarget->toDOMWindow())
+ if (LocalDOMWindow* window = eventTarget->toDOMWindow())
window->dispatchEvent(events[i], nullptr);
else
eventTarget->dispatchEvent(events[i]);
+
+ InspectorInstrumentation::didRemoveEvent(eventTarget, events[i].get());
}
}
for (size_t i = 0; i < m_callbacksToInvoke.size(); ++i) {
RequestAnimationFrameCallback* callback = m_callbacksToInvoke[i].get();
if (!callback->m_cancelled) {
+ TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "FireAnimationFrame", "data", InspectorAnimationFrameEvent::data(m_document, callback->m_id));
+ // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireAnimationFrame(m_document, callback->m_id);
if (callback->m_useLegacyTimeBase)
callback->handleEvent(legacyHighResNowMs);
else
callback->handleEvent(highResNowMs);
InspectorInstrumentation::didFireAnimationFrame(cookie);
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "UpdateCounters", "data", InspectorUpdateCountersEvent::data());
}
}
m_callbacksToInvoke.clear();
}
+void ScriptedAnimationController::callMediaQueryListListeners()
+{
+ MediaQueryListListeners listeners;
+ listeners.swap(m_mediaQueryListListeners);
+
+ for (MediaQueryListListeners::const_iterator it = listeners.begin(), end = listeners.end();
+ it != end; ++it) {
+ (*it)->notifyMediaQueryChanged();
+ }
+}
+
void ScriptedAnimationController::serviceScriptedAnimations(double monotonicTimeNow)
{
- if (!m_callbacks.size() && !m_eventQueue.size())
+ if (!m_callbacks.size() && !m_eventQueue.size() && !m_mediaQueryListListeners.size())
return;
if (m_suspendCount)
return;
- RefPtr<ScriptedAnimationController> protect(this);
+ RefPtrWillBeRawPtr<ScriptedAnimationController> protect(this);
+ callMediaQueryListListeners();
dispatchEvents();
executeCallbacks(monotonicTimeNow);
scheduleAnimationIfNeeded();
}
-void ScriptedAnimationController::enqueueEvent(PassRefPtr<Event> event)
+void ScriptedAnimationController::enqueueEvent(PassRefPtrWillBeRawPtr<Event> event)
{
+ InspectorInstrumentation::didEnqueueEvent(event->target(), event.get());
m_eventQueue.append(event);
scheduleAnimationIfNeeded();
}
-void ScriptedAnimationController::enqueuePerFrameEvent(PassRefPtr<Event> event)
+void ScriptedAnimationController::enqueuePerFrameEvent(PassRefPtrWillBeRawPtr<Event> event)
{
if (!m_perFrameEvents.add(eventTargetKey(event.get())).isNewEntry)
return;
enqueueEvent(event);
}
+void ScriptedAnimationController::enqueueMediaQueryChangeListeners(WillBeHeapVector<RefPtrWillBeMember<MediaQueryListListener> >& listeners)
+{
+ for (size_t i = 0; i < listeners.size(); ++i) {
+ m_mediaQueryListListeners.add(listeners[i]);
+ }
+ scheduleAnimationIfNeeded();
+}
+
void ScriptedAnimationController::scheduleAnimationIfNeeded()
{
if (!m_document)
if (m_suspendCount)
return;
- if (!m_callbacks.size() && !m_eventQueue.size())
+ if (!m_callbacks.size() && !m_eventQueue.size() && !m_mediaQueryListListeners.size())
return;
if (FrameView* frameView = m_document->view())