summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/content_tests.gypi1
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc8
-rw-r--r--content/renderer/gpu/render_widget_compositor.h8
-rw-r--r--content/renderer/gpu/render_widget_compositor_unittest.cc77
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