| Index: cc/trees/layer_tree_impl.cc
|
| diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
|
| index c2edaae65d308c7b3eca5b5b5607288d99012da5..b831bb38b504a22eb30c3c16606a2dcf0d0f7d04 100644
|
| --- a/cc/trees/layer_tree_impl.cc
|
| +++ b/cc/trees/layer_tree_impl.cc
|
| @@ -8,6 +8,7 @@
|
| #include <limits>
|
| #include <set>
|
|
|
| +#include "base/auto_reset.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "base/trace_event/trace_event_argument.h"
|
| #include "cc/animation/keyframed_animation_curve.h"
|
| @@ -19,6 +20,7 @@
|
| #include "cc/base/util.h"
|
| #include "cc/debug/devtools_instrumentation.h"
|
| #include "cc/debug/traced_value.h"
|
| +#include "cc/input/layer_scroll_offset_delegate.h"
|
| #include "cc/input/page_scale_animation.h"
|
| #include "cc/layers/heads_up_display_layer_impl.h"
|
| #include "cc/layers/layer.h"
|
| @@ -34,44 +36,6 @@
|
| #include "ui/gfx/geometry/vector2d_conversions.h"
|
|
|
| namespace cc {
|
| -// This class exists to split the LayerScrollOffsetDelegate between the
|
| -// InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner
|
| -// that never requires the embedder or LayerImpl to know about.
|
| -class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate {
|
| - public:
|
| - LayerScrollOffsetDelegateProxy(LayerImpl* layer,
|
| - LayerScrollOffsetDelegate* delegate,
|
| - LayerTreeImpl* layer_tree)
|
| - : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {}
|
| - virtual ~LayerScrollOffsetDelegateProxy() {}
|
| -
|
| - gfx::ScrollOffset last_set_scroll_offset() const {
|
| - return last_set_scroll_offset_;
|
| - }
|
| -
|
| - // LayerScrollOffsetDelegate implementation.
|
| - void SetCurrentScrollOffset(const gfx::ScrollOffset& new_offset) override {
|
| - last_set_scroll_offset_ = new_offset;
|
| - }
|
| -
|
| - gfx::ScrollOffset GetCurrentScrollOffset() override {
|
| - return layer_tree_impl_->GetDelegatedScrollOffset(layer_);
|
| - }
|
| -
|
| - bool IsExternalFlingActive() const override {
|
| - return delegate_->IsExternalFlingActive();
|
| - }
|
| -
|
| - void Update() const override {
|
| - layer_tree_impl_->UpdateScrollOffsetDelegate();
|
| - }
|
| -
|
| - private:
|
| - LayerImpl* layer_;
|
| - LayerScrollOffsetDelegate* delegate_;
|
| - LayerTreeImpl* layer_tree_impl_;
|
| - gfx::ScrollOffset last_set_scroll_offset_;
|
| -};
|
|
|
| LayerTreeImpl::LayerTreeImpl(
|
| LayerTreeHostImpl* layer_tree_host_impl,
|
| @@ -148,14 +112,28 @@ void LayerTreeImpl::GatherFrameTimingRequestIds(
|
| });
|
| }
|
|
|
| -void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
|
| - if (inner_viewport_scroll_layer_)
|
| - inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| - if (outer_viewport_scroll_layer_)
|
| - outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| - inner_viewport_scroll_delegate_proxy_ = nullptr;
|
| - outer_viewport_scroll_delegate_proxy_ = nullptr;
|
| +bool LayerTreeImpl::IsExternalFlingActive() const {
|
| + return root_layer_scroll_offset_delegate_ &&
|
| + root_layer_scroll_offset_delegate_->IsExternalFlingActive();
|
| +}
|
| +
|
| +void LayerTreeImpl::DidUpdateScrollOffset(int layer_id) {
|
| + int inner_layer_id = InnerViewportScrollLayer()
|
| + ? InnerViewportScrollLayer()->id()
|
| + : Layer::INVALID_ID;
|
| + int outer_layer_id = OuterViewportScrollLayer()
|
| + ? OuterViewportScrollLayer()->id()
|
| + : Layer::INVALID_ID;
|
| + if (layer_id != outer_layer_id && layer_id != inner_layer_id)
|
| + return;
|
| +
|
| + if (!root_layer_scroll_offset_delegate_)
|
| + return;
|
|
|
| + UpdateRootScrollOffsetDelegate();
|
| +}
|
| +
|
| +void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
|
| root_layer_ = layer.Pass();
|
| currently_scrolling_layer_ = NULL;
|
| inner_viewport_scroll_layer_ = NULL;
|
| @@ -201,12 +179,6 @@ scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() {
|
| // Clear all data structures that have direct references to the layer tree.
|
| scrolling_layer_id_from_previous_tree_ =
|
| currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0;
|
| - if (inner_viewport_scroll_layer_)
|
| - inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| - if (outer_viewport_scroll_layer_)
|
| - outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
|
| - inner_viewport_scroll_delegate_proxy_ = nullptr;
|
| - outer_viewport_scroll_delegate_proxy_ = nullptr;
|
| inner_viewport_scroll_layer_ = NULL;
|
| outer_viewport_scroll_layer_ = NULL;
|
| page_scale_layer_ = NULL;
|
| @@ -531,17 +503,6 @@ void LayerTreeImpl::SetViewportLayersFromIds(
|
|
|
| if (!root_layer_scroll_offset_delegate_)
|
| return;
|
| -
|
| - inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
|
| - new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_,
|
| - root_layer_scroll_offset_delegate_,
|
| - this));
|
| -
|
| - if (outer_viewport_scroll_layer_)
|
| - outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
|
| - new LayerScrollOffsetDelegateProxy(outer_viewport_scroll_layer_,
|
| - root_layer_scroll_offset_delegate_,
|
| - this));
|
| }
|
|
|
| void LayerTreeImpl::ClearViewportLayers() {
|
| @@ -1040,17 +1001,6 @@ void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
|
| if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate)
|
| return;
|
|
|
| - if (!root_layer_scroll_offset_delegate) {
|
| - // Make sure we remove the proxies from their layers before
|
| - // releasing them.
|
| - if (InnerViewportScrollLayer())
|
| - InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
|
| - if (OuterViewportScrollLayer())
|
| - OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
|
| - inner_viewport_scroll_delegate_proxy_ = nullptr;
|
| - outer_viewport_scroll_delegate_proxy_ = nullptr;
|
| - }
|
| -
|
| root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
|
|
|
| if (root_layer_scroll_offset_delegate_) {
|
| @@ -1059,54 +1009,17 @@ void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
|
| current_page_scale_factor(), min_page_scale_factor(),
|
| max_page_scale_factor());
|
|
|
| - if (inner_viewport_scroll_layer_) {
|
| - inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
|
| - new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(),
|
| - root_layer_scroll_offset_delegate_,
|
| - this));
|
| - inner_viewport_scroll_layer_->SetScrollOffsetDelegate(
|
| - inner_viewport_scroll_delegate_proxy_.get());
|
| - }
|
| -
|
| - if (outer_viewport_scroll_layer_) {
|
| - outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
|
| - new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(),
|
| - root_layer_scroll_offset_delegate_,
|
| - this));
|
| - outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
|
| - outer_viewport_scroll_delegate_proxy_.get());
|
| - }
|
| -
|
| - if (inner_viewport_scroll_layer_)
|
| - inner_viewport_scroll_layer_->RefreshFromScrollDelegate();
|
| - if (outer_viewport_scroll_layer_)
|
| - outer_viewport_scroll_layer_->RefreshFromScrollDelegate();
|
| -
|
| - if (inner_viewport_scroll_layer_)
|
| - UpdateScrollOffsetDelegate();
|
| - }
|
| -}
|
| -
|
| -void LayerTreeImpl::OnRootLayerDelegatedScrollOffsetChanged() {
|
| - DCHECK(root_layer_scroll_offset_delegate_);
|
| - if (inner_viewport_scroll_layer_) {
|
| - inner_viewport_scroll_layer_->RefreshFromScrollDelegate();
|
| - }
|
| - if (outer_viewport_scroll_layer_) {
|
| - outer_viewport_scroll_layer_->RefreshFromScrollDelegate();
|
| + DistributeRootScrollOffset();
|
| }
|
| }
|
|
|
| -void LayerTreeImpl::UpdateScrollOffsetDelegate() {
|
| - DCHECK(InnerViewportScrollLayer());
|
| - DCHECK(!OuterViewportScrollLayer() || outer_viewport_scroll_delegate_proxy_);
|
| +void LayerTreeImpl::UpdateRootScrollOffsetDelegate() {
|
| DCHECK(root_layer_scroll_offset_delegate_);
|
|
|
| - gfx::ScrollOffset offset =
|
| - inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
|
| + gfx::ScrollOffset offset = InnerViewportScrollLayer()->CurrentScrollOffset();
|
|
|
| if (OuterViewportScrollLayer())
|
| - offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
|
| + offset += OuterViewportScrollLayer()->CurrentScrollOffset();
|
|
|
| root_layer_scroll_offset_delegate_->UpdateRootLayerState(
|
| offset, TotalMaxScrollOffset(), ScrollableSize(),
|
| @@ -1114,44 +1027,43 @@ void LayerTreeImpl::UpdateScrollOffsetDelegate() {
|
| max_page_scale_factor());
|
| }
|
|
|
| -gfx::ScrollOffset LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) {
|
| - DCHECK(root_layer_scroll_offset_delegate_);
|
| - DCHECK(InnerViewportScrollLayer());
|
| - if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer())
|
| - return root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
|
| +void LayerTreeImpl::DistributeRootScrollOffset() {
|
| + if (!root_layer_scroll_offset_delegate_)
|
| + return;
|
| +
|
| + gfx::ScrollOffset root_offset =
|
| + root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
|
| +
|
| + if (!InnerViewportScrollLayer())
|
| + return;
|
| +
|
| + DCHECK(OuterViewportScrollLayer());
|
|
|
| // If we get here, we have both inner/outer viewports, and need to distribute
|
| // the scroll offset between them.
|
| - DCHECK(inner_viewport_scroll_delegate_proxy_);
|
| - DCHECK(outer_viewport_scroll_delegate_proxy_);
|
| gfx::ScrollOffset inner_viewport_offset =
|
| - inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
|
| + InnerViewportScrollLayer()->CurrentScrollOffset();
|
| gfx::ScrollOffset outer_viewport_offset =
|
| - outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
|
| + OuterViewportScrollLayer()->CurrentScrollOffset();
|
|
|
| // It may be nothing has changed.
|
| - gfx::ScrollOffset delegate_offset =
|
| - root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
|
| - if (inner_viewport_offset + outer_viewport_offset == delegate_offset) {
|
| - if (layer == InnerViewportScrollLayer())
|
| - return inner_viewport_offset;
|
| - else
|
| - return outer_viewport_offset;
|
| - }
|
| + if (inner_viewport_offset + outer_viewport_offset == root_offset)
|
| + return;
|
|
|
| gfx::ScrollOffset max_outer_viewport_scroll_offset =
|
| OuterViewportScrollLayer()->MaxScrollOffset();
|
|
|
| - outer_viewport_offset = delegate_offset - inner_viewport_offset;
|
| + outer_viewport_offset = root_offset - inner_viewport_offset;
|
| outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
|
| outer_viewport_offset.SetToMax(gfx::ScrollOffset());
|
|
|
| - if (layer == OuterViewportScrollLayer())
|
| - return outer_viewport_offset;
|
| -
|
| - inner_viewport_offset = delegate_offset - outer_viewport_offset;
|
| + OuterViewportScrollLayer()->SetCurrentScrollOffsetFromDelegate(
|
| + outer_viewport_offset);
|
| + inner_viewport_offset = root_offset - outer_viewport_offset;
|
| + InnerViewportScrollLayer()->SetCurrentScrollOffsetFromDelegate(
|
| + inner_viewport_offset);
|
|
|
| - return inner_viewport_offset;
|
| + UpdateRootScrollOffsetDelegate();
|
| }
|
|
|
| void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) {
|
|
|