Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: cc/trees/layer_tree_host_impl_unittest.cc

Issue 2729253003: Make LayerTreeImpl::SetCurrentlyScrollingNode use element ids over layer ids (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | cc/trees/layer_tree_host_unittest_scroll.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/layer_tree_host_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 319
320 std::unique_ptr<LayerImpl> inner_clip = 320 std::unique_ptr<LayerImpl> inner_clip =
321 LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId); 321 LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId);
322 inner_clip->SetBounds( 322 inner_clip->SetBounds(
323 gfx::Size(content_size.width() / 2, content_size.height() / 2)); 323 gfx::Size(content_size.width() / 2, content_size.height() / 2));
324 324
325 std::unique_ptr<LayerImpl> page_scale = 325 std::unique_ptr<LayerImpl> page_scale =
326 LayerImpl::Create(layer_tree_impl, kPageScaleLayerId); 326 LayerImpl::Create(layer_tree_impl, kPageScaleLayerId);
327 327
328 inner_scroll->SetScrollClipLayer(inner_clip->id()); 328 inner_scroll->SetScrollClipLayer(inner_clip->id());
329 inner_scroll->SetElementId(
330 LayerIdToElementIdForTesting(inner_scroll->id()));
329 inner_scroll->SetBounds(content_size); 331 inner_scroll->SetBounds(content_size);
330 inner_scroll->SetPosition(gfx::PointF()); 332 inner_scroll->SetPosition(gfx::PointF());
331 333
332 std::unique_ptr<LayerImpl> outer_clip = 334 std::unique_ptr<LayerImpl> outer_clip =
333 LayerImpl::Create(layer_tree_impl, kOuterViewportClipLayerId); 335 LayerImpl::Create(layer_tree_impl, kOuterViewportClipLayerId);
334 outer_clip->SetBounds(content_size); 336 outer_clip->SetBounds(content_size);
335 outer_clip->test_properties()->is_container_for_fixed_position_layers = 337 outer_clip->test_properties()->is_container_for_fixed_position_layers =
336 true; 338 true;
337 339
338 std::unique_ptr<LayerImpl> outer_scroll = 340 std::unique_ptr<LayerImpl> outer_scroll =
339 LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId); 341 LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId);
340 outer_scroll->SetScrollClipLayer(outer_clip->id()); 342 outer_scroll->SetScrollClipLayer(outer_clip->id());
343 outer_scroll->SetElementId(
344 LayerIdToElementIdForTesting(outer_scroll->id()));
341 outer_scroll->layer_tree_impl() 345 outer_scroll->layer_tree_impl()
342 ->property_trees() 346 ->property_trees()
343 ->scroll_tree.UpdateScrollOffsetBaseForTesting(outer_scroll->id(), 347 ->scroll_tree.UpdateScrollOffsetBaseForTesting(outer_scroll->id(),
344 gfx::ScrollOffset()); 348 gfx::ScrollOffset());
345 outer_scroll->SetBounds(content_size); 349 outer_scroll->SetBounds(content_size);
346 outer_scroll->SetPosition(gfx::PointF()); 350 outer_scroll->SetPosition(gfx::PointF());
347 351
348 std::unique_ptr<LayerImpl> contents = 352 std::unique_ptr<LayerImpl> contents =
349 LayerImpl::Create(layer_tree_impl, kContentLayerId); 353 LayerImpl::Create(layer_tree_impl, kContentLayerId);
350 contents->SetDrawsContent(true); 354 contents->SetDrawsContent(true);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 host_impl_->OuterViewportScrollLayer()->test_properties()->parent; 398 host_impl_->OuterViewportScrollLayer()->test_properties()->parent;
395 outer_clip->SetBounds(viewport_size); 399 outer_clip->SetBounds(viewport_size);
396 400
397 LayerImpl* inner_clip_layer = host_impl_->InnerViewportScrollLayer() 401 LayerImpl* inner_clip_layer = host_impl_->InnerViewportScrollLayer()
398 ->test_properties() 402 ->test_properties()
399 ->parent->test_properties() 403 ->parent->test_properties()
400 ->parent; 404 ->parent;
401 inner_clip_layer->SetBounds(viewport_size); 405 inner_clip_layer->SetBounds(viewport_size);
402 host_impl_->InnerViewportScrollLayer()->SetBounds(viewport_size); 406 host_impl_->InnerViewportScrollLayer()->SetBounds(viewport_size);
403 407
404 // Needs to happen before building property trees as the latter propagates
405 // these element ids to property tree nodes.
406 host_impl_->active_tree()->SetElementIdsForTesting();
pdr. 2017/03/03 21:52:41 In writing this patch I did a version using SetEle
ajuma 2017/03/03 23:39:21 Agreed, setting them only where we'd normally expe
407 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 408 host_impl_->active_tree()->BuildPropertyTreesForTesting();
408 409
409 host_impl_->SetViewportSize(viewport_size); 410 host_impl_->SetViewportSize(viewport_size);
410 host_impl_->active_tree()->DidBecomeActive(); 411 host_impl_->active_tree()->DidBecomeActive();
411 412
412 return content_layer; 413 return content_layer;
413 } 414 }
414 415
415 std::unique_ptr<LayerImpl> CreateScrollableLayer(int id, 416 std::unique_ptr<LayerImpl> CreateScrollableLayer(int id,
416 const gfx::Size& size, 417 const gfx::Size& size,
417 LayerImpl* clip_layer) { 418 LayerImpl* clip_layer) {
418 DCHECK(clip_layer); 419 DCHECK(clip_layer);
419 DCHECK(id != clip_layer->id()); 420 DCHECK(id != clip_layer->id());
420 std::unique_ptr<LayerImpl> layer = 421 std::unique_ptr<LayerImpl> layer =
421 LayerImpl::Create(host_impl_->active_tree(), id); 422 LayerImpl::Create(host_impl_->active_tree(), id);
422 layer->SetScrollClipLayer(clip_layer->id()); 423 layer->SetScrollClipLayer(clip_layer->id());
424 layer->SetElementId(LayerIdToElementIdForTesting(layer->id()));
423 layer->SetDrawsContent(true); 425 layer->SetDrawsContent(true);
424 layer->SetBounds(size); 426 layer->SetBounds(size);
425 clip_layer->SetBounds(gfx::Size(size.width() / 2, size.height() / 2)); 427 clip_layer->SetBounds(gfx::Size(size.width() / 2, size.height() / 2));
426 return layer; 428 return layer;
427 } 429 }
428 430
429 std::unique_ptr<ScrollState> BeginState(const gfx::Point& point) { 431 std::unique_ptr<ScrollState> BeginState(const gfx::Point& point) {
430 ScrollStateData scroll_state_data; 432 ScrollStateData scroll_state_data;
431 scroll_state_data.is_beginning = true; 433 scroll_state_data.is_beginning = true;
432 scroll_state_data.position_x = point.x(); 434 scroll_state_data.position_x = point.x();
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 656
655 auto root_clip_owned = LayerImpl::Create(host_impl_->active_tree(), 2); 657 auto root_clip_owned = LayerImpl::Create(host_impl_->active_tree(), 2);
656 auto* root_clip = root_clip_owned.get(); 658 auto* root_clip = root_clip_owned.get();
657 auto root_owned = LayerImpl::Create(host_impl_->active_tree(), 1); 659 auto root_owned = LayerImpl::Create(host_impl_->active_tree(), 1);
658 auto* root = root_owned.get(); 660 auto* root = root_owned.get();
659 661
660 root_clip->SetBounds(gfx::Size(10, 10)); 662 root_clip->SetBounds(gfx::Size(10, 10));
661 root_clip->test_properties()->AddChild(std::move(root_owned)); 663 root_clip->test_properties()->AddChild(std::move(root_owned));
662 root->SetBounds(gfx::Size(110, 110)); 664 root->SetBounds(gfx::Size(110, 110));
663 root->SetScrollClipLayer(root_clip->id()); 665 root->SetScrollClipLayer(root_clip->id());
666 root->SetElementId(LayerIdToElementIdForTesting(root->id()));
664 root->layer_tree_impl() 667 root->layer_tree_impl()
665 ->property_trees() 668 ->property_trees()
666 ->scroll_tree.UpdateScrollOffsetBaseForTesting(root->id(), scroll_offset); 669 ->scroll_tree.UpdateScrollOffsetBaseForTesting(root->id(), scroll_offset);
667 host_impl_->active_tree()->SetRootLayerForTesting(std::move(root_clip_owned)); 670 host_impl_->active_tree()->SetRootLayerForTesting(std::move(root_clip_owned));
668 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 671 host_impl_->active_tree()->BuildPropertyTreesForTesting();
669 672
670 std::unique_ptr<ScrollAndScaleSet> scroll_info; 673 std::unique_ptr<ScrollAndScaleSet> scroll_info;
671 674
672 root->ScrollBy(scroll_delta); 675 root->ScrollBy(scroll_delta);
673 scroll_info = host_impl_->ProcessScrollDeltas(); 676 scroll_info = host_impl_->ProcessScrollDeltas();
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 root->SetBounds(content_size); 962 root->SetBounds(content_size);
960 root->SetPosition(gfx::PointF()); 963 root->SetPosition(gfx::PointF());
961 964
962 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 2); 965 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 2);
963 clip->SetBounds(content_size); 966 clip->SetBounds(content_size);
964 clip->SetPosition(gfx::PointF()); 967 clip->SetPosition(gfx::PointF());
965 968
966 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 3); 969 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 3);
967 scroll->SetBounds(scroll_content_size); 970 scroll->SetBounds(scroll_content_size);
968 scroll->SetScrollClipLayer(clip->id()); 971 scroll->SetScrollClipLayer(clip->id());
972 scroll->SetElementId(LayerIdToElementIdForTesting(scroll->id()));
969 scroll->SetDrawsContent(true); 973 scroll->SetDrawsContent(true);
970 974
971 std::unique_ptr<SolidColorScrollbarLayerImpl> scrollbar = 975 std::unique_ptr<SolidColorScrollbarLayerImpl> scrollbar =
972 SolidColorScrollbarLayerImpl::Create(layer_tree_impl, 4, VERTICAL, 10, 0, 976 SolidColorScrollbarLayerImpl::Create(layer_tree_impl, 4, VERTICAL, 10, 0,
973 false, true); 977 false, true);
974 scrollbar->SetBounds(scrollbar_size); 978 scrollbar->SetBounds(scrollbar_size);
975 scrollbar->SetPosition(gfx::PointF(345, 0)); 979 scrollbar->SetPosition(gfx::PointF(345, 0));
976 scrollbar->SetScrollLayerId(scroll->id()); 980 scrollbar->SetScrollLayerId(scroll->id());
977 scrollbar->SetDrawsContent(true); 981 scrollbar->SetDrawsContent(true);
978 scrollbar->test_properties()->opacity = 1.f; 982 scrollbar->test_properties()->opacity = 1.f;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 root->SetBounds(content_size); 1034 root->SetBounds(content_size);
1031 root->SetPosition(gfx::PointF()); 1035 root->SetPosition(gfx::PointF());
1032 1036
1033 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 2); 1037 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 2);
1034 clip->SetBounds(content_size); 1038 clip->SetBounds(content_size);
1035 clip->SetPosition(gfx::PointF()); 1039 clip->SetPosition(gfx::PointF());
1036 1040
1037 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 3); 1041 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 3);
1038 scroll->SetBounds(scroll_content_size); 1042 scroll->SetBounds(scroll_content_size);
1039 scroll->SetScrollClipLayer(clip->id()); 1043 scroll->SetScrollClipLayer(clip->id());
1044 scroll->SetElementId(LayerIdToElementIdForTesting(scroll->id()));
1040 scroll->SetDrawsContent(true); 1045 scroll->SetDrawsContent(true);
1041 1046
1042 std::unique_ptr<SolidColorScrollbarLayerImpl> drawn_scrollbar = 1047 std::unique_ptr<SolidColorScrollbarLayerImpl> drawn_scrollbar =
1043 SolidColorScrollbarLayerImpl::Create(layer_tree_impl, 4, VERTICAL, 10, 0, 1048 SolidColorScrollbarLayerImpl::Create(layer_tree_impl, 4, VERTICAL, 10, 0,
1044 false, true); 1049 false, true);
1045 drawn_scrollbar->SetBounds(scrollbar_size); 1050 drawn_scrollbar->SetBounds(scrollbar_size);
1046 drawn_scrollbar->SetPosition(gfx::PointF(345, 0)); 1051 drawn_scrollbar->SetPosition(gfx::PointF(345, 0));
1047 drawn_scrollbar->SetScrollLayerId(scroll->id()); 1052 drawn_scrollbar->SetScrollLayerId(scroll->id());
1048 drawn_scrollbar->SetDrawsContent(true); 1053 drawn_scrollbar->SetDrawsContent(true);
1049 drawn_scrollbar->test_properties()->opacity = 1.f; 1054 drawn_scrollbar->test_properties()->opacity = 1.f;
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1274 TEST_F(LayerTreeHostImplTest, ScrollWithUserUnscrollableLayers) { 1279 TEST_F(LayerTreeHostImplTest, ScrollWithUserUnscrollableLayers) {
1275 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(200, 200)); 1280 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(200, 200));
1276 host_impl_->SetViewportSize(gfx::Size(100, 100)); 1281 host_impl_->SetViewportSize(gfx::Size(100, 100));
1277 1282
1278 gfx::Size overflow_size(400, 400); 1283 gfx::Size overflow_size(400, 400);
1279 ASSERT_EQ(1u, scroll_layer->test_properties()->children.size()); 1284 ASSERT_EQ(1u, scroll_layer->test_properties()->children.size());
1280 LayerImpl* overflow = scroll_layer->test_properties()->children[0]; 1285 LayerImpl* overflow = scroll_layer->test_properties()->children[0];
1281 overflow->SetBounds(overflow_size); 1286 overflow->SetBounds(overflow_size);
1282 overflow->SetScrollClipLayer( 1287 overflow->SetScrollClipLayer(
1283 scroll_layer->test_properties()->parent->test_properties()->parent->id()); 1288 scroll_layer->test_properties()->parent->test_properties()->parent->id());
1289 overflow->SetElementId(LayerIdToElementIdForTesting(overflow->id()));
1284 overflow->layer_tree_impl() 1290 overflow->layer_tree_impl()
1285 ->property_trees() 1291 ->property_trees()
1286 ->scroll_tree.UpdateScrollOffsetBaseForTesting(overflow->id(), 1292 ->scroll_tree.UpdateScrollOffsetBaseForTesting(overflow->id(),
1287 gfx::ScrollOffset()); 1293 gfx::ScrollOffset());
1288 overflow->SetPosition(gfx::PointF()); 1294 overflow->SetPosition(gfx::PointF());
1289 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 1295 host_impl_->active_tree()->BuildPropertyTreesForTesting();
1290 1296
1291 DrawFrame(); 1297 DrawFrame();
1292 gfx::Point scroll_position(10, 10); 1298 gfx::Point scroll_position(10, 10);
1293 1299
(...skipping 1891 matching lines...) Expand 10 before | Expand all | Expand 10 after
3185 gfx::ScrollOffset(10, 10)); 3191 gfx::ScrollOffset(10, 10));
3186 EXPECT_FALSE(animation_task_.Equals(base::Closure())); 3192 EXPECT_FALSE(animation_task_.Equals(base::Closure()));
3187 animation_task_ = base::Closure(); 3193 animation_task_ = base::Closure();
3188 host_impl_->active_tree()->InnerViewportScrollLayer()->SetCurrentScrollOffset( 3194 host_impl_->active_tree()->InnerViewportScrollLayer()->SetCurrentScrollOffset(
3189 gfx::ScrollOffset(10, 10)); 3195 gfx::ScrollOffset(10, 10));
3190 EXPECT_FALSE(animation_task_.Equals(base::Closure())); 3196 EXPECT_FALSE(animation_task_.Equals(base::Closure()));
3191 animation_task_ = base::Closure(); 3197 animation_task_ = base::Closure();
3192 3198
3193 // Check scrollbar registration on a sublayer. 3199 // Check scrollbar registration on a sublayer.
3194 child->SetScrollClipLayer(child_clip->id()); 3200 child->SetScrollClipLayer(child_clip->id());
3201 child->SetElementId(LayerIdToElementIdForTesting(child->id()));
3195 child_clip->test_properties()->AddChild(std::move(child)); 3202 child_clip->test_properties()->AddChild(std::move(child));
3196 root_scroll->test_properties()->AddChild(std::move(child_clip)); 3203 root_scroll->test_properties()->AddChild(std::move(child_clip));
3197 EXPECT_EQ(0ul, host_impl_->ScrollbarsFor(child_scroll_id).size()); 3204 EXPECT_EQ(0ul, host_impl_->ScrollbarsFor(child_scroll_id).size());
3198 EXPECT_EQ(nullptr, 3205 EXPECT_EQ(nullptr,
3199 host_impl_->ScrollbarAnimationControllerForId(child_scroll_id)); 3206 host_impl_->ScrollbarAnimationControllerForId(child_scroll_id));
3200 vert_2_scrollbar->SetScrollLayerId(child_scroll_id); 3207 vert_2_scrollbar->SetScrollLayerId(child_scroll_id);
3201 EXPECT_EQ(1ul, host_impl_->ScrollbarsFor(child_scroll_id).size()); 3208 EXPECT_EQ(1ul, host_impl_->ScrollbarsFor(child_scroll_id).size());
3202 EXPECT_TRUE(host_impl_->ScrollbarAnimationControllerForId(child_scroll_id)); 3209 EXPECT_TRUE(host_impl_->ScrollbarAnimationControllerForId(child_scroll_id));
3203 horiz_2_scrollbar->SetScrollLayerId(child_scroll_id); 3210 horiz_2_scrollbar->SetScrollLayerId(child_scroll_id);
3204 EXPECT_EQ(2ul, host_impl_->ScrollbarsFor(child_scroll_id).size()); 3211 EXPECT_EQ(2ul, host_impl_->ScrollbarsFor(child_scroll_id).size());
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after
4024 4031
4025 std::unique_ptr<LayerImpl> root = LayerImpl::Create(tree_impl, 1); 4032 std::unique_ptr<LayerImpl> root = LayerImpl::Create(tree_impl, 1);
4026 std::unique_ptr<LayerImpl> root_clip = LayerImpl::Create(tree_impl, 2); 4033 std::unique_ptr<LayerImpl> root_clip = LayerImpl::Create(tree_impl, 2);
4027 std::unique_ptr<LayerImpl> page_scale = LayerImpl::Create(tree_impl, 3); 4034 std::unique_ptr<LayerImpl> page_scale = LayerImpl::Create(tree_impl, 3);
4028 4035
4029 std::unique_ptr<LayerImpl> outer_scroll = LayerImpl::Create(tree_impl, 4); 4036 std::unique_ptr<LayerImpl> outer_scroll = LayerImpl::Create(tree_impl, 4);
4030 std::unique_ptr<LayerImpl> outer_clip = LayerImpl::Create(tree_impl, 5); 4037 std::unique_ptr<LayerImpl> outer_clip = LayerImpl::Create(tree_impl, 5);
4031 4038
4032 root_clip->SetBounds(inner_viewport_size); 4039 root_clip->SetBounds(inner_viewport_size);
4033 root->SetScrollClipLayer(root_clip->id()); 4040 root->SetScrollClipLayer(root_clip->id());
4041 root->SetElementId(LayerIdToElementIdForTesting(root->id()));
4034 root->SetBounds(outer_viewport_size); 4042 root->SetBounds(outer_viewport_size);
4035 root->SetPosition(gfx::PointF()); 4043 root->SetPosition(gfx::PointF());
4036 root->SetDrawsContent(false); 4044 root->SetDrawsContent(false);
4037 root_clip->test_properties()->force_render_surface = true; 4045 root_clip->test_properties()->force_render_surface = true;
4038 root->test_properties()->is_container_for_fixed_position_layers = true; 4046 root->test_properties()->is_container_for_fixed_position_layers = true;
4039 outer_clip->SetBounds(outer_viewport_size); 4047 outer_clip->SetBounds(outer_viewport_size);
4040 outer_scroll->SetScrollClipLayer(outer_clip->id()); 4048 outer_scroll->SetScrollClipLayer(outer_clip->id());
4049 outer_scroll->SetElementId(
4050 LayerIdToElementIdForTesting(outer_scroll->id()));
4041 outer_scroll->SetBounds(scroll_layer_size); 4051 outer_scroll->SetBounds(scroll_layer_size);
4042 outer_scroll->SetPosition(gfx::PointF()); 4052 outer_scroll->SetPosition(gfx::PointF());
4043 outer_scroll->SetDrawsContent(false); 4053 outer_scroll->SetDrawsContent(false);
4044 outer_scroll->test_properties()->is_container_for_fixed_position_layers = 4054 outer_scroll->test_properties()->is_container_for_fixed_position_layers =
4045 true; 4055 true;
4046 4056
4047 int inner_viewport_scroll_layer_id = root->id(); 4057 int inner_viewport_scroll_layer_id = root->id();
4048 int outer_viewport_scroll_layer_id = outer_scroll->id(); 4058 int outer_viewport_scroll_layer_id = outer_scroll->id();
4049 int page_scale_layer_id = page_scale->id(); 4059 int page_scale_layer_id = page_scale->id();
4050 4060
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
4384 host_impl_->active_tree()->OuterViewportScrollLayer(); 4394 host_impl_->active_tree()->OuterViewportScrollLayer();
4385 int id = outer_viewport_scroll_layer->id(); 4395 int id = outer_viewport_scroll_layer->id();
4386 4396
4387 std::unique_ptr<LayerImpl> child = 4397 std::unique_ptr<LayerImpl> child =
4388 LayerImpl::Create(host_impl_->active_tree(), id + 2); 4398 LayerImpl::Create(host_impl_->active_tree(), id + 2);
4389 std::unique_ptr<LayerImpl> child_clip = 4399 std::unique_ptr<LayerImpl> child_clip =
4390 LayerImpl::Create(host_impl_->active_tree(), id + 3); 4400 LayerImpl::Create(host_impl_->active_tree(), id + 3);
4391 4401
4392 child_clip->SetBounds(sub_content_layer_size); 4402 child_clip->SetBounds(sub_content_layer_size);
4393 child->SetScrollClipLayer(child_clip->id()); 4403 child->SetScrollClipLayer(child_clip->id());
4404 child->SetElementId(LayerIdToElementIdForTesting(child->id()));
4394 child->SetBounds(sub_content_size); 4405 child->SetBounds(sub_content_size);
4395 child->SetPosition(gfx::PointF()); 4406 child->SetPosition(gfx::PointF());
4396 child->SetDrawsContent(true); 4407 child->SetDrawsContent(true);
4397 child->test_properties()->is_container_for_fixed_position_layers = true; 4408 child->test_properties()->is_container_for_fixed_position_layers = true;
4398 4409
4399 // scroll child to limit 4410 // scroll child to limit
4400 SetScrollOffsetDelta(child.get(), gfx::Vector2dF(0, 100.f)); 4411 SetScrollOffsetDelta(child.get(), gfx::Vector2dF(0, 100.f));
4401 child_clip->test_properties()->AddChild(std::move(child)); 4412 child_clip->test_properties()->AddChild(std::move(child));
4402 outer_viewport_scroll_layer->test_properties()->AddChild( 4413 outer_viewport_scroll_layer->test_properties()->AddChild(
4403 std::move(child_clip)); 4414 std::move(child_clip));
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
4930 content_layer->SetDrawsContent(true); 4941 content_layer->SetDrawsContent(true);
4931 content_layer->SetPosition(gfx::PointF()); 4942 content_layer->SetPosition(gfx::PointF());
4932 content_layer->SetBounds(contents_size); 4943 content_layer->SetBounds(contents_size);
4933 4944
4934 LayerImpl* scroll_clip_layer = 4945 LayerImpl* scroll_clip_layer =
4935 CreateBasicVirtualViewportLayers(surface_size, surface_size); 4946 CreateBasicVirtualViewportLayers(surface_size, surface_size);
4936 4947
4937 std::unique_ptr<LayerImpl> scroll_layer = 4948 std::unique_ptr<LayerImpl> scroll_layer =
4938 LayerImpl::Create(host_impl_->active_tree(), 12); 4949 LayerImpl::Create(host_impl_->active_tree(), 12);
4939 scroll_layer->SetScrollClipLayer(scroll_clip_layer->id()); 4950 scroll_layer->SetScrollClipLayer(scroll_clip_layer->id());
4951 scroll_layer->SetElementId(LayerIdToElementIdForTesting(scroll_layer->id()));
4940 scroll_layer->SetBounds(contents_size); 4952 scroll_layer->SetBounds(contents_size);
4941 scroll_layer->SetPosition(gfx::PointF()); 4953 scroll_layer->SetPosition(gfx::PointF());
4942 scroll_layer->test_properties()->AddChild(std::move(content_layer)); 4954 scroll_layer->test_properties()->AddChild(std::move(content_layer));
4943 scroll_clip_layer->test_properties()->AddChild(std::move(scroll_layer)); 4955 scroll_clip_layer->test_properties()->AddChild(std::move(scroll_layer));
4944 4956
4945 scroll_clip_layer->test_properties()->force_render_surface = true; 4957 scroll_clip_layer->test_properties()->force_render_surface = true;
4946 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 4958 host_impl_->active_tree()->BuildPropertyTreesForTesting();
4947 4959
4948 host_impl_->SetViewportSize(surface_size); 4960 host_impl_->SetViewportSize(surface_size);
4949 DrawFrame(); 4961 DrawFrame();
(...skipping 1563 matching lines...) Expand 10 before | Expand all | Expand 10 after
6513 // passing through the outer viewport still scroll correctly and affect 6525 // passing through the outer viewport still scroll correctly and affect
6514 // browser controls. 6526 // browser controls.
6515 { 6527 {
6516 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10); 6528 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10);
6517 clip->SetBounds(viewport_size); 6529 clip->SetBounds(viewport_size);
6518 clip->SetPosition(gfx::PointF()); 6530 clip->SetPosition(gfx::PointF());
6519 6531
6520 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11); 6532 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11);
6521 scroll->SetBounds(gfx::Size(400, 400)); 6533 scroll->SetBounds(gfx::Size(400, 400));
6522 scroll->SetScrollClipLayer(clip->id()); 6534 scroll->SetScrollClipLayer(clip->id());
6535 scroll->SetElementId(LayerIdToElementIdForTesting(scroll->id()));
6523 scroll->SetDrawsContent(true); 6536 scroll->SetDrawsContent(true);
6524 6537
6525 scroll_layer = scroll.get(); 6538 scroll_layer = scroll.get();
6526 6539
6527 clip->test_properties()->AddChild(std::move(scroll)); 6540 clip->test_properties()->AddChild(std::move(scroll));
6528 inner_scroll_layer->test_properties()->AddChild(std::move(clip)); 6541 inner_scroll_layer->test_properties()->AddChild(std::move(clip));
6529 6542
6530 // Move the outer viewport layer away so that scrolls won't target it. 6543 // Move the outer viewport layer away so that scrolls won't target it.
6531 host_impl_->active_tree()->OuterViewportContainerLayer()->SetPosition( 6544 host_impl_->active_tree()->OuterViewportContainerLayer()->SetPosition(
6532 gfx::PointF(400, 400)); 6545 gfx::PointF(400, 400));
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
6603 // with another scrolling div inside it. Set the outer "div" to be the outer 6616 // with another scrolling div inside it. Set the outer "div" to be the outer
6604 // viewport. 6617 // viewport.
6605 { 6618 {
6606 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10); 6619 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10);
6607 clip->SetBounds(content_size); 6620 clip->SetBounds(content_size);
6608 clip->SetPosition(gfx::PointF()); 6621 clip->SetPosition(gfx::PointF());
6609 6622
6610 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11); 6623 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11);
6611 scroll->SetBounds(gfx::Size(400, 400)); 6624 scroll->SetBounds(gfx::Size(400, 400));
6612 scroll->SetScrollClipLayer(clip->id()); 6625 scroll->SetScrollClipLayer(clip->id());
6626 scroll->SetElementId(LayerIdToElementIdForTesting(scroll->id()));
6613 scroll->SetDrawsContent(true); 6627 scroll->SetDrawsContent(true);
6614 6628
6615 std::unique_ptr<LayerImpl> clip2 = LayerImpl::Create(layer_tree_impl, 12); 6629 std::unique_ptr<LayerImpl> clip2 = LayerImpl::Create(layer_tree_impl, 12);
6616 clip2->SetBounds(gfx::Size(300, 300)); 6630 clip2->SetBounds(gfx::Size(300, 300));
6617 clip2->SetPosition(gfx::PointF()); 6631 clip2->SetPosition(gfx::PointF());
6618 clip2->SetDrawsContent(true); 6632 clip2->SetDrawsContent(true);
6619 6633
6620 std::unique_ptr<LayerImpl> scroll2 = LayerImpl::Create(layer_tree_impl, 13); 6634 std::unique_ptr<LayerImpl> scroll2 = LayerImpl::Create(layer_tree_impl, 13);
6621 scroll2->SetBounds(gfx::Size(500, 500)); 6635 scroll2->SetBounds(gfx::Size(500, 500));
6622 scroll2->SetScrollClipLayer(clip2->id()); 6636 scroll2->SetScrollClipLayer(clip2->id());
6637 scroll2->SetElementId(LayerIdToElementIdForTesting(scroll2->id()));
6623 scroll2->SetDrawsContent(true); 6638 scroll2->SetDrawsContent(true);
6624 6639
6625 scroll_layer = scroll.get(); 6640 scroll_layer = scroll.get();
6626 child_scroll_layer = scroll2.get(); 6641 child_scroll_layer = scroll2.get();
6627 6642
6628 clip2->test_properties()->AddChild(std::move(scroll2)); 6643 clip2->test_properties()->AddChild(std::move(scroll2));
6629 scroll->test_properties()->AddChild(std::move(clip2)); 6644 scroll->test_properties()->AddChild(std::move(clip2));
6630 6645
6631 clip->test_properties()->AddChild(std::move(scroll)); 6646 clip->test_properties()->AddChild(std::move(scroll));
6632 content_layer->test_properties()->AddChild(std::move(clip)); 6647 content_layer->test_properties()->AddChild(std::move(clip));
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
6734 // set as the outer viewport. Add a sibling scrolling layer that isn't a child 6749 // set as the outer viewport. Add a sibling scrolling layer that isn't a child
6735 // of the outer viewport scroll layer. 6750 // of the outer viewport scroll layer.
6736 { 6751 {
6737 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10); 6752 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10);
6738 clip->SetBounds(content_size); 6753 clip->SetBounds(content_size);
6739 clip->SetPosition(gfx::PointF(100, 100)); 6754 clip->SetPosition(gfx::PointF(100, 100));
6740 6755
6741 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11); 6756 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11);
6742 scroll->SetBounds(gfx::Size(1200, 1200)); 6757 scroll->SetBounds(gfx::Size(1200, 1200));
6743 scroll->SetScrollClipLayer(clip->id()); 6758 scroll->SetScrollClipLayer(clip->id());
6759 scroll->SetElementId(LayerIdToElementIdForTesting(scroll->id()));
6744 scroll->SetDrawsContent(true); 6760 scroll->SetDrawsContent(true);
6745 6761
6746 outer_scroll_layer = scroll.get(); 6762 outer_scroll_layer = scroll.get();
6747 6763
6748 clip->test_properties()->AddChild(std::move(scroll)); 6764 clip->test_properties()->AddChild(std::move(scroll));
6749 content_layer->test_properties()->AddChild(std::move(clip)); 6765 content_layer->test_properties()->AddChild(std::move(clip));
6750 6766
6751 // Create the non-descendant. 6767 // Create the non-descendant.
6752 std::unique_ptr<LayerImpl> clip2 = LayerImpl::Create(layer_tree_impl, 14); 6768 std::unique_ptr<LayerImpl> clip2 = LayerImpl::Create(layer_tree_impl, 14);
6753 clip2->SetBounds(gfx::Size(600, 600)); 6769 clip2->SetBounds(gfx::Size(600, 600));
6754 clip2->SetPosition(gfx::PointF()); 6770 clip2->SetPosition(gfx::PointF());
6755 6771
6756 std::unique_ptr<LayerImpl> scroll2 = LayerImpl::Create(layer_tree_impl, 15); 6772 std::unique_ptr<LayerImpl> scroll2 = LayerImpl::Create(layer_tree_impl, 15);
6757 scroll2->SetBounds(gfx::Size(1200, 1200)); 6773 scroll2->SetBounds(gfx::Size(1200, 1200));
6758 scroll2->SetScrollClipLayer(clip2->id()); 6774 scroll2->SetScrollClipLayer(clip2->id());
6775 scroll2->SetElementId(LayerIdToElementIdForTesting(scroll2->id()));
6759 scroll2->SetDrawsContent(true); 6776 scroll2->SetDrawsContent(true);
6760 6777
6761 sibling_scroll_layer = scroll2.get(); 6778 sibling_scroll_layer = scroll2.get();
6762 6779
6763 clip2->test_properties()->AddChild(std::move(scroll2)); 6780 clip2->test_properties()->AddChild(std::move(scroll2));
6764 content_layer->test_properties()->AddChild(std::move(clip2)); 6781 content_layer->test_properties()->AddChild(std::move(clip2));
6765 6782
6766 layer_tree_impl->SetViewportLayersFromIds( 6783 layer_tree_impl->SetViewportLayersFromIds(
6767 Layer::INVALID_ID, layer_tree_impl->PageScaleLayer()->id(), 6784 Layer::INVALID_ID, layer_tree_impl->PageScaleLayer()->id(),
6768 inner_scroll_layer->id(), outer_scroll_layer->id()); 6785 inner_scroll_layer->id(), outer_scroll_layer->id());
(...skipping 1317 matching lines...) Expand 10 before | Expand all | Expand 10 after
8086 3, raster_source); 8103 3, raster_source);
8087 LayerImpl* content_layer = scoped_content_layer.get(); 8104 LayerImpl* content_layer = scoped_content_layer.get();
8088 scrolling_layer->test_properties()->AddChild(std::move(scoped_content_layer)); 8105 scrolling_layer->test_properties()->AddChild(std::move(scoped_content_layer));
8089 content_layer->SetBounds(content_layer_bounds); 8106 content_layer->SetBounds(content_layer_bounds);
8090 content_layer->SetDrawsContent(true); 8107 content_layer->SetDrawsContent(true);
8091 8108
8092 root->SetBounds(root_size); 8109 root->SetBounds(root_size);
8093 8110
8094 gfx::ScrollOffset scroll_offset(100000, 0); 8111 gfx::ScrollOffset scroll_offset(100000, 0);
8095 scrolling_layer->SetScrollClipLayer(root->id()); 8112 scrolling_layer->SetScrollClipLayer(root->id());
8113 scrolling_layer->SetElementId(
8114 LayerIdToElementIdForTesting(scrolling_layer->id()));
8096 host_impl_->pending_tree()->BuildPropertyTreesForTesting(); 8115 host_impl_->pending_tree()->BuildPropertyTreesForTesting();
8097 8116
8098 scrolling_layer->layer_tree_impl() 8117 scrolling_layer->layer_tree_impl()
8099 ->property_trees() 8118 ->property_trees()
8100 ->scroll_tree.UpdateScrollOffsetBaseForTesting(scrolling_layer->id(), 8119 ->scroll_tree.UpdateScrollOffsetBaseForTesting(scrolling_layer->id(),
8101 scroll_offset); 8120 scroll_offset);
8102 host_impl_->ActivateSyncTree(); 8121 host_impl_->ActivateSyncTree();
8103 8122
8104 bool update_lcd_text = false; 8123 bool update_lcd_text = false;
8105 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8124 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
(...skipping 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after
9536 // set its scroll layer as the outer viewport. This simulates setting a 9555 // set its scroll layer as the outer viewport. This simulates setting a
9537 // scrolling element as the root scroller on the page. 9556 // scrolling element as the root scroller on the page.
9538 { 9557 {
9539 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10); 9558 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10);
9540 clip->SetBounds(root_layer_size); 9559 clip->SetBounds(root_layer_size);
9541 clip->SetPosition(gfx::PointF()); 9560 clip->SetPosition(gfx::PointF());
9542 9561
9543 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11); 9562 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11);
9544 scroll->SetBounds(scroll_content_size); 9563 scroll->SetBounds(scroll_content_size);
9545 scroll->SetScrollClipLayer(clip->id()); 9564 scroll->SetScrollClipLayer(clip->id());
9565 scroll->SetElementId(LayerIdToElementIdForTesting(scroll->id()));
9546 scroll->SetDrawsContent(true); 9566 scroll->SetDrawsContent(true);
9547 9567
9548 scroll_layer = scroll.get(); 9568 scroll_layer = scroll.get();
9549 9569
9550 clip->test_properties()->AddChild(std::move(scroll)); 9570 clip->test_properties()->AddChild(std::move(scroll));
9551 outer_scroll->test_properties()->AddChild(std::move(clip)); 9571 outer_scroll->test_properties()->AddChild(std::move(clip));
9552 layer_tree_impl->SetViewportLayersFromIds( 9572 layer_tree_impl->SetViewportLayersFromIds(
9553 Layer::INVALID_ID, layer_tree_impl->PageScaleLayer()->id(), 9573 Layer::INVALID_ID, layer_tree_impl->PageScaleLayer()->id(),
9554 inner_scroll->id(), scroll_layer->id()); 9574 inner_scroll->id(), scroll_layer->id());
9555 layer_tree_impl->BuildPropertyTreesForTesting(); 9575 layer_tree_impl->BuildPropertyTreesForTesting();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
9597 gfx::ScrollOffset()); 9617 gfx::ScrollOffset());
9598 9618
9599 std::unique_ptr<LayerImpl> inner_clip = 9619 std::unique_ptr<LayerImpl> inner_clip =
9600 LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId); 9620 LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId);
9601 inner_clip->SetBounds(inner_viewport); 9621 inner_clip->SetBounds(inner_viewport);
9602 9622
9603 std::unique_ptr<LayerImpl> page_scale = 9623 std::unique_ptr<LayerImpl> page_scale =
9604 LayerImpl::Create(layer_tree_impl, kPageScaleLayerId); 9624 LayerImpl::Create(layer_tree_impl, kPageScaleLayerId);
9605 9625
9606 inner_scroll->SetScrollClipLayer(inner_clip->id()); 9626 inner_scroll->SetScrollClipLayer(inner_clip->id());
9627 inner_scroll->SetElementId(
9628 LayerIdToElementIdForTesting(inner_scroll->id()));
9607 inner_scroll->SetBounds(outer_viewport); 9629 inner_scroll->SetBounds(outer_viewport);
9608 inner_scroll->SetPosition(gfx::PointF()); 9630 inner_scroll->SetPosition(gfx::PointF());
9609 9631
9610 std::unique_ptr<LayerImpl> outer_clip = 9632 std::unique_ptr<LayerImpl> outer_clip =
9611 LayerImpl::Create(layer_tree_impl, kOuterViewportClipLayerId); 9633 LayerImpl::Create(layer_tree_impl, kOuterViewportClipLayerId);
9612 outer_clip->SetBounds(outer_viewport); 9634 outer_clip->SetBounds(outer_viewport);
9613 outer_clip->test_properties()->is_container_for_fixed_position_layers = 9635 outer_clip->test_properties()->is_container_for_fixed_position_layers =
9614 true; 9636 true;
9615 9637
9616 std::unique_ptr<LayerImpl> outer_scroll = 9638 std::unique_ptr<LayerImpl> outer_scroll =
9617 LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId); 9639 LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId);
9618 outer_scroll->SetScrollClipLayer(outer_clip->id()); 9640 outer_scroll->SetScrollClipLayer(outer_clip->id());
9641 outer_scroll->SetElementId(
9642 LayerIdToElementIdForTesting(outer_scroll->id()));
9619 outer_scroll->layer_tree_impl() 9643 outer_scroll->layer_tree_impl()
9620 ->property_trees() 9644 ->property_trees()
9621 ->scroll_tree.UpdateScrollOffsetBaseForTesting(outer_scroll->id(), 9645 ->scroll_tree.UpdateScrollOffsetBaseForTesting(outer_scroll->id(),
9622 gfx::ScrollOffset()); 9646 gfx::ScrollOffset());
9623 outer_scroll->SetBounds(content_size); 9647 outer_scroll->SetBounds(content_size);
9624 outer_scroll->SetPosition(gfx::PointF()); 9648 outer_scroll->SetPosition(gfx::PointF());
9625 9649
9626 std::unique_ptr<LayerImpl> contents = LayerImpl::Create(layer_tree_impl, 8); 9650 std::unique_ptr<LayerImpl> contents = LayerImpl::Create(layer_tree_impl, 8);
9627 contents->SetDrawsContent(true); 9651 contents->SetDrawsContent(true);
9628 contents->SetBounds(content_size); 9652 contents->SetBounds(content_size);
(...skipping 2163 matching lines...) Expand 10 before | Expand all | Expand 10 after
11792 scrollbar_2_id, VERTICAL, 5, 5, true, 11816 scrollbar_2_id, VERTICAL, 5, 5, true,
11793 true); 11817 true);
11794 std::unique_ptr<LayerImpl> child_clip = 11818 std::unique_ptr<LayerImpl> child_clip =
11795 LayerImpl::Create(host_impl_->active_tree(), child_clip_id); 11819 LayerImpl::Create(host_impl_->active_tree(), child_clip_id);
11796 std::unique_ptr<LayerImpl> child = 11820 std::unique_ptr<LayerImpl> child =
11797 LayerImpl::Create(host_impl_->active_tree(), child_scroll_id); 11821 LayerImpl::Create(host_impl_->active_tree(), child_scroll_id);
11798 child->SetPosition(gfx::PointF(50, 50)); 11822 child->SetPosition(gfx::PointF(50, 50));
11799 child->SetBounds(child_layer_size); 11823 child->SetBounds(child_layer_size);
11800 child->SetDrawsContent(true); 11824 child->SetDrawsContent(true);
11801 child->SetScrollClipLayer(child_clip_id); 11825 child->SetScrollClipLayer(child_clip_id);
11826 child->SetElementId(LayerIdToElementIdForTesting(child->id()));
11802 11827
11803 if (main_thread_scrolling) { 11828 if (main_thread_scrolling) {
11804 child->set_main_thread_scrolling_reasons( 11829 child->set_main_thread_scrolling_reasons(
11805 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); 11830 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects);
11806 } 11831 }
11807 11832
11808 scrollbar_2->SetScrollLayerId(child_scroll_id); 11833 scrollbar_2->SetScrollLayerId(child_scroll_id);
11809 scrollbar_2->SetDrawsContent(true); 11834 scrollbar_2->SetDrawsContent(true);
11810 scrollbar_2->SetBounds(scrollbar_size_2); 11835 scrollbar_2->SetBounds(scrollbar_size_2);
11811 11836
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
11963 else 11988 else
11964 EXPECT_FALSE(tile->HasRasterTask()); 11989 EXPECT_FALSE(tile->HasRasterTask());
11965 } 11990 }
11966 Region expected_invalidation( 11991 Region expected_invalidation(
11967 raster_source->GetRectForImage(checkerable_image->uniqueID())); 11992 raster_source->GetRectForImage(checkerable_image->uniqueID()));
11968 EXPECT_EQ(expected_invalidation, *(root->GetPendingInvalidation())); 11993 EXPECT_EQ(expected_invalidation, *(root->GetPendingInvalidation()));
11969 } 11994 }
11970 11995
11971 } // namespace 11996 } // namespace
11972 } // namespace cc 11997 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/trees/layer_tree_host_unittest_scroll.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698