Direct call setFixedVisibleContentRect() by WebProcess when viewport is changed
authorChanghyup Jwa <ch.jwa@samsung.com>
Thu, 23 Aug 2012 06:16:56 +0000 (15:16 +0900)
committerChanghyup Jwa <ch.jwa@samsung.com>
Mon, 27 Aug 2012 09:01:52 +0000 (18:01 +0900)
[Title] Direct call setFixedVisibleContentRect() on WebProcess when viewport is changed
[Issue] WEB-1495, S1-7011
[Problem] Timing dependent different JS window sizes.
[Cause] When viewport is changed,
        visible content rect is not set directly by WebProcess itself.
        So, WebCore returns incorrect visible content rect
        until UIProcess updates WebProcess's visible contentrect.
[Solution] WebProcess calls setFixedVisibleContentRect directly.

Conflicts:

Source/WebKit2/WebProcess/WebPage/WebPage.cpp

Change-Id: Id70c640a58a7603162f88c422c3267d2b78bfb9d

Source/WebKit2/UIProcess/API/efl/PageClientImpl.cpp
Source/WebKit2/UIProcess/API/efl/PageClientImpl.h
Source/WebKit2/UIProcess/API/efl/ewk_view.cpp
Source/WebKit2/UIProcess/efl/WebPageProxyEfl.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
Source/WebKit2/WebProcess/WebPage/WebPage.cpp

index 10a3e5b..4102221 100755 (executable)
@@ -258,7 +258,6 @@ double PageClientImpl::adjustScaleWithViewport(double scale)
 #if USE(TILED_BACKING_STORE) && ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
 void PageClientImpl::updateViewportSize(const IntSize& viewportSize)
 {
-#if ENABLE(TIZEN_VIEWPORT_META_TAG)
     // update device width & height
     int deviceWidth = WebCore::getDefaultScreenResolution().width();
     int deviceHeight = WebCore::getDefaultScreenResolution().height();
@@ -272,13 +271,7 @@ void PageClientImpl::updateViewportSize(const IntSize& viewportSize)
     m_page->pageGroup()->preferences()->setDeviceWidth(deviceWidth);
     m_page->pageGroup()->preferences()->setDeviceHeight(deviceHeight);
 
-    if (m_visibleContentRect.isEmpty()) {
-        // Initialize visible content rect when it's empty.
-        // If we don't initialize this, we set visible content rect with empty rect on first set visible content rect.
-        m_visibleContentRect.setSize(viewportSize);
-    }
-#endif
-
+    m_visibleContentRect.setSize(viewportSize);
     m_page->setViewportSize(viewportSize);
     if (m_surface) {
         evas_gl_surface_destroy(m_evasGL, m_surface);
@@ -288,7 +281,7 @@ void PageClientImpl::updateViewportSize(const IntSize& viewportSize)
 }
 #endif
 
-void PageClientImpl::initializeLayoutAndScale()
+void PageClientImpl::initializeScale()
 {
     m_layoutAndScaleState = DidFirstVisuallyNonEmptyLayout;
     resumePainting();
@@ -302,6 +295,9 @@ void PageClientImpl::initializeLayoutAndScale()
 #endif
     if (defaultViewLevel)
         initialScaleFactor = defaultViewLevel;
+    else
+        initialScaleFactor = m_viewportConstraints.minimumScale;
+
 
     initialScaleFactor = adjustScaleWithViewport(initialScaleFactor);
 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
@@ -309,10 +305,6 @@ void PageClientImpl::initializeLayoutAndScale()
     // Because scroll position can be changed by HistoryController when we go back and foward
     setVisibleContentRect(scrollPosition(), initialScaleFactor, FloatPoint());
 #else
-    // Set fixed layout.
-    m_page->setUseFixedLayout(true);
-    m_page->setFixedLayoutSize(m_viewportConstraints.layoutSize);
-
     // Set initial scale.
     m_page->scalePage(initialScaleFactor, IntPoint(0, 0));
 #endif
@@ -321,7 +313,7 @@ void PageClientImpl::initializeLayoutAndScale()
 #endif
 }
 
-void PageClientImpl::updateLayoutAndScale(bool fitToContentWidth)
+void PageClientImpl::updateScale()
 {
     if (m_layoutAndScaleState == BeforeCommitLoad) {
         // Before commit load, we don't need to update visible content rect.
@@ -334,28 +326,13 @@ void PageClientImpl::updateLayoutAndScale(bool fitToContentWidth)
         m_visibleContentRect.setLocation(IntPoint(0, 0));
     }
 
-    double targetScaleFactor = fitToContentWidth ? m_viewportConstraints.minimumScale : scaleFactor();
-
-    // get new scale factor
-    // if current scaleFactor is not in the scale range and same with old minimumScaleFactor.
-    double newScaleFactor = adjustScaleWithViewport(targetScaleFactor);
-
     // We should update scale factor and scroll position even they are not changed.
     // Because, contents size can be changed smaller by IME and visible content rect can be outside of contents boundary.
-#if !ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
-    IntPoint scrollPosition = m_page->scrollPosition();
-    m_page->scalePage(newScaleFactor, scrollPosition);
+#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
+    setVisibleContentRect(scrollPosition(), m_viewportConstraints.initialScale, FloatPoint());
 #else
-    setVisibleContentRect(scrollPosition(), newScaleFactor, FloatPoint());
+    m_page->scalePage(m_viewportConstraints.initialScale, m_page->scrollPosition());
 #endif
-
-    // If page is not scalable, we have to update layout instead of scaling.
-    if (!m_viewportConstraints.userScalable) {
-#if !ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
-        if (m_page->useFixedLayout())
-            m_page->setFixedLayoutSize(m_viewportConstraints.layoutSize);
-#endif
-    }
 }
 
 void PageClientImpl::setFocusedNodeRect(const IntRect& focusedNodeRect)
@@ -467,32 +444,12 @@ void PageClientImpl::setCursorHiddenUntilMouseMoves(bool hiddenUntilMouseMoves)
 
 void PageClientImpl::didChangeViewportProperties(const WebCore::ViewportAttributes& attributes)
 {
-#if OS(TIZEN)
-    bool fitToContentWidth = false;
-#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
-    if (scaleFactor() == m_viewportConstraints.minimumScale)
-        fitToContentWidth = true;
-#else
-    // Check "requested" scaleFactor is same as minimum scaleFactor
-    // because it is possible that current scaleFactor is not updated yet.
-    if (m_requestedScaleFactor == m_viewportConstraints.minimumScale)
-        fitToContentWidth = true;
-#endif
-#endif
     m_viewportConstraints = computeViewportConstraints(attributes);
-
-#if OS(TIZEN)
-    // didChangeViewportProperties() can be called when viewport properties of WebKit are changed.
-    // And it can be called when webview is resized too.
-    updateLayoutAndScale(fitToContentWidth);
-
-    // after viewport change, we need to re adjust visible content rect with focused node
-    ewk_view_focused_node_adjust(m_viewWidget);
+    updateScale();
 
 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
     updateTextSelectionHandlesAndContextMenu(true);
 #endif
-#endif
 }
 
 #if OS(TIZEN)
@@ -749,7 +706,7 @@ void PageClientImpl::didFirstVisuallyNonEmptyLayoutForMainFrame()
     if (m_layoutAndScaleState < DidFirstVisuallyNonEmptyLayout) {
         // Sometimes, didFirstVisuallyNonEmptyLayoutForMainFrame() is called after didFinishLoadForMainFrame()
         // ex) cached page, local contents, load image resources directly.
-        initializeLayoutAndScale();
+        initializeScale();
     }
 }
 
@@ -759,7 +716,7 @@ void PageClientImpl::didFinishLoadForMainFrame()
         // We have to initialize layout and scale here if it is not done
         // Sometimes, didFirstVisuallyNonEmptyLayoutForMainFrame() is called after didFinishLoadForMainFrame()
         // ex) cached page, local contents, load image resources directly.
-        initializeLayoutAndScale();
+        initializeScale();
     }
 }
 
@@ -795,6 +752,21 @@ void PageClientImpl::didChangeContentsSize(const WebCore::IntSize size)
     if (drawingArea()->layerTreeHostProxy())
         drawingArea()->layerTreeHostProxy()->setContentsSize(WebCore::FloatSize(size.width(), size.height()));
 #endif
+
+    // If scale factor was fitted to content's width, then minimize new scale factor too.
+    double previousMinimumScale = m_viewportConstraints.minimumScale;
+
+    // If contents width exceeds viewport layout width, update minimumScale.
+    m_viewportConstraints.minimumScale = (float)viewSize().width() / size.width();
+#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
+    if (scaleFactor() == previousMinimumScale)
+        setVisibleContentRect(m_page->scrollPosition(), m_viewportConstraints.minimumScale, FloatPoint());
+#else
+    if (m_requestedScaleFactor == previousMinimumScale)
+        m_page->scalePage(m_viewportConstraints.minimumScale, scrollPosition());
+#endif
+    // After contents size is changed, update scroll bar.
+    displayViewport();
 }
 
 void PageClientImpl::setRequestedScaleFactor(double scale)
index 0efd64c..2c070ad 100755 (executable)
@@ -98,8 +98,8 @@ public:
 #if USE(TILED_BACKING_STORE) && ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
     void updateViewportSize(const WebCore::IntSize& viewportSize);
 #endif
-    void initializeLayoutAndScale();
-    void updateLayoutAndScale(bool fitToContentWidth = false);
+    void initializeScale();
+    void updateScale();
 
     void setFocusedNodeRect(const WebCore::IntRect&);
     WebCore::IntRect focusedNodeRect() { return m_focusedNodeRect; };
index 6852b53..91581ed 100755 (executable)
@@ -1186,15 +1186,8 @@ static void _ewk_view_smart_calculate(Evas_Object* ewkView)
                 drawingArea->setSize(IntSize(width, height), IntSize());
 #endif
 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE) && !ENABLE(TIZEN_WEBKIT2_EFL_WTR)
-                // Below updateLayoutAndScale() is disabled.
-                // Because it's better to call updateLayoutAndScale() after WebProcess sends recomputed viewport attributes
-                // WebProcess will call sendViewportAttributesChanged(),
-                // and UIProcess will apply recomputed viewport attribute values
                 priv->pageClient->updateViewportSize(IntSize(width, height));
-                priv->pageClient->setVisibleContentRect(priv->pageClient->scrollPosition(), priv->pageClient->scaleFactor(), FloatPoint());
                 priv->pageClient->displayViewport();
-#else
-                priv->pageClient->updateLayoutAndScale();
 #endif
             }
 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
index 5a2d192..7ea8311 100755 (executable)
@@ -153,6 +153,9 @@ void WebPageProxy::didChangeScrollPositionForMainFrame(const IntPoint& scrollPos
 
 void WebPageProxy::didChangeContentsSize(const IntSize& size)
 {
+    if (m_contentsSize == size)
+        return;
+
     m_contentsSize = size;
     m_pageClient->didChangeContentsSize(size);
 }
index 824f941..fd18777 100644 (file)
@@ -605,10 +605,6 @@ void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& size) con
     }
 
     m_page->send(Messages::WebPageProxy::DidChangeContentsSize(m_page->size()));
-
-#if ENABLE(TIZEN_VIEWPORT_POLICY)
-    dispatchViewportPropertiesDidChange(m_page->corePage()->viewportArguments());
-#endif
 #endif
 
     FrameView* frameView = frame->view();
index 1cd674c..4b1560e 100755 (executable)
@@ -1018,40 +1018,23 @@ void WebPage::sendViewportAttributesChanged()
 
     int minimumLayoutFallbackWidth = std::max(settings->layoutFallbackWidth(), m_viewportSize.width());
 
+    // If unset  we use the viewport dimensions. This fits with the behavior of desktop browsers.
     ViewportAttributes attr = computeViewportAttributes(m_page->viewportArguments(), minimumLayoutFallbackWidth, settings->deviceWidth(), settings->deviceHeight(), static_cast<int>(settings->devicePixelRatio()), m_viewportSize);
-
     WebCore::restrictMinimumScaleFactorToViewportSize(attr, m_viewportSize);
-
-#if ENABLE(TIZEN_VIEWPORT_POLICY)
-    // Tizen calculates viewport attributes with changed contents size.
-    // So, we should resize contents before below viewport attributes recalculation.
-    setResizesToContentsUsingLayoutSize(IntSize(static_cast<int>(attr.layoutSize.width()), static_cast<int>(attr.layoutSize.height())));
-
-    FrameView* view = m_page->mainFrame()->view();
-    if ((m_page->viewportArguments().type == ViewportArguments::Implicit
-        && attr.layoutSize.width() < view->contentsSize().width())
-        || (m_page->viewportArguments().type == ViewportArguments::ViewportMeta
-        && m_page->viewportArguments().width == ViewportArguments::ValueDeviceWidth
-        && m_page->viewportArguments().minimumScale == ViewportArguments::ValueAuto
-        && attr.layoutSize.width() < view->contentsSize().width())) {
-        // 1. In case of <meta name="viewport" content="width=device-width, maximum-scale=1.0">,
-        // minimum-scale is set to 1.0 due to it's not defined.
-        // But if contents size exceeds layout width(device width), we cannot zoom out whole contents.
-        // So, we set minimum scale with contents size.
-        // 2. In case of desktop sites(without viewport meta tag) which have    contents size exceeds layout size, minimum scale should be recalculated.
-        ViewportAttributes updatedAttr = attr;
-        updatedAttr.layoutSize = view->contentsSize();
-        updatedAttr.minimumScale = float(0.25);
-        // recalculate minimum scale value with contents layout size
-        WebCore::restrictMinimumScaleFactorToViewportSize(updatedAttr, m_viewportSize);
-        attr.minimumScale = updatedAttr.minimumScale;
-    }
-#endif
-
     WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(attr);
 
-#if !ENABLE(TIZEN_VIEWPORT_POLICY)
     setResizesToContentsUsingLayoutSize(IntSize(static_cast<int>(attr.layoutSize.width()), static_cast<int>(attr.layoutSize.height())));
+
+#if ENABLE(TIZEN_VIEWPORT_POLICY)
+    // FIXME: We need to compare each platform's viewport policy.
+    // There're are some differences among Tizen, android and iOS.
+    IntRect visibleContentRect;
+    visibleContentRect.setX(mainFrameView()->scrollX());
+    visibleContentRect.setY(mainFrameView()->scrollY());
+    visibleContentRect.setWidth(attr.layoutSize.width());
+    visibleContentRect.setHeight(attr.layoutSize.height());
+
+    mainFrameView()->setFixedVisibleContentRect(visibleContentRect);
 #endif
 
     send(Messages::WebPageProxy::DidChangeViewportProperties(attr));