| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1810 updateMainFrameLayoutSize(); | 1810 updateMainFrameLayoutSize(); |
| 1811 | 1811 |
| 1812 page()->frameHost().visualViewport().setSize(m_size); | 1812 page()->frameHost().visualViewport().setSize(m_size); |
| 1813 | 1813 |
| 1814 if (mainFrameImpl()->frameView()) { | 1814 if (mainFrameImpl()->frameView()) { |
| 1815 if (!mainFrameImpl()->frameView()->needsLayout()) | 1815 if (!mainFrameImpl()->frameView()->needsLayout()) |
| 1816 postLayoutResize(mainFrameImpl()); | 1816 postLayoutResize(mainFrameImpl()); |
| 1817 } | 1817 } |
| 1818 } | 1818 } |
| 1819 | 1819 |
| 1820 void WebViewImpl::setTopControlsHeight(float height, bool topControlsShrinkLayou
tSize) | |
| 1821 { | |
| 1822 topControls().setHeight(height, topControlsShrinkLayoutSize); | |
| 1823 } | |
| 1824 | |
| 1825 void WebViewImpl::updateTopControlsState(WebTopControlsState constraint, WebTopC
ontrolsState current, bool animate) | 1820 void WebViewImpl::updateTopControlsState(WebTopControlsState constraint, WebTopC
ontrolsState current, bool animate) |
| 1826 { | 1821 { |
| 1827 topControls().updateConstraints(constraint); | 1822 topControls().updateConstraints(constraint); |
| 1828 if (m_layerTreeView) | 1823 if (m_layerTreeView) |
| 1829 m_layerTreeView->updateTopControlsState(constraint, current, animate); | 1824 m_layerTreeView->updateTopControlsState(constraint, current, animate); |
| 1830 } | 1825 } |
| 1831 | 1826 |
| 1832 void WebViewImpl::didUpdateTopControls() | 1827 void WebViewImpl::didUpdateTopControls() |
| 1833 { | 1828 { |
| 1834 if (m_layerTreeView) { | 1829 if (m_layerTreeView) { |
| 1835 m_layerTreeView->setTopControlsShownRatio(topControls().shownRatio()); | 1830 m_layerTreeView->setTopControlsShownRatio(topControls().shownRatio()); |
| 1836 m_layerTreeView->setTopControlsHeight(topControls().height(), topControl
s().shrinkViewport()); | 1831 m_layerTreeView->setTopControlsHeight(topControls().height(), topControl
s().shrinkViewport()); |
| 1837 } | 1832 } |
| 1838 | 1833 |
| 1839 WebLocalFrameImpl* mainFrame = mainFrameImpl(); | 1834 WebLocalFrameImpl* mainFrame = mainFrameImpl(); |
| 1840 if (!mainFrame) | 1835 if (!mainFrame) |
| 1841 return; | 1836 return; |
| 1842 | 1837 |
| 1843 FrameView* view = mainFrame->frameView(); | 1838 FrameView* view = mainFrame->frameView(); |
| 1844 if (!view) | 1839 if (!view) |
| 1845 return; | 1840 return; |
| 1846 | 1841 |
| 1847 VisualViewport& visualViewport = page()->frameHost().visualViewport(); | 1842 VisualViewport& visualViewport = page()->frameHost().visualViewport(); |
| 1848 float topControlsViewportAdjustment = topControls().layoutHeight() - topCont
rols().contentOffset(); | |
| 1849 visualViewport.setTopControlsAdjustment(topControlsViewportAdjustment); | |
| 1850 | 1843 |
| 1851 // Shrink the FrameView by the amount that will maintain the aspect-ratio wi
th the VisualViewport. | 1844 { |
| 1852 view->setTopControlsViewportAdjustment(topControlsViewportAdjustment / minim
umPageScaleFactor()); | 1845 // This object will save the current visual viewport offset w.r.t. the |
| 1846 // document and restore it when the object goes out of scope. It's |
| 1847 // needed since the top controls adjustment will change the maximum |
| 1848 // scroll offset and we may need to reposition them to keep the user's |
| 1849 // apparent position unchanged. |
| 1850 ResizeViewportAnchor anchor(*view, visualViewport); |
| 1851 |
| 1852 float topControlsViewportAdjustment = |
| 1853 topControls().layoutHeight() - topControls().contentOffset(); |
| 1854 visualViewport.setTopControlsAdjustment(topControlsViewportAdjustment); |
| 1855 |
| 1856 // Since the FrameView is sized to be the visual viewport at minimum |
| 1857 // scale, its adjustment must also be scaled by the minimum scale. |
| 1858 view->setTopControlsViewportAdjustment( |
| 1859 topControlsViewportAdjustment / minimumPageScaleFactor()); |
| 1860 } |
| 1853 } | 1861 } |
| 1854 | 1862 |
| 1855 TopControls& WebViewImpl::topControls() | 1863 TopControls& WebViewImpl::topControls() |
| 1856 { | 1864 { |
| 1857 return page()->frameHost().topControls(); | 1865 return page()->frameHost().topControls(); |
| 1858 } | 1866 } |
| 1859 | 1867 |
| 1860 void WebViewImpl::resizeViewWhileAnchored(FrameView* view) | 1868 void WebViewImpl::resizeViewWhileAnchored( |
| 1869 FrameView* view, float topControlsHeight, bool topControlsShrinkLayout) |
| 1861 { | 1870 { |
| 1862 DCHECK(mainFrameImpl()); | 1871 DCHECK(mainFrameImpl()); |
| 1863 DCHECK(mainFrameImpl()->frame()->isLocalFrame()); | 1872 DCHECK(mainFrameImpl()->frame()->isLocalFrame()); |
| 1864 | 1873 |
| 1874 topControls().setHeight(topControlsHeight, topControlsShrinkLayout); |
| 1875 |
| 1865 { | 1876 { |
| 1866 // Avoids unnecessary invalidations while various bits of state in TextA
utosizer are updated. | 1877 // Avoids unnecessary invalidations while various bits of state in TextA
utosizer are updated. |
| 1867 TextAutosizer::DeferUpdatePageInfo deferUpdatePageInfo(page()); | 1878 TextAutosizer::DeferUpdatePageInfo deferUpdatePageInfo(page()); |
| 1868 performResize(); | 1879 performResize(); |
| 1869 } | 1880 } |
| 1870 | 1881 |
| 1871 m_fullscreenController->updateSize(); | 1882 m_fullscreenController->updateSize(); |
| 1872 | 1883 |
| 1873 // Update lifecyle phases immediately to recalculate the minimum scale limit
for rotation anchoring, | 1884 // Update lifecyle phases immediately to recalculate the minimum scale limit
for rotation anchoring, |
| 1874 // and to make sure that no lifecycle states are stale if this WebView is em
bedded in another one. | 1885 // and to make sure that no lifecycle states are stale if this WebView is em
bedded in another one. |
| 1875 updateAllLifecyclePhases(); | 1886 updateAllLifecyclePhases(); |
| 1876 } | 1887 } |
| 1877 | 1888 |
| 1878 void WebViewImpl::resize(const WebSize& newSize) | 1889 void WebViewImpl::resizeWithTopControls(const WebSize& newSize, float topControl
sHeight, bool topControlsShrinkLayout) |
| 1879 { | 1890 { |
| 1880 if (m_shouldAutoResize || m_size == newSize) | 1891 if (m_shouldAutoResize) |
| 1892 return; |
| 1893 |
| 1894 if (m_size == newSize |
| 1895 && topControls().height() == topControlsHeight |
| 1896 && topControls().shrinkViewport() == topControlsShrinkLayout) |
| 1881 return; | 1897 return; |
| 1882 | 1898 |
| 1883 if (page()->mainFrame() && !page()->mainFrame()->isLocalFrame()) { | 1899 if (page()->mainFrame() && !page()->mainFrame()->isLocalFrame()) { |
| 1884 // Viewport resize for a remote main frame does not require any | 1900 // Viewport resize for a remote main frame does not require any |
| 1885 // particular action, but the state needs to reflect the correct size | 1901 // particular action, but the state needs to reflect the correct size |
| 1886 // so that it can be used for initalization if the main frame gets | 1902 // so that it can be used for initalization if the main frame gets |
| 1887 // swapped to a LocalFrame at a later time. | 1903 // swapped to a LocalFrame at a later time. |
| 1888 m_size = newSize; | 1904 m_size = newSize; |
| 1889 pageScaleConstraintsSet().didChangeInitialContainingBlockSize(m_size); | 1905 pageScaleConstraintsSet().didChangeInitialContainingBlockSize(m_size); |
| 1890 page()->frameHost().visualViewport().setSize(m_size); | 1906 page()->frameHost().visualViewport().setSize(m_size); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1901 | 1917 |
| 1902 VisualViewport& visualViewport = page()->frameHost().visualViewport(); | 1918 VisualViewport& visualViewport = page()->frameHost().visualViewport(); |
| 1903 | 1919 |
| 1904 bool isRotation = settings()->mainFrameResizesAreOrientationChanges() | 1920 bool isRotation = settings()->mainFrameResizesAreOrientationChanges() |
| 1905 && m_size.width && contentsSize().width() && newSize.width != m_size.wid
th && !m_fullscreenController->isFullscreen(); | 1921 && m_size.width && contentsSize().width() && newSize.width != m_size.wid
th && !m_fullscreenController->isFullscreen(); |
| 1906 m_size = newSize; | 1922 m_size = newSize; |
| 1907 | 1923 |
| 1908 FloatSize viewportAnchorCoords(viewportAnchorCoordX, viewportAnchorCoordY); | 1924 FloatSize viewportAnchorCoords(viewportAnchorCoordX, viewportAnchorCoordY); |
| 1909 if (isRotation) { | 1925 if (isRotation) { |
| 1910 RotationViewportAnchor anchor(*view, visualViewport, viewportAnchorCoord
s, pageScaleConstraintsSet()); | 1926 RotationViewportAnchor anchor(*view, visualViewport, viewportAnchorCoord
s, pageScaleConstraintsSet()); |
| 1911 resizeViewWhileAnchored(view); | 1927 resizeViewWhileAnchored(view, topControlsHeight, topControlsShrinkLayout
); |
| 1912 } else { | 1928 } else { |
| 1913 ResizeViewportAnchor anchor(*view, visualViewport); | 1929 ResizeViewportAnchor anchor(*view, visualViewport); |
| 1914 resizeViewWhileAnchored(view); | 1930 resizeViewWhileAnchored(view, topControlsHeight, topControlsShrinkLayout
); |
| 1915 } | 1931 } |
| 1916 sendResizeEventAndRepaint(); | 1932 sendResizeEventAndRepaint(); |
| 1917 } | 1933 } |
| 1918 | 1934 |
| 1935 void WebViewImpl::resize(const WebSize& newSize) |
| 1936 { |
| 1937 if (m_shouldAutoResize || m_size == newSize) |
| 1938 return; |
| 1939 |
| 1940 resizeWithTopControls( |
| 1941 newSize, topControls().height(), topControls().shrinkViewport()); |
| 1942 } |
| 1943 |
| 1919 void WebViewImpl::didEnterFullScreen() | 1944 void WebViewImpl::didEnterFullScreen() |
| 1920 { | 1945 { |
| 1921 m_fullscreenController->didEnterFullScreen(); | 1946 m_fullscreenController->didEnterFullScreen(); |
| 1922 } | 1947 } |
| 1923 | 1948 |
| 1924 void WebViewImpl::didExitFullScreen() | 1949 void WebViewImpl::didExitFullScreen() |
| 1925 { | 1950 { |
| 1926 m_fullscreenController->didExitFullScreen(); | 1951 m_fullscreenController->didExitFullScreen(); |
| 1927 } | 1952 } |
| 1928 | 1953 |
| (...skipping 2080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4009 | 4034 |
| 4010 FrameView* view = webframe->frame()->view(); | 4035 FrameView* view = webframe->frame()->view(); |
| 4011 | 4036 |
| 4012 postLayoutResize(webframe); | 4037 postLayoutResize(webframe); |
| 4013 | 4038 |
| 4014 // Relayout immediately to avoid violating the rule that needsLayout() | 4039 // Relayout immediately to avoid violating the rule that needsLayout() |
| 4015 // isn't set at the end of a layout. | 4040 // isn't set at the end of a layout. |
| 4016 if (view->needsLayout()) | 4041 if (view->needsLayout()) |
| 4017 view->layout(); | 4042 view->layout(); |
| 4018 | 4043 |
| 4019 // In case we didn't have a size when the top controls were updated. | |
| 4020 didUpdateTopControls(); | |
| 4021 | |
| 4022 m_client->didUpdateLayout(); | 4044 m_client->didUpdateLayout(); |
| 4023 } | 4045 } |
| 4024 | 4046 |
| 4025 void WebViewImpl::didChangeContentsSize() | 4047 void WebViewImpl::didChangeContentsSize() |
| 4026 { | 4048 { |
| 4027 pageScaleConstraintsSet().didChangeContentsSize(contentsSize(), pageScaleFac
tor()); | 4049 pageScaleConstraintsSet().didChangeContentsSize(contentsSize(), pageScaleFac
tor()); |
| 4028 } | 4050 } |
| 4029 | 4051 |
| 4030 void WebViewImpl::pageScaleFactorChanged() | 4052 void WebViewImpl::pageScaleFactorChanged() |
| 4031 { | 4053 { |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4269 const WebFloatSize& elasticOverscrollDelta, | 4291 const WebFloatSize& elasticOverscrollDelta, |
| 4270 float pageScaleDelta, | 4292 float pageScaleDelta, |
| 4271 float topControlsShownRatioDelta) | 4293 float topControlsShownRatioDelta) |
| 4272 { | 4294 { |
| 4273 if (!mainFrameImpl()) | 4295 if (!mainFrameImpl()) |
| 4274 return; | 4296 return; |
| 4275 FrameView* frameView = mainFrameImpl()->frameView(); | 4297 FrameView* frameView = mainFrameImpl()->frameView(); |
| 4276 if (!frameView) | 4298 if (!frameView) |
| 4277 return; | 4299 return; |
| 4278 | 4300 |
| 4301 ScrollableArea* layoutViewport = frameView->layoutViewportScrollableArea(); |
| 4302 VisualViewport& visualViewport = page()->frameHost().visualViewport(); |
| 4303 |
| 4304 // Store the desired offsets for visual and layout viewports before setting |
| 4305 // the top controls ratio since doing so will change the bounds and move the |
| 4306 // viewports to keep the offsets valid. The compositor may have already done |
| 4307 // that so we don't want to double apply the deltas here. |
| 4308 FloatPoint visualViewportOffset = visualViewport.visibleRect().location(); |
| 4309 visualViewportOffset.move( |
| 4310 visualViewportDelta.width, |
| 4311 visualViewportDelta.height); |
| 4312 DoublePoint layoutViewportPosition = layoutViewport->scrollPositionDouble() |
| 4313 + DoubleSize(layoutViewportDelta.width, layoutViewportDelta.height); |
| 4314 |
| 4279 topControls().setShownRatio(topControls().shownRatio() + topControlsShownRat
ioDelta); | 4315 topControls().setShownRatio(topControls().shownRatio() + topControlsShownRat
ioDelta); |
| 4280 | 4316 |
| 4281 FloatPoint visualViewportOffset = page()->frameHost().visualViewport().visib
leRect().location(); | |
| 4282 visualViewportOffset.move(visualViewportDelta.width, visualViewportDelta.hei
ght); | |
| 4283 setPageScaleFactorAndLocation(pageScaleFactor() * pageScaleDelta, visualView
portOffset); | 4317 setPageScaleFactorAndLocation(pageScaleFactor() * pageScaleDelta, visualView
portOffset); |
| 4284 | 4318 |
| 4285 if (pageScaleDelta != 1) { | 4319 if (pageScaleDelta != 1) { |
| 4286 m_doubleTapZoomPending = false; | 4320 m_doubleTapZoomPending = false; |
| 4287 page()->frameHost().visualViewport().userDidChangeScale(); | 4321 visualViewport.userDidChangeScale(); |
| 4288 } | 4322 } |
| 4289 | 4323 |
| 4290 m_elasticOverscroll += elasticOverscrollDelta; | 4324 m_elasticOverscroll += elasticOverscrollDelta; |
| 4291 frameView->didUpdateElasticOverscroll(); | 4325 frameView->didUpdateElasticOverscroll(); |
| 4292 | 4326 |
| 4293 ScrollableArea* layoutViewport = frameView->layoutViewportScrollableArea(); | |
| 4294 | |
| 4295 DoublePoint layoutViewportPosition = layoutViewport->scrollPositionDouble() | |
| 4296 + DoubleSize(layoutViewportDelta.width, layoutViewportDelta.height); | |
| 4297 | |
| 4298 if (layoutViewport->scrollPositionDouble() != layoutViewportPosition) { | 4327 if (layoutViewport->scrollPositionDouble() != layoutViewportPosition) { |
| 4299 layoutViewport->setScrollPosition(layoutViewportPosition, CompositorScro
ll); | 4328 layoutViewport->setScrollPosition(layoutViewportPosition, CompositorScro
ll); |
| 4300 if (DocumentLoader* documentLoader = mainFrameImpl()->frame()->loader().
documentLoader()) | 4329 if (DocumentLoader* documentLoader = mainFrameImpl()->frame()->loader().
documentLoader()) |
| 4301 documentLoader->initialScrollState().wasScrolledByUser = true; | 4330 documentLoader->initialScrollState().wasScrolledByUser = true; |
| 4302 } | 4331 } |
| 4303 } | 4332 } |
| 4304 | 4333 |
| 4305 void WebViewImpl::updateLayerTreeViewport() | 4334 void WebViewImpl::updateLayerTreeViewport() |
| 4306 { | 4335 { |
| 4307 if (!page() || !m_layerTreeView) | 4336 if (!page() || !m_layerTreeView) |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4489 { | 4518 { |
| 4490 // TODO(oshima): Investigate if this should return the ScreenInfo's scale fa
ctor rather than | 4519 // TODO(oshima): Investigate if this should return the ScreenInfo's scale fa
ctor rather than |
| 4491 // page's scale factor, which can be 1 in use-zoom-for-dsf mode. | 4520 // page's scale factor, which can be 1 in use-zoom-for-dsf mode. |
| 4492 if (!page()) | 4521 if (!page()) |
| 4493 return 1; | 4522 return 1; |
| 4494 | 4523 |
| 4495 return page()->deviceScaleFactor(); | 4524 return page()->deviceScaleFactor(); |
| 4496 } | 4525 } |
| 4497 | 4526 |
| 4498 } // namespace blink | 4527 } // namespace blink |
| OLD | NEW |