Chromium Code Reviews| Index: Source/core/dom/ViewportArguments.cpp |
| diff --git a/Source/core/dom/ViewportArguments.cpp b/Source/core/dom/ViewportArguments.cpp |
| index d6a56f98c46bba374558a2660e04ae2d3157e406..3d622a067ede94bf0c54d2bddd1c9353ba73ae55 100644 |
| --- a/Source/core/dom/ViewportArguments.cpp |
| +++ b/Source/core/dom/ViewportArguments.cpp |
| @@ -6,7 +6,7 @@ |
| * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
| * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) |
| * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
| - * Copyright (C) 2012 Intel Corporation. All rights reserved. |
| + * Copyright (C) 2012-2013 Intel Corporation. All rights reserved. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| @@ -37,8 +37,6 @@ namespace WebCore { |
| static const float& compareIgnoringAuto(const float& value1, const float& value2, const float& (*compare) (const float&, const float&)) |
| { |
| - ASSERT(value1 != ViewportArguments::ValueAuto || value2 != ViewportArguments::ValueAuto); |
| - |
| if (value1 == ViewportArguments::ValueAuto) |
| return value2; |
| @@ -78,29 +76,12 @@ PageScaleConstraints ViewportArguments::resolve(const FloatSize& initialViewport |
| float resultHeight = height; |
| float resultMinHeight = minHeight; |
| float resultMaxHeight = maxHeight; |
| + |
| float resultZoom = zoom; |
| float resultMinZoom = minZoom; |
| float resultMaxZoom = maxZoom; |
| float resultUserZoom = userZoom; |
| - switch (int(resultWidth)) { |
| - case ViewportArguments::ValueDeviceWidth: |
| - resultWidth = deviceSize.width(); |
| - break; |
| - case ViewportArguments::ValueDeviceHeight: |
| - resultWidth = deviceSize.height(); |
| - break; |
| - } |
| - |
| - switch (int(resultHeight)) { |
| - case ViewportArguments::ValueDeviceWidth: |
| - resultHeight = deviceSize.width(); |
| - break; |
| - case ViewportArguments::ValueDeviceHeight: |
| - resultHeight = deviceSize.height(); |
| - break; |
| - } |
| - |
| if (type == ViewportArguments::CSSDeviceAdaptation) { |
| // device-width/device-height not supported for @viewport. |
| @@ -113,35 +94,97 @@ PageScaleConstraints ViewportArguments::resolve(const FloatSize& initialViewport |
| ASSERT(resultMaxHeight != ViewportArguments::ValueDeviceWidth); |
| ASSERT(resultMaxHeight != ViewportArguments::ValueDeviceHeight); |
| - if (resultMinWidth != ViewportArguments::ValueAuto || resultMaxWidth != ViewportArguments::ValueAuto) |
| - resultWidth = compareIgnoringAuto(resultMinWidth, compareIgnoringAuto(resultMaxWidth, initialViewportSize.width(), min), max); |
| - |
| - if (resultMinHeight != ViewportArguments::ValueAuto || resultMaxHeight != ViewportArguments::ValueAuto) |
| - resultHeight = compareIgnoringAuto(resultMinHeight, compareIgnoringAuto(resultMaxHeight, initialViewportSize.height(), min), max); |
| - |
| + // 1. Resolve min-zoom and max-zoom values. |
| if (resultMinZoom != ViewportArguments::ValueAuto && resultMaxZoom != ViewportArguments::ValueAuto) |
| resultMaxZoom = max(resultMinZoom, resultMaxZoom); |
| + // 2. Constrain zoom value to the [min-zoom, max-zoom] range. |
| if (resultZoom != ViewportArguments::ValueAuto) |
| resultZoom = compareIgnoringAuto(resultMinZoom, compareIgnoringAuto(resultMaxZoom, resultZoom, min), max); |
| - if (resultWidth == ViewportArguments::ValueAuto && (resultHeight == ViewportArguments::ValueAuto || !initialViewportSize.height())) |
| - resultWidth = initialViewportSize.width(); |
| + float extendZoom = compareIgnoringAuto(resultZoom, resultMaxZoom, min); |
| + |
| + if (extendZoom == ViewportArguments::ValueAuto) { |
| + if (resultMaxWidth == ViewportArguments::ValueExtendToZoom) |
| + resultMaxWidth = ViewportArguments::ValueAuto; |
| + |
| + if (resultMaxHeight == ViewportArguments::ValueExtendToZoom) |
| + resultMaxHeight = ViewportArguments::ValueAuto; |
| + |
| + if (resultMinWidth == ViewportArguments::ValueExtendToZoom) |
| + resultMinWidth = resultMaxWidth; |
| + |
| + if (resultMinHeight == ViewportArguments::ValueExtendToZoom) |
| + resultMinHeight = resultMaxHeight; |
| + } else { |
| + float extendWidth = initialViewportSize.width() / extendZoom; |
| + float extendHeight = initialViewportSize.height() / extendZoom; |
| + |
| + if (resultMaxWidth == ViewportArguments::ValueExtendToZoom) |
| + resultMaxWidth = extendWidth; |
| + |
| + if (resultMaxHeight == ViewportArguments::ValueExtendToZoom) |
| + resultMaxHeight = extendHeight; |
| + if (resultMinWidth == ViewportArguments::ValueExtendToZoom) |
| + resultMinWidth = compareIgnoringAuto(extendWidth, resultMaxWidth, max); |
| + |
| + if (resultMinHeight == ViewportArguments::ValueExtendToZoom) |
| + resultMinHeight = compareIgnoringAuto(extendHeight, resultMaxHeight, max); |
| + } |
| + |
| + // 4. Resolve initial width from min/max descriptors. |
| + if (resultMinWidth != ViewportArguments::ValueAuto || resultMaxWidth != ViewportArguments::ValueAuto) |
| + resultWidth = compareIgnoringAuto(resultMinWidth, compareIgnoringAuto(resultMaxWidth, initialViewportSize.width(), min), max); |
| + |
| + // 5. Resolve initial height from min/max descriptors. |
| + if (resultMinHeight != ViewportArguments::ValueAuto || resultMaxHeight != ViewportArguments::ValueAuto) |
| + resultHeight = compareIgnoringAuto(resultMinHeight, compareIgnoringAuto(resultMaxHeight, initialViewportSize.height(), min), max); |
| + |
| + // 6-7. Resolve width value. |
| if (resultWidth == ViewportArguments::ValueAuto) { |
| - ASSERT(initialViewportSize.height()); // If height is 0, resultWidth should be resolved above. |
| - resultWidth = resultHeight * initialViewportSize.width() / initialViewportSize.height(); |
| + if (resultHeight == ViewportArguments::ValueAuto || !initialViewportSize .height()) |
| + resultWidth = initialViewportSize.width(); |
| + else |
| + resultWidth = resultHeight * (initialViewportSize.width() / initialViewportSize.height()); |
| } |
| + // 8. Resolve height value. |
| if (resultHeight == ViewportArguments::ValueAuto) { |
| if (!initialViewportSize.width()) |
| resultHeight = initialViewportSize.height(); |
| else |
| resultHeight = resultWidth * initialViewportSize.height() / initialViewportSize.width(); |
| } |
| + |
| + PageScaleConstraints result; |
| + result.minimumScale = resultMinZoom; |
| + result.maximumScale = resultMaxZoom; |
| + result.initialScale = resultZoom; |
| + result.layoutSize.setWidth(resultWidth); |
| + result.layoutSize.setHeight(resultHeight); |
| + return result; |
| + } |
| + |
| + switch (int(resultWidth)) { |
|
apavlov
2013/07/18 16:06:17
I guess you should use static_cast<int>() or floor
|
| + case ViewportArguments::ValueDeviceWidth: |
| + resultWidth = deviceSize.width(); |
| + break; |
| + case ViewportArguments::ValueDeviceHeight: |
| + resultWidth = deviceSize.height(); |
| + break; |
| + } |
| + |
| + switch (int(resultHeight)) { |
|
apavlov
2013/07/18 16:06:17
ditto
|
| + case ViewportArguments::ValueDeviceWidth: |
| + resultHeight = deviceSize.width(); |
| + break; |
| + case ViewportArguments::ValueDeviceHeight: |
| + resultHeight = deviceSize.height(); |
| + break; |
| } |
| - if (type != ViewportArguments::CSSDeviceAdaptation && type != ViewportArguments::Implicit) { |
| + if (type != ViewportArguments::Implicit) { |
| // Clamp values to a valid range, but not for @viewport since is |
| // not mandated by the specification. |
| resultWidth = clampLengthValue(resultWidth); |