a2173a49b482c12c988a6d1f2ae725c7a84a5f91
[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 #pragma once
27
28 #include "ArgumentCoders.h"
29 #include <WebCore/Color.h>
30 #include <WebCore/IntRect.h>
31 #include <wtf/text/WTFString.h>
32
33 #if PLATFORM(IOS)
34 #include <WebCore/SelectionRect.h>
35 #endif
36
37 namespace WTF {
38 class TextStream;
39 };
40
41 namespace WebKit {
42
43 enum TypingAttributes {
44     AttributeNone = 0,
45     AttributeBold = 1,
46     AttributeItalics = 2,
47     AttributeUnderline = 4,
48     AttributeStrikeThrough = 8
49 };
50
51 enum TextAlignment {
52     NoAlignment = 0,
53     LeftAlignment = 1,
54     RightAlignment = 2,
55     CenterAlignment = 3,
56     JustifiedAlignment = 4,
57 };
58
59 enum ListType {
60     NoList = 0,
61     OrderedList,
62     UnorderedList
63 };
64
65 struct EditorState {
66     bool shouldIgnoreSelectionChanges { false };
67
68     bool selectionIsNone { true }; // This will be false when there is a caret selection.
69     bool selectionIsRange { false };
70     bool isContentEditable { false };
71     bool isContentRichlyEditable { false };
72     bool isInPasswordField { false };
73     bool isInPlugin { false };
74     bool hasComposition { false };
75     bool isMissingPostLayoutData { false };
76
77 #if PLATFORM(IOS)
78     WebCore::IntRect firstMarkedRect;
79     WebCore::IntRect lastMarkedRect;
80     String markedText;
81 #endif
82
83     struct PostLayoutData {
84         uint32_t typingAttributes { AttributeNone };
85 #if PLATFORM(IOS) || PLATFORM(GTK)
86         WebCore::IntRect caretRectAtStart;
87 #endif
88 #if PLATFORM(IOS) || PLATFORM(MAC)
89         WebCore::IntRect selectionClipRect;
90         uint64_t selectedTextLength { 0 };
91         uint32_t textAlignment { NoAlignment };
92         WebCore::Color textColor { WebCore::Color::black };
93         uint32_t enclosingListType { NoList };
94 #endif
95 #if PLATFORM(IOS)
96         WebCore::IntRect caretRectAtEnd;
97         Vector<WebCore::SelectionRect> selectionRects;
98         String wordAtSelection;
99         UChar32 characterAfterSelection { 0 };
100         UChar32 characterBeforeSelection { 0 };
101         UChar32 twoCharacterBeforeSelection { 0 };
102         bool isReplaceAllowed { false };
103         bool hasContent { false };
104         bool isStableStateUpdate { false };
105         bool insideFixedPosition { false };
106         bool hasPlainText { false };
107         WebCore::Color caretColor;
108 #endif
109 #if PLATFORM(MAC)
110         uint64_t candidateRequestStartPosition { 0 };
111         String paragraphContextForCandidateRequest;
112         String stringForCandidateRequest;
113 #endif
114
115         bool canCut { false };
116         bool canCopy { false };
117         bool canPaste { false };
118
119         void encode(IPC::Encoder&) const;
120         static bool decode(IPC::Decoder&, PostLayoutData&);
121     };
122
123     const PostLayoutData& postLayoutData() const;
124     PostLayoutData& postLayoutData();
125
126     void encode(IPC::Encoder&) const;
127     static bool decode(IPC::Decoder&, EditorState&);
128
129 private:
130     PostLayoutData m_postLayoutData;
131 };
132
133 inline auto EditorState::postLayoutData() -> PostLayoutData&
134 {
135     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
136     return m_postLayoutData;
137 }
138
139 inline auto EditorState::postLayoutData() const -> const PostLayoutData&
140 {
141     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
142     return m_postLayoutData;
143 }
144
145 WTF::TextStream& operator<<(WTF::TextStream&, const EditorState&);
146
147 } // namespace WebKit