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

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

Issue 23983047: Pinch/Zoom Infrastructure & Plumbing CL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove content_bounds() usage, fix unit test. Created 6 years, 11 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 | Annotate | Revision Log
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 <cmath> 7 #include <cmath>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 if (scroll_info.scrolls[i].layer_id != id) 198 if (scroll_info.scrolls[i].layer_id != id)
199 continue; 199 continue;
200 times_encountered++; 200 times_encountered++;
201 } 201 }
202 202
203 ASSERT_EQ(0, times_encountered); 203 ASSERT_EQ(0, times_encountered);
204 } 204 }
205 205
206 LayerImpl* CreateScrollAndContentsLayers(LayerTreeImpl* layer_tree_impl, 206 LayerImpl* CreateScrollAndContentsLayers(LayerTreeImpl* layer_tree_impl,
207 gfx::Size content_size) { 207 gfx::Size content_size) {
208 const int kInnerViewportScrollLayerId = 2;
209 const int kInnerViewportClipLayerId = 4;
210 const int kPageScaleLayerId = 5;
208 scoped_ptr<LayerImpl> root = 211 scoped_ptr<LayerImpl> root =
209 LayerImpl::Create(layer_tree_impl, 1); 212 LayerImpl::Create(layer_tree_impl, 1);
210 root->SetBounds(content_size); 213 root->SetBounds(content_size);
211 root->SetContentBounds(content_size); 214 root->SetContentBounds(content_size);
212 root->SetPosition(gfx::PointF()); 215 root->SetPosition(gfx::PointF());
213 root->SetAnchorPoint(gfx::PointF()); 216 root->SetAnchorPoint(gfx::PointF());
214 217
215 scoped_ptr<LayerImpl> scroll = 218 scoped_ptr<LayerImpl> scroll =
216 LayerImpl::Create(layer_tree_impl, 2); 219 LayerImpl::Create(layer_tree_impl, kInnerViewportScrollLayerId);
217 LayerImpl* scroll_layer = scroll.get(); 220 LayerImpl* scroll_layer = scroll.get();
218 scroll->SetScrollable(true); 221 scroll->SetIsContainerForFixedPositionLayers(true);
219 scroll->SetScrollOffset(gfx::Vector2d()); 222 scroll->SetScrollOffset(gfx::Vector2d());
220 scroll->SetMaxScrollOffset(gfx::Vector2d(content_size.width(), 223
221 content_size.height())); 224 scoped_ptr<LayerImpl> clip =
225 LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId);
226 clip->SetBounds(
227 gfx::Size(content_size.width() / 2, content_size.height() / 2));
228
229 scoped_ptr<LayerImpl> page_scale =
230 LayerImpl::Create(layer_tree_impl, kPageScaleLayerId);
231
232 scroll->SetScrollClipLayer(clip->id());
222 scroll->SetBounds(content_size); 233 scroll->SetBounds(content_size);
223 scroll->SetContentBounds(content_size); 234 scroll->SetContentBounds(content_size);
224 scroll->SetPosition(gfx::PointF()); 235 scroll->SetPosition(gfx::PointF());
225 scroll->SetAnchorPoint(gfx::PointF()); 236 scroll->SetAnchorPoint(gfx::PointF());
237 scroll->SetIsContainerForFixedPositionLayers(true);
226 238
227 scoped_ptr<LayerImpl> contents = 239 scoped_ptr<LayerImpl> contents =
228 LayerImpl::Create(layer_tree_impl, 3); 240 LayerImpl::Create(layer_tree_impl, 3);
229 contents->SetDrawsContent(true); 241 contents->SetDrawsContent(true);
230 contents->SetBounds(content_size); 242 contents->SetBounds(content_size);
231 contents->SetContentBounds(content_size); 243 contents->SetContentBounds(content_size);
232 contents->SetPosition(gfx::PointF()); 244 contents->SetPosition(gfx::PointF());
233 contents->SetAnchorPoint(gfx::PointF()); 245 contents->SetAnchorPoint(gfx::PointF());
234 246
235 scroll->AddChild(contents.Pass()); 247 scroll->AddChild(contents.Pass());
236 root->AddChild(scroll.Pass()); 248 page_scale->AddChild(scroll.Pass());
249 clip->AddChild(page_scale.Pass());
250 root->AddChild(clip.Pass());
237 251
238 layer_tree_impl->SetRootLayer(root.Pass()); 252 layer_tree_impl->SetRootLayer(root.Pass());
253 layer_tree_impl->SetViewportLayersFromIds(
254 kPageScaleLayerId, kInnerViewportScrollLayerId, Layer::INVALID_ID);
255
239 return scroll_layer; 256 return scroll_layer;
240 } 257 }
241 258
242 LayerImpl* SetupScrollAndContentsLayers(gfx::Size content_size) { 259 LayerImpl* SetupScrollAndContentsLayers(gfx::Size content_size) {
243 LayerImpl* scroll_layer = CreateScrollAndContentsLayers( 260 LayerImpl* scroll_layer = CreateScrollAndContentsLayers(
244 host_impl_->active_tree(), content_size); 261 host_impl_->active_tree(), content_size);
245 host_impl_->active_tree()->DidBecomeActive(); 262 host_impl_->active_tree()->DidBecomeActive();
246 return scroll_layer; 263 return scroll_layer;
247 } 264 }
248 265
249 scoped_ptr<LayerImpl> CreateScrollableLayer(int id, gfx::Size size) { 266 // TODO(wjmaclean) Add clip-layer pointer to parameters.
267 scoped_ptr<LayerImpl> CreateScrollableLayer(int id,
268 gfx::Size size,
269 LayerImpl* clip_layer) {
270 DCHECK(clip_layer);
271 DCHECK(id != clip_layer->id());
250 scoped_ptr<LayerImpl> layer = 272 scoped_ptr<LayerImpl> layer =
251 LayerImpl::Create(host_impl_->active_tree(), id); 273 LayerImpl::Create(host_impl_->active_tree(), id);
252 layer->SetScrollable(true); 274 layer->SetScrollClipLayer(clip_layer->id());
253 layer->SetDrawsContent(true); 275 layer->SetDrawsContent(true);
254 layer->SetBounds(size); 276 layer->SetBounds(size);
255 layer->SetContentBounds(size); 277 layer->SetContentBounds(size);
256 layer->SetMaxScrollOffset(gfx::Vector2d(size.width() * 2, 278 clip_layer->SetBounds(gfx::Size(size.width() / 2, size.height() / 2));
257 size.height() * 2));
258 return layer.Pass(); 279 return layer.Pass();
259 } 280 }
260 281
261 void DrawFrame() { 282 void DrawFrame() {
262 LayerTreeHostImpl::FrameData frame; 283 LayerTreeHostImpl::FrameData frame;
263 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 284 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
264 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); 285 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
265 host_impl_->DidDrawAllLayers(frame); 286 host_impl_->DidDrawAllLayers(frame);
266 } 287 }
267 288
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 436
416 scroll_info = host_impl_->ProcessScrollDeltas(); 437 scroll_info = host_impl_->ProcessScrollDeltas();
417 ASSERT_EQ(scroll_info->scrolls.size(), 0u); 438 ASSERT_EQ(scroll_info->scrolls.size(), 0u);
418 ExpectClearedScrollDeltasRecursive(root); 439 ExpectClearedScrollDeltasRecursive(root);
419 } 440 }
420 441
421 TEST_F(LayerTreeHostImplTest, ScrollDeltaRepeatedScrolls) { 442 TEST_F(LayerTreeHostImplTest, ScrollDeltaRepeatedScrolls) {
422 gfx::Vector2d scroll_offset(20, 30); 443 gfx::Vector2d scroll_offset(20, 30);
423 gfx::Vector2d scroll_delta(11, -15); 444 gfx::Vector2d scroll_delta(11, -15);
424 { 445 {
446 scoped_ptr<LayerImpl> root_clip =
447 LayerImpl::Create(host_impl_->active_tree(), 2);
425 scoped_ptr<LayerImpl> root = 448 scoped_ptr<LayerImpl> root =
426 LayerImpl::Create(host_impl_->active_tree(), 1); 449 LayerImpl::Create(host_impl_->active_tree(), 1);
427 root->SetMaxScrollOffset(gfx::Vector2d(100, 100)); 450 root_clip->SetBounds(gfx::Size(10, 10));
428 root->SetScrollOffset(scroll_offset); 451 LayerImpl* root_layer = root.get();
429 root->SetScrollable(true); 452 root_clip->AddChild(root.Pass());
430 root->ScrollBy(scroll_delta); 453 root_layer->SetBounds(gfx::Size(110, 110));
431 host_impl_->active_tree()->SetRootLayer(root.Pass()); 454 root_layer->SetScrollClipLayer(root_clip->id());
455 root_layer->SetScrollOffset(scroll_offset);
456 root_layer->ScrollBy(scroll_delta);
457 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
432 } 458 }
433 LayerImpl* root = host_impl_->active_tree()->root_layer(); 459 LayerImpl* root = host_impl_->active_tree()->root_layer()->children()[0];
434 460
435 scoped_ptr<ScrollAndScaleSet> scroll_info; 461 scoped_ptr<ScrollAndScaleSet> scroll_info;
436 462
437 scroll_info = host_impl_->ProcessScrollDeltas(); 463 scroll_info = host_impl_->ProcessScrollDeltas();
438 ASSERT_EQ(scroll_info->scrolls.size(), 1u); 464 ASSERT_EQ(scroll_info->scrolls.size(), 1u);
439 EXPECT_VECTOR_EQ(root->sent_scroll_delta(), scroll_delta); 465 EXPECT_VECTOR_EQ(root->sent_scroll_delta(), scroll_delta);
440 ExpectContains(*scroll_info, root->id(), scroll_delta); 466 ExpectContains(*scroll_info, root->id(), scroll_delta);
441 467
442 gfx::Vector2d scroll_delta2(-5, 27); 468 gfx::Vector2d scroll_delta2(-5, 27);
443 root->ScrollBy(scroll_delta2); 469 root->ScrollBy(scroll_delta2);
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 gfx::Point(), SCROLL_FORWARD)); 740 gfx::Point(), SCROLL_FORWARD));
715 EXPECT_FALSE(host_impl_->ScrollVerticallyByPage( 741 EXPECT_FALSE(host_impl_->ScrollVerticallyByPage(
716 gfx::Point(), SCROLL_BACKWARD)); 742 gfx::Point(), SCROLL_BACKWARD));
717 743
718 scoped_ptr<PaintedScrollbarLayerImpl> vertical_scrollbar( 744 scoped_ptr<PaintedScrollbarLayerImpl> vertical_scrollbar(
719 PaintedScrollbarLayerImpl::Create( 745 PaintedScrollbarLayerImpl::Create(
720 host_impl_->active_tree(), 746 host_impl_->active_tree(),
721 20, 747 20,
722 VERTICAL)); 748 VERTICAL));
723 vertical_scrollbar->SetBounds(gfx::Size(15, 1000)); 749 vertical_scrollbar->SetBounds(gfx::Size(15, 1000));
724 host_impl_->RootScrollLayer()->SetVerticalScrollbarLayer( 750 host_impl_->InnerViewportScrollLayer()->AddScrollbar(
725 vertical_scrollbar.get()); 751 vertical_scrollbar.get());
726 752
727 // Trying to scroll with a vertical scrollbar will succeed. 753 // Trying to scroll with a vertical scrollbar will succeed.
728 EXPECT_TRUE(host_impl_->ScrollVerticallyByPage( 754 EXPECT_TRUE(host_impl_->ScrollVerticallyByPage(
729 gfx::Point(), SCROLL_FORWARD)); 755 gfx::Point(), SCROLL_FORWARD));
730 EXPECT_FLOAT_EQ(875.f, host_impl_->RootScrollLayer()->ScrollDelta().y()); 756 EXPECT_FLOAT_EQ(875.f,
757 host_impl_->InnerViewportScrollLayer()->ScrollDelta().y());
731 EXPECT_TRUE(host_impl_->ScrollVerticallyByPage( 758 EXPECT_TRUE(host_impl_->ScrollVerticallyByPage(
732 gfx::Point(), SCROLL_BACKWARD)); 759 gfx::Point(), SCROLL_BACKWARD));
733 } 760 }
734 761
735 // The user-scrollability breaks for zoomed-in pages. So disable this. 762 // The user-scrollability breaks for zoomed-in pages. So disable this.
736 // http://crbug.com/322223 763 // http://crbug.com/322223
737 TEST_F(LayerTreeHostImplTest, DISABLED_ScrollWithUserUnscrollableLayers) { 764 TEST_F(LayerTreeHostImplTest, DISABLED_ScrollWithUserUnscrollableLayers) {
738 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(200, 200)); 765 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(200, 200));
739 host_impl_->SetViewportSize(gfx::Size(100, 100)); 766 host_impl_->SetViewportSize(gfx::Size(100, 100));
740 767
741 gfx::Size overflow_size(400, 400); 768 gfx::Size overflow_size(400, 400);
742 ASSERT_EQ(1u, scroll_layer->children().size()); 769 ASSERT_EQ(1u, scroll_layer->children().size());
743 LayerImpl* overflow = scroll_layer->children()[0]; 770 LayerImpl* overflow = scroll_layer->children()[0];
744 overflow->SetBounds(overflow_size); 771 overflow->SetBounds(overflow_size);
745 overflow->SetContentBounds(overflow_size); 772 overflow->SetContentBounds(overflow_size);
746 overflow->SetScrollable(true); 773 overflow->SetScrollClipLayer(scroll_layer->parent()->id());
747 overflow->SetMaxScrollOffset(gfx::Vector2d(overflow_size.width(),
748 overflow_size.height()));
749 overflow->SetScrollOffset(gfx::Vector2d()); 774 overflow->SetScrollOffset(gfx::Vector2d());
750 overflow->SetPosition(gfx::PointF()); 775 overflow->SetPosition(gfx::PointF());
751 overflow->SetAnchorPoint(gfx::PointF()); 776 overflow->SetAnchorPoint(gfx::PointF());
752 777
753 DrawFrame(); 778 DrawFrame();
754 gfx::Point scroll_position(10, 10); 779 gfx::Point scroll_position(10, 10);
755 780
756 EXPECT_EQ(InputHandler::ScrollStarted, 781 EXPECT_EQ(InputHandler::ScrollStarted,
757 host_impl_->ScrollBegin(scroll_position, InputHandler::Wheel)); 782 host_impl_->ScrollBegin(scroll_position, InputHandler::Wheel));
758 EXPECT_VECTOR_EQ(gfx::Vector2dF(), scroll_layer->TotalScrollOffset()); 783 EXPECT_VECTOR_EQ(gfx::Vector2dF(), scroll_layer->TotalScrollOffset());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 host_impl_->active_tree()->set_needs_update_draw_properties(); 826 host_impl_->active_tree()->set_needs_update_draw_properties();
802 827
803 EXPECT_EQ(host_impl_->HaveTouchEventHandlersAt(gfx::Point()), false); 828 EXPECT_EQ(host_impl_->HaveTouchEventHandlersAt(gfx::Point()), false);
804 } 829 }
805 830
806 TEST_F(LayerTreeHostImplTest, ImplPinchZoom) { 831 TEST_F(LayerTreeHostImplTest, ImplPinchZoom) {
807 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); 832 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100));
808 host_impl_->SetViewportSize(gfx::Size(50, 50)); 833 host_impl_->SetViewportSize(gfx::Size(50, 50));
809 DrawFrame(); 834 DrawFrame();
810 835
811 EXPECT_EQ(scroll_layer, host_impl_->RootScrollLayer()); 836 EXPECT_EQ(scroll_layer, host_impl_->InnerViewportScrollLayer());
812 837
813 float min_page_scale = 1.f, max_page_scale = 4.f; 838 float min_page_scale = 1.f, max_page_scale = 4.f;
814 839
815 // The impl-based pinch zoom should adjust the max scroll position. 840 // The impl-based pinch zoom should adjust the max scroll position.
816 { 841 {
817 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 842 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f,
818 min_page_scale, 843 min_page_scale,
819 max_page_scale); 844 max_page_scale);
820 host_impl_->active_tree()->SetPageScaleDelta(1.f); 845 host_impl_->active_tree()->SetPageScaleDelta(1.f);
821 scroll_layer->SetScrollDelta(gfx::Vector2d()); 846 scroll_layer->SetScrollDelta(gfx::Vector2d());
822 847
823 float page_scale_delta = 2.f; 848 float page_scale_delta = 2.f;
824 host_impl_->ScrollBegin(gfx::Point(50, 50), InputHandler::Gesture); 849 host_impl_->ScrollBegin(gfx::Point(50, 50), InputHandler::Gesture);
850 host_impl_->PinchGestureBegin();
825 host_impl_->PinchGestureUpdate(page_scale_delta, gfx::Point(50, 50)); 851 host_impl_->PinchGestureUpdate(page_scale_delta, gfx::Point(50, 50));
826 host_impl_->PinchGestureEnd(); 852 host_impl_->PinchGestureEnd();
827 host_impl_->ScrollEnd(); 853 host_impl_->ScrollEnd();
828 EXPECT_TRUE(did_request_redraw_); 854 EXPECT_TRUE(did_request_redraw_);
829 EXPECT_TRUE(did_request_commit_); 855 EXPECT_TRUE(did_request_commit_);
830 856
831 scoped_ptr<ScrollAndScaleSet> scroll_info = 857 scoped_ptr<ScrollAndScaleSet> scroll_info =
832 host_impl_->ProcessScrollDeltas(); 858 host_impl_->ProcessScrollDeltas();
833 EXPECT_EQ(scroll_info->page_scale_delta, page_scale_delta); 859 EXPECT_EQ(scroll_info->page_scale_delta, page_scale_delta);
834 860
835 EXPECT_EQ(gfx::Vector2d(75, 75).ToString(), 861 EXPECT_EQ(gfx::Vector2d(75, 75).ToString(),
836 scroll_layer->max_scroll_offset().ToString()); 862 scroll_layer->MaxScrollOffset().ToString());
837 } 863 }
838 864
839 // Scrolling after a pinch gesture should always be in local space. The 865 // Scrolling after a pinch gesture should always be in local space. The
840 // scroll deltas do not have the page scale factor applied. 866 // scroll deltas do not have the page scale factor applied.
841 { 867 {
842 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 868 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f,
843 min_page_scale, 869 min_page_scale,
844 max_page_scale); 870 max_page_scale);
845 host_impl_->active_tree()->SetPageScaleDelta(1.f); 871 host_impl_->active_tree()->SetPageScaleDelta(1.f);
846 scroll_layer->SetScrollDelta(gfx::Vector2d()); 872 scroll_layer->SetScrollDelta(gfx::Vector2d());
(...skipping 18 matching lines...) Expand all
865 scroll_layer->id(), 891 scroll_layer->id(),
866 scroll_delta); 892 scroll_delta);
867 } 893 }
868 } 894 }
869 895
870 TEST_F(LayerTreeHostImplTest, PinchGesture) { 896 TEST_F(LayerTreeHostImplTest, PinchGesture) {
871 SetupScrollAndContentsLayers(gfx::Size(100, 100)); 897 SetupScrollAndContentsLayers(gfx::Size(100, 100));
872 host_impl_->SetViewportSize(gfx::Size(50, 50)); 898 host_impl_->SetViewportSize(gfx::Size(50, 50));
873 DrawFrame(); 899 DrawFrame();
874 900
875 LayerImpl* scroll_layer = host_impl_->RootScrollLayer(); 901 LayerImpl* scroll_layer = host_impl_->InnerViewportScrollLayer();
876 DCHECK(scroll_layer); 902 DCHECK(scroll_layer);
877 903
878 float min_page_scale = 1.f; 904 float min_page_scale = 1.f;
879 float max_page_scale = 4.f; 905 float max_page_scale = 4.f;
880 906
881 // Basic pinch zoom in gesture 907 // Basic pinch zoom in gesture
882 { 908 {
883 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 909 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f,
884 min_page_scale, 910 min_page_scale,
885 max_page_scale); 911 max_page_scale);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 ExpectContains(*scroll_info, scroll_layer->id(), gfx::Vector2d(-10, -10)); 1011 ExpectContains(*scroll_info, scroll_layer->id(), gfx::Vector2d(-10, -10));
986 } 1012 }
987 1013
988 // Two-finger panning should work when starting fully zoomed out. 1014 // Two-finger panning should work when starting fully zoomed out.
989 { 1015 {
990 host_impl_->active_tree()->SetPageScaleFactorAndLimits(0.5f, 1016 host_impl_->active_tree()->SetPageScaleFactorAndLimits(0.5f,
991 0.5f, 1017 0.5f,
992 4.f); 1018 4.f);
993 scroll_layer->SetScrollDelta(gfx::Vector2d()); 1019 scroll_layer->SetScrollDelta(gfx::Vector2d());
994 scroll_layer->SetScrollOffset(gfx::Vector2d(0, 0)); 1020 scroll_layer->SetScrollOffset(gfx::Vector2d(0, 0));
995 host_impl_->active_tree()->UpdateMaxScrollOffset();
996 1021
997 host_impl_->ScrollBegin(gfx::Point(0, 0), InputHandler::Gesture); 1022 host_impl_->ScrollBegin(gfx::Point(0, 0), InputHandler::Gesture);
998 host_impl_->PinchGestureBegin(); 1023 host_impl_->PinchGestureBegin();
999 host_impl_->PinchGestureUpdate(2.f, gfx::Point(0, 0)); 1024 host_impl_->PinchGestureUpdate(2.f, gfx::Point(0, 0));
1000 host_impl_->PinchGestureUpdate(1.f, gfx::Point(0, 0)); 1025 host_impl_->PinchGestureUpdate(1.f, gfx::Point(0, 0));
1001 host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2d(10, 10)); 1026 host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2d(10, 10));
1002 host_impl_->PinchGestureUpdate(1.f, gfx::Point(10, 10)); 1027 host_impl_->PinchGestureUpdate(1.f, gfx::Point(10, 10));
1003 host_impl_->PinchGestureEnd(); 1028 host_impl_->PinchGestureEnd();
1004 host_impl_->ScrollEnd(); 1029 host_impl_->ScrollEnd();
1005 1030
1006 scoped_ptr<ScrollAndScaleSet> scroll_info = 1031 scoped_ptr<ScrollAndScaleSet> scroll_info =
1007 host_impl_->ProcessScrollDeltas(); 1032 host_impl_->ProcessScrollDeltas();
1008 EXPECT_EQ(scroll_info->page_scale_delta, 2.f); 1033 EXPECT_EQ(scroll_info->page_scale_delta, 2.f);
1009 ExpectContains(*scroll_info, scroll_layer->id(), gfx::Vector2d(20, 20)); 1034 ExpectContains(*scroll_info, scroll_layer->id(), gfx::Vector2d(20, 20));
1010 } 1035 }
1011 } 1036 }
1012 1037
1013 TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { 1038 TEST_F(LayerTreeHostImplTest, PageScaleAnimation) {
1014 SetupScrollAndContentsLayers(gfx::Size(100, 100)); 1039 SetupScrollAndContentsLayers(gfx::Size(100, 100));
1015 host_impl_->SetViewportSize(gfx::Size(50, 50)); 1040 host_impl_->SetViewportSize(gfx::Size(50, 50));
1016 DrawFrame(); 1041 DrawFrame();
1017 1042
1018 LayerImpl* scroll_layer = host_impl_->RootScrollLayer(); 1043 LayerImpl* scroll_layer = host_impl_->InnerViewportScrollLayer();
1019 DCHECK(scroll_layer); 1044 DCHECK(scroll_layer);
1020 1045
1021 float min_page_scale = 0.5f; 1046 float min_page_scale = 0.5f;
1022 float max_page_scale = 4.f; 1047 float max_page_scale = 4.f;
1023 base::TimeTicks start_time = base::TimeTicks() + 1048 base::TimeTicks start_time = base::TimeTicks() +
1024 base::TimeDelta::FromSeconds(1); 1049 base::TimeDelta::FromSeconds(1);
1025 base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100); 1050 base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100);
1026 base::TimeTicks halfway_through_animation = start_time + duration / 2; 1051 base::TimeTicks halfway_through_animation = start_time + duration / 2;
1027 base::TimeTicks end_time = start_time + duration; 1052 base::TimeTicks end_time = start_time + duration;
1028 1053
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 // Pushed to (0,0) via clamping against contents layer size. 1103 // Pushed to (0,0) via clamping against contents layer size.
1079 ExpectContains(*scroll_info, scroll_layer->id(), gfx::Vector2d(-50, -50)); 1104 ExpectContains(*scroll_info, scroll_layer->id(), gfx::Vector2d(-50, -50));
1080 } 1105 }
1081 } 1106 }
1082 1107
1083 TEST_F(LayerTreeHostImplTest, PageScaleAnimationNoOp) { 1108 TEST_F(LayerTreeHostImplTest, PageScaleAnimationNoOp) {
1084 SetupScrollAndContentsLayers(gfx::Size(100, 100)); 1109 SetupScrollAndContentsLayers(gfx::Size(100, 100));
1085 host_impl_->SetViewportSize(gfx::Size(50, 50)); 1110 host_impl_->SetViewportSize(gfx::Size(50, 50));
1086 DrawFrame(); 1111 DrawFrame();
1087 1112
1088 LayerImpl* scroll_layer = host_impl_->RootScrollLayer(); 1113 LayerImpl* scroll_layer = host_impl_->InnerViewportScrollLayer();
1089 DCHECK(scroll_layer); 1114 DCHECK(scroll_layer);
1090 1115
1091 float min_page_scale = 0.5f; 1116 float min_page_scale = 0.5f;
1092 float max_page_scale = 4.f; 1117 float max_page_scale = 4.f;
1093 base::TimeTicks start_time = base::TimeTicks() + 1118 base::TimeTicks start_time = base::TimeTicks() +
1094 base::TimeDelta::FromSeconds(1); 1119 base::TimeDelta::FromSeconds(1);
1095 base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100); 1120 base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100);
1096 base::TimeTicks halfway_through_animation = start_time + duration / 2; 1121 base::TimeTicks halfway_through_animation = start_time + duration / 2;
1097 base::TimeTicks end_time = start_time + duration; 1122 base::TimeTicks end_time = start_time + duration;
1098 1123
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 host_impl_ = make_scoped_ptr(host_impl_override_time); 1183 host_impl_ = make_scoped_ptr(host_impl_override_time);
1159 host_impl_->InitializeRenderer(CreateOutputSurface()); 1184 host_impl_->InitializeRenderer(CreateOutputSurface());
1160 host_impl_->SetViewportSize(viewport_size); 1185 host_impl_->SetViewportSize(viewport_size);
1161 1186
1162 scoped_ptr<LayerImpl> root = 1187 scoped_ptr<LayerImpl> root =
1163 LayerImpl::Create(host_impl_->active_tree(), 1); 1188 LayerImpl::Create(host_impl_->active_tree(), 1);
1164 root->SetBounds(viewport_size); 1189 root->SetBounds(viewport_size);
1165 1190
1166 scoped_ptr<LayerImpl> scroll = 1191 scoped_ptr<LayerImpl> scroll =
1167 LayerImpl::Create(host_impl_->active_tree(), 2); 1192 LayerImpl::Create(host_impl_->active_tree(), 2);
1168 scroll->SetScrollable(true); 1193 scroll->SetScrollClipLayer(root->id());
1169 scroll->SetScrollOffset(gfx::Vector2d()); 1194 scroll->SetScrollOffset(gfx::Vector2d());
1170 scroll->SetMaxScrollOffset(gfx::Vector2d(content_size.width(), 1195 root->SetBounds(viewport_size);
1171 content_size.height()));
1172 scroll->SetBounds(content_size); 1196 scroll->SetBounds(content_size);
1173 scroll->SetContentBounds(content_size); 1197 scroll->SetContentBounds(content_size);
1198 scroll->SetIsContainerForFixedPositionLayers(true);
1174 1199
1175 scoped_ptr<LayerImpl> contents = 1200 scoped_ptr<LayerImpl> contents =
1176 LayerImpl::Create(host_impl_->active_tree(), 3); 1201 LayerImpl::Create(host_impl_->active_tree(), 3);
1177 contents->SetDrawsContent(true); 1202 contents->SetDrawsContent(true);
1178 contents->SetBounds(content_size); 1203 contents->SetBounds(content_size);
1179 contents->SetContentBounds(content_size); 1204 contents->SetContentBounds(content_size);
1180 1205
1181 scoped_ptr<PaintedScrollbarLayerImpl> scrollbar = 1206 scoped_ptr<PaintedScrollbarLayerImpl> scrollbar =
1182 PaintedScrollbarLayerImpl::Create(host_impl_->active_tree(), 4, VERTICAL); 1207 PaintedScrollbarLayerImpl::Create(host_impl_->active_tree(), 4, VERTICAL);
1183 scroll->SetVerticalScrollbarLayer(scrollbar.get()); 1208 scrollbar->SetScrollLayerById(2);
1209 scrollbar->SetClipLayerById(1);
1184 1210
1185 scroll->AddChild(contents.Pass()); 1211 scroll->AddChild(contents.Pass());
1186 root->AddChild(scroll.Pass()); 1212 root->AddChild(scroll.Pass());
1187 root->AddChild(scrollbar.PassAs<LayerImpl>()); 1213 root->AddChild(scrollbar.PassAs<LayerImpl>());
1188 1214
1189 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1215 host_impl_->active_tree()->SetRootLayer(root.Pass());
1216 host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID);
1190 host_impl_->active_tree()->DidBecomeActive(); 1217 host_impl_->active_tree()->DidBecomeActive();
1191 DrawFrame(); 1218 DrawFrame();
1192 1219
1193 base::TimeTicks fake_now = gfx::FrameTime::Now(); 1220 base::TimeTicks fake_now = gfx::FrameTime::Now();
1194 host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now); 1221 host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now);
1195 1222
1196 // If no scroll happened recently, StartScrollbarAnimation should have no 1223 // If no scroll happened recently, StartScrollbarAnimation should have no
1197 // effect. 1224 // effect.
1198 host_impl_->StartScrollbarAnimation(); 1225 host_impl_->StartScrollbarAnimation();
1199 EXPECT_EQ(base::TimeDelta(), requested_scrollbar_animation_delay_); 1226 EXPECT_EQ(base::TimeDelta(), requested_scrollbar_animation_delay_);
(...skipping 30 matching lines...) Expand all
1230 // If no scroll happened recently, StartScrollbarAnimation should have no 1257 // If no scroll happened recently, StartScrollbarAnimation should have no
1231 // effect. 1258 // effect.
1232 fake_now += base::TimeDelta::FromMilliseconds(25); 1259 fake_now += base::TimeDelta::FromMilliseconds(25);
1233 host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now); 1260 host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now);
1234 host_impl_->StartScrollbarAnimation(); 1261 host_impl_->StartScrollbarAnimation();
1235 EXPECT_EQ(base::TimeDelta(), requested_scrollbar_animation_delay_); 1262 EXPECT_EQ(base::TimeDelta(), requested_scrollbar_animation_delay_);
1236 EXPECT_FALSE(did_request_redraw_); 1263 EXPECT_FALSE(did_request_redraw_);
1237 1264
1238 // Setting the scroll offset outside a scroll should also cause the scrollbar 1265 // Setting the scroll offset outside a scroll should also cause the scrollbar
1239 // to appear and to schedule a fade. 1266 // to appear and to schedule a fade.
1240 host_impl_->RootScrollLayer()->SetScrollOffset(gfx::Vector2d(5, 5)); 1267 host_impl_->InnerViewportScrollLayer()->SetScrollOffset(gfx::Vector2d(5, 5));
1241 host_impl_->StartScrollbarAnimation(); 1268 host_impl_->StartScrollbarAnimation();
1242 EXPECT_LT(base::TimeDelta::FromMilliseconds(19), 1269 EXPECT_LT(base::TimeDelta::FromMilliseconds(19),
1243 requested_scrollbar_animation_delay_); 1270 requested_scrollbar_animation_delay_);
1244 EXPECT_FALSE(did_request_redraw_); 1271 EXPECT_FALSE(did_request_redraw_);
1245 requested_scrollbar_animation_delay_ = base::TimeDelta(); 1272 requested_scrollbar_animation_delay_ = base::TimeDelta();
1246 1273
1247 // None of the above should have called CurrentFrameTimeTicks, so if we call 1274 // None of the above should have called CurrentFrameTimeTicks, so if we call
1248 // it now we should get the current time. 1275 // it now we should get the current time.
1249 fake_now += base::TimeDelta::FromMilliseconds(10); 1276 fake_now += base::TimeDelta::FromMilliseconds(10);
1250 host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now); 1277 host_impl_override_time->SetCurrentPhysicalTimeTicksForTest(fake_now);
(...skipping 13 matching lines...) Expand all
1264 CreateHostImpl(settings, CreateOutputSurface()); 1291 CreateHostImpl(settings, CreateOutputSurface());
1265 host_impl_->SetDeviceScaleFactor(device_scale_factor); 1292 host_impl_->SetDeviceScaleFactor(device_scale_factor);
1266 host_impl_->SetViewportSize(device_viewport_size); 1293 host_impl_->SetViewportSize(device_viewport_size);
1267 1294
1268 scoped_ptr<LayerImpl> root = 1295 scoped_ptr<LayerImpl> root =
1269 LayerImpl::Create(host_impl_->active_tree(), 1); 1296 LayerImpl::Create(host_impl_->active_tree(), 1);
1270 root->SetBounds(viewport_size); 1297 root->SetBounds(viewport_size);
1271 1298
1272 scoped_ptr<LayerImpl> scroll = 1299 scoped_ptr<LayerImpl> scroll =
1273 LayerImpl::Create(host_impl_->active_tree(), 2); 1300 LayerImpl::Create(host_impl_->active_tree(), 2);
1274 scroll->SetScrollable(true); 1301 scroll->SetScrollClipLayer(root->id());
1275 scroll->SetScrollOffset(gfx::Vector2d()); 1302 scroll->SetScrollOffset(gfx::Vector2d());
1276 scroll->SetMaxScrollOffset(gfx::Vector2d(content_size.width(),
1277 content_size.height()));
1278 scroll->SetBounds(content_size); 1303 scroll->SetBounds(content_size);
1279 scroll->SetContentBounds(content_size); 1304 scroll->SetContentBounds(content_size);
1305 scroll->SetIsContainerForFixedPositionLayers(true);
1280 1306
1281 scoped_ptr<LayerImpl> contents = 1307 scoped_ptr<LayerImpl> contents =
1282 LayerImpl::Create(host_impl_->active_tree(), 3); 1308 LayerImpl::Create(host_impl_->active_tree(), 3);
1283 contents->SetDrawsContent(true); 1309 contents->SetDrawsContent(true);
1284 contents->SetBounds(content_size); 1310 contents->SetBounds(content_size);
1285 contents->SetContentBounds(content_size); 1311 contents->SetContentBounds(content_size);
1286 1312
1287 // The scrollbar is on the right side. 1313 // The scrollbar is on the right side.
1288 scoped_ptr<PaintedScrollbarLayerImpl> scrollbar = 1314 scoped_ptr<PaintedScrollbarLayerImpl> scrollbar =
1289 PaintedScrollbarLayerImpl::Create(host_impl_->active_tree(), 5, VERTICAL); 1315 PaintedScrollbarLayerImpl::Create(host_impl_->active_tree(), 5, VERTICAL);
1290 scrollbar->SetDrawsContent(true); 1316 scrollbar->SetDrawsContent(true);
1291 scrollbar->SetBounds(gfx::Size(15, viewport_size.height())); 1317 scrollbar->SetBounds(gfx::Size(15, viewport_size.height()));
1292 scrollbar->SetContentBounds(gfx::Size(15, viewport_size.height())); 1318 scrollbar->SetContentBounds(gfx::Size(15, viewport_size.height()));
1293 scrollbar->SetPosition(gfx::Point(285, 0)); 1319 scrollbar->SetPosition(gfx::Point(285, 0));
1294 scroll->SetVerticalScrollbarLayer(scrollbar.get()); 1320 scrollbar->SetScrollLayerById(2);
1295 1321
1296 scroll->AddChild(contents.Pass()); 1322 scroll->AddChild(contents.Pass());
1297 root->AddChild(scroll.Pass()); 1323 root->AddChild(scroll.Pass());
1298 root->AddChild(scrollbar.PassAs<LayerImpl>()); 1324 root->AddChild(scrollbar.PassAs<LayerImpl>());
1299 1325
1300 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1326 host_impl_->active_tree()->SetRootLayer(root.Pass());
1327 host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID);
1301 host_impl_->active_tree()->DidBecomeActive(); 1328 host_impl_->active_tree()->DidBecomeActive();
1302 DrawFrame(); 1329 DrawFrame();
1303 1330
1304 LayerImpl* root_scroll = host_impl_->active_tree()->RootScrollLayer(); 1331 LayerImpl* root_scroll =
1332 host_impl_->active_tree()->InnerViewportScrollLayer();
1305 ASSERT_TRUE(root_scroll->scrollbar_animation_controller()); 1333 ASSERT_TRUE(root_scroll->scrollbar_animation_controller());
1306 ScrollbarAnimationControllerThinning* scrollbar_animation_controller = 1334 ScrollbarAnimationControllerThinning* scrollbar_animation_controller =
1307 static_cast<ScrollbarAnimationControllerThinning*>( 1335 static_cast<ScrollbarAnimationControllerThinning*>(
1308 root_scroll->scrollbar_animation_controller()); 1336 root_scroll->scrollbar_animation_controller());
1309 scrollbar_animation_controller->set_mouse_move_distance_for_test(100.f); 1337 scrollbar_animation_controller->set_mouse_move_distance_for_test(100.f);
1310 1338
1311 host_impl_->MouseMoveAt(gfx::Point(1, 1)); 1339 host_impl_->MouseMoveAt(gfx::Point(1, 1));
1312 EXPECT_FALSE(scrollbar_animation_controller->mouse_is_near_scrollbar()); 1340 EXPECT_FALSE(scrollbar_animation_controller->mouse_is_near_scrollbar());
1313 1341
1314 host_impl_->MouseMoveAt(gfx::Point(200, 50)); 1342 host_impl_->MouseMoveAt(gfx::Point(200, 50));
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
1742 true, 1770 true,
1743 host_impl_->resource_provider())); 1771 host_impl_->resource_provider()));
1744 1772
1745 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 1773 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
1746 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); 1774 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1747 host_impl_->DidDrawAllLayers(frame); 1775 host_impl_->DidDrawAllLayers(frame);
1748 } 1776 }
1749 1777
1750 TEST_F(LayerTreeHostImplTest, ScrollRootIgnored) { 1778 TEST_F(LayerTreeHostImplTest, ScrollRootIgnored) {
1751 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 1779 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
1752 root->SetScrollable(false); 1780 root->SetScrollClipLayer(Layer::INVALID_ID);
1753 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1781 host_impl_->active_tree()->SetRootLayer(root.Pass());
1754 DrawFrame(); 1782 DrawFrame();
1755 1783
1756 // Scroll event is ignored because layer is not scrollable. 1784 // Scroll event is ignored because layer is not scrollable.
1757 EXPECT_EQ(InputHandler::ScrollIgnored, 1785 EXPECT_EQ(InputHandler::ScrollIgnored,
1758 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel)); 1786 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel));
1759 EXPECT_FALSE(did_request_redraw_); 1787 EXPECT_FALSE(did_request_redraw_);
1760 EXPECT_FALSE(did_request_commit_); 1788 EXPECT_FALSE(did_request_commit_);
1761 } 1789 }
1762 1790
1763 TEST_F(LayerTreeHostImplTest, ScrollNonScrollableRootWithTopControls) { 1791 TEST_F(LayerTreeHostImplTest, ScrollNonScrollableRootWithTopControls) {
1764 LayerTreeSettings settings; 1792 LayerTreeSettings settings;
1765 settings.calculate_top_controls_position = true; 1793 settings.calculate_top_controls_position = true;
1766 settings.top_controls_height = 50; 1794 settings.top_controls_height = 50;
1767 1795
1768 CreateHostImpl(settings, CreateOutputSurface()); 1796 CreateHostImpl(settings, CreateOutputSurface());
1769 1797
1770 gfx::Size layer_size(5, 5); 1798 gfx::Size layer_size(10, 10);
1799 gfx::Size clip_size(5, 5);
1771 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 1800 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
1772 root->SetScrollable(true); 1801 scoped_ptr<LayerImpl> root_clip =
1773 root->SetMaxScrollOffset(gfx::Vector2d(layer_size.width(), 1802 LayerImpl::Create(host_impl_->active_tree(), 2);
1774 layer_size.height())); 1803 root_clip->SetBounds(clip_size);
1804 root->SetScrollClipLayer(root_clip->id());
1775 root->SetBounds(layer_size); 1805 root->SetBounds(layer_size);
1776 root->SetContentBounds(layer_size); 1806 root->SetContentBounds(layer_size);
1777 root->SetPosition(gfx::PointF()); 1807 root->SetPosition(gfx::PointF());
1778 root->SetAnchorPoint(gfx::PointF()); 1808 root->SetAnchorPoint(gfx::PointF());
1779 root->SetDrawsContent(false); 1809 root->SetDrawsContent(false);
1780 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1810 int root_id = root->id();
1781 host_impl_->active_tree()->FindRootScrollLayer(); 1811 root_clip->AddChild(root.Pass());
1812 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
1813 host_impl_->active_tree()->SetViewportLayersFromIds(
1814 root_id, root_id, Layer::INVALID_ID);
1782 DrawFrame(); 1815 DrawFrame();
1783 1816
1784 EXPECT_EQ(InputHandler::ScrollStarted, 1817 EXPECT_EQ(InputHandler::ScrollStarted,
1785 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture)); 1818 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture));
1786 1819
1787 host_impl_->top_controls_manager()->ScrollBegin(); 1820 host_impl_->top_controls_manager()->ScrollBegin();
1788 host_impl_->top_controls_manager()->ScrollBy(gfx::Vector2dF(0.f, 50.f)); 1821 host_impl_->top_controls_manager()->ScrollBy(gfx::Vector2dF(0.f, 50.f));
1789 host_impl_->top_controls_manager()->ScrollEnd(); 1822 host_impl_->top_controls_manager()->ScrollEnd();
1790 EXPECT_EQ(host_impl_->top_controls_manager()->content_top_offset(), 0.f); 1823 EXPECT_EQ(host_impl_->top_controls_manager()->content_top_offset(), 0.f);
1791 1824
1792 host_impl_->ScrollEnd(); 1825 host_impl_->ScrollEnd();
1793 1826
1794 EXPECT_EQ(InputHandler::ScrollStarted, 1827 EXPECT_EQ(InputHandler::ScrollStarted,
1795 host_impl_->ScrollBegin(gfx::Point(), 1828 host_impl_->ScrollBegin(gfx::Point(),
1796 InputHandler::Gesture)); 1829 InputHandler::Gesture));
1797 } 1830 }
1798 1831
1799 TEST_F(LayerTreeHostImplTest, ScrollNonCompositedRoot) { 1832 TEST_F(LayerTreeHostImplTest, ScrollNonCompositedRoot) {
1800 // Test the configuration where a non-composited root layer is embedded in a 1833 // Test the configuration where a non-composited root layer is embedded in a
1801 // scrollable outer layer. 1834 // scrollable outer layer.
1802 gfx::Size surface_size(10, 10); 1835 gfx::Size surface_size(10, 10);
1836 gfx::Size contents_size(20, 20);
1803 1837
1804 scoped_ptr<LayerImpl> content_layer = 1838 scoped_ptr<LayerImpl> content_layer =
1805 LayerImpl::Create(host_impl_->active_tree(), 1); 1839 LayerImpl::Create(host_impl_->active_tree(), 1);
1806 content_layer->SetDrawsContent(true); 1840 content_layer->SetDrawsContent(true);
1807 content_layer->SetPosition(gfx::PointF()); 1841 content_layer->SetPosition(gfx::PointF());
1808 content_layer->SetAnchorPoint(gfx::PointF()); 1842 content_layer->SetAnchorPoint(gfx::PointF());
1809 content_layer->SetBounds(surface_size); 1843 content_layer->SetBounds(contents_size);
1810 content_layer->SetContentBounds(gfx::Size(surface_size.width() * 2, 1844 content_layer->SetContentBounds(contents_size);
1811 surface_size.height() * 2));
1812 content_layer->SetContentsScale(2.f, 2.f); 1845 content_layer->SetContentsScale(2.f, 2.f);
1813 1846
1847 scoped_ptr<LayerImpl> scroll_clip_layer =
1848 LayerImpl::Create(host_impl_->active_tree(), 3);
1849 scroll_clip_layer->SetBounds(surface_size);
1850
1814 scoped_ptr<LayerImpl> scroll_layer = 1851 scoped_ptr<LayerImpl> scroll_layer =
1815 LayerImpl::Create(host_impl_->active_tree(), 2); 1852 LayerImpl::Create(host_impl_->active_tree(), 2);
1816 scroll_layer->SetScrollable(true); 1853 scroll_layer->SetScrollClipLayer(3);
1817 scroll_layer->SetMaxScrollOffset(gfx::Vector2d(surface_size.width(), 1854 scroll_layer->SetBounds(contents_size);
1818 surface_size.height())); 1855 scroll_layer->SetContentBounds(contents_size);
1819 scroll_layer->SetBounds(surface_size);
1820 scroll_layer->SetContentBounds(surface_size);
1821 scroll_layer->SetPosition(gfx::PointF()); 1856 scroll_layer->SetPosition(gfx::PointF());
1822 scroll_layer->SetAnchorPoint(gfx::PointF()); 1857 scroll_layer->SetAnchorPoint(gfx::PointF());
1823 scroll_layer->AddChild(content_layer.Pass()); 1858 scroll_layer->AddChild(content_layer.Pass());
1859 scroll_clip_layer->AddChild(scroll_layer.Pass());
1824 1860
1825 host_impl_->active_tree()->SetRootLayer(scroll_layer.Pass()); 1861 host_impl_->active_tree()->SetRootLayer(scroll_clip_layer.Pass());
1826 host_impl_->SetViewportSize(surface_size); 1862 host_impl_->SetViewportSize(surface_size);
1827 DrawFrame(); 1863 DrawFrame();
1828 1864
1829 EXPECT_EQ(InputHandler::ScrollStarted, 1865 EXPECT_EQ(InputHandler::ScrollStarted,
1830 host_impl_->ScrollBegin(gfx::Point(5, 5), 1866 host_impl_->ScrollBegin(gfx::Point(5, 5),
1831 InputHandler::Wheel)); 1867 InputHandler::Wheel));
1832 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10)); 1868 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10));
1833 host_impl_->ScrollEnd(); 1869 host_impl_->ScrollEnd();
1834 EXPECT_TRUE(did_request_redraw_); 1870 EXPECT_TRUE(did_request_redraw_);
1835 EXPECT_TRUE(did_request_commit_); 1871 EXPECT_TRUE(did_request_commit_);
1836 } 1872 }
1837 1873
1838 TEST_F(LayerTreeHostImplTest, ScrollChildCallsCommitAndRedraw) { 1874 TEST_F(LayerTreeHostImplTest, ScrollChildCallsCommitAndRedraw) {
1839 gfx::Size surface_size(10, 10); 1875 gfx::Size surface_size(10, 10);
1876 gfx::Size contents_size(20, 20);
1840 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 1877 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
1841 root->SetBounds(surface_size); 1878 root->SetBounds(surface_size);
1842 root->SetContentBounds(surface_size); 1879 root->SetContentBounds(contents_size);
1843 root->AddChild(CreateScrollableLayer(2, surface_size)); 1880 root->AddChild(CreateScrollableLayer(2, contents_size, root.get()));
1844 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1881 host_impl_->active_tree()->SetRootLayer(root.Pass());
1845 host_impl_->SetViewportSize(surface_size); 1882 host_impl_->SetViewportSize(surface_size);
1846 DrawFrame(); 1883 DrawFrame();
1847 1884
1848 EXPECT_EQ(InputHandler::ScrollStarted, 1885 EXPECT_EQ(InputHandler::ScrollStarted,
1849 host_impl_->ScrollBegin(gfx::Point(5, 5), 1886 host_impl_->ScrollBegin(gfx::Point(5, 5),
1850 InputHandler::Wheel)); 1887 InputHandler::Wheel));
1851 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10)); 1888 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10));
1852 host_impl_->ScrollEnd(); 1889 host_impl_->ScrollEnd();
1853 EXPECT_TRUE(did_request_redraw_); 1890 EXPECT_TRUE(did_request_redraw_);
1854 EXPECT_TRUE(did_request_commit_); 1891 EXPECT_TRUE(did_request_commit_);
1855 } 1892 }
1856 1893
1857 TEST_F(LayerTreeHostImplTest, ScrollMissesChild) { 1894 TEST_F(LayerTreeHostImplTest, ScrollMissesChild) {
1858 gfx::Size surface_size(10, 10); 1895 gfx::Size surface_size(10, 10);
1859 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 1896 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
1860 root->AddChild(CreateScrollableLayer(2, surface_size)); 1897 root->AddChild(CreateScrollableLayer(2, surface_size, root.get()));
1861 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1898 host_impl_->active_tree()->SetRootLayer(root.Pass());
1862 host_impl_->SetViewportSize(surface_size); 1899 host_impl_->SetViewportSize(surface_size);
1863 DrawFrame(); 1900 DrawFrame();
1864 1901
1865 // Scroll event is ignored because the input coordinate is outside the layer 1902 // Scroll event is ignored because the input coordinate is outside the layer
1866 // boundaries. 1903 // boundaries.
1867 EXPECT_EQ(InputHandler::ScrollIgnored, 1904 EXPECT_EQ(InputHandler::ScrollIgnored,
1868 host_impl_->ScrollBegin(gfx::Point(15, 5), 1905 host_impl_->ScrollBegin(gfx::Point(15, 5),
1869 InputHandler::Wheel)); 1906 InputHandler::Wheel));
1870 EXPECT_FALSE(did_request_redraw_); 1907 EXPECT_FALSE(did_request_redraw_);
1871 EXPECT_FALSE(did_request_commit_); 1908 EXPECT_FALSE(did_request_commit_);
1872 } 1909 }
1873 1910
1874 TEST_F(LayerTreeHostImplTest, ScrollMissesBackfacingChild) { 1911 TEST_F(LayerTreeHostImplTest, ScrollMissesBackfacingChild) {
1875 gfx::Size surface_size(10, 10); 1912 gfx::Size surface_size(10, 10);
1876 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 1913 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
1877 scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, surface_size); 1914 scoped_ptr<LayerImpl> child =
1915 CreateScrollableLayer(2, surface_size, root.get());
1878 host_impl_->SetViewportSize(surface_size); 1916 host_impl_->SetViewportSize(surface_size);
1879 1917
1880 gfx::Transform matrix; 1918 gfx::Transform matrix;
1881 matrix.RotateAboutXAxis(180.0); 1919 matrix.RotateAboutXAxis(180.0);
1882 child->SetTransform(matrix); 1920 child->SetTransform(matrix);
1883 child->SetDoubleSided(false); 1921 child->SetDoubleSided(false);
1884 1922
1885 root->AddChild(child.Pass()); 1923 root->AddChild(child.Pass());
1886 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1924 host_impl_->active_tree()->SetRootLayer(root.Pass());
1887 DrawFrame(); 1925 DrawFrame();
1888 1926
1889 // Scroll event is ignored because the scrollable layer is not facing the 1927 // Scroll event is ignored because the scrollable layer is not facing the
1890 // viewer and there is nothing scrollable behind it. 1928 // viewer and there is nothing scrollable behind it.
1891 EXPECT_EQ(InputHandler::ScrollIgnored, 1929 EXPECT_EQ(InputHandler::ScrollIgnored,
1892 host_impl_->ScrollBegin(gfx::Point(5, 5), 1930 host_impl_->ScrollBegin(gfx::Point(5, 5),
1893 InputHandler::Wheel)); 1931 InputHandler::Wheel));
1894 EXPECT_FALSE(did_request_redraw_); 1932 EXPECT_FALSE(did_request_redraw_);
1895 EXPECT_FALSE(did_request_commit_); 1933 EXPECT_FALSE(did_request_commit_);
1896 } 1934 }
1897 1935
1898 TEST_F(LayerTreeHostImplTest, ScrollBlockedByContentLayer) { 1936 TEST_F(LayerTreeHostImplTest, ScrollBlockedByContentLayer) {
1899 gfx::Size surface_size(10, 10); 1937 gfx::Size surface_size(10, 10);
1900 scoped_ptr<LayerImpl> content_layer = CreateScrollableLayer(1, surface_size); 1938 scoped_ptr<LayerImpl> clip_layer =
1939 LayerImpl::Create(host_impl_->active_tree(), 3);
1940 scoped_ptr<LayerImpl> content_layer =
1941 CreateScrollableLayer(1, surface_size, clip_layer.get());
1901 content_layer->SetShouldScrollOnMainThread(true); 1942 content_layer->SetShouldScrollOnMainThread(true);
1902 content_layer->SetScrollable(false); 1943 content_layer->SetScrollClipLayer(Layer::INVALID_ID);
1903 1944
1904 scoped_ptr<LayerImpl> scroll_layer = CreateScrollableLayer(2, surface_size); 1945 // Note: we can use the same clip layer for both since both calls to
1946 // CreateScrollableLayer() use the same surface size.
1947 scoped_ptr<LayerImpl> scroll_layer =
1948 CreateScrollableLayer(2, surface_size, clip_layer.get());
1905 scroll_layer->AddChild(content_layer.Pass()); 1949 scroll_layer->AddChild(content_layer.Pass());
1950 clip_layer->AddChild(scroll_layer.Pass());
1906 1951
1907 host_impl_->active_tree()->SetRootLayer(scroll_layer.Pass()); 1952 host_impl_->active_tree()->SetRootLayer(clip_layer.Pass());
1908 host_impl_->SetViewportSize(surface_size); 1953 host_impl_->SetViewportSize(surface_size);
1909 DrawFrame(); 1954 DrawFrame();
1910 1955
1911 // Scrolling fails because the content layer is asking to be scrolled on the 1956 // Scrolling fails because the content layer is asking to be scrolled on the
1912 // main thread. 1957 // main thread.
1913 EXPECT_EQ(InputHandler::ScrollOnMainThread, 1958 EXPECT_EQ(InputHandler::ScrollOnMainThread,
1914 host_impl_->ScrollBegin(gfx::Point(5, 5), 1959 host_impl_->ScrollBegin(gfx::Point(5, 5),
1915 InputHandler::Wheel)); 1960 InputHandler::Wheel));
1916 } 1961 }
1917 1962
1918 TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) { 1963 TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) {
1919 gfx::Size surface_size(10, 10); 1964 gfx::Size surface_size(20, 20);
1920 float page_scale = 2.f; 1965 float page_scale = 2.f;
1921 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 1966 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
1922 scoped_ptr<LayerImpl> root_scrolling = CreateScrollableLayer(2, surface_size); 1967 scoped_ptr<LayerImpl> root_clip =
1923 root->AddChild(root_scrolling.Pass()); 1968 LayerImpl::Create(host_impl_->active_tree(), 2);
1969 scoped_ptr<LayerImpl> root_scrolling =
1970 CreateScrollableLayer(3, surface_size, root_clip.get());
1971 root_scrolling->SetIsContainerForFixedPositionLayers(true);
1972 root_clip->AddChild(root_scrolling.Pass());
1973 root->AddChild(root_clip.Pass());
1924 host_impl_->active_tree()->SetRootLayer(root.Pass()); 1974 host_impl_->active_tree()->SetRootLayer(root.Pass());
1975 // The behaviour in this test assumes the page scale is applied at a layer
1976 // above the clip layer.
1977 host_impl_->active_tree()->SetViewportLayersFromIds(1, 3, Layer::INVALID_ID);
1925 host_impl_->active_tree()->DidBecomeActive(); 1978 host_impl_->active_tree()->DidBecomeActive();
1926 host_impl_->SetViewportSize(surface_size); 1979 host_impl_->SetViewportSize(surface_size);
1927 DrawFrame(); 1980 DrawFrame();
1928 1981
1929 LayerImpl* root_scroll = host_impl_->active_tree()->RootScrollLayer(); 1982 LayerImpl* root_scroll =
1983 host_impl_->active_tree()->InnerViewportScrollLayer();
1930 1984
1931 gfx::Vector2d scroll_delta(0, 10); 1985 gfx::Vector2d scroll_delta(0, 10);
1932 gfx::Vector2d expected_scroll_delta = scroll_delta; 1986 gfx::Vector2d expected_scroll_delta = scroll_delta;
1933 gfx::Vector2d expected_max_scroll = root_scroll->max_scroll_offset(); 1987 gfx::Vector2d expected_max_scroll = root_scroll->MaxScrollOffset();
1934 EXPECT_EQ(InputHandler::ScrollStarted, 1988 EXPECT_EQ(InputHandler::ScrollStarted,
1935 host_impl_->ScrollBegin(gfx::Point(5, 5), 1989 host_impl_->ScrollBegin(gfx::Point(5, 5),
1936 InputHandler::Wheel)); 1990 InputHandler::Wheel));
1937 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 1991 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
1938 host_impl_->ScrollEnd(); 1992 host_impl_->ScrollEnd();
1939 1993
1940 // Set new page scale from main thread. 1994 // Set new page scale from main thread.
1941 host_impl_->active_tree()->SetPageScaleFactorAndLimits(page_scale, 1995 host_impl_->active_tree()->SetPageScaleFactorAndLimits(page_scale,
1942 page_scale, 1996 page_scale,
1943 page_scale); 1997 page_scale);
1944 1998
1945 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); 1999 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas();
1946 ExpectContains(*scroll_info.get(), root_scroll->id(), expected_scroll_delta); 2000 ExpectContains(*scroll_info.get(), root_scroll->id(), expected_scroll_delta);
1947 2001
1948 // The scroll range should also have been updated. 2002 // The scroll range should also have been updated.
1949 EXPECT_EQ(expected_max_scroll, root_scroll->max_scroll_offset()); 2003 EXPECT_EQ(expected_max_scroll, root_scroll->MaxScrollOffset());
1950 2004
1951 // The page scale delta remains constant because the impl thread did not 2005 // The page scale delta remains constant because the impl thread did not
1952 // scale. 2006 // scale.
1953 EXPECT_EQ(1.f, host_impl_->active_tree()->page_scale_delta()); 2007 EXPECT_EQ(1.f, host_impl_->active_tree()->page_scale_delta());
1954 } 2008 }
1955 2009
1956 TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnImplThread) { 2010 TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnImplThread) {
1957 gfx::Size surface_size(10, 10); 2011 gfx::Size surface_size(20, 20);
1958 float page_scale = 2.f; 2012 float page_scale = 2.f;
1959 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 2013 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
1960 scoped_ptr<LayerImpl> root_scrolling = CreateScrollableLayer(2, surface_size); 2014 scoped_ptr<LayerImpl> root_clip =
1961 root->AddChild(root_scrolling.Pass()); 2015 LayerImpl::Create(host_impl_->active_tree(), 2);
2016 scoped_ptr<LayerImpl> root_scrolling =
2017 CreateScrollableLayer(3, surface_size, root_clip.get());
2018 root_scrolling->SetIsContainerForFixedPositionLayers(true);
2019 root_clip->AddChild(root_scrolling.Pass());
2020 root->AddChild(root_clip.Pass());
1962 host_impl_->active_tree()->SetRootLayer(root.Pass()); 2021 host_impl_->active_tree()->SetRootLayer(root.Pass());
2022 // The behaviour in this test assumes the page scale is applied at a layer
2023 // above the clip layer.
2024 host_impl_->active_tree()->SetViewportLayersFromIds(1, 3, Layer::INVALID_ID);
1963 host_impl_->active_tree()->DidBecomeActive(); 2025 host_impl_->active_tree()->DidBecomeActive();
1964 host_impl_->SetViewportSize(surface_size); 2026 host_impl_->SetViewportSize(surface_size);
1965 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 1.f, page_scale); 2027 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 1.f, page_scale);
1966 DrawFrame(); 2028 DrawFrame();
1967 2029
1968 LayerImpl* root_scroll = host_impl_->active_tree()->RootScrollLayer(); 2030 LayerImpl* root_scroll =
2031 host_impl_->active_tree()->InnerViewportScrollLayer();
1969 2032
1970 gfx::Vector2d scroll_delta(0, 10); 2033 gfx::Vector2d scroll_delta(0, 10);
1971 gfx::Vector2d expected_scroll_delta = scroll_delta; 2034 gfx::Vector2d expected_scroll_delta = scroll_delta;
1972 gfx::Vector2d expected_max_scroll = root_scroll->max_scroll_offset(); 2035 gfx::Vector2d expected_max_scroll = root_scroll->MaxScrollOffset();
1973 EXPECT_EQ(InputHandler::ScrollStarted, 2036 EXPECT_EQ(InputHandler::ScrollStarted,
1974 host_impl_->ScrollBegin(gfx::Point(5, 5), 2037 host_impl_->ScrollBegin(gfx::Point(5, 5),
1975 InputHandler::Wheel)); 2038 InputHandler::Wheel));
1976 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2039 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
1977 host_impl_->ScrollEnd(); 2040 host_impl_->ScrollEnd();
1978 2041
1979 // Set new page scale on impl thread by pinching. 2042 // Set new page scale on impl thread by pinching.
1980 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture); 2043 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture);
1981 host_impl_->PinchGestureBegin(); 2044 host_impl_->PinchGestureBegin();
1982 host_impl_->PinchGestureUpdate(page_scale, gfx::Point()); 2045 host_impl_->PinchGestureUpdate(page_scale, gfx::Point());
1983 host_impl_->PinchGestureEnd(); 2046 host_impl_->PinchGestureEnd();
1984 host_impl_->ScrollEnd(); 2047 host_impl_->ScrollEnd();
1985 DrawOneFrame(); 2048 DrawOneFrame();
1986 2049
1987 // The scroll delta is not scaled because the main thread did not scale. 2050 // The scroll delta is not scaled because the main thread did not scale.
1988 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); 2051 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas();
1989 ExpectContains(*scroll_info.get(), root_scroll->id(), expected_scroll_delta); 2052 ExpectContains(*scroll_info.get(), root_scroll->id(), expected_scroll_delta);
1990 2053
1991 // The scroll range should also have been updated. 2054 // The scroll range should also have been updated.
1992 EXPECT_EQ(expected_max_scroll, root_scroll->max_scroll_offset()); 2055 EXPECT_EQ(expected_max_scroll, root_scroll->MaxScrollOffset());
1993 2056
1994 // The page scale delta should match the new scale on the impl side. 2057 // The page scale delta should match the new scale on the impl side.
1995 EXPECT_EQ(page_scale, host_impl_->active_tree()->total_page_scale_factor()); 2058 EXPECT_EQ(page_scale, host_impl_->active_tree()->total_page_scale_factor());
1996 } 2059 }
1997 2060
1998 TEST_F(LayerTreeHostImplTest, PageScaleDeltaAppliedToRootScrollLayerOnly) { 2061 TEST_F(LayerTreeHostImplTest, PageScaleDeltaAppliedToRootScrollLayerOnly) {
1999 gfx::Size surface_size(10, 10); 2062 gfx::Size surface_size(10, 10);
2000 float default_page_scale = 1.f; 2063 float default_page_scale = 1.f;
2001 gfx::Transform default_page_scale_matrix; 2064 gfx::Transform default_page_scale_matrix;
2002 default_page_scale_matrix.Scale(default_page_scale, default_page_scale); 2065 default_page_scale_matrix.Scale(default_page_scale, default_page_scale);
2003 2066
2004 float new_page_scale = 2.f; 2067 float new_page_scale = 2.f;
2005 gfx::Transform new_page_scale_matrix; 2068 gfx::Transform new_page_scale_matrix;
2006 new_page_scale_matrix.Scale(new_page_scale, new_page_scale); 2069 new_page_scale_matrix.Scale(new_page_scale, new_page_scale);
2007 2070
2008 // Create a normal scrollable root layer and another scrollable child layer. 2071 // Create a normal scrollable root layer and another scrollable child layer.
2009 LayerImpl* scroll = SetupScrollAndContentsLayers(surface_size); 2072 LayerImpl* scroll = SetupScrollAndContentsLayers(surface_size);
2010 LayerImpl* root = host_impl_->active_tree()->root_layer(); 2073 LayerImpl* root = host_impl_->active_tree()->root_layer();
2011 LayerImpl* child = scroll->children()[0]; 2074 LayerImpl* child = scroll->children()[0];
2012 2075
2076 scoped_ptr<LayerImpl> scrollable_child_clip =
2077 LayerImpl::Create(host_impl_->active_tree(), 6);
2013 scoped_ptr<LayerImpl> scrollable_child = 2078 scoped_ptr<LayerImpl> scrollable_child =
2014 CreateScrollableLayer(4, surface_size); 2079 CreateScrollableLayer(7, surface_size, scrollable_child_clip.get());
2015 child->AddChild(scrollable_child.Pass()); 2080 scrollable_child_clip->AddChild(scrollable_child.Pass());
2081 child->AddChild(scrollable_child_clip.Pass());
2016 LayerImpl* grand_child = child->children()[0]; 2082 LayerImpl* grand_child = child->children()[0];
2017 2083
2018 // Set new page scale on impl thread by pinching. 2084 // Set new page scale on impl thread by pinching.
2019 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture); 2085 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture);
2020 host_impl_->PinchGestureBegin(); 2086 host_impl_->PinchGestureBegin();
2021 host_impl_->PinchGestureUpdate(new_page_scale, gfx::Point()); 2087 host_impl_->PinchGestureUpdate(new_page_scale, gfx::Point());
2022 host_impl_->PinchGestureEnd(); 2088 host_impl_->PinchGestureEnd();
2023 host_impl_->ScrollEnd(); 2089 host_impl_->ScrollEnd();
2024 DrawOneFrame(); 2090 DrawOneFrame();
2025 2091
(...skipping 19 matching lines...) Expand all
2045 EXPECT_EQ(new_page_scale, scroll->draw_transform().matrix().getDouble(1, 1)); 2111 EXPECT_EQ(new_page_scale, scroll->draw_transform().matrix().getDouble(1, 1));
2046 EXPECT_EQ(new_page_scale, child->draw_transform().matrix().getDouble(0, 0)); 2112 EXPECT_EQ(new_page_scale, child->draw_transform().matrix().getDouble(0, 0));
2047 EXPECT_EQ(new_page_scale, child->draw_transform().matrix().getDouble(1, 1)); 2113 EXPECT_EQ(new_page_scale, child->draw_transform().matrix().getDouble(1, 1));
2048 EXPECT_EQ(new_page_scale, 2114 EXPECT_EQ(new_page_scale,
2049 grand_child->draw_transform().matrix().getDouble(0, 0)); 2115 grand_child->draw_transform().matrix().getDouble(0, 0));
2050 EXPECT_EQ(new_page_scale, 2116 EXPECT_EQ(new_page_scale,
2051 grand_child->draw_transform().matrix().getDouble(1, 1)); 2117 grand_child->draw_transform().matrix().getDouble(1, 1));
2052 } 2118 }
2053 2119
2054 TEST_F(LayerTreeHostImplTest, ScrollChildAndChangePageScaleOnMainThread) { 2120 TEST_F(LayerTreeHostImplTest, ScrollChildAndChangePageScaleOnMainThread) {
2055 gfx::Size surface_size(10, 10); 2121 gfx::Size surface_size(30, 30);
2056 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 2122 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
2123 root->SetBounds(gfx::Size(5, 5));
2057 scoped_ptr<LayerImpl> root_scrolling = 2124 scoped_ptr<LayerImpl> root_scrolling =
2058 LayerImpl::Create(host_impl_->active_tree(), 2); 2125 LayerImpl::Create(host_impl_->active_tree(), 2);
2059 root_scrolling->SetBounds(surface_size); 2126 root_scrolling->SetBounds(surface_size);
2060 root_scrolling->SetContentBounds(surface_size); 2127 root_scrolling->SetContentBounds(surface_size);
2061 root_scrolling->SetScrollable(true); 2128 root_scrolling->SetScrollClipLayer(root->id());
2129 root_scrolling->SetIsContainerForFixedPositionLayers(true);
2130 LayerImpl* root_scrolling_ptr = root_scrolling.get();
2062 root->AddChild(root_scrolling.Pass()); 2131 root->AddChild(root_scrolling.Pass());
2063 int child_scroll_layer_id = 3; 2132 int child_scroll_layer_id = 3;
2064 scoped_ptr<LayerImpl> child_scrolling = 2133 scoped_ptr<LayerImpl> child_scrolling = CreateScrollableLayer(
2065 CreateScrollableLayer(child_scroll_layer_id, surface_size); 2134 child_scroll_layer_id, surface_size, root_scrolling_ptr);
2066 LayerImpl* child = child_scrolling.get(); 2135 LayerImpl* child = child_scrolling.get();
2067 root->AddChild(child_scrolling.Pass()); 2136 root_scrolling_ptr->AddChild(child_scrolling.Pass());
2068 host_impl_->active_tree()->SetRootLayer(root.Pass()); 2137 host_impl_->active_tree()->SetRootLayer(root.Pass());
2138 host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID);
2069 host_impl_->active_tree()->DidBecomeActive(); 2139 host_impl_->active_tree()->DidBecomeActive();
2070 host_impl_->SetViewportSize(surface_size); 2140 host_impl_->SetViewportSize(surface_size);
2071 DrawFrame(); 2141 DrawFrame();
2072 2142
2073 gfx::Vector2d scroll_delta(0, 10); 2143 gfx::Vector2d scroll_delta(0, 10);
2074 gfx::Vector2d expected_scroll_delta(scroll_delta); 2144 gfx::Vector2d expected_scroll_delta(scroll_delta);
2075 gfx::Vector2d expected_max_scroll(child->max_scroll_offset()); 2145 gfx::Vector2d expected_max_scroll(child->MaxScrollOffset());
2076 EXPECT_EQ(InputHandler::ScrollStarted, 2146 EXPECT_EQ(InputHandler::ScrollStarted,
2077 host_impl_->ScrollBegin(gfx::Point(5, 5), 2147 host_impl_->ScrollBegin(gfx::Point(5, 5),
2078 InputHandler::Wheel)); 2148 InputHandler::Wheel));
2079 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2149 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2080 host_impl_->ScrollEnd(); 2150 host_impl_->ScrollEnd();
2081 2151
2082 float page_scale = 2.f; 2152 float page_scale = 2.f;
2083 host_impl_->active_tree()->SetPageScaleFactorAndLimits(page_scale, 2153 host_impl_->active_tree()->SetPageScaleFactorAndLimits(page_scale,
2084 1.f, 2154 1.f,
2085 page_scale); 2155 page_scale);
2086 2156
2087 DrawOneFrame(); 2157 DrawOneFrame();
2088 2158
2089 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); 2159 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas();
2090 ExpectContains( 2160 ExpectContains(
2091 *scroll_info.get(), child_scroll_layer_id, expected_scroll_delta); 2161 *scroll_info.get(), child_scroll_layer_id, expected_scroll_delta);
2092 2162
2093 // The scroll range should not have changed. 2163 // The scroll range should not have changed.
2094 EXPECT_EQ(child->max_scroll_offset(), expected_max_scroll); 2164 EXPECT_EQ(child->MaxScrollOffset(), expected_max_scroll);
2095 2165
2096 // The page scale delta remains constant because the impl thread did not 2166 // The page scale delta remains constant because the impl thread did not
2097 // scale. 2167 // scale.
2098 EXPECT_EQ(1.f, host_impl_->active_tree()->page_scale_delta()); 2168 EXPECT_EQ(1.f, host_impl_->active_tree()->page_scale_delta());
2099 } 2169 }
2100 2170
2101 TEST_F(LayerTreeHostImplTest, ScrollChildBeyondLimit) { 2171 TEST_F(LayerTreeHostImplTest, ScrollChildBeyondLimit) {
2102 // Scroll a child layer beyond its maximum scroll range and make sure the 2172 // Scroll a child layer beyond its maximum scroll range and make sure the
2103 // parent layer is scrolled on the axis on which the child was unable to 2173 // parent layer is scrolled on the axis on which the child was unable to
2104 // scroll. 2174 // scroll.
2105 gfx::Size surface_size(10, 10); 2175 gfx::Size surface_size(10, 10);
2106 scoped_ptr<LayerImpl> root = CreateScrollableLayer(1, surface_size); 2176 gfx::Size content_size(20, 20);
2177 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
2178 root->SetBounds(surface_size);
2107 2179
2108 scoped_ptr<LayerImpl> grand_child = CreateScrollableLayer(3, surface_size); 2180 scoped_ptr<LayerImpl> grand_child =
2109 grand_child->SetScrollOffset(gfx::Vector2d(0, 5)); 2181 CreateScrollableLayer(3, content_size, root.get());
2110 2182
2111 scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, surface_size); 2183 scoped_ptr<LayerImpl> child =
2112 child->SetScrollOffset(gfx::Vector2d(3, 0)); 2184 CreateScrollableLayer(2, content_size, root.get());
2185 LayerImpl* grand_child_layer = grand_child.get();
2113 child->AddChild(grand_child.Pass()); 2186 child->AddChild(grand_child.Pass());
2114 2187
2188 LayerImpl* child_layer = child.get();
2115 root->AddChild(child.Pass()); 2189 root->AddChild(child.Pass());
2116 host_impl_->active_tree()->SetRootLayer(root.Pass()); 2190 host_impl_->active_tree()->SetRootLayer(root.Pass());
2117 host_impl_->active_tree()->DidBecomeActive(); 2191 host_impl_->active_tree()->DidBecomeActive();
2118 host_impl_->SetViewportSize(surface_size); 2192 host_impl_->SetViewportSize(surface_size);
2193 grand_child_layer->SetScrollOffset(gfx::Vector2d(0, 5));
2194 child_layer->SetScrollOffset(gfx::Vector2d(3, 0));
2195
2119 DrawFrame(); 2196 DrawFrame();
2120 { 2197 {
2121 gfx::Vector2d scroll_delta(-8, -7); 2198 gfx::Vector2d scroll_delta(-8, -7);
2122 EXPECT_EQ(InputHandler::ScrollStarted, 2199 EXPECT_EQ(InputHandler::ScrollStarted,
2123 host_impl_->ScrollBegin(gfx::Point(), 2200 host_impl_->ScrollBegin(gfx::Point(),
2124 InputHandler::Wheel)); 2201 InputHandler::Wheel));
2125 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2202 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2126 host_impl_->ScrollEnd(); 2203 host_impl_->ScrollEnd();
2127 2204
2128 scoped_ptr<ScrollAndScaleSet> scroll_info = 2205 scoped_ptr<ScrollAndScaleSet> scroll_info =
2129 host_impl_->ProcessScrollDeltas(); 2206 host_impl_->ProcessScrollDeltas();
2130 2207
2131 // The grand child should have scrolled up to its limit. 2208 // The grand child should have scrolled up to its limit.
2132 LayerImpl* child = host_impl_->active_tree()->root_layer()->children()[0]; 2209 LayerImpl* child = host_impl_->active_tree()->root_layer()->children()[0];
2133 LayerImpl* grand_child = child->children()[0]; 2210 LayerImpl* grand_child = child->children()[0];
2134 ExpectContains(*scroll_info.get(), grand_child->id(), gfx::Vector2d(0, -5)); 2211 ExpectContains(*scroll_info.get(), grand_child->id(), gfx::Vector2d(0, -5));
2135 2212
2136 // The child should have only scrolled on the other axis. 2213 // The child should have only scrolled on the other axis.
2137 ExpectContains(*scroll_info.get(), child->id(), gfx::Vector2d(-3, 0)); 2214 ExpectContains(*scroll_info.get(), child->id(), gfx::Vector2d(-3, 0));
2138 } 2215 }
2139 } 2216 }
2140 2217
2141 TEST_F(LayerTreeHostImplTest, ScrollWithoutBubbling) { 2218 TEST_F(LayerTreeHostImplTest, ScrollWithoutBubbling) {
2142 // Scroll a child layer beyond its maximum scroll range and make sure the 2219 // Scroll a child layer beyond its maximum scroll range and make sure the
2143 // the scroll doesn't bubble up to the parent layer. 2220 // the scroll doesn't bubble up to the parent layer.
2144 gfx::Size surface_size(10, 10); 2221 gfx::Size surface_size(20, 20);
2145 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 2222 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
2146 scoped_ptr<LayerImpl> root_scrolling = CreateScrollableLayer(2, surface_size); 2223 scoped_ptr<LayerImpl> root_scrolling =
2224 CreateScrollableLayer(2, surface_size, root.get());
2225 root_scrolling->SetIsContainerForFixedPositionLayers(true);
2147 2226
2148 scoped_ptr<LayerImpl> grand_child = CreateScrollableLayer(4, surface_size); 2227 scoped_ptr<LayerImpl> grand_child =
2149 grand_child->SetScrollOffset(gfx::Vector2d(0, 2)); 2228 CreateScrollableLayer(4, surface_size, root.get());
2150 2229
2151 scoped_ptr<LayerImpl> child = CreateScrollableLayer(3, surface_size); 2230 scoped_ptr<LayerImpl> child =
2152 child->SetScrollOffset(gfx::Vector2d(0, 3)); 2231 CreateScrollableLayer(3, surface_size, root.get());
2232 LayerImpl* grand_child_layer = grand_child.get();
2153 child->AddChild(grand_child.Pass()); 2233 child->AddChild(grand_child.Pass());
2154 2234
2235 LayerImpl* child_layer = child.get();
2155 root_scrolling->AddChild(child.Pass()); 2236 root_scrolling->AddChild(child.Pass());
2156 root->AddChild(root_scrolling.Pass()); 2237 root->AddChild(root_scrolling.Pass());
2157 host_impl_->active_tree()->SetRootLayer(root.Pass()); 2238 host_impl_->active_tree()->SetRootLayer(root.Pass());
2239 host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID);
2158 host_impl_->active_tree()->DidBecomeActive(); 2240 host_impl_->active_tree()->DidBecomeActive();
2159 host_impl_->SetViewportSize(surface_size); 2241 host_impl_->SetViewportSize(surface_size);
2242
2243 grand_child_layer->SetScrollOffset(gfx::Vector2d(0, 2));
2244 child_layer->SetScrollOffset(gfx::Vector2d(0, 3));
2245
2160 DrawFrame(); 2246 DrawFrame();
2161 { 2247 {
2162 gfx::Vector2d scroll_delta(0, -10); 2248 gfx::Vector2d scroll_delta(0, -10);
2163 EXPECT_EQ(InputHandler::ScrollStarted, 2249 EXPECT_EQ(InputHandler::ScrollStarted,
2164 host_impl_->ScrollBegin(gfx::Point(), 2250 host_impl_->ScrollBegin(gfx::Point(),
2165 InputHandler::NonBubblingGesture)); 2251 InputHandler::NonBubblingGesture));
2166 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2252 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2167 host_impl_->ScrollEnd(); 2253 host_impl_->ScrollEnd();
2168 2254
2169 scoped_ptr<ScrollAndScaleSet> scroll_info = 2255 scoped_ptr<ScrollAndScaleSet> scroll_info =
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2227 EXPECT_EQ(grand_child, host_impl_->CurrentlyScrollingLayer()); 2313 EXPECT_EQ(grand_child, host_impl_->CurrentlyScrollingLayer());
2228 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2314 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2229 host_impl_->ScrollEnd(); 2315 host_impl_->ScrollEnd();
2230 2316
2231 scroll_info = host_impl_->ProcessScrollDeltas(); 2317 scroll_info = host_impl_->ProcessScrollDeltas();
2232 2318
2233 // Should have scrolled by half the amount in layer space (5 - 2/2) 2319 // Should have scrolled by half the amount in layer space (5 - 2/2)
2234 ExpectContains(*scroll_info.get(), grand_child->id(), gfx::Vector2d(0, 4)); 2320 ExpectContains(*scroll_info.get(), grand_child->id(), gfx::Vector2d(0, 4));
2235 } 2321 }
2236 } 2322 }
2237
2238 TEST_F(LayerTreeHostImplTest, ScrollEventBubbling) { 2323 TEST_F(LayerTreeHostImplTest, ScrollEventBubbling) {
2239 // When we try to scroll a non-scrollable child layer, the scroll delta 2324 // When we try to scroll a non-scrollable child layer, the scroll delta
2240 // should be applied to one of its ancestors if possible. 2325 // should be applied to one of its ancestors if possible.
2241 gfx::Size surface_size(10, 10); 2326 gfx::Size surface_size(10, 10);
2242 gfx::Size content_size(20, 20); 2327 gfx::Size content_size(20, 20);
2243 scoped_ptr<LayerImpl> root = CreateScrollableLayer(1, content_size); 2328 scoped_ptr<LayerImpl> root_clip =
2244 scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, content_size); 2329 LayerImpl::Create(host_impl_->active_tree(), 3);
2330 scoped_ptr<LayerImpl> root =
2331 CreateScrollableLayer(1, content_size, root_clip.get());
2332 // Make 'root' the clip layer for child: since they have the same sizes the
2333 // child will have zero max_scroll_offset and scrolls will bubble.
2334 scoped_ptr<LayerImpl> child =
2335 CreateScrollableLayer(2, content_size, root.get());
2336 child->SetIsContainerForFixedPositionLayers(true);
2337 root->SetBounds(content_size);
2245 2338
2246 child->SetScrollable(false); 2339 int root_scroll_id = root->id();
2247 root->AddChild(child.Pass()); 2340 root->AddChild(child.Pass());
2341 root_clip->AddChild(root.Pass());
2248 2342
2249 host_impl_->SetViewportSize(surface_size); 2343 host_impl_->SetViewportSize(surface_size);
2250 host_impl_->active_tree()->SetRootLayer(root.Pass()); 2344 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
2345 host_impl_->active_tree()->SetViewportLayersFromIds(3, 2, Layer::INVALID_ID);
2251 host_impl_->active_tree()->DidBecomeActive(); 2346 host_impl_->active_tree()->DidBecomeActive();
2252 DrawFrame(); 2347 DrawFrame();
2253 { 2348 {
2254 gfx::Vector2d scroll_delta(0, 4); 2349 gfx::Vector2d scroll_delta(0, 4);
2255 EXPECT_EQ(InputHandler::ScrollStarted, 2350 EXPECT_EQ(InputHandler::ScrollStarted,
2256 host_impl_->ScrollBegin(gfx::Point(5, 5), 2351 host_impl_->ScrollBegin(gfx::Point(5, 5),
2257 InputHandler::Wheel)); 2352 InputHandler::Wheel));
2258 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2353 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2259 host_impl_->ScrollEnd(); 2354 host_impl_->ScrollEnd();
2260 2355
2261 scoped_ptr<ScrollAndScaleSet> scroll_info = 2356 scoped_ptr<ScrollAndScaleSet> scroll_info =
2262 host_impl_->ProcessScrollDeltas(); 2357 host_impl_->ProcessScrollDeltas();
2263 2358
2264 // Only the root should have scrolled. 2359 // Only the root scroll should have scrolled.
2265 ASSERT_EQ(scroll_info->scrolls.size(), 1u); 2360 ASSERT_EQ(scroll_info->scrolls.size(), 1u);
2266 ExpectContains(*scroll_info.get(), 2361 ExpectContains(*scroll_info.get(), root_scroll_id, scroll_delta);
2267 host_impl_->active_tree()->root_layer()->id(),
2268 scroll_delta);
2269 } 2362 }
2270 } 2363 }
2271 2364
2272 TEST_F(LayerTreeHostImplTest, ScrollBeforeRedraw) { 2365 TEST_F(LayerTreeHostImplTest, ScrollBeforeRedraw) {
2273 gfx::Size surface_size(10, 10); 2366 gfx::Size surface_size(10, 10);
2274 host_impl_->active_tree()->SetRootLayer( 2367 scoped_ptr<LayerImpl> root_clip =
2275 CreateScrollableLayer(1, surface_size)); 2368 LayerImpl::Create(host_impl_->active_tree(), 1);
2369 scoped_ptr<LayerImpl> root_scroll =
2370 CreateScrollableLayer(2, surface_size, root_clip.get());
2371 root_scroll->SetIsContainerForFixedPositionLayers(true);
2372 root_clip->AddChild(root_scroll.Pass());
2373 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
2374 host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID);
2276 host_impl_->active_tree()->DidBecomeActive(); 2375 host_impl_->active_tree()->DidBecomeActive();
2277 host_impl_->SetViewportSize(surface_size); 2376 host_impl_->SetViewportSize(surface_size);
2278 2377
2279 // Draw one frame and then immediately rebuild the layer tree to mimic a tree 2378 // Draw one frame and then immediately rebuild the layer tree to mimic a tree
2280 // synchronization. 2379 // synchronization.
2281 DrawFrame(); 2380 DrawFrame();
2282 host_impl_->active_tree()->DetachLayerTree(); 2381 host_impl_->active_tree()->DetachLayerTree();
2283 host_impl_->active_tree()->SetRootLayer( 2382 scoped_ptr<LayerImpl> root_clip2 =
2284 CreateScrollableLayer(2, surface_size)); 2383 LayerImpl::Create(host_impl_->active_tree(), 3);
2384 scoped_ptr<LayerImpl> root_scroll2 =
2385 CreateScrollableLayer(4, surface_size, root_clip2.get());
2386 root_scroll2->SetIsContainerForFixedPositionLayers(true);
2387 root_clip2->AddChild(root_scroll2.Pass());
2388 host_impl_->active_tree()->SetRootLayer(root_clip2.Pass());
2389 host_impl_->active_tree()->SetViewportLayersFromIds(3, 4, Layer::INVALID_ID);
2285 host_impl_->active_tree()->DidBecomeActive(); 2390 host_impl_->active_tree()->DidBecomeActive();
2286 2391
2287 // Scrolling should still work even though we did not draw yet. 2392 // Scrolling should still work even though we did not draw yet.
2288 EXPECT_EQ(InputHandler::ScrollStarted, 2393 EXPECT_EQ(InputHandler::ScrollStarted,
2289 host_impl_->ScrollBegin(gfx::Point(5, 5), 2394 host_impl_->ScrollBegin(gfx::Point(5, 5),
2290 InputHandler::Wheel)); 2395 InputHandler::Wheel));
2291 } 2396 }
2292 2397
2293 TEST_F(LayerTreeHostImplTest, ScrollAxisAlignedRotatedLayer) { 2398 TEST_F(LayerTreeHostImplTest, ScrollAxisAlignedRotatedLayer) {
2294 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); 2399 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2327 2432
2328 // The layer should have scrolled down in its local coordinates. 2433 // The layer should have scrolled down in its local coordinates.
2329 scroll_info = host_impl_->ProcessScrollDeltas(); 2434 scroll_info = host_impl_->ProcessScrollDeltas();
2330 ExpectContains(*scroll_info.get(), 2435 ExpectContains(*scroll_info.get(),
2331 scroll_layer->id(), 2436 scroll_layer->id(),
2332 wheel_scroll_delta); 2437 wheel_scroll_delta);
2333 } 2438 }
2334 2439
2335 TEST_F(LayerTreeHostImplTest, ScrollNonAxisAlignedRotatedLayer) { 2440 TEST_F(LayerTreeHostImplTest, ScrollNonAxisAlignedRotatedLayer) {
2336 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); 2441 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100));
2337 int child_layer_id = 4; 2442 int child_clip_layer_id = 6;
2443 int child_layer_id = 7;
2338 float child_layer_angle = -20.f; 2444 float child_layer_angle = -20.f;
2339 2445
2340 // Create a child layer that is rotated to a non-axis-aligned angle. 2446 // Create a child layer that is rotated to a non-axis-aligned angle.
2447 scoped_ptr<LayerImpl> clip_layer =
2448 LayerImpl::Create(host_impl_->active_tree(), child_clip_layer_id);
2341 scoped_ptr<LayerImpl> child = CreateScrollableLayer( 2449 scoped_ptr<LayerImpl> child = CreateScrollableLayer(
2342 child_layer_id, 2450 child_layer_id, scroll_layer->content_bounds(), clip_layer.get());
2343 scroll_layer->content_bounds());
2344 gfx::Transform rotate_transform; 2451 gfx::Transform rotate_transform;
2345 rotate_transform.Translate(-50.0, -50.0); 2452 rotate_transform.Translate(-50.0, -50.0);
2346 rotate_transform.Rotate(child_layer_angle); 2453 rotate_transform.Rotate(child_layer_angle);
2347 rotate_transform.Translate(50.0, 50.0); 2454 rotate_transform.Translate(50.0, 50.0);
2348 child->SetTransform(rotate_transform); 2455 clip_layer->SetTransform(rotate_transform);
2349 2456
2350 // Only allow vertical scrolling. 2457 // Only allow vertical scrolling.
2351 child->SetMaxScrollOffset(gfx::Vector2d(0, child->content_bounds().height())); 2458 clip_layer->SetBounds(
2352 scroll_layer->AddChild(child.Pass()); 2459 gfx::Size(child->bounds().width(), child->bounds().height() / 2));
2460 // The rotation depends on the layer's anchor point, and the child layer is a
2461 // different size than the clip, so make sure the clip layer's anchor lines
2462 // up over the child.
2463 clip_layer->SetAnchorPoint(gfx::PointF(0.5, 1.0));
2464 LayerImpl* child_ptr = child.get();
2465 clip_layer->AddChild(child.Pass());
2466 scroll_layer->AddChild(clip_layer.Pass());
2353 2467
2354 gfx::Size surface_size(50, 50); 2468 gfx::Size surface_size(50, 50);
2355 host_impl_->SetViewportSize(surface_size); 2469 host_impl_->SetViewportSize(surface_size);
2356 DrawFrame(); 2470 DrawFrame();
2357 { 2471 {
2358 // Scroll down in screen coordinates with a gesture. 2472 // Scroll down in screen coordinates with a gesture.
2359 gfx::Vector2d gesture_scroll_delta(0, 10); 2473 gfx::Vector2d gesture_scroll_delta(0, 10);
2360 EXPECT_EQ(InputHandler::ScrollStarted, 2474 EXPECT_EQ(InputHandler::ScrollStarted,
2361 host_impl_->ScrollBegin(gfx::Point(1, 1), 2475 host_impl_->ScrollBegin(gfx::Point(1, 1),
2362 InputHandler::Gesture)); 2476 InputHandler::Gesture));
2363 host_impl_->ScrollBy(gfx::Point(), gesture_scroll_delta); 2477 host_impl_->ScrollBy(gfx::Point(), gesture_scroll_delta);
2364 host_impl_->ScrollEnd(); 2478 host_impl_->ScrollEnd();
2365 2479
2366 // The child layer should have scrolled down in its local coordinates an 2480 // The child layer should have scrolled down in its local coordinates an
2367 // amount proportional to the angle between it and the input scroll delta. 2481 // amount proportional to the angle between it and the input scroll delta.
2368 gfx::Vector2d expected_scroll_delta( 2482 gfx::Vector2d expected_scroll_delta(
2369 0, 2483 0,
2370 gesture_scroll_delta.y() * 2484 gesture_scroll_delta.y() *
2371 std::cos(MathUtil::Deg2Rad(child_layer_angle))); 2485 std::cos(MathUtil::Deg2Rad(child_layer_angle)));
2372 scoped_ptr<ScrollAndScaleSet> scroll_info = 2486 scoped_ptr<ScrollAndScaleSet> scroll_info =
2373 host_impl_->ProcessScrollDeltas(); 2487 host_impl_->ProcessScrollDeltas();
2374 ExpectContains(*scroll_info.get(), child_layer_id, expected_scroll_delta); 2488 ExpectContains(*scroll_info.get(), child_layer_id, expected_scroll_delta);
2375 2489
2376 // The root scroll layer should not have scrolled, because the input delta 2490 // The root scroll layer should not have scrolled, because the input delta
2377 // was close to the layer's axis of movement. 2491 // was close to the layer's axis of movement.
2378 EXPECT_EQ(scroll_info->scrolls.size(), 1u); 2492 EXPECT_EQ(scroll_info->scrolls.size(), 1u);
2379 } 2493 }
2380 { 2494 {
2381 // Now reset and scroll the same amount horizontally. 2495 // Now reset and scroll the same amount horizontally.
2382 scroll_layer->children()[1]->SetScrollDelta( 2496 child_ptr->SetScrollDelta(
2383 gfx::Vector2dF()); 2497 gfx::Vector2dF());
2384 gfx::Vector2d gesture_scroll_delta(10, 0); 2498 gfx::Vector2d gesture_scroll_delta(10, 0);
2385 EXPECT_EQ(InputHandler::ScrollStarted, 2499 EXPECT_EQ(InputHandler::ScrollStarted,
2386 host_impl_->ScrollBegin(gfx::Point(1, 1), 2500 host_impl_->ScrollBegin(gfx::Point(1, 1),
2387 InputHandler::Gesture)); 2501 InputHandler::Gesture));
2388 host_impl_->ScrollBy(gfx::Point(), gesture_scroll_delta); 2502 host_impl_->ScrollBy(gfx::Point(), gesture_scroll_delta);
2389 host_impl_->ScrollEnd(); 2503 host_impl_->ScrollEnd();
2390 2504
2391 // The child layer should have scrolled down in its local coordinates an 2505 // The child layer should have scrolled down in its local coordinates an
2392 // amount proportional to the angle between it and the input scroll delta. 2506 // amount proportional to the angle between it and the input scroll delta.
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
2506 gfx::Vector2dF getter_return_value_; 2620 gfx::Vector2dF getter_return_value_;
2507 gfx::Vector2dF max_scroll_offset_; 2621 gfx::Vector2dF max_scroll_offset_;
2508 gfx::SizeF scrollable_size_; 2622 gfx::SizeF scrollable_size_;
2509 float page_scale_factor_; 2623 float page_scale_factor_;
2510 }; 2624 };
2511 2625
2512 TEST_F(LayerTreeHostImplTest, RootLayerScrollOffsetDelegation) { 2626 TEST_F(LayerTreeHostImplTest, RootLayerScrollOffsetDelegation) {
2513 TestScrollOffsetDelegate scroll_delegate; 2627 TestScrollOffsetDelegate scroll_delegate;
2514 host_impl_->SetViewportSize(gfx::Size(10, 20)); 2628 host_impl_->SetViewportSize(gfx::Size(10, 20));
2515 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); 2629 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100));
2630 LayerImpl* clip_layer = scroll_layer->parent()->parent();
2631 clip_layer->SetBounds(gfx::Size(10, 20));
2516 2632
2517 // Setting the delegate results in the current scroll offset being set. 2633 // Setting the delegate results in the current scroll offset being set.
2518 gfx::Vector2dF initial_scroll_delta(10.f, 10.f); 2634 gfx::Vector2dF initial_scroll_delta(10.f, 10.f);
2519 scroll_layer->SetScrollOffset(gfx::Vector2d()); 2635 scroll_layer->SetScrollOffset(gfx::Vector2d());
2520 scroll_layer->SetScrollDelta(initial_scroll_delta); 2636 scroll_layer->SetScrollDelta(initial_scroll_delta);
2521 host_impl_->SetRootLayerScrollOffsetDelegate(&scroll_delegate); 2637 host_impl_->SetRootLayerScrollOffsetDelegate(&scroll_delegate);
2522 EXPECT_EQ(initial_scroll_delta.ToString(), 2638 EXPECT_EQ(initial_scroll_delta.ToString(),
2523 scroll_delegate.last_set_scroll_offset().ToString()); 2639 scroll_delegate.last_set_scroll_offset().ToString());
2524 2640
2525 // Setting the delegate results in the scrollable_size, max_scroll_offset and 2641 // Setting the delegate results in the scrollable_size, max_scroll_offset and
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2629 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, -20)); 2745 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, -20));
2630 EXPECT_EQ(gfx::Vector2dF(0, -20), host_impl_->accumulated_root_overscroll()); 2746 EXPECT_EQ(gfx::Vector2dF(0, -20), host_impl_->accumulated_root_overscroll());
2631 EXPECT_EQ(gfx::Vector2dF(10, 0), host_impl_->current_fling_velocity()); 2747 EXPECT_EQ(gfx::Vector2dF(10, 0), host_impl_->current_fling_velocity());
2632 } 2748 }
2633 2749
2634 2750
2635 TEST_F(LayerTreeHostImplTest, OverscrollChildWithoutBubbling) { 2751 TEST_F(LayerTreeHostImplTest, OverscrollChildWithoutBubbling) {
2636 // Scroll child layers beyond their maximum scroll range and make sure root 2752 // Scroll child layers beyond their maximum scroll range and make sure root
2637 // overscroll does not accumulate. 2753 // overscroll does not accumulate.
2638 gfx::Size surface_size(10, 10); 2754 gfx::Size surface_size(10, 10);
2639 scoped_ptr<LayerImpl> root = CreateScrollableLayer(1, surface_size); 2755 scoped_ptr<LayerImpl> root_clip =
2756 LayerImpl::Create(host_impl_->active_tree(), 4);
2757 scoped_ptr<LayerImpl> root =
2758 CreateScrollableLayer(1, surface_size, root_clip.get());
2640 2759
2641 scoped_ptr<LayerImpl> grand_child = CreateScrollableLayer(3, surface_size); 2760 scoped_ptr<LayerImpl> grand_child =
2642 grand_child->SetScrollOffset(gfx::Vector2d(0, 2)); 2761 CreateScrollableLayer(3, surface_size, root_clip.get());
2643 2762
2644 scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, surface_size); 2763 scoped_ptr<LayerImpl> child =
2645 child->SetScrollOffset(gfx::Vector2d(0, 3)); 2764 CreateScrollableLayer(2, surface_size, root_clip.get());
2765 LayerImpl* grand_child_layer = grand_child.get();
2646 child->AddChild(grand_child.Pass()); 2766 child->AddChild(grand_child.Pass());
2647 2767
2768 LayerImpl* child_layer = child.get();
2648 root->AddChild(child.Pass()); 2769 root->AddChild(child.Pass());
2649 host_impl_->active_tree()->SetRootLayer(root.Pass()); 2770 root_clip->AddChild(root.Pass());
2771 child_layer->SetScrollOffset(gfx::Vector2d(0, 3));
2772 grand_child_layer->SetScrollOffset(gfx::Vector2d(0, 2));
2773 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
2650 host_impl_->active_tree()->DidBecomeActive(); 2774 host_impl_->active_tree()->DidBecomeActive();
2651 host_impl_->SetViewportSize(surface_size); 2775 host_impl_->SetViewportSize(surface_size);
2652 DrawFrame(); 2776 DrawFrame();
2653 { 2777 {
2654 gfx::Vector2d scroll_delta(0, -10); 2778 gfx::Vector2d scroll_delta(0, -10);
2655 EXPECT_EQ(InputHandler::ScrollStarted, 2779 EXPECT_EQ(InputHandler::ScrollStarted,
2656 host_impl_->ScrollBegin(gfx::Point(), 2780 host_impl_->ScrollBegin(gfx::Point(),
2657 InputHandler::NonBubblingGesture)); 2781 InputHandler::NonBubblingGesture));
2658 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2782 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2659 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll()); 2783 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll());
2660 host_impl_->ScrollEnd(); 2784 host_impl_->ScrollEnd();
2661 2785
2662 LayerImpl* child = host_impl_->active_tree()->root_layer()->children()[0];
2663 LayerImpl* grand_child = child->children()[0];
2664
2665 // The next time we scroll we should only scroll the parent, but overscroll 2786 // The next time we scroll we should only scroll the parent, but overscroll
2666 // should still not reach the root layer. 2787 // should still not reach the root layer.
2667 scroll_delta = gfx::Vector2d(0, -30); 2788 scroll_delta = gfx::Vector2d(0, -30);
2668 EXPECT_EQ(InputHandler::ScrollStarted, 2789 EXPECT_EQ(InputHandler::ScrollStarted,
2669 host_impl_->ScrollBegin(gfx::Point(5, 5), 2790 host_impl_->ScrollBegin(gfx::Point(5, 5),
2670 InputHandler::NonBubblingGesture)); 2791 InputHandler::NonBubblingGesture));
2671 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), grand_child); 2792 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), grand_child_layer);
2672 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll()); 2793 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll());
2673 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2794 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2674 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), child); 2795 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), child_layer);
2675 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll()); 2796 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll());
2676 host_impl_->ScrollEnd(); 2797 host_impl_->ScrollEnd();
2677 2798
2678 // After scrolling the parent, another scroll on the opposite direction 2799 // After scrolling the parent, another scroll on the opposite direction
2679 // should scroll the child, resetting the fling velocity. 2800 // should scroll the child, resetting the fling velocity.
2680 scroll_delta = gfx::Vector2d(0, 70); 2801 scroll_delta = gfx::Vector2d(0, 70);
2681 host_impl_->NotifyCurrentFlingVelocity(gfx::Vector2dF(10, 0)); 2802 host_impl_->NotifyCurrentFlingVelocity(gfx::Vector2dF(10, 0));
2682 EXPECT_EQ(gfx::Vector2dF(10, 0), host_impl_->current_fling_velocity()); 2803 EXPECT_EQ(gfx::Vector2dF(10, 0), host_impl_->current_fling_velocity());
2683 EXPECT_EQ(InputHandler::ScrollStarted, 2804 EXPECT_EQ(InputHandler::ScrollStarted,
2684 host_impl_->ScrollBegin(gfx::Point(5, 5), 2805 host_impl_->ScrollBegin(gfx::Point(5, 5),
2685 InputHandler::NonBubblingGesture)); 2806 InputHandler::NonBubblingGesture));
2686 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), grand_child); 2807 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), grand_child_layer);
2687 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2808 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2688 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), grand_child); 2809 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), grand_child_layer);
2689 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll()); 2810 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll());
2690 EXPECT_EQ(gfx::Vector2dF(), host_impl_->current_fling_velocity()); 2811 EXPECT_EQ(gfx::Vector2dF(), host_impl_->current_fling_velocity());
2691 host_impl_->ScrollEnd(); 2812 host_impl_->ScrollEnd();
2692 } 2813 }
2693 } 2814 }
2694 2815
2695 TEST_F(LayerTreeHostImplTest, OverscrollChildEventBubbling) { 2816 TEST_F(LayerTreeHostImplTest, OverscrollChildEventBubbling) {
2696 // When we try to scroll a non-scrollable child layer, the scroll delta 2817 // When we try to scroll a non-scrollable child layer, the scroll delta
2697 // should be applied to one of its ancestors if possible. Overscroll should 2818 // should be applied to one of its ancestors if possible. Overscroll should
2698 // be reflected only when it has bubbled up to the root scrolling layer. 2819 // be reflected only when it has bubbled up to the root scrolling layer.
2699 gfx::Size surface_size(10, 10); 2820 gfx::Size surface_size(10, 10);
2700 gfx::Size content_size(20, 20); 2821 gfx::Size content_size(20, 20);
2701 scoped_ptr<LayerImpl> root = CreateScrollableLayer(1, content_size); 2822 scoped_ptr<LayerImpl> root_clip =
2702 scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, content_size); 2823 LayerImpl::Create(host_impl_->active_tree(), 3);
2824 scoped_ptr<LayerImpl> root =
2825 CreateScrollableLayer(1, content_size, root_clip.get());
2826 root->SetIsContainerForFixedPositionLayers(true);
2827 scoped_ptr<LayerImpl> child =
2828 CreateScrollableLayer(2, content_size, root_clip.get());
2703 2829
2704 child->SetScrollable(false); 2830 child->SetScrollClipLayer(Layer::INVALID_ID);
2705 root->AddChild(child.Pass()); 2831 root->AddChild(child.Pass());
2832 root_clip->AddChild(root.Pass());
2706 2833
2707 host_impl_->SetViewportSize(surface_size); 2834 host_impl_->SetViewportSize(surface_size);
2708 host_impl_->active_tree()->SetRootLayer(root.Pass()); 2835 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
2836 host_impl_->active_tree()->SetViewportLayersFromIds(3, 1, Layer::INVALID_ID);
2709 host_impl_->active_tree()->DidBecomeActive(); 2837 host_impl_->active_tree()->DidBecomeActive();
2710 DrawFrame(); 2838 DrawFrame();
2711 { 2839 {
2712 gfx::Vector2d scroll_delta(0, 8); 2840 gfx::Vector2d scroll_delta(0, 8);
2713 EXPECT_EQ(InputHandler::ScrollStarted, 2841 EXPECT_EQ(InputHandler::ScrollStarted,
2714 host_impl_->ScrollBegin(gfx::Point(5, 5), 2842 host_impl_->ScrollBegin(gfx::Point(5, 5),
2715 InputHandler::Wheel)); 2843 InputHandler::Wheel));
2716 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2844 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2717 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll()); 2845 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll());
2718 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2846 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2719 EXPECT_EQ(gfx::Vector2dF(0, 6), host_impl_->accumulated_root_overscroll()); 2847 EXPECT_EQ(gfx::Vector2dF(0, 6), host_impl_->accumulated_root_overscroll());
2720 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 2848 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
2721 EXPECT_EQ(gfx::Vector2dF(0, 14), host_impl_->accumulated_root_overscroll()); 2849 EXPECT_EQ(gfx::Vector2dF(0, 14), host_impl_->accumulated_root_overscroll());
2722 host_impl_->ScrollEnd(); 2850 host_impl_->ScrollEnd();
2723 } 2851 }
2724 } 2852 }
2725 2853
2726 TEST_F(LayerTreeHostImplTest, OverscrollAlways) { 2854 TEST_F(LayerTreeHostImplTest, OverscrollAlways) {
2727 LayerTreeSettings settings; 2855 LayerTreeSettings settings;
2728 CreateHostImpl(settings, CreateOutputSurface()); 2856 CreateHostImpl(settings, CreateOutputSurface());
2729 2857
2730 SetupScrollAndContentsLayers(gfx::Size(50, 50)); 2858 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(50, 50));
2859 LayerImpl* clip_layer = scroll_layer->parent()->parent();
2860 clip_layer->SetBounds(gfx::Size(50, 50));
2731 host_impl_->SetViewportSize(gfx::Size(50, 50)); 2861 host_impl_->SetViewportSize(gfx::Size(50, 50));
2732 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 0.5f, 4.f); 2862 host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 0.5f, 4.f);
2733 DrawFrame(); 2863 DrawFrame();
2734 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll()); 2864 EXPECT_EQ(gfx::Vector2dF(), host_impl_->accumulated_root_overscroll());
2735 EXPECT_EQ(gfx::Vector2dF(), host_impl_->current_fling_velocity()); 2865 EXPECT_EQ(gfx::Vector2dF(), host_impl_->current_fling_velocity());
2736 2866
2737 // Even though the layer can't scroll the overscroll still happens. 2867 // Even though the layer can't scroll the overscroll still happens.
2738 EXPECT_EQ(InputHandler::ScrollStarted, 2868 EXPECT_EQ(InputHandler::ScrollStarted,
2739 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel)); 2869 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel));
2740 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10)); 2870 host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10));
(...skipping 2010 matching lines...) Expand 10 before | Expand all | Expand 10 after
4751 scoped_ptr<FakePictureLayerImpl> scoped_content_layer = 4881 scoped_ptr<FakePictureLayerImpl> scoped_content_layer =
4752 FakePictureLayerImpl::CreateWithPile(host_impl_->pending_tree(), 3, pile); 4882 FakePictureLayerImpl::CreateWithPile(host_impl_->pending_tree(), 3, pile);
4753 LayerImpl* content_layer = scoped_content_layer.get(); 4883 LayerImpl* content_layer = scoped_content_layer.get();
4754 scrolling_layer->AddChild(scoped_content_layer.PassAs<LayerImpl>()); 4884 scrolling_layer->AddChild(scoped_content_layer.PassAs<LayerImpl>());
4755 content_layer->SetBounds(content_layer_bounds); 4885 content_layer->SetBounds(content_layer_bounds);
4756 content_layer->SetDrawsContent(true); 4886 content_layer->SetDrawsContent(true);
4757 4887
4758 root->SetBounds(root_size); 4888 root->SetBounds(root_size);
4759 4889
4760 gfx::Vector2d scroll_offset(100000, 0); 4890 gfx::Vector2d scroll_offset(100000, 0);
4761 scrolling_layer->SetScrollable(true); 4891 scrolling_layer->SetScrollClipLayer(root->id());
4762 scrolling_layer->SetMaxScrollOffset(scroll_offset);
4763 scrolling_layer->SetScrollOffset(scroll_offset); 4892 scrolling_layer->SetScrollOffset(scroll_offset);
4764 4893
4765 host_impl_->ActivatePendingTree(); 4894 host_impl_->ActivatePendingTree();
4766 4895
4767 host_impl_->active_tree()->UpdateDrawProperties(); 4896 host_impl_->active_tree()->UpdateDrawProperties();
4768 ASSERT_EQ(1u, host_impl_->active_tree()->RenderSurfaceLayerList().size()); 4897 ASSERT_EQ(1u, host_impl_->active_tree()->RenderSurfaceLayerList().size());
4769 4898
4770 LayerTreeHostImpl::FrameData frame; 4899 LayerTreeHostImpl::FrameData frame;
4771 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); 4900 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
4772 4901
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
5206 // released, and the texture deleted. 5335 // released, and the texture deleted.
5207 EXPECT_TRUE(context_provider->HasOneRef()); 5336 EXPECT_TRUE(context_provider->HasOneRef());
5208 EXPECT_EQ(0u, context_provider->TestContext3d()->NumTextures()); 5337 EXPECT_EQ(0u, context_provider->TestContext3d()->NumTextures());
5209 } 5338 }
5210 5339
5211 TEST_F(LayerTreeHostImplTest, TouchFlingShouldNotBubble) { 5340 TEST_F(LayerTreeHostImplTest, TouchFlingShouldNotBubble) {
5212 // When flinging via touch, only the child should scroll (we should not 5341 // When flinging via touch, only the child should scroll (we should not
5213 // bubble). 5342 // bubble).
5214 gfx::Size surface_size(10, 10); 5343 gfx::Size surface_size(10, 10);
5215 gfx::Size content_size(20, 20); 5344 gfx::Size content_size(20, 20);
5216 scoped_ptr<LayerImpl> root = CreateScrollableLayer(1, content_size); 5345 scoped_ptr<LayerImpl> root_clip =
5217 scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, content_size); 5346 LayerImpl::Create(host_impl_->active_tree(), 3);
5347 scoped_ptr<LayerImpl> root =
5348 CreateScrollableLayer(1, content_size, root_clip.get());
5349 root->SetIsContainerForFixedPositionLayers(true);
5350 scoped_ptr<LayerImpl> child =
5351 CreateScrollableLayer(2, content_size, root_clip.get());
5218 5352
5219 root->AddChild(child.Pass()); 5353 root->AddChild(child.Pass());
5354 int root_id = root->id();
5355 root_clip->AddChild(root.Pass());
5220 5356
5221 host_impl_->SetViewportSize(surface_size); 5357 host_impl_->SetViewportSize(surface_size);
5222 host_impl_->active_tree()->SetRootLayer(root.Pass()); 5358 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
5359 host_impl_->active_tree()->SetViewportLayersFromIds(3, 1, Layer::INVALID_ID);
5223 host_impl_->active_tree()->DidBecomeActive(); 5360 host_impl_->active_tree()->DidBecomeActive();
5224 DrawFrame(); 5361 DrawFrame();
5225 { 5362 {
5226 EXPECT_EQ(InputHandler::ScrollStarted, 5363 EXPECT_EQ(InputHandler::ScrollStarted,
5227 host_impl_->ScrollBegin(gfx::Point(), 5364 host_impl_->ScrollBegin(gfx::Point(),
5228 InputHandler::Gesture)); 5365 InputHandler::Gesture));
5229 5366
5230 EXPECT_EQ(InputHandler::ScrollStarted, 5367 EXPECT_EQ(InputHandler::ScrollStarted,
5231 host_impl_->FlingScrollBegin()); 5368 host_impl_->FlingScrollBegin());
5232 5369
5233 gfx::Vector2d scroll_delta(0, 100); 5370 gfx::Vector2d scroll_delta(0, 100);
5234 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 5371 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
5235 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 5372 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
5236 5373
5237 host_impl_->ScrollEnd(); 5374 host_impl_->ScrollEnd();
5238 5375
5239 scoped_ptr<ScrollAndScaleSet> scroll_info = 5376 scoped_ptr<ScrollAndScaleSet> scroll_info =
5240 host_impl_->ProcessScrollDeltas(); 5377 host_impl_->ProcessScrollDeltas();
5241 5378
5242 // Only the child should have scrolled. 5379 // Only the child should have scrolled.
5243 ASSERT_EQ(1u, scroll_info->scrolls.size()); 5380 ASSERT_EQ(1u, scroll_info->scrolls.size());
5244 ExpectNone(*scroll_info.get(), 5381 ExpectNone(*scroll_info.get(), root_id);
5245 host_impl_->active_tree()->root_layer()->id());
5246 } 5382 }
5247 } 5383 }
5248 5384
5249 TEST_F(LayerTreeHostImplTest, TouchFlingShouldLockToFirstScrolledLayer) { 5385 TEST_F(LayerTreeHostImplTest, TouchFlingShouldLockToFirstScrolledLayer) {
5250 // Scroll a child layer beyond its maximum scroll range and make sure the 5386 // Scroll a child layer beyond its maximum scroll range and make sure the
5251 // the scroll doesn't bubble up to the parent layer. 5387 // the scroll doesn't bubble up to the parent layer.
5252 gfx::Size surface_size(10, 10); 5388 gfx::Size surface_size(10, 10);
5253 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 5389 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
5254 scoped_ptr<LayerImpl> root_scrolling = CreateScrollableLayer(2, surface_size); 5390 scoped_ptr<LayerImpl> root_scrolling =
5391 CreateScrollableLayer(2, surface_size, root.get());
5255 5392
5256 scoped_ptr<LayerImpl> grand_child = CreateScrollableLayer(4, surface_size); 5393 scoped_ptr<LayerImpl> grand_child =
5394 CreateScrollableLayer(4, surface_size, root.get());
5257 grand_child->SetScrollOffset(gfx::Vector2d(0, 2)); 5395 grand_child->SetScrollOffset(gfx::Vector2d(0, 2));
5258 5396
5259 scoped_ptr<LayerImpl> child = CreateScrollableLayer(3, surface_size); 5397 scoped_ptr<LayerImpl> child =
5398 CreateScrollableLayer(3, surface_size, root.get());
5260 child->SetScrollOffset(gfx::Vector2d(0, 4)); 5399 child->SetScrollOffset(gfx::Vector2d(0, 4));
5261 child->AddChild(grand_child.Pass()); 5400 child->AddChild(grand_child.Pass());
5262 5401
5263 root_scrolling->AddChild(child.Pass()); 5402 root_scrolling->AddChild(child.Pass());
5264 root->AddChild(root_scrolling.Pass()); 5403 root->AddChild(root_scrolling.Pass());
5265 host_impl_->active_tree()->SetRootLayer(root.Pass()); 5404 host_impl_->active_tree()->SetRootLayer(root.Pass());
5266 host_impl_->active_tree()->DidBecomeActive(); 5405 host_impl_->active_tree()->DidBecomeActive();
5267 host_impl_->SetViewportSize(surface_size); 5406 host_impl_->SetViewportSize(surface_size);
5268 DrawFrame(); 5407 DrawFrame();
5269 { 5408 {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
5309 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), child); 5448 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), child);
5310 host_impl_->ScrollEnd(); 5449 host_impl_->ScrollEnd();
5311 } 5450 }
5312 } 5451 }
5313 5452
5314 TEST_F(LayerTreeHostImplTest, WheelFlingShouldBubble) { 5453 TEST_F(LayerTreeHostImplTest, WheelFlingShouldBubble) {
5315 // When flinging via wheel, the root should eventually scroll (we should 5454 // When flinging via wheel, the root should eventually scroll (we should
5316 // bubble). 5455 // bubble).
5317 gfx::Size surface_size(10, 10); 5456 gfx::Size surface_size(10, 10);
5318 gfx::Size content_size(20, 20); 5457 gfx::Size content_size(20, 20);
5319 scoped_ptr<LayerImpl> root = CreateScrollableLayer(1, content_size); 5458 scoped_ptr<LayerImpl> root_clip =
5320 scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, content_size); 5459 LayerImpl::Create(host_impl_->active_tree(), 3);
5460 scoped_ptr<LayerImpl> root_scroll =
5461 CreateScrollableLayer(1, content_size, root_clip.get());
5462 int root_scroll_id = root_scroll->id();
5463 scoped_ptr<LayerImpl> child =
5464 CreateScrollableLayer(2, content_size, root_clip.get());
5321 5465
5322 root->AddChild(child.Pass()); 5466 root_scroll->AddChild(child.Pass());
5467 root_clip->AddChild(root_scroll.Pass());
5323 5468
5324 host_impl_->SetViewportSize(surface_size); 5469 host_impl_->SetViewportSize(surface_size);
5325 host_impl_->active_tree()->SetRootLayer(root.Pass()); 5470 host_impl_->active_tree()->SetRootLayer(root_clip.Pass());
5326 host_impl_->active_tree()->DidBecomeActive(); 5471 host_impl_->active_tree()->DidBecomeActive();
5327 DrawFrame(); 5472 DrawFrame();
5328 { 5473 {
5329 EXPECT_EQ(InputHandler::ScrollStarted, 5474 EXPECT_EQ(InputHandler::ScrollStarted,
5330 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel)); 5475 host_impl_->ScrollBegin(gfx::Point(), InputHandler::Wheel));
5331 5476
5332 EXPECT_EQ(InputHandler::ScrollStarted, 5477 EXPECT_EQ(InputHandler::ScrollStarted,
5333 host_impl_->FlingScrollBegin()); 5478 host_impl_->FlingScrollBegin());
5334 5479
5335 gfx::Vector2d scroll_delta(0, 100); 5480 gfx::Vector2d scroll_delta(0, 100);
5336 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 5481 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
5337 host_impl_->ScrollBy(gfx::Point(), scroll_delta); 5482 host_impl_->ScrollBy(gfx::Point(), scroll_delta);
5338 5483
5339 host_impl_->ScrollEnd(); 5484 host_impl_->ScrollEnd();
5340 5485
5341 scoped_ptr<ScrollAndScaleSet> scroll_info = 5486 scoped_ptr<ScrollAndScaleSet> scroll_info =
5342 host_impl_->ProcessScrollDeltas(); 5487 host_impl_->ProcessScrollDeltas();
5343 5488
5344 // The root should have scrolled. 5489 // The root should have scrolled.
5345 ASSERT_EQ(2u, scroll_info->scrolls.size()); 5490 ASSERT_EQ(2u, scroll_info->scrolls.size());
5346 ExpectContains(*scroll_info.get(), 5491 ExpectContains(*scroll_info.get(), root_scroll_id, gfx::Vector2d(0, 10));
5347 host_impl_->active_tree()->root_layer()->id(),
5348 gfx::Vector2d(0, 10));
5349 } 5492 }
5350 } 5493 }
5351 5494
5352 // Make sure LatencyInfo carried by LatencyInfoSwapPromise are passed 5495 // Make sure LatencyInfo carried by LatencyInfoSwapPromise are passed
5353 // to CompositorFrameMetadata after SwapBuffers(); 5496 // to CompositorFrameMetadata after SwapBuffers();
5354 TEST_F(LayerTreeHostImplTest, LatencyInfoPassedToCompositorFrameMetadata) { 5497 TEST_F(LayerTreeHostImplTest, LatencyInfoPassedToCompositorFrameMetadata) {
5355 scoped_ptr<SolidColorLayerImpl> root = 5498 scoped_ptr<SolidColorLayerImpl> root =
5356 SolidColorLayerImpl::Create(host_impl_->active_tree(), 1); 5499 SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
5357 root->SetAnchorPoint(gfx::PointF()); 5500 root->SetAnchorPoint(gfx::PointF());
5358 root->SetPosition(gfx::PointF()); 5501 root->SetPosition(gfx::PointF());
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
5456 &set_needs_redraw_count)); 5599 &set_needs_redraw_count));
5457 // Empty damage rect won't signal the monitor. 5600 // Empty damage rect won't signal the monitor.
5458 host_impl_->SetNeedsRedrawRect(gfx::Rect()); 5601 host_impl_->SetNeedsRedrawRect(gfx::Rect());
5459 EXPECT_EQ(0, set_needs_commit_count); 5602 EXPECT_EQ(0, set_needs_commit_count);
5460 EXPECT_EQ(2, set_needs_redraw_count); 5603 EXPECT_EQ(2, set_needs_redraw_count);
5461 } 5604 }
5462 } 5605 }
5463 5606
5464 } // namespace 5607 } // namespace
5465 } // namespace cc 5608 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698