void PageScaleConstraintsSet::adjustForAndroidWebViewQuirks(const ViewportArguments& arguments, IntSize viewSize, int layoutFallbackWidth, float deviceScaleFactor, bool supportTargetDensityDPI, bool wideViewportQuirkEnabled, bool useWideViewport, bool loadWithOverviewMode) { if (!supportTargetDensityDPI && !wideViewportQuirkEnabled && loadWithOverviewMode) return; const float oldInitialScale = m_pageDefinedConstraints.initialScale; if (!loadWithOverviewMode) { bool resetInitialScale = false; if (arguments.zoom == -1) { if (arguments.width == -1) resetInitialScale = true; if (useWideViewport || arguments.width == ViewportArguments::ValueDeviceWidth) resetInitialScale = true; } if (resetInitialScale) m_pageDefinedConstraints.initialScale = 1.0f; } float adjustedLayoutSizeWidth = m_pageDefinedConstraints.layoutSize.width(); float adjustedLayoutSizeHeight = m_pageDefinedConstraints.layoutSize.height(); float targetDensityDPIFactor = 1.0f; if (supportTargetDensityDPI) { targetDensityDPIFactor = computeDeprecatedTargetDensityDPIFactor(arguments, deviceScaleFactor); if (m_pageDefinedConstraints.initialScale != -1) m_pageDefinedConstraints.initialScale *= targetDensityDPIFactor; m_pageDefinedConstraints.minimumScale *= targetDensityDPIFactor; m_pageDefinedConstraints.maximumScale *= targetDensityDPIFactor; if (wideViewportQuirkEnabled && (!useWideViewport || arguments.width <= 0)) { adjustedLayoutSizeWidth /= targetDensityDPIFactor; adjustedLayoutSizeHeight /= targetDensityDPIFactor; } } if (wideViewportQuirkEnabled) { if (useWideViewport && arguments.width == -1 && arguments.zoom != 1.0f) { adjustedLayoutSizeWidth = layoutFallbackWidth; adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, viewSize); } else if (!useWideViewport) { const float nonWideScale = arguments.zoom < 1 && arguments.width != ViewportArguments::ValueDeviceWidth ? -1 : oldInitialScale; adjustedLayoutSizeWidth = getLayoutWidthForNonWideViewport(viewSize, nonWideScale) / targetDensityDPIFactor; if (m_userAgentConstraints.initialScale != -1 && (arguments.width == ViewportArguments::ValueDeviceWidth || (arguments.width == -1 && arguments.zoom == -1))) adjustedLayoutSizeWidth /= m_userAgentConstraints.initialScale; adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, viewSize); if (arguments.zoom < 1) { m_pageDefinedConstraints.initialScale = targetDensityDPIFactor; m_pageDefinedConstraints.minimumScale = std::min<float>(m_pageDefinedConstraints.minimumScale, m_pageDefinedConstraints.initialScale); m_pageDefinedConstraints.maximumScale = std::max<float>(m_pageDefinedConstraints.maximumScale, m_pageDefinedConstraints.initialScale); } } } if (supportTargetDensityDPI && !arguments.userZoom) { m_pageDefinedConstraints.initialScale = targetDensityDPIFactor; m_pageDefinedConstraints.minimumScale = m_pageDefinedConstraints.initialScale; m_pageDefinedConstraints.maximumScale = m_pageDefinedConstraints.initialScale; if (arguments.width == -1 || arguments.width == ViewportArguments::ValueDeviceWidth) { adjustedLayoutSizeWidth = viewSize.width() / targetDensityDPIFactor; adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, viewSize); } } m_pageDefinedConstraints.layoutSize.setWidth(adjustedLayoutSizeWidth); m_pageDefinedConstraints.layoutSize.setHeight(adjustedLayoutSizeHeight); }
void PageScaleConstraintsSet::adjustForAndroidWebViewQuirks(const ViewportDescription& description, int layoutFallbackWidth, float deviceScaleFactor, bool supportTargetDensityDPI, bool wideViewportQuirkEnabled, bool useWideViewport, bool loadWithOverviewMode, bool nonUserScalableQuirkEnabled) { if (!supportTargetDensityDPI && !wideViewportQuirkEnabled && loadWithOverviewMode && !nonUserScalableQuirkEnabled) return; const float oldInitialScale = m_pageDefinedConstraints.initialScale; if (!loadWithOverviewMode) { bool resetInitialScale = false; if (description.zoom == -1) { if (description.maxWidth.isAuto() || description.maxWidth.type() == ExtendToZoom) resetInitialScale = true; if (useWideViewport || description.maxWidth.type() == DeviceWidth) resetInitialScale = true; } if (resetInitialScale) m_pageDefinedConstraints.initialScale = 1.0f; } float adjustedLayoutSizeWidth = m_pageDefinedConstraints.layoutSize.width(); float adjustedLayoutSizeHeight = m_pageDefinedConstraints.layoutSize.height(); float targetDensityDPIFactor = 1.0f; if (supportTargetDensityDPI) { targetDensityDPIFactor = computeDeprecatedTargetDensityDPIFactor(description, deviceScaleFactor); if (m_pageDefinedConstraints.initialScale != -1) m_pageDefinedConstraints.initialScale *= targetDensityDPIFactor; if (m_pageDefinedConstraints.minimumScale != -1) m_pageDefinedConstraints.minimumScale *= targetDensityDPIFactor; if (m_pageDefinedConstraints.maximumScale != -1) m_pageDefinedConstraints.maximumScale *= targetDensityDPIFactor; if (wideViewportQuirkEnabled && (!useWideViewport || description.maxWidth.type() == DeviceWidth)) { adjustedLayoutSizeWidth /= targetDensityDPIFactor; adjustedLayoutSizeHeight /= targetDensityDPIFactor; } } if (wideViewportQuirkEnabled) { if (useWideViewport && (description.maxWidth.isAuto() || description.maxWidth.type() == ExtendToZoom) && description.zoom != 1.0f) { adjustedLayoutSizeWidth = layoutFallbackWidth; adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, m_viewSize); } else if (!useWideViewport) { const float nonWideScale = description.zoom < 1 && description.maxWidth.type() != DeviceWidth && description.maxWidth.type() != DeviceHeight ? -1 : oldInitialScale; adjustedLayoutSizeWidth = getLayoutWidthForNonWideViewport(m_viewSize, nonWideScale) / targetDensityDPIFactor; float newInitialScale = targetDensityDPIFactor; if (m_userAgentConstraints.initialScale != -1 && (description.maxWidth.type() == DeviceWidth || ((description.maxWidth.isAuto() || description.maxWidth.type() == ExtendToZoom) && description.zoom == -1))) { adjustedLayoutSizeWidth /= m_userAgentConstraints.initialScale; newInitialScale = m_userAgentConstraints.initialScale; } adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, m_viewSize); if (description.zoom < 1) { m_pageDefinedConstraints.initialScale = newInitialScale; if (m_pageDefinedConstraints.minimumScale != -1) m_pageDefinedConstraints.minimumScale = std::min<float>(m_pageDefinedConstraints.minimumScale, m_pageDefinedConstraints.initialScale); if (m_pageDefinedConstraints.maximumScale != -1) m_pageDefinedConstraints.maximumScale = std::max<float>(m_pageDefinedConstraints.maximumScale, m_pageDefinedConstraints.initialScale); } } } if (nonUserScalableQuirkEnabled && !description.userZoom) { m_pageDefinedConstraints.initialScale = targetDensityDPIFactor; m_pageDefinedConstraints.minimumScale = m_pageDefinedConstraints.initialScale; m_pageDefinedConstraints.maximumScale = m_pageDefinedConstraints.initialScale; if (description.maxWidth.isAuto() || description.maxWidth.type() == ExtendToZoom || description.maxWidth.type() == DeviceWidth) { adjustedLayoutSizeWidth = m_viewSize.width() / targetDensityDPIFactor; adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, m_viewSize); } } m_pageDefinedConstraints.layoutSize.setWidth(adjustedLayoutSizeWidth); m_pageDefinedConstraints.layoutSize.setHeight(adjustedLayoutSizeHeight); }
void PageScaleConstraintsSet::adjustForAndroidWebViewQuirks(const ViewportArguments& arguments, IntSize viewSize, int layoutFallbackWidth, float deviceScaleFactor, bool supportTargetDensityDPI, bool wideViewportQuirkEnabled, bool useWideViewport, bool loadWithOverviewMode) { if (!supportTargetDensityDPI && !wideViewportQuirkEnabled && loadWithOverviewMode) return; const float oldInitialScale = m_pageDefinedConstraints.initialScale; if (!loadWithOverviewMode) { bool resetInitialScale = false; if (arguments.zoom == -1) { if (arguments.width == -1) resetInitialScale = true; if (useWideViewport || arguments.width == ViewportArguments::ValueDeviceWidth) resetInitialScale = true; } if (resetInitialScale) m_pageDefinedConstraints.initialScale = 1.0f; } float adjustedLayoutSizeWidth = m_pageDefinedConstraints.layoutSize.width(); float adjustedLayoutSizeHeight = m_pageDefinedConstraints.layoutSize.height(); float targetDensityDPIFactor = 1.0f; if (supportTargetDensityDPI) { targetDensityDPIFactor = computeDeprecatedTargetDensityDPIFactor(arguments, deviceScaleFactor); if (m_pageDefinedConstraints.initialScale != -1) m_pageDefinedConstraints.initialScale *= targetDensityDPIFactor; m_pageDefinedConstraints.minimumScale *= targetDensityDPIFactor; m_pageDefinedConstraints.maximumScale *= targetDensityDPIFactor; if (wideViewportQuirkEnabled && (!useWideViewport || arguments.width <= 0)) { adjustedLayoutSizeWidth /= targetDensityDPIFactor; adjustedLayoutSizeHeight /= targetDensityDPIFactor; } // In the following cases, a bug in the Classic WebView would mean that the viewport meta tag would take // precedence over the app specified setInitialScale value. We keep bugward compatibility with the old // WebView for legacy apps (the supportTargetDensityDPI case). New apps will see that setInitialScale() // overrides what is specified in the viewport tag. if (arguments.width == ViewportArguments::ValueAuto && m_pageDefinedConstraints.initialScale == 1.0f) { m_userAgentConstraints.initialScale = -1; } else if (arguments.width == ViewportArguments::ValueDeviceWidth || arguments.width == 320) { m_userAgentConstraints.initialScale = -1; } } if (wideViewportQuirkEnabled) { if (useWideViewport && arguments.width == -1 && arguments.zoom != 1.0f) { adjustedLayoutSizeWidth = layoutFallbackWidth; adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, viewSize); } else if (!useWideViewport) { const float nonWideScale = arguments.zoom < 1 && arguments.width != ViewportArguments::ValueDeviceWidth ? -1 : oldInitialScale; adjustedLayoutSizeWidth = getLayoutWidthForNonWideViewport(viewSize, nonWideScale) / targetDensityDPIFactor; adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, viewSize); if (arguments.zoom < 1) { m_pageDefinedConstraints.initialScale = targetDensityDPIFactor; m_pageDefinedConstraints.minimumScale = std::min<float>(m_pageDefinedConstraints.minimumScale, m_pageDefinedConstraints.initialScale); m_pageDefinedConstraints.maximumScale = std::max<float>(m_pageDefinedConstraints.maximumScale, m_pageDefinedConstraints.initialScale); } } } m_pageDefinedConstraints.layoutSize.setWidth(adjustedLayoutSizeWidth); m_pageDefinedConstraints.layoutSize.setHeight(adjustedLayoutSizeHeight); }