ScrollingTreeIOS.cpp [plain text]
#include "config.h"
#include "ScrollingTreeIOS.h"
#if ENABLE(ASYNC_SCROLLING)
#include "AsyncScrollingCoordinator.h"
#include "PlatformWheelEvent.h"
#include "ScrollingThread.h"
#include "ScrollingTreeFixedNode.h"
#include "ScrollingTreeFrameScrollingNodeIOS.h"
#include "ScrollingTreeNode.h"
#include "ScrollingTreeScrollingNode.h"
#include "ScrollingTreeStickyNode.h"
#include <wtf/MainThread.h>
#include <wtf/TemporaryChange.h>
namespace WebCore {
Ref<ScrollingTreeIOS> ScrollingTreeIOS::create(AsyncScrollingCoordinator* scrollingCoordinator)
{
return adoptRef(*new ScrollingTreeIOS(scrollingCoordinator));
}
ScrollingTreeIOS::ScrollingTreeIOS(AsyncScrollingCoordinator* scrollingCoordinator)
: m_scrollingCoordinator(scrollingCoordinator)
{
}
ScrollingTreeIOS::~ScrollingTreeIOS()
{
ASSERT(!m_scrollingCoordinator);
}
void ScrollingTreeIOS::invalidate()
{
ASSERT(ScrollingThread::isCurrentThread());
ScrollingCoordinator* scrollingCoordinator = m_scrollingCoordinator.release().leakRef();
callOnMainThread([scrollingCoordinator] {
scrollingCoordinator->deref();
});
}
void ScrollingTreeIOS::commitNewTreeState(std::unique_ptr<ScrollingStateTree> scrollingStateTree)
{
ScrollingTree::commitNewTreeState(WTF::move(scrollingStateTree));
}
void ScrollingTreeIOS::scrollingTreeNodeDidScroll(ScrollingNodeID nodeID, const FloatPoint& scrollPosition, SetOrSyncScrollingLayerPosition scrollingLayerPositionAction)
{
if (!m_scrollingCoordinator)
return;
if (nodeID == rootNode()->scrollingNodeID())
setMainFrameScrollPosition(scrollPosition);
RefPtr<AsyncScrollingCoordinator> scrollingCoordinator = m_scrollingCoordinator;
bool localIsHandlingProgrammaticScroll = isHandlingProgrammaticScroll();
callOnMainThread([scrollingCoordinator, nodeID, scrollPosition, localIsHandlingProgrammaticScroll, scrollingLayerPositionAction] {
scrollingCoordinator->scheduleUpdateScrollPositionAfterAsyncScroll(nodeID, scrollPosition, localIsHandlingProgrammaticScroll, scrollingLayerPositionAction);
});
}
PassRefPtr<ScrollingTreeNode> ScrollingTreeIOS::createScrollingTreeNode(ScrollingNodeType nodeType, ScrollingNodeID nodeID)
{
switch (nodeType) {
case FrameScrollingNode:
return ScrollingTreeFrameScrollingNodeIOS::create(*this, nodeID);
case OverflowScrollingNode:
ASSERT_NOT_REACHED();
return nullptr;
case FixedNode:
return ScrollingTreeFixedNode::create(*this, nodeID);
case StickyNode:
return ScrollingTreeStickyNode::create(*this, nodeID);
}
return nullptr;
}
FloatRect ScrollingTreeIOS::fixedPositionRect()
{
ASSERT_NOT_REACHED();
return FloatRect();
}
void ScrollingTreeIOS::currentSnapPointIndicesDidChange(WebCore::ScrollingNodeID nodeID, unsigned horizontal, unsigned vertical)
{
if (!m_scrollingCoordinator)
return;
RefPtr<AsyncScrollingCoordinator> scrollingCoordinator = m_scrollingCoordinator;
callOnMainThread([scrollingCoordinator, nodeID, horizontal, vertical] {
scrollingCoordinator->setActiveScrollSnapIndices(nodeID, horizontal, vertical);
});
}
}
#endif // ENABLE(ASYNC_SCROLLING)