scrollbar_layer_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/layers/scrollbar_layer.h"
6
7#include "cc/animation/scrollbar_animation_controller.h"
8#include "cc/layers/append_quads_data.h"
9#include "cc/layers/scrollbar_layer_impl.h"
10#include "cc/quads/solid_color_draw_quad.h"
11#include "cc/resources/prioritized_resource_manager.h"
12#include "cc/resources/priority_calculator.h"
13#include "cc/resources/resource_update_queue.h"
14#include "cc/test/fake_impl_proxy.h"
15#include "cc/test/fake_layer_tree_host_client.h"
16#include "cc/test/fake_layer_tree_host_impl.h"
17#include "cc/test/fake_scrollbar_theme_painter.h"
18#include "cc/test/fake_web_scrollbar.h"
19#include "cc/test/fake_web_scrollbar_theme_geometry.h"
20#include "cc/test/geometry_test_utils.h"
21#include "cc/test/layer_tree_test.h"
22#include "cc/test/mock_quad_culler.h"
23#include "cc/test/test_web_graphics_context_3d.h"
24#include "cc/trees/layer_tree_impl.h"
25#include "cc/trees/single_thread_proxy.h"
26#include "cc/trees/tree_synchronizer.h"
27#include "testing/gmock/include/gmock/gmock.h"
28#include "testing/gtest/include/gtest/gtest.h"
29#include "third_party/WebKit/Source/Platform/chromium/public/WebScrollbar.h"
30#include "third_party/WebKit/Source/Platform/chromium/public/WebScrollbarThemeGeometry.h"
31
32namespace cc {
33namespace {
34
35scoped_ptr<LayerImpl> LayerImplForScrollAreaAndScrollbar(
36    FakeLayerTreeHostImpl* host_impl,
37    scoped_ptr<WebKit::WebScrollbar> scrollbar,
38    bool reverse_order) {
39  scoped_refptr<Layer> layer_tree_root = Layer::Create();
40  scoped_refptr<Layer> child1 = Layer::Create();
41  scoped_refptr<Layer> child2 =
42      ScrollbarLayer::Create(scrollbar.Pass(),
43                             FakeScrollbarThemePainter::Create(false)
44                                 .PassAs<ScrollbarThemePainter>(),
45                             FakeWebScrollbarThemeGeometry::Create(true),
46                             child1->id());
47  layer_tree_root->AddChild(child1);
48  layer_tree_root->InsertChild(child2, reverse_order ? 0 : 1);
49  scoped_ptr<LayerImpl> layer_impl =
50      TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
51                                         scoped_ptr<LayerImpl>(),
52                                         host_impl->active_tree());
53  TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl.get());
54  return layer_impl.Pass();
55}
56
57TEST(ScrollbarLayerTest, ResolveScrollLayerPointer) {
58  FakeImplProxy proxy;
59  FakeLayerTreeHostImpl host_impl(&proxy);
60
61  {
62    scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
63    scoped_ptr<LayerImpl> layer_impl_tree_root =
64        LayerImplForScrollAreaAndScrollbar(
65            &host_impl, scrollbar.Pass(), false);
66
67    LayerImpl* cc_child1 = layer_impl_tree_root->children()[0];
68    ScrollbarLayerImpl* cc_child2 = static_cast<ScrollbarLayerImpl*>(
69        layer_impl_tree_root->children()[1]);
70
71    EXPECT_EQ(cc_child1->horizontal_scrollbar_layer(), cc_child2);
72  }
73  {
74    // another traverse order
75    scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
76    scoped_ptr<LayerImpl> layer_impl_tree_root =
77        LayerImplForScrollAreaAndScrollbar(
78            &host_impl, scrollbar.Pass(), true);
79
80    ScrollbarLayerImpl* cc_child1 = static_cast<ScrollbarLayerImpl*>(
81        layer_impl_tree_root->children()[0]);
82    LayerImpl* cc_child2 = layer_impl_tree_root->children()[1];
83
84    EXPECT_EQ(cc_child2->horizontal_scrollbar_layer(), cc_child1);
85  }
86}
87
88TEST(ScrollbarLayerTest, ShouldScrollNonOverlayOnMainThread) {
89  FakeImplProxy proxy;
90  FakeLayerTreeHostImpl host_impl(&proxy);
91
92  // Create and attach a non-overlay scrollbar.
93  scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
94  static_cast<FakeWebScrollbar*>(scrollbar.get())->set_overlay(false);
95  scoped_ptr<LayerImpl> layer_impl_tree_root =
96      LayerImplForScrollAreaAndScrollbar(&host_impl, scrollbar.Pass(), false);
97  ScrollbarLayerImpl* scrollbar_layer_impl =
98      static_cast<ScrollbarLayerImpl*>(layer_impl_tree_root->children()[1]);
99
100  // When the scrollbar is not an overlay scrollbar, the scroll should be
101  // responded to on the main thread as the compositor does not yet implement
102  // scrollbar scrolling.
103  EXPECT_EQ(InputHandlerClient::ScrollOnMainThread,
104            scrollbar_layer_impl->TryScroll(gfx::Point(0, 0),
105                                            InputHandlerClient::Gesture));
106
107  // Create and attach an overlay scrollbar.
108  scrollbar = FakeWebScrollbar::Create();
109  static_cast<FakeWebScrollbar*>(scrollbar.get())->set_overlay(true);
110
111  layer_impl_tree_root =
112      LayerImplForScrollAreaAndScrollbar(&host_impl, scrollbar.Pass(), false);
113  scrollbar_layer_impl =
114      static_cast<ScrollbarLayerImpl*>(layer_impl_tree_root->children()[1]);
115
116  // The user shouldn't be able to drag an overlay scrollbar and the scroll
117  // may be handled in the compositor.
118  EXPECT_EQ(InputHandlerClient::ScrollIgnored,
119            scrollbar_layer_impl->TryScroll(gfx::Point(0, 0),
120                                            InputHandlerClient::Gesture));
121}
122
123TEST(ScrollbarLayerTest, ScrollOffsetSynchronization) {
124  FakeImplProxy proxy;
125  FakeLayerTreeHostImpl host_impl(&proxy);
126
127  scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
128  scoped_refptr<Layer> layer_tree_root = Layer::Create();
129  scoped_refptr<Layer> content_layer = Layer::Create();
130  scoped_refptr<Layer> scrollbar_layer =
131      ScrollbarLayer::Create(scrollbar.Pass(),
132                             FakeScrollbarThemePainter::Create(false)
133                                 .PassAs<ScrollbarThemePainter>(),
134                             FakeWebScrollbarThemeGeometry::Create(true),
135                             layer_tree_root->id());
136  layer_tree_root->AddChild(content_layer);
137  layer_tree_root->AddChild(scrollbar_layer);
138
139  layer_tree_root->SetScrollOffset(gfx::Vector2d(10, 20));
140  layer_tree_root->SetMaxScrollOffset(gfx::Vector2d(30, 50));
141  layer_tree_root->SetBounds(gfx::Size(100, 200));
142  content_layer->SetBounds(gfx::Size(100, 200));
143
144  scoped_ptr<LayerImpl> layer_impl_tree_root =
145      TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
146                                         scoped_ptr<LayerImpl>(),
147                                         host_impl.active_tree());
148  TreeSynchronizer::PushProperties(layer_tree_root.get(),
149                                   layer_impl_tree_root.get());
150
151  ScrollbarLayerImpl* cc_scrollbar_layer =
152      static_cast<ScrollbarLayerImpl*>(layer_impl_tree_root->children()[1]);
153
154  EXPECT_EQ(10.f, cc_scrollbar_layer->CurrentPos());
155  EXPECT_EQ(100, cc_scrollbar_layer->TotalSize());
156  EXPECT_EQ(30, cc_scrollbar_layer->Maximum());
157
158  layer_tree_root->SetScrollOffset(gfx::Vector2d(100, 200));
159  layer_tree_root->SetMaxScrollOffset(gfx::Vector2d(300, 500));
160  layer_tree_root->SetBounds(gfx::Size(1000, 2000));
161  content_layer->SetBounds(gfx::Size(1000, 2000));
162
163  ScrollbarAnimationController* scrollbar_controller =
164      layer_impl_tree_root->scrollbar_animation_controller();
165  layer_impl_tree_root =
166      TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
167                                         layer_impl_tree_root.Pass(),
168                                         host_impl.active_tree());
169  TreeSynchronizer::PushProperties(layer_tree_root.get(),
170                                   layer_impl_tree_root.get());
171  EXPECT_EQ(scrollbar_controller,
172            layer_impl_tree_root->scrollbar_animation_controller());
173
174  EXPECT_EQ(100.f, cc_scrollbar_layer->CurrentPos());
175  EXPECT_EQ(1000, cc_scrollbar_layer->TotalSize());
176  EXPECT_EQ(300, cc_scrollbar_layer->Maximum());
177
178  layer_impl_tree_root->ScrollBy(gfx::Vector2d(12, 34));
179
180  EXPECT_EQ(112.f, cc_scrollbar_layer->CurrentPos());
181  EXPECT_EQ(1000, cc_scrollbar_layer->TotalSize());
182  EXPECT_EQ(300, cc_scrollbar_layer->Maximum());
183}
184
185TEST(ScrollbarLayerTest, SolidColorDrawQuads) {
186  LayerTreeSettings layer_tree_settings;
187  layer_tree_settings.solid_color_scrollbars = true;
188  layer_tree_settings.solid_color_scrollbar_thickness_dip = 3;
189  FakeImplProxy proxy;
190  FakeLayerTreeHostImpl host_impl(layer_tree_settings, &proxy);
191
192  scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
193  static_cast<FakeWebScrollbar*>(scrollbar.get())->set_overlay(true);
194  scoped_ptr<LayerImpl> layer_impl_tree_root =
195      LayerImplForScrollAreaAndScrollbar(&host_impl, scrollbar.Pass(), false);
196  ScrollbarLayerImpl* scrollbar_layer_impl =
197      static_cast<ScrollbarLayerImpl*>(layer_impl_tree_root->children()[1]);
198  scrollbar_layer_impl->SetThumbSize(gfx::Size(4, 4));
199  scrollbar_layer_impl->SetViewportWithinScrollableArea(
200      gfx::RectF(10.f, 0.f, 40.f, 0.f), gfx::SizeF(100.f, 100.f));
201
202  // Thickness should be overridden to 3.
203  {
204    MockQuadCuller quad_culler;
205    AppendQuadsData data;
206    scrollbar_layer_impl->AppendQuads(&quad_culler, &data);
207
208    const QuadList& quads = quad_culler.quad_list();
209    ASSERT_EQ(1, quads.size());
210    EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
211    EXPECT_RECT_EQ(gfx::Rect(1, 0, 4, 3), quads[0]->rect);
212  }
213
214  // Contents scale should scale the draw quad.
215  scrollbar_layer_impl->draw_properties().contents_scale_x = 2.f;
216  scrollbar_layer_impl->draw_properties().contents_scale_y = 2.f;
217  {
218    MockQuadCuller quad_culler;
219    AppendQuadsData data;
220    scrollbar_layer_impl->AppendQuads(&quad_culler, &data);
221
222    const QuadList& quads = quad_culler.quad_list();
223    ASSERT_EQ(1, quads.size());
224    EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
225    EXPECT_RECT_EQ(gfx::Rect(2, 0, 8, 6), quads[0]->rect);
226  }
227  scrollbar_layer_impl->draw_properties().contents_scale_x = 1.f;
228  scrollbar_layer_impl->draw_properties().contents_scale_y = 1.f;
229
230  // For solid color scrollbars, position and size should reflect the
231  // viewport, not the geometry object.
232  scrollbar_layer_impl->SetViewportWithinScrollableArea(
233      gfx::RectF(40.f, 0.f, 20.f, 0.f),
234      gfx::SizeF(100.f, 100.f));
235  {
236    MockQuadCuller quad_culler;
237    AppendQuadsData data;
238    scrollbar_layer_impl->AppendQuads(&quad_culler, &data);
239
240    const QuadList& quads = quad_culler.quad_list();
241    ASSERT_EQ(1, quads.size());
242    EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
243    EXPECT_RECT_EQ(gfx::Rect(4, 0, 2, 3), quads[0]->rect);
244  }
245}
246
247TEST(ScrollbarLayerTest, LayerDrivenSolidColorDrawQuads) {
248  LayerTreeSettings layer_tree_settings;
249  layer_tree_settings.solid_color_scrollbars = true;
250  layer_tree_settings.solid_color_scrollbar_thickness_dip = 3;
251  FakeImplProxy proxy;
252  FakeLayerTreeHostImpl host_impl(layer_tree_settings, &proxy);
253
254  scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
255  static_cast<FakeWebScrollbar*>(scrollbar.get())->set_overlay(true);
256  scoped_ptr<LayerImpl> layer_impl_tree_root =
257      LayerImplForScrollAreaAndScrollbar(&host_impl, scrollbar.Pass(), false);
258  ScrollbarLayerImpl* scrollbar_layer_impl =
259      static_cast<ScrollbarLayerImpl*>(layer_impl_tree_root->children()[1]);
260
261  // Make sure that this ends up calling SetViewportWithinScrollableArea.
262  layer_impl_tree_root->SetHorizontalScrollbarLayer(scrollbar_layer_impl);
263  layer_impl_tree_root->SetMaxScrollOffset(gfx::Vector2d(8, 8));
264  layer_impl_tree_root->SetBounds(gfx::Size(2, 2));
265  layer_impl_tree_root->ScrollBy(gfx::Vector2dF(4.f, 0.f));
266
267  {
268    MockQuadCuller quad_culler;
269    AppendQuadsData data;
270    scrollbar_layer_impl->AppendQuads(&quad_culler, &data);
271
272    const QuadList& quads = quad_culler.quad_list();
273    ASSERT_EQ(1, quads.size());
274    EXPECT_EQ(DrawQuad::SOLID_COLOR, quads[0]->material);
275    EXPECT_RECT_EQ(gfx::Rect(4, 0, 2, 3), quads[0]->rect);
276  }
277}
278
279class ScrollbarLayerTestMaxTextureSize : public LayerTreeTest {
280 public:
281  ScrollbarLayerTestMaxTextureSize() {}
282
283  void SetScrollbarBounds(gfx::Size bounds) { bounds_ = bounds; }
284
285  virtual void BeginTest() OVERRIDE {
286    layer_tree_host()->InitializeRendererIfNeeded();
287
288    scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
289    scrollbar_layer_ =
290        ScrollbarLayer::Create(scrollbar.Pass(),
291                               FakeScrollbarThemePainter::Create(false)
292                                   .PassAs<ScrollbarThemePainter>(),
293                               FakeWebScrollbarThemeGeometry::Create(true),
294                               1);
295    scrollbar_layer_->SetLayerTreeHost(layer_tree_host());
296    scrollbar_layer_->SetBounds(bounds_);
297    layer_tree_host()->root_layer()->AddChild(scrollbar_layer_);
298
299    scroll_layer_ = Layer::Create();
300    scrollbar_layer_->SetScrollLayerId(scroll_layer_->id());
301    layer_tree_host()->root_layer()->AddChild(scroll_layer_);
302
303    PostSetNeedsCommitToMainThread();
304  }
305
306  virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
307    const int kMaxTextureSize =
308        impl->GetRendererCapabilities().max_texture_size;
309
310    // Check first that we're actually testing something.
311    EXPECT_GT(scrollbar_layer_->bounds().width(), kMaxTextureSize);
312
313    EXPECT_EQ(scrollbar_layer_->content_bounds().width(),
314              kMaxTextureSize - 1);
315    EXPECT_EQ(scrollbar_layer_->content_bounds().height(),
316              kMaxTextureSize - 1);
317
318    EndTest();
319  }
320
321  virtual void AfterTest() OVERRIDE {}
322
323 private:
324  scoped_refptr<ScrollbarLayer> scrollbar_layer_;
325  scoped_refptr<Layer> scroll_layer_;
326  gfx::Size bounds_;
327};
328
329TEST_F(ScrollbarLayerTestMaxTextureSize, RunTest) {
330  scoped_ptr<TestWebGraphicsContext3D> context =
331      TestWebGraphicsContext3D::Create();
332  int max_size = 0;
333  context->getIntegerv(GL_MAX_TEXTURE_SIZE, &max_size);
334  SetScrollbarBounds(gfx::Size(max_size + 100, max_size + 100));
335  RunTest(true);
336}
337
338class MockLayerTreeHost : public LayerTreeHost {
339 public:
340  MockLayerTreeHost(LayerTreeHostClient* client,
341                    const LayerTreeSettings& settings)
342      : LayerTreeHost(client, settings) {
343      Initialize(scoped_ptr<Thread>(NULL));
344  }
345};
346
347
348class ScrollbarLayerTestResourceCreation : public testing::Test {
349 public:
350  ScrollbarLayerTestResourceCreation()
351      : fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
352
353  void TestResourceUpload(int expected_resources) {
354    layer_tree_host_.reset(
355        new MockLayerTreeHost(&fake_client_, layer_tree_settings_));
356
357    scoped_ptr<WebKit::WebScrollbar> scrollbar(FakeWebScrollbar::Create());
358    scoped_refptr<Layer> layer_tree_root = Layer::Create();
359    scoped_refptr<Layer> content_layer = Layer::Create();
360    scoped_refptr<Layer> scrollbar_layer =
361        ScrollbarLayer::Create(scrollbar.Pass(),
362                               FakeScrollbarThemePainter::Create(false)
363                                   .PassAs<ScrollbarThemePainter>(),
364                               FakeWebScrollbarThemeGeometry::Create(true),
365                               layer_tree_root->id());
366    layer_tree_root->AddChild(content_layer);
367    layer_tree_root->AddChild(scrollbar_layer);
368
369    layer_tree_host_->InitializeRendererIfNeeded();
370    layer_tree_host_->contents_texture_manager()->
371        SetMaxMemoryLimitBytes(1024 * 1024);
372    layer_tree_host_->SetRootLayer(layer_tree_root);
373
374    scrollbar_layer->SetIsDrawable(true);
375    scrollbar_layer->SetBounds(gfx::Size(100, 100));
376    layer_tree_root->SetScrollOffset(gfx::Vector2d(10, 20));
377    layer_tree_root->SetMaxScrollOffset(gfx::Vector2d(30, 50));
378    layer_tree_root->SetBounds(gfx::Size(100, 200));
379    content_layer->SetBounds(gfx::Size(100, 200));
380    scrollbar_layer->draw_properties().content_bounds = gfx::Size(100, 200);
381    scrollbar_layer->draw_properties().visible_content_rect =
382        gfx::Rect(0, 0, 100, 200);
383    scrollbar_layer->CreateRenderSurface();
384    scrollbar_layer->draw_properties().render_target = scrollbar_layer;
385
386    testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get());
387    EXPECT_EQ(scrollbar_layer->layer_tree_host(), layer_tree_host_.get());
388
389    PriorityCalculator calculator;
390    ResourceUpdateQueue queue;
391    OcclusionTracker occlusion_tracker(gfx::Rect(), false);
392
393    scrollbar_layer->SetTexturePriorities(calculator);
394    layer_tree_host_->contents_texture_manager()->PrioritizeTextures();
395    scrollbar_layer->Update(&queue, &occlusion_tracker, NULL);
396    EXPECT_EQ(0, queue.FullUploadSize());
397    EXPECT_EQ(expected_resources, queue.PartialUploadSize());
398
399    testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get());
400  }
401
402 protected:
403  FakeLayerTreeHostClient fake_client_;
404  LayerTreeSettings layer_tree_settings_;
405  scoped_ptr<MockLayerTreeHost> layer_tree_host_;
406};
407
408TEST_F(ScrollbarLayerTestResourceCreation, ResourceUpload) {
409  layer_tree_settings_.solid_color_scrollbars = false;
410  TestResourceUpload(2);
411}
412
413TEST_F(ScrollbarLayerTestResourceCreation, SolidColorNoResourceUpload) {
414  layer_tree_settings_.solid_color_scrollbars = true;
415  TestResourceUpload(0);
416}
417
418TEST(ScrollbarLayerTest, PinchZoomScrollbarUpdates) {
419  FakeImplProxy proxy;
420  FakeLayerTreeHostImpl host_impl(&proxy);
421
422  scoped_refptr<Layer> layer_tree_root = Layer::Create();
423  layer_tree_root->SetScrollable(true);
424
425  scoped_refptr<Layer> content_layer = Layer::Create();
426  scoped_ptr<WebKit::WebScrollbar> scrollbar1(FakeWebScrollbar::Create());
427  scoped_refptr<Layer> scrollbar_layer_horizontal =
428      ScrollbarLayer::Create(scrollbar1.Pass(),
429                             FakeScrollbarThemePainter::Create(false)
430                                 .PassAs<ScrollbarThemePainter>(),
431                             FakeWebScrollbarThemeGeometry::Create(true),
432                             Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID);
433  scoped_ptr<WebKit::WebScrollbar> scrollbar2(FakeWebScrollbar::Create());
434  scoped_refptr<Layer> scrollbar_layer_vertical =
435      ScrollbarLayer::Create(scrollbar2.Pass(),
436                             FakeScrollbarThemePainter::Create(false)
437                                 .PassAs<ScrollbarThemePainter>(),
438                             FakeWebScrollbarThemeGeometry::Create(true),
439                             Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID);
440
441  layer_tree_root->AddChild(content_layer);
442  layer_tree_root->AddChild(scrollbar_layer_horizontal);
443  layer_tree_root->AddChild(scrollbar_layer_vertical);
444
445  layer_tree_root->SetScrollOffset(gfx::Vector2d(10, 20));
446  layer_tree_root->SetMaxScrollOffset(gfx::Vector2d(30, 50));
447  layer_tree_root->SetBounds(gfx::Size(100, 200));
448  content_layer->SetBounds(gfx::Size(100, 200));
449
450  scoped_ptr<LayerImpl> layer_impl_tree_root =
451      TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
452                                         scoped_ptr<LayerImpl>(),
453                                         host_impl.active_tree());
454  TreeSynchronizer::PushProperties(layer_tree_root.get(),
455                                   layer_impl_tree_root.get());
456
457  ScrollbarLayerImpl* pinch_zoom_horizontal =
458      static_cast<ScrollbarLayerImpl*>(layer_impl_tree_root->children()[1]);
459  ScrollbarLayerImpl* pinch_zoom_vertical =
460      static_cast<ScrollbarLayerImpl*>(layer_impl_tree_root->children()[2]);
461
462  // Need a root layer in the active tree in order for DidUpdateScroll()
463  // to work.
464  host_impl.active_tree()->SetRootLayer(layer_impl_tree_root.Pass());
465  host_impl.active_tree()->FindRootScrollLayer();
466
467  // Manually set the pinch-zoom layers: normally this is done by
468  // LayerTreeHost.
469  host_impl.active_tree()->
470      SetPinchZoomHorizontalLayerId(pinch_zoom_horizontal->id());
471  host_impl.active_tree()->
472      SetPinchZoomVerticalLayerId(pinch_zoom_vertical->id());
473
474  host_impl.active_tree()->DidUpdateScroll();
475
476  EXPECT_EQ(10.f, pinch_zoom_horizontal->CurrentPos());
477  EXPECT_EQ(100, pinch_zoom_horizontal->TotalSize());
478  EXPECT_EQ(30, pinch_zoom_horizontal->Maximum());
479  EXPECT_EQ(20.f, pinch_zoom_vertical->CurrentPos());
480  EXPECT_EQ(200, pinch_zoom_vertical->TotalSize());
481  EXPECT_EQ(50, pinch_zoom_vertical->Maximum());
482}
483
484}  // namespace
485}  // namespace cc
486