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

Unified Diff: cc/trees/layer_tree_host.cc

Issue 2144303002: Made layout viewport scroll updates from compositor work like ordinary layers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@rootScrollerOnCompositor
Patch Set: Initialize ScrollUpdateInfo's layer id in constructor Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host.cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index cd025356975a3d31838bd9bf74d581cd7f189f1b..aafcd8dcd458f446b06646b9babb914ab158370e 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -1069,6 +1069,36 @@ bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) {
return did_paint_content;
}
+void LayerTreeHost::ApplyViewportDeltas(ScrollAndScaleSet* info) {
+ gfx::Vector2dF inner_viewport_scroll_delta;
+ if (info->inner_viewport_scroll.layer_id != Layer::INVALID_ID)
+ inner_viewport_scroll_delta = info->inner_viewport_scroll.scroll_delta;
+
+ if (inner_viewport_scroll_delta.IsZero() && info->page_scale_delta == 1.f &&
+ info->elastic_overscroll_delta.IsZero() && !info->top_controls_delta)
+ return;
+
+ // Preemptively apply the scroll offset and scale delta here before sending
+ // it to the client. If the client comes back and sets it to the same
+ // value, then the layer can early out without needing a full commit.
+ if (inner_viewport_scroll_layer_.get()) {
+ inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
+ gfx::ScrollOffsetWithDelta(
+ inner_viewport_scroll_layer_->scroll_offset(),
+ inner_viewport_scroll_delta));
+ }
+
+ ApplyPageScaleDeltaFromImplSide(info->page_scale_delta);
+ elastic_overscroll_ += info->elastic_overscroll_delta;
+ // TODO(ccameron): pass the elastic overscroll here so that input events
+ // may be translated appropriately.
+ client_->ApplyViewportDeltas(inner_viewport_scroll_delta, gfx::Vector2dF(),
+ info->elastic_overscroll_delta,
+ info->page_scale_delta,
+ info->top_controls_delta);
+ SetNeedsUpdateLayers();
+}
+
void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) {
for (auto& swap_promise : info->swap_promises) {
TRACE_EVENT_WITH_FLOW1("input,benchmark",
@@ -1079,57 +1109,21 @@ void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) {
QueueSwapPromise(std::move(swap_promise));
}
- gfx::Vector2dF inner_viewport_scroll_delta;
- gfx::Vector2dF outer_viewport_scroll_delta;
-
if (root_layer_.get()) {
for (size_t i = 0; i < info->scrolls.size(); ++i) {
Layer* layer = LayerById(info->scrolls[i].layer_id);
if (!layer)
continue;
- if (layer == outer_viewport_scroll_layer_.get()) {
- outer_viewport_scroll_delta += info->scrolls[i].scroll_delta;
- } else if (layer == inner_viewport_scroll_layer_.get()) {
- inner_viewport_scroll_delta += info->scrolls[i].scroll_delta;
- } else {
- layer->SetScrollOffsetFromImplSide(
- gfx::ScrollOffsetWithDelta(layer->scroll_offset(),
- info->scrolls[i].scroll_delta));
- }
+ layer->SetScrollOffsetFromImplSide(gfx::ScrollOffsetWithDelta(
+ layer->scroll_offset(), info->scrolls[i].scroll_delta));
SetNeedsUpdateLayers();
}
}
- if (!inner_viewport_scroll_delta.IsZero() ||
- !outer_viewport_scroll_delta.IsZero() || info->page_scale_delta != 1.f ||
- !info->elastic_overscroll_delta.IsZero() || info->top_controls_delta) {
- // Preemptively apply the scroll offset and scale delta here before sending
- // it to the client. If the client comes back and sets it to the same
- // value, then the layer can early out without needing a full commit.
- if (inner_viewport_scroll_layer_.get()) {
- inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
- gfx::ScrollOffsetWithDelta(
- inner_viewport_scroll_layer_->scroll_offset(),
- inner_viewport_scroll_delta));
- }
-
- if (outer_viewport_scroll_layer_.get()) {
- outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
- gfx::ScrollOffsetWithDelta(
- outer_viewport_scroll_layer_->scroll_offset(),
- outer_viewport_scroll_delta));
- }
-
- ApplyPageScaleDeltaFromImplSide(info->page_scale_delta);
- elastic_overscroll_ += info->elastic_overscroll_delta;
- // TODO(ccameron): pass the elastic overscroll here so that input events
- // may be translated appropriately.
- client_->ApplyViewportDeltas(
- inner_viewport_scroll_delta, outer_viewport_scroll_delta,
- info->elastic_overscroll_delta, info->page_scale_delta,
- info->top_controls_delta);
- SetNeedsUpdateLayers();
- }
+ // This needs to happen after scroll deltas have been sent to prevent top
+ // controls from clamping the layout viewport both on the compositor and
+ // on the main thread.
+ ApplyViewportDeltas(info);
}
void LayerTreeHost::SetDeviceScaleFactor(float device_scale_factor) {
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698