[iOS][WK2] Add support for minimal-ui viewports
[WebKit-https.git] / Source / WebCore / dom / ViewportArguments.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
7  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
9  * Copyright (C) 2012 Intel Corporation. All rights reserved.
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public License
22  * along with this library; see the file COPYING.LIB.  If not, write to
23  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24  * Boston, MA 02110-1301, USA.
25  *
26  */
27
28 #ifndef ViewportArguments_h
29 #define ViewportArguments_h
30
31 #include "FloatSize.h"
32 #include <wtf/Forward.h>
33
34 namespace WebCore {
35
36 class Document;
37
38 enum ViewportErrorCode {
39     UnrecognizedViewportArgumentKeyError,
40     UnrecognizedViewportArgumentValueError,
41     TruncatedViewportArgumentValueError,
42     MaximumScaleTooLargeError
43 };
44
45 struct ViewportAttributes {
46     FloatSize layoutSize;
47
48     float initialScale;
49     float minimumScale;
50     float maximumScale;
51
52     float userScalable;
53     float orientation;
54 };
55
56 struct ViewportArguments {
57
58     enum Type {
59         // These are ordered in increasing importance.
60         Implicit,
61 #if PLATFORM(IOS)
62         PluginDocument,
63         ImageDocument,
64 #endif
65         ViewportMeta,
66         CSSDeviceAdaptation
67     } type;
68
69     enum {
70         ValueAuto = -1,
71         ValueDeviceWidth = -2,
72         ValueDeviceHeight = -3,
73         ValuePortrait = -4,
74         ValueLandscape = -5
75     };
76
77     explicit ViewportArguments(Type type = Implicit)
78         : type(type)
79         , width(ValueAuto)
80         , minWidth(ValueAuto)
81         , maxWidth(ValueAuto)
82         , height(ValueAuto)
83         , minHeight(ValueAuto)
84         , maxHeight(ValueAuto)
85         , zoom(ValueAuto)
86         , minZoom(ValueAuto)
87         , maxZoom(ValueAuto)
88         , userZoom(ValueAuto)
89         , orientation(ValueAuto)
90 #if PLATFORM(IOS)
91         , minimalUI(false)
92 #endif
93     {
94     }
95
96     // All arguments are in CSS units.
97     ViewportAttributes resolve(const FloatSize& initialViewportSize, const FloatSize& deviceSize, int defaultWidth) const;
98
99     float width;
100     float minWidth;
101     float maxWidth;
102     float height;
103     float minHeight;
104     float maxHeight;
105     float zoom;
106     float minZoom;
107     float maxZoom;
108     float userZoom;
109     float orientation;
110 #if PLATFORM(IOS)
111     bool minimalUI;
112 #endif
113
114     bool operator==(const ViewportArguments& other) const
115     {
116         // Used for figuring out whether to reset the viewport or not,
117         // thus we are not taking type into account.
118         return width == other.width
119             && minWidth == other.minWidth
120             && maxWidth == other.maxWidth
121             && height == other.height
122             && minHeight == other.minHeight
123             && maxHeight == other.maxHeight
124             && zoom == other.zoom
125             && minZoom == other.minZoom
126             && maxZoom == other.maxZoom
127             && userZoom == other.userZoom
128 #if PLATFORM(IOS)
129             && minimalUI == other.minimalUI
130 #endif
131             && orientation == other.orientation;
132     }
133
134     bool operator!=(const ViewportArguments& other) const
135     {
136         return !(*this == other);
137     }
138
139 #if PLATFORM(GTK)
140     // FIXME: We're going to keep this constant around until all embedders
141     // refactor their code to no longer need it.
142     static const float deprecatedTargetDPI;
143 #endif
144 };
145
146 ViewportAttributes computeViewportAttributes(ViewportArguments args, int desktopWidth, int deviceWidth, int deviceHeight, float devicePixelRatio, IntSize visibleViewport);
147
148 void restrictMinimumScaleFactorToViewportSize(ViewportAttributes& result, IntSize visibleViewport, float devicePixelRatio);
149 void restrictScaleFactorToInitialScaleIfNotUserScalable(ViewportAttributes& result);
150 float computeMinimumScaleFactorForContentContained(const ViewportAttributes& result, const IntSize& viewportSize, const IntSize& contentSize);
151
152 void setViewportFeature(const String& keyString, const String& valueString, Document*, void* data);
153 void reportViewportWarning(Document*, ViewportErrorCode, const String& replacement1, const String& replacement2);
154
155 #if PLATFORM(IOS)
156 void finalizeViewportArguments(ViewportArguments&, const FloatSize& screenSize);
157 #endif
158
159 } // namespace WebCore
160
161 #endif // ViewportArguments_h