// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/test/fake_external_begin_frame_source.h"

#include "base/location.h"
#include "base/single_thread_task_runner.h"
#include "base/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "cc/test/begin_frame_args_test.h"

namespace cc {

FakeExternalBeginFrameSource::FakeExternalBeginFrameSource(double refresh_rate)
    : milliseconds_per_frame_(1000.0 / refresh_rate),
      is_ready_(false),
      weak_ptr_factory_(this) {
  DetachFromThread();
}

FakeExternalBeginFrameSource::~FakeExternalBeginFrameSource() {
  DCHECK(CalledOnValidThread());
}

void FakeExternalBeginFrameSource::SetClientReady() {
  DCHECK(CalledOnValidThread());
  is_ready_ = true;
}

void FakeExternalBeginFrameSource::OnNeedsBeginFramesChange(
    bool needs_begin_frames) {
  DCHECK(CalledOnValidThread());
  if (needs_begin_frames) {
    PostTestOnBeginFrame();
  }
}

void FakeExternalBeginFrameSource::TestOnBeginFrame() {
  DCHECK(CalledOnValidThread());
  CallOnBeginFrame(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE));

  if (NeedsBeginFrames()) {
    PostTestOnBeginFrame();
  }
}

void FakeExternalBeginFrameSource::PostTestOnBeginFrame() {
  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
      FROM_HERE, base::Bind(&FakeExternalBeginFrameSource::TestOnBeginFrame,
                            weak_ptr_factory_.GetWeakPtr()),
      base::TimeDelta::FromMilliseconds(milliseconds_per_frame_));
}

}  // namespace cc
