Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: third_party/WebKit/Source/core/clipboard/DataObject.cpp

Issue 2582463002: Fix webkitGetEntry for non-native files. (Closed)
Patch Set: . Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2008, 2009, 2012 Google Inc. All rights reserved. 2 * Copyright (c) 2008, 2009, 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 if (!internalAddStringItem(item)) 93 if (!internalAddStringItem(item))
94 return nullptr; 94 return nullptr;
95 return item; 95 return item;
96 } 96 }
97 97
98 DataObjectItem* DataObject::add(File* file) { 98 DataObjectItem* DataObject::add(File* file) {
99 if (!file) 99 if (!file)
100 return nullptr; 100 return nullptr;
101 101
102 DataObjectItem* item = DataObjectItem::createFromFile(file); 102 DataObjectItem* item = DataObjectItem::createFromFile(file);
103 m_itemList.append(item); 103 internalAddFileItem(item);
104 return item; 104 return item;
105 } 105 }
106 106
107 DataObjectItem* DataObject::add(File* file, const String& fileSystemId) {
108 if (!file)
109 return nullptr;
110
111 DataObjectItem* item =
112 DataObjectItem::createFromFileWithFileSystemId(file, fileSystemId);
113 internalAddFileItem(item);
114 return item;
115 }
116
107 void DataObject::clearData(const String& type) { 117 void DataObject::clearData(const String& type) {
108 for (size_t i = 0; i < m_itemList.size(); ++i) { 118 for (size_t i = 0; i < m_itemList.size(); ++i) {
109 if (m_itemList[i]->kind() == DataObjectItem::StringKind && 119 if (m_itemList[i]->kind() == DataObjectItem::StringKind &&
110 m_itemList[i]->type() == type) { 120 m_itemList[i]->type() == type) {
111 // Per the spec, type must be unique among all items of kind 'string'. 121 // Per the spec, type must be unique among all items of kind 'string'.
112 m_itemList.remove(i); 122 m_itemList.remove(i);
113 return; 123 return;
114 } 124 }
115 } 125 }
116 } 126 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 Vector<String> DataObject::filenames() const { 203 Vector<String> DataObject::filenames() const {
194 Vector<String> results; 204 Vector<String> results;
195 for (size_t i = 0; i < m_itemList.size(); ++i) { 205 for (size_t i = 0; i < m_itemList.size(); ++i) {
196 if (m_itemList[i]->isFilename()) 206 if (m_itemList[i]->isFilename())
197 results.append(toFile(m_itemList[i]->getAsFile())->path()); 207 results.append(toFile(m_itemList[i]->getAsFile())->path());
198 } 208 }
199 return results; 209 return results;
200 } 210 }
201 211
202 void DataObject::addFilename(const String& filename, 212 void DataObject::addFilename(const String& filename,
203 const String& displayName) { 213 const String& displayName,
204 internalAddFileItem(DataObjectItem::createFromFile( 214 const String& fileSystemId) {
205 File::createForUserProvidedFile(filename, displayName))); 215 internalAddFileItem(DataObjectItem::createFromFileWithFileSystemId(
216 File::createForUserProvidedFile(filename, displayName), fileSystemId));
206 } 217 }
207 218
208 void DataObject::addSharedBuffer(const String& name, 219 void DataObject::addSharedBuffer(const String& name,
209 PassRefPtr<SharedBuffer> buffer) { 220 PassRefPtr<SharedBuffer> buffer) {
210 internalAddFileItem( 221 internalAddFileItem(
211 DataObjectItem::createFromSharedBuffer(name, std::move(buffer))); 222 DataObjectItem::createFromSharedBuffer(name, std::move(buffer)));
212 } 223 }
213 224
214 DataObject::DataObject() : m_modifiers(0) {} 225 DataObject::DataObject() : m_modifiers(0) {}
215 226
(...skipping 23 matching lines...) Expand all
239 m_itemList.append(item); 250 m_itemList.append(item);
240 } 251 }
241 252
242 DEFINE_TRACE(DataObject) { 253 DEFINE_TRACE(DataObject) {
243 visitor->trace(m_itemList); 254 visitor->trace(m_itemList);
244 Supplementable<DataObject>::trace(visitor); 255 Supplementable<DataObject>::trace(visitor);
245 } 256 }
246 257
247 DataObject* DataObject::create(WebDragData data) { 258 DataObject* DataObject::create(WebDragData data) {
248 DataObject* dataObject = create(); 259 DataObject* dataObject = create();
260 bool hasFileSystem = false;
249 261
250 WebVector<WebDragData::Item> items = data.items(); 262 WebVector<WebDragData::Item> items = data.items();
251 for (unsigned i = 0; i < items.size(); ++i) { 263 for (unsigned i = 0; i < items.size(); ++i) {
252 WebDragData::Item item = items[i]; 264 WebDragData::Item item = items[i];
253 265
254 switch (item.storageType) { 266 switch (item.storageType) {
255 case WebDragData::Item::StorageTypeString: 267 case WebDragData::Item::StorageTypeString:
256 if (String(item.stringType) == mimeTypeTextURIList) 268 if (String(item.stringType) == mimeTypeTextURIList)
257 dataObject->setURLAndTitle(item.stringData, item.title); 269 dataObject->setURLAndTitle(item.stringData, item.title);
258 else if (String(item.stringType) == mimeTypeTextHTML) 270 else if (String(item.stringType) == mimeTypeTextHTML)
259 dataObject->setHTMLAndBaseURL(item.stringData, item.baseURL); 271 dataObject->setHTMLAndBaseURL(item.stringData, item.baseURL);
260 else 272 else
261 dataObject->setData(item.stringType, item.stringData); 273 dataObject->setData(item.stringType, item.stringData);
262 break; 274 break;
263 case WebDragData::Item::StorageTypeFilename: 275 case WebDragData::Item::StorageTypeFilename:
264 dataObject->addFilename(item.filenameData, item.displayNameData); 276 hasFileSystem = true;
277 dataObject->addFilename(item.filenameData, item.displayNameData,
278 data.filesystemId());
265 break; 279 break;
266 case WebDragData::Item::StorageTypeBinaryData: 280 case WebDragData::Item::StorageTypeBinaryData:
267 // This should never happen when dragging in. 281 // This should never happen when dragging in.
268 break; 282 break;
269 case WebDragData::Item::StorageTypeFileSystemFile: { 283 case WebDragData::Item::StorageTypeFileSystemFile: {
270 // FIXME: The file system URL may refer a user visible file, see 284 // FIXME: The file system URL may refer a user visible file, see
271 // http://crbug.com/429077 285 // http://crbug.com/429077
286 hasFileSystem = true;
272 FileMetadata fileMetadata; 287 FileMetadata fileMetadata;
273 fileMetadata.length = item.fileSystemFileSize; 288 fileMetadata.length = item.fileSystemFileSize;
274 dataObject->add(File::createForFileSystemFile( 289
275 item.fileSystemURL, fileMetadata, File::IsNotUserVisible)); 290 dataObject->add(
291 File::createForFileSystemFile(item.fileSystemURL, fileMetadata,
292 File::IsNotUserVisible),
293 item.fileSystemId);
276 } break; 294 } break;
277 } 295 }
278 } 296 }
279 297
280 if (!data.filesystemId().isNull()) 298 dataObject->setFilesystemId(data.filesystemId());
281 DraggedIsolatedFileSystem::prepareForDataObject(dataObject, 299
282 data.filesystemId()); 300 if (hasFileSystem)
301 DraggedIsolatedFileSystem::prepareForDataObject(dataObject);
302
283 return dataObject; 303 return dataObject;
284 } 304 }
285 305
286 WebDragData DataObject::toWebDragData() { 306 WebDragData DataObject::toWebDragData() {
287 WebDragData data; 307 WebDragData data;
288 data.initialize(); 308 data.initialize();
289 data.setModifierKeyState(m_modifiers); 309 data.setModifierKeyState(m_modifiers);
290 WebVector<WebDragData::Item> itemList(length()); 310 WebVector<WebDragData::Item> itemList(length());
291 311
292 for (size_t i = 0; i < length(); ++i) { 312 for (size_t i = 0; i < length(); ++i) {
(...skipping 12 matching lines...) Expand all
305 if (blob->isFile()) { 325 if (blob->isFile()) {
306 File* file = toFile(blob); 326 File* file = toFile(blob);
307 if (file->hasBackingFile()) { 327 if (file->hasBackingFile()) {
308 item.storageType = WebDragData::Item::StorageTypeFilename; 328 item.storageType = WebDragData::Item::StorageTypeFilename;
309 item.filenameData = file->path(); 329 item.filenameData = file->path();
310 item.displayNameData = file->name(); 330 item.displayNameData = file->name();
311 } else if (!file->fileSystemURL().isEmpty()) { 331 } else if (!file->fileSystemURL().isEmpty()) {
312 item.storageType = WebDragData::Item::StorageTypeFileSystemFile; 332 item.storageType = WebDragData::Item::StorageTypeFileSystemFile;
313 item.fileSystemURL = file->fileSystemURL(); 333 item.fileSystemURL = file->fileSystemURL();
314 item.fileSystemFileSize = file->size(); 334 item.fileSystemFileSize = file->size();
335 item.fileSystemId = originalItem->fileSystemId();
315 } else { 336 } else {
316 // FIXME: support dragging constructed Files across renderers, see 337 // FIXME: support dragging constructed Files across renderers, see
317 // http://crbug.com/394955 338 // http://crbug.com/394955
318 item.storageType = WebDragData::Item::StorageTypeString; 339 item.storageType = WebDragData::Item::StorageTypeString;
319 item.stringType = "text/plain"; 340 item.stringType = "text/plain";
320 item.stringData = file->name(); 341 item.stringData = file->name();
321 } 342 }
322 } else { 343 } else {
323 ASSERT_NOT_REACHED(); 344 ASSERT_NOT_REACHED();
324 } 345 }
325 } else { 346 } else {
326 ASSERT_NOT_REACHED(); 347 ASSERT_NOT_REACHED();
327 } 348 }
328 } else { 349 } else {
329 ASSERT_NOT_REACHED(); 350 ASSERT_NOT_REACHED();
330 } 351 }
331 item.title = originalItem->title(); 352 item.title = originalItem->title();
332 item.baseURL = originalItem->baseURL(); 353 item.baseURL = originalItem->baseURL();
333 itemList[i] = item; 354 itemList[i] = item;
334 } 355 }
335 data.swapItems(itemList); 356 data.swapItems(itemList);
336 return data; 357 return data;
337 } 358 }
338 359
339 } // namespace blink 360 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/clipboard/DataObject.h ('k') | third_party/WebKit/Source/core/clipboard/DataObjectItem.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698