diff options
Diffstat (limited to 'cc')
-rw-r--r-- | cc/input/top_controls_manager.cc | 148 | ||||
-rw-r--r-- | cc/input/top_controls_manager.h | 10 | ||||
-rw-r--r-- | cc/input/top_controls_manager_client.h | 5 | ||||
-rw-r--r-- | cc/input/top_controls_manager_unittest.cc | 204 | ||||
-rw-r--r-- | cc/trees/layer_tree_host.cc | 20 | ||||
-rw-r--r-- | cc/trees/layer_tree_host.h | 4 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl.cc | 54 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl.h | 8 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl_unittest.cc | 144 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl.cc | 71 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl.h | 58 |
11 files changed, 342 insertions, 384 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_; |