| Index: Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm
|
| diff --git a/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm b/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm
|
| deleted file mode 100644
|
| index a486593074de374b179bfcfac54233a1158e3752..0000000000000000000000000000000000000000
|
| --- a/Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm
|
| +++ /dev/null
|
| @@ -1,443 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2011 Apple Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
| - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
| - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
| - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
| - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
| - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
| - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
| - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
| - * THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -
|
| -#if ENABLE(THREADED_SCROLLING)
|
| -
|
| -#import "ScrollingCoordinatorMac.h"
|
| -
|
| -#include "GraphicsLayer.h"
|
| -#include "Frame.h"
|
| -#include "FrameView.h"
|
| -#include "IntRect.h"
|
| -#include "Page.h"
|
| -#include "PlatformWheelEvent.h"
|
| -#include "PluginViewBase.h"
|
| -#include "Region.h"
|
| -#include "RenderLayerCompositor.h"
|
| -#include "RenderView.h"
|
| -#include "ScrollAnimator.h"
|
| -#include "ScrollingConstraints.h"
|
| -#include "ScrollingStateFixedNode.h"
|
| -#include "ScrollingStateScrollingNode.h"
|
| -#include "ScrollingStateStickyNode.h"
|
| -#include "ScrollingStateTree.h"
|
| -#include "ScrollingThread.h"
|
| -#include "ScrollingTree.h"
|
| -#include "TiledBacking.h"
|
| -
|
| -#include <wtf/Functional.h>
|
| -#include <wtf/MainThread.h>
|
| -#include <wtf/PassRefPtr.h>
|
| -
|
| -
|
| -namespace WebCore {
|
| -
|
| -class ScrollingCoordinatorPrivate {
|
| -};
|
| -
|
| -ScrollingCoordinatorMac::ScrollingCoordinatorMac(Page* page)
|
| - : ScrollingCoordinator(page)
|
| - , m_scrollingStateTree(ScrollingStateTree::create())
|
| - , m_scrollingTree(ScrollingTree::create(this))
|
| - , m_scrollingStateTreeCommitterTimer(this, &ScrollingCoordinatorMac::scrollingStateTreeCommitterTimerFired)
|
| -{
|
| -}
|
| -
|
| -ScrollingCoordinatorMac::~ScrollingCoordinatorMac()
|
| -{
|
| - ASSERT(!m_scrollingTree);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::pageDestroyed()
|
| -{
|
| - ScrollingCoordinator::pageDestroyed();
|
| -
|
| - m_scrollingStateTreeCommitterTimer.stop();
|
| -
|
| - // Invalidating the scrolling tree will break the reference cycle between the ScrollingCoordinator and ScrollingTree objects.
|
| - ScrollingThread::dispatch(bind(&ScrollingTree::invalidate, m_scrollingTree.release()));
|
| -}
|
| -
|
| -ScrollingTree* ScrollingCoordinatorMac::scrollingTree() const
|
| -{
|
| - ASSERT(m_scrollingTree);
|
| - return m_scrollingTree.get();
|
| -}
|
| -
|
| -bool ScrollingCoordinatorMac::isRubberBandInProgress() const
|
| -{
|
| - return scrollingTree()->isRubberBandInProgress();
|
| -}
|
| -
|
| -bool ScrollingCoordinatorMac::rubberBandsAtBottom() const
|
| -{
|
| - return scrollingTree()->rubberBandsAtBottom();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setRubberBandsAtBottom(bool rubberBandsAtBottom)
|
| -{
|
| - scrollingTree()->setRubberBandsAtBottom(rubberBandsAtBottom);
|
| -}
|
| -
|
| -bool ScrollingCoordinatorMac::rubberBandsAtTop() const
|
| -{
|
| - return scrollingTree()->rubberBandsAtTop();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setRubberBandsAtTop(bool rubberBandsAtTop)
|
| -{
|
| - scrollingTree()->setRubberBandsAtTop(rubberBandsAtTop);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::commitTreeStateIfNeeded()
|
| -{
|
| - if (!m_scrollingStateTree->hasChangedProperties())
|
| - return;
|
| -
|
| - commitTreeState();
|
| - m_scrollingStateTreeCommitterTimer.stop();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::frameViewLayoutUpdated(FrameView* frameView)
|
| -{
|
| - ASSERT(isMainThread());
|
| - ASSERT(m_page);
|
| -
|
| - // If there isn't a root node yet, don't do anything. We'll be called again after creating one.
|
| - if (!m_scrollingStateTree->rootStateNode())
|
| - return;
|
| -
|
| - // Compute the region of the page that we can't do fast scrolling for. This currently includes
|
| - // all scrollable areas, such as subframes, overflow divs and list boxes. We need to do this even if the
|
| - // frame view whose layout was updated is not the main frame.
|
| - Region nonFastScrollableRegion = computeNonFastScrollableRegion(m_page->mainFrame(), IntPoint());
|
| -
|
| - // In the future, we may want to have the ability to set non-fast scrolling regions for more than
|
| - // just the root node. But right now, this concept only applies to the root.
|
| - setNonFastScrollableRegionForNode(nonFastScrollableRegion, m_scrollingStateTree->rootStateNode());
|
| -
|
| - if (!coordinatesScrollingForFrameView(frameView))
|
| - return;
|
| -
|
| - ScrollingStateScrollingNode* node = toScrollingStateScrollingNode(m_scrollingStateTree->stateNodeForID(frameView->scrollLayerID()));
|
| - if (!node)
|
| - return;
|
| -
|
| - ScrollParameters scrollParameters;
|
| - scrollParameters.horizontalScrollElasticity = frameView->horizontalScrollElasticity();
|
| - scrollParameters.verticalScrollElasticity = frameView->verticalScrollElasticity();
|
| - scrollParameters.hasEnabledHorizontalScrollbar = frameView->horizontalScrollbar() && frameView->horizontalScrollbar()->enabled();
|
| - scrollParameters.hasEnabledVerticalScrollbar = frameView->verticalScrollbar() && frameView->verticalScrollbar()->enabled();
|
| - scrollParameters.horizontalScrollbarMode = frameView->horizontalScrollbarMode();
|
| - scrollParameters.verticalScrollbarMode = frameView->verticalScrollbarMode();
|
| -
|
| - scrollParameters.scrollOrigin = frameView->scrollOrigin();
|
| - scrollParameters.viewportRect = IntRect(IntPoint(), frameView->visibleContentRect().size());
|
| - scrollParameters.totalContentsSize = frameView->totalContentsSize();
|
| - scrollParameters.frameScaleFactor = frameView->frame()->frameScaleFactor();
|
| - scrollParameters.headerHeight = frameView->headerHeight();
|
| - scrollParameters.footerHeight = frameView->footerHeight();
|
| -
|
| - setScrollParametersForNode(scrollParameters, node);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::recomputeWheelEventHandlerCountForFrameView(FrameView* frameView)
|
| -{
|
| - ScrollingStateScrollingNode* node = toScrollingStateScrollingNode(m_scrollingStateTree->stateNodeForID(frameView->scrollLayerID()));
|
| - if (!node)
|
| - return;
|
| - setWheelEventHandlerCountForNode(computeCurrentWheelEventHandlerCount(), node);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::frameViewRootLayerDidChange(FrameView* frameView)
|
| -{
|
| - ASSERT(isMainThread());
|
| - ASSERT(m_page);
|
| -
|
| - if (!coordinatesScrollingForFrameView(frameView))
|
| - return;
|
| -
|
| - // If the root layer does not have a ScrollingStateNode, then we should create one.
|
| - ensureRootStateNodeForFrameView(frameView);
|
| - ASSERT(m_scrollingStateTree->rootStateNode());
|
| -
|
| - ScrollingCoordinator::frameViewRootLayerDidChange(frameView);
|
| -
|
| - ScrollingStateScrollingNode* node = toScrollingStateScrollingNode(m_scrollingStateTree->stateNodeForID(frameView->scrollLayerID()));
|
| - setScrollLayerForNode(scrollLayerForFrameView(frameView), node);
|
| - setCounterScrollingLayerForNode(counterScrollingLayerForFrameView(frameView), node);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::scrollableAreaScrollbarLayerDidChange(ScrollableArea* scrollableArea, ScrollbarOrientation)
|
| -{
|
| - ASSERT(isMainThread());
|
| - ASSERT(m_page);
|
| -
|
| - if (scrollableArea != static_cast<ScrollableArea*>(m_page->mainFrame()->view()))
|
| - return;
|
| -
|
| - // FIXME: Implement.
|
| -}
|
| -
|
| -bool ScrollingCoordinatorMac::requestScrollPositionUpdate(FrameView* frameView, const IntPoint& scrollPosition)
|
| -{
|
| - ASSERT(isMainThread());
|
| - ASSERT(m_page);
|
| -
|
| - if (!coordinatesScrollingForFrameView(frameView))
|
| - return false;
|
| -
|
| - if (frameView->inProgrammaticScroll() || frameView->frame()->document()->inPageCache())
|
| - updateMainFrameScrollPosition(scrollPosition, frameView->inProgrammaticScroll(), SetScrollingLayerPosition);
|
| -
|
| - // If this frame view's document is being put into the page cache, we don't want to update our
|
| - // main frame scroll position. Just let the FrameView think that we did.
|
| - if (frameView->frame()->document()->inPageCache())
|
| - return true;
|
| -
|
| - ScrollingStateScrollingNode* stateNode = toScrollingStateScrollingNode(m_scrollingStateTree->stateNodeForID(frameView->scrollLayerID()));
|
| - if (!stateNode)
|
| - return false;
|
| -
|
| - stateNode->setRequestedScrollPosition(scrollPosition, frameView->inProgrammaticScroll());
|
| - scheduleTreeStateCommit();
|
| - return true;
|
| -}
|
| -
|
| -bool ScrollingCoordinatorMac::handleWheelEvent(FrameView*, const PlatformWheelEvent& wheelEvent)
|
| -{
|
| - ASSERT(isMainThread());
|
| - ASSERT(m_page);
|
| -
|
| - if (m_scrollingTree->willWheelEventStartSwipeGesture(wheelEvent))
|
| - return false;
|
| -
|
| - ScrollingThread::dispatch(bind(&ScrollingTree::handleWheelEvent, m_scrollingTree.get(), wheelEvent));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -ScrollingNodeID ScrollingCoordinatorMac::attachToStateTree(ScrollingNodeType nodeType, ScrollingNodeID newNodeID, ScrollingNodeID parentID)
|
| -{
|
| - return m_scrollingStateTree->attachNode(nodeType, newNodeID, parentID);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::detachFromStateTree(ScrollingNodeID nodeID)
|
| -{
|
| - m_scrollingStateTree->detachNode(nodeID);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::clearStateTree()
|
| -{
|
| - m_scrollingStateTree->clear();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::ensureRootStateNodeForFrameView(FrameView* frameView)
|
| -{
|
| - ASSERT(frameView->scrollLayerID());
|
| - attachToStateTree(ScrollingNode, frameView->scrollLayerID(), 0);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setScrollLayerForNode(GraphicsLayer* scrollLayer, ScrollingStateNode* node)
|
| -{
|
| - node->setScrollLayer(scrollLayer);
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setCounterScrollingLayerForNode(GraphicsLayer* layer, ScrollingStateScrollingNode* node)
|
| -{
|
| - node->setCounterScrollingLayer(layer);
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setNonFastScrollableRegionForNode(const Region& region, ScrollingStateScrollingNode* node)
|
| -{
|
| - node->setNonFastScrollableRegion(region);
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setScrollParametersForNode(const ScrollParameters& scrollParameters, ScrollingStateScrollingNode* node)
|
| -{
|
| - node->setHorizontalScrollElasticity(scrollParameters.horizontalScrollElasticity);
|
| - node->setVerticalScrollElasticity(scrollParameters.verticalScrollElasticity);
|
| - node->setHasEnabledHorizontalScrollbar(scrollParameters.hasEnabledHorizontalScrollbar);
|
| - node->setHasEnabledVerticalScrollbar(scrollParameters.hasEnabledVerticalScrollbar);
|
| - node->setHorizontalScrollbarMode(scrollParameters.horizontalScrollbarMode);
|
| - node->setVerticalScrollbarMode(scrollParameters.verticalScrollbarMode);
|
| -
|
| - node->setScrollOrigin(scrollParameters.scrollOrigin);
|
| - node->setViewportRect(scrollParameters.viewportRect);
|
| - node->setTotalContentsSize(scrollParameters.totalContentsSize);
|
| - node->setFrameScaleFactor(scrollParameters.frameScaleFactor);
|
| - node->setHeaderHeight(scrollParameters.headerHeight);
|
| - node->setFooterHeight(scrollParameters.footerHeight);
|
| -
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setWheelEventHandlerCountForNode(unsigned wheelEventHandlerCount, ScrollingStateScrollingNode* node)
|
| -{
|
| - node->setWheelEventHandlerCount(wheelEventHandlerCount);
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::setShouldUpdateScrollLayerPositionOnMainThread(MainThreadScrollingReasons reasons)
|
| -{
|
| - if (!m_scrollingStateTree->rootStateNode())
|
| - return;
|
| -
|
| - // The FrameView's GraphicsLayer is likely to be out-of-synch with the PlatformLayer
|
| - // at this point. So we'll update it before we switch back to main thread scrolling
|
| - // in order to avoid layer positioning bugs.
|
| - if (reasons)
|
| - updateMainFrameScrollLayerPosition();
|
| - m_scrollingStateTree->rootStateNode()->setShouldUpdateScrollLayerPositionOnMainThread(reasons);
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::updateMainFrameScrollLayerPosition()
|
| -{
|
| - ASSERT(isMainThread());
|
| -
|
| - if (!m_page)
|
| - return;
|
| -
|
| - FrameView* frameView = m_page->mainFrame()->view();
|
| - if (!frameView)
|
| - return;
|
| -
|
| - if (GraphicsLayer* scrollLayer = scrollLayerForFrameView(frameView))
|
| - scrollLayer->setPosition(-frameView->scrollPosition());
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::syncChildPositions(const LayoutRect& viewportRect)
|
| -{
|
| - if (!m_scrollingStateTree->rootStateNode())
|
| - return;
|
| -
|
| - Vector<OwnPtr<ScrollingStateNode> >* children = m_scrollingStateTree->rootStateNode()->children();
|
| - if (!children)
|
| - return;
|
| -
|
| - // FIXME: We'll have to traverse deeper into the tree at some point.
|
| - size_t size = children->size();
|
| - for (size_t i = 0; i < size; ++i) {
|
| - ScrollingStateNode* child = children->at(i).get();
|
| - child->syncLayerPositionForViewportRect(viewportRect);
|
| - }
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::updateScrollingNode(ScrollingNodeID nodeID, GraphicsLayer* scrollLayer, GraphicsLayer* counterScrollingLayer)
|
| -{
|
| - ScrollingStateScrollingNode* node = toScrollingStateScrollingNode(m_scrollingStateTree->stateNodeForID(nodeID));
|
| - ASSERT(node);
|
| - if (!node)
|
| - return;
|
| -
|
| - node->setScrollLayer(scrollLayer);
|
| - node->setCounterScrollingLayer(counterScrollingLayer);
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::updateViewportConstrainedNode(ScrollingNodeID nodeID, const ViewportConstraints& constraints, GraphicsLayer* graphicsLayer)
|
| -{
|
| - ASSERT(supportsFixedPositionLayers());
|
| -
|
| - ScrollingStateNode* node = m_scrollingStateTree->stateNodeForID(nodeID);
|
| - if (!node)
|
| - return;
|
| -
|
| - switch (constraints.constraintType()) {
|
| - case ViewportConstraints::FixedPositionConstaint: {
|
| - ScrollingStateFixedNode* fixedNode = toScrollingStateFixedNode(node);
|
| - setScrollLayerForNode(graphicsLayer, fixedNode);
|
| - fixedNode->updateConstraints((const FixedPositionViewportConstraints&)constraints);
|
| - break;
|
| - }
|
| - case ViewportConstraints::StickyPositionConstraint: {
|
| - ScrollingStateStickyNode* stickyNode = toScrollingStateStickyNode(node);
|
| - setScrollLayerForNode(graphicsLayer, stickyNode);
|
| - stickyNode->updateConstraints((const StickyPositionViewportConstraints&)constraints);
|
| - break;
|
| - }
|
| - }
|
| - scheduleTreeStateCommit();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::scheduleTreeStateCommit()
|
| -{
|
| - if (m_scrollingStateTreeCommitterTimer.isActive())
|
| - return;
|
| -
|
| - if (!m_scrollingStateTree->hasChangedProperties())
|
| - return;
|
| -
|
| - m_scrollingStateTreeCommitterTimer.startOneShot(0);
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::scrollingStateTreeCommitterTimerFired(Timer<ScrollingCoordinatorMac>*)
|
| -{
|
| - commitTreeState();
|
| -}
|
| -
|
| -void ScrollingCoordinatorMac::commitTreeState()
|
| -{
|
| - ASSERT(m_scrollingStateTree->hasChangedProperties());
|
| -
|
| - OwnPtr<ScrollingStateTree> treeState = m_scrollingStateTree->commit();
|
| - ScrollingThread::dispatch(bind(&ScrollingTree::commitNewTreeState, m_scrollingTree.get(), treeState.release()));
|
| -
|
| - FrameView* frameView = m_page->mainFrame()->view();
|
| - if (!frameView)
|
| - return;
|
| -
|
| - TiledBacking* tiledBacking = frameView->tiledBacking();
|
| - if (!tiledBacking)
|
| - return;
|
| -
|
| - ScrollingModeIndication indicatorMode;
|
| - if (shouldUpdateScrollLayerPositionOnMainThread())
|
| - indicatorMode = MainThreadScrollingBecauseOfStyleIndication;
|
| - else if (scrollingTree() && scrollingTree()->hasWheelEventHandlers())
|
| - indicatorMode = MainThreadScrollingBecauseOfEventHandlersIndication;
|
| - else
|
| - indicatorMode = ThreadedScrollingIndication;
|
| -
|
| - tiledBacking->setScrollingModeIndication(indicatorMode);
|
| -}
|
| -
|
| -String ScrollingCoordinatorMac::scrollingStateTreeAsText() const
|
| -{
|
| - if (m_scrollingStateTree->rootStateNode())
|
| - return m_scrollingStateTree->rootStateNode()->scrollingStateTreeAsText();
|
| -
|
| - return String();
|
| -}
|
| -
|
| -} // namespace WebCore
|
| -
|
| -#endif // ENABLE(THREADED_SCROLLING)
|
|
|