Upstream version 11.39.250.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / dom / ScriptedAnimationController.cpp
index 1838e6d..dc5824c 100644 (file)
 #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)
 {
@@ -53,6 +55,18 @@ ScriptedAnimationController::~ScriptedAnimationController()
 {
 }
 
+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;
@@ -67,7 +81,13 @@ void ScriptedAnimationController::resume()
     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;
@@ -119,10 +139,12 @@ void ScriptedAnimationController::dispatchEvents()
         // 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());
     }
 }
 
@@ -158,16 +180,28 @@ void ScriptedAnimationController::executeCallbacks(double monotonicTimeNow)
     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);
 
@@ -176,6 +210,7 @@ void ScriptedAnimationController::serviceScriptedAnimations(double monotonicTime
 
 void ScriptedAnimationController::enqueueEvent(PassRefPtrWillBeRawPtr<Event> event)
 {
+    InspectorInstrumentation::didEnqueueEvent(event->target(), event.get());
     m_eventQueue.append(event);
     scheduleAnimationIfNeeded();
 }
@@ -187,6 +222,14 @@ void ScriptedAnimationController::enqueuePerFrameEvent(PassRefPtrWillBeRawPtr<Ev
     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)
@@ -195,7 +238,7 @@ void ScriptedAnimationController::scheduleAnimationIfNeeded()
     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())