ScrollingCoordinatorNicosia.cpp [plain text]
#include "config.h"
#include "ScrollingCoordinatorNicosia.h"
#if ENABLE(ASYNC_SCROLLING) && USE(NICOSIA)
#include "ScrollingThread.h"
#include "ScrollingTreeNicosia.h"
namespace WebCore {
Ref<ScrollingCoordinator> ScrollingCoordinator::create(Page* page)
{
return adoptRef(*new ScrollingCoordinatorNicosia(page));
}
ScrollingCoordinatorNicosia::ScrollingCoordinatorNicosia(Page* page)
: AsyncScrollingCoordinator(page)
, m_scrollingStateTreeCommitterTimer(RunLoop::main(), this, &ScrollingCoordinatorNicosia::commitTreeState)
{
setScrollingTree(ScrollingTreeNicosia::create(*this));
}
ScrollingCoordinatorNicosia::~ScrollingCoordinatorNicosia()
{
ASSERT(!scrollingTree());
}
void ScrollingCoordinatorNicosia::pageDestroyed()
{
AsyncScrollingCoordinator::pageDestroyed();
m_scrollingStateTreeCommitterTimer.stop();
RefPtr<ThreadedScrollingTree> scrollingTree = static_pointer_cast<ThreadedScrollingTree>(releaseScrollingTree());
ScrollingThread::dispatch([scrollingTree] { scrollingTree->invalidate(); });
}
void ScrollingCoordinatorNicosia::commitTreeStateIfNeeded()
{
commitTreeState();
m_scrollingStateTreeCommitterTimer.stop();
}
bool ScrollingCoordinatorNicosia::handleWheelEvent(FrameView&, const PlatformWheelEvent& wheelEvent)
{
ASSERT(isMainThread());
ASSERT(m_page);
ASSERT(scrollingTree());
ScrollingThread::dispatch([threadedScrollingTree = makeRef(downcast<ThreadedScrollingTree>(*scrollingTree())), wheelEvent] {
threadedScrollingTree->handleWheelEvent(wheelEvent);
});
return true;
}
void ScrollingCoordinatorNicosia::scheduleTreeStateCommit()
{
if (!m_scrollingStateTreeCommitterTimer.isActive())
m_scrollingStateTreeCommitterTimer.startOneShot(0_s);
}
void ScrollingCoordinatorNicosia::commitTreeState()
{
willCommitTree();
if (!scrollingStateTree()->hasChangedProperties())
return;
auto stateTree = scrollingStateTree()->commit(LayerRepresentation::PlatformLayerRepresentation);
scrollingTree()->commitTreeState(WTFMove(stateTree));
}
}
#endif // ENABLE(ASYNC_SCROLLING) && USE(NICOSIA)