d1d2308ad995acf9c7a5f53ded9fd2a080eecf75
[WebKit.git] / Source / WebCore / platform / PasteboardItemInfo.h
1 /*
2  * Copyright (C) 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 #pragma once
27
28 #include <wtf/Optional.h>
29 #include <wtf/Vector.h>
30 #include <wtf/text/WTFString.h>
31
32 namespace WebCore {
33
34 enum class PasteboardItemPresentationStyle {
35     Unspecified,
36     Inline,
37     Attachment
38 };
39
40 struct PresentationSize {
41     Optional<double> width;
42     Optional<double> height;
43
44     template<class Encoder> void encode(Encoder&) const;
45     template<class Decoder> static Optional<PresentationSize> decode(Decoder&);
46 };
47
48 template<class Encoder>
49 void PresentationSize::encode(Encoder& encoder) const
50 {
51     encoder << width << height;
52 }
53
54 template<class Decoder>
55 Optional<PresentationSize> PresentationSize::decode(Decoder& decoder)
56 {
57     PresentationSize result;
58     if (!decoder.decode(result.width))
59         return WTF::nullopt;
60
61     if (!decoder.decode(result.height))
62         return WTF::nullopt;
63
64     return WTFMove(result);
65 }
66
67 struct PasteboardItemInfo {
68     Vector<String> pathsForFileUpload;
69     Vector<String> contentTypesForFileUpload;
70     Vector<String> contentTypesByFidelity;
71     String suggestedFileName;
72     PresentationSize preferredPresentationSize;
73     bool isNonTextType { false };
74     bool containsFileURLAndFileUploadContent { false };
75     PasteboardItemPresentationStyle preferredPresentationStyle { PasteboardItemPresentationStyle::Unspecified };
76
77     String pathForContentType(const String& type) const
78     {
79         ASSERT(pathsForFileUpload.size() == contentTypesForFileUpload.size());
80         auto index = contentTypesForFileUpload.find(type);
81         if (index == notFound)
82             return { };
83
84         return pathsForFileUpload[index];
85     }
86
87     // The preferredPresentationStyle flag is platform API used by drag or copy sources to explicitly indicate
88     // that the data being written to the item provider should be treated as an attachment; unfortunately, not
89     // all clients attempt to set this flag, so we additionally take having a suggested filename as a strong
90     // indicator that the item should be treated as an attachment or file.
91     bool canBeTreatedAsAttachmentOrFile() const
92     {
93         switch (preferredPresentationStyle) {
94         case PasteboardItemPresentationStyle::Inline:
95             return false;
96         case PasteboardItemPresentationStyle::Attachment:
97             return true;
98         case PasteboardItemPresentationStyle::Unspecified:
99             return !suggestedFileName.isEmpty();
100         }
101         ASSERT_NOT_REACHED();
102         return false;
103     }
104
105     String contentTypeForHighestFidelityItem() const
106     {
107         if (contentTypesForFileUpload.isEmpty())
108             return { };
109
110         return contentTypesForFileUpload.first();
111     }
112
113     String pathForHighestFidelityItem() const
114     {
115         if (pathsForFileUpload.isEmpty())
116             return { };
117
118         return pathsForFileUpload.first();
119     }
120
121     template<class Encoder> void encode(Encoder&) const;
122     template<class Decoder> static Optional<PasteboardItemInfo> decode(Decoder&);
123 };
124
125 template<class Encoder>
126 void PasteboardItemInfo::encode(Encoder& encoder) const
127 {
128     encoder << pathsForFileUpload << contentTypesForFileUpload << contentTypesByFidelity << suggestedFileName << preferredPresentationSize << isNonTextType << containsFileURLAndFileUploadContent;
129     encoder.encodeEnum(preferredPresentationStyle);
130 }
131
132 template<class Decoder>
133 Optional<PasteboardItemInfo> PasteboardItemInfo::decode(Decoder& decoder)
134 {
135     PasteboardItemInfo result;
136     if (!decoder.decode(result.pathsForFileUpload))
137         return WTF::nullopt;
138
139     if (!decoder.decode(result.contentTypesForFileUpload))
140         return WTF::nullopt;
141
142     if (!decoder.decode(result.contentTypesByFidelity))
143         return WTF::nullopt;
144
145     if (!decoder.decode(result.suggestedFileName))
146         return WTF::nullopt;
147
148     if (!decoder.decode(result.preferredPresentationSize))
149         return WTF::nullopt;
150
151     if (!decoder.decode(result.isNonTextType))
152         return WTF::nullopt;
153
154     if (!decoder.decode(result.containsFileURLAndFileUploadContent))
155         return WTF::nullopt;
156
157     if (!decoder.decodeEnum(result.preferredPresentationStyle))
158         return WTF::nullopt;
159
160     return WTFMove(result);
161 }
162
163 }
164
165 namespace WTF {
166
167 template<> struct EnumTraits<WebCore::PasteboardItemPresentationStyle> {
168     using values = EnumValues<
169         WebCore::PasteboardItemPresentationStyle,
170         WebCore::PasteboardItemPresentationStyle::Unspecified,
171         WebCore::PasteboardItemPresentationStyle::Inline,
172         WebCore::PasteboardItemPresentationStyle::Attachment
173     >;
174 };
175
176 } // namespace WTF