summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/scrolling/ScrollingTreeFrameScrollingNode.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/scrolling/ScrollingTreeFrameScrollingNode.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/page/scrolling/ScrollingTreeFrameScrollingNode.cpp')
-rw-r--r--Source/WebCore/page/scrolling/ScrollingTreeFrameScrollingNode.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/Source/WebCore/page/scrolling/ScrollingTreeFrameScrollingNode.cpp b/Source/WebCore/page/scrolling/ScrollingTreeFrameScrollingNode.cpp
new file mode 100644
index 000000000..17ac7a431
--- /dev/null
+++ b/Source/WebCore/page/scrolling/ScrollingTreeFrameScrollingNode.cpp
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2014 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 "ScrollingTreeFrameScrollingNode.h"
+
+#if ENABLE(ASYNC_SCROLLING)
+
+#include "FrameView.h"
+#include "Logging.h"
+#include "ScrollingStateTree.h"
+#include "ScrollingTree.h"
+#include "TextStream.h"
+
+namespace WebCore {
+
+ScrollingTreeFrameScrollingNode::ScrollingTreeFrameScrollingNode(ScrollingTree& scrollingTree, ScrollingNodeID nodeID)
+ : ScrollingTreeScrollingNode(scrollingTree, FrameScrollingNode, nodeID)
+{
+}
+
+ScrollingTreeFrameScrollingNode::~ScrollingTreeFrameScrollingNode()
+{
+}
+
+void ScrollingTreeFrameScrollingNode::commitStateBeforeChildren(const ScrollingStateNode& stateNode)
+{
+ ScrollingTreeScrollingNode::commitStateBeforeChildren(stateNode);
+
+ const ScrollingStateFrameScrollingNode& state = downcast<ScrollingStateFrameScrollingNode>(stateNode);
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::FrameScaleFactor))
+ m_frameScaleFactor = state.frameScaleFactor();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::ReasonsForSynchronousScrolling))
+ m_synchronousScrollingReasons = state.synchronousScrollingReasons();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::HeaderHeight))
+ m_headerHeight = state.headerHeight();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::FooterHeight))
+ m_footerHeight = state.footerHeight();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::BehaviorForFixedElements))
+ m_behaviorForFixed = state.scrollBehaviorForFixedElements();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::TopContentInset))
+ m_topContentInset = state.topContentInset();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::FixedElementsLayoutRelativeToFrame))
+ m_fixedElementsLayoutRelativeToFrame = state.fixedElementsLayoutRelativeToFrame();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::LayoutViewport))
+ m_layoutViewport = state.layoutViewport();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::MinLayoutViewportOrigin))
+ m_minLayoutViewportOrigin = state.minLayoutViewportOrigin();
+
+ if (state.hasChangedProperty(ScrollingStateFrameScrollingNode::MaxLayoutViewportOrigin))
+ m_maxLayoutViewportOrigin = state.maxLayoutViewportOrigin();
+}
+
+void ScrollingTreeFrameScrollingNode::scrollBy(const FloatSize& delta)
+{
+ setScrollPosition(scrollPosition() + delta);
+}
+
+void ScrollingTreeFrameScrollingNode::scrollByWithoutContentEdgeConstraints(const FloatSize& offset)
+{
+ setScrollPositionWithoutContentEdgeConstraints(scrollPosition() + offset);
+}
+
+void ScrollingTreeFrameScrollingNode::setScrollPosition(const FloatPoint& scrollPosition)
+{
+ FloatPoint newScrollPosition = scrollPosition.constrainedBetween(minimumScrollPosition(), maximumScrollPosition());
+ setScrollPositionWithoutContentEdgeConstraints(newScrollPosition);
+}
+
+FloatRect ScrollingTreeFrameScrollingNode::layoutViewportForScrollPosition(const FloatPoint& visibleContentOrigin, float scale) const
+{
+ ASSERT(scrollingTree().visualViewportEnabled());
+
+ FloatRect visibleContentRect(visibleContentOrigin, scrollableAreaSize());
+ LayoutRect visualViewport(FrameView::visibleDocumentRect(visibleContentRect, headerHeight(), footerHeight(), totalContentsSize(), scale));
+ LayoutRect layoutViewport(m_layoutViewport);
+
+ LOG_WITH_STREAM(Scrolling, stream << "\nScrolling thread: " << "(visibleContentOrigin " << visibleContentOrigin << ") fixed behavior " << m_behaviorForFixed);
+ LOG_WITH_STREAM(Scrolling, stream << " layoutViewport: " << layoutViewport);
+ LOG_WITH_STREAM(Scrolling, stream << " visualViewport: " << visualViewport);
+ LOG_WITH_STREAM(Scrolling, stream << " scroll positions: min: " << minLayoutViewportOrigin() << " max: "<< maxLayoutViewportOrigin());
+
+ LayoutPoint newLocation = FrameView::computeLayoutViewportOrigin(LayoutRect(visualViewport), LayoutPoint(minLayoutViewportOrigin()), LayoutPoint(maxLayoutViewportOrigin()), layoutViewport, m_behaviorForFixed);
+
+ if (layoutViewport.location() != newLocation) {
+ layoutViewport.setLocation(newLocation);
+ LOG_WITH_STREAM(Scrolling, stream << " new layoutViewport " << layoutViewport);
+ }
+
+ return layoutViewport;
+}
+
+FloatSize ScrollingTreeFrameScrollingNode::viewToContentsOffset(const FloatPoint& scrollPosition) const
+{
+ return toFloatSize(scrollPosition) - FloatSize(0, headerHeight() + topContentInset());
+}
+
+void ScrollingTreeFrameScrollingNode::dumpProperties(TextStream& ts, ScrollingStateTreeAsTextBehavior) const
+{
+ ts << "frame scrolling node";
+
+ ts.dumpProperty("layout viewport", m_layoutViewport);
+ ts.dumpProperty("min layoutViewport origin", m_minLayoutViewportOrigin);
+ ts.dumpProperty("max layoutViewport origin", m_maxLayoutViewportOrigin);
+
+ if (m_frameScaleFactor != 1)
+ ts.dumpProperty("frame scale factor", m_frameScaleFactor);
+ if (m_topContentInset)
+ ts.dumpProperty("top content inset", m_topContentInset);
+
+ if (m_headerHeight)
+ ts.dumpProperty("header height", m_headerHeight);
+ if (m_footerHeight)
+ ts.dumpProperty("footer height", m_footerHeight);
+ if (m_synchronousScrollingReasons)
+ ts.dumpProperty("synchronous scrolling reasons", ScrollingCoordinator::synchronousScrollingReasonsAsText(m_synchronousScrollingReasons));
+
+ ts.dumpProperty("behavior for fixed", m_behaviorForFixed);
+ if (m_fixedElementsLayoutRelativeToFrame)
+ ts.dumpProperty("fixed elements lay out relative to frame", m_fixedElementsLayoutRelativeToFrame);
+}
+
+
+} // namespace WebCore
+
+#endif // ENABLE(ASYNC_SCROLLING)