1/*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef PageScaleConstraintsSet_h
32#define PageScaleConstraintsSet_h
33
34#include "core/dom/ViewportDescription.h"
35#include "core/page/PageScaleConstraints.h"
36#include "platform/Length.h"
37#include "platform/geometry/IntSize.h"
38
39namespace blink {
40
41// This class harmonizes the viewport (particularly page scale) constraints from
42// the meta viewport tag and other sources.
43class PageScaleConstraintsSet {
44public:
45    PageScaleConstraintsSet();
46
47    PageScaleConstraints defaultConstraints() const;
48
49    // Settings defined in the website's viewport tag, if viewport tag support
50    // is enabled.
51    const PageScaleConstraints& pageDefinedConstraints() const { return m_pageDefinedConstraints; }
52    void updatePageDefinedConstraints(const ViewportDescription&, Length legacyFallbackWidth);
53    void adjustForAndroidWebViewQuirks(const ViewportDescription&, int layoutFallbackWidth, float deviceScaleFactor, bool supportTargetDensityDPI, bool wideViewportQuirkEnabled, bool useWideViewport, bool loadWithOverviewMode, bool nonUserScalableQuirkEnabled);
54
55    // Constraints may also be set from Chromium -- this overrides any
56    // page-defined values.
57    const PageScaleConstraints& userAgentConstraints() const { return m_userAgentConstraints; }
58    void setUserAgentConstraints(const PageScaleConstraints&);
59
60    // Actual computed values, taking into account the above plus the current
61    // viewport size and document width.
62    const PageScaleConstraints& finalConstraints() const { return m_finalConstraints; }
63    void computeFinalConstraints();
64    void adjustFinalConstraintsToContentsSize(IntSize contentsSize, int nonOverlayScrollbarWidth);
65
66    void didChangeContentsSize(IntSize contentsSize, float pageScaleFactor);
67
68    // This should be set to true on each page load to note that the page scale
69    // factor needs to be reset to its initial value.
70    void setNeedsReset(bool);
71    bool needsReset() const { return m_needsReset; }
72
73    // This is set when one of the inputs to finalConstraints changes.
74    bool constraintsDirty() const { return m_constraintsDirty; }
75
76    void didChangeViewSize(const IntSize&);
77
78    IntSize mainFrameSize(const IntSize& contentsSize) const;
79
80private:
81    PageScaleConstraints computeConstraintsStack() const;
82
83    PageScaleConstraints m_pageDefinedConstraints;
84    PageScaleConstraints m_userAgentConstraints;
85    PageScaleConstraints m_finalConstraints;
86
87    int m_lastContentsWidth;
88    IntSize m_viewSize;
89
90    bool m_needsReset;
91    bool m_constraintsDirty;
92};
93
94} // namespace blink
95
96#endif // PageScaleConstraintsSet_h
97