| Index: Source/core/dom/ScriptedAnimationController.cpp | 
| diff --git a/Source/core/dom/ScriptedAnimationController.cpp b/Source/core/dom/ScriptedAnimationController.cpp | 
| index 33446c8e85835e2137a614e139e4ec09dc0a5ec1..27a7f6b463f173ab8259b7a6e08c639cfad47de5 100644 | 
| --- a/Source/core/dom/ScriptedAnimationController.cpp | 
| +++ b/Source/core/dom/ScriptedAnimationController.cpp | 
| @@ -66,10 +66,10 @@ void ScriptedAnimationController::resume() | 
| scheduleAnimationIfNeeded(); | 
| } | 
|  | 
| -ScriptedAnimationController::CallbackId ScriptedAnimationController::registerCallback(PassRefPtr<RequestAnimationFrameCallback> callback) | 
| +ScriptedAnimationController::CallbackId ScriptedAnimationController::registerCallback(PassOwnPtr<RequestAnimationFrameCallback> callback) | 
| { | 
| ScriptedAnimationController::CallbackId id = ++m_nextCallbackId; | 
| -    callback->m_firedOrCancelled = false; | 
| +    callback->m_cancelled = false; | 
| callback->m_id = id; | 
| m_callbacks.append(callback); | 
| scheduleAnimationIfNeeded(); | 
| @@ -83,12 +83,19 @@ void ScriptedAnimationController::cancelCallback(CallbackId id) | 
| { | 
| for (size_t i = 0; i < m_callbacks.size(); ++i) { | 
| if (m_callbacks[i]->m_id == id) { | 
| -            m_callbacks[i]->m_firedOrCancelled = true; | 
| 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) { | 
| +            InspectorInstrumentation::didCancelAnimationFrame(m_document, id); | 
| +            m_callbacksToInvoke[i]->m_cancelled = true; | 
| +            // will be removed at the end of executeCallbacks() | 
| +            return; | 
| +        } | 
| +    } | 
| } | 
|  | 
| void ScriptedAnimationController::dispatchEvents() | 
| @@ -120,12 +127,12 @@ void ScriptedAnimationController::executeCallbacks(double monotonicTimeNow) | 
|  | 
| // First, generate a list of callbacks to consider.  Callbacks registered from this point | 
| // on are considered only for the "next" frame, not this one. | 
| -    CallbackList callbacks(m_callbacks); | 
| +    ASSERT(m_callbacksToInvoke.isEmpty()); | 
| +    m_callbacksToInvoke.swap(m_callbacks); | 
|  | 
| -    for (size_t i = 0; i < callbacks.size(); ++i) { | 
| -        RequestAnimationFrameCallback* callback = callbacks[i].get(); | 
| -        if (!callback->m_firedOrCancelled) { | 
| -            callback->m_firedOrCancelled = true; | 
| +    for (size_t i = 0; i < m_callbacksToInvoke.size(); ++i) { | 
| +        RequestAnimationFrameCallback* callback = m_callbacksToInvoke[i].get(); | 
| +        if (!callback->m_cancelled) { | 
| InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireAnimationFrame(m_document, callback->m_id); | 
| if (callback->m_useLegacyTimeBase) | 
| callback->handleEvent(legacyHighResNowMs); | 
| @@ -135,13 +142,7 @@ void ScriptedAnimationController::executeCallbacks(double monotonicTimeNow) | 
| } | 
| } | 
|  | 
| -    // Remove any callbacks we fired from the list of pending callbacks. | 
| -    for (size_t i = 0; i < m_callbacks.size();) { | 
| -        if (m_callbacks[i]->m_firedOrCancelled) | 
| -            m_callbacks.remove(i); | 
| -        else | 
| -            ++i; | 
| -    } | 
| +    m_callbacksToInvoke.clear(); | 
| } | 
|  | 
| void ScriptedAnimationController::serviceScriptedAnimations(double monotonicTimeNow) | 
|  |