OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All Rights Reserved. | 2 * Copyright (C) 2011 Google Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 ScriptedAnimationController::registerCallback(FrameRequestCallback* callback) { | 74 ScriptedAnimationController::registerCallback(FrameRequestCallback* callback) { |
75 CallbackId id = m_callbackCollection.registerCallback(callback); | 75 CallbackId id = m_callbackCollection.registerCallback(callback); |
76 scheduleAnimationIfNeeded(); | 76 scheduleAnimationIfNeeded(); |
77 return id; | 77 return id; |
78 } | 78 } |
79 | 79 |
80 void ScriptedAnimationController::cancelCallback(CallbackId id) { | 80 void ScriptedAnimationController::cancelCallback(CallbackId id) { |
81 m_callbackCollection.cancelCallback(id); | 81 m_callbackCollection.cancelCallback(id); |
82 } | 82 } |
83 | 83 |
| 84 void ScriptedAnimationController::runTasks() { |
| 85 // TODO(foolip): can running a task append to the task queue? |
| 86 for (std::unique_ptr<WTF::Closure>& task : m_taskQueue) |
| 87 (*task)(); |
| 88 m_taskQueue.clear(); |
| 89 } |
| 90 |
84 void ScriptedAnimationController::dispatchEvents( | 91 void ScriptedAnimationController::dispatchEvents( |
85 const AtomicString& eventInterfaceFilter) { | 92 const AtomicString& eventInterfaceFilter) { |
86 HeapVector<Member<Event>> events; | 93 HeapVector<Member<Event>> events; |
87 if (eventInterfaceFilter.isEmpty()) { | 94 if (eventInterfaceFilter.isEmpty()) { |
88 events.swap(m_eventQueue); | 95 events.swap(m_eventQueue); |
89 m_perFrameEvents.clear(); | 96 m_perFrameEvents.clear(); |
90 } else { | 97 } else { |
91 HeapVector<Member<Event>> remaining; | 98 HeapVector<Member<Event>> remaining; |
92 for (auto& event : m_eventQueue) { | 99 for (auto& event : m_eventQueue) { |
93 if (event && event->interfaceName() == eventInterfaceFilter) { | 100 if (event && event->interfaceName() == eventInterfaceFilter) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 | 144 |
138 for (const auto& listener : listeners) { | 145 for (const auto& listener : listeners) { |
139 listener->notifyMediaQueryChanged(); | 146 listener->notifyMediaQueryChanged(); |
140 } | 147 } |
141 } | 148 } |
142 | 149 |
143 bool ScriptedAnimationController::hasScheduledItems() const { | 150 bool ScriptedAnimationController::hasScheduledItems() const { |
144 if (m_suspendCount) | 151 if (m_suspendCount) |
145 return false; | 152 return false; |
146 | 153 |
147 return !m_callbackCollection.isEmpty() || !m_eventQueue.isEmpty() || | 154 return !m_callbackCollection.isEmpty() || !m_taskQueue.isEmpty() || |
148 !m_mediaQueryListListeners.isEmpty(); | 155 !m_eventQueue.isEmpty() || !m_mediaQueryListListeners.isEmpty(); |
149 } | 156 } |
150 | 157 |
151 void ScriptedAnimationController::serviceScriptedAnimations( | 158 void ScriptedAnimationController::serviceScriptedAnimations( |
152 double monotonicTimeNow) { | 159 double monotonicTimeNow) { |
153 if (!hasScheduledItems()) | 160 if (!hasScheduledItems()) |
154 return; | 161 return; |
155 | 162 |
156 callMediaQueryListListeners(); | 163 callMediaQueryListListeners(); |
157 dispatchEvents(); | 164 dispatchEvents(); |
| 165 runTasks(); // must be after resize event per spec |
158 executeCallbacks(monotonicTimeNow); | 166 executeCallbacks(monotonicTimeNow); |
159 | 167 |
160 scheduleAnimationIfNeeded(); | 168 scheduleAnimationIfNeeded(); |
161 } | 169 } |
162 | 170 |
| 171 void ScriptedAnimationController::enqueueTask( |
| 172 std::unique_ptr<WTF::Closure> task) { |
| 173 m_taskQueue.append(std::move(task)); |
| 174 scheduleAnimationIfNeeded(); |
| 175 } |
| 176 |
163 void ScriptedAnimationController::enqueueEvent(Event* event) { | 177 void ScriptedAnimationController::enqueueEvent(Event* event) { |
164 InspectorInstrumentation::asyncTaskScheduled( | 178 InspectorInstrumentation::asyncTaskScheduled( |
165 event->target()->getExecutionContext(), event->type(), event); | 179 event->target()->getExecutionContext(), event->type(), event); |
166 m_eventQueue.append(event); | 180 m_eventQueue.append(event); |
167 scheduleAnimationIfNeeded(); | 181 scheduleAnimationIfNeeded(); |
168 } | 182 } |
169 | 183 |
170 void ScriptedAnimationController::enqueuePerFrameEvent(Event* event) { | 184 void ScriptedAnimationController::enqueuePerFrameEvent(Event* event) { |
171 if (!m_perFrameEvents.add(eventTargetKey(event)).isNewEntry) | 185 if (!m_perFrameEvents.add(eventTargetKey(event)).isNewEntry) |
172 return; | 186 return; |
(...skipping 13 matching lines...) Expand all Loading... |
186 return; | 200 return; |
187 | 201 |
188 if (!m_document) | 202 if (!m_document) |
189 return; | 203 return; |
190 | 204 |
191 if (FrameView* frameView = m_document->view()) | 205 if (FrameView* frameView = m_document->view()) |
192 frameView->scheduleAnimation(); | 206 frameView->scheduleAnimation(); |
193 } | 207 } |
194 | 208 |
195 } // namespace blink | 209 } // namespace blink |
OLD | NEW |