diff options
-rw-r--r-- | content/content_tests.gypi | 1 | ||||
-rw-r--r-- | content/renderer/gpu/render_widget_compositor.cc | 8 | ||||
-rw-r--r-- | content/renderer/gpu/render_widget_compositor.h | 8 | ||||
-rw-r--r-- | content/renderer/gpu/render_widget_compositor_unittest.cc | 77 |
4 files changed, 89 insertions, 5 deletions
diff --git a/content/content_tests.gypi b/content/content_tests.gypi index b5d24b1..bfef6f3 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -695,6 +695,7 @@ 'renderer/dom_storage/dom_storage_cached_area_unittest.cc', 'renderer/gpu/frame_swap_message_queue_unittest.cc', 'renderer/gpu/queue_message_swap_promise_unittest.cc', + 'renderer/gpu/render_widget_compositor_unittest.cc', 'renderer/ico_image_decoder_unittest.cc', 'renderer/input/input_event_filter_unittest.cc', 'renderer/input/input_handler_proxy_unittest.cc', diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index b093177..35dee07 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc @@ -759,8 +759,11 @@ void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { VLOG(2) << "RenderWidgetCompositor::BeginMainFrame"; begin_main_frame_time_ = args.frame_time; begin_main_frame_interval_ = args.interval; - double frame_time = (args.frame_time - base::TimeTicks()).InSecondsF(); - WebBeginFrameArgs web_begin_frame_args = WebBeginFrameArgs(frame_time); + double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); + double deadline_sec = (args.deadline - base::TimeTicks()).InSecondsF(); + double interval_sec = args.interval.InSecondsF(); + WebBeginFrameArgs web_begin_frame_args = + WebBeginFrameArgs(frame_time_sec, deadline_sec, interval_sec); widget_->webwidget()->beginFrame(web_begin_frame_args); } @@ -801,6 +804,7 @@ void RenderWidgetCompositor::DidCommit() { widget_->DidCommitCompositorFrame(); widget_->didBecomeReadyForAdditionalInput(); + widget_->webwidget()->didCommitFrameToCompositor(); } void RenderWidgetCompositor::DidCommitAndDrawFrame() { diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h index 4658e44..da02ee8 100644 --- a/content/renderer/gpu/render_widget_compositor.h +++ b/content/renderer/gpu/render_widget_compositor.h @@ -15,6 +15,7 @@ #include "cc/trees/layer_tree_host_client.h" #include "cc/trees/layer_tree_host_single_thread_client.h" #include "cc/trees/layer_tree_settings.h" +#include "content/common/content_export.h" #include "third_party/WebKit/public/platform/WebLayerTreeView.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/rect.h" @@ -32,9 +33,10 @@ class LayerTreeHost; namespace content { class RenderWidget; -class RenderWidgetCompositor : public blink::WebLayerTreeView, - public cc::LayerTreeHostClient, - public cc::LayerTreeHostSingleThreadClient { +class CONTENT_EXPORT RenderWidgetCompositor + : NON_EXPORTED_BASE(public blink::WebLayerTreeView), + NON_EXPORTED_BASE(public cc::LayerTreeHostClient), + NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) { public: // Attempt to construct and initialize a compositor instance for the widget // with the given settings. Returns NULL if initialization fails. diff --git a/content/renderer/gpu/render_widget_compositor_unittest.cc b/content/renderer/gpu/render_widget_compositor_unittest.cc new file mode 100644 index 0000000..598fe49 --- /dev/null +++ b/content/renderer/gpu/render_widget_compositor_unittest.cc @@ -0,0 +1,77 @@ +// 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 "content/renderer/gpu/render_widget_compositor.h" + +#include "cc/output/begin_frame_args.h" +#include "content/public/test/mock_render_thread.h" +#include "content/renderer/render_widget.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/WebKit/public/platform/WebScreenInfo.h" + +using testing::AllOf; +using testing::Field; + +namespace content { + +class MockWebWidget : public blink::WebWidget { + public: + MOCK_METHOD1(beginFrame, void(const blink::WebBeginFrameArgs& args)); +}; + +class TestRenderWidget : public RenderWidget { + public: + TestRenderWidget() + : RenderWidget(blink::WebPopupTypeNone, + blink::WebScreenInfo(), + true, + false, + false) { + webwidget_ = &mock_webwidget_; + } + + MockWebWidget mock_webwidget_; + + private: + virtual ~TestRenderWidget() { webwidget_ = NULL; } + + DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); +}; + +class RenderWidgetCompositorTest : public testing::Test { + public: + RenderWidgetCompositorTest() + : render_widget_(make_scoped_refptr(new TestRenderWidget())), + render_widget_compositor_( + RenderWidgetCompositor::Create(render_widget_.get(), false)) {} + virtual ~RenderWidgetCompositorTest() {} + + protected: + MockRenderThread render_thread_; + scoped_refptr<TestRenderWidget> render_widget_; + scoped_ptr<RenderWidgetCompositor> render_widget_compositor_; + + private: + DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositorTest); +}; + +TEST_F(RenderWidgetCompositorTest, BeginMainFrame) { + base::TimeTicks frame_time(base::TimeTicks() + + base::TimeDelta::FromSeconds(1)); + base::TimeTicks deadline(base::TimeTicks() + base::TimeDelta::FromSeconds(2)); + base::TimeDelta interval(base::TimeDelta::FromSeconds(3)); + cc::BeginFrameArgs args( + cc::BeginFrameArgs::Create(frame_time, deadline, interval)); + + EXPECT_CALL(render_widget_->mock_webwidget_, + beginFrame(AllOf( + Field(&blink::WebBeginFrameArgs::lastFrameTimeMonotonic, 1), + Field(&blink::WebBeginFrameArgs::deadline, 2), + Field(&blink::WebBeginFrameArgs::interval, 3)))); + + render_widget_compositor_->BeginMainFrame(args); +} + +} // namespace content |