OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | |
3 * Copyright (C) 2012 Baidu Inc. All rights reserved. | |
4 * | |
5 * Redistribution and use in source and binary forms, with or without | |
6 * modification, are permitted provided that the following conditions | |
7 * are met: | |
8 * 1. Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * 2. Redistributions in binary form must reproduce the above copyright | |
11 * notice, this list of conditions and the following disclaimer in the | |
12 * documentation and/or other materials provided with the distribution. | |
13 * | |
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | |
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | |
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
25 */ | |
26 | |
27 #include "config.h" | |
28 #include "DragData.h" | |
29 | |
30 #include "COMPtr.h" | |
31 #include "ClipboardUtilitiesWin.h" | |
32 #include "Frame.h" | |
33 #include "DocumentFragment.h" | |
34 #include "Markup.h" | |
35 #include "TextEncoding.h" | |
36 #include <objidl.h> | |
37 #include <shlwapi.h> | |
38 #include <wininet.h> | |
39 #include <wtf/Forward.h> | |
40 #include <wtf/Hashmap.h> | |
41 #include <wtf/PassRefPtr.h> | |
42 #include <wtf/RefPtr.h> | |
43 #include <wtf/text/WTFString.h> | |
44 | |
45 namespace WebCore { | |
46 | |
47 DragData::DragData(const DragDataMap& data, const IntPoint& clientPosition, cons
t IntPoint& globalPosition, | |
48 DragOperation sourceOperationMask, DragApplicationFlags flags) | |
49 : m_clientPosition(clientPosition) | |
50 , m_globalPosition(globalPosition) | |
51 , m_platformDragData(0) | |
52 , m_draggingSourceOperationMask(sourceOperationMask) | |
53 , m_applicationFlags(flags) | |
54 , m_dragDataMap(data) | |
55 { | |
56 } | |
57 | |
58 bool DragData::containsURL(Frame*, FilenameConversionPolicy filenamePolicy) cons
t | |
59 { | |
60 if (m_platformDragData) | |
61 return SUCCEEDED(m_platformDragData->QueryGetData(urlWFormat())) | |
62 || SUCCEEDED(m_platformDragData->QueryGetData(urlFormat())) | |
63 || (filenamePolicy == ConvertFilenames | |
64 && (SUCCEEDED(m_platformDragData->QueryGetData(filenameWFormat()
)) | |
65 || SUCCEEDED(m_platformDragData->QueryGetData(filenameFormat
())))); | |
66 return m_dragDataMap.contains(urlWFormat()->cfFormat) || m_dragDataMap.conta
ins(urlFormat()->cfFormat) | |
67 || (filenamePolicy == ConvertFilenames && (m_dragDataMap.contains(filena
meWFormat()->cfFormat) || m_dragDataMap.contains(filenameFormat()->cfFormat))); | |
68 } | |
69 | |
70 const DragDataMap& DragData::dragDataMap() | |
71 { | |
72 if (!m_dragDataMap.isEmpty() || !m_platformDragData) | |
73 return m_dragDataMap; | |
74 // Enumerate clipboard content and load it in the map. | |
75 COMPtr<IEnumFORMATETC> itr; | |
76 | |
77 if (FAILED(m_platformDragData->EnumFormatEtc(DATADIR_GET, &itr)) || !itr) | |
78 return m_dragDataMap; | |
79 | |
80 FORMATETC dataFormat; | |
81 while (itr->Next(1, &dataFormat, 0) == S_OK) { | |
82 Vector<String> dataStrings; | |
83 getClipboardData(m_platformDragData, &dataFormat, dataStrings); | |
84 if (!dataStrings.isEmpty()) | |
85 m_dragDataMap.set(dataFormat.cfFormat, dataStrings); | |
86 } | |
87 return m_dragDataMap; | |
88 } | |
89 | |
90 void DragData::getDragFileDescriptorData(int& size, String& pathname) | |
91 { | |
92 size = 0; | |
93 if (m_platformDragData) | |
94 getFileDescriptorData(m_platformDragData, size, pathname); | |
95 } | |
96 | |
97 void DragData::getDragFileContentData(int size, void* dataBlob) | |
98 { | |
99 if (m_platformDragData) | |
100 getFileContentData(m_platformDragData, size, dataBlob); | |
101 } | |
102 | |
103 String DragData::asURL(Frame*, FilenameConversionPolicy filenamePolicy, String*
title) const | |
104 { | |
105 return (m_platformDragData) ? getURL(m_platformDragData, filenamePolicy, tit
le) : getURL(&m_dragDataMap, filenamePolicy, title); | |
106 } | |
107 | |
108 bool DragData::containsFiles() const | |
109 { | |
110 #if OS(WINCE) | |
111 return false; | |
112 #else | |
113 return (m_platformDragData) ? SUCCEEDED(m_platformDragData->QueryGetData(cfH
DropFormat())) : m_dragDataMap.contains(cfHDropFormat()->cfFormat); | |
114 #endif | |
115 } | |
116 | |
117 unsigned DragData::numberOfFiles() const | |
118 { | |
119 #if OS(WINCE) | |
120 return 0; | |
121 #else | |
122 if (!m_platformDragData) | |
123 return 0; | |
124 | |
125 STGMEDIUM medium; | |
126 if (FAILED(m_platformDragData->GetData(cfHDropFormat(), &medium))) | |
127 return 0; | |
128 | |
129 HDROP hdrop = static_cast<HDROP>(GlobalLock(medium.hGlobal)); | |
130 | |
131 if (!hdrop) | |
132 return 0; | |
133 | |
134 unsigned numFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, 0, 0); | |
135 | |
136 DragFinish(hdrop); | |
137 GlobalUnlock(medium.hGlobal); | |
138 | |
139 return numFiles; | |
140 #endif | |
141 } | |
142 | |
143 void DragData::asFilenames(Vector<String>& result) const | |
144 { | |
145 #if !OS(WINCE) | |
146 if (m_platformDragData) { | |
147 WCHAR filename[MAX_PATH]; | |
148 | |
149 STGMEDIUM medium; | |
150 if (FAILED(m_platformDragData->GetData(cfHDropFormat(), &medium))) | |
151 return; | |
152 | |
153 HDROP hdrop = reinterpret_cast<HDROP>(GlobalLock(medium.hGlobal)); | |
154 | |
155 if (!hdrop) | |
156 return; | |
157 | |
158 const unsigned numFiles = DragQueryFileW(hdrop, 0xFFFFFFFF, 0, 0); | |
159 for (unsigned i = 0; i < numFiles; i++) { | |
160 if (!DragQueryFileW(hdrop, i, filename, WTF_ARRAY_LENGTH(filename))) | |
161 continue; | |
162 result.append(static_cast<UChar*>(filename)); | |
163 } | |
164 | |
165 // Free up memory from drag | |
166 DragFinish(hdrop); | |
167 | |
168 GlobalUnlock(medium.hGlobal); | |
169 return; | |
170 } | |
171 result = m_dragDataMap.get(cfHDropFormat()->cfFormat); | |
172 #endif | |
173 } | |
174 | |
175 bool DragData::containsPlainText() const | |
176 { | |
177 if (m_platformDragData) | |
178 return SUCCEEDED(m_platformDragData->QueryGetData(plainTextWFormat())) | |
179 || SUCCEEDED(m_platformDragData->QueryGetData(plainTextFormat())); | |
180 return m_dragDataMap.contains(plainTextWFormat()->cfFormat) || m_dragDataMap
.contains(plainTextFormat()->cfFormat); | |
181 } | |
182 | |
183 String DragData::asPlainText(Frame*) const | |
184 { | |
185 return (m_platformDragData) ? getPlainText(m_platformDragData) : getPlainTex
t(&m_dragDataMap); | |
186 } | |
187 | |
188 bool DragData::containsColor() const | |
189 { | |
190 return false; | |
191 } | |
192 | |
193 bool DragData::canSmartReplace() const | |
194 { | |
195 if (m_platformDragData) | |
196 return SUCCEEDED(m_platformDragData->QueryGetData(smartPasteFormat())); | |
197 return m_dragDataMap.contains(smartPasteFormat()->cfFormat); | |
198 } | |
199 | |
200 bool DragData::containsCompatibleContent() const | |
201 { | |
202 return containsPlainText() || containsURL(0) | |
203 || ((m_platformDragData) ? (containsHTML(m_platformDragData) || contains
Filenames(m_platformDragData)) | |
204 : (containsHTML(&m_dragDataMap) || containsFilenames(&m_dragDataMap)
)) | |
205 || containsColor(); | |
206 } | |
207 | |
208 PassRefPtr<DocumentFragment> DragData::asFragment(Frame* frame, PassRefPtr<Range
>, bool, bool&) const | |
209 { | |
210 /* | |
211 * Order is richest format first. On OSX this is: | |
212 * * Web Archive | |
213 * * Filenames | |
214 * * HTML | |
215 * * RTF | |
216 * * TIFF | |
217 * * PICT | |
218 */ | |
219 | |
220 if (m_platformDragData) { | |
221 if (containsFilenames(m_platformDragData)) { | |
222 if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(fr
ame->document(), m_platformDragData)) | |
223 return fragment; | |
224 } | |
225 | |
226 if (containsHTML(m_platformDragData)) { | |
227 if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->
document(), m_platformDragData)) | |
228 return fragment; | |
229 } | |
230 } else { | |
231 if (containsFilenames(&m_dragDataMap)) { | |
232 if (PassRefPtr<DocumentFragment> fragment = fragmentFromFilenames(fr
ame->document(), &m_dragDataMap)) | |
233 return fragment; | |
234 } | |
235 | |
236 if (containsHTML(&m_dragDataMap)) { | |
237 if (PassRefPtr<DocumentFragment> fragment = fragmentFromHTML(frame->
document(), &m_dragDataMap)) | |
238 return fragment; | |
239 } | |
240 } | |
241 return 0; | |
242 } | |
243 | |
244 Color DragData::asColor() const | |
245 { | |
246 return Color(); | |
247 } | |
248 | |
249 } | |
OLD | NEW |