Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Unified Diff: Source/WebCore/page/scrolling/mac/ScrollingCoordinatorMac.mm

Issue 13665002: Fold ScrollingCoordinatorChromium into ScrollingCoordinator and devirtualize (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698