5afac59abedbaad0173146f7c202137a4faae318
[WebKit-https.git] / Source / WebKit / Shared / EditorState.cpp
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 #include "config.h"
27 #include "EditorState.h"
28
29 #include "WebCoreArgumentCoders.h"
30
31 namespace WebKit {
32
33 void EditorState::encode(IPC::Encoder& encoder) const
34 {
35     encoder << shouldIgnoreSelectionChanges;
36     encoder << selectionIsNone;
37     encoder << selectionIsRange;
38     encoder << isContentEditable;
39     encoder << isContentRichlyEditable;
40     encoder << isInPasswordField;
41     encoder << isInPlugin;
42     encoder << hasComposition;
43     encoder << isMissingPostLayoutData;
44
45 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
46     if (!isMissingPostLayoutData)
47         m_postLayoutData.encode(encoder);
48 #endif
49
50 #if PLATFORM(IOS)
51     encoder << firstMarkedRect;
52     encoder << lastMarkedRect;
53     encoder << markedText;
54 #endif
55 }
56
57 bool EditorState::decode(IPC::Decoder& decoder, EditorState& result)
58 {
59     if (!decoder.decode(result.shouldIgnoreSelectionChanges))
60         return false;
61
62     if (!decoder.decode(result.selectionIsNone))
63         return false;
64
65     if (!decoder.decode(result.selectionIsRange))
66         return false;
67
68     if (!decoder.decode(result.isContentEditable))
69         return false;
70
71     if (!decoder.decode(result.isContentRichlyEditable))
72         return false;
73
74     if (!decoder.decode(result.isInPasswordField))
75         return false;
76
77     if (!decoder.decode(result.isInPlugin))
78         return false;
79
80     if (!decoder.decode(result.hasComposition))
81         return false;
82
83     if (!decoder.decode(result.isMissingPostLayoutData))
84         return false;
85
86 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
87     if (!result.isMissingPostLayoutData) {
88         if (!PostLayoutData::decode(decoder, result.postLayoutData()))
89             return false;
90     }
91 #endif
92
93 #if PLATFORM(IOS)
94     if (!decoder.decode(result.firstMarkedRect))
95         return false;
96     if (!decoder.decode(result.lastMarkedRect))
97         return false;
98     if (!decoder.decode(result.markedText))
99         return false;
100 #endif
101
102     return true;
103 }
104
105 #if PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
106 void EditorState::PostLayoutData::encode(IPC::Encoder& encoder) const
107 {
108     encoder << typingAttributes;
109 #if PLATFORM(IOS) || PLATFORM(GTK)
110     encoder << caretRectAtStart;
111 #endif
112 #if PLATFORM(IOS) || PLATFORM(MAC)
113     encoder << selectionClipRect;
114     encoder << selectedTextLength;
115     encoder << textAlignment;
116     encoder << textColor;
117     encoder << enclosingListType;
118 #endif
119 #if PLATFORM(IOS)
120     encoder << caretRectAtEnd;
121     encoder << selectionRects;
122     encoder << wordAtSelection;
123     encoder << characterAfterSelection;
124     encoder << characterBeforeSelection;
125     encoder << twoCharacterBeforeSelection;
126     encoder << isReplaceAllowed;
127     encoder << hasContent;
128     encoder << isStableStateUpdate;
129     encoder << insideFixedPosition;
130     encoder << hasPlainText;
131 #endif
132 #if PLATFORM(MAC)
133     encoder << candidateRequestStartPosition;
134     encoder << paragraphContextForCandidateRequest;
135     encoder << stringForCandidateRequest;
136 #endif
137 }
138
139 bool EditorState::PostLayoutData::decode(IPC::Decoder& decoder, PostLayoutData& result)
140 {
141     if (!decoder.decode(result.typingAttributes))
142         return false;
143 #if PLATFORM(IOS) || PLATFORM(GTK)
144     if (!decoder.decode(result.caretRectAtStart))
145         return false;
146 #endif
147 #if PLATFORM(IOS) || PLATFORM(MAC)
148     if (!decoder.decode(result.selectionClipRect))
149         return false;
150     if (!decoder.decode(result.selectedTextLength))
151         return false;
152     if (!decoder.decode(result.textAlignment))
153         return false;
154     if (!decoder.decode(result.textColor))
155         return false;
156     if (!decoder.decode(result.enclosingListType))
157         return false;
158 #endif
159 #if PLATFORM(IOS)
160     if (!decoder.decode(result.caretRectAtEnd))
161         return false;
162     if (!decoder.decode(result.selectionRects))
163         return false;
164     if (!decoder.decode(result.wordAtSelection))
165         return false;
166     if (!decoder.decode(result.characterAfterSelection))
167         return false;
168     if (!decoder.decode(result.characterBeforeSelection))
169         return false;
170     if (!decoder.decode(result.twoCharacterBeforeSelection))
171         return false;
172     if (!decoder.decode(result.isReplaceAllowed))
173         return false;
174     if (!decoder.decode(result.hasContent))
175         return false;
176     if (!decoder.decode(result.isStableStateUpdate))
177         return false;
178     if (!decoder.decode(result.insideFixedPosition))
179         return false;
180     if (!decoder.decode(result.hasPlainText))
181         return false;
182 #endif
183 #if PLATFORM(MAC)
184     if (!decoder.decode(result.candidateRequestStartPosition))
185         return false;
186
187     if (!decoder.decode(result.paragraphContextForCandidateRequest))
188         return false;
189
190     if (!decoder.decode(result.stringForCandidateRequest))
191         return false;
192 #endif
193
194     return true;
195 }
196 #endif // PLATFORM(IOS) || PLATFORM(GTK) || PLATFORM(MAC)
197
198 }