summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/ScrollView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/ScrollView.cpp')
-rw-r--r--WebCore/platform/ScrollView.cpp46
1 files changed, 28 insertions, 18 deletions
diff --git a/WebCore/platform/ScrollView.cpp b/WebCore/platform/ScrollView.cpp
index 4f83794..ddce20c 100644
--- a/WebCore/platform/ScrollView.cpp
+++ b/WebCore/platform/ScrollView.cpp
@@ -54,7 +54,6 @@ ScrollView::ScrollView()
, m_useFixedLayout(false)
, m_paintsEntireContents(false)
, m_delegatesScrolling(false)
- , m_scrollOriginX(0)
{
platformInit();
}
@@ -309,14 +308,14 @@ int ScrollView::actualScrollY() const
IntPoint ScrollView::maximumScrollPosition() const
{
- IntPoint maximumOffset(contentsWidth() - visibleWidth() - m_scrollOriginX, contentsHeight() - visibleHeight());
+ IntPoint maximumOffset(contentsWidth() - visibleWidth() - m_scrollOrigin.x(), contentsHeight() - visibleHeight() - m_scrollOrigin.y());
maximumOffset.clampNegativeToZero();
return maximumOffset;
}
IntPoint ScrollView::minimumScrollPosition() const
{
- return IntPoint(-m_scrollOriginX, 0);
+ return IntPoint(-m_scrollOrigin.x(), -m_scrollOrigin.y());
}
IntPoint ScrollView::adjustScrollPositionWithinRange(const IntPoint& scrollPoint) const
@@ -346,9 +345,9 @@ void ScrollView::valueChanged(Scrollbar* scrollbar)
IntSize newOffset = m_scrollOffset;
if (scrollbar) {
if (scrollbar->orientation() == HorizontalScrollbar)
- newOffset.setWidth(scrollbar->value() - m_scrollOriginX);
+ newOffset.setWidth(scrollbar->value() - m_scrollOrigin.x());
else if (scrollbar->orientation() == VerticalScrollbar)
- newOffset.setHeight(scrollbar->value());
+ newOffset.setHeight(scrollbar->value() - m_scrollOrigin.y());
}
IntSize scrollDelta = newOffset - m_scrollOffset;
@@ -403,7 +402,7 @@ bool ScrollView::scroll(ScrollDirection direction, ScrollGranularity granularity
{
if (platformWidget())
return platformScroll(direction, granularity);
-
+
if (direction == ScrollUp || direction == ScrollDown) {
if (m_verticalScrollbar)
return m_verticalScrollbar->scroll(direction, granularity);
@@ -414,6 +413,11 @@ bool ScrollView::scroll(ScrollDirection direction, ScrollGranularity granularity
return false;
}
+bool ScrollView::logicalScroll(ScrollLogicalDirection direction, ScrollGranularity granularity)
+{
+ return scroll(logicalToPhysical(direction, isVerticalDocument(), isFlippedDocument()), granularity);
+}
+
void ScrollView::windowResizerRectChanged()
{
if (platformWidget())
@@ -482,11 +486,15 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset)
newHasHorizontalScrollbar = false;
if (hasHorizontalScrollbar != newHasHorizontalScrollbar) {
+ if (m_scrollOrigin.y() && !newHasHorizontalScrollbar)
+ m_scrollOrigin.setY(m_scrollOrigin.y() - m_horizontalScrollbar->height());
setHasHorizontalScrollbar(newHasHorizontalScrollbar);
sendContentResizedNotification = true;
}
if (hasVerticalScrollbar != newHasVerticalScrollbar) {
+ if (m_scrollOrigin.x() && !newHasVerticalScrollbar)
+ m_scrollOrigin.setX(m_scrollOrigin.x() - m_verticalScrollbar->width());
setHasVerticalScrollbar(newHasVerticalScrollbar);
sendContentResizedNotification = true;
}
@@ -533,7 +541,7 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset)
m_horizontalScrollbar->setSuppressInvalidation(true);
m_horizontalScrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
m_horizontalScrollbar->setProportion(clientWidth, contentsWidth());
- m_horizontalScrollbar->setValue(scroll.width() + m_scrollOriginX, Scrollbar::NotFromScrollAnimator);
+ m_horizontalScrollbar->setValue(scroll.width() + m_scrollOrigin.x(), Scrollbar::NotFromScrollAnimator);
if (m_scrollbarsSuppressed)
m_horizontalScrollbar->setSuppressInvalidation(false);
}
@@ -555,7 +563,7 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset)
m_verticalScrollbar->setSuppressInvalidation(true);
m_verticalScrollbar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
m_verticalScrollbar->setProportion(clientHeight, contentsHeight());
- m_verticalScrollbar->setValue(scroll.height(), Scrollbar::NotFromScrollAnimator);
+ m_verticalScrollbar->setValue(scroll.height() + m_scrollOrigin.y(), Scrollbar::NotFromScrollAnimator);
if (m_scrollbarsSuppressed)
m_verticalScrollbar->setSuppressInvalidation(false);
}
@@ -1061,19 +1069,21 @@ void ScrollView::removePanScrollIcon()
hostWindow()->invalidateContentsAndWindow(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)), true /*immediate*/);
}
-void ScrollView::setScrollOriginX(int x)
+void ScrollView::setScrollOrigin(const IntPoint& origin, bool updatePosition)
{
- if (platformWidget())
- platformSetScrollOriginX(x);
+ if (m_scrollOrigin == origin)
+ return;
- m_scrollOriginX = x;
-}
+ m_scrollOrigin = origin;
-void ScrollView::updateScrollbars()
-{
- if (!platformWidget())
+ if (platformWidget()) {
+ platformSetScrollOrigin(origin, updatePosition);
+ return;
+ }
+
+ // Update if the scroll origin changes, since our position will be different if the content size did not change.
+ if (updatePosition)
updateScrollbars(scrollOffset());
- // FIXME: need corresponding functionality from platformWidget.
}
#if !PLATFORM(WX) && !PLATFORM(GTK) && !PLATFORM(EFL)
@@ -1106,7 +1116,7 @@ void ScrollView::platformSetScrollbarsSuppressed(bool)
{
}
-void ScrollView::platformSetScrollOriginX(int)
+void ScrollView::platformSetScrollOrigin(const IntPoint&, bool updatePosition)
{
}