// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/dom/animation_frame_request_callback_list.h"

#include "base/trace_event/trace_event.h"
#include "cobalt/dom/global_stats.h"

namespace cobalt {
namespace dom {

int32 AnimationFrameRequestCallbackList::RequestAnimationFrame(
    const FrameRequestCallbackArg& frame_request_callback) {
  // Wrap the frame request callback so that we can associate it with a
  // "cancelled" flag.
  // Push it into our vector of frame requests and return its 1-based position
  // ((to ensure a > 0 handle value, as required by the specification) in that
  // vector as the handle.
  frame_request_callbacks_.emplace_back(
      new FrameRequestCallbackWithCancelledFlag(owner_,
                                                frame_request_callback));
  return static_cast<int32>(frame_request_callbacks_.size());
}

void AnimationFrameRequestCallbackList::CancelAnimationFrame(int32 in_handle) {
  // If the handle is valid, set the "cancelled" flag on the specified
  // frame request callback.
  const size_t handle = static_cast<size_t>(in_handle);
  if (handle > 0 && handle <= frame_request_callbacks_.size()) {
    frame_request_callbacks_[handle - 1]->cancelled = true;
  }
}

void AnimationFrameRequestCallbackList::RunCallbacks(double animation_time) {
  TRACE_EVENT1("cobalt::dom", "Window::RunAnimationFrameCallbacks()",
               "number_of_callbacks", frame_request_callbacks_.size());

  // The callbacks are now being run. Track it in the global stats.
  GlobalStats::GetInstance()->StartJavaScriptEvent();

  for (InternalList::const_iterator iter = frame_request_callbacks_.begin();
       iter != frame_request_callbacks_.end(); ++iter) {
    if (!(*iter)->cancelled) {
      (*iter)->callback.value().Run(animation_time);
    }
  }

  // The callbacks are done running. Stop tracking it in the global stats.
  GlobalStats::GetInstance()->StopJavaScriptEvent();
}

bool AnimationFrameRequestCallbackList::HasPendingCallbacks() const {
  return !frame_request_callbacks_.empty();
}

}  // namespace dom
}  // namespace cobalt
