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

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

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

Powered by Google App Engine
This is Rietveld 408576698