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

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

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

Powered by Google App Engine
This is Rietveld 408576698