Index: Source/WebCore/page/scrolling/ScrollingTree.cpp |
diff --git a/Source/WebCore/page/scrolling/ScrollingTree.cpp b/Source/WebCore/page/scrolling/ScrollingTree.cpp |
deleted file mode 100644 |
index 2c766048c56cfab20050829987c2d43120e4c7de..0000000000000000000000000000000000000000 |
--- a/Source/WebCore/page/scrolling/ScrollingTree.cpp |
+++ /dev/null |
@@ -1,358 +0,0 @@ |
-/* |
- * Copyright (C) 2012, 2013 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" |
-#include "ScrollingTree.h" |
- |
-#if ENABLE(THREADED_SCROLLING) |
- |
-#include "PlatformWheelEvent.h" |
-#include "ScrollingCoordinator.h" |
-#include "ScrollingStateTree.h" |
-#include "ScrollingThread.h" |
-#include "ScrollingTreeFixedNode.h" |
-#include "ScrollingTreeNode.h" |
-#include "ScrollingTreeScrollingNode.h" |
-#include "ScrollingTreeStickyNode.h" |
-#include <wtf/MainThread.h> |
-#include <wtf/TemporaryChange.h> |
- |
-namespace WebCore { |
- |
-PassRefPtr<ScrollingTree> ScrollingTree::create(ScrollingCoordinator* scrollingCoordinator) |
-{ |
- return adoptRef(new ScrollingTree(scrollingCoordinator)); |
-} |
- |
-ScrollingTree::ScrollingTree(ScrollingCoordinator* scrollingCoordinator) |
- : m_scrollingCoordinator(scrollingCoordinator) |
- , m_hasWheelEventHandlers(false) |
- , m_canGoBack(false) |
- , m_canGoForward(false) |
- , m_mainFramePinnedToTheLeft(false) |
- , m_mainFramePinnedToTheRight(false) |
- , m_rubberBandsAtBottom(true) |
- , m_rubberBandsAtTop(true) |
- , m_mainFramePinnedToTheTop(false) |
- , m_mainFramePinnedToTheBottom(false) |
- , m_mainFrameIsRubberBanding(false) |
- , m_scrollingPerformanceLoggingEnabled(false) |
- , m_isHandlingProgrammaticScroll(false) |
-{ |
-} |
- |
-ScrollingTree::~ScrollingTree() |
-{ |
- ASSERT(!m_scrollingCoordinator); |
-} |
- |
-ScrollingTree::EventResult ScrollingTree::tryToHandleWheelEvent(const PlatformWheelEvent& wheelEvent) |
-{ |
- { |
- MutexLocker lock(m_mutex); |
- |
- if (m_hasWheelEventHandlers) |
- return SendToMainThread; |
- |
- if (!m_nonFastScrollableRegion.isEmpty()) { |
- // FIXME: This is not correct for non-default scroll origins. |
- IntPoint position = wheelEvent.position(); |
- position.moveBy(m_mainFrameScrollPosition); |
- if (m_nonFastScrollableRegion.contains(position)) |
- return SendToMainThread; |
- } |
- } |
- |
- if (willWheelEventStartSwipeGesture(wheelEvent)) |
- return DidNotHandleEvent; |
- |
- ScrollingThread::dispatch(bind(&ScrollingTree::handleWheelEvent, this, wheelEvent)); |
- return DidHandleEvent; |
-} |
- |
-void ScrollingTree::updateBackForwardState(bool canGoBack, bool canGoForward) |
-{ |
- MutexLocker locker(m_swipeStateMutex); |
- |
- m_canGoBack = canGoBack; |
- m_canGoForward = canGoForward; |
-} |
- |
-void ScrollingTree::handleWheelEvent(const PlatformWheelEvent& wheelEvent) |
-{ |
- ASSERT(ScrollingThread::isCurrentThread()); |
- |
- if (m_rootNode) |
- m_rootNode->handleWheelEvent(wheelEvent); |
-} |
- |
-static void derefScrollingCoordinator(ScrollingCoordinator* scrollingCoordinator) |
-{ |
- ASSERT(isMainThread()); |
- |
- scrollingCoordinator->deref(); |
-} |
- |
-void ScrollingTree::invalidate() |
-{ |
- // Invalidate is dispatched by the ScrollingCoordinator class on the ScrollingThread |
- // to break the reference cycle between ScrollingTree and ScrollingCoordinator when the |
- // ScrollingCoordinator's page is destroyed. |
- ASSERT(ScrollingThread::isCurrentThread()); |
- |
- // Since this can potentially be the last reference to the scrolling coordinator, |
- // we need to release it on the main thread since it has member variables (such as timers) |
- // that expect to be destroyed from the main thread. |
- callOnMainThread(bind(derefScrollingCoordinator, m_scrollingCoordinator.release().leakRef())); |
-} |
- |
-void ScrollingTree::commitNewTreeState(PassOwnPtr<ScrollingStateTree> scrollingStateTree) |
-{ |
- ASSERT(ScrollingThread::isCurrentThread()); |
- |
- ScrollingStateScrollingNode* rootNode = scrollingStateTree->rootStateNode(); |
- if (rootNode |
- && (rootNode->hasChangedProperty(ScrollingStateScrollingNode::WheelEventHandlerCount) |
- || rootNode->hasChangedProperty(ScrollingStateScrollingNode::NonFastScrollableRegion) |
- || rootNode->hasChangedProperty(ScrollingStateNode::ScrollLayer))) { |
- MutexLocker lock(m_mutex); |
- |
- if (rootNode->hasChangedProperty(ScrollingStateNode::ScrollLayer)) |
- m_mainFrameScrollPosition = IntPoint(); |
- if (rootNode->hasChangedProperty(ScrollingStateScrollingNode::WheelEventHandlerCount)) |
- m_hasWheelEventHandlers = scrollingStateTree->rootStateNode()->wheelEventHandlerCount(); |
- if (rootNode->hasChangedProperty(ScrollingStateScrollingNode::NonFastScrollableRegion)) |
- m_nonFastScrollableRegion = scrollingStateTree->rootStateNode()->nonFastScrollableRegion(); |
- } |
- |
- bool scrollRequestIsProgammatic = rootNode ? rootNode->requestedScrollPositionRepresentsProgrammaticScroll() : false; |
- TemporaryChange<bool> changeHandlingProgrammaticScroll(m_isHandlingProgrammaticScroll, scrollRequestIsProgammatic); |
- |
- removeDestroyedNodes(scrollingStateTree.get()); |
- updateTreeFromStateNode(rootNode); |
-} |
- |
-void ScrollingTree::updateTreeFromStateNode(ScrollingStateNode* stateNode) |
-{ |
- if (!stateNode) { |
- m_nodeMap.clear(); |
- m_rootNode = nullptr; |
- return; |
- } |
- |
- // This fuction recurses through the ScrollingStateTree and updates the corresponding ScrollingTreeNodes. |
- // Find the ScrollingTreeNode associated with the current stateNode using the shared ID and our HashMap. |
- ScrollingTreeNodeMap::const_iterator it = m_nodeMap.find(stateNode->scrollingNodeID()); |
- |
- ScrollingTreeNode* node; |
- if (it != m_nodeMap.end()) { |
- node = it->value; |
- node->updateBeforeChildren(stateNode); |
- } else { |
- // If the node isn't found, it's either new and needs to be added to the tree, or there is a new ID for our |
- // root node. |
- ScrollingNodeID nodeID = stateNode->scrollingNodeID(); |
- if (!stateNode->parent()) { |
- // This is the root node. Nuke the node map. |
- m_nodeMap.clear(); |
- |
- m_rootNode = ScrollingTreeScrollingNode::create(this, nodeID); |
- m_nodeMap.set(nodeID, m_rootNode.get()); |
- m_rootNode->updateBeforeChildren(stateNode); |
- node = m_rootNode.get(); |
- } else { |
- OwnPtr<ScrollingTreeNode> newNode; |
- if (stateNode->isScrollingNode()) |
- newNode = ScrollingTreeScrollingNode::create(this, nodeID); |
- else if (stateNode->isFixedNode()) |
- newNode = ScrollingTreeFixedNode::create(this, nodeID); |
- else if (stateNode->isStickyNode()) |
- newNode = ScrollingTreeStickyNode::create(this, nodeID); |
- else |
- ASSERT_NOT_REACHED(); |
- |
- node = newNode.get(); |
- m_nodeMap.set(nodeID, node); |
- ScrollingTreeNodeMap::const_iterator it = m_nodeMap.find(stateNode->parent()->scrollingNodeID()); |
- ASSERT(it != m_nodeMap.end()); |
- if (it != m_nodeMap.end()) { |
- ScrollingTreeNode* parent = it->value; |
- newNode->setParent(parent); |
- parent->appendChild(newNode.release()); |
- } |
- node->updateBeforeChildren(stateNode); |
- } |
- } |
- |
- // Now update the children if we have any. |
- Vector<OwnPtr<ScrollingStateNode> >* stateNodeChildren = stateNode->children(); |
- if (stateNodeChildren) { |
- size_t size = stateNodeChildren->size(); |
- for (size_t i = 0; i < size; ++i) |
- updateTreeFromStateNode(stateNodeChildren->at(i).get()); |
- } |
- node->updateAfterChildren(stateNode); |
-} |
- |
-void ScrollingTree::removeDestroyedNodes(ScrollingStateTree* stateTree) |
-{ |
- const Vector<ScrollingNodeID>& removedNodes = stateTree->removedNodes(); |
- size_t size = removedNodes.size(); |
- for (size_t i = 0; i < size; ++i) { |
- ScrollingTreeNode* node = m_nodeMap.take(removedNodes[i]); |
- // Never destroy the root node. There will be a new root node in the state tree, and we will |
- // associate it with our existing root node in updateTreeFromStateNode(). |
- if (node && node->parent()) |
- m_rootNode->removeChild(node); |
- } |
-} |
- |
-void ScrollingTree::setMainFramePinState(bool pinnedToTheLeft, bool pinnedToTheRight, bool pinnedToTheTop, bool pinnedToTheBottom) |
-{ |
- MutexLocker locker(m_swipeStateMutex); |
- |
- m_mainFramePinnedToTheLeft = pinnedToTheLeft; |
- m_mainFramePinnedToTheRight = pinnedToTheRight; |
- m_mainFramePinnedToTheTop = pinnedToTheTop; |
- m_mainFramePinnedToTheBottom = pinnedToTheBottom; |
-} |
- |
-void ScrollingTree::updateMainFrameScrollPosition(const IntPoint& scrollPosition, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction) |
-{ |
- if (!m_scrollingCoordinator) |
- return; |
- |
- { |
- MutexLocker lock(m_mutex); |
- m_mainFrameScrollPosition = scrollPosition; |
- } |
- |
- callOnMainThread(bind(&ScrollingCoordinator::scheduleUpdateMainFrameScrollPosition, m_scrollingCoordinator.get(), scrollPosition, m_isHandlingProgrammaticScroll, scrollingLayerPositionAction)); |
-} |
- |
-IntPoint ScrollingTree::mainFrameScrollPosition() |
-{ |
- MutexLocker lock(m_mutex); |
- return m_mainFrameScrollPosition; |
-} |
- |
-#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN)) |
-void ScrollingTree::handleWheelEventPhase(PlatformWheelEventPhase phase) |
-{ |
- if (!m_scrollingCoordinator) |
- return; |
- |
- callOnMainThread(bind(&ScrollingCoordinator::handleWheelEventPhase, m_scrollingCoordinator.get(), phase)); |
-} |
-#endif |
- |
-bool ScrollingTree::canGoBack() |
-{ |
- MutexLocker lock(m_swipeStateMutex); |
- |
- return m_canGoBack; |
-} |
- |
-bool ScrollingTree::canGoForward() |
-{ |
- MutexLocker lock(m_swipeStateMutex); |
- |
- return m_canGoForward; |
-} |
- |
-bool ScrollingTree::isRubberBandInProgress() |
-{ |
- MutexLocker lock(m_mutex); |
- |
- return m_mainFrameIsRubberBanding; |
-} |
- |
-void ScrollingTree::setMainFrameIsRubberBanding(bool isRubberBanding) |
-{ |
- MutexLocker locker(m_mutex); |
- |
- m_mainFrameIsRubberBanding = isRubberBanding; |
-} |
- |
-bool ScrollingTree::rubberBandsAtBottom() |
-{ |
- MutexLocker lock(m_swipeStateMutex); |
- |
- return m_rubberBandsAtBottom; |
-} |
- |
-void ScrollingTree::setRubberBandsAtBottom(bool rubberBandsAtBottom) |
-{ |
- MutexLocker locker(m_swipeStateMutex); |
- |
- m_rubberBandsAtBottom = rubberBandsAtBottom; |
-} |
- |
-bool ScrollingTree::rubberBandsAtTop() |
-{ |
- MutexLocker lock(m_swipeStateMutex); |
- |
- return m_rubberBandsAtTop; |
-} |
- |
-void ScrollingTree::setRubberBandsAtTop(bool rubberBandsAtTop) |
-{ |
- MutexLocker locker(m_swipeStateMutex); |
- |
- m_rubberBandsAtTop = rubberBandsAtTop; |
-} |
- |
-bool ScrollingTree::willWheelEventStartSwipeGesture(const PlatformWheelEvent& wheelEvent) |
-{ |
- if (wheelEvent.phase() != PlatformWheelEventPhaseBegan) |
- return false; |
- |
- MutexLocker lock(m_swipeStateMutex); |
- |
- if (wheelEvent.deltaX() > 0 && m_mainFramePinnedToTheLeft && m_canGoBack) |
- return true; |
- if (wheelEvent.deltaX() < 0 && m_mainFramePinnedToTheRight && m_canGoForward) |
- return true; |
- if (wheelEvent.deltaY() > 0 && m_mainFramePinnedToTheTop && !m_rubberBandsAtTop) |
- return true; |
- if (wheelEvent.deltaY() < 0 && m_mainFramePinnedToTheBottom && !m_rubberBandsAtBottom) |
- return true; |
- |
- return false; |
-} |
- |
-void ScrollingTree::setScrollingPerformanceLoggingEnabled(bool flag) |
-{ |
- m_scrollingPerformanceLoggingEnabled = flag; |
-} |
- |
-bool ScrollingTree::scrollingPerformanceLoggingEnabled() |
-{ |
- return m_scrollingPerformanceLoggingEnabled; |
-} |
- |
-} // namespace WebCore |
- |
-#endif // ENABLE(THREADED_SCROLLING) |