Home | History | Annotate | Download | only in layers
      1 // Copyright 2011 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/layer_impl.h"
      6 
      7 #include "cc/output/filter_operation.h"
      8 #include "cc/output/filter_operations.h"
      9 #include "cc/test/fake_impl_proxy.h"
     10 #include "cc/test/fake_layer_tree_host_impl.h"
     11 #include "cc/test/fake_output_surface.h"
     12 #include "cc/test/geometry_test_utils.h"
     13 #include "cc/trees/layer_tree_impl.h"
     14 #include "cc/trees/single_thread_proxy.h"
     15 #include "testing/gmock/include/gmock/gmock.h"
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 #include "third_party/skia/include/effects/SkBlurImageFilter.h"
     18 
     19 namespace cc {
     20 namespace {
     21 
     22 #define EXECUTE_AND_VERIFY_SUBTREE_CHANGED(code_to_test)                       \
     23   root->ResetAllChangeTrackingForSubtree();                                    \
     24   code_to_test;                                                                \
     25   EXPECT_TRUE(root->LayerPropertyChanged());                                   \
     26   EXPECT_TRUE(child->LayerPropertyChanged());                                  \
     27   EXPECT_TRUE(grand_child->LayerPropertyChanged());                            \
     28   EXPECT_FALSE(root->LayerSurfacePropertyChanged())
     29 
     30 #define EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(code_to_test)                \
     31   root->ResetAllChangeTrackingForSubtree();                                    \
     32   code_to_test;                                                                \
     33   EXPECT_FALSE(root->LayerPropertyChanged());                                  \
     34   EXPECT_FALSE(child->LayerPropertyChanged());                                 \
     35   EXPECT_FALSE(grand_child->LayerPropertyChanged());                           \
     36   EXPECT_FALSE(root->LayerSurfacePropertyChanged())
     37 
     38 #define EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(code_to_test)                    \
     39   root->ResetAllChangeTrackingForSubtree();                                    \
     40   code_to_test;                                                                \
     41   EXPECT_TRUE(root->LayerPropertyChanged());                                   \
     42   EXPECT_FALSE(child->LayerPropertyChanged());                                 \
     43   EXPECT_FALSE(grand_child->LayerPropertyChanged());                           \
     44   EXPECT_FALSE(root->LayerSurfacePropertyChanged())
     45 
     46 #define EXECUTE_AND_VERIFY_ONLY_SURFACE_CHANGED(code_to_test)                  \
     47   root->ResetAllChangeTrackingForSubtree();                                    \
     48   code_to_test;                                                                \
     49   EXPECT_FALSE(root->LayerPropertyChanged());                                  \
     50   EXPECT_FALSE(child->LayerPropertyChanged());                                 \
     51   EXPECT_FALSE(grand_child->LayerPropertyChanged());                           \
     52   EXPECT_TRUE(root->LayerSurfacePropertyChanged())
     53 
     54 #define VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test)                      \
     55   root->ResetAllChangeTrackingForSubtree();                                    \
     56   host_impl.ForcePrepareToDraw();                                              \
     57   EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties());       \
     58   code_to_test;                                                                \
     59   EXPECT_TRUE(host_impl.active_tree()->needs_update_draw_properties());
     60 
     61 #define VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test)                   \
     62   root->ResetAllChangeTrackingForSubtree();                                    \
     63   host_impl.ForcePrepareToDraw();                                              \
     64   EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties());       \
     65   code_to_test;                                                                \
     66   EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties());
     67 
     68 TEST(LayerImplTest, VerifyLayerChangesAreTrackedProperly) {
     69   //
     70   // This test checks that layerPropertyChanged() has the correct behavior.
     71   //
     72 
     73   // The constructor on this will fake that we are on the correct thread.
     74   // Create a simple LayerImpl tree:
     75   FakeImplProxy proxy;
     76   FakeLayerTreeHostImpl host_impl(&proxy);
     77   EXPECT_TRUE(host_impl.InitializeRenderer(CreateFakeOutputSurface()));
     78   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
     79   root->AddChild(LayerImpl::Create(host_impl.active_tree(), 2));
     80   LayerImpl* child = root->children()[0];
     81   child->AddChild(LayerImpl::Create(host_impl.active_tree(), 3));
     82   LayerImpl* grand_child = child->children()[0];
     83 
     84   root->SetScrollable(true);
     85 
     86   // Adding children is an internal operation and should not mark layers as
     87   // changed.
     88   EXPECT_FALSE(root->LayerPropertyChanged());
     89   EXPECT_FALSE(child->LayerPropertyChanged());
     90   EXPECT_FALSE(grand_child->LayerPropertyChanged());
     91 
     92   gfx::PointF arbitrary_point_f = gfx::PointF(0.125f, 0.25f);
     93   float arbitrary_number = 0.352f;
     94   gfx::Size arbitrary_size = gfx::Size(111, 222);
     95   gfx::Point arbitrary_point = gfx::Point(333, 444);
     96   gfx::Vector2d arbitrary_vector2d = gfx::Vector2d(111, 222);
     97   gfx::Rect arbitrary_rect = gfx::Rect(arbitrary_point, arbitrary_size);
     98   gfx::RectF arbitrary_rect_f =
     99       gfx::RectF(arbitrary_point_f, gfx::SizeF(1.234f, 5.678f));
    100   SkColor arbitrary_color = SkColorSetRGB(10, 20, 30);
    101   gfx::Transform arbitrary_transform;
    102   arbitrary_transform.Scale3d(0.1, 0.2, 0.3);
    103   FilterOperations arbitrary_filters;
    104   arbitrary_filters.Append(FilterOperation::CreateOpacityFilter(0.5f));
    105   skia::RefPtr<SkImageFilter> arbitrary_filter =
    106       skia::AdoptRef(new SkBlurImageFilter(SK_Scalar1, SK_Scalar1));
    107 
    108   // These properties are internal, and should not be considered "change" when
    109   // they are used.
    110   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    111       root->set_update_rect(arbitrary_rect_f));
    112   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    113       root->SetMaxScrollOffset(arbitrary_vector2d));
    114 
    115   // Changing these properties affects the entire subtree of layers.
    116   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetAnchorPoint(arbitrary_point_f));
    117   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetAnchorPointZ(arbitrary_number));
    118   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetFilters(arbitrary_filters));
    119   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetFilters(FilterOperations()));
    120   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetFilter(arbitrary_filter));
    121   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(
    122       root->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 4)));
    123   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetMasksToBounds(true));
    124   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetContentsOpaque(true));
    125   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(
    126       root->SetReplicaLayer(LayerImpl::Create(host_impl.active_tree(), 5)));
    127   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetPosition(arbitrary_point_f));
    128   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetPreserves3d(true));
    129   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(
    130       root->SetDoubleSided(false));  // constructor initializes it to "true".
    131   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->ScrollBy(arbitrary_vector2d));
    132   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetScrollDelta(gfx::Vector2d()));
    133   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetScrollOffset(arbitrary_vector2d));
    134   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetHideLayerAndSubtree(true));
    135 
    136   // Changing these properties only affects the layer itself.
    137   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetContentBounds(arbitrary_size));
    138   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(
    139       root->SetContentsScale(arbitrary_number, arbitrary_number));
    140   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetDrawsContent(true));
    141   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(
    142       root->SetBackgroundColor(arbitrary_color));
    143   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(
    144       root->SetBackgroundFilters(arbitrary_filters));
    145 
    146   // Changing these properties only affects how render surface is drawn
    147   EXECUTE_AND_VERIFY_ONLY_SURFACE_CHANGED(root->SetOpacity(arbitrary_number));
    148   EXECUTE_AND_VERIFY_ONLY_SURFACE_CHANGED(
    149       root->SetTransform(arbitrary_transform));
    150 
    151   // Special case: check that sublayer transform changes all layer's
    152   // descendants, but not the layer itself.
    153   root->ResetAllChangeTrackingForSubtree();
    154   root->SetSublayerTransform(arbitrary_transform);
    155   EXPECT_FALSE(root->LayerPropertyChanged());
    156   EXPECT_TRUE(child->LayerPropertyChanged());
    157   EXPECT_TRUE(grand_child->LayerPropertyChanged());
    158 
    159   // Special case: check that SetBounds changes behavior depending on
    160   // masksToBounds.
    161   root->SetMasksToBounds(false);
    162   EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetBounds(gfx::Size(135, 246)));
    163   root->SetMasksToBounds(true);
    164   // Should be a different size than previous call, to ensure it marks tree
    165   // changed.
    166   EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetBounds(arbitrary_size));
    167 
    168   // After setting all these properties already, setting to the exact same
    169   // values again should not cause any change.
    170   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    171       root->SetAnchorPoint(arbitrary_point_f));
    172   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    173       root->SetAnchorPointZ(arbitrary_number));
    174   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetMasksToBounds(true));
    175   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    176       root->SetPosition(arbitrary_point_f));
    177   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetPreserves3d(true));
    178   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    179       root->SetTransform(arbitrary_transform));
    180   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    181       root->SetDoubleSided(false));  // constructor initializes it to "true".
    182   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    183       root->SetScrollDelta(gfx::Vector2d()));
    184   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    185       root->SetScrollOffset(arbitrary_vector2d));
    186   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    187       root->SetContentBounds(arbitrary_size));
    188   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    189       root->SetContentsScale(arbitrary_number, arbitrary_number));
    190   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetContentsOpaque(true));
    191   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetOpacity(arbitrary_number));
    192   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetDrawsContent(true));
    193   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(
    194       root->SetSublayerTransform(arbitrary_transform));
    195   EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetBounds(arbitrary_size));
    196 }
    197 
    198 TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) {
    199   FakeImplProxy proxy;
    200   FakeLayerTreeHostImpl host_impl(&proxy);
    201   EXPECT_TRUE(host_impl.InitializeRenderer(CreateFakeOutputSurface()));
    202   scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
    203   root->SetScrollable(true);
    204 
    205   gfx::PointF arbitrary_point_f = gfx::PointF(0.125f, 0.25f);
    206   float arbitrary_number = 0.352f;
    207   gfx::Size arbitrary_size = gfx::Size(111, 222);
    208   gfx::Point arbitrary_point = gfx::Point(333, 444);
    209   gfx::Vector2d arbitrary_vector2d = gfx::Vector2d(111, 222);
    210   gfx::Vector2d large_vector2d = gfx::Vector2d(1000, 1000);
    211   gfx::Rect arbitrary_rect = gfx::Rect(arbitrary_point, arbitrary_size);
    212   gfx::RectF arbitrary_rect_f =
    213       gfx::RectF(arbitrary_point_f, gfx::SizeF(1.234f, 5.678f));
    214   SkColor arbitrary_color = SkColorSetRGB(10, 20, 30);
    215   gfx::Transform arbitrary_transform;
    216   arbitrary_transform.Scale3d(0.1, 0.2, 0.3);
    217   FilterOperations arbitrary_filters;
    218   arbitrary_filters.Append(FilterOperation::CreateOpacityFilter(0.5f));
    219   skia::RefPtr<SkImageFilter> arbitrary_filter =
    220       skia::AdoptRef(new SkBlurImageFilter(SK_Scalar1, SK_Scalar1));
    221 
    222   // Related filter functions.
    223   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetFilters(arbitrary_filters));
    224   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetFilters(arbitrary_filters));
    225   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetFilters(FilterOperations()));
    226   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetFilter(arbitrary_filter));
    227   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetFilter(arbitrary_filter));
    228 
    229   // Related scrolling functions.
    230   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetMaxScrollOffset(large_vector2d));
    231   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    232       root->SetMaxScrollOffset(large_vector2d));
    233   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->ScrollBy(arbitrary_vector2d));
    234   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->ScrollBy(gfx::Vector2d()));
    235   root->SetScrollDelta(gfx::Vector2d(0, 0));
    236   host_impl.ForcePrepareToDraw();
    237   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetScrollDelta(arbitrary_vector2d));
    238   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    239       root->SetScrollDelta(arbitrary_vector2d));
    240   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    241       root->SetScrollOffset(arbitrary_vector2d));
    242   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    243       root->SetScrollOffset(arbitrary_vector2d));
    244 
    245   // Unrelated functions, always set to new values, always set needs update.
    246   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetAnchorPointZ(arbitrary_number));
    247   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    248       root->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 4)));
    249   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetMasksToBounds(true));
    250   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetContentsOpaque(true));
    251   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    252       root->SetReplicaLayer(LayerImpl::Create(host_impl.active_tree(), 5)));
    253   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetPosition(arbitrary_point_f));
    254   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetPreserves3d(true));
    255   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    256       root->SetDoubleSided(false));  // constructor initializes it to "true".
    257   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetContentBounds(arbitrary_size));
    258   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    259       root->SetContentsScale(arbitrary_number, arbitrary_number));
    260   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetDrawsContent(true));
    261   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    262       root->SetBackgroundColor(arbitrary_color));
    263   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    264       root->SetBackgroundFilters(arbitrary_filters));
    265   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetOpacity(arbitrary_number));
    266   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetTransform(arbitrary_transform));
    267   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(
    268       root->SetSublayerTransform(arbitrary_transform));
    269   VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetBounds(arbitrary_size));
    270 
    271   // Unrelated functions, set to the same values, no needs update.
    272   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    273       root->SetAnchorPointZ(arbitrary_number));
    274   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetFilter(arbitrary_filter));
    275   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetMasksToBounds(true));
    276   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetContentsOpaque(true));
    277   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetPosition(arbitrary_point_f));
    278   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetPreserves3d(true));
    279   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    280       root->SetDoubleSided(false));  // constructor initializes it to "true".
    281   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    282       root->SetContentBounds(arbitrary_size));
    283   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    284       root->SetContentsScale(arbitrary_number, arbitrary_number));
    285   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetDrawsContent(true));
    286   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    287       root->SetBackgroundColor(arbitrary_color));
    288   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    289       root->SetBackgroundFilters(arbitrary_filters));
    290   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetOpacity(arbitrary_number));
    291   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    292       root->SetTransform(arbitrary_transform));
    293   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
    294       root->SetSublayerTransform(arbitrary_transform));
    295   VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(root->SetBounds(arbitrary_size));
    296 }
    297 
    298 TEST(LayerImplTest, SafeOpaqueBackgroundColor) {
    299   FakeImplProxy proxy;
    300   FakeLayerTreeHostImpl host_impl(&proxy);
    301   EXPECT_TRUE(host_impl.InitializeRenderer(CreateFakeOutputSurface()));
    302   scoped_ptr<LayerImpl> layer = LayerImpl::Create(host_impl.active_tree(), 1);
    303 
    304   for (int contents_opaque = 0; contents_opaque < 2; ++contents_opaque) {
    305     for (int layer_opaque = 0; layer_opaque < 2; ++layer_opaque) {
    306       for (int host_opaque = 0; host_opaque < 2; ++host_opaque) {
    307         layer->SetContentsOpaque(!!contents_opaque);
    308         layer->SetBackgroundColor(layer_opaque ? SK_ColorRED
    309                                                : SK_ColorTRANSPARENT);
    310         host_impl.active_tree()->set_background_color(
    311             host_opaque ? SK_ColorRED : SK_ColorTRANSPARENT);
    312 
    313         SkColor safe_color = layer->SafeOpaqueBackgroundColor();
    314         if (contents_opaque) {
    315           EXPECT_EQ(SkColorGetA(safe_color), 255u)
    316               << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
    317               << host_opaque << "\n";
    318         } else {
    319           EXPECT_NE(SkColorGetA(safe_color), 255u)
    320               << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
    321               << host_opaque << "\n";
    322         }
    323       }
    324     }
    325   }
    326 }
    327 
    328 class LayerImplScrollTest : public testing::Test {
    329  public:
    330   LayerImplScrollTest() : host_impl_(&proxy_), root_id_(7) {
    331     host_impl_.active_tree()
    332         ->SetRootLayer(LayerImpl::Create(host_impl_.active_tree(), root_id_));
    333     host_impl_.active_tree()->root_layer()->SetScrollable(true);
    334   }
    335 
    336   LayerImpl* layer() { return host_impl_.active_tree()->root_layer(); }
    337 
    338  private:
    339   FakeImplProxy proxy_;
    340   FakeLayerTreeHostImpl host_impl_;
    341   int root_id_;
    342 };
    343 
    344 TEST_F(LayerImplScrollTest, ScrollByWithZeroOffset) {
    345   // Test that LayerImpl::ScrollBy only affects ScrollDelta and total scroll
    346   // offset is bounded by the range [0, max scroll offset].
    347   gfx::Vector2d max_scroll_offset(50, 80);
    348   layer()->SetMaxScrollOffset(max_scroll_offset);
    349 
    350   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->TotalScrollOffset());
    351   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->scroll_offset());
    352   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta());
    353 
    354   layer()->ScrollBy(gfx::Vector2dF(-100, 100));
    355   EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset());
    356 
    357   EXPECT_VECTOR_EQ(layer()->ScrollDelta(), layer()->TotalScrollOffset());
    358   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->scroll_offset());
    359 
    360   layer()->ScrollBy(gfx::Vector2dF(100, -100));
    361   EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 0), layer()->TotalScrollOffset());
    362 
    363   EXPECT_VECTOR_EQ(layer()->ScrollDelta(), layer()->TotalScrollOffset());
    364   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->scroll_offset());
    365 }
    366 
    367 TEST_F(LayerImplScrollTest, ScrollByWithNonZeroOffset) {
    368   gfx::Vector2d max_scroll_offset(50, 80);
    369   gfx::Vector2d scroll_offset(10, 5);
    370   layer()->SetMaxScrollOffset(max_scroll_offset);
    371   layer()->SetScrollOffset(scroll_offset);
    372 
    373   EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset());
    374   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    375   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta());
    376 
    377   layer()->ScrollBy(gfx::Vector2dF(-100, 100));
    378   EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset());
    379 
    380   EXPECT_VECTOR_EQ(layer()->ScrollDelta() + scroll_offset,
    381                    layer()->TotalScrollOffset());
    382   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    383 
    384   layer()->ScrollBy(gfx::Vector2dF(100, -100));
    385   EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 0), layer()->TotalScrollOffset());
    386 
    387   EXPECT_VECTOR_EQ(layer()->ScrollDelta() + scroll_offset,
    388                    layer()->TotalScrollOffset());
    389   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    390 }
    391 
    392 class ScrollDelegateIgnore : public LayerScrollOffsetDelegate {
    393  public:
    394   virtual void SetMaxScrollOffset(gfx::Vector2dF max_scroll_offset) OVERRIDE {}
    395   virtual void SetTotalScrollOffset(gfx::Vector2dF new_value) OVERRIDE {}
    396   virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
    397     return fixed_offset_;
    398   }
    399   virtual bool IsExternalFlingActive() const OVERRIDE { return false; }
    400 
    401   void set_fixed_offset(gfx::Vector2dF fixed_offset) {
    402     fixed_offset_ = fixed_offset;
    403   }
    404 
    405   virtual void SetTotalPageScaleFactor(float page_scale_factor) OVERRIDE {}
    406   virtual void SetScrollableSize(gfx::SizeF scrollable_size) OVERRIDE {}
    407 
    408  private:
    409   gfx::Vector2dF fixed_offset_;
    410 };
    411 
    412 TEST_F(LayerImplScrollTest, ScrollByWithIgnoringDelegate) {
    413   gfx::Vector2d max_scroll_offset(50, 80);
    414   gfx::Vector2d scroll_offset(10, 5);
    415   layer()->SetMaxScrollOffset(max_scroll_offset);
    416   layer()->SetScrollOffset(scroll_offset);
    417 
    418   EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset());
    419   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    420   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta());
    421 
    422   ScrollDelegateIgnore delegate;
    423   gfx::Vector2dF fixed_offset(32, 12);
    424   delegate.set_fixed_offset(fixed_offset);
    425   layer()->SetScrollOffsetDelegate(&delegate);
    426 
    427   EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset());
    428   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    429 
    430   layer()->ScrollBy(gfx::Vector2dF(-100, 100));
    431 
    432   EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset());
    433   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    434 
    435   layer()->SetScrollOffsetDelegate(NULL);
    436 
    437   EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset());
    438   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    439 
    440   gfx::Vector2dF scroll_delta(1, 1);
    441   layer()->ScrollBy(scroll_delta);
    442 
    443   EXPECT_VECTOR_EQ(fixed_offset + scroll_delta, layer()->TotalScrollOffset());
    444   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    445 }
    446 
    447 class ScrollDelegateAccept : public LayerScrollOffsetDelegate {
    448  public:
    449   virtual void SetMaxScrollOffset(gfx::Vector2dF max_scroll_offset) OVERRIDE {}
    450   virtual void SetTotalScrollOffset(gfx::Vector2dF new_value) OVERRIDE {
    451     current_offset_ = new_value;
    452   }
    453   virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
    454     return current_offset_;
    455   }
    456   virtual bool IsExternalFlingActive() const OVERRIDE { return false; }
    457   virtual void SetTotalPageScaleFactor(float page_scale_factor) OVERRIDE {}
    458   virtual void SetScrollableSize(gfx::SizeF scrollable_size) OVERRIDE {}
    459 
    460  private:
    461   gfx::Vector2dF current_offset_;
    462 };
    463 
    464 TEST_F(LayerImplScrollTest, ScrollByWithAcceptingDelegate) {
    465   gfx::Vector2d max_scroll_offset(50, 80);
    466   gfx::Vector2d scroll_offset(10, 5);
    467   layer()->SetMaxScrollOffset(max_scroll_offset);
    468   layer()->SetScrollOffset(scroll_offset);
    469 
    470   EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset());
    471   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    472   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta());
    473 
    474   ScrollDelegateAccept delegate;
    475   layer()->SetScrollOffsetDelegate(&delegate);
    476 
    477   EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset());
    478   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    479   EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta());
    480 
    481   layer()->ScrollBy(gfx::Vector2dF(-100, 100));
    482 
    483   EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset());
    484   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    485 
    486   layer()->SetScrollOffsetDelegate(NULL);
    487 
    488   EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset());
    489   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    490 
    491   gfx::Vector2dF scroll_delta(1, 1);
    492   layer()->ScrollBy(scroll_delta);
    493 
    494   EXPECT_VECTOR_EQ(gfx::Vector2dF(1, 80), layer()->TotalScrollOffset());
    495   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    496 }
    497 
    498 TEST_F(LayerImplScrollTest, ApplySentScrollsNoDelegate) {
    499   gfx::Vector2d max_scroll_offset(50, 80);
    500   gfx::Vector2d scroll_offset(10, 5);
    501   gfx::Vector2dF scroll_delta(20.5f, 8.5f);
    502   gfx::Vector2d sent_scroll_delta(12, -3);
    503 
    504   layer()->SetMaxScrollOffset(max_scroll_offset);
    505   layer()->SetScrollOffset(scroll_offset);
    506   layer()->ScrollBy(scroll_delta);
    507   layer()->SetSentScrollDelta(sent_scroll_delta);
    508 
    509   EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset());
    510   EXPECT_VECTOR_EQ(scroll_delta, layer()->ScrollDelta());
    511   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    512   EXPECT_VECTOR_EQ(sent_scroll_delta, layer()->sent_scroll_delta());
    513 
    514   layer()->ApplySentScrollDeltas();
    515 
    516   EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset());
    517   EXPECT_VECTOR_EQ(scroll_delta - sent_scroll_delta, layer()->ScrollDelta());
    518   EXPECT_VECTOR_EQ(scroll_offset + sent_scroll_delta, layer()->scroll_offset());
    519   EXPECT_VECTOR_EQ(gfx::Vector2d(), layer()->sent_scroll_delta());
    520 }
    521 
    522 TEST_F(LayerImplScrollTest, ApplySentScrollsWithIgnoringDelegate) {
    523   gfx::Vector2d max_scroll_offset(50, 80);
    524   gfx::Vector2d scroll_offset(10, 5);
    525   gfx::Vector2d sent_scroll_delta(12, -3);
    526   gfx::Vector2dF fixed_offset(32, 12);
    527 
    528   layer()->SetMaxScrollOffset(max_scroll_offset);
    529   layer()->SetScrollOffset(scroll_offset);
    530   ScrollDelegateIgnore delegate;
    531   delegate.set_fixed_offset(fixed_offset);
    532   layer()->SetScrollOffsetDelegate(&delegate);
    533   layer()->SetSentScrollDelta(sent_scroll_delta);
    534 
    535   EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset());
    536   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    537   EXPECT_VECTOR_EQ(sent_scroll_delta, layer()->sent_scroll_delta());
    538 
    539   layer()->ApplySentScrollDeltas();
    540 
    541   EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset());
    542   EXPECT_VECTOR_EQ(scroll_offset + sent_scroll_delta, layer()->scroll_offset());
    543   EXPECT_VECTOR_EQ(gfx::Vector2d(), layer()->sent_scroll_delta());
    544 }
    545 
    546 TEST_F(LayerImplScrollTest, ApplySentScrollsWithAcceptingDelegate) {
    547   gfx::Vector2d max_scroll_offset(50, 80);
    548   gfx::Vector2d scroll_offset(10, 5);
    549   gfx::Vector2d sent_scroll_delta(12, -3);
    550   gfx::Vector2dF scroll_delta(20.5f, 8.5f);
    551 
    552   layer()->SetMaxScrollOffset(max_scroll_offset);
    553   layer()->SetScrollOffset(scroll_offset);
    554   ScrollDelegateAccept delegate;
    555   layer()->SetScrollOffsetDelegate(&delegate);
    556   layer()->ScrollBy(scroll_delta);
    557   layer()->SetSentScrollDelta(sent_scroll_delta);
    558 
    559   EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset());
    560   EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset());
    561   EXPECT_VECTOR_EQ(sent_scroll_delta, layer()->sent_scroll_delta());
    562 
    563   layer()->ApplySentScrollDeltas();
    564 
    565   EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset());
    566   EXPECT_VECTOR_EQ(scroll_offset + sent_scroll_delta, layer()->scroll_offset());
    567   EXPECT_VECTOR_EQ(gfx::Vector2d(), layer()->sent_scroll_delta());
    568 }
    569 
    570 }  // namespace
    571 }  // namespace cc
    572