#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();
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);
}
#endif
-void PageClientImpl::initializeLayoutAndScale()
+void PageClientImpl::initializeScale()
{
m_layoutAndScaleState = DidFirstVisuallyNonEmptyLayout;
resumePainting();
#endif
if (defaultViewLevel)
initialScaleFactor = defaultViewLevel;
+ else
+ initialScaleFactor = m_viewportConstraints.minimumScale;
+
initialScaleFactor = adjustScaleWithViewport(initialScaleFactor);
#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
// 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
#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.
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)
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)
if (m_layoutAndScaleState < DidFirstVisuallyNonEmptyLayout) {
// Sometimes, didFirstVisuallyNonEmptyLayoutForMainFrame() is called after didFinishLoadForMainFrame()
// ex) cached page, local contents, load image resources directly.
- initializeLayoutAndScale();
+ initializeScale();
}
}
// 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();
}
}
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)
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));