Images shared to photos via action menu are padded with zeroes at the end
[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
81 bool ActionMenuHitTestResult::decode(IPC::ArgumentDecoder& decoder, ActionMenuHitTestResult& actionMenuHitTestResult)
82 {
83     if (!decoder.decode(actionMenuHitTestResult.hitTestLocationInViewCooordinates))
84         return false;
85
86     if (!decoder.decode(actionMenuHitTestResult.hitTestResult))
87         return false;
88
89     if (!decoder.decode(actionMenuHitTestResult.lookupText))
90         return false;
91
92     if (!decoder.decode(actionMenuHitTestResult.imageExtension))
93         return false;
94
95     SharedMemory::Handle imageHandle;
96     if (!decoder.decode(imageHandle))
97         return false;
98
99     if (!imageHandle.isNull())
100         actionMenuHitTestResult.imageSharedMemory = SharedMemory::create(imageHandle, SharedMemory::ReadOnly);
101
102     if (!decoder.decode(actionMenuHitTestResult.imageSize))
103         return false;
104
105     bool hasActionContext;
106     if (!decoder.decode(hasActionContext))
107         return false;
108
109     if (hasActionContext) {
110         RetainPtr<CFDataRef> data;
111         if (!IPC::decode(decoder, data))
112             return false;
113
114         RetainPtr<NSKeyedUnarchiver> unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)data.get()]);
115         [unarchiver setRequiresSecureCoding:YES];
116         @try {
117             actionMenuHitTestResult.actionContext = [unarchiver decodeObjectOfClass:getDDActionContextClass() forKey:@"actionContext"];
118         } @catch (NSException *exception) {
119             LOG_ERROR("Failed to decode DDActionContext: %@", exception);
120             return false;
121         }
122         
123         [unarchiver finishDecoding];
124
125         if (!decoder.decode(actionMenuHitTestResult.detectedDataBoundingBox))
126             return false;
127
128         if (!decoder.decode(actionMenuHitTestResult.detectedDataOriginatingPageOverlay))
129             return false;
130
131         bool hasDetectedDataTextIndicator;
132         if (!decoder.decode(hasDetectedDataTextIndicator))
133             return false;
134
135         if (hasDetectedDataTextIndicator) {
136             WebCore::TextIndicatorData indicatorData;
137             if (!decoder.decode(indicatorData))
138                 return false;
139
140             actionMenuHitTestResult.detectedDataTextIndicator = WebCore::TextIndicator::create(indicatorData);
141         }
142     }
143
144     if (!decoder.decode(actionMenuHitTestResult.dictionaryPopupInfo))
145         return false;
146
147     bool hasLinkTextIndicator;
148     if (!decoder.decode(hasLinkTextIndicator))
149         return false;
150
151     if (hasLinkTextIndicator) {
152         WebCore::TextIndicatorData indicatorData;
153         if (!decoder.decode(indicatorData))
154             return false;
155
156         actionMenuHitTestResult.linkTextIndicator = WebCore::TextIndicator::create(indicatorData);
157     }
158
159     return true;
160 }
161     
162 } // namespace WebKit
163
164 #endif // PLATFORM(MAC)