[iOS] Paste is missing from callout bar when pasteboard only contains custom data
[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     String originIdentifierForPasteboard;
84
85     struct PostLayoutData {
86         uint32_t typingAttributes { AttributeNone };
87 #if PLATFORM(IOS) || PLATFORM(GTK)
88         WebCore::IntRect caretRectAtStart;
89 #endif
90 #if PLATFORM(IOS) || PLATFORM(MAC)
91         WebCore::IntRect selectionClipRect;
92         uint64_t selectedTextLength { 0 };
93         uint32_t textAlignment { NoAlignment };
94         WebCore::Color textColor { WebCore::Color::black };
95         uint32_t enclosingListType { NoList };
96 #endif
97 #if PLATFORM(IOS)
98         WebCore::IntRect caretRectAtEnd;
99         Vector<WebCore::SelectionRect> selectionRects;
100         String wordAtSelection;
101         UChar32 characterAfterSelection { 0 };
102         UChar32 characterBeforeSelection { 0 };
103         UChar32 twoCharacterBeforeSelection { 0 };
104         bool isReplaceAllowed { false };
105         bool hasContent { false };
106         bool isStableStateUpdate { false };
107         bool insideFixedPosition { false };
108         bool hasPlainText { false };
109         WebCore::Color caretColor;
110 #endif
111 #if PLATFORM(MAC)
112         uint64_t candidateRequestStartPosition { 0 };
113         String paragraphContextForCandidateRequest;
114         String stringForCandidateRequest;
115 #endif
116
117         bool canCut { false };
118         bool canCopy { false };
119         bool canPaste { false };
120
121         void encode(IPC::Encoder&) const;
122         static bool decode(IPC::Decoder&, PostLayoutData&);
123     };
124
125     const PostLayoutData& postLayoutData() const;
126     PostLayoutData& postLayoutData();
127
128     void encode(IPC::Encoder&) const;
129     static bool decode(IPC::Decoder&, EditorState&);
130
131 private:
132     PostLayoutData m_postLayoutData;
133 };
134
135 inline auto EditorState::postLayoutData() -> PostLayoutData&
136 {
137     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
138     return m_postLayoutData;
139 }
140
141 inline auto EditorState::postLayoutData() const -> const PostLayoutData&
142 {
143     ASSERT_WITH_MESSAGE(!isMissingPostLayoutData, "Attempt to access post layout data before receiving it");
144     return m_postLayoutData;
145 }
146
147 WTF::TextStream& operator<<(WTF::TextStream&, const EditorState&);
148
149 } // namespace WebKit