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 }
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 }
unsigned Screen::horizontalDPI() const { if (!m_frame) return 0; return static_cast<unsigned>(screenHorizontalDPI(m_frame->view())); }