void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const { #if ENABLE(VIEWPORT) if (!m_webView->settings()->viewportEnabled() || !m_webView->isFixedLayoutModeEnabled() || !m_webView->client() || !m_webView->page()) return; ViewportArguments args; if (arguments == args) { // Default viewport arguments passed in. This is a signal to reset the viewport. args.width = ViewportArguments::ValueDesktopWidth; } else args = arguments; FrameView* frameView = m_webView->mainFrameImpl()->frameView(); int dpi = screenHorizontalDPI(frameView); ASSERT(dpi > 0); WebViewClient* client = m_webView->client(); WebRect deviceRect = client->windowRect(); // If the window size has not been set yet don't attempt to set the viewport if (!deviceRect.width || !deviceRect.height) return; Settings* settings = m_webView->page()->settings(); float devicePixelRatio = dpi / ViewportArguments::deprecatedTargetDPI; // Call the common viewport computing logic in ViewportArguments.cpp. ViewportAttributes computed = computeViewportAttributes( args, settings->layoutFallbackWidth(), deviceRect.width, deviceRect.height, devicePixelRatio, IntSize(deviceRect.width, deviceRect.height)); restrictScaleFactorToInitialScaleIfNotUserScalable(computed); if (m_webView->ignoreViewportTagMaximumScale()) { computed.maximumScale = max(computed.maximumScale, m_webView->maxPageScaleFactor); computed.userScalable = true; } int layoutWidth = computed.layoutSize.width(); int layoutHeight = computed.layoutSize.height(); m_webView->setFixedLayoutSize(IntSize(layoutWidth, layoutHeight)); bool needInitializePageScale = !m_webView->isPageScaleFactorSet(); m_webView->setDeviceScaleFactor(devicePixelRatio); m_webView->setPageScaleFactorLimits(computed.minimumScale, computed.maximumScale); if (needInitializePageScale) m_webView->setPageScaleFactorPreservingScrollOffset(computed.initialScale * devicePixelRatio); #endif }
String InternalSettings::configurationForViewport(float devicePixelRatio, int deviceWidth, int deviceHeight, int availableWidth, int availableHeight, ExceptionCode& ec) { if (!page()) { ec = INVALID_ACCESS_ERR; return String(); } const int defaultLayoutWidthForNonMobilePages = 980; ViewportArguments arguments = page()->viewportArguments(); ViewportAttributes attributes = computeViewportAttributes(arguments, defaultLayoutWidthForNonMobilePages, deviceWidth, deviceHeight, devicePixelRatio, IntSize(availableWidth, availableHeight)); restrictMinimumScaleFactorToViewportSize(attributes, IntSize(availableWidth, availableHeight)); restrictScaleFactorToInitialScaleIfNotUserScalable(attributes); return "viewport size " + String::number(attributes.layoutSize.width()) + "x" + String::number(attributes.layoutSize.height()) + " scale " + String::number(attributes.initialScale) + " with limits [" + String::number(attributes.minimumScale) + ", " + String::number(attributes.maximumScale) + "] and userScalable " + (attributes.userScalable ? "true" : "false"); }
void DumpRenderTreeSupportEfl::dumpConfigurationForViewport(Evas_Object* ewkView, int deviceDPI, const WebCore::IntSize& deviceSize, const WebCore::IntSize& availableSize) { WebCore::Page* page = EWKPrivate::corePage(ewkView); if (!page) return; WebCore::ViewportArguments arguments = page->mainFrame()->document()->viewportArguments(); WebCore::ViewportAttributes attributes = computeViewportAttributes(arguments, /* default layout width for non-mobile pages */ 980, deviceSize.width(), deviceSize.height(), deviceDPI, availableSize); restrictMinimumScaleFactorToViewportSize(attributes, availableSize); restrictScaleFactorToInitialScaleIfNotUserScalable(attributes); fprintf(stdout, "viewport size %dx%d scale %f with limits [%f, %f] and userScalable %f\n", attributes.layoutSize.width(), attributes.layoutSize.height(), attributes.initialScale, attributes.minimumScale, attributes.maximumScale, attributes.userScalable); }
void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const { #if ENABLE(VIEWPORT) if (!m_webView->settings()->viewportEnabled() || !m_webView->isFixedLayoutModeEnabled() || !m_webView->client() || !m_webView->page()) return; bool useDefaultDeviceScaleFactor = false; ViewportArguments args; if (arguments == args) { // Default viewport arguments passed in. This is a signal to reset the viewport. args.width = ViewportArguments::ValueDesktopWidth; useDefaultDeviceScaleFactor = true; } else args = arguments; FrameView* frameView = m_webView->mainFrameImpl()->frameView(); int dpi = screenHorizontalDPI(frameView); ASSERT(dpi > 0); WebViewClient* client = m_webView->client(); WebRect deviceRect = client->windowRect(); // If the window size has not been set yet don't attempt to set the viewport if (!deviceRect.width || !deviceRect.height) return; Settings* settings = m_webView->page()->settings(); // Call the common viewport computing logic in ViewportArguments.cpp. ViewportAttributes computed = computeViewportAttributes( args, settings->layoutFallbackWidth(), deviceRect.width, deviceRect.height, dpi, IntSize(deviceRect.width, deviceRect.height)); int layoutWidth = computed.layoutSize.width(); int layoutHeight = computed.layoutSize.height(); m_webView->setFixedLayoutSize(IntSize(layoutWidth, layoutHeight)); // FIXME: Investigate the impact this has on layout/rendering if any. // This exposes the correct device scale to javascript and media queries. if (useDefaultDeviceScaleFactor && settings->defaultDeviceScaleFactor()) m_webView->setDeviceScaleFactor(settings->defaultDeviceScaleFactor()); else m_webView->setDeviceScaleFactor(computed.devicePixelRatio); m_webView->setPageScaleFactorLimits(computed.minimumScale, computed.maximumScale); m_webView->setPageScaleFactorPreservingScrollOffset(computed.initialScale * computed.devicePixelRatio); #endif }