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