| Index: ui/compositor/compositor_unittest.cc
|
| diff --git a/ui/compositor/compositor_unittest.cc b/ui/compositor/compositor_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b4a8fdbeb03004fa6caf71c6243b5ba91212b965
|
| --- /dev/null
|
| +++ b/ui/compositor/compositor_unittest.cc
|
| @@ -0,0 +1,125 @@
|
| +// Copyright 2015 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 "base/basictypes.h"
|
| +#include "base/compiler_specific.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "cc/output/begin_frame_args.h"
|
| +#include "cc/test/begin_frame_args_test.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "ui/compositor/compositor.h"
|
| +#include "ui/compositor/test/context_factories_for_test.h"
|
| +#include "ui/gfx/geometry/rect.h"
|
| +
|
| +namespace ui {
|
| +
|
| +namespace {
|
| +
|
| +class FakeTaskRunner : public base::SingleThreadTaskRunner {
|
| + public:
|
| + FakeTaskRunner() {}
|
| +
|
| + bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
|
| + const base::Closure& task,
|
| + base::TimeDelta delay) override {
|
| + return true;
|
| + }
|
| + bool PostDelayedTask(const tracked_objects::Location& from_here,
|
| + const base::Closure& task,
|
| + base::TimeDelta delay) override {
|
| + return true;
|
| + }
|
| + bool RunsTasksOnCurrentThread() const override { return true; }
|
| +
|
| + protected:
|
| + ~FakeTaskRunner() override {}
|
| +};
|
| +
|
| +class TestCompositorBeginFrameObserver : public CompositorBeginFrameObserver {
|
| + public:
|
| + TestCompositorBeginFrameObserver() : send_begin_frame_called_(false) {}
|
| + ~TestCompositorBeginFrameObserver() override {}
|
| +
|
| + void OnSendBeginFrame(const cc::BeginFrameArgs& args) override {
|
| + send_begin_frame_called_ = true;
|
| + }
|
| +
|
| + void Reset() {
|
| + send_begin_frame_called_ = false;
|
| + }
|
| +
|
| + bool send_begin_frame_called() { return send_begin_frame_called_; }
|
| +
|
| + private:
|
| + bool send_begin_frame_called_;
|
| +};
|
| +
|
| +class BeginFrameWithCompositorTest : public testing::Test {
|
| + public:
|
| + BeginFrameWithCompositorTest() {}
|
| + ~BeginFrameWithCompositorTest() override {}
|
| +
|
| + // Overridden from testing::Test:
|
| + void SetUp() override {
|
| + bool enable_pixel_output = false;
|
| + ui::ContextFactory* context_factory =
|
| + InitializeContextFactoryForTests(enable_pixel_output);
|
| + compositor_task_runner_ = new FakeTaskRunner();
|
| + compositor_.reset(new ui::Compositor(gfx::kNullAcceleratedWidget,
|
| + context_factory,
|
| + compositor_task_runner_.get()));
|
| + }
|
| +
|
| + void TearDown() override {
|
| + compositor_.reset();
|
| + TerminateContextFactoryForTests();
|
| + }
|
| +
|
| + Compositor* compositor() { return compositor_.get(); }
|
| +
|
| + cc::BeginFrameArgs missed_begin_frame_args() {
|
| + return compositor()->MissedBeginFrameArgsForTesting();
|
| + }
|
| +
|
| + private:
|
| + scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
|
| + scoped_ptr<ui::Compositor> compositor_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BeginFrameWithCompositorTest);
|
| +};
|
| +
|
| +// Tests whether |missed_begin_frame_args_| is used immediately or not when new
|
| +// observer is added.
|
| +TEST_F(BeginFrameWithCompositorTest, AddBeginFrameObserver) {
|
| + cc::BeginFrameArgs last_args =
|
| + cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
|
| + base::TimeTicks::FromInternalValue(33));
|
| + cc::BeginFrameArgs new_args =
|
| + cc::CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE,
|
| + base::TimeTicks::FromInternalValue(55));
|
| + TestCompositorBeginFrameObserver test_observer;
|
| +
|
| + // Simulate to trigger new BeginFrame by using |new_args|.
|
| + compositor()->SendBeginFramesToChildren(new_args);
|
| + // |new_args| is stored in |missed_begin_frame_args_| in Compositor for using
|
| + // later added observers.
|
| + EXPECT_EQ(new_args.frame_time,
|
| + missed_begin_frame_args().frame_time);
|
| +
|
| + // When new observer is added, Compositor immediately sends BeginFrame with
|
| + // |missed_begin_frame_args_| when new observer didn't used it.
|
| + compositor()->AddBeginFrameObserver(&test_observer, last_args);
|
| + EXPECT_TRUE(test_observer.send_begin_frame_called());
|
| + compositor()->RemoveBeginFrameObserver(&test_observer);
|
| +
|
| + test_observer.Reset();
|
| + // BeginFrame is not sended immediately because new observer already used
|
| + // |missed_begin_frame_args_|.
|
| + compositor()->AddBeginFrameObserver(&test_observer, new_args);
|
| + EXPECT_FALSE(test_observer.send_begin_frame_called());
|
| + compositor()->RemoveBeginFrameObserver(&test_observer);
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace ui
|
|
|