b705a6e98f835f3b0f205ad04ed31b3328013685
[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 #endif
106 #if PLATFORM(MAC)
107         uint64_t candidateRequestStartPosition { 0 };
108         String paragraphContextForCandidateRequest;
109         String stringForCandidateRequest;
110 #endif
111
112         void encode(IPC::Encoder&) const;
113         static bool decode(IPC::Decoder&, PostLayoutData&);
114     };
115
116     const PostLayoutData& postLayoutData() const;
117     PostLayoutData& postLayoutData();
118 #endif // PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
119
120     void encode(IPC::Encoder&) const;
121     static bool decode(IPC::Decoder&, EditorState&);
122
123 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
124 private:
125     PostLayoutData m_postLayoutData;
126 #endif
127 };
128
129 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
130 inline auto EditorState::postLayoutData() -> PostLayoutData&
131 {
132     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
133     return m_postLayoutData;
134 }
135
136 inline auto EditorState::postLayoutData() const -> const PostLayoutData&
137 {
138     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
139     return m_postLayoutData;
140 }
141 #endif
142
143 }
144
145 #endif // EditorState_h