Chromium Code Reviews| Index: Source/core/loader/FrameLoader.cpp |
| diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp |
| index 0b14245bc83460dec7287c89fb7b53ddc7fb2ccb..3afac9bdfc29916a35943abf1c2c866445f93c9c 100644 |
| --- a/Source/core/loader/FrameLoader.cpp |
| +++ b/Source/core/loader/FrameLoader.cpp |
| @@ -50,8 +50,10 @@ |
| #include "core/fetch/ResourceFetcher.h" |
| #include "core/fetch/ResourceLoader.h" |
| #include "core/frame/DOMWindow.h" |
| +#include "core/frame/FrameHost.h" |
| #include "core/frame/FrameView.h" |
| #include "core/frame/LocalFrame.h" |
| +#include "core/frame/PinchViewport.h" |
| #include "core/frame/csp/ContentSecurityPolicy.h" |
| #include "core/html/HTMLFormElement.h" |
| #include "core/html/HTMLFrameOwnerElement.h" |
| @@ -184,6 +186,12 @@ void FrameLoader::saveScrollState() |
| return; |
| m_currentItem->setScrollPoint(m_frame->view()->scrollPosition()); |
| + |
| + if (m_frame->document()->settings()->pinchVirtualViewportEnabled()) |
|
abarth-chromium
2014/05/09 14:11:23
m_frame->settings()
bokan
2014/05/09 14:32:57
Done.
|
| + m_currentItem->setPinchViewportScrollPoint(m_frame->host()->pinchViewport().visibleRect().location()); |
| + else |
| + m_currentItem->setPinchViewportScrollPoint(FloatPoint(-1, -1)); |
|
abarth-chromium
2014/05/09 14:11:23
Can we use something other than (-1, -1) here? Th
bokan
2014/05/09 14:32:57
It's not a valid value for the pinch viewport's sc
|
| + |
| if (m_frame->isMainFrame() && !m_frame->page()->inspectorController().deviceEmulationEnabled()) |
| m_currentItem->setPageScaleFactor(m_frame->page()->pageScaleFactor()); |
| @@ -992,15 +1000,30 @@ void FrameLoader::restoreScrollPositionAndViewState() |
| // page height increases, 3. ignore clamp detection after load completes |
| // because that may be because the page will never reach its previous |
| // height. |
| - bool canRestoreWithoutClamping = view->clampOffsetAtScale(m_currentItem->scrollPoint(), m_currentItem->pageScaleFactor()) == m_currentItem->scrollPoint(); |
| + float mainFrameScale = m_frame->document()->settings()->pinchVirtualViewportEnabled() ? 1 : m_currentItem->pageScaleFactor(); |
|
abarth-chromium
2014/05/09 14:11:23
m_frame->settings()
bokan
2014/05/09 14:32:57
Done.
|
| + bool canRestoreWithoutClamping = view->clampOffsetAtScale(m_currentItem->scrollPoint(), mainFrameScale) == m_currentItem->scrollPoint(); |
| bool canRestoreWithoutAnnoyingUser = !view->wasScrolledByUser() && (canRestoreWithoutClamping || m_state == FrameStateComplete); |
| if (!canRestoreWithoutAnnoyingUser) |
| return; |
| - if (m_frame->isMainFrame() && m_currentItem->pageScaleFactor()) |
| - m_frame->page()->setPageScaleFactor(m_currentItem->pageScaleFactor(), m_currentItem->scrollPoint()); |
| - else |
| + if (m_frame->isMainFrame() && m_currentItem->pageScaleFactor()) { |
| + FloatPoint pinchViewportOffset(m_currentItem->pinchViewportScrollPoint()); |
| + IntPoint frameScrollOffset(m_currentItem->scrollPoint()); |
| + |
| + m_frame->page()->setPageScaleFactor(m_currentItem->pageScaleFactor(), frameScrollOffset); |
| + |
| + if (m_frame->document()->settings()->pinchVirtualViewportEnabled()) { |
| + // If the pinch viewport's offset is (-1, -1) it means the history item |
| + // is an old version of HistoryItem so distribute the scroll between |
| + // the main frame and the pinch viewport as best as we can. |
| + if (pinchViewportOffset.x() == -1 && pinchViewportOffset.y() == -1) |
|
abarth-chromium
2014/05/09 14:11:23
Again, please don't use in-band signaling.
|
| + pinchViewportOffset = IntPoint(frameScrollOffset - view->scrollPosition()); |
|
abarth-chromium
2014/05/09 14:11:23
Why an IntPoint?
bokan
2014/05/09 14:32:57
Done. Changed to FloatPoint.
|
| + |
| + m_frame->host()->pinchViewport().setLocation(pinchViewportOffset); |
| + } |
| + } else { |
| view->setScrollPositionNonProgrammatically(m_currentItem->scrollPoint()); |
| + } |
| if (m_frame->isMainFrame()) { |
| if (ScrollingCoordinator* scrollingCoordinator = m_frame->page()->scrollingCoordinator()) |