0c90e43c667e6fe4cc46c4d8cdb2a8907b4e5162
[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 #import "ArgumentCodersCF.h"
30 #import "ArgumentDecoder.h"
31 #import "ArgumentEncoder.h"
32 #import "TextIndicator.h"
33 #import "WebCoreArgumentCoders.h"
34 #import <WebCore/DataDetectorsSPI.h>
35
36 namespace WebKit {
37
38 void ActionMenuHitTestResult::encode(IPC::ArgumentEncoder& encoder) const
39 {
40     encoder << hitTestLocationInViewCooordinates;
41     encoder << hitTestResult;
42     encoder << lookupText;
43
44     ShareableBitmap::Handle handle;
45
46     // FIXME: We should consider sharing the raw original resource data so that metadata and whatnot are preserved.
47     if (image)
48         image->createHandle(handle, SharedMemory::ReadOnly);
49
50     encoder << handle;
51
52     bool hasActionContext = actionContext;
53     encoder << hasActionContext;
54     if (hasActionContext) {
55         RetainPtr<NSMutableData> data = adoptNS([[NSMutableData alloc] init]);
56         RetainPtr<NSKeyedArchiver> archiver = adoptNS([[NSKeyedArchiver alloc] initForWritingWithMutableData:data.get()]);
57         [archiver setRequiresSecureCoding:YES];
58         [archiver encodeObject:actionContext.get() forKey:@"actionContext"];
59         [archiver finishEncoding];
60
61         IPC::encode(encoder, reinterpret_cast<CFDataRef>(data.get()));
62
63         encoder << detectedDataBoundingBox;
64
65         bool hasTextIndicator = detectedDataTextIndicator;
66         encoder << hasTextIndicator;
67         if (hasTextIndicator)
68             encoder << detectedDataTextIndicator->data();
69     }
70 }
71
72 bool ActionMenuHitTestResult::decode(IPC::ArgumentDecoder& decoder, ActionMenuHitTestResult& actionMenuHitTestResult)
73 {
74     if (!decoder.decode(actionMenuHitTestResult.hitTestLocationInViewCooordinates))
75         return false;
76
77     if (!decoder.decode(actionMenuHitTestResult.hitTestResult))
78         return false;
79
80     if (!decoder.decode(actionMenuHitTestResult.lookupText))
81         return false;
82
83     ShareableBitmap::Handle handle;
84     if (!decoder.decode(handle))
85         return false;
86
87     if (!handle.isNull())
88         actionMenuHitTestResult.image = ShareableBitmap::create(handle, SharedMemory::ReadOnly);
89
90     bool hasActionContext;
91     if (!decoder.decode(hasActionContext))
92         return false;
93
94     if (hasActionContext) {
95         RetainPtr<CFDataRef> data;
96         if (!IPC::decode(decoder, data))
97             return false;
98
99         RetainPtr<NSKeyedUnarchiver> unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)data.get()]);
100         [unarchiver setRequiresSecureCoding:YES];
101         @try {
102             actionMenuHitTestResult.actionContext = [unarchiver decodeObjectOfClass:getDDActionContextClass() forKey:@"actionContext"];
103         } @catch (NSException *exception) {
104             LOG_ERROR("Failed to decode DDActionContext: %@", exception);
105             return false;
106         }
107         
108         [unarchiver finishDecoding];
109
110         if (!decoder.decode(actionMenuHitTestResult.detectedDataBoundingBox))
111             return false;
112
113         bool hasTextIndicator;
114         if (!decoder.decode(hasTextIndicator))
115             return false;
116
117         if (hasTextIndicator) {
118             TextIndicator::Data indicatorData;
119             if (!decoder.decode(indicatorData))
120                 return false;
121
122             actionMenuHitTestResult.detectedDataTextIndicator = TextIndicator::create(indicatorData);
123         }
124     }
125
126     return true;
127 }
128     
129 } // namespace WebKit