summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraelias <aelias@chromium.org>2015-02-07 13:43:01 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-07 21:43:29 +0000
commit6004fe0188ac900b02b843a9bff3ad8e569d616a (patch)
treea9b4d1eafd984be567b19f03c95801b3b719aaf3
parentaafbad78096f681d9677df4134e333dc3e11a90e (diff)
downloadchromium_src-6004fe0188ac900b02b843a9bff3ad8e569d616a.zip
chromium_src-6004fe0188ac900b02b843a9bff3ad8e569d616a.tar.gz
chromium_src-6004fe0188ac900b02b843a9bff3ad8e569d616a.tar.bz2
Normalize top controls offset to (0, 1), Chromium-side.
Since top controls height can now be changed, storing top controls offset as an absolute value causes problems. Normalizing its format to (0, 1) means we we don't need to adjust it when the height changes. It also improves readability and means TopControlsManager will compute correctly even when the height is currently 0. This patch also switches top controls to use SyncedProperty. See also Blink-side patch: https://codereview.chromium.org/882683003 BUG=430635 Review URL: https://codereview.chromium.org/901813002 Cr-Commit-Position: refs/heads/master@{#315216}
-rw-r--r--cc/input/top_controls_manager.cc148
-rw-r--r--cc/input/top_controls_manager.h10
-rw-r--r--cc/input/top_controls_manager_client.h5
-rw-r--r--cc/input/top_controls_manager_unittest.cc204
-rw-r--r--cc/trees/layer_tree_host.cc20
-rw-r--r--cc/trees/layer_tree_host.h4
-rw-r--r--cc/trees/layer_tree_host_impl.cc54
-rw-r--r--cc/trees/layer_tree_host_impl.h8
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc144
-rw-r--r--cc/trees/layer_tree_impl.cc71
-rw-r--r--cc/trees/layer_tree_impl.h58
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc6
-rw-r--r--content/renderer/gpu/render_widget_compositor.h3
-rw-r--r--content/renderer/render_widget.cc4
14 files changed, 352 insertions, 387 deletions
diff --git a/cc/input/top_controls_manager.cc b/cc/input/top_controls_manager.cc
index 1615d7f..615afb0 100644
--- a/cc/input/top_controls_manager.cc
+++ b/cc/input/top_controls_manager.cc
@@ -39,7 +39,6 @@ TopControlsManager::TopControlsManager(TopControlsManagerClient* client,
: client_(client),
animation_direction_(NO_ANIMATION),
permitted_state_(BOTH),
- top_controls_height_(0.f),
current_scroll_delta_(0.f),
controls_scroll_begin_offset_(0.f),
top_controls_show_threshold_(top_controls_hide_threshold),
@@ -51,12 +50,20 @@ TopControlsManager::TopControlsManager(TopControlsManagerClient* client,
TopControlsManager::~TopControlsManager() {
}
-float TopControlsManager::ControlsTopOffset() {
- return client_->ControlsTopOffset();
+float TopControlsManager::ControlsTopOffset() const {
+ return ContentTopOffset() - TopControlsHeight();
}
-float TopControlsManager::ContentTopOffset() {
- return client_->ControlsTopOffset() + top_controls_height_;
+float TopControlsManager::ContentTopOffset() const {
+ return TopControlsShownRatio() * TopControlsHeight();
+}
+
+float TopControlsManager::TopControlsShownRatio() const {
+ return client_->CurrentTopControlsShownRatio();
+}
+
+float TopControlsManager::TopControlsHeight() const {
+ return client_->TopControlsHeight();
}
void TopControlsManager::UpdateTopControlsState(TopControlsState constraints,
@@ -72,31 +79,25 @@ void TopControlsManager::UpdateTopControlsState(TopControlsState constraints,
return;
// Don't do anything if there is no change in offset.
- float final_controls_position = 0.f;
- if (constraints == HIDDEN || current == HIDDEN) {
- final_controls_position = -top_controls_height_;
- }
- if (final_controls_position == client_->ControlsTopOffset()) {
+ float final_shown_ratio = 1.f;
+ if (constraints == HIDDEN || current == HIDDEN)
+ final_shown_ratio = 0.f;
+ if (final_shown_ratio == TopControlsShownRatio())
return;
- }
- AnimationDirection animation_direction = SHOWING_CONTROLS;
- if (constraints == HIDDEN || current == HIDDEN)
- animation_direction = HIDING_CONTROLS;
- ResetAnimations();
if (animate) {
- SetupAnimation(animation_direction);
+ SetupAnimation(final_shown_ratio ? SHOWING_CONTROLS : HIDING_CONTROLS);
} else {
- client_->SetControlsTopOffset(final_controls_position);
+ ResetAnimations();
+ client_->SetCurrentTopControlsShownRatio(final_shown_ratio);
}
- client_->DidChangeTopControlsPosition();
}
void TopControlsManager::ScrollBegin() {
DCHECK(!pinch_gesture_active_);
ResetAnimations();
current_scroll_delta_ = 0.f;
- controls_scroll_begin_offset_ = client_->ControlsTopOffset();
+ controls_scroll_begin_offset_ = ContentTopOffset();
}
gfx::Vector2dF TopControlsManager::ScrollBy(
@@ -111,19 +112,21 @@ gfx::Vector2dF TopControlsManager::ScrollBy(
current_scroll_delta_ += pending_delta.y();
- float old_offset = client_->ControlsTopOffset();
- SetControlsTopOffset(controls_scroll_begin_offset_ - current_scroll_delta_);
+ float old_offset = ContentTopOffset();
+ client_->SetCurrentTopControlsShownRatio(
+ (controls_scroll_begin_offset_ - current_scroll_delta_) /
+ TopControlsHeight());
// If the controls are fully visible, treat the current position as the
// new baseline even if the gesture didn't end.
- if (client_->ControlsTopOffset() == 0.f) {
+ if (TopControlsShownRatio() == 1.f) {
current_scroll_delta_ = 0.f;
- controls_scroll_begin_offset_ = 0.f;
+ controls_scroll_begin_offset_ = ContentTopOffset();
}
ResetAnimations();
- gfx::Vector2dF applied_delta(0.f, old_offset - client_->ControlsTopOffset());
+ gfx::Vector2dF applied_delta(0.f, old_offset - ContentTopOffset());
return pending_delta - applied_delta;
}
@@ -146,44 +149,20 @@ void TopControlsManager::PinchEnd() {
ScrollBegin();
}
-void TopControlsManager::SetControlsTopOffset(float controls_top_offset) {
- controls_top_offset = std::max(controls_top_offset, -top_controls_height_);
- controls_top_offset = std::min(controls_top_offset, 0.f);
-
- if (client_->ControlsTopOffset() == controls_top_offset)
- return;
-
- client_->SetControlsTopOffset(controls_top_offset);
-
- client_->DidChangeTopControlsPosition();
-}
-
-void TopControlsManager::SetTopControlsHeight(float top_controls_height) {
- DCHECK_GE(top_controls_height, 0);
-
- if (top_controls_height == top_controls_height_)
- return;
-
- ResetAnimations();
- float top_controls_offset = client_->ControlsTopOffset();
- top_controls_height_ = top_controls_height;
- SetControlsTopOffset(top_controls_offset);
- StartAnimationIfNecessary();
-}
-
gfx::Vector2dF TopControlsManager::Animate(base::TimeTicks monotonic_time) {
if (!top_controls_animation_ || !client_->HaveRootScrollLayer())
return gfx::Vector2dF();
base::TimeDelta time = monotonic_time - base::TimeTicks();
- float old_offset = client_->ControlsTopOffset();
- SetControlsTopOffset(top_controls_animation_->GetValue(time));
+ float old_offset = ContentTopOffset();
+ client_->SetCurrentTopControlsShownRatio(
+ top_controls_animation_->GetValue(time));
if (IsAnimationCompleteAtTime(monotonic_time))
ResetAnimations();
- gfx::Vector2dF scroll_delta(0.f, client_->ControlsTopOffset() - old_offset);
+ gfx::Vector2dF scroll_delta(0.f, ContentTopOffset() - old_offset);
return scroll_delta;
}
@@ -193,15 +172,9 @@ void TopControlsManager::ResetAnimations() {
}
void TopControlsManager::SetupAnimation(AnimationDirection direction) {
- DCHECK(direction != NO_ANIMATION);
-
- if (direction == SHOWING_CONTROLS && client_->ControlsTopOffset() == 0)
- return;
-
- if (direction == HIDING_CONTROLS &&
- client_->ControlsTopOffset() == -top_controls_height_) {
- return;
- }
+ DCHECK_NE(NO_ANIMATION, direction);
+ DCHECK_IMPLIES(direction == HIDING_CONTROLS, TopControlsShownRatio() > 0.f);
+ DCHECK_IMPLIES(direction == SHOWING_CONTROLS, TopControlsShownRatio() < 1.f);
if (top_controls_animation_ && animation_direction_ == direction)
return;
@@ -209,42 +182,32 @@ void TopControlsManager::SetupAnimation(AnimationDirection direction) {
top_controls_animation_ = KeyframedFloatAnimationCurve::Create();
base::TimeDelta start_time = gfx::FrameTime::Now() - base::TimeTicks();
top_controls_animation_->AddKeyframe(
- FloatKeyframe::Create(start_time, client_->ControlsTopOffset(), nullptr));
- float max_ending_offset =
- (direction == SHOWING_CONTROLS ? 1 : -1) * top_controls_height_;
+ FloatKeyframe::Create(start_time, TopControlsShownRatio(), nullptr));
+ float max_ending_ratio = (direction == SHOWING_CONTROLS ? 1 : -1);
top_controls_animation_->AddKeyframe(FloatKeyframe::Create(
start_time + base::TimeDelta::FromMilliseconds(kShowHideMaxDurationMs),
- client_->ControlsTopOffset() + max_ending_offset,
+ TopControlsShownRatio() + max_ending_ratio,
EaseTimingFunction::Create()));
animation_direction_ = direction;
client_->DidChangeTopControlsPosition();
}
void TopControlsManager::StartAnimationIfNecessary() {
- if (client_->ControlsTopOffset() != 0
- && client_->ControlsTopOffset() != -top_controls_height_) {
- AnimationDirection show_controls = NO_ANIMATION;
-
- float top_controls_show_height =
- top_controls_height_ * top_controls_hide_threshold_;
- float top_controls_hide_height =
- top_controls_height_ * (1.f - top_controls_show_threshold_);
- if (client_->ControlsTopOffset() >= -top_controls_show_height) {
- // If we're showing so much that the hide threshold won't trigger, show.
- show_controls = SHOWING_CONTROLS;
- } else if (client_->ControlsTopOffset() <= -top_controls_hide_height) {
- // If we're showing so little that the show threshold won't trigger, hide.
- show_controls = HIDING_CONTROLS;
- } else {
- // If we could be either showing or hiding, we determine which one to
- // do based on whether or not the total scroll delta was moving up or
- // down.
- show_controls = current_scroll_delta_ <= 0.f ?
- SHOWING_CONTROLS : HIDING_CONTROLS;
- }
-
- if (show_controls != NO_ANIMATION)
- SetupAnimation(show_controls);
+ if (TopControlsShownRatio() == 0.f || TopControlsShownRatio() == 1.f)
+ return;
+
+ if (TopControlsShownRatio() >= 1.f - top_controls_hide_threshold_) {
+ // If we're showing so much that the hide threshold won't trigger, show.
+ SetupAnimation(SHOWING_CONTROLS);
+ } else if (TopControlsShownRatio() <= top_controls_show_threshold_) {
+ // If we're showing so little that the show threshold won't trigger, hide.
+ SetupAnimation(HIDING_CONTROLS);
+ } else {
+ // If we could be either showing or hiding, we determine which one to
+ // do based on whether or not the total scroll delta was moving up or
+ // down.
+ SetupAnimation(current_scroll_delta_ <= 0.f ? SHOWING_CONTROLS
+ : HIDING_CONTROLS);
}
}
@@ -253,11 +216,10 @@ bool TopControlsManager::IsAnimationCompleteAtTime(base::TimeTicks time) {
return true;
base::TimeDelta animation_time = time - base::TimeTicks();
- float new_offset = top_controls_animation_->GetValue(animation_time);
+ float new_ratio = top_controls_animation_->GetValue(animation_time);
- if ((animation_direction_ == SHOWING_CONTROLS && new_offset >= 0) ||
- (animation_direction_ == HIDING_CONTROLS
- && new_offset <= -top_controls_height_)) {
+ if ((animation_direction_ == SHOWING_CONTROLS && new_ratio >= 1.f) ||
+ (animation_direction_ == HIDING_CONTROLS && new_ratio <= 0.f)) {
return true;
}
return false;
diff --git a/cc/input/top_controls_manager.h b/cc/input/top_controls_manager.h
index 69408ae..06f623d 100644
--- a/cc/input/top_controls_manager.h
+++ b/cc/input/top_controls_manager.h
@@ -38,8 +38,10 @@ class CC_EXPORT TopControlsManager
float top_controls_hide_threshold);
virtual ~TopControlsManager();
- float ControlsTopOffset();
- float ContentTopOffset();
+ float ControlsTopOffset() const;
+ float ContentTopOffset() const;
+ float TopControlsShownRatio() const;
+ float TopControlsHeight() const;
KeyframedFloatAnimationCurve* animation() {
return top_controls_animation_.get();
@@ -60,9 +62,6 @@ class CC_EXPORT TopControlsManager
void PinchEnd();
gfx::Vector2dF Animate(base::TimeTicks monotonic_time);
- void SetControlsTopOffset(float offset);
- void SetTopControlsHeight(float top_controls_height);
- float top_controls_height() { return top_controls_height_; }
protected:
TopControlsManager(TopControlsManagerClient* client,
@@ -81,7 +80,6 @@ class CC_EXPORT TopControlsManager
scoped_ptr<KeyframedFloatAnimationCurve> top_controls_animation_;
AnimationDirection animation_direction_;
TopControlsState permitted_state_;
- float top_controls_height_;
float current_scroll_delta_;
float controls_scroll_begin_offset_;
diff --git a/cc/input/top_controls_manager_client.h b/cc/input/top_controls_manager_client.h
index 53b5978..a0f2f5b 100644
--- a/cc/input/top_controls_manager_client.h
+++ b/cc/input/top_controls_manager_client.h
@@ -11,8 +11,9 @@ class LayerTreeImpl;
class CC_EXPORT TopControlsManagerClient {
public:
- virtual void SetControlsTopOffset(float offset) = 0;
- virtual float ControlsTopOffset() const = 0;
+ virtual float TopControlsHeight() const = 0;
+ virtual void SetCurrentTopControlsShownRatio(float ratio) = 0;
+ virtual float CurrentTopControlsShownRatio() const = 0;
virtual void DidChangeTopControlsPosition() = 0;
virtual bool HaveRootScrollLayer() const = 0;
diff --git a/cc/input/top_controls_manager_unittest.cc b/cc/input/top_controls_manager_unittest.cc
index 0be40ca..f2bff09 100644
--- a/cc/input/top_controls_manager_unittest.cc
+++ b/cc/input/top_controls_manager_unittest.cc
@@ -4,6 +4,8 @@
#include "cc/input/top_controls_manager.h"
+#include <algorithm>
+
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "cc/input/top_controls_manager_client.h"
@@ -27,13 +29,13 @@ class MockTopControlsManagerClient : public TopControlsManagerClient {
: host_impl_(&proxy_, &shared_bitmap_manager_),
redraw_needed_(false),
update_draw_properties_needed_(false),
- top_controls_top_offset_(0.f),
+ top_controls_shown_ratio_(1.f),
top_controls_height_(top_controls_height),
top_controls_show_threshold_(top_controls_show_threshold),
top_controls_hide_threshold_(top_controls_hide_threshold) {
- active_tree_ =
- LayerTreeImpl::create(&host_impl_, new SyncedProperty<ScaleGroup>,
- new SyncedElasticOverscroll);
+ active_tree_ = LayerTreeImpl::create(
+ &host_impl_, new SyncedProperty<ScaleGroup>, new SyncedTopControls,
+ new SyncedElasticOverscroll);
root_scroll_layer_ = LayerImpl::Create(active_tree_.get(), 1);
}
@@ -46,11 +48,17 @@ class MockTopControlsManagerClient : public TopControlsManagerClient {
bool HaveRootScrollLayer() const override { return true; }
- void SetControlsTopOffset(float offset) override {
- top_controls_top_offset_ = offset;
+ float TopControlsHeight() const override { return top_controls_height_; }
+
+ void SetCurrentTopControlsShownRatio(float ratio) override {
+ ratio = std::max(ratio, 0.f);
+ ratio = std::min(ratio, 1.f);
+ top_controls_shown_ratio_ = ratio;
}
- float ControlsTopOffset() const override { return top_controls_top_offset_; }
+ float CurrentTopControlsShownRatio() const override {
+ return top_controls_shown_ratio_;
+ }
LayerImpl* rootScrollLayer() {
return root_scroll_layer_.get();
@@ -61,11 +69,12 @@ class MockTopControlsManagerClient : public TopControlsManagerClient {
manager_ = TopControlsManager::Create(this,
top_controls_show_threshold_,
top_controls_hide_threshold_);
- manager_->SetTopControlsHeight(top_controls_height_);
}
return manager_.get();
}
+ void SetTopControlsHeight(float height) { top_controls_height_ = height; }
+
private:
FakeImplProxy proxy_;
TestSharedBitmapManager shared_bitmap_manager_;
@@ -76,7 +85,7 @@ class MockTopControlsManagerClient : public TopControlsManagerClient {
bool redraw_needed_;
bool update_draw_properties_needed_;
- float top_controls_top_offset_;
+ float top_controls_shown_ratio_;
float top_controls_height_;
float top_controls_show_threshold_;
float top_controls_hide_threshold_;
@@ -90,38 +99,38 @@ TEST(TopControlsManagerTest, EnsureScrollThresholdApplied) {
// Scroll down to hide the controls entirely.
manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
- EXPECT_EQ(-30.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset());
manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
- EXPECT_EQ(-60.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-60.f, manager->ControlsTopOffset());
manager->ScrollBy(gfx::Vector2dF(0.f, 100.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
// Scroll back up a bit and ensure the controls don't move until we cross
// the threshold.
manager->ScrollBy(gfx::Vector2dF(0.f, -10.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
manager->ScrollBy(gfx::Vector2dF(0.f, -50.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
// After hitting the threshold, further scrolling up should result in the top
// controls showing.
manager->ScrollBy(gfx::Vector2dF(0.f, -10.f));
- EXPECT_EQ(-90.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-90.f, manager->ControlsTopOffset());
manager->ScrollBy(gfx::Vector2dF(0.f, -50.f));
- EXPECT_EQ(-40.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-40.f, manager->ControlsTopOffset());
// Reset the scroll threshold by going further up the page than the initial
// threshold.
manager->ScrollBy(gfx::Vector2dF(0.f, -100.f));
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
// See that scrolling down the page now will result in the controls hiding.
manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
- EXPECT_EQ(-20.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset());
manager->ScrollEnd();
}
@@ -131,14 +140,14 @@ TEST(TopControlsManagerTest, PartialShownHideAnimation) {
TopControlsManager* manager = client.manager();
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
manager->ScrollEnd();
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
- EXPECT_EQ(-85.f, manager->ControlsTopOffset());
- EXPECT_EQ(15.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset());
manager->ScrollEnd();
EXPECT_TRUE(manager->animation());
@@ -152,8 +161,8 @@ TEST(TopControlsManagerTest, PartialShownHideAnimation) {
previous_offset = manager->ControlsTopOffset();
}
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
}
TEST(TopControlsManagerTest, PartialShownShowAnimation) {
@@ -161,14 +170,14 @@ TEST(TopControlsManagerTest, PartialShownShowAnimation) {
TopControlsManager* manager = client.manager();
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
manager->ScrollEnd();
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, -70.f));
- EXPECT_EQ(-30.f, manager->ControlsTopOffset());
- EXPECT_EQ(70.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(70.f, manager->ContentTopOffset());
manager->ScrollEnd();
EXPECT_TRUE(manager->animation());
@@ -182,8 +191,8 @@ TEST(TopControlsManagerTest, PartialShownShowAnimation) {
previous_offset = manager->ControlsTopOffset();
}
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
- EXPECT_EQ(100.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
}
TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdShows) {
@@ -193,8 +202,8 @@ TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdShows) {
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, 20.f));
- EXPECT_EQ(-20.f, manager->ControlsTopOffset());
- EXPECT_EQ(80.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-20.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(80.f, manager->ContentTopOffset());
manager->ScrollEnd();
EXPECT_TRUE(manager->animation());
@@ -208,8 +217,8 @@ TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdShows) {
previous_offset = manager->ControlsTopOffset();
}
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
- EXPECT_EQ(100.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
}
TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdHides) {
@@ -219,8 +228,8 @@ TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdHides) {
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, 30.f));
- EXPECT_EQ(-30.f, manager->ControlsTopOffset());
- EXPECT_EQ(70.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-30.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(70.f, manager->ContentTopOffset());
manager->ScrollEnd();
EXPECT_TRUE(manager->animation());
@@ -234,8 +243,8 @@ TEST(TopControlsManagerTest, PartialHiddenWithAmbiguousThresholdHides) {
previous_offset = manager->ControlsTopOffset();
}
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
}
TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdHides) {
@@ -243,14 +252,14 @@ TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdHides) {
TopControlsManager* manager = client.manager();
manager->ScrollBy(gfx::Vector2dF(0.f, 200.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, -20.f));
- EXPECT_EQ(-80.f, manager->ControlsTopOffset());
- EXPECT_EQ(20.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-80.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(20.f, manager->ContentTopOffset());
manager->ScrollEnd();
EXPECT_TRUE(manager->animation());
@@ -264,8 +273,8 @@ TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdHides) {
previous_offset = manager->ControlsTopOffset();
}
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
}
TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdShows) {
@@ -273,14 +282,14 @@ TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdShows) {
TopControlsManager* manager = client.manager();
manager->ScrollBy(gfx::Vector2dF(0.f, 200.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, -30.f));
- EXPECT_EQ(-70.f, manager->ControlsTopOffset());
- EXPECT_EQ(30.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-70.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(30.f, manager->ContentTopOffset());
manager->ScrollEnd();
EXPECT_TRUE(manager->animation());
@@ -294,8 +303,8 @@ TEST(TopControlsManagerTest, PartialShownWithAmbiguousThresholdShows) {
previous_offset = manager->ControlsTopOffset();
}
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
- EXPECT_EQ(100.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(100.f, manager->ContentTopOffset());
}
TEST(TopControlsManagerTest, PinchIgnoresScroll) {
@@ -304,24 +313,24 @@ TEST(TopControlsManagerTest, PinchIgnoresScroll) {
// Hide the controls.
manager->ScrollBegin();
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
manager->PinchBegin();
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
// Scrolls are ignored during pinch.
manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
manager->PinchEnd();
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
// Scrolls should no long be ignored.
manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
- EXPECT_EQ(-85.f, manager->ControlsTopOffset());
- EXPECT_EQ(15.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset());
manager->ScrollEnd();
EXPECT_TRUE(manager->animation());
@@ -333,7 +342,7 @@ TEST(TopControlsManagerTest, PinchBeginStartsAnimationIfNecessary) {
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
manager->PinchBegin();
EXPECT_FALSE(manager->animation());
@@ -342,8 +351,8 @@ TEST(TopControlsManagerTest, PinchBeginStartsAnimationIfNecessary) {
EXPECT_FALSE(manager->animation());
manager->ScrollBy(gfx::Vector2dF(0.f, -15.f));
- EXPECT_EQ(-85.f, manager->ControlsTopOffset());
- EXPECT_EQ(15.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-85.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(15.f, manager->ContentTopOffset());
manager->PinchBegin();
EXPECT_TRUE(manager->animation());
@@ -362,8 +371,8 @@ TEST(TopControlsManagerTest, PinchBeginStartsAnimationIfNecessary) {
EXPECT_FALSE(manager->animation());
manager->ScrollBy(gfx::Vector2dF(0.f, -55.f));
- EXPECT_EQ(-45.f, manager->ControlsTopOffset());
- EXPECT_EQ(55.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-45.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(55.f, manager->ContentTopOffset());
EXPECT_FALSE(manager->animation());
manager->ScrollEnd();
@@ -378,83 +387,64 @@ TEST(TopControlsManagerTest, PinchBeginStartsAnimationIfNecessary) {
previous_offset = manager->ControlsTopOffset();
}
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
}
TEST(TopControlsManagerTest, HeightChangeMaintainsFullyVisibleControls) {
MockTopControlsManagerClient client(0.f, 0.5f, 0.5f);
TopControlsManager* manager = client.manager();
- EXPECT_EQ(0.f, manager->top_controls_height());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
- manager->SetTopControlsHeight(100.f);
+ client.SetTopControlsHeight(100.f);
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(100.f, manager->top_controls_height());
- EXPECT_EQ(0, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(100.f, manager->TopControlsHeight());
+ EXPECT_FLOAT_EQ(0, manager->ControlsTopOffset());
- manager->SetTopControlsHeight(50.f);
+ client.SetTopControlsHeight(50.f);
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(50.f, manager->top_controls_height());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(50.f, manager->TopControlsHeight());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
}
-TEST(TopControlsManagerTest, ShrinkingHeightKeepsTopControlsHidden) {
- MockTopControlsManagerClient client(100.f, 0.5f, 0.5f);
+TEST(TopControlsManagerTest, GrowingHeightKeepsTopControlsHidden) {
+ MockTopControlsManagerClient client(0.f, 0.5f, 0.5f);
TopControlsManager* manager = client.manager();
-
- manager->ScrollBegin();
- manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
- EXPECT_EQ(-100.f, manager->ControlsTopOffset());
+ manager->UpdateTopControlsState(HIDDEN, HIDDEN, false);
+ EXPECT_EQ(0.f, manager->ControlsTopOffset());
EXPECT_EQ(0.f, manager->ContentTopOffset());
- manager->ScrollEnd();
- manager->SetTopControlsHeight(50.f);
+ client.SetTopControlsHeight(50.f);
EXPECT_FALSE(manager->animation());
EXPECT_EQ(-50.f, manager->ControlsTopOffset());
EXPECT_EQ(0.f, manager->ContentTopOffset());
- manager->SetTopControlsHeight(0.f);
+ client.SetTopControlsHeight(100.f);
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_EQ(-100.f, manager->ControlsTopOffset());
EXPECT_EQ(0.f, manager->ContentTopOffset());
}
-TEST(TopControlsManagerTest, HiddenTopControlsReadjustOnIncreasedHeight) {
- MockTopControlsManagerClient client(10.f, 0.5f, 0.5f);
+TEST(TopControlsManagerTest, ShrinkingHeightKeepsTopControlsHidden) {
+ MockTopControlsManagerClient client(100.f, 0.5f, 0.5f);
TopControlsManager* manager = client.manager();
manager->ScrollBegin();
manager->ScrollBy(gfx::Vector2dF(0.f, 300.f));
- EXPECT_EQ(-10.f, manager->ControlsTopOffset());
- EXPECT_EQ(0.f, manager->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-100.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
manager->ScrollEnd();
- manager->SetTopControlsHeight(15.f);
- EXPECT_TRUE(manager->animation());
- base::TimeTicks time = base::TimeTicks::Now();
- float previous_offset = manager->ControlsTopOffset();
- while (manager->animation()) {
- time = base::TimeDelta::FromMicroseconds(100) + time;
- manager->Animate(time);
- EXPECT_LT(manager->ControlsTopOffset(), previous_offset);
- previous_offset = manager->ControlsTopOffset();
- }
+ client.SetTopControlsHeight(50.f);
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(-15.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(-50.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
- manager->SetTopControlsHeight(35.f);
- EXPECT_TRUE(manager->animation());
- time = base::TimeTicks::Now();
- previous_offset = manager->ControlsTopOffset();
- while (manager->animation()) {
- time = base::TimeDelta::FromMicroseconds(100) + time;
- manager->Animate(time);
- EXPECT_GT(manager->ControlsTopOffset(), previous_offset);
- previous_offset = manager->ControlsTopOffset();
- }
+ client.SetTopControlsHeight(0.f);
EXPECT_FALSE(manager->animation());
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
}
+
} // namespace
} // namespace cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index fa4dd5d..9bac4a8 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -119,7 +119,7 @@ LayerTreeHost::LayerTreeHost(
debug_state_(settings.initial_debug_state),
top_controls_shrink_blink_size_(false),
top_controls_height_(0.f),
- top_controls_content_offset_(0.f),
+ top_controls_shown_ratio_(0.f),
device_scale_factor_(1.f),
visible_(true),
page_scale_factor_(1.f),
@@ -335,20 +335,10 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
sync_tree->PassSwapPromises(&swap_promise_list_);
- // Track the change in top controls height to offset the top_controls_delta
- // properly. This is so that the top controls offset will be maintained
- // across height changes.
- float top_controls_height_delta =
- sync_tree->top_controls_height() - top_controls_height_;
-
sync_tree->set_top_controls_shrink_blink_size(
top_controls_shrink_blink_size_);
sync_tree->set_top_controls_height(top_controls_height_);
- sync_tree->set_top_controls_content_offset(top_controls_content_offset_);
- sync_tree->set_top_controls_delta(sync_tree->top_controls_delta() -
- sync_tree->sent_top_controls_delta() -
- top_controls_height_delta);
- sync_tree->set_sent_top_controls_delta(0.f);
+ sync_tree->PushTopControlsFromMainThread(top_controls_shown_ratio_);
host_impl->SetUseGpuRasterization(UseGpuRasterization());
host_impl->set_gpu_rasterization_status(GetGpuRasterizationStatus());
@@ -691,11 +681,11 @@ void LayerTreeHost::SetTopControlsHeight(float height) {
SetNeedsCommit();
}
-void LayerTreeHost::SetTopControlsContentOffset(float offset) {
- if (top_controls_content_offset_ == offset)
+void LayerTreeHost::SetTopControlsShownRatio(float ratio) {
+ if (top_controls_shown_ratio_ == ratio)
return;
- top_controls_content_offset_ = offset;
+ top_controls_shown_ratio_ = ratio;
SetNeedsCommit();
}
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index f41e023..da41e4c 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -212,7 +212,7 @@ class CC_EXPORT LayerTreeHost {
void SetViewportSize(const gfx::Size& device_viewport_size);
void SetTopControlsShrinkBlinkSize(bool shrink);
void SetTopControlsHeight(float height);
- void SetTopControlsContentOffset(float offset);
+ void SetTopControlsShownRatio(float ratio);
gfx::Size device_viewport_size() const { return device_viewport_size_; }
@@ -416,7 +416,7 @@ class CC_EXPORT LayerTreeHost {
gfx::Size device_viewport_size_;
bool top_controls_shrink_blink_size_;
float top_controls_height_;
- float top_controls_content_offset_;
+ float top_controls_shown_ratio_;
float device_scale_factor_;
bool visible_;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 672ffe8..eedd46f 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -235,8 +235,9 @@ LayerTreeHostImpl::LayerTreeHostImpl(
SetDebugState(settings.initial_debug_state);
// LTHI always has an active tree.
- active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(),
- new SyncedElasticOverscroll);
+ active_tree_ =
+ LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(),
+ new SyncedTopControls, new SyncedElasticOverscroll);
TRACE_EVENT_OBJECT_CREATED_WITH_ID(
TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_);
@@ -1113,8 +1114,10 @@ void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) {
void LayerTreeHostImpl::ResetTreesForTesting() {
if (active_tree_)
active_tree_->DetachLayerTree();
- active_tree_ = LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
- active_tree()->elastic_overscroll());
+ active_tree_ =
+ LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
+ active_tree()->top_controls_shown_ratio(),
+ active_tree()->elastic_overscroll());
if (pending_tree_)
pending_tree_->DetachLayerTree();
pending_tree_ = nullptr;
@@ -1678,9 +1681,9 @@ void LayerTreeHostImpl::UpdateViewportContainerSizes() {
active_tree_->top_controls_shrink_blink_size()
? active_tree_->top_controls_height()
: 0.f;
- inner_container->SetBoundsDelta(
- gfx::Vector2dF(0, top_controls_layout_height -
- active_tree_->total_top_controls_content_offset()));
+ inner_container->SetBoundsDelta(gfx::Vector2dF(
+ 0,
+ top_controls_layout_height - top_controls_manager_->ContentTopOffset()));
if (!outer_container || outer_container->BoundsForScrolling().IsEmpty())
return;
@@ -1768,16 +1771,9 @@ void LayerTreeHostImpl::CreatePendingTree() {
else
pending_tree_ =
LayerTreeImpl::create(this, active_tree()->page_scale_factor(),
+ active_tree()->top_controls_shown_ratio(),
active_tree()->elastic_overscroll());
- // Update the delta from the active tree, which may have
- // adjusted its delta prior to the pending tree being created.
- DCHECK_EQ(0.f, pending_tree_->sent_top_controls_delta());
- pending_tree_->set_top_controls_delta(
- active_tree_->top_controls_delta() -
- active_tree_->sent_top_controls_delta());
- pending_tree_->set_top_controls_height(active_tree_->top_controls_height());
-
client_->OnCanDrawStateChanged(CanDraw());
TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get());
}
@@ -1812,14 +1808,6 @@ void LayerTreeHostImpl::ActivateSyncTree() {
active_tree_->SetRootLayerScrollOffsetDelegate(
root_layer_scroll_offset_delegate_);
- if (top_controls_manager_) {
- top_controls_manager_->SetTopControlsHeight(
- active_tree_->top_controls_height());
- top_controls_manager_->SetControlsTopOffset(
- active_tree_->total_top_controls_content_offset() -
- active_tree_->top_controls_height());
- }
-
UpdateViewportContainerSizes();
} else {
active_tree_->ProcessUIResourceRequestQueue();
@@ -2298,15 +2286,17 @@ void LayerTreeHostImpl::DidChangeTopControlsPosition() {
SetFullRootLayerDamage();
}
-void LayerTreeHostImpl::SetControlsTopOffset(float offset) {
- float current_top_offset = active_tree_->top_controls_content_offset() -
- active_tree_->top_controls_height();
- active_tree_->set_top_controls_delta(offset - current_top_offset);
+float LayerTreeHostImpl::TopControlsHeight() const {
+ return active_tree_->top_controls_height();
+}
+
+void LayerTreeHostImpl::SetCurrentTopControlsShownRatio(float ratio) {
+ if (active_tree_->SetCurrentTopControlsShownRatio(ratio))
+ DidChangeTopControlsPosition();
}
-float LayerTreeHostImpl::ControlsTopOffset() const {
- return active_tree_->total_top_controls_content_offset() -
- active_tree_->top_controls_height();
+float LayerTreeHostImpl::CurrentTopControlsShownRatio() const {
+ return active_tree_->CurrentTopControlsShownRatio();
}
void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) {
@@ -3059,11 +3049,11 @@ scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() {
CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer());
scroll_info->page_scale_delta =
active_tree_->page_scale_factor()->PullDeltaForMainThread();
+ scroll_info->top_controls_delta =
+ active_tree()->top_controls_shown_ratio()->PullDeltaForMainThread();
scroll_info->elastic_overscroll_delta =
active_tree_->elastic_overscroll()->PullDeltaForMainThread();
scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_);
- scroll_info->top_controls_delta = active_tree()->top_controls_delta();
- active_tree_->set_sent_top_controls_delta(scroll_info->top_controls_delta);
return scroll_info.Pass();
}
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index f4052f1..fcdd81e 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -174,11 +174,14 @@ class CC_EXPORT LayerTreeHostImpl
ScrollElasticityHelper* CreateScrollElasticityHelper() override;
// TopControlsManagerClient implementation.
- void SetControlsTopOffset(float offset) override;
- float ControlsTopOffset() const override;
+ float TopControlsHeight() const override;
+ void SetCurrentTopControlsShownRatio(float offset) override;
+ float CurrentTopControlsShownRatio() const override;
void DidChangeTopControlsPosition() override;
bool HaveRootScrollLayer() const override;
+ void UpdateViewportContainerSizes();
+
struct CC_EXPORT FrameData : public RenderPassSink {
FrameData();
~FrameData() override;
@@ -530,7 +533,6 @@ class CC_EXPORT LayerTreeHostImpl
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
int id);
- void UpdateViewportContainerSizes();
// Virtual for testing.
virtual void AnimateLayers(base::TimeTicks monotonic_time);
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index b756ebb..23e90e1 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -2461,10 +2461,7 @@ class LayerTreeHostImplTopControlsTest : public LayerTreeHostImplTest {
LayerTreeHostImplTest::CreateHostImpl(settings, output_surface.Pass());
if (init && settings.calculate_top_controls_position) {
host_impl_->active_tree()->set_top_controls_height(top_controls_height_);
- host_impl_->active_tree()->set_top_controls_delta(top_controls_height_);
- host_impl_->top_controls_manager()->SetTopControlsHeight(
- top_controls_height_);
- host_impl_->DidChangeTopControlsPosition();
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(1.f);
}
return init;
}
@@ -2498,6 +2495,7 @@ class LayerTreeHostImplTopControlsTest : public LayerTreeHostImplTest {
host_impl_->DidChangeTopControlsPosition();
host_impl_->CreatePendingTree();
+ host_impl_->sync_tree()->set_top_controls_height(top_controls_height_);
root =
LayerImpl::Create(host_impl_->sync_tree(), 1);
root_clip =
@@ -2529,6 +2527,7 @@ class LayerTreeHostImplTopControlsTest : public LayerTreeHostImplTest {
const gfx::Size& scroll_layer_size) {
CreateHostImpl(settings_, CreateOutputSurface());
host_impl_->sync_tree()->set_top_controls_shrink_blink_size(true);
+ host_impl_->sync_tree()->set_top_controls_height(top_controls_height_);
host_impl_->DidChangeTopControlsPosition();
scoped_ptr<LayerImpl> root =
@@ -2607,8 +2606,8 @@ TEST_F(LayerTreeHostImplTopControlsTest, ScrollTopControlsByFractionalAmount) {
host_impl_->active_tree()->InnerViewportScrollLayer();
DCHECK(inner_viewport_scroll_layer);
host_impl_->ScrollEnd();
- EXPECT_EQ(top_controls_scroll_delta,
- inner_viewport_scroll_layer->FixedContainerSizeDelta());
+ EXPECT_FLOAT_EQ(top_controls_scroll_delta.y(),
+ inner_viewport_scroll_layer->FixedContainerSizeDelta().y());
}
// In this test, the outer viewport is initially unscrollable. We test that a
@@ -2639,8 +2638,7 @@ TEST_F(LayerTreeHostImplTopControlsTest,
// The entire scroll delta should have been used to hide the top controls.
// The viewport layers should be resized back to their full sizes.
- EXPECT_EQ(0.f,
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_EQ(0.f, host_impl_->active_tree()->CurrentTopControlsShownRatio());
EXPECT_EQ(0.f, inner_scroll->CurrentScrollOffset().y());
EXPECT_EQ(100.f, inner_container->BoundsForScrolling().height());
EXPECT_EQ(100.f, outer_container->BoundsForScrolling().height());
@@ -2662,8 +2660,7 @@ TEST_F(LayerTreeHostImplTopControlsTest,
// The entire scroll delta should have been used to show the top controls.
// The outer viewport should be resized to accomodate and scrolled to the
// bottom of the document to keep the viewport in place.
- EXPECT_EQ(50.f,
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_EQ(1.f, host_impl_->active_tree()->CurrentTopControlsShownRatio());
EXPECT_EQ(50.f, outer_container->BoundsForScrolling().height());
EXPECT_EQ(50.f, inner_container->BoundsForScrolling().height());
EXPECT_EQ(25.f, outer_scroll->CurrentScrollOffset().y());
@@ -2709,8 +2706,8 @@ TEST_F(LayerTreeHostImplTopControlsTest, FixedContainerDelta) {
gfx::Vector2dF top_controls_scroll_delta(0.f, 20.f);
host_impl_->top_controls_manager()->ScrollBegin();
host_impl_->top_controls_manager()->ScrollBy(top_controls_scroll_delta);
- EXPECT_EQ(top_controls_height_ - top_controls_scroll_delta.y(),
- host_impl_->top_controls_manager()->ContentTopOffset());
+ EXPECT_FLOAT_EQ(top_controls_height_ - top_controls_scroll_delta.y(),
+ host_impl_->top_controls_manager()->ContentTopOffset());
EXPECT_VECTOR_EQ(top_controls_scroll_delta,
outer_viewport_scroll_layer->FixedContainerSizeDelta());
host_impl_->ScrollEnd();
@@ -2747,8 +2744,7 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsScrollableSublayer) {
DrawFrame();
// Show top controls
- EXPECT_EQ(top_controls_height_,
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_EQ(1.f, host_impl_->active_tree()->CurrentTopControlsShownRatio());
LayerImpl* outer_viewport_scroll_layer =
host_impl_->active_tree()->OuterViewportScrollLayer();
@@ -2782,7 +2778,7 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsScrollableSublayer) {
// Top controls should be hidden
EXPECT_EQ(scroll_delta.y(),
top_controls_height_ -
- host_impl_->active_tree()->total_top_controls_content_offset());
+ host_impl_->top_controls_manager()->ContentTopOffset());
}
// Ensure setting the top controls position explicitly using the setters on the
@@ -2792,14 +2788,18 @@ TEST_F(LayerTreeHostImplTopControlsTest, PositionTopControlsExplicitly) {
SetupTopControlsAndScrollLayer();
DrawFrame();
- host_impl_->active_tree()->set_top_controls_delta(0.f);
- host_impl_->active_tree()->set_top_controls_content_offset(30.f);
- EXPECT_EQ(30.f, host_impl_->top_controls_manager()->ContentTopOffset());
- EXPECT_EQ(-20.f, host_impl_->top_controls_manager()->ControlsTopOffset());
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(0.f);
+ host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread(
+ 30.f / top_controls_height_);
+ host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive();
+ EXPECT_FLOAT_EQ(30.f, host_impl_->top_controls_manager()->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-20.f,
+ host_impl_->top_controls_manager()->ControlsTopOffset());
- host_impl_->active_tree()->set_top_controls_delta(-30.f);
- EXPECT_EQ(0.f, host_impl_->top_controls_manager()->ContentTopOffset());
- EXPECT_EQ(-50.f, host_impl_->top_controls_manager()->ControlsTopOffset());
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(0.f);
+ EXPECT_FLOAT_EQ(0.f, host_impl_->top_controls_manager()->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-50.f,
+ host_impl_->top_controls_manager()->ControlsTopOffset());
host_impl_->DidChangeTopControlsPosition();
@@ -2816,18 +2816,22 @@ TEST_F(LayerTreeHostImplTopControlsTest, ApplyDeltaOnTreeActivation) {
SetupTopControlsAndScrollLayer();
DrawFrame();
- host_impl_->sync_tree()->set_top_controls_content_offset(15.f);
-
- host_impl_->active_tree()->set_top_controls_content_offset(20.f);
- host_impl_->active_tree()->set_top_controls_delta(-20.f);
- host_impl_->active_tree()->set_sent_top_controls_delta(-5.f);
+ host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread(
+ 20.f / top_controls_height_);
+ host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive();
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(
+ 15.f / top_controls_height_);
+ host_impl_->active_tree()
+ ->top_controls_shown_ratio()
+ ->PullDeltaForMainThread();
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(0.f);
+ host_impl_->sync_tree()->PushTopControlsFromMainThread(15.f /
+ top_controls_height_);
host_impl_->DidChangeTopControlsPosition();
LayerImpl* root_clip_ptr = host_impl_->active_tree()->root_layer();
EXPECT_EQ(viewport_size_, root_clip_ptr->bounds());
EXPECT_EQ(0.f, host_impl_->top_controls_manager()->ContentTopOffset());
- EXPECT_EQ(0.f,
- host_impl_->active_tree()->total_top_controls_content_offset());
host_impl_->ActivateSyncTree();
@@ -2835,11 +2839,13 @@ TEST_F(LayerTreeHostImplTopControlsTest, ApplyDeltaOnTreeActivation) {
EXPECT_EQ(0.f, host_impl_->top_controls_manager()->ContentTopOffset());
EXPECT_EQ(viewport_size_, root_clip_ptr->bounds());
- EXPECT_EQ(0.f, host_impl_->active_tree()->sent_top_controls_delta());
- EXPECT_EQ(-15.f, host_impl_->active_tree()->top_controls_delta());
- EXPECT_EQ(15.f, host_impl_->active_tree()->top_controls_content_offset());
- EXPECT_EQ(0.f,
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_FLOAT_EQ(
+ -15.f, host_impl_->active_tree()->top_controls_shown_ratio()->Delta() *
+ top_controls_height_);
+ EXPECT_FLOAT_EQ(
+ 15.f,
+ host_impl_->active_tree()->top_controls_shown_ratio()->ActiveBase() *
+ top_controls_height_);
}
// Test that changing the top controls layout height is correctly applied to
@@ -2851,11 +2857,13 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsLayoutHeightChanged) {
SetupTopControlsAndScrollLayer();
DrawFrame();
- host_impl_->sync_tree()->set_top_controls_content_offset(50.f);
+ host_impl_->sync_tree()->PushTopControlsFromMainThread(1.f);
host_impl_->sync_tree()->set_top_controls_shrink_blink_size(true);
- host_impl_->active_tree()->set_top_controls_content_offset(50.f);
- host_impl_->active_tree()->set_top_controls_delta(-50.f);
+ host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread(
+ 1.f);
+ host_impl_->active_tree()->top_controls_shown_ratio()->PushPendingToActive();
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(0.f);
host_impl_->DidChangeTopControlsPosition();
LayerImpl* root_clip_ptr = host_impl_->active_tree()->root_layer();
@@ -2877,9 +2885,11 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsLayoutHeightChanged) {
EXPECT_EQ(viewport_size_, root_clip_ptr->bounds());
EXPECT_VECTOR_EQ(gfx::Vector2dF(0.f, 50.f), root_clip_ptr->bounds_delta());
- host_impl_->active_tree()->set_top_controls_delta(0.f);
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(1.f);
host_impl_->DidChangeTopControlsPosition();
+ EXPECT_EQ(1.f, host_impl_->top_controls_manager()->TopControlsShownRatio());
+ EXPECT_EQ(50.f, host_impl_->top_controls_manager()->TopControlsHeight());
EXPECT_EQ(50.f, host_impl_->top_controls_manager()->ContentTopOffset());
EXPECT_VECTOR_EQ(gfx::Vector2dF(0.f, 0.f), root_clip_ptr->bounds_delta());
EXPECT_EQ(gfx::Size(viewport_size_.width(), viewport_size_.height() - 50.f),
@@ -2894,8 +2904,7 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsViewportOffsetClamping) {
gfx::Size(100, 100), gfx::Size(200, 200), gfx::Size(200, 400));
DrawFrame();
- EXPECT_EQ(top_controls_height_,
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_EQ(1.f, host_impl_->active_tree()->CurrentTopControlsShownRatio());
LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer();
LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer();
@@ -2915,17 +2924,15 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsViewportOffsetClamping) {
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
// scrolling down at the max extents no longer hides the top controls
- EXPECT_EQ(0.f,
- top_controls_height_ -
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_EQ(1.f, host_impl_->active_tree()->CurrentTopControlsShownRatio());
// forcefully hide the top controls by 25px
host_impl_->top_controls_manager()->ScrollBy(scroll_delta);
host_impl_->ScrollEnd();
- EXPECT_EQ(scroll_delta.y(),
- top_controls_height_ -
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_FLOAT_EQ(scroll_delta.y(),
+ top_controls_height_ -
+ host_impl_->top_controls_manager()->ContentTopOffset());
inner_scroll->ClampScrollToMaxScrollOffset();
outer_scroll->ClampScrollToMaxScrollOffset();
@@ -2961,8 +2968,8 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsAspectRatio) {
gfx::Size(100, 100), gfx::Size(200, 200), gfx::Size(200, 400));
DrawFrame();
- EXPECT_EQ(top_controls_height_,
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_FLOAT_EQ(top_controls_height_,
+ host_impl_->top_controls_manager()->ContentTopOffset());
gfx::Vector2dF scroll_delta(0.f, 25.f);
EXPECT_EQ(InputHandler::ScrollStarted,
@@ -2970,9 +2977,9 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsAspectRatio) {
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
host_impl_->ScrollEnd();
- EXPECT_EQ(scroll_delta.y(),
- top_controls_height_ -
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_FLOAT_EQ(scroll_delta.y(),
+ top_controls_height_ -
+ host_impl_->top_controls_manager()->ContentTopOffset());
// Top controls were hidden by 25px so the inner viewport should have expanded
// by that much.
@@ -2998,7 +3005,7 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsScrollOuterViewport) {
DrawFrame();
EXPECT_EQ(top_controls_height_,
- host_impl_->active_tree()->total_top_controls_content_offset());
+ host_impl_->top_controls_manager()->ContentTopOffset());
// Send a gesture scroll that will scroll the outer viewport, make sure the
// top controls get scrolled.
@@ -3010,16 +3017,16 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsScrollOuterViewport) {
host_impl_->CurrentlyScrollingLayer());
host_impl_->ScrollEnd();
- EXPECT_EQ(scroll_delta.y(),
- top_controls_height_ -
- host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_FLOAT_EQ(scroll_delta.y(),
+ top_controls_height_ -
+ host_impl_->top_controls_manager()->ContentTopOffset());
scroll_delta = gfx::Vector2dF(0.f, 50.f);
EXPECT_EQ(InputHandler::ScrollStarted,
host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture));
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
- EXPECT_EQ(0, host_impl_->active_tree()->total_top_controls_content_offset());
+ EXPECT_EQ(0, host_impl_->top_controls_manager()->ContentTopOffset());
EXPECT_EQ(host_impl_->OuterViewportScrollLayer(),
host_impl_->CurrentlyScrollingLayer());
@@ -3036,8 +3043,8 @@ TEST_F(LayerTreeHostImplTopControlsTest, TopControlsScrollOuterViewport) {
host_impl_->ScrollBy(gfx::Point(), scroll_delta);
EXPECT_EQ(top_controls_height_,
- host_impl_->active_tree()->total_top_controls_content_offset());
- EXPECT_EQ(
+ host_impl_->top_controls_manager()->ContentTopOffset());
+ EXPECT_FLOAT_EQ(
inner_viewport_offset.y() + (scroll_delta.y() + top_controls_height_),
host_impl_->InnerViewportScrollLayer()->ScrollDelta().y());
@@ -3070,8 +3077,8 @@ TEST_F(LayerTreeHostImplTopControlsTest,
host_impl_->top_controls_manager()->ScrollBegin();
host_impl_->top_controls_manager()->ScrollBy(
gfx::Vector2dF(0.f, scroll_increment_y));
- EXPECT_EQ(-scroll_increment_y,
- host_impl_->top_controls_manager()->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-scroll_increment_y,
+ host_impl_->top_controls_manager()->ContentTopOffset());
// Now that top controls have moved, expect the clip to resize.
EXPECT_EQ(gfx::Size(viewport_size_.width(),
viewport_size_.height() + scroll_increment_y),
@@ -3080,8 +3087,8 @@ TEST_F(LayerTreeHostImplTopControlsTest,
host_impl_->top_controls_manager()->ScrollBy(
gfx::Vector2dF(0.f, scroll_increment_y));
host_impl_->top_controls_manager()->ScrollEnd();
- EXPECT_EQ(-2 * scroll_increment_y,
- host_impl_->top_controls_manager()->ContentTopOffset());
+ EXPECT_FLOAT_EQ(-2 * scroll_increment_y,
+ host_impl_->top_controls_manager()->ContentTopOffset());
// Now that top controls have moved, expect the clip to resize.
EXPECT_EQ(clip_size_, root_clip_ptr->bounds());
@@ -7439,9 +7446,8 @@ class LayerTreeHostImplWithTopControlsTest : public LayerTreeHostImplTest {
settings.calculate_top_controls_position = true;
CreateHostImpl(settings, CreateOutputSurface());
host_impl_->active_tree()->set_top_controls_height(top_controls_height_);
- host_impl_->active_tree()->set_top_controls_delta(top_controls_height_);
- host_impl_->top_controls_manager()->SetTopControlsHeight(
- top_controls_height_);
+ host_impl_->sync_tree()->set_top_controls_height(top_controls_height_);
+ host_impl_->active_tree()->SetCurrentTopControlsShownRatio(1.f);
}
protected:
@@ -7463,23 +7469,23 @@ TEST_F(LayerTreeHostImplWithTopControlsTest, TopControlsHeightIsCommitted) {
host_impl_->CreatePendingTree();
host_impl_->sync_tree()->set_top_controls_height(100);
host_impl_->ActivateSyncTree();
- EXPECT_EQ(100, host_impl_->top_controls_manager()->top_controls_height());
+ EXPECT_EQ(100, host_impl_->top_controls_manager()->TopControlsHeight());
}
TEST_F(LayerTreeHostImplWithTopControlsTest,
TopControlsStayFullyVisibleOnHeightChange) {
SetupScrollAndContentsLayers(gfx::Size(100, 100));
- EXPECT_EQ(0.f, host_impl_->ControlsTopOffset());
+ EXPECT_EQ(0.f, host_impl_->top_controls_manager()->ControlsTopOffset());
host_impl_->CreatePendingTree();
host_impl_->sync_tree()->set_top_controls_height(0);
host_impl_->ActivateSyncTree();
- EXPECT_EQ(0.f, host_impl_->ControlsTopOffset());
+ EXPECT_EQ(0.f, host_impl_->top_controls_manager()->ControlsTopOffset());
host_impl_->CreatePendingTree();
host_impl_->sync_tree()->set_top_controls_height(50);
host_impl_->ActivateSyncTree();
- EXPECT_EQ(0.f, host_impl_->ControlsTopOffset());
+ EXPECT_EQ(0.f, host_impl_->top_controls_manager()->ControlsTopOffset());
}
TEST_F(LayerTreeHostImplWithTopControlsTest, TopControlsAnimationScheduling) {
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 80ccf14..0759425 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -4,6 +4,7 @@
#include "cc/trees/layer_tree_impl.h"
+#include <algorithm>
#include <limits>
#include <set>
@@ -76,6 +77,7 @@ class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate {
LayerTreeImpl::LayerTreeImpl(
LayerTreeHostImpl* layer_tree_host_impl,
scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor,
+ scoped_refptr<SyncedTopControls> top_controls_shown_ratio,
scoped_refptr<SyncedElasticOverscroll> elastic_overscroll)
: layer_tree_host_impl_(layer_tree_host_impl),
source_frame_number_(-1),
@@ -102,9 +104,7 @@ LayerTreeImpl::LayerTreeImpl(
render_surface_layer_list_id_(0),
top_controls_shrink_blink_size_(false),
top_controls_height_(0),
- top_controls_content_offset_(0),
- top_controls_delta_(0),
- sent_top_controls_delta_(0) {
+ top_controls_shown_ratio_(top_controls_shown_ratio) {
}
LayerTreeImpl::~LayerTreeImpl() {
@@ -210,20 +210,10 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
target_tree->PassSwapPromises(&swap_promise_list_);
- // Track the change in top controls height to offset the top_controls_delta
- // properly. This is so that the top controls offset will be maintained
- // across height changes.
- float top_controls_height_delta =
- target_tree->top_controls_height_ - top_controls_height_;
-
- target_tree->top_controls_shrink_blink_size_ =
- top_controls_shrink_blink_size_;
- target_tree->top_controls_height_ = top_controls_height_;
- target_tree->top_controls_content_offset_ = top_controls_content_offset_;
- target_tree->top_controls_delta_ = target_tree->top_controls_delta_ -
- target_tree->sent_top_controls_delta_ -
- top_controls_height_delta;
- target_tree->sent_top_controls_delta_ = 0.f;
+ target_tree->set_top_controls_shrink_blink_size(
+ top_controls_shrink_blink_size_);
+ target_tree->set_top_controls_height(top_controls_height_);
+ target_tree->PushTopControls(nullptr);
// Active tree already shares the page_scale_factor object with pending
// tree so only the limits need to be provided.
@@ -364,6 +354,48 @@ void LayerTreeImpl::PushPageScaleFactorAndLimits(const float* page_scale_factor,
DidUpdatePageScale();
}
+void LayerTreeImpl::set_top_controls_shrink_blink_size(bool shrink) {
+ if (top_controls_shrink_blink_size_ == shrink)
+ return;
+
+ top_controls_shrink_blink_size_ = shrink;
+ if (IsActiveTree())
+ layer_tree_host_impl_->UpdateViewportContainerSizes();
+}
+
+void LayerTreeImpl::set_top_controls_height(float top_controls_height) {
+ if (top_controls_height_ == top_controls_height)
+ return;
+
+ top_controls_height_ = top_controls_height;
+ if (IsActiveTree())
+ layer_tree_host_impl_->UpdateViewportContainerSizes();
+}
+
+bool LayerTreeImpl::SetCurrentTopControlsShownRatio(float ratio) {
+ ratio = std::max(ratio, 0.f);
+ ratio = std::min(ratio, 1.f);
+ return top_controls_shown_ratio_->SetCurrent(ratio);
+}
+
+void LayerTreeImpl::PushTopControlsFromMainThread(
+ float top_controls_shown_ratio) {
+ PushTopControls(&top_controls_shown_ratio);
+}
+
+void LayerTreeImpl::PushTopControls(const float* top_controls_shown_ratio) {
+ DCHECK(top_controls_shown_ratio || IsActiveTree());
+
+ if (top_controls_shown_ratio) {
+ DCHECK(!IsActiveTree() || !layer_tree_host_impl_->pending_tree());
+ top_controls_shown_ratio_->PushFromMainThread(*top_controls_shown_ratio);
+ }
+ if (IsActiveTree()) {
+ if (top_controls_shown_ratio_->PushPendingToActive())
+ layer_tree_host_impl_->DidChangeTopControlsPosition();
+ }
+}
+
bool LayerTreeImpl::SetPageScaleFactorLimits(float min_page_scale_factor,
float max_page_scale_factor) {
if (min_page_scale_factor == min_page_scale_factor_ &&
@@ -451,12 +483,9 @@ void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
DCHECK(IsActiveTree());
page_scale_factor()->AbortCommit();
+ top_controls_shown_ratio()->AbortCommit();
elastic_overscroll()->AbortCommit();
- top_controls_content_offset_ += sent_top_controls_delta_;
- top_controls_delta_ -= sent_top_controls_delta_;
- sent_top_controls_delta_ = 0.f;
-
if (!root_layer())
return;
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 2329139..19bba86 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -55,6 +55,7 @@ struct RendererCapabilities;
struct SelectionHandle;
typedef std::vector<UIResourceRequest> UIResourceRequestQueue;
+typedef SyncedProperty<AdditionGroup<float>> SyncedTopControls;
typedef SyncedProperty<AdditionGroup<gfx::Vector2dF>> SyncedElasticOverscroll;
class CC_EXPORT LayerTreeImpl {
@@ -62,9 +63,11 @@ class CC_EXPORT LayerTreeImpl {
static scoped_ptr<LayerTreeImpl> create(
LayerTreeHostImpl* layer_tree_host_impl,
scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor,
+ scoped_refptr<SyncedTopControls> top_controls_shown_ratio,
scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) {
- return make_scoped_ptr(new LayerTreeImpl(
- layer_tree_host_impl, page_scale_factor, elastic_overscroll));
+ return make_scoped_ptr(
+ new LayerTreeImpl(layer_tree_host_impl, page_scale_factor,
+ top_controls_shown_ratio, elastic_overscroll));
}
virtual ~LayerTreeImpl();
@@ -192,6 +195,13 @@ class CC_EXPORT LayerTreeImpl {
return elastic_overscroll_.get();
}
+ SyncedTopControls* top_controls_shown_ratio() {
+ return top_controls_shown_ratio_.get();
+ }
+ const SyncedTopControls* top_controls_shown_ratio() const {
+ return top_controls_shown_ratio_.get();
+ }
+
// Updates draw properties and render surface layer list, as well as tile
// priorities. Returns false if it was unable to update.
bool UpdateDrawProperties();
@@ -303,36 +313,17 @@ class CC_EXPORT LayerTreeImpl {
void RegisterPictureLayerImpl(PictureLayerImpl* layer);
void UnregisterPictureLayerImpl(PictureLayerImpl* layer);
- void set_top_controls_shrink_blink_size(bool shrink) {
- top_controls_shrink_blink_size_ = shrink;
- }
- void set_top_controls_height(float height) { top_controls_height_ = height; }
- void set_top_controls_content_offset(float offset) {
- top_controls_content_offset_ = offset;
- }
- void set_top_controls_delta(float delta) {
- top_controls_delta_ = delta;
- }
- void set_sent_top_controls_delta(float sent_delta) {
- sent_top_controls_delta_ = sent_delta;
- }
-
+ void set_top_controls_shrink_blink_size(bool shrink);
bool top_controls_shrink_blink_size() const {
return top_controls_shrink_blink_size_;
}
- float top_controls_height() const { return top_controls_height_; }
- float top_controls_content_offset() const {
- return top_controls_content_offset_;
- }
- float top_controls_delta() const {
- return top_controls_delta_;
- }
- float sent_top_controls_delta() const {
- return sent_top_controls_delta_;
- }
- float total_top_controls_content_offset() const {
- return top_controls_content_offset_ + top_controls_delta_;
+ bool SetCurrentTopControlsShownRatio(float ratio);
+ float CurrentTopControlsShownRatio() const {
+ return top_controls_shown_ratio_->Current(IsActiveTree());
}
+ void set_top_controls_height(float top_controls_height);
+ float top_controls_height() const { return top_controls_height_; }
+ void PushTopControlsFromMainThread(float top_controls_shown_ratio);
void SetPendingPageScaleAnimation(
scoped_ptr<PendingPageScaleAnimation> pending_animation);
@@ -342,6 +333,7 @@ class CC_EXPORT LayerTreeImpl {
explicit LayerTreeImpl(
LayerTreeHostImpl* layer_tree_host_impl,
scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor,
+ scoped_refptr<SyncedTopControls> top_controls_shown_ratio,
scoped_refptr<SyncedElasticOverscroll> elastic_overscroll);
void ProcessLayersRecursive(LayerImpl* current,
void (LayerImpl::*function)());
@@ -353,7 +345,7 @@ class CC_EXPORT LayerTreeImpl {
float max_page_scale_factor);
void DidUpdatePageScale();
void HideInnerViewportScrollbarsIfNearMinimumScale();
-
+ void PushTopControls(const float* top_controls_shown_ratio);
LayerTreeHostImpl* layer_tree_host_impl_;
int source_frame_number_;
scoped_ptr<LayerImpl> root_layer_;
@@ -416,11 +408,9 @@ class CC_EXPORT LayerTreeImpl {
float top_controls_height_;
- // The up-to-date content offset of the top controls, i.e. the amount that the
- // web contents have been shifted down from the top of the device viewport.
- float top_controls_content_offset_;
- float top_controls_delta_;
- float sent_top_controls_delta_;
+ // The amount that the top controls are shown from 0 (hidden) to 1 (fully
+ // shown).
+ scoped_refptr<SyncedTopControls> top_controls_shown_ratio_;
scoped_ptr<PendingPageScaleAnimation> pending_page_scale_animation_;
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index bb02b49..77df05f 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -753,7 +753,11 @@ void RenderWidgetCompositor::setShowScrollBottleneckRects(bool show) {
}
void RenderWidgetCompositor::setTopControlsContentOffset(float offset) {
- layer_tree_host_->SetTopControlsContentOffset(offset);
+ setTopControlsShownRatio(offset);
+}
+
+void RenderWidgetCompositor::setTopControlsShownRatio(float ratio) {
+ layer_tree_host_->SetTopControlsShownRatio(ratio);
}
void RenderWidgetCompositor::WillBeginMainFrame() {
diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h
index 9428ef8..25d9f53 100644
--- a/content/renderer/gpu/render_widget_compositor.h
+++ b/content/renderer/gpu/render_widget_compositor.h
@@ -129,6 +129,9 @@ class CONTENT_EXPORT RenderWidgetCompositor
virtual void setShowDebugBorders(bool show);
virtual void setContinuousPaintingEnabled(bool enabled);
virtual void setShowScrollBottleneckRects(bool show);
+ virtual void setTopControlsShownRatio(float);
+
+ // TODO(aelias): Delete after Blink roll
virtual void setTopControlsContentOffset(float);
// cc::LayerTreeHostClient implementation.
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 9cc9899..1b29380 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -808,8 +808,8 @@ void RenderWidget::Resize(const gfx::Size& new_size,
WillToggleFullscreen();
is_fullscreen_ = is_fullscreen;
- webwidget_->setTopControlsLayoutHeight(top_controls_shrink_blink_size_
- ? top_controls_height : 0.f);
+ webwidget_->setTopControlsHeight(top_controls_height,
+ top_controls_shrink_blink_size_);
if (size_ != new_size) {
size_ = new_size;