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/test/test_shared_bitmap_manager.h" 14 #include "cc/trees/layer_tree_impl.h" 15 #include "cc/trees/single_thread_proxy.h" 16 #include "testing/gmock/include/gmock/gmock.h" 17 #include "testing/gtest/include/gtest/gtest.h" 18 #include "third_party/skia/include/effects/SkBlurImageFilter.h" 19 20 namespace cc { 21 namespace { 22 23 #define EXECUTE_AND_VERIFY_SUBTREE_CHANGED(code_to_test) \ 24 root->ResetAllChangeTrackingForSubtree(); \ 25 code_to_test; \ 26 EXPECT_TRUE(root->needs_push_properties()); \ 27 EXPECT_FALSE(child->needs_push_properties()); \ 28 EXPECT_FALSE(grand_child->needs_push_properties()); \ 29 EXPECT_TRUE(root->LayerPropertyChanged()); \ 30 EXPECT_TRUE(child->LayerPropertyChanged()); \ 31 EXPECT_TRUE(grand_child->LayerPropertyChanged()); 32 33 #define EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(code_to_test) \ 34 root->ResetAllChangeTrackingForSubtree(); \ 35 code_to_test; \ 36 EXPECT_FALSE(root->needs_push_properties()); \ 37 EXPECT_FALSE(child->needs_push_properties()); \ 38 EXPECT_FALSE(grand_child->needs_push_properties()); \ 39 EXPECT_FALSE(root->LayerPropertyChanged()); \ 40 EXPECT_FALSE(child->LayerPropertyChanged()); \ 41 EXPECT_FALSE(grand_child->LayerPropertyChanged()); 42 43 #define EXECUTE_AND_VERIFY_NEEDS_PUSH_PROPERTIES_AND_SUBTREE_DID_NOT_CHANGE( \ 44 code_to_test) \ 45 root->ResetAllChangeTrackingForSubtree(); \ 46 code_to_test; \ 47 EXPECT_TRUE(root->needs_push_properties()); \ 48 EXPECT_FALSE(child->needs_push_properties()); \ 49 EXPECT_FALSE(grand_child->needs_push_properties()); \ 50 EXPECT_FALSE(root->LayerPropertyChanged()); \ 51 EXPECT_FALSE(child->LayerPropertyChanged()); \ 52 EXPECT_FALSE(grand_child->LayerPropertyChanged()); 53 54 #define EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(code_to_test) \ 55 root->ResetAllChangeTrackingForSubtree(); \ 56 code_to_test; \ 57 EXPECT_TRUE(root->needs_push_properties()); \ 58 EXPECT_FALSE(child->needs_push_properties()); \ 59 EXPECT_FALSE(grand_child->needs_push_properties()); \ 60 EXPECT_TRUE(root->LayerPropertyChanged()); \ 61 EXPECT_FALSE(child->LayerPropertyChanged()); \ 62 EXPECT_FALSE(grand_child->LayerPropertyChanged()); 63 64 #define VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test) \ 65 root->ResetAllChangeTrackingForSubtree(); \ 66 host_impl.ForcePrepareToDraw(); \ 67 EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); \ 68 code_to_test; \ 69 EXPECT_TRUE(host_impl.active_tree()->needs_update_draw_properties()); 70 71 #define VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test) \ 72 root->ResetAllChangeTrackingForSubtree(); \ 73 host_impl.ForcePrepareToDraw(); \ 74 EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); \ 75 code_to_test; \ 76 EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); 77 78 TEST(LayerImplTest, VerifyLayerChangesAreTrackedProperly) { 79 // 80 // This test checks that layerPropertyChanged() has the correct behavior. 81 // 82 83 // The constructor on this will fake that we are on the correct thread. 84 // Create a simple LayerImpl tree: 85 FakeImplProxy proxy; 86 TestSharedBitmapManager shared_bitmap_manager; 87 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager); 88 EXPECT_TRUE(host_impl.InitializeRenderer( 89 FakeOutputSurface::Create3d().PassAs<OutputSurface>())); 90 scoped_ptr<LayerImpl> root_clip = 91 LayerImpl::Create(host_impl.active_tree(), 1); 92 scoped_ptr<LayerImpl> root_ptr = 93 LayerImpl::Create(host_impl.active_tree(), 2); 94 LayerImpl* root = root_ptr.get(); 95 root_clip->AddChild(root_ptr.Pass()); 96 scoped_ptr<LayerImpl> scroll_parent = 97 LayerImpl::Create(host_impl.active_tree(), 3); 98 LayerImpl* scroll_child = LayerImpl::Create(host_impl.active_tree(), 4).get(); 99 std::set<LayerImpl*>* scroll_children = new std::set<LayerImpl*>(); 100 scroll_children->insert(scroll_child); 101 scroll_children->insert(root); 102 103 scoped_ptr<LayerImpl> clip_parent = 104 LayerImpl::Create(host_impl.active_tree(), 5); 105 LayerImpl* clip_child = LayerImpl::Create(host_impl.active_tree(), 6).get(); 106 std::set<LayerImpl*>* clip_children = new std::set<LayerImpl*>(); 107 clip_children->insert(clip_child); 108 clip_children->insert(root); 109 110 root->AddChild(LayerImpl::Create(host_impl.active_tree(), 7)); 111 LayerImpl* child = root->children()[0]; 112 child->AddChild(LayerImpl::Create(host_impl.active_tree(), 8)); 113 LayerImpl* grand_child = child->children()[0]; 114 115 root->SetScrollClipLayer(root_clip->id()); 116 117 // Adding children is an internal operation and should not mark layers as 118 // changed. 119 EXPECT_FALSE(root->LayerPropertyChanged()); 120 EXPECT_FALSE(child->LayerPropertyChanged()); 121 EXPECT_FALSE(grand_child->LayerPropertyChanged()); 122 123 gfx::PointF arbitrary_point_f = gfx::PointF(0.125f, 0.25f); 124 gfx::Point3F arbitrary_point_3f = gfx::Point3F(0.125f, 0.25f, 0.f); 125 float arbitrary_number = 0.352f; 126 gfx::Size arbitrary_size = gfx::Size(111, 222); 127 gfx::Point arbitrary_point = gfx::Point(333, 444); 128 gfx::Vector2d arbitrary_vector2d = gfx::Vector2d(111, 222); 129 gfx::Rect arbitrary_rect = gfx::Rect(arbitrary_point, arbitrary_size); 130 gfx::RectF arbitrary_rect_f = 131 gfx::RectF(arbitrary_point_f, gfx::SizeF(1.234f, 5.678f)); 132 SkColor arbitrary_color = SkColorSetRGB(10, 20, 30); 133 gfx::Transform arbitrary_transform; 134 arbitrary_transform.Scale3d(0.1f, 0.2f, 0.3f); 135 FilterOperations arbitrary_filters; 136 arbitrary_filters.Append(FilterOperation::CreateOpacityFilter(0.5f)); 137 SkXfermode::Mode arbitrary_blend_mode = SkXfermode::kMultiply_Mode; 138 139 // These properties are internal, and should not be considered "change" when 140 // they are used. 141 EXECUTE_AND_VERIFY_NEEDS_PUSH_PROPERTIES_AND_SUBTREE_DID_NOT_CHANGE( 142 root->SetUpdateRect(arbitrary_rect_f)); 143 EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetBounds(arbitrary_size)); 144 145 // Changing these properties affects the entire subtree of layers. 146 EXECUTE_AND_VERIFY_SUBTREE_CHANGED( 147 root->SetTransformOrigin(arbitrary_point_3f)); 148 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetFilters(arbitrary_filters)); 149 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetFilters(FilterOperations())); 150 EXECUTE_AND_VERIFY_SUBTREE_CHANGED( 151 root->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 9))); 152 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetMasksToBounds(true)); 153 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetContentsOpaque(true)); 154 EXECUTE_AND_VERIFY_SUBTREE_CHANGED( 155 root->SetReplicaLayer(LayerImpl::Create(host_impl.active_tree(), 10))); 156 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetPosition(arbitrary_point_f)); 157 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetShouldFlattenTransform(false)); 158 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->Set3dSortingContextId(1)); 159 EXECUTE_AND_VERIFY_SUBTREE_CHANGED( 160 root->SetDoubleSided(false)); // constructor initializes it to "true". 161 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->ScrollBy(arbitrary_vector2d)); 162 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetScrollDelta(gfx::Vector2d())); 163 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetScrollOffset(arbitrary_vector2d)); 164 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetHideLayerAndSubtree(true)); 165 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetOpacity(arbitrary_number)); 166 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetBlendMode(arbitrary_blend_mode)); 167 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetTransform(arbitrary_transform)); 168 169 // Changing these properties only affects the layer itself. 170 EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetContentBounds(arbitrary_size)); 171 EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED( 172 root->SetContentsScale(arbitrary_number, arbitrary_number)); 173 EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetDrawsContent(true)); 174 EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED( 175 root->SetBackgroundColor(arbitrary_color)); 176 EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED( 177 root->SetBackgroundFilters(arbitrary_filters)); 178 179 // Special case: check that SetBounds changes behavior depending on 180 // masksToBounds. 181 root->SetMasksToBounds(false); 182 EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetBounds(gfx::Size(135, 246))); 183 root->SetMasksToBounds(true); 184 // Should be a different size than previous call, to ensure it marks tree 185 // changed. 186 EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetBounds(arbitrary_size)); 187 188 // Changing this property does not cause the layer to be marked as changed 189 // but does cause the layer to need to push properties. 190 EXECUTE_AND_VERIFY_NEEDS_PUSH_PROPERTIES_AND_SUBTREE_DID_NOT_CHANGE( 191 root->SetIsRootForIsolatedGroup(true)); 192 193 // Changing these properties should cause the layer to need to push properties 194 EXECUTE_AND_VERIFY_NEEDS_PUSH_PROPERTIES_AND_SUBTREE_DID_NOT_CHANGE( 195 root->SetScrollParent(scroll_parent.get())); 196 EXECUTE_AND_VERIFY_NEEDS_PUSH_PROPERTIES_AND_SUBTREE_DID_NOT_CHANGE( 197 root->SetScrollChildren(scroll_children)); 198 EXECUTE_AND_VERIFY_NEEDS_PUSH_PROPERTIES_AND_SUBTREE_DID_NOT_CHANGE( 199 root->SetClipParent(clip_parent.get())); 200 EXECUTE_AND_VERIFY_NEEDS_PUSH_PROPERTIES_AND_SUBTREE_DID_NOT_CHANGE( 201 root->SetClipChildren(clip_children)); 202 203 // After setting all these properties already, setting to the exact same 204 // values again should not cause any change. 205 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 206 root->SetTransformOrigin(arbitrary_point_3f)); 207 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetMasksToBounds(true)); 208 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 209 root->SetPosition(arbitrary_point_f)); 210 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 211 root->SetShouldFlattenTransform(false)); 212 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->Set3dSortingContextId(1)); 213 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 214 root->SetTransform(arbitrary_transform)); 215 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 216 root->SetDoubleSided(false)); // constructor initializes it to "true". 217 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 218 root->SetScrollDelta(gfx::Vector2d())); 219 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 220 root->SetScrollOffset(arbitrary_vector2d)); 221 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 222 root->SetContentBounds(arbitrary_size)); 223 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 224 root->SetContentsScale(arbitrary_number, arbitrary_number)); 225 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetContentsOpaque(true)); 226 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetOpacity(arbitrary_number)); 227 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 228 root->SetBlendMode(arbitrary_blend_mode)); 229 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 230 root->SetIsRootForIsolatedGroup(true)); 231 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetDrawsContent(true)); 232 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetBounds(arbitrary_size)); 233 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 234 root->SetScrollParent(scroll_parent.get())); 235 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 236 root->SetScrollChildren(scroll_children)); 237 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 238 root->SetClipParent(clip_parent.get())); 239 EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( 240 root->SetClipChildren(clip_children)); 241 } 242 243 TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) { 244 FakeImplProxy proxy; 245 TestSharedBitmapManager shared_bitmap_manager; 246 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager); 247 EXPECT_TRUE(host_impl.InitializeRenderer( 248 FakeOutputSurface::Create3d().PassAs<OutputSurface>())); 249 host_impl.active_tree()->SetRootLayer( 250 LayerImpl::Create(host_impl.active_tree(), 1)); 251 LayerImpl* root = host_impl.active_tree()->root_layer(); 252 scoped_ptr<LayerImpl> layer_ptr = 253 LayerImpl::Create(host_impl.active_tree(), 2); 254 LayerImpl* layer = layer_ptr.get(); 255 root->AddChild(layer_ptr.Pass()); 256 layer->SetScrollClipLayer(root->id()); 257 DCHECK(host_impl.CanDraw()); 258 259 gfx::PointF arbitrary_point_f = gfx::PointF(0.125f, 0.25f); 260 float arbitrary_number = 0.352f; 261 gfx::Size arbitrary_size = gfx::Size(111, 222); 262 gfx::Point arbitrary_point = gfx::Point(333, 444); 263 gfx::Vector2d arbitrary_vector2d = gfx::Vector2d(111, 222); 264 gfx::Size large_size = gfx::Size(1000, 1000); 265 gfx::Rect arbitrary_rect = gfx::Rect(arbitrary_point, arbitrary_size); 266 gfx::RectF arbitrary_rect_f = 267 gfx::RectF(arbitrary_point_f, gfx::SizeF(1.234f, 5.678f)); 268 SkColor arbitrary_color = SkColorSetRGB(10, 20, 30); 269 gfx::Transform arbitrary_transform; 270 arbitrary_transform.Scale3d(0.1f, 0.2f, 0.3f); 271 FilterOperations arbitrary_filters; 272 arbitrary_filters.Append(FilterOperation::CreateOpacityFilter(0.5f)); 273 SkXfermode::Mode arbitrary_blend_mode = SkXfermode::kMultiply_Mode; 274 275 // Related filter functions. 276 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetFilters(arbitrary_filters)); 277 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetFilters(arbitrary_filters)); 278 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetFilters(FilterOperations())); 279 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetFilters(arbitrary_filters)); 280 281 // Related scrolling functions. 282 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(large_size)); 283 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(large_size)); 284 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(arbitrary_vector2d)); 285 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(gfx::Vector2d())); 286 layer->SetScrollDelta(gfx::Vector2d(0, 0)); 287 host_impl.ForcePrepareToDraw(); 288 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 289 layer->SetScrollDelta(arbitrary_vector2d)); 290 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 291 layer->SetScrollDelta(arbitrary_vector2d)); 292 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 293 layer->SetScrollOffset(arbitrary_vector2d)); 294 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 295 layer->SetScrollOffset(arbitrary_vector2d)); 296 297 // Unrelated functions, always set to new values, always set needs update. 298 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 299 layer->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 4))); 300 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true)); 301 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true)); 302 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 303 layer->SetReplicaLayer(LayerImpl::Create(host_impl.active_tree(), 5))); 304 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetPosition(arbitrary_point_f)); 305 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetShouldFlattenTransform(false)); 306 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->Set3dSortingContextId(1)); 307 308 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 309 layer->SetDoubleSided(false)); // constructor initializes it to "true". 310 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentBounds(arbitrary_size)); 311 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 312 layer->SetContentsScale(arbitrary_number, arbitrary_number)); 313 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetDrawsContent(true)); 314 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 315 layer->SetBackgroundColor(arbitrary_color)); 316 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 317 layer->SetBackgroundFilters(arbitrary_filters)); 318 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetOpacity(arbitrary_number)); 319 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( 320 layer->SetBlendMode(arbitrary_blend_mode)); 321 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetTransform(arbitrary_transform)); 322 VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(arbitrary_size)); 323 324 // Unrelated functions, set to the same values, no needs update. 325 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 326 layer->SetIsRootForIsolatedGroup(true)); 327 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetFilters(arbitrary_filters)); 328 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true)); 329 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true)); 330 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetPosition(arbitrary_point_f)); 331 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->Set3dSortingContextId(1)); 332 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 333 layer->SetDoubleSided(false)); // constructor initializes it to "true". 334 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 335 layer->SetContentBounds(arbitrary_size)); 336 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 337 layer->SetContentsScale(arbitrary_number, arbitrary_number)); 338 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetDrawsContent(true)); 339 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 340 layer->SetBackgroundColor(arbitrary_color)); 341 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 342 layer->SetBackgroundFilters(arbitrary_filters)); 343 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetOpacity(arbitrary_number)); 344 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 345 layer->SetBlendMode(arbitrary_blend_mode)); 346 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 347 layer->SetIsRootForIsolatedGroup(true)); 348 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( 349 layer->SetTransform(arbitrary_transform)); 350 VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(arbitrary_size)); 351 } 352 353 TEST(LayerImplTest, SafeOpaqueBackgroundColor) { 354 FakeImplProxy proxy; 355 TestSharedBitmapManager shared_bitmap_manager; 356 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager); 357 EXPECT_TRUE(host_impl.InitializeRenderer( 358 FakeOutputSurface::Create3d().PassAs<OutputSurface>())); 359 scoped_ptr<LayerImpl> layer = LayerImpl::Create(host_impl.active_tree(), 1); 360 361 for (int contents_opaque = 0; contents_opaque < 2; ++contents_opaque) { 362 for (int layer_opaque = 0; layer_opaque < 2; ++layer_opaque) { 363 for (int host_opaque = 0; host_opaque < 2; ++host_opaque) { 364 layer->SetContentsOpaque(!!contents_opaque); 365 layer->SetBackgroundColor(layer_opaque ? SK_ColorRED 366 : SK_ColorTRANSPARENT); 367 host_impl.active_tree()->set_background_color( 368 host_opaque ? SK_ColorRED : SK_ColorTRANSPARENT); 369 370 SkColor safe_color = layer->SafeOpaqueBackgroundColor(); 371 if (contents_opaque) { 372 EXPECT_EQ(SkColorGetA(safe_color), 255u) 373 << "Flags: " << contents_opaque << ", " << layer_opaque << ", " 374 << host_opaque << "\n"; 375 } else { 376 EXPECT_NE(SkColorGetA(safe_color), 255u) 377 << "Flags: " << contents_opaque << ", " << layer_opaque << ", " 378 << host_opaque << "\n"; 379 } 380 } 381 } 382 } 383 } 384 385 TEST(LayerImplTest, TransformInvertibility) { 386 FakeImplProxy proxy; 387 TestSharedBitmapManager shared_bitmap_manager; 388 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager); 389 390 scoped_ptr<LayerImpl> layer = LayerImpl::Create(host_impl.active_tree(), 1); 391 EXPECT_TRUE(layer->transform().IsInvertible()); 392 EXPECT_TRUE(layer->transform_is_invertible()); 393 394 gfx::Transform transform; 395 transform.Scale3d( 396 SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0)); 397 layer->SetTransform(transform); 398 EXPECT_FALSE(layer->transform().IsInvertible()); 399 EXPECT_FALSE(layer->transform_is_invertible()); 400 401 transform.MakeIdentity(); 402 transform.ApplyPerspectiveDepth(SkDoubleToMScalar(100.0)); 403 transform.RotateAboutZAxis(75.0); 404 transform.RotateAboutXAxis(32.2); 405 transform.RotateAboutZAxis(-75.0); 406 transform.Translate3d(SkDoubleToMScalar(50.5), 407 SkDoubleToMScalar(42.42), 408 SkDoubleToMScalar(-100.25)); 409 410 layer->SetTransform(transform); 411 EXPECT_TRUE(layer->transform().IsInvertible()); 412 EXPECT_TRUE(layer->transform_is_invertible()); 413 } 414 415 class LayerImplScrollTest : public testing::Test { 416 public: 417 LayerImplScrollTest() 418 : host_impl_(&proxy_, &shared_bitmap_manager_), root_id_(7) { 419 host_impl_.active_tree()->SetRootLayer( 420 LayerImpl::Create(host_impl_.active_tree(), root_id_)); 421 host_impl_.active_tree()->root_layer()->AddChild( 422 LayerImpl::Create(host_impl_.active_tree(), root_id_ + 1)); 423 layer()->SetScrollClipLayer(root_id_); 424 // Set the max scroll offset by noting that the root layer has bounds (1,1), 425 // thus whatever bounds are set for the layer will be the max scroll 426 // offset plus 1 in each direction. 427 host_impl_.active_tree()->root_layer()->SetBounds(gfx::Size(1, 1)); 428 gfx::Vector2d max_scroll_offset(51, 81); 429 layer()->SetBounds(gfx::Size(max_scroll_offset.x(), max_scroll_offset.y())); 430 } 431 432 LayerImpl* layer() { 433 return host_impl_.active_tree()->root_layer()->children()[0]; 434 } 435 436 private: 437 FakeImplProxy proxy_; 438 TestSharedBitmapManager shared_bitmap_manager_; 439 FakeLayerTreeHostImpl host_impl_; 440 int root_id_; 441 }; 442 443 TEST_F(LayerImplScrollTest, ScrollByWithZeroOffset) { 444 // Test that LayerImpl::ScrollBy only affects ScrollDelta and total scroll 445 // offset is bounded by the range [0, max scroll offset]. 446 447 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->TotalScrollOffset()); 448 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->scroll_offset()); 449 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta()); 450 451 layer()->ScrollBy(gfx::Vector2dF(-100, 100)); 452 EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset()); 453 454 EXPECT_VECTOR_EQ(layer()->ScrollDelta(), layer()->TotalScrollOffset()); 455 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->scroll_offset()); 456 457 layer()->ScrollBy(gfx::Vector2dF(100, -100)); 458 EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 0), layer()->TotalScrollOffset()); 459 460 EXPECT_VECTOR_EQ(layer()->ScrollDelta(), layer()->TotalScrollOffset()); 461 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->scroll_offset()); 462 } 463 464 TEST_F(LayerImplScrollTest, ScrollByWithNonZeroOffset) { 465 gfx::Vector2d scroll_offset(10, 5); 466 layer()->SetScrollOffset(scroll_offset); 467 468 EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset()); 469 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 470 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta()); 471 472 layer()->ScrollBy(gfx::Vector2dF(-100, 100)); 473 EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset()); 474 475 EXPECT_VECTOR_EQ(layer()->ScrollDelta() + scroll_offset, 476 layer()->TotalScrollOffset()); 477 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 478 479 layer()->ScrollBy(gfx::Vector2dF(100, -100)); 480 EXPECT_VECTOR_EQ(gfx::Vector2dF(50, 0), layer()->TotalScrollOffset()); 481 482 EXPECT_VECTOR_EQ(layer()->ScrollDelta() + scroll_offset, 483 layer()->TotalScrollOffset()); 484 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 485 } 486 487 class ScrollDelegateIgnore : public LayerImpl::ScrollOffsetDelegate { 488 public: 489 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_value) OVERRIDE {} 490 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE { 491 return fixed_offset_; 492 } 493 virtual bool IsExternalFlingActive() const OVERRIDE { return false; } 494 495 void set_fixed_offset(const gfx::Vector2dF& fixed_offset) { 496 fixed_offset_ = fixed_offset; 497 } 498 499 private: 500 gfx::Vector2dF fixed_offset_; 501 }; 502 503 TEST_F(LayerImplScrollTest, ScrollByWithIgnoringDelegate) { 504 gfx::Vector2d scroll_offset(10, 5); 505 layer()->SetScrollOffset(scroll_offset); 506 507 EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset()); 508 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 509 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta()); 510 511 ScrollDelegateIgnore delegate; 512 gfx::Vector2dF fixed_offset(32, 12); 513 delegate.set_fixed_offset(fixed_offset); 514 layer()->SetScrollOffsetDelegate(&delegate); 515 516 EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset()); 517 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 518 519 layer()->ScrollBy(gfx::Vector2dF(-100, 100)); 520 521 EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset()); 522 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 523 524 layer()->SetScrollOffsetDelegate(NULL); 525 526 EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset()); 527 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 528 529 gfx::Vector2dF scroll_delta(1, 1); 530 layer()->ScrollBy(scroll_delta); 531 532 EXPECT_VECTOR_EQ(fixed_offset + scroll_delta, layer()->TotalScrollOffset()); 533 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 534 } 535 536 class ScrollDelegateAccept : public LayerImpl::ScrollOffsetDelegate { 537 public: 538 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_value) OVERRIDE { 539 current_offset_ = new_value; 540 } 541 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE { 542 return current_offset_; 543 } 544 virtual bool IsExternalFlingActive() const OVERRIDE { return false; } 545 546 private: 547 gfx::Vector2dF current_offset_; 548 }; 549 550 TEST_F(LayerImplScrollTest, ScrollByWithAcceptingDelegate) { 551 gfx::Vector2d scroll_offset(10, 5); 552 layer()->SetScrollOffset(scroll_offset); 553 554 EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset()); 555 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 556 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta()); 557 558 ScrollDelegateAccept delegate; 559 layer()->SetScrollOffsetDelegate(&delegate); 560 561 EXPECT_VECTOR_EQ(scroll_offset, layer()->TotalScrollOffset()); 562 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 563 EXPECT_VECTOR_EQ(gfx::Vector2dF(), layer()->ScrollDelta()); 564 565 layer()->ScrollBy(gfx::Vector2dF(-100, 100)); 566 567 EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset()); 568 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 569 570 layer()->SetScrollOffsetDelegate(NULL); 571 572 EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 80), layer()->TotalScrollOffset()); 573 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 574 575 gfx::Vector2dF scroll_delta(1, 1); 576 layer()->ScrollBy(scroll_delta); 577 578 EXPECT_VECTOR_EQ(gfx::Vector2dF(1, 80), layer()->TotalScrollOffset()); 579 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 580 } 581 582 TEST_F(LayerImplScrollTest, ApplySentScrollsNoDelegate) { 583 gfx::Vector2d scroll_offset(10, 5); 584 gfx::Vector2dF scroll_delta(20.5f, 8.5f); 585 gfx::Vector2d sent_scroll_delta(12, -3); 586 587 layer()->SetScrollOffset(scroll_offset); 588 layer()->ScrollBy(scroll_delta); 589 layer()->SetSentScrollDelta(sent_scroll_delta); 590 591 EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset()); 592 EXPECT_VECTOR_EQ(scroll_delta, layer()->ScrollDelta()); 593 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 594 EXPECT_VECTOR_EQ(sent_scroll_delta, layer()->sent_scroll_delta()); 595 596 layer()->ApplySentScrollDeltasFromAbortedCommit(); 597 598 EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset()); 599 EXPECT_VECTOR_EQ(scroll_delta - sent_scroll_delta, layer()->ScrollDelta()); 600 EXPECT_VECTOR_EQ(scroll_offset + sent_scroll_delta, layer()->scroll_offset()); 601 EXPECT_VECTOR_EQ(gfx::Vector2d(), layer()->sent_scroll_delta()); 602 } 603 604 TEST_F(LayerImplScrollTest, ApplySentScrollsWithIgnoringDelegate) { 605 gfx::Vector2d scroll_offset(10, 5); 606 gfx::Vector2d sent_scroll_delta(12, -3); 607 gfx::Vector2dF fixed_offset(32, 12); 608 609 layer()->SetScrollOffset(scroll_offset); 610 ScrollDelegateIgnore delegate; 611 delegate.set_fixed_offset(fixed_offset); 612 layer()->SetScrollOffsetDelegate(&delegate); 613 layer()->SetSentScrollDelta(sent_scroll_delta); 614 615 EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset()); 616 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 617 EXPECT_VECTOR_EQ(sent_scroll_delta, layer()->sent_scroll_delta()); 618 619 layer()->ApplySentScrollDeltasFromAbortedCommit(); 620 621 EXPECT_VECTOR_EQ(fixed_offset, layer()->TotalScrollOffset()); 622 EXPECT_VECTOR_EQ(scroll_offset + sent_scroll_delta, layer()->scroll_offset()); 623 EXPECT_VECTOR_EQ(gfx::Vector2d(), layer()->sent_scroll_delta()); 624 } 625 626 TEST_F(LayerImplScrollTest, ApplySentScrollsWithAcceptingDelegate) { 627 gfx::Vector2d scroll_offset(10, 5); 628 gfx::Vector2d sent_scroll_delta(12, -3); 629 gfx::Vector2dF scroll_delta(20.5f, 8.5f); 630 631 layer()->SetScrollOffset(scroll_offset); 632 ScrollDelegateAccept delegate; 633 layer()->SetScrollOffsetDelegate(&delegate); 634 layer()->ScrollBy(scroll_delta); 635 layer()->SetSentScrollDelta(sent_scroll_delta); 636 637 EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset()); 638 EXPECT_VECTOR_EQ(scroll_offset, layer()->scroll_offset()); 639 EXPECT_VECTOR_EQ(sent_scroll_delta, layer()->sent_scroll_delta()); 640 641 layer()->ApplySentScrollDeltasFromAbortedCommit(); 642 643 EXPECT_VECTOR_EQ(scroll_offset + scroll_delta, layer()->TotalScrollOffset()); 644 EXPECT_VECTOR_EQ(scroll_offset + sent_scroll_delta, layer()->scroll_offset()); 645 EXPECT_VECTOR_EQ(gfx::Vector2d(), layer()->sent_scroll_delta()); 646 } 647 648 // The user-scrollability breaks for zoomed-in pages. So disable this. 649 // http://crbug.com/322223 650 TEST_F(LayerImplScrollTest, DISABLED_ScrollUserUnscrollableLayer) { 651 gfx::Vector2d scroll_offset(10, 5); 652 gfx::Vector2dF scroll_delta(20.5f, 8.5f); 653 654 layer()->set_user_scrollable_vertical(false); 655 layer()->SetScrollOffset(scroll_offset); 656 gfx::Vector2dF unscrolled = layer()->ScrollBy(scroll_delta); 657 658 EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 8.5f), unscrolled); 659 EXPECT_VECTOR_EQ(gfx::Vector2dF(30.5f, 5), layer()->TotalScrollOffset()); 660 } 661 662 } // namespace 663 } // namespace cc 664