[iOS] Remove soft linking of MobileCoreServices.framework
[WebKit-https.git] / Source / WebCore / platform / ios / PlatformPasteboardIOS.mm
1 /*
2  * Copyright (C) 2013 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "PlatformPasteboard.h"
28
29 #import "Color.h"
30 #import "URL.h"
31 #import "Image.h"
32 #import "Pasteboard.h"
33 #import "SharedBuffer.h"
34 #import "SoftLinking.h"
35 #import <MobileCoreServices/MobileCoreServices.h>
36
37 SOFT_LINK_FRAMEWORK(UIKit)
38 SOFT_LINK_CLASS(UIKit, UIPasteboard)
39
40 @interface UIPasteboard
41 + (UIPasteboard *)generalPasteboard;
42 - (void)setItems:(NSArray *)items;
43 @property(readonly,nonatomic) NSInteger numberOfItems;
44 - (NSArray *)dataForPasteboardType:(NSString *)pasteboardType inItemSet:(NSIndexSet *)itemSet;
45 - (NSArray *)valuesForPasteboardType:(NSString *)pasteboardType inItemSet:(NSIndexSet *)itemSet;
46 - (NSInteger)changeCount;
47 @end
48
49 namespace WebCore {
50
51 PlatformPasteboard::PlatformPasteboard()
52     : m_pasteboard([getUIPasteboardClass() generalPasteboard])
53 {
54 }
55
56 PlatformPasteboard::PlatformPasteboard(const String&)
57     : m_pasteboard([getUIPasteboardClass() generalPasteboard])
58 {
59 }
60
61 void PlatformPasteboard::getTypes(Vector<String>&)
62 {
63 }
64
65 RefPtr<SharedBuffer> PlatformPasteboard::bufferForType(const String&)
66 {
67     return nullptr;
68 }
69
70 void PlatformPasteboard::getPathnamesForType(Vector<String>&, const String&)
71 {
72 }
73
74 String PlatformPasteboard::stringForType(const String&)
75 {
76     return String();
77 }
78
79 Color PlatformPasteboard::color()
80 {
81     return Color();
82 }
83
84 URL PlatformPasteboard::url()
85 {
86     return URL();
87 }
88
89 long PlatformPasteboard::copy(const String&)
90 {
91     return 0;
92 }
93
94 long PlatformPasteboard::addTypes(const Vector<String>&)
95 {
96     return 0;
97 }
98
99 long PlatformPasteboard::setTypes(const Vector<String>&)
100 {
101     return 0;
102 }
103
104 long PlatformPasteboard::setBufferForType(SharedBuffer*, const String&)
105 {
106     return 0;
107 }
108
109 long PlatformPasteboard::setPathnamesForType(const Vector<String>&, const String&)
110 {
111     return 0;
112 }
113
114 long PlatformPasteboard::setStringForType(const String&, const String&)
115 {
116     return 0;
117 }
118
119 long PlatformPasteboard::changeCount() const
120 {
121     return [m_pasteboard changeCount];
122 }
123
124 String PlatformPasteboard::uniqueName()
125 {
126     return String();
127 }
128
129 void PlatformPasteboard::write(const PasteboardWebContent& content)
130 {
131     RetainPtr<NSDictionary> representations = adoptNS([[NSMutableDictionary alloc] init]);
132
133     if (content.dataInWebArchiveFormat) {
134         [representations setValue:(NSData *)content.dataInWebArchiveFormat->createNSData().get() forKey:WebArchivePboardType];
135         // Flag for UIKit to know that this copy contains rich content. This will trigger a two-step paste.
136         NSString* webIOSPastePboardType = @"iOS rich content paste pasteboard type";
137         [representations setValue:webIOSPastePboardType forKey:webIOSPastePboardType];
138     }
139
140     if (content.dataInRTFDFormat)
141         [representations setValue:content.dataInRTFDFormat->createNSData().get() forKey:(NSString *)kUTTypeFlatRTFD];
142     if (content.dataInRTFFormat)
143         [representations setValue:content.dataInRTFFormat->createNSData().get() forKey:(NSString *)kUTTypeRTF];
144     [representations setValue:content.dataInStringFormat forKey:(NSString *)kUTTypeText];
145     [m_pasteboard setItems:@[representations.get()]];
146 }
147
148 void PlatformPasteboard::write(const PasteboardImage& pasteboardImage)
149 {
150     RetainPtr<NSMutableDictionary> representations = adoptNS([[NSMutableDictionary alloc] init]);
151     if (!pasteboardImage.resourceMIMEType.isNull()) {
152         [representations setObject:pasteboardImage.resourceData->createNSData().get() forKey:pasteboardImage.resourceMIMEType];
153         [representations setObject:(NSURL *)pasteboardImage.url.url forKey:(NSString *)kUTTypeURL];
154     }
155     [m_pasteboard setItems:@[representations.get()]];
156 }
157
158 void PlatformPasteboard::write(const String& pasteboardType, const String& text)
159 {
160     RetainPtr<NSDictionary> representations = adoptNS([[NSMutableDictionary alloc] init]);
161
162     if (pasteboardType == String(kUTTypeURL)) {
163         [representations setValue:adoptNS([[NSURL alloc] initWithString:text]).get() forKey:pasteboardType];
164         [representations setValue:text forKey:(NSString *)kUTTypeText];
165     } else if (!pasteboardType.isNull())
166         [representations setValue:text forKey:pasteboardType];
167     [m_pasteboard setItems:@[representations.get()]];
168 }
169
170 int PlatformPasteboard::count()
171 {
172     return [m_pasteboard numberOfItems];
173 }
174
175 RefPtr<SharedBuffer> PlatformPasteboard::readBuffer(int index, const String& type)
176 {
177     NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:index];
178
179     RetainPtr<NSArray> pasteboardItem = [m_pasteboard dataForPasteboardType:type inItemSet:indexSet];
180
181     if (![pasteboardItem count])
182         return nullptr;
183     return SharedBuffer::wrapNSData([pasteboardItem.get() objectAtIndex:0]);
184 }
185
186 String PlatformPasteboard::readString(int index, const String& type)
187 {
188     NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:index];
189
190     RetainPtr<NSArray> pasteboardItem = [m_pasteboard valuesForPasteboardType:type inItemSet:indexSet];
191
192     if (![pasteboardItem count])
193         return String();
194
195     id value = [pasteboardItem objectAtIndex:0];
196     
197     if (type == String(kUTTypeText)) {
198         ASSERT([value isKindOfClass:[NSString class]]);
199         if ([value isKindOfClass:[NSString class]])
200             return String(value);
201     } else if (type == String(kUTTypeURL)) {
202         ASSERT([value isKindOfClass:[NSURL class]]);
203         if ([value isKindOfClass:[NSURL class]])
204             return [(NSURL *)value absoluteString];
205     }
206
207     return String();
208 }
209
210 URL PlatformPasteboard::readURL(int index, const String& type)
211 {
212     NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:index];
213
214     RetainPtr<NSArray> pasteboardItem = [m_pasteboard valuesForPasteboardType:type inItemSet:indexSet];
215
216     if (![pasteboardItem count])
217         return URL();
218
219     id value = [pasteboardItem objectAtIndex:0];
220     ASSERT([value isKindOfClass:[NSURL class]]);
221     if (![value isKindOfClass:[NSURL class]])
222         return URL();
223
224     return (NSURL *)value;
225 }
226
227 }