Index: cc/trees/layer_tree_impl_unittest.cc |
diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc |
index 006fc35997a810801da311db61def74a1291bf5d..9edf838bb60c3379ffe76fc01943a19ac3dc5e22 100644 |
--- a/cc/trees/layer_tree_impl_unittest.cc |
+++ b/cc/trees/layer_tree_impl_unittest.cc |
@@ -2070,5 +2070,254 @@ TEST_F(LayerTreeImplTest, HitCheckingTouchHandlerOverlappingRegions) { |
EXPECT_FALSE(result_layer); |
} |
+TEST_F(LayerTreeImplTest, SelectionBoundsForSingleLayer) { |
+ int root_layer_id = 12345; |
+ scoped_ptr<LayerImpl> root = |
+ LayerImpl::Create(host_impl().active_tree(), root_layer_id); |
+ |
+ gfx::Transform identity_matrix; |
+ gfx::Point3F transform_origin; |
+ gfx::PointF position; |
+ gfx::Size bounds(100, 100); |
+ SetLayerPropertiesForTesting(root.get(), |
+ identity_matrix, |
+ transform_origin, |
+ position, |
+ bounds, |
+ true, |
+ false); |
+ root->SetDrawsContent(true); |
+ |
+ host_impl().SetViewportSize(root->bounds()); |
+ host_impl().active_tree()->SetRootLayer(root.Pass()); |
+ host_impl().active_tree()->UpdateDrawProperties(); |
+ |
+ // Sanity check the scenario we just created. |
+ ASSERT_EQ(1u, RenderSurfaceLayerList().size()); |
+ ASSERT_EQ(1u, root_layer()->render_surface()->layer_list().size()); |
+ |
+ LayerSelectionBound left_input; |
+ left_input.type = SELECTION_BOUND_LEFT; |
+ left_input.layer_rect = gfx::RectF(10, 10, 5, 20); |
+ left_input.layer_id = root_layer_id; |
+ |
+ LayerSelectionBound right_input; |
+ right_input.type = SELECTION_BOUND_RIGHT; |
+ right_input.layer_rect = gfx::RectF(50, 10, 5, 20); |
+ right_input.layer_id = root_layer_id; |
+ |
+ ViewportSelectionBound left_output, right_output; |
+ |
+ // Empty input bounds should produce empty output bounds. |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_EQ(ViewportSelectionBound(), left_output); |
+ EXPECT_EQ(ViewportSelectionBound(), right_output); |
+ |
+ // Selection bounds should produce distinct left and right bounds. |
+ host_impl().active_tree()->RegisterSelection(left_input, right_input); |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_EQ(left_input.type, left_output.type); |
+ EXPECT_EQ(left_input.layer_rect, left_output.viewport_rect); |
+ EXPECT_TRUE(left_output.visible); |
+ EXPECT_EQ(right_input.type, right_output.type); |
+ EXPECT_EQ(right_input.layer_rect, right_output.viewport_rect); |
+ EXPECT_TRUE(right_output.visible); |
+ |
+ // Insertion bounds should produce identical left and right bounds. |
+ LayerSelectionBound insertion_input; |
+ insertion_input.type = SELECTION_BOUND_CENTER; |
+ insertion_input.layer_rect = gfx::RectF(10, 10, 5, 20); |
+ insertion_input.layer_id = root_layer_id; |
+ host_impl().active_tree()->RegisterSelection(insertion_input, |
+ LayerSelectionBound()); |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_EQ(insertion_input.type, left_output.type); |
+ EXPECT_EQ(insertion_input.layer_rect, left_output.viewport_rect); |
+ EXPECT_TRUE(left_output.visible); |
+ EXPECT_EQ(left_output, right_output); |
+} |
+ |
+TEST_F(LayerTreeImplTest, SelectionBoundsForPartialOccludedLayers) { |
+ int root_layer_id = 12345; |
+ int clip_layer_id = 1234; |
+ int clipped_layer_id = 123; |
+ scoped_ptr<LayerImpl> root = |
+ LayerImpl::Create(host_impl().active_tree(), root_layer_id); |
+ root->SetDrawsContent(true); |
+ |
+ gfx::Transform identity_matrix; |
+ gfx::Point3F transform_origin; |
+ gfx::PointF position; |
+ gfx::Size bounds(100, 100); |
+ SetLayerPropertiesForTesting(root.get(), |
+ identity_matrix, |
+ transform_origin, |
+ position, |
+ bounds, |
+ true, |
+ false); |
+ |
+ gfx::Vector2dF clipping_offset(10, 10); |
+ { |
+ scoped_ptr<LayerImpl> clipping_layer = |
+ LayerImpl::Create(host_impl().active_tree(), clip_layer_id); |
+ // The clipping layer should occlude the right selection bound. |
+ gfx::PointF position = gfx::PointF() + clipping_offset; |
+ gfx::Size bounds(50, 50); |
+ SetLayerPropertiesForTesting(clipping_layer.get(), |
+ identity_matrix, |
+ transform_origin, |
+ position, |
+ bounds, |
+ true, |
+ false); |
+ clipping_layer->SetMasksToBounds(true); |
+ |
+ scoped_ptr<LayerImpl> clipped_layer = |
+ LayerImpl::Create(host_impl().active_tree(), clipped_layer_id); |
+ position = gfx::PointF(); |
+ bounds = gfx::Size(100, 100); |
+ SetLayerPropertiesForTesting(clipped_layer.get(), |
+ identity_matrix, |
+ transform_origin, |
+ position, |
+ bounds, |
+ true, |
+ false); |
+ clipped_layer->SetDrawsContent(true); |
+ clipping_layer->AddChild(clipped_layer.Pass()); |
+ root->AddChild(clipping_layer.Pass()); |
+ } |
+ |
+ host_impl().SetViewportSize(root->bounds()); |
+ host_impl().active_tree()->SetRootLayer(root.Pass()); |
+ host_impl().active_tree()->UpdateDrawProperties(); |
+ |
+ // Sanity check the scenario we just created. |
+ ASSERT_EQ(1u, RenderSurfaceLayerList().size()); |
+ |
+ LayerSelectionBound left_input; |
+ left_input.type = SELECTION_BOUND_LEFT; |
+ left_input.layer_rect = gfx::RectF(25, 10, 5, 20); |
+ left_input.layer_id = clipped_layer_id; |
+ |
+ LayerSelectionBound right_input; |
+ right_input.type = SELECTION_BOUND_RIGHT; |
+ right_input.layer_rect = gfx::RectF(75, 10, 5, 20); |
+ right_input.layer_id = clipped_layer_id; |
+ host_impl().active_tree()->RegisterSelection(left_input, right_input); |
+ |
+ // The left bound should be occluded by the clip layer. |
+ ViewportSelectionBound left_output, right_output; |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_EQ(left_input.type, left_output.type); |
+ gfx::RectF expected_left_output_rect = left_input.layer_rect; |
+ expected_left_output_rect.Offset(clipping_offset); |
+ EXPECT_EQ(expected_left_output_rect, left_output.viewport_rect); |
+ EXPECT_TRUE(left_output.visible); |
+ EXPECT_EQ(right_input.type, right_output.type); |
+ gfx::RectF expected_right_output_rect = right_input.layer_rect; |
+ expected_right_output_rect.Offset(clipping_offset); |
+ EXPECT_EQ(expected_right_output_rect, right_output.viewport_rect); |
+ EXPECT_FALSE(right_output.visible); |
+ |
+ // Handles outside the viewport bounds should be marked invisible. |
+ left_input.layer_rect = gfx::RectF(-25, 0, 5, 20); |
+ host_impl().active_tree()->RegisterSelection(left_input, right_input); |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_FALSE(left_output.visible); |
+ |
+ left_input.layer_rect = gfx::RectF(0, -25, 5, 20); |
+ host_impl().active_tree()->RegisterSelection(left_input, right_input); |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_FALSE(left_output.visible); |
+ |
+ // If the handle bottom is partially visible, the handle is marked visible. |
+ left_input.layer_rect = gfx::RectF(0, -20, 5, 21); |
+ host_impl().active_tree()->RegisterSelection(left_input, right_input); |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_TRUE(left_output.visible); |
+} |
+ |
+TEST_F(LayerTreeImplTest, SelectionBoundsForScaledLayers) { |
+ int root_layer_id = 1; |
+ int sub_layer_id = 2; |
+ scoped_ptr<LayerImpl> root = |
+ LayerImpl::Create(host_impl().active_tree(), root_layer_id); |
+ root->SetDrawsContent(true); |
+ |
+ gfx::Transform identity_matrix; |
+ gfx::Point3F transform_origin; |
+ gfx::PointF position; |
+ gfx::Size bounds(100, 100); |
+ SetLayerPropertiesForTesting(root.get(), |
+ identity_matrix, |
+ transform_origin, |
+ position, |
+ bounds, |
+ true, |
+ false); |
+ |
+ gfx::Vector2dF sub_layer_offset(10, 0); |
+ { |
+ scoped_ptr<LayerImpl> sub_layer = |
+ LayerImpl::Create(host_impl().active_tree(), sub_layer_id); |
+ gfx::PointF position = gfx::PointF() + sub_layer_offset; |
+ gfx::Size bounds(50, 50); |
+ SetLayerPropertiesForTesting(sub_layer.get(), |
+ identity_matrix, |
+ transform_origin, |
+ position, |
+ bounds, |
+ true, |
+ false); |
+ sub_layer->SetDrawsContent(true); |
+ root->AddChild(sub_layer.Pass()); |
+ } |
+ |
+ float device_scale_factor = 3.f; |
+ float page_scale_factor = 5.f; |
+ gfx::Size scaled_bounds_for_root = gfx::ToCeiledSize( |
+ gfx::ScaleSize(root->bounds(), device_scale_factor * page_scale_factor)); |
+ host_impl().SetViewportSize(scaled_bounds_for_root); |
+ |
+ host_impl().SetDeviceScaleFactor(device_scale_factor); |
+ host_impl().active_tree()->SetPageScaleFactorAndLimits( |
+ page_scale_factor, page_scale_factor, page_scale_factor); |
+ host_impl().active_tree()->SetRootLayer(root.Pass()); |
+ host_impl().active_tree()->SetViewportLayersFromIds(1, 1, Layer::INVALID_ID); |
+ host_impl().active_tree()->UpdateDrawProperties(); |
+ |
+ // Sanity check the scenario we just created. |
+ ASSERT_EQ(1u, RenderSurfaceLayerList().size()); |
+ |
+ LayerSelectionBound left_input; |
+ left_input.type = SELECTION_BOUND_LEFT; |
+ left_input.layer_rect = gfx::RectF(10, 10, 5, 20); |
+ left_input.layer_id = root_layer_id; |
+ |
+ LayerSelectionBound right_input; |
+ right_input.type = SELECTION_BOUND_RIGHT; |
+ right_input.layer_rect = gfx::RectF(0, 0, 5, 20); |
+ right_input.layer_id = sub_layer_id; |
+ host_impl().active_tree()->RegisterSelection(left_input, right_input); |
+ |
+ // The viewport bounds should be properly scaled by the page scale, but should |
+ // remain in DIP coordinates. |
+ ViewportSelectionBound left_output, right_output; |
+ host_impl().active_tree()->GetViewportSelection(&left_output, &right_output); |
+ EXPECT_EQ(left_input.type, left_output.type); |
+ gfx::RectF expected_left_output_rect = left_input.layer_rect; |
+ expected_left_output_rect.Scale(page_scale_factor); |
+ EXPECT_EQ(left_input.layer_rect, left_output.viewport_rect); |
+ EXPECT_TRUE(left_output.visible); |
+ EXPECT_EQ(right_input.type, right_output.type); |
+ gfx::RectF expected_right_output_rect = right_input.layer_rect; |
+ expected_right_output_rect.Offset(sub_layer_offset); |
+ expected_right_output_rect.Scale(page_scale_factor); |
+ EXPECT_EQ(expected_right_output_rect, right_output.viewport_rect); |
+ EXPECT_TRUE(right_output.visible); |
+} |
+ |
} // namespace |
} // namespace cc |