DeviceOrientation.absolute should return false when it was not initialized.
[framework/web/webkit-efl.git] / Source / WebCore / rendering / TextAutosizer.h
1 /*
2  * Copyright (C) 2012 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
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef TextAutosizer_h
27 #define TextAutosizer_h
28
29 #if ENABLE(TEXT_AUTOSIZING)
30
31 #include "HTMLNames.h"
32 #include "WritingMode.h"
33 #include <wtf/Noncopyable.h>
34 #include <wtf/PassOwnPtr.h>
35
36 namespace WebCore {
37
38 class Document;
39 class RenderBlock;
40 class RenderObject;
41 class RenderText;
42 struct TextAutosizingWindowInfo;
43 struct TextAutosizingClusterInfo;
44
45 class TextAutosizer {
46     WTF_MAKE_NONCOPYABLE(TextAutosizer);
47
48 public:
49     static PassOwnPtr<TextAutosizer> create(Document* document) { return adoptPtr(new TextAutosizer(document)); }
50
51     virtual ~TextAutosizer();
52
53     bool processSubtree(RenderObject* layoutRoot);
54     void recalculateMultipliers();
55
56     static float computeAutosizedFontSize(float specifiedSize, float multiplier);
57
58 private:
59     enum TraversalDirection {
60         FirstToLast,
61         LastToFirst
62     };
63
64     explicit TextAutosizer(Document*);
65
66     float clusterMultiplier(WritingMode, const TextAutosizingWindowInfo&, float textWidth) const;
67
68     void processClusterInternal(TextAutosizingClusterInfo&, RenderBlock* container, RenderObject* subtreeRoot, const TextAutosizingWindowInfo&, float multiplier);
69     void processCluster(TextAutosizingClusterInfo&, RenderBlock* container, RenderObject* subtreeRoot, const TextAutosizingWindowInfo&);
70     void processCompositeCluster(Vector<TextAutosizingClusterInfo>&, const TextAutosizingWindowInfo&);
71     void processContainer(float multiplier, RenderBlock* container, TextAutosizingClusterInfo&, RenderObject* subtreeRoot, const TextAutosizingWindowInfo&);
72
73     void setMultiplier(RenderObject*, float);
74
75     static bool isAutosizingContainer(const RenderObject*);
76     static bool isNarrowDescendant(const RenderBlock*, TextAutosizingClusterInfo& parentClusterInfo);
77     static bool isWiderDescendant(const RenderBlock*, const TextAutosizingClusterInfo& parentClusterInfo);
78     static bool isIndependentDescendant(const RenderBlock*);
79     static bool isAutosizingCluster(const RenderBlock*, TextAutosizingClusterInfo& parentClusterInfo);
80
81     static bool containerShouldBeAutosized(const RenderBlock* container);
82     static bool containerContainsOneOfTags(const RenderBlock* cluster, const Vector<QualifiedName>& tags);
83     static bool containerIsRowOfLinks(const RenderObject* container);
84     static bool contentHeightIsConstrained(const RenderBlock* container);
85     static bool clusterShouldBeAutosized(TextAutosizingClusterInfo&, float blockWidth);
86     static bool compositeClusterShouldBeAutosized(Vector<TextAutosizingClusterInfo>&, float blockWidth);
87     static void measureDescendantTextWidth(const RenderBlock* container, TextAutosizingClusterInfo&, float minTextWidth, float& textWidth);
88
89     // Use to traverse the tree of descendants, excluding descendants of containers (but returning the containers themselves).
90     static RenderObject* nextInPreOrderSkippingDescendantsOfContainers(const RenderObject*, const RenderObject* stayWithin);
91
92     static const RenderBlock* findDeepestBlockContainingAllText(const RenderBlock* cluster);
93
94     // Depending on the traversal direction specified, finds the first or the last leaf text node child that doesn't
95     // belong to any cluster.
96     static const RenderObject* findFirstTextLeafNotInCluster(const RenderObject*, size_t& depth, TraversalDirection);
97
98     // Returns groups of narrow descendants of a given autosizing cluster. The groups are combined
99     // by the difference between the width of the descendant and the width of the parent cluster's
100     // |blockContainingAllText|.
101     static void getNarrowDescendantsGroupedByWidth(const TextAutosizingClusterInfo& parentClusterInfo, Vector<Vector<TextAutosizingClusterInfo> >&);
102
103     Document* m_document;
104 };
105
106 } // namespace WebCore
107
108 #endif // ENABLE(TEXT_AUTOSIZING)
109
110 #endif // TextAutosizer_h