dafed9f05b7cba351f17cfd8ef307a359091f67f
[WebKit-https.git] / Source / WebKit / Shared / Cocoa / DataDetectionResult.mm
1 /*
2  * Copyright (C) 2014-2017 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 "DataDetectionResult.h"
28
29 #import "ArgumentCodersCF.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 ENABLE(DATA_DETECTION)
41
42 void DataDetectionResult::encode(IPC::Encoder& encoder) const
43 {
44     auto archiver = secureArchiver();
45     [archiver encodeObject:results.get() forKey:@"dataDetectorResults"];
46     IPC::encode(encoder, (__bridge CFDataRef)archiver.get().encodedData);
47 }
48
49 std::optional<DataDetectionResult> DataDetectionResult::decode(IPC::Decoder& decoder)
50 {
51     RetainPtr<CFDataRef> data;
52     if (!IPC::decode(decoder, data))
53         return std::nullopt;
54
55     DataDetectionResult result;
56     auto unarchiver = secureUnarchiverFromData((__bridge NSData *)data.get());
57     @try {
58         result.results = [unarchiver decodeObjectOfClasses:[NSSet setWithArray:@[ [NSArray class], getDDScannerResultClass()] ] forKey:@"dataDetectorResults"];
59     } @catch (NSException *exception) {
60         LOG_ERROR("Failed to decode NSArray of DDScanResult: %@", exception);
61         return std::nullopt;
62     }
63     
64     [unarchiver finishDecoding];
65     return { WTFMove(result) };
66 }
67 #endif
68
69 }