summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorajuma <ajuma@chromium.org>2015-10-21 06:06:32 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-21 13:07:11 +0000
commited5bee1d1a8b8a2e2c793d1118367537d05d7a23 (patch)
tree5347fa504f9561d1775c1b9a573a04ec86224edb /cc
parent8d6fcf60aef7e6ac90afed729cf6384a9f4719e9 (diff)
downloadchromium_src-ed5bee1d1a8b8a2e2c793d1118367537d05d7a23.zip
chromium_src-ed5bee1d1a8b8a2e2c793d1118367537d05d7a23.tar.gz
chromium_src-ed5bee1d1a8b8a2e2c793d1118367537d05d7a23.tar.bz2
cc: Make property trees support external viewports
This makes the clip tree get updated for changes to the viewport rect that happen on the compositor thread via calls to LTHI::SetExternalDrawConstraints (this is used by Android WebView). BUG=524106 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1413743005 Cr-Commit-Position: refs/heads/master@{#355278}
Diffstat (limited to 'cc')
-rw-r--r--cc/trees/layer_tree_host_common.cc3
-rw-r--r--cc/trees/layer_tree_host_impl.cc2
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc35
-rw-r--r--cc/trees/property_tree_builder.cc1
4 files changed, 39 insertions, 2 deletions
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 143c7b1..ccffb0f 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -2708,6 +2708,9 @@ void CalculateDrawPropertiesAndVerify(
inputs->property_trees, inputs->page_scale_layer,
inputs->page_scale_factor, inputs->device_scale_factor,
inputs->device_transform);
+ // Similarly, the device viewport is shared between both trees.
+ inputs->property_trees->clip_tree.SetViewportClip(
+ gfx::RectF(gfx::SizeF(inputs->device_viewport_size)));
ComputeVisibleRectsUsingPropertyTrees(
inputs->root_layer, inputs->property_trees,
inputs->can_render_to_separate_surface, &update_layer_list);
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 98118cc..2613af2 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2302,8 +2302,6 @@ void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) {
client_->OnCanDrawStateChanged(CanDraw());
SetFullRootLayerDamage();
active_tree_->set_needs_update_draw_properties();
- active_tree_->property_trees()->clip_tree.SetViewportClip(
- gfx::RectF(gfx::SizeF(device_viewport_size)));
}
const gfx::Rect LayerTreeHostImpl::ViewportRectForTilePriority() const {
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 3824186..2eae9ac 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -8245,6 +8245,41 @@ TEST_F(LayerTreeHostImplTest, ExternalTransformSetNeedsRedraw) {
}
}
+TEST_F(LayerTreeHostImplTest, ExternalViewportAffectsVisibleRects) {
+ const gfx::Size layer_size(100, 100);
+ SetupScrollAndContentsLayers(layer_size);
+ LayerImpl* content_layer =
+ host_impl_->active_tree()->OuterViewportScrollLayer()->children()[0];
+ RebuildPropertyTrees();
+
+ bool update_lcd_text = false;
+
+ host_impl_->SetViewportSize(gfx::Size(90, 90));
+ host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
+ EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect());
+
+ gfx::Transform external_transform;
+ gfx::Rect external_viewport(10, 20);
+ gfx::Rect external_clip(layer_size);
+ bool resourceless_software_draw = false;
+ host_impl_->SetExternalDrawConstraints(
+ external_transform, external_viewport, external_clip, external_viewport,
+ external_transform, resourceless_software_draw);
+
+ // Visible rects should now be clipped by the external viewport.
+ host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
+ EXPECT_EQ(gfx::Rect(10, 20), content_layer->visible_layer_rect());
+
+ // Clear the external viewport.
+ external_viewport = gfx::Rect();
+ host_impl_->SetExternalDrawConstraints(
+ external_transform, external_viewport, external_clip, external_viewport,
+ external_transform, resourceless_software_draw);
+
+ host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
+ EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect());
+}
+
TEST_F(LayerTreeHostImplTest, ScrollAnimated) {
SetupScrollAndContentsLayers(gfx::Size(100, 200));
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index 1207b40..262a52c 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -544,6 +544,7 @@ void BuildPropertyTreesTopLevelInternal(
UpdatePageScaleFactorInPropertyTrees(property_trees, page_scale_layer,
page_scale_factor, device_scale_factor,
device_transform);
+ property_trees->clip_tree.SetViewportClip(gfx::RectF(viewport));
return;
}