11a59541889e07d653c166a7e4a07ed34b6c1150
[WebKit-https.git] / Source / WebKit2 / Shared / mac / ActionMenuHitTestResult.mm
1 /*
2  * Copyright (C) 2014 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 "ActionMenuHitTestResult.h"
28
29 #if PLATFORM(MAC)
30
31 #import "ArgumentCodersCF.h"
32 #import "ArgumentDecoder.h"
33 #import "ArgumentEncoder.h"
34 #import "WebCoreArgumentCoders.h"
35 #import <WebCore/DataDetectorsSPI.h>
36 #import <WebCore/TextIndicator.h>
37
38 namespace WebKit {
39
40 void ActionMenuHitTestResult::encode(IPC::ArgumentEncoder& encoder) const
41 {
42     encoder << hitTestLocationInViewCooordinates;
43     encoder << hitTestResult;
44     encoder << lookupText;
45     encoder << imageExtension;
46
47     SharedMemory::Handle imageHandle;
48     if (imageSharedMemory && imageSharedMemory->data())
49         imageSharedMemory->createHandle(imageHandle, SharedMemory::ReadOnly);
50     encoder << imageHandle;
51     encoder << imageSize;
52
53     bool hasActionContext = actionContext;
54     encoder << hasActionContext;
55     if (hasActionContext) {
56         RetainPtr<NSMutableData> data = adoptNS([[NSMutableData alloc] init]);
57         RetainPtr<NSKeyedArchiver> archiver = adoptNS([[NSKeyedArchiver alloc] initForWritingWithMutableData:data.get()]);
58         [archiver setRequiresSecureCoding:YES];
59         [archiver encodeObject:actionContext.get() forKey:@"actionContext"];
60         [archiver finishEncoding];
61
62         IPC::encode(encoder, reinterpret_cast<CFDataRef>(data.get()));
63
64         encoder << detectedDataBoundingBox;
65         encoder << detectedDataOriginatingPageOverlay;
66
67         bool hasDetectedDataTextIndicator = detectedDataTextIndicator;
68         encoder << hasDetectedDataTextIndicator;
69         if (hasDetectedDataTextIndicator)
70             encoder << detectedDataTextIndicator->data();
71     }
72
73     encoder << dictionaryPopupInfo;
74
75     bool hasLinkTextIndicator = linkTextIndicator;
76     encoder << hasLinkTextIndicator;
77     if (hasLinkTextIndicator)
78         encoder << linkTextIndicator->data();
79
80     encoder << contentPreventsDefault;
81 }
82
83 bool ActionMenuHitTestResult::decode(IPC::ArgumentDecoder& decoder, ActionMenuHitTestResult& actionMenuHitTestResult)
84 {
85     if (!decoder.decode(actionMenuHitTestResult.hitTestLocationInViewCooordinates))
86         return false;
87
88     if (!decoder.decode(actionMenuHitTestResult.hitTestResult))
89         return false;
90
91     if (!decoder.decode(actionMenuHitTestResult.lookupText))
92         return false;
93
94     if (!decoder.decode(actionMenuHitTestResult.imageExtension))
95         return false;
96
97     SharedMemory::Handle imageHandle;
98     if (!decoder.decode(imageHandle))
99         return false;
100
101     if (!imageHandle.isNull())
102         actionMenuHitTestResult.imageSharedMemory = SharedMemory::create(imageHandle, SharedMemory::ReadOnly);
103
104     if (!decoder.decode(actionMenuHitTestResult.imageSize))
105         return false;
106
107     bool hasActionContext;
108     if (!decoder.decode(hasActionContext))
109         return false;
110
111     if (hasActionContext) {
112         RetainPtr<CFDataRef> data;
113         if (!IPC::decode(decoder, data))
114             return false;
115
116         RetainPtr<NSKeyedUnarchiver> unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)data.get()]);
117         [unarchiver setRequiresSecureCoding:YES];
118         @try {
119             actionMenuHitTestResult.actionContext = [unarchiver decodeObjectOfClass:getDDActionContextClass() forKey:@"actionContext"];
120         } @catch (NSException *exception) {
121             LOG_ERROR("Failed to decode DDActionContext: %@", exception);
122             return false;
123         }
124         
125         [unarchiver finishDecoding];
126
127         if (!decoder.decode(actionMenuHitTestResult.detectedDataBoundingBox))
128             return false;
129
130         if (!decoder.decode(actionMenuHitTestResult.detectedDataOriginatingPageOverlay))
131             return false;
132
133         bool hasDetectedDataTextIndicator;
134         if (!decoder.decode(hasDetectedDataTextIndicator))
135             return false;
136
137         if (hasDetectedDataTextIndicator) {
138             WebCore::TextIndicatorData indicatorData;
139             if (!decoder.decode(indicatorData))
140                 return false;
141
142             actionMenuHitTestResult.detectedDataTextIndicator = WebCore::TextIndicator::create(indicatorData);
143         }
144     }
145
146     if (!decoder.decode(actionMenuHitTestResult.dictionaryPopupInfo))
147         return false;
148
149     bool hasLinkTextIndicator;
150     if (!decoder.decode(hasLinkTextIndicator))
151         return false;
152
153     if (hasLinkTextIndicator) {
154         WebCore::TextIndicatorData indicatorData;
155         if (!decoder.decode(indicatorData))
156             return false;
157
158         actionMenuHitTestResult.linkTextIndicator = WebCore::TextIndicator::create(indicatorData);
159     }
160
161     if (!decoder.decode(actionMenuHitTestResult.contentPreventsDefault))
162         return false;
163
164     return true;
165 }
166     
167 } // namespace WebKit
168
169 #endif // PLATFORM(MAC)