Source/WebKit:
[WebKit-https.git] / Source / WebKit / Shared / EditorState.h
1 /*
2  * Copyright (C) 2010, 2011 Apple 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef EditorState_h
27 #define EditorState_h
28
29 #include "ArgumentCoders.h"
30 #include <WebCore/Color.h>
31 #include <WebCore/IntRect.h>
32 #include <wtf/text/WTFString.h>
33
34 #if PLATFORM(IOS)
35 #include <WebCore/SelectionRect.h>
36 #endif
37
38 namespace WebKit {
39
40 enum TypingAttributes {
41     AttributeNone = 0,
42     AttributeBold = 1,
43     AttributeItalics = 2,
44     AttributeUnderline = 4,
45     AttributeStrikeThrough = 8
46 };
47
48 enum TextAlignment {
49     NoAlignment = 0,
50     LeftAlignment = 1,
51     RightAlignment = 2,
52     CenterAlignment = 3,
53     JustifiedAlignment = 4,
54 };
55
56 enum ListType {
57     NoList = 0,
58     OrderedList,
59     UnorderedList
60 };
61
62 struct EditorState {
63     bool shouldIgnoreSelectionChanges { false };
64
65     bool selectionIsNone { true }; // This will be false when there is a caret selection.
66     bool selectionIsRange { false };
67     bool isContentEditable { false };
68     bool isContentRichlyEditable { false };
69     bool isInPasswordField { false };
70     bool isInPlugin { false };
71     bool hasComposition { false };
72     bool isMissingPostLayoutData { false };
73
74 #if PLATFORM(IOS)
75     WebCore::IntRect firstMarkedRect;
76     WebCore::IntRect lastMarkedRect;
77     String markedText;
78 #endif
79
80 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
81     struct PostLayoutData {
82         uint32_t typingAttributes { AttributeNone };
83 #if PLATFORM(IOS) || PLATFORM(GTK)
84         WebCore::IntRect caretRectAtStart;
85 #endif
86 #if PLATFORM(IOS) || PLATFORM(MAC)
87         WebCore::IntRect selectionClipRect;
88         uint64_t selectedTextLength { 0 };
89         uint32_t textAlignment { NoAlignment };
90         WebCore::Color textColor { WebCore::Color::black };
91         uint32_t enclosingListType { NoList };
92 #endif
93 #if PLATFORM(IOS)
94         WebCore::IntRect caretRectAtEnd;
95         Vector<WebCore::SelectionRect> selectionRects;
96         String wordAtSelection;
97         UChar32 characterAfterSelection { 0 };
98         UChar32 characterBeforeSelection { 0 };
99         UChar32 twoCharacterBeforeSelection { 0 };
100         bool isReplaceAllowed { false };
101         bool hasContent { false };
102         bool isStableStateUpdate { false };
103         bool insideFixedPosition { false };
104         bool hasPlainText { false };
105         WebCore::Color caretColor;
106 #endif
107 #if PLATFORM(MAC)
108         uint64_t candidateRequestStartPosition { 0 };
109         String paragraphContextForCandidateRequest;
110         String stringForCandidateRequest;
111 #endif
112
113         void encode(IPC::Encoder&) const;
114         static bool decode(IPC::Decoder&, PostLayoutData&);
115     };
116
117     const PostLayoutData& postLayoutData() const;
118     PostLayoutData& postLayoutData();
119 #endif // PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
120
121     void encode(IPC::Encoder&) const;
122     static bool decode(IPC::Decoder&, EditorState&);
123
124 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
125 private:
126     PostLayoutData m_postLayoutData;
127 #endif
128 };
129
130 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
131 inline auto EditorState::postLayoutData() -> PostLayoutData&
132 {
133     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
134     return m_postLayoutData;
135 }
136
137 inline auto EditorState::postLayoutData() const -> const PostLayoutData&
138 {
139     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
140     return m_postLayoutData;
141 }
142 #endif
143
144 }
145
146 #endif // EditorState_h