summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbokan <bokan@chromium.org>2014-09-29 06:47:21 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-29 13:47:40 +0000
commit59379b09a4cbc478ce8e72db7bc658d9a8421ef5 (patch)
tree4b99335832b57cb8ab2ad043ed72a10e5efe80ae
parentc4e4aaaf43c0da2a01c0f32be737dcbbd5f13e92 (diff)
downloadchromium_src-59379b09a4cbc478ce8e72db7bc658d9a8421ef5.zip
chromium_src-59379b09a4cbc478ce8e72db7bc658d9a8421ef5.tar.gz
chromium_src-59379b09a4cbc478ce8e72db7bc658d9a8421ef5.tar.bz2
Made double-tap zoom work in pinch virtual viewport mode (Chromium-side).
On the Blink side: The clamping method used by computeScaleAndScrollForBlockRect now uses a new method PinchViewport::clampDocumentOffsetAtScale to clamp the requested viewport offset taking into account the inner and outer viewports. Also added an overload of applyViewportDeltas, called in virtual viewport mode only, that applies the inner and outer deltas along page scale in one shot. This makes the viewport layers a special case again in that their scroll offsets are set through this call, rather than the standard 'did_scroll' callback of most layers. This is needed since the scroll offsets may be invalid until the page scale is applied so this is handled in one method to prevent unintended clamping. On the Compositor side: Calls the appropriate applyViewportDeltas based on which pinch mode we're running in. The page scale animation now prefers to scroll the inner viewport first, scrolling the outer only when the inner has reached its scroll extent. Blink-side: https://codereview.chromium.org/584833003 BUG=364106 Review URL: https://codereview.chromium.org/585063002 Cr-Commit-Position: refs/heads/master@{#297167}
-rw-r--r--android_webview/browser/hardware_renderer.h4
-rw-r--r--cc/test/fake_layer_tree_host_client.h4
-rw-r--r--cc/test/layer_tree_test.cc9
-rw-r--r--cc/test/layer_tree_test.h4
-rw-r--r--cc/trees/layer_tree_host.cc22
-rw-r--r--cc/trees/layer_tree_host_client.h4
-rw-r--r--cc/trees/layer_tree_host_impl.cc11
-rw-r--r--cc/trees/layer_tree_host_impl.h5
-rw-r--r--cc/trees/layer_tree_host_unittest_no_message_loop.cc4
-rw-r--r--content/browser/renderer_host/compositor_impl_android.h5
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc12
-rw-r--r--content/renderer/gpu/render_widget_compositor.h4
-rw-r--r--content/test/web_layer_tree_view_impl_for_testing.cc6
-rw-r--r--content/test/web_layer_tree_view_impl_for_testing.h4
-rw-r--r--mojo/examples/compositor_app/compositor_host.cc4
-rw-r--r--mojo/examples/compositor_app/compositor_host.h4
-rw-r--r--mojo/services/html_viewer/weblayertreeview_impl.cc12
-rw-r--r--mojo/services/html_viewer/weblayertreeview_impl.h4
-rw-r--r--ui/compositor/compositor.h5
19 files changed, 119 insertions, 8 deletions
diff --git a/android_webview/browser/hardware_renderer.h b/android_webview/browser/hardware_renderer.h
index 481414c..9189b18e 100644
--- a/android_webview/browser/hardware_renderer.h
+++ b/android_webview/browser/hardware_renderer.h
@@ -43,6 +43,10 @@ class HardwareRenderer : public cc::LayerTreeHostClient,
virtual void DidBeginMainFrame() OVERRIDE;
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE {}
virtual void Layout() OVERRIDE {}
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE {}
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE {}
diff --git a/cc/test/fake_layer_tree_host_client.h b/cc/test/fake_layer_tree_host_client.h
index bfbd1ef..6ad53d6 100644
--- a/cc/test/fake_layer_tree_host_client.h
+++ b/cc/test/fake_layer_tree_host_client.h
@@ -34,6 +34,10 @@ class FakeLayerTreeHostClient : public LayerTreeHostClient,
virtual void DidBeginMainFrame() OVERRIDE {}
virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE {}
virtual void Layout() OVERRIDE {}
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE {}
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE {}
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index 15d15c1..9296040 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -280,6 +280,15 @@ class LayerTreeHostClientForTesting : public LayerTreeHostClient,
virtual void Layout() OVERRIDE { test_hooks_->Layout(); }
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE {
+ test_hooks_->ApplyViewportDeltas(inner_delta,
+ outer_delta,
+ page_scale,
+ top_controls_delta);
+ }
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float scale,
float top_controls_delta) OVERRIDE {
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index 0fc35ca..36f37ef 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -58,6 +58,10 @@ class TestHooks : public AnimationDelegate {
bool has_unfinished_animation) {}
virtual void WillAnimateLayers(LayerTreeHostImpl* host_impl,
base::TimeTicks monotonic_time) {}
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float scale,
+ float top_controls_delta) {}
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float scale,
float top_controls_delta) {}
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 6b86eb6..84b1644 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -1097,11 +1097,11 @@ void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) {
// SetScrollOffsetFromImplSide above could have destroyed the tree,
// so re-get this layer before doing anything to it.
+ DCHECK(inner_viewport_scroll_layer_.get()); // We should always have this.
+
// 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.
- DCHECK(inner_viewport_scroll_layer_.get()); // We should always have this.
-
inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
inner_viewport_scroll_layer_->scroll_offset() +
inner_viewport_scroll_delta);
@@ -1110,12 +1110,20 @@ void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) {
outer_viewport_scroll_layer_->scroll_offset() +
outer_viewport_scroll_delta);
}
- ApplyPageScaleDeltaFromImplSide(info->page_scale_delta);
- client_->ApplyViewportDeltas(
- inner_viewport_scroll_delta + outer_viewport_scroll_delta,
- info->page_scale_delta,
- info->top_controls_delta);
+ ApplyPageScaleDeltaFromImplSide(info->page_scale_delta);
+ if (!outer_viewport_scroll_layer_.get()) {
+ client_->ApplyViewportDeltas(
+ inner_viewport_scroll_delta + outer_viewport_scroll_delta,
+ info->page_scale_delta,
+ info->top_controls_delta);
+ } else {
+ client_->ApplyViewportDeltas(
+ inner_viewport_scroll_delta,
+ outer_viewport_scroll_delta,
+ info->page_scale_delta,
+ info->top_controls_delta);
+ }
}
}
diff --git a/cc/trees/layer_tree_host_client.h b/cc/trees/layer_tree_host_client.h
index 95480ef..dca389d 100644
--- a/cc/trees/layer_tree_host_client.h
+++ b/cc/trees/layer_tree_host_client.h
@@ -27,6 +27,10 @@ class LayerTreeHostClient {
virtual void BeginMainFrame(const BeginFrameArgs& args) = 0;
virtual void DidBeginMainFrame() = 0;
virtual void Layout() = 0;
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) = 0;
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) = 0;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 5771bbb..aa7c5a2 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2961,6 +2961,15 @@ void LayerTreeHostImpl::SetFullRootLayerDamage() {
SetViewportDamage(gfx::Rect(DrawViewportSize()));
}
+void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) {
+ DCHECK(InnerViewportScrollLayer());
+ LayerImpl* scroll_layer = InnerViewportScrollLayer();
+
+ gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta);
+ if (!unused_delta.IsZero() && OuterViewportScrollLayer())
+ OuterViewportScrollLayer()->ScrollBy(unused_delta);
+}
+
void LayerTreeHostImpl::ScrollViewportBy(gfx::Vector2dF scroll_delta) {
DCHECK(InnerViewportScrollLayer());
LayerImpl* scroll_layer = OuterViewportScrollLayer()
@@ -2988,7 +2997,7 @@ void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) {
gfx::Vector2dF next_scroll =
page_scale_animation_->ScrollOffsetAtTime(monotonic_time);
- ScrollViewportBy(next_scroll - scroll_total);
+ ScrollViewportInnerFirst(next_scroll - scroll_total);
SetNeedsRedraw();
if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) {
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index a7a0e30..0fe1ec9 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -522,7 +522,12 @@ class CC_EXPORT LayerTreeHostImpl
bool UseZeroCopyRasterizer() const;
bool UseOneCopyRasterizer() const;
+ // Scroll by preferring to move the outer viewport first, only moving the
+ // inner if the outer is at its scroll extents.
void ScrollViewportBy(gfx::Vector2dF scroll_delta);
+ // Scroll by preferring to move the inner viewport first, only moving the
+ // outer if the inner is at its scroll extents.
+ void ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta);
void AnimatePageScale(base::TimeTicks monotonic_time);
void AnimateScrollbars(base::TimeTicks monotonic_time);
void AnimateTopControls(base::TimeTicks monotonic_time);
diff --git a/cc/trees/layer_tree_host_unittest_no_message_loop.cc b/cc/trees/layer_tree_host_unittest_no_message_loop.cc
index 9e38f1c..a48156b 100644
--- a/cc/trees/layer_tree_host_unittest_no_message_loop.cc
+++ b/cc/trees/layer_tree_host_unittest_no_message_loop.cc
@@ -57,6 +57,10 @@ class LayerTreeHostNoMessageLoopTest
virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE {}
virtual void DidBeginMainFrame() OVERRIDE {}
virtual void Layout() OVERRIDE {}
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE {}
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE {}
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h
index e6d11f1..b665ffc 100644
--- a/content/browser/renderer_host/compositor_impl_android.h
+++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -75,6 +75,11 @@ class CONTENT_EXPORT CompositorImpl
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE {}
virtual void Layout() OVERRIDE;
virtual void ApplyViewportDeltas(
+ const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE {}
+ virtual void ApplyViewportDeltas(
const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE {}
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index 9c0f632..ce91ffb 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -787,6 +787,18 @@ void RenderWidgetCompositor::Layout() {
}
void RenderWidgetCompositor::ApplyViewportDeltas(
+ const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) {
+ widget_->webwidget()->applyViewportDeltas(
+ inner_delta,
+ outer_delta,
+ page_scale,
+ top_controls_delta);
+}
+
+void RenderWidgetCompositor::ApplyViewportDeltas(
const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) {
diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h
index f80ce06..6388d62 100644
--- a/content/renderer/gpu/render_widget_compositor.h
+++ b/content/renderer/gpu/render_widget_compositor.h
@@ -132,6 +132,10 @@ class CONTENT_EXPORT RenderWidgetCompositor
virtual void DidBeginMainFrame() OVERRIDE;
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE;
virtual void Layout() OVERRIDE;
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE;
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE;
diff --git a/content/test/web_layer_tree_view_impl_for_testing.cc b/content/test/web_layer_tree_view_impl_for_testing.cc
index c8dd325..b188384 100644
--- a/content/test/web_layer_tree_view_impl_for_testing.cc
+++ b/content/test/web_layer_tree_view_impl_for_testing.cc
@@ -138,6 +138,12 @@ void WebLayerTreeViewImplForTesting::Layout() {
}
void WebLayerTreeViewImplForTesting::ApplyViewportDeltas(
+ const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) {}
+
+void WebLayerTreeViewImplForTesting::ApplyViewportDeltas(
const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) {}
diff --git a/content/test/web_layer_tree_view_impl_for_testing.h b/content/test/web_layer_tree_view_impl_for_testing.h
index a890c4c..72761c8 100644
--- a/content/test/web_layer_tree_view_impl_for_testing.h
+++ b/content/test/web_layer_tree_view_impl_for_testing.h
@@ -69,6 +69,10 @@ class WebLayerTreeViewImplForTesting
virtual void DidBeginMainFrame() OVERRIDE {}
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE {}
virtual void Layout() OVERRIDE;
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE;
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE;
diff --git a/mojo/examples/compositor_app/compositor_host.cc b/mojo/examples/compositor_app/compositor_host.cc
index 13e544c..0cd6fb9 100644
--- a/mojo/examples/compositor_app/compositor_host.cc
+++ b/mojo/examples/compositor_app/compositor_host.cc
@@ -72,6 +72,10 @@ void CompositorHost::BeginMainFrame(const cc::BeginFrameArgs& args) {
}
void CompositorHost::Layout() {}
+void CompositorHost::ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) {}
void CompositorHost::ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) {}
diff --git a/mojo/examples/compositor_app/compositor_host.h b/mojo/examples/compositor_app/compositor_host.h
index edc37e0..9b5a2c2 100644
--- a/mojo/examples/compositor_app/compositor_host.h
+++ b/mojo/examples/compositor_app/compositor_host.h
@@ -33,6 +33,10 @@ class CompositorHost : public cc::LayerTreeHostClient {
virtual void DidBeginMainFrame() OVERRIDE;
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE;
virtual void Layout() OVERRIDE;
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE;
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE;
diff --git a/mojo/services/html_viewer/weblayertreeview_impl.cc b/mojo/services/html_viewer/weblayertreeview_impl.cc
index e3b56a8..56ebc34 100644
--- a/mojo/services/html_viewer/weblayertreeview_impl.cc
+++ b/mojo/services/html_viewer/weblayertreeview_impl.cc
@@ -73,6 +73,18 @@ void WebLayerTreeViewImpl::Layout() {
}
void WebLayerTreeViewImpl::ApplyViewportDeltas(
+ const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) {
+ widget_->applyViewportDeltas(
+ inner_delta,
+ outer_delta,
+ page_scale,
+ top_controls_delta);
+}
+
+void WebLayerTreeViewImpl::ApplyViewportDeltas(
const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) {
diff --git a/mojo/services/html_viewer/weblayertreeview_impl.h b/mojo/services/html_viewer/weblayertreeview_impl.h
index 2217c13..4b39a32 100644
--- a/mojo/services/html_viewer/weblayertreeview_impl.h
+++ b/mojo/services/html_viewer/weblayertreeview_impl.h
@@ -48,6 +48,10 @@ class WebLayerTreeViewImpl : public blink::WebLayerTreeView,
virtual void DidBeginMainFrame() OVERRIDE;
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE;
virtual void Layout() OVERRIDE;
+ virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE;
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE;
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index 5418fcf..541f19d 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -233,6 +233,11 @@ class COMPOSITOR_EXPORT Compositor
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE;
virtual void Layout() OVERRIDE;
virtual void ApplyViewportDeltas(
+ const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ float page_scale,
+ float top_controls_delta) OVERRIDE {}
+ virtual void ApplyViewportDeltas(
const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) OVERRIDE {}