[iOS] Replace "node assistance" terminology in WebKit with "focused element"
[WebKit-https.git] / Source / WebKit / Shared / ios / InteractionInformationAtPosition.mm
1 /*
2  * Copyright (C) 2014-2018 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 #import "config.h"
27 #import "InteractionInformationAtPosition.h"
28
29 #import "ArgumentCodersCocoa.h"
30 #import "WebCoreArgumentCoders.h"
31 #import <pal/spi/cocoa/DataDetectorsCoreSPI.h>
32 #import <pal/spi/cocoa/NSKeyedArchiverSPI.h>
33 #import <wtf/SoftLinking.h>
34
35 SOFT_LINK_PRIVATE_FRAMEWORK(DataDetectorsCore)
36 SOFT_LINK_CLASS(DataDetectorsCore, DDScannerResult)
37
38 namespace WebKit {
39
40 #if PLATFORM(IOS_FAMILY)
41
42 void InteractionInformationAtPosition::encode(IPC::Encoder& encoder) const
43 {
44     encoder << request;
45
46     encoder << nodeAtPositionIsFocusedElement;
47 #if ENABLE(DATA_INTERACTION)
48     encoder << hasSelectionAtPosition;
49 #endif
50     encoder << isSelectable;
51     encoder << isNearMarkedText;
52     encoder << touchCalloutEnabled;
53     encoder << isLink;
54     encoder << isImage;
55     encoder << isAttachment;
56     encoder << isAnimatedImage;
57     encoder << isElement;
58     encoder << adjustedPointForNodeRespondingToClickEvents;
59     encoder << url;
60     encoder << imageURL;
61     encoder << title;
62     encoder << idAttribute;
63     encoder << bounds;
64 #if PLATFORM(IOSMAC)
65     encoder << caretRect;
66 #endif
67     encoder << textBefore;
68     encoder << textAfter;
69     encoder << linkIndicator;
70
71     ShareableBitmap::Handle handle;
72     if (image)
73         image->createHandle(handle, SharedMemory::Protection::ReadOnly);
74     encoder << handle;
75 #if ENABLE(DATA_DETECTION)
76     encoder << isDataDetectorLink;
77     if (isDataDetectorLink) {
78         encoder << dataDetectorIdentifier;
79         encoder << dataDetectorResults;
80     }
81 #endif
82 #if ENABLE(DATALIST_ELEMENT)
83     encoder << preventTextInteraction;
84 #endif
85 }
86
87 bool InteractionInformationAtPosition::decode(IPC::Decoder& decoder, InteractionInformationAtPosition& result)
88 {
89     if (!decoder.decode(result.request))
90         return false;
91
92     if (!decoder.decode(result.nodeAtPositionIsFocusedElement))
93         return false;
94
95 #if ENABLE(DATA_INTERACTION)
96     if (!decoder.decode(result.hasSelectionAtPosition))
97         return false;
98 #endif
99
100     if (!decoder.decode(result.isSelectable))
101         return false;
102
103     if (!decoder.decode(result.isNearMarkedText))
104         return false;
105
106     if (!decoder.decode(result.touchCalloutEnabled))
107         return false;
108
109     if (!decoder.decode(result.isLink))
110         return false;
111
112     if (!decoder.decode(result.isImage))
113         return false;
114
115     if (!decoder.decode(result.isAttachment))
116         return false;
117     
118     if (!decoder.decode(result.isAnimatedImage))
119         return false;
120     
121     if (!decoder.decode(result.isElement))
122         return false;
123
124     if (!decoder.decode(result.adjustedPointForNodeRespondingToClickEvents))
125         return false;
126
127     if (!decoder.decode(result.url))
128         return false;
129
130     if (!decoder.decode(result.imageURL))
131         return false;
132
133     if (!decoder.decode(result.title))
134         return false;
135
136     if (!decoder.decode(result.idAttribute))
137         return false;
138     
139     if (!decoder.decode(result.bounds))
140         return false;
141     
142 #if PLATFORM(IOSMAC)
143     if (!decoder.decode(result.caretRect))
144         return false;
145 #endif
146
147     if (!decoder.decode(result.textBefore))
148         return false;
149     
150     if (!decoder.decode(result.textAfter))
151         return false;
152     
153     Optional<WebCore::TextIndicatorData> linkIndicator;
154     decoder >> linkIndicator;
155     if (!linkIndicator)
156         return false;
157     result.linkIndicator = WTFMove(*linkIndicator);
158
159     ShareableBitmap::Handle handle;
160     if (!decoder.decode(handle))
161         return false;
162
163     if (!handle.isNull())
164         result.image = ShareableBitmap::create(handle, SharedMemory::Protection::ReadOnly);
165
166 #if ENABLE(DATA_DETECTION)
167     if (!decoder.decode(result.isDataDetectorLink))
168         return false;
169     
170     if (result.isDataDetectorLink) {
171         if (!decoder.decode(result.dataDetectorIdentifier))
172             return false;
173
174         auto dataDetectorResults = IPC::decode<NSArray>(decoder, @[ [NSArray class], getDDScannerResultClass() ]);
175         if (!dataDetectorResults)
176             return false;
177
178         result.dataDetectorResults = WTFMove(*dataDetectorResults);
179     }
180 #endif
181
182 #if ENABLE(DATALIST_ELEMENT)
183     if (!decoder.decode(result.preventTextInteraction))
184         return false;
185 #endif
186
187     return true;
188 }
189
190 void InteractionInformationAtPosition::mergeCompatibleOptionalInformation(const InteractionInformationAtPosition& oldInformation)
191 {
192     if (oldInformation.request.point != request.point)
193         return;
194
195     if (oldInformation.request.includeSnapshot && !request.includeSnapshot)
196         image = oldInformation.image;
197
198     if (oldInformation.request.includeLinkIndicator && !request.includeLinkIndicator)
199         linkIndicator = oldInformation.linkIndicator;
200 }
201
202 #endif // PLATFORM(IOS_FAMILY)
203
204 }