Index: third_party/WebKit/Source/core/page/scrolling/StickyPositionViewportConstraints.cpp |
diff --git a/third_party/WebKit/Source/core/page/scrolling/StickyPositionViewportConstraints.cpp b/third_party/WebKit/Source/core/page/scrolling/StickyPositionViewportConstraints.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..799e66d99b34441a57126fbf2e38e593a5c5f4b1 |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/page/scrolling/StickyPositionViewportConstraints.cpp |
@@ -0,0 +1,56 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "core/page/scrolling/StickyPositionViewportConstraints.h" |
+ |
+namespace blink { |
+ |
+FloatSize StickyPositionViewportConstraints::computeStickyOffset(const FloatRect& viewportRect) const |
+{ |
+ FloatRect boxRect = m_absoluteStickyBoxRect; |
+ |
+ if (hasAnchorEdge(AnchorEdgeRight)) { |
+ float rightLimit = viewportRect.maxX() - m_rightOffset; |
+ float rightDelta = std::min<float>(0, rightLimit - m_absoluteStickyBoxRect.maxX()); |
+ float availableSpace = std::min<float>(0, m_absoluteContainingBlockRect.x() - m_absoluteStickyBoxRect.x()); |
+ if (rightDelta < availableSpace) |
+ rightDelta = availableSpace; |
+ |
+ boxRect.move(rightDelta, 0); |
+ } |
+ |
+ if (hasAnchorEdge(AnchorEdgeLeft)) { |
+ float leftLimit = viewportRect.x() + m_leftOffset; |
+ float leftDelta = std::max<float>(0, leftLimit - m_absoluteStickyBoxRect.x()); |
+ float availableSpace = std::max<float>(0, m_absoluteContainingBlockRect.maxX() - m_absoluteStickyBoxRect.maxX()); |
+ if (leftDelta > availableSpace) |
+ leftDelta = availableSpace; |
+ |
+ boxRect.move(leftDelta, 0); |
+ } |
+ |
+ if (hasAnchorEdge(AnchorEdgeBottom)) { |
+ float bottomLimit = viewportRect.maxY() - m_bottomOffset; |
+ float bottomDelta = std::min<float>(0, bottomLimit - m_absoluteStickyBoxRect.maxY()); |
+ float availableSpace = std::min<float>(0, m_absoluteContainingBlockRect.y() - m_absoluteStickyBoxRect.y()); |
+ if (bottomDelta < availableSpace) |
+ bottomDelta = availableSpace; |
+ |
+ boxRect.move(0, bottomDelta); |
+ } |
+ |
+ if (hasAnchorEdge(AnchorEdgeTop)) { |
+ float topLimit = viewportRect.y() + m_topOffset; |
+ float topDelta = std::max<float>(0, topLimit - m_absoluteStickyBoxRect.y()); |
+ float availableSpace = std::max<float>(0, m_absoluteContainingBlockRect.maxY() - m_absoluteStickyBoxRect.maxY()); |
+ if (topDelta > availableSpace) |
+ topDelta = availableSpace; |
+ |
+ boxRect.move(0, topDelta); |
+ } |
+ |
+ return boxRect.location() - m_absoluteStickyBoxRect.location(); |
+} |
+ |
+} // namespace blink |