summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFilip Gorski <fgorski@chromium.org>2015-08-26 15:34:22 -0700
committerFilip Gorski <fgorski@chromium.org>2015-08-26 22:35:51 +0000
commitd4fd4f9f580cc7f949ef1d1ce9000ac73f84f8c2 (patch)
tree020811e36466b6d09ee51e9ad05dbf0bd817d613
parentd0eee3662f742bda33a2a44ce07b610a48aa0509 (diff)
downloadchromium_src-d4fd4f9f580cc7f949ef1d1ce9000ac73f84f8c2.zip
chromium_src-d4fd4f9f580cc7f949ef1d1ce9000ac73f84f8c2.tar.gz
chromium_src-d4fd4f9f580cc7f949ef1d1ce9000ac73f84f8c2.tar.bz2
Revert "Make inverted viewport scroll order the default and remove flag."
This reverts commit eac4df4e3d9869b5dc128283b4d32dc6665fc293 under suspicion that it fails org.chromium.content.browser.ContentViewReadbackTest#testScreenshotIsNotBlank TBR=bokan@chromium.org,nasko@chromium.org,jam@chromium.org BUG=443724 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1316863004 . Cr-Commit-Position: refs/heads/master@{#345699}
-rw-r--r--cc/layers/viewport.cc23
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc96
-rw-r--r--cc/trees/layer_tree_settings.cc1
-rw-r--r--cc/trees/layer_tree_settings.h1
-rw-r--r--chrome/app/generated_resources.grd6
-rw-r--r--chrome/browser/about_flags.cc5
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc1
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc2
-rw-r--r--content/public/common/common_param_traits_macros.h1
-rw-r--r--content/public/common/content_switches.cc3
-rw-r--r--content/public/common/content_switches.h1
-rw-r--r--content/public/common/web_preferences.cc1
-rw-r--r--content/public/common/web_preferences.h1
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc3
-rw-r--r--content/renderer/render_view_impl.cc4
15 files changed, 90 insertions, 59 deletions
diff --git a/cc/layers/viewport.cc b/cc/layers/viewport.cc
index 77ebc26..38f4c27 100644
--- a/cc/layers/viewport.cc
+++ b/cc/layers/viewport.cc
@@ -43,7 +43,14 @@ Viewport::ScrollResult Viewport::ScrollBy(const gfx::Vector2dF& delta,
gfx::Vector2dF pending_content_delta = content_delta;
- pending_content_delta -= host_impl_->ScrollLayer(InnerScrollLayer(),
+ bool invert_scroll_order =
+ host_impl_->settings().invert_viewport_scroll_order;
+ LayerImpl* primary_layer =
+ invert_scroll_order ? InnerScrollLayer() : OuterScrollLayer();
+ LayerImpl* secondary_layer =
+ invert_scroll_order ? OuterScrollLayer() : InnerScrollLayer();
+
+ pending_content_delta -= host_impl_->ScrollLayer(primary_layer,
pending_content_delta,
viewport_point,
is_direct_manipulation);
@@ -55,7 +62,7 @@ Viewport::ScrollResult Viewport::ScrollBy(const gfx::Vector2dF& delta,
if (gfx::ToRoundedVector2d(pending_content_delta).IsZero()) {
result.consumed_delta = delta;
} else {
- pending_content_delta -= host_impl_->ScrollLayer(OuterScrollLayer(),
+ pending_content_delta -= host_impl_->ScrollLayer(secondary_layer,
pending_content_delta,
viewport_point,
is_direct_manipulation);
@@ -87,7 +94,8 @@ void Viewport::PinchUpdate(float magnify_delta, const gfx::Point& anchor) {
// length of the screen edge, offset all updates by the amount so that we
// effectively snap the pinch zoom to the edge of the screen. This makes it
// easy to zoom in on position: fixed elements.
- SnapPinchAnchorIfWithinMargin(anchor);
+ if (host_impl_->settings().invert_viewport_scroll_order)
+ SnapPinchAnchorIfWithinMargin(anchor);
pinch_zoom_active_ = true;
}
@@ -114,7 +122,14 @@ void Viewport::PinchUpdate(float magnify_delta, const gfx::Point& anchor) {
// be accounted for from the intended move.
move -= InnerScrollLayer()->ClampScrollToMaxScrollOffset();
- Pan(move);
+ if (host_impl_->settings().invert_viewport_scroll_order) {
+ Pan(move);
+ } else {
+ gfx::Point viewport_point;
+ bool is_wheel_event = false;
+ bool affect_top_controls = false;
+ ScrollBy(move, viewport_point, is_wheel_event, affect_top_controls);
+ }
}
void Viewport::PinchEnd() {
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 9c548d3..06c5c83 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1138,6 +1138,7 @@ TEST_F(LayerTreeHostImplTest, ImplPinchZoom) {
TEST_F(LayerTreeHostImplTest, ViewportScrollOrder) {
LayerTreeSettings settings = DefaultSettings();
+ settings.invert_viewport_scroll_order = true;
CreateHostImpl(settings,
CreateOutputSurface());
host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 0.25f, 4.f);
@@ -1198,6 +1199,7 @@ TEST_F(LayerTreeHostImplTest, ViewportScrollOrder) {
// to the outer viewport.
TEST_F(LayerTreeHostImplTest, ScrollDuringPinchGesture) {
LayerTreeSettings settings = DefaultSettings();
+ settings.invert_viewport_scroll_order = true;
CreateHostImpl(settings,
CreateOutputSurface());
host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 2.f);
@@ -1254,6 +1256,7 @@ TEST_F(LayerTreeHostImplTest, ScrollDuringPinchGesture) {
// should assume the user means to scroll into the edge of the screen.
TEST_F(LayerTreeHostImplTest, PinchZoomSnapsToScreenEdge) {
LayerTreeSettings settings = DefaultSettings();
+ settings.invert_viewport_scroll_order = true;
CreateHostImpl(settings,
CreateOutputSurface());
host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 2.f);
@@ -1349,7 +1352,7 @@ TEST_F(LayerTreeHostImplTest, ImplPinchZoomWheelBubbleBetweenViewports) {
page_scale_factor, min_page_scale, max_page_scale);
host_impl_->SetPageScaleOnActiveTree(page_scale_factor);
- // Scroll by a small amount, there should be no bubbling to the outer
+ // Scroll by a small amount, there should be no bubbling up to the inner
// viewport.
host_impl_->ScrollBegin(gfx::Point(0, 0), InputHandler::WHEEL);
host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2dF(10.f, 20.f));
@@ -1357,28 +1360,28 @@ TEST_F(LayerTreeHostImplTest, ImplPinchZoomWheelBubbleBetweenViewports) {
EXPECT_VECTOR_EQ(
gfx::Vector2dF(5, 10),
- inner_scroll_layer->CurrentScrollOffset());
+ outer_scroll_layer->CurrentScrollOffset());
EXPECT_VECTOR_EQ(
gfx::Vector2dF(),
- outer_scroll_layer->CurrentScrollOffset());
+ inner_scroll_layer->CurrentScrollOffset());
- // Scroll by the inner viewport's max scroll extent, the remainder
- // should bubble up to the outer viewport.
+ // Scroll by the outer viewport's max scroll extent, there the remainder
+ // should bubble up to the inner viewport.
host_impl_->ScrollBegin(gfx::Point(0, 0), InputHandler::WHEEL);
- host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2dF(100.f, 100.f));
+ host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2dF(200.f, 200.f));
host_impl_->ScrollEnd();
EXPECT_VECTOR_EQ(
- gfx::Vector2dF(50, 50),
- inner_scroll_layer->CurrentScrollOffset());
+ gfx::Vector2dF(100, 100),
+ outer_scroll_layer->CurrentScrollOffset());
EXPECT_VECTOR_EQ(
gfx::Vector2dF(5, 10),
- outer_scroll_layer->CurrentScrollOffset());
+ inner_scroll_layer->CurrentScrollOffset());
- // Scroll by the outer viewport's max scroll extent, it should all go to the
- // outer viewport.
+ // Scroll by the inner viewport's max scroll extent, it should all go to the
+ // inner viewport.
host_impl_->ScrollBegin(gfx::Point(0, 0), InputHandler::WHEEL);
- host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2dF(190.f, 180.f));
+ host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2dF(90.f, 80.f));
host_impl_->ScrollEnd();
EXPECT_VECTOR_EQ(
@@ -1616,10 +1619,6 @@ TEST_F(LayerTreeHostImplTest, PinchGesture) {
host_impl_->PinchGestureBegin();
host_impl_->PinchGestureUpdate(2.f, gfx::Point(0, 0));
host_impl_->PinchGestureUpdate(1.f, gfx::Point(0, 0));
-
- // Needed so layer transform includes page scale.
- DrawFrame();
-
host_impl_->ScrollBy(gfx::Point(0, 0), gfx::Vector2d(10, 10));
host_impl_->PinchGestureUpdate(1.f, gfx::Point(10, 10));
host_impl_->PinchGestureEnd();
@@ -1629,7 +1628,7 @@ TEST_F(LayerTreeHostImplTest, PinchGesture) {
host_impl_->ProcessScrollDeltas();
EXPECT_EQ(scroll_info->page_scale_delta, 2.f);
EXPECT_TRUE(ScrollInfoContains(*scroll_info, scroll_layer->id(),
- gfx::Vector2d(10, 10)));
+ gfx::Vector2d(20, 20)));
}
}
@@ -3140,12 +3139,12 @@ TEST_F(LayerTreeHostImplTopControlsTest,
// Now when we continue scrolling, make sure the outer viewport gets scrolled
// since it wasn't scrollable when the scroll began.
host_impl_->ScrollBy(gfx::Point(), gfx::Vector2dF(0.f, -20.f));
- EXPECT_EQ(25.f, outer_scroll->CurrentScrollOffset().y());
- EXPECT_EQ(15.f, inner_scroll->CurrentScrollOffset().y());
+ EXPECT_EQ(15.f, outer_scroll->CurrentScrollOffset().y());
+ EXPECT_EQ(25.f, inner_scroll->CurrentScrollOffset().y());
host_impl_->ScrollBy(gfx::Point(), gfx::Vector2dF(0.f, -30.f));
- EXPECT_EQ(25.f, outer_scroll->CurrentScrollOffset().y());
- EXPECT_EQ(0.f, inner_scroll->CurrentScrollOffset().y());
+ EXPECT_EQ(0.f, outer_scroll->CurrentScrollOffset().y());
+ EXPECT_EQ(25.f, inner_scroll->CurrentScrollOffset().y());
host_impl_->ScrollBy(gfx::Point(), gfx::Vector2dF(0.f, -50.f));
host_impl_->ScrollEnd();
@@ -3728,7 +3727,7 @@ TEST_F(LayerTreeHostImplTest, ScrollBlockedByContentLayer) {
}
TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) {
- gfx::Size viewport_size(20, 20);
+ gfx::Size viewport_size(10, 10);
float page_scale = 2.f;
SetupScrollAndContentsLayers(viewport_size);
@@ -3737,14 +3736,12 @@ TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) {
host_impl_->active_tree()->InnerViewportScrollLayer()->parent()->SetBounds(
viewport_size);
host_impl_->active_tree()->OuterViewportScrollLayer()->SetBounds(
- gfx::Size(40, 40));
+ gfx::Size(20, 20));
host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 2.f);
DrawFrame();
LayerImpl* root_scroll =
host_impl_->active_tree()->OuterViewportScrollLayer();
- LayerImpl* inner_scroll =
- host_impl_->active_tree()->InnerViewportScrollLayer();
EXPECT_EQ(viewport_size, root_scroll->scroll_clip_layer()->bounds());
gfx::Vector2d scroll_delta(0, 10);
@@ -3759,7 +3756,7 @@ TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) {
host_impl_->active_tree()->PushPageScaleFromMainThread(page_scale, 1.f, 2.f);
scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas();
- EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), inner_scroll->id(),
+ EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), root_scroll->id(),
expected_scroll_delta));
// The scroll range should also have been updated.
@@ -3771,7 +3768,7 @@ TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) {
}
TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnImplThread) {
- gfx::Size viewport_size(20, 20);
+ gfx::Size viewport_size(10, 10);
float page_scale = 2.f;
SetupScrollAndContentsLayers(viewport_size);
@@ -3780,14 +3777,12 @@ TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnImplThread) {
host_impl_->active_tree()->InnerViewportScrollLayer()->parent()->SetBounds(
viewport_size);
host_impl_->active_tree()->OuterViewportScrollLayer()->SetBounds(
- gfx::Size(40, 40));
+ gfx::Size(20, 20));
host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 2.f);
DrawFrame();
LayerImpl* root_scroll =
host_impl_->active_tree()->OuterViewportScrollLayer();
- LayerImpl* inner_scroll =
- host_impl_->active_tree()->InnerViewportScrollLayer();
EXPECT_EQ(viewport_size, root_scroll->scroll_clip_layer()->bounds());
gfx::Vector2d scroll_delta(0, 10);
@@ -3808,7 +3803,7 @@ TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnImplThread) {
// The scroll delta is not scaled because the main thread did not scale.
scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas();
- EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), inner_scroll->id(),
+ EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), root_scroll->id(),
expected_scroll_delta));
// The scroll range should also have been updated.
@@ -3870,10 +3865,10 @@ TEST_F(LayerTreeHostImplTest, PageScaleDeltaAppliedToRootScrollLayerOnly) {
}
TEST_F(LayerTreeHostImplTest, ScrollChildAndChangePageScaleOnMainThread) {
- SetupScrollAndContentsLayers(gfx::Size(30, 30));
+ gfx::Size surface_size(30, 30);
+ SetupScrollAndContentsLayers(surface_size);
LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer();
- LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer();
// Make the outer scroll layer scrollable.
outer_scroll->SetBounds(gfx::Size(50, 50));
@@ -3895,7 +3890,7 @@ TEST_F(LayerTreeHostImplTest, ScrollChildAndChangePageScaleOnMainThread) {
DrawOneFrame();
scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas();
- EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), inner_scroll->id(),
+ EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), outer_scroll->id(),
expected_scroll_delta));
// The scroll range should not have changed.
@@ -7593,9 +7588,9 @@ TEST_F(LayerTreeHostImplVirtualViewportTest, ScrollBothInnerAndOuterLayer) {
}
TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) {
- gfx::Size content_size = gfx::Size(200, 320);
- gfx::Size outer_viewport = gfx::Size(100, 160);
- gfx::Size inner_viewport = gfx::Size(50, 80);
+ gfx::Size content_size = gfx::Size(100, 160);
+ gfx::Size outer_viewport = gfx::Size(50, 80);
+ gfx::Size inner_viewport = gfx::Size(25, 40);
SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport);
@@ -7608,18 +7603,16 @@ TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) {
EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset());
EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset());
- // Scrolling the viewport always sets the outer scroll layer as the
- // currently scrolling layer.
+ // Make sure the fling goes to the outer viewport first
EXPECT_EQ(InputHandler::SCROLL_STARTED,
host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE));
EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer());
EXPECT_EQ(InputHandler::SCROLL_STARTED, host_impl_->FlingScrollBegin());
EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer());
- gfx::Vector2d scroll_delta(inner_viewport.width() / 2.f,
- inner_viewport.height() / 2.f);
+ gfx::Vector2d scroll_delta(inner_viewport.width(), inner_viewport.height());
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
- inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
+ outer_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), outer_scroll);
host_impl_->ScrollEnd();
@@ -7628,7 +7621,7 @@ TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) {
EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset());
EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset());
- // Fling past the inner viewport boundry, make sure outer viewport scrolls.
+ // Fling past the outer viewport boundry, make sure inner viewport scrolls.
EXPECT_EQ(InputHandler::SCROLL_STARTED,
host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE));
EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer());
@@ -7636,11 +7629,11 @@ TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) {
EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer());
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
- inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
+ outer_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer());
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
- outer_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
+ inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer());
host_impl_->ScrollEnd();
@@ -7653,9 +7646,9 @@ TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) {
TEST_F(LayerTreeHostImplVirtualViewportTest,
DiagonalScrollBubblesPerfectlyToInner) {
- gfx::Size content_size = gfx::Size(200, 320);
- gfx::Size outer_viewport = gfx::Size(100, 160);
- gfx::Size inner_viewport = gfx::Size(50, 80);
+ gfx::Size content_size = gfx::Size(100, 160);
+ gfx::Size outer_viewport = gfx::Size(50, 80);
+ gfx::Size inner_viewport = gfx::Size(25, 40);
SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport);
@@ -7668,7 +7661,7 @@ TEST_F(LayerTreeHostImplVirtualViewportTest,
EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset());
EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset());
- // Make sure the scroll goes to the inner viewport first.
+ // Make sure the scroll goes to the outer viewport first.
EXPECT_EQ(InputHandler::SCROLL_STARTED,
host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE));
EXPECT_EQ(InputHandler::SCROLL_STARTED, host_impl_->FlingScrollBegin());
@@ -7676,10 +7669,9 @@ TEST_F(LayerTreeHostImplVirtualViewportTest,
InputHandler::GESTURE));
// Scroll near the edge of the outer viewport.
- gfx::Vector2d scroll_delta(inner_viewport.width() / 2.f,
- inner_viewport.height() / 2.f);
+ gfx::Vector2d scroll_delta(inner_viewport.width(), inner_viewport.height());
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
- inner_expected += scroll_delta;
+ outer_expected += scroll_delta;
EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(),
InputHandler::GESTURE));
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index 905f29d..177741b 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -72,6 +72,7 @@ LayerTreeSettings::LayerTreeSettings()
verify_property_trees(false),
gather_pixel_refs(false),
use_compositor_animation_timelines(false),
+ invert_viewport_scroll_order(false),
wait_for_beginframe_interval(true),
max_staging_buffers(32) {}
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index ce634fc..506dfb4 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -86,6 +86,7 @@ class CC_EXPORT LayerTreeSettings {
bool verify_property_trees;
bool gather_pixel_refs;
bool use_compositor_animation_timelines;
+ bool invert_viewport_scroll_order;
bool wait_for_beginframe_interval;
int max_staging_buffers;
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 56ae273..8a0e839 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -6461,6 +6461,12 @@ Keep your key file in a safe place. You will need it to create new versions of y
<message name="IDS_FLAGS_DISABLE_THREADED_SCROLLING_DESCRIPTION" desc="Description for the flag to disable threaded scrolling.">
Disabled threaded handling of scroll-related input events, forcing all such scroll events to be handled on the main thread. Note that this can dramatically hurt scrolling performance of most websites and is intended for testing purposes only.
</message>
+ <message name="IDS_FLAGS_INVERT_VIEWPORT_SCROLL_ORDER_NAME" desc="Title for the flag to enable the viewport scroll order experiment.">
+ Invert Viewport Scroll Order.
+ </message>
+ <message name="IDS_FLAGS_INVERT_VIEWPORT_SCROLL_ORDER_DESCRIPTION" desc="Description for the flag to enable the viewport scroll order experiment.">
+ Enables flipped viewport scroll order in some situations. Namely, during a pinch-zoom, the visual viewport should be scrolled first, then the layout viewport.
+ </message>
<message name="IDS_FLAGS_BLEEDING_RENDERER_NAME" desc="Name of the 'Stacked Tabs' lab.">
Bleeding Edge Renderer Paths - LIKELY TO CRASH YOUR BROWSER
</message>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 0ece257..002a6dd 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1616,6 +1616,11 @@ const Experiment kExperiments[] = {
IDS_FLAGS_DISABLE_THREADED_SCROLLING_DESCRIPTION,
kOsWin | kOsLinux | kOsCrOS | kOsAndroid | kOsMac,
SINGLE_VALUE_TYPE(switches::kDisableThreadedScrolling)},
+ {"invert-viewport-scroll-order",
+ IDS_FLAGS_INVERT_VIEWPORT_SCROLL_ORDER_NAME,
+ IDS_FLAGS_INVERT_VIEWPORT_SCROLL_ORDER_DESCRIPTION,
+ kOsAll,
+ SINGLE_VALUE_TYPE(switches::kInvertViewportScrollOrder)},
{"bleeding-edge-renderer-mode",
IDS_FLAGS_BLEEDING_RENDERER_NAME,
IDS_FLAGS_BLEEDING_RENDERER_DESCRIPTION,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 1ba679c..100887d 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1321,6 +1321,7 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
switches::kEnableUnsafeES3APIs,
switches::kEnableViewport,
switches::kEnableViewportMeta,
+ switches::kInvertViewportScrollOrder,
switches::kEnableVtune,
switches::kEnableWebBluetooth,
switches::kEnableWebGLDraftExtensions,
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index a0824f4..1cc0a1f 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -431,6 +431,8 @@ WebPreferences RenderViewHostImpl::ComputeWebkitPrefs() {
prefs.pinch_overlay_scrollbar_thickness = 10;
prefs.use_solid_color_scrollbars = ui::IsOverlayScrollbarEnabled();
+ prefs.invert_viewport_scroll_order =
+ command_line.HasSwitch(switches::kInvertViewportScrollOrder);
#if defined(OS_ANDROID)
// On Android, user gestures are normally required, unless that requirement
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index 48a500a..6aa70bb 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -145,6 +145,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::WebPreferences)
IPC_STRUCT_TRAITS_MEMBER(webaudio_enabled)
IPC_STRUCT_TRAITS_MEMBER(experimental_webgl_enabled)
IPC_STRUCT_TRAITS_MEMBER(pepper_3d_enabled)
+ IPC_STRUCT_TRAITS_MEMBER(invert_viewport_scroll_order)
IPC_STRUCT_TRAITS_MEMBER(pinch_overlay_scrollbar_thickness)
IPC_STRUCT_TRAITS_MEMBER(use_solid_color_scrollbars)
IPC_STRUCT_TRAITS_MEMBER(flash_3d_enabled)
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 4a67068..16e5018 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -491,6 +491,9 @@ const char kEnableViewport[] = "enable-viewport";
// only on mobile browsers.
const char kEnableViewportMeta[] = "enable-viewport-meta";
+// Enables experiment to scroll the inner viewport first in some situations.
+const char kInvertViewportScrollOrder[] = "invert-viewport-scroll-order";
+
// Enable the Vtune profiler support.
const char kEnableVtune[] = "enable-vtune-support";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index bb7d156..c3af6ac 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -144,6 +144,7 @@ CONTENT_EXPORT extern const char kEnableTracingOutput[];
CONTENT_EXPORT extern const char kEnableUserMediaScreenCapturing[];
CONTENT_EXPORT extern const char kEnableViewport[];
CONTENT_EXPORT extern const char kEnableViewportMeta[];
+CONTENT_EXPORT extern const char kInvertViewportScrollOrder[];
CONTENT_EXPORT extern const char kEnableVtune[];
CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[];
CONTENT_EXPORT extern const char kEnableWebGLImageChromium[];
diff --git a/content/public/common/web_preferences.cc b/content/public/common/web_preferences.cc
index 4d3fe9c..7a7e32b 100644
--- a/content/public/common/web_preferences.cc
+++ b/content/public/common/web_preferences.cc
@@ -166,6 +166,7 @@ WebPreferences::WebPreferences()
smart_insert_delete_enabled(false),
#endif
spatial_navigation_enabled(false),
+ invert_viewport_scroll_order(false),
pinch_overlay_scrollbar_thickness(0),
use_solid_color_scrollbars(false),
navigate_on_drag_drop(true),
diff --git a/content/public/common/web_preferences.h b/content/public/common/web_preferences.h
index 6d777da..4a1a8a3 100644
--- a/content/public/common/web_preferences.h
+++ b/content/public/common/web_preferences.h
@@ -168,6 +168,7 @@ struct CONTENT_EXPORT WebPreferences {
bool initialize_at_minimum_page_scale;
bool smart_insert_delete_enabled;
bool spatial_navigation_enabled;
+ bool invert_viewport_scroll_order;
int pinch_overlay_scrollbar_thickness;
bool use_solid_color_scrollbars;
bool navigate_on_drag_drop;
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index 5d93f49..9f7c528 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -372,6 +372,9 @@ void RenderWidgetCompositor::Initialize() {
&settings.initial_debug_state.slow_down_raster_scale_factor);
}
+ settings.invert_viewport_scroll_order =
+ cmd->HasSwitch(switches::kInvertViewportScrollOrder);
+
settings.strict_layer_property_change_checking =
cmd->HasSwitch(cc::switches::kStrictLayerPropertyChangeChecking);
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index e80ad7e..cdb56e5 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1051,9 +1051,7 @@ void RenderView::ApplyWebPreferences(const WebPreferences& prefs,
settings->setSupportsMultipleWindows(prefs.supports_multiple_windows);
- // TODO(bokan): Remove once Blink side is gone.
- settings->setInvertViewportScrollOrder(true);
-
+ settings->setInvertViewportScrollOrder(prefs.invert_viewport_scroll_order);
settings->setViewportEnabled(prefs.viewport_enabled);
settings->setLoadWithOverviewMode(prefs.initialize_at_minimum_page_scale);
settings->setViewportMetaEnabled(prefs.viewport_meta_enabled);