OLD | NEW |
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 <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 if (scroll_info.scrolls[i].layer_id != id) | 217 if (scroll_info.scrolls[i].layer_id != id) |
218 continue; | 218 continue; |
219 times_encountered++; | 219 times_encountered++; |
220 } | 220 } |
221 | 221 |
222 ASSERT_EQ(0, times_encountered); | 222 ASSERT_EQ(0, times_encountered); |
223 } | 223 } |
224 | 224 |
225 LayerImpl* CreateScrollAndContentsLayers(LayerTreeImpl* layer_tree_impl, | 225 LayerImpl* CreateScrollAndContentsLayers(LayerTreeImpl* layer_tree_impl, |
226 const gfx::Size& content_size) { | 226 const gfx::Size& content_size) { |
| 227 // Create both an inner viewport scroll layer and an outer viewport scroll |
| 228 // layer. The MaxScrollOffset of the outer viewport scroll layer will be |
| 229 // 0x0, so the scrolls will be applied directly to the inner viewport. |
| 230 const int kOuterViewportClipLayerId = 116; |
| 231 const int kOuterViewportScrollLayerId = 117; |
| 232 const int kContentLayerId = 118; |
227 const int kInnerViewportScrollLayerId = 2; | 233 const int kInnerViewportScrollLayerId = 2; |
228 const int kInnerViewportClipLayerId = 4; | 234 const int kInnerViewportClipLayerId = 4; |
229 const int kPageScaleLayerId = 5; | 235 const int kPageScaleLayerId = 5; |
| 236 |
230 scoped_ptr<LayerImpl> root = | 237 scoped_ptr<LayerImpl> root = |
231 LayerImpl::Create(layer_tree_impl, 1); | 238 LayerImpl::Create(layer_tree_impl, 1); |
232 root->SetBounds(content_size); | 239 root->SetBounds(content_size); |
233 root->SetContentBounds(content_size); | 240 root->SetContentBounds(content_size); |
234 root->SetPosition(gfx::PointF()); | 241 root->SetPosition(gfx::PointF()); |
235 root->SetHasRenderSurface(true); | 242 root->SetHasRenderSurface(true); |
236 | 243 |
237 scoped_ptr<LayerImpl> scroll = | 244 scoped_ptr<LayerImpl> inner_scroll = |
238 LayerImpl::Create(layer_tree_impl, kInnerViewportScrollLayerId); | 245 LayerImpl::Create(layer_tree_impl, kInnerViewportScrollLayerId); |
239 LayerImpl* scroll_layer = scroll.get(); | 246 inner_scroll->SetIsContainerForFixedPositionLayers(true); |
240 scroll->SetIsContainerForFixedPositionLayers(true); | 247 inner_scroll->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); |
241 scroll->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); | |
242 | 248 |
243 scoped_ptr<LayerImpl> clip = | 249 scoped_ptr<LayerImpl> inner_clip = |
244 LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId); | 250 LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId); |
245 clip->SetBounds( | 251 inner_clip->SetBounds( |
246 gfx::Size(content_size.width() / 2, content_size.height() / 2)); | 252 gfx::Size(content_size.width() / 2, content_size.height() / 2)); |
247 | 253 |
248 scoped_ptr<LayerImpl> page_scale = | 254 scoped_ptr<LayerImpl> page_scale = |
249 LayerImpl::Create(layer_tree_impl, kPageScaleLayerId); | 255 LayerImpl::Create(layer_tree_impl, kPageScaleLayerId); |
250 | 256 |
251 scroll->SetScrollClipLayer(clip->id()); | 257 inner_scroll->SetScrollClipLayer(inner_clip->id()); |
252 scroll->SetBounds(content_size); | 258 inner_scroll->SetBounds(content_size); |
253 scroll->SetContentBounds(content_size); | 259 inner_scroll->SetContentBounds(content_size); |
254 scroll->SetPosition(gfx::PointF()); | 260 inner_scroll->SetPosition(gfx::PointF()); |
255 scroll->SetIsContainerForFixedPositionLayers(true); | 261 |
| 262 scoped_ptr<LayerImpl> outer_clip = |
| 263 LayerImpl::Create(layer_tree_impl, kOuterViewportClipLayerId); |
| 264 outer_clip->SetBounds(content_size); |
| 265 outer_clip->SetIsContainerForFixedPositionLayers(true); |
| 266 |
| 267 scoped_ptr<LayerImpl> outer_scroll = |
| 268 LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId); |
| 269 outer_scroll->SetScrollClipLayer(outer_clip->id()); |
| 270 outer_scroll->PushScrollOffsetFromMainThread(gfx::ScrollOffset()); |
| 271 outer_scroll->SetBounds(content_size); |
| 272 outer_scroll->SetContentBounds(content_size); |
| 273 outer_scroll->SetPosition(gfx::PointF()); |
256 | 274 |
257 scoped_ptr<LayerImpl> contents = | 275 scoped_ptr<LayerImpl> contents = |
258 LayerImpl::Create(layer_tree_impl, 3); | 276 LayerImpl::Create(layer_tree_impl, kContentLayerId); |
259 contents->SetDrawsContent(true); | 277 contents->SetDrawsContent(true); |
260 contents->SetBounds(content_size); | 278 contents->SetBounds(content_size); |
261 contents->SetContentBounds(content_size); | 279 contents->SetContentBounds(content_size); |
262 contents->SetPosition(gfx::PointF()); | 280 contents->SetPosition(gfx::PointF()); |
263 | 281 |
264 scroll->AddChild(contents.Pass()); | 282 outer_scroll->AddChild(contents.Pass()); |
265 page_scale->AddChild(scroll.Pass()); | 283 outer_clip->AddChild(outer_scroll.Pass()); |
266 clip->AddChild(page_scale.Pass()); | 284 inner_scroll->AddChild(outer_clip.Pass()); |
267 root->AddChild(clip.Pass()); | 285 page_scale->AddChild(inner_scroll.Pass()); |
| 286 inner_clip->AddChild(page_scale.Pass()); |
| 287 root->AddChild(inner_clip.Pass()); |
268 | 288 |
269 layer_tree_impl->SetRootLayer(root.Pass()); | 289 layer_tree_impl->SetRootLayer(root.Pass()); |
270 layer_tree_impl->SetViewportLayersFromIds( | 290 layer_tree_impl->SetViewportLayersFromIds( |
271 Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, | 291 Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, |
272 Layer::INVALID_ID); | 292 kOuterViewportScrollLayerId); |
273 | 293 |
274 return scroll_layer; | 294 layer_tree_impl->DidBecomeActive(); |
| 295 return layer_tree_impl->InnerViewportScrollLayer(); |
275 } | 296 } |
276 | 297 |
277 LayerImpl* SetupScrollAndContentsLayers(const gfx::Size& content_size) { | 298 LayerImpl* SetupScrollAndContentsLayers(const gfx::Size& content_size) { |
278 LayerImpl* scroll_layer = CreateScrollAndContentsLayers( | 299 LayerImpl* scroll_layer = CreateScrollAndContentsLayers( |
279 host_impl_->active_tree(), content_size); | 300 host_impl_->active_tree(), content_size); |
280 host_impl_->active_tree()->DidBecomeActive(); | 301 host_impl_->active_tree()->DidBecomeActive(); |
281 return scroll_layer; | 302 return scroll_layer; |
282 } | 303 } |
283 | 304 |
284 // TODO(wjmaclean) Add clip-layer pointer to parameters. | 305 // TODO(wjmaclean) Add clip-layer pointer to parameters. |
(...skipping 1555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1840 host_impl_->MakeCompositorFrameMetadata(); | 1861 host_impl_->MakeCompositorFrameMetadata(); |
1841 EXPECT_EQ(gfx::Vector2dF(0.f, 10.f), metadata.root_scroll_offset); | 1862 EXPECT_EQ(gfx::Vector2dF(0.f, 10.f), metadata.root_scroll_offset); |
1842 } | 1863 } |
1843 host_impl_->ScrollEnd(); | 1864 host_impl_->ScrollEnd(); |
1844 { | 1865 { |
1845 CompositorFrameMetadata metadata = | 1866 CompositorFrameMetadata metadata = |
1846 host_impl_->MakeCompositorFrameMetadata(); | 1867 host_impl_->MakeCompositorFrameMetadata(); |
1847 EXPECT_EQ(gfx::Vector2dF(0.f, 10.f), metadata.root_scroll_offset); | 1868 EXPECT_EQ(gfx::Vector2dF(0.f, 10.f), metadata.root_scroll_offset); |
1848 } | 1869 } |
1849 | 1870 |
1850 // Root "overflow: hidden" properties should be reflected. | 1871 // Root "overflow: hidden" properties should be reflected on the outer |
| 1872 // viewport scroll layer. |
1851 { | 1873 { |
1852 host_impl_->active_tree() | 1874 host_impl_->active_tree() |
1853 ->InnerViewportScrollLayer() | 1875 ->OuterViewportScrollLayer() |
1854 ->set_user_scrollable_horizontal(false); | 1876 ->set_user_scrollable_horizontal(false); |
1855 CompositorFrameMetadata metadata = | 1877 CompositorFrameMetadata metadata = |
1856 host_impl_->MakeCompositorFrameMetadata(); | 1878 host_impl_->MakeCompositorFrameMetadata(); |
1857 EXPECT_TRUE(metadata.root_overflow_x_hidden); | 1879 EXPECT_TRUE(metadata.root_overflow_x_hidden); |
1858 EXPECT_FALSE(metadata.root_overflow_y_hidden); | 1880 EXPECT_FALSE(metadata.root_overflow_y_hidden); |
1859 | 1881 |
1860 host_impl_->active_tree() | 1882 host_impl_->active_tree() |
1861 ->InnerViewportScrollLayer() | 1883 ->OuterViewportScrollLayer() |
1862 ->set_user_scrollable_vertical(false); | 1884 ->set_user_scrollable_vertical(false); |
1863 metadata = host_impl_->MakeCompositorFrameMetadata(); | 1885 metadata = host_impl_->MakeCompositorFrameMetadata(); |
1864 EXPECT_TRUE(metadata.root_overflow_x_hidden); | 1886 EXPECT_TRUE(metadata.root_overflow_x_hidden); |
1865 EXPECT_TRUE(metadata.root_overflow_y_hidden); | 1887 EXPECT_TRUE(metadata.root_overflow_y_hidden); |
1866 } | 1888 } |
1867 | 1889 |
1868 // Page scale should update metadata correctly (shrinking only the viewport). | 1890 // Page scale should update metadata correctly (shrinking only the viewport). |
1869 host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE); | 1891 host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE); |
1870 host_impl_->PinchGestureBegin(); | 1892 host_impl_->PinchGestureBegin(); |
1871 host_impl_->PinchGestureUpdate(2.f, gfx::Point()); | 1893 host_impl_->PinchGestureUpdate(2.f, gfx::Point()); |
(...skipping 2093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3965 host_impl_->PinchGestureEnd(); | 3987 host_impl_->PinchGestureEnd(); |
3966 host_impl_->ScrollEnd(); | 3988 host_impl_->ScrollEnd(); |
3967 | 3989 |
3968 // Scrolling should be relative to the offset as returned by the delegate. | 3990 // Scrolling should be relative to the offset as returned by the delegate. |
3969 gfx::Vector2dF scroll_delta(0.f, 10.f); | 3991 gfx::Vector2dF scroll_delta(0.f, 10.f); |
3970 gfx::ScrollOffset current_offset(7.f, 8.f); | 3992 gfx::ScrollOffset current_offset(7.f, 8.f); |
3971 | 3993 |
3972 scroll_delegate.set_getter_return_value(current_offset); | 3994 scroll_delegate.set_getter_return_value(current_offset); |
3973 EXPECT_EQ(InputHandler::SCROLL_STARTED, | 3995 EXPECT_EQ(InputHandler::SCROLL_STARTED, |
3974 host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE)); | 3996 host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE)); |
| 3997 host_impl_->OnRootLayerDelegatedScrollOffsetChanged(); |
3975 | 3998 |
3976 host_impl_->ScrollBy(gfx::Point(), scroll_delta); | 3999 host_impl_->ScrollBy(gfx::Point(), scroll_delta); |
3977 EXPECT_EQ(ScrollOffsetWithDelta(current_offset, scroll_delta), | 4000 EXPECT_EQ(ScrollOffsetWithDelta(current_offset, scroll_delta), |
3978 scroll_delegate.last_set_scroll_offset()); | 4001 scroll_delegate.last_set_scroll_offset()); |
3979 | 4002 |
3980 current_offset = gfx::ScrollOffset(42.f, 41.f); | 4003 current_offset = gfx::ScrollOffset(42.f, 41.f); |
3981 scroll_delegate.set_getter_return_value(current_offset); | 4004 scroll_delegate.set_getter_return_value(current_offset); |
| 4005 host_impl_->OnRootLayerDelegatedScrollOffsetChanged(); |
3982 host_impl_->ScrollBy(gfx::Point(), scroll_delta); | 4006 host_impl_->ScrollBy(gfx::Point(), scroll_delta); |
3983 EXPECT_EQ(current_offset + gfx::ScrollOffset(scroll_delta), | 4007 EXPECT_EQ(current_offset + gfx::ScrollOffset(scroll_delta), |
3984 scroll_delegate.last_set_scroll_offset()); | 4008 scroll_delegate.last_set_scroll_offset()); |
3985 host_impl_->ScrollEnd(); | 4009 host_impl_->ScrollEnd(); |
3986 scroll_delegate.set_getter_return_value(gfx::ScrollOffset()); | 4010 scroll_delegate.set_getter_return_value(gfx::ScrollOffset()); |
| 4011 host_impl_->OnRootLayerDelegatedScrollOffsetChanged(); |
3987 | 4012 |
3988 // Forces a full tree synchronization and ensures that the scroll delegate | 4013 // Forces a full tree synchronization and ensures that the scroll delegate |
3989 // sees the correct size of the new tree. | 4014 // sees the correct size of the new tree. |
3990 gfx::Size new_size(42, 24); | 4015 gfx::Size new_size(42, 24); |
3991 host_impl_->CreatePendingTree(); | 4016 host_impl_->CreatePendingTree(); |
3992 CreateScrollAndContentsLayers(host_impl_->pending_tree(), new_size); | 4017 CreateScrollAndContentsLayers(host_impl_->pending_tree(), new_size); |
3993 host_impl_->ActivateSyncTree(); | 4018 host_impl_->ActivateSyncTree(); |
3994 EXPECT_EQ(new_size, scroll_delegate.scrollable_size()); | 4019 EXPECT_EQ(new_size, scroll_delegate.scrollable_size()); |
3995 | 4020 |
3996 // Un-setting the delegate should propagate the delegate's current offset to | 4021 // Un-setting the delegate should propagate the delegate's current offset to |
3997 // the root scrollable layer. | 4022 // the root scrollable layer. |
3998 current_offset = gfx::ScrollOffset(13.f, 12.f); | 4023 current_offset = gfx::ScrollOffset(13.f, 12.f); |
3999 scroll_delegate.set_getter_return_value(current_offset); | 4024 scroll_delegate.set_getter_return_value(current_offset); |
| 4025 host_impl_->OnRootLayerDelegatedScrollOffsetChanged(); |
4000 host_impl_->SetRootLayerScrollOffsetDelegate(NULL); | 4026 host_impl_->SetRootLayerScrollOffsetDelegate(NULL); |
4001 | 4027 |
4002 EXPECT_EQ(current_offset.ToString(), | 4028 EXPECT_EQ(current_offset.ToString(), |
4003 scroll_layer->CurrentScrollOffset().ToString()); | 4029 scroll_layer->CurrentScrollOffset().ToString()); |
4004 } | 4030 } |
4005 | 4031 |
4006 void CheckLayerScrollDelta(LayerImpl* layer, gfx::Vector2dF scroll_delta) { | 4032 void CheckLayerScrollDelta(LayerImpl* layer, gfx::Vector2dF scroll_delta) { |
4007 const gfx::Transform target_space_transform = | 4033 const gfx::Transform target_space_transform = |
4008 layer->draw_properties().target_space_transform; | 4034 layer->draw_properties().target_space_transform; |
4009 EXPECT_TRUE(target_space_transform.IsScaleOrTranslation()); | 4035 EXPECT_TRUE(target_space_transform.IsScaleOrTranslation()); |
(...skipping 3849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7859 inner_clip->SetHasRenderSurface(true); | 7885 inner_clip->SetHasRenderSurface(true); |
7860 layer_tree_impl->SetRootLayer(inner_clip.Pass()); | 7886 layer_tree_impl->SetRootLayer(inner_clip.Pass()); |
7861 layer_tree_impl->SetViewportLayersFromIds( | 7887 layer_tree_impl->SetViewportLayersFromIds( |
7862 Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, | 7888 Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, |
7863 kOuterViewportScrollLayerId); | 7889 kOuterViewportScrollLayerId); |
7864 | 7890 |
7865 host_impl_->active_tree()->DidBecomeActive(); | 7891 host_impl_->active_tree()->DidBecomeActive(); |
7866 } | 7892 } |
7867 }; | 7893 }; |
7868 | 7894 |
| 7895 TEST_F(LayerTreeHostImplVirtualViewportTest, ScrollBothInnerAndOuterLayer) { |
| 7896 gfx::Size content_size = gfx::Size(100, 160); |
| 7897 gfx::Size outer_viewport = gfx::Size(50, 80); |
| 7898 gfx::Size inner_viewport = gfx::Size(25, 40); |
| 7899 |
| 7900 SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport); |
| 7901 |
| 7902 TestScrollOffsetDelegate scroll_delegate; |
| 7903 host_impl_->SetRootLayerScrollOffsetDelegate(&scroll_delegate); |
| 7904 |
| 7905 LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer(); |
| 7906 LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer(); |
| 7907 DrawFrame(); |
| 7908 { |
| 7909 gfx::ScrollOffset inner_expected; |
| 7910 gfx::ScrollOffset outer_expected; |
| 7911 EXPECT_EQ(inner_expected, inner_scroll->CurrentScrollOffset()); |
| 7912 EXPECT_EQ(outer_expected, outer_scroll->CurrentScrollOffset()); |
| 7913 |
| 7914 gfx::ScrollOffset current_offset(70.f, 100.f); |
| 7915 |
| 7916 scroll_delegate.set_getter_return_value(current_offset); |
| 7917 host_impl_->OnRootLayerDelegatedScrollOffsetChanged(); |
| 7918 EXPECT_EQ(gfx::ScrollOffset(25.f, 40.f), inner_scroll->MaxScrollOffset()); |
| 7919 EXPECT_EQ(gfx::ScrollOffset(50.f, 80.f), outer_scroll->MaxScrollOffset()); |
| 7920 |
| 7921 // Outer viewport scrolls first. Then the rest is applied to the inner |
| 7922 // viewport. |
| 7923 EXPECT_EQ(gfx::ScrollOffset(20.f, 20.f), |
| 7924 inner_scroll->CurrentScrollOffset()); |
| 7925 EXPECT_EQ(gfx::ScrollOffset(50.f, 80.f), |
| 7926 outer_scroll->CurrentScrollOffset()); |
| 7927 } |
| 7928 } |
| 7929 |
7869 TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) { | 7930 TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) { |
7870 gfx::Size content_size = gfx::Size(100, 160); | 7931 gfx::Size content_size = gfx::Size(100, 160); |
7871 gfx::Size outer_viewport = gfx::Size(50, 80); | 7932 gfx::Size outer_viewport = gfx::Size(50, 80); |
7872 gfx::Size inner_viewport = gfx::Size(25, 40); | 7933 gfx::Size inner_viewport = gfx::Size(25, 40); |
7873 | 7934 |
7874 SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport); | 7935 SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport); |
7875 | 7936 |
7876 LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer(); | 7937 LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer(); |
7877 LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer(); | 7938 LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer(); |
7878 DrawFrame(); | 7939 DrawFrame(); |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8465 // surface. | 8526 // surface. |
8466 EXPECT_EQ(0, num_lost_surfaces_); | 8527 EXPECT_EQ(0, num_lost_surfaces_); |
8467 host_impl_->DidLoseOutputSurface(); | 8528 host_impl_->DidLoseOutputSurface(); |
8468 EXPECT_EQ(1, num_lost_surfaces_); | 8529 EXPECT_EQ(1, num_lost_surfaces_); |
8469 host_impl_->DidLoseOutputSurface(); | 8530 host_impl_->DidLoseOutputSurface(); |
8470 EXPECT_LE(1, num_lost_surfaces_); | 8531 EXPECT_LE(1, num_lost_surfaces_); |
8471 } | 8532 } |
8472 | 8533 |
8473 } // namespace | 8534 } // namespace |
8474 } // namespace cc | 8535 } // namespace cc |
OLD | NEW |