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

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

Issue 2565283002: Fix webkitGetEntry for non-native files. (Closed)
Patch Set: Rebased. 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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 if (!internalAddStringItem(item)) 99 if (!internalAddStringItem(item))
100 return nullptr; 100 return nullptr;
101 return item; 101 return item;
102 } 102 }
103 103
104 DataObjectItem* DataObject::add(File* file) { 104 DataObjectItem* DataObject::add(File* file) {
105 if (!file) 105 if (!file)
106 return nullptr; 106 return nullptr;
107 107
108 DataObjectItem* item = DataObjectItem::createFromFile(file); 108 DataObjectItem* item = DataObjectItem::createFromFile(file);
109 m_itemList.push_back(item); 109 internalAddFileItem(item);
110 return item; 110 return item;
111 } 111 }
112 112
113 DataObjectItem* DataObject::add(File* file, const String& fileSystemId) {
114 if (!file)
115 return nullptr;
116
117 DataObjectItem* item =
118 DataObjectItem::createFromFileWithFileSystemId(file, fileSystemId);
119 internalAddFileItem(item);
120 return item;
121 }
122
113 void DataObject::clearData(const String& type) { 123 void DataObject::clearData(const String& type) {
114 for (size_t i = 0; i < m_itemList.size(); ++i) { 124 for (size_t i = 0; i < m_itemList.size(); ++i) {
115 if (m_itemList[i]->kind() == DataObjectItem::StringKind && 125 if (m_itemList[i]->kind() == DataObjectItem::StringKind &&
116 m_itemList[i]->type() == type) { 126 m_itemList[i]->type() == type) {
117 // Per the spec, type must be unique among all items of kind 'string'. 127 // Per the spec, type must be unique among all items of kind 'string'.
118 m_itemList.remove(i); 128 m_itemList.remove(i);
119 return; 129 return;
120 } 130 }
121 } 131 }
122 } 132 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 Vector<String> DataObject::filenames() const { 209 Vector<String> DataObject::filenames() const {
200 Vector<String> results; 210 Vector<String> results;
201 for (size_t i = 0; i < m_itemList.size(); ++i) { 211 for (size_t i = 0; i < m_itemList.size(); ++i) {
202 if (m_itemList[i]->isFilename()) 212 if (m_itemList[i]->isFilename())
203 results.push_back(toFile(m_itemList[i]->getAsFile())->path()); 213 results.push_back(toFile(m_itemList[i]->getAsFile())->path());
204 } 214 }
205 return results; 215 return results;
206 } 216 }
207 217
208 void DataObject::addFilename(const String& filename, 218 void DataObject::addFilename(const String& filename,
209 const String& displayName) { 219 const String& displayName,
210 internalAddFileItem(DataObjectItem::createFromFile( 220 const String& fileSystemId) {
211 File::createForUserProvidedFile(filename, displayName))); 221 internalAddFileItem(DataObjectItem::createFromFileWithFileSystemId(
222 File::createForUserProvidedFile(filename, displayName), fileSystemId));
212 } 223 }
213 224
214 void DataObject::addSharedBuffer(const String& name, 225 void DataObject::addSharedBuffer(const String& name,
215 PassRefPtr<SharedBuffer> buffer) { 226 PassRefPtr<SharedBuffer> buffer) {
216 internalAddFileItem( 227 internalAddFileItem(
217 DataObjectItem::createFromSharedBuffer(name, std::move(buffer))); 228 DataObjectItem::createFromSharedBuffer(name, std::move(buffer)));
218 } 229 }
219 230
220 DataObject::DataObject() : m_modifiers(0) {} 231 DataObject::DataObject() : m_modifiers(0) {}
221 232
(...skipping 23 matching lines...) Expand all
245 m_itemList.push_back(item); 256 m_itemList.push_back(item);
246 } 257 }
247 258
248 DEFINE_TRACE(DataObject) { 259 DEFINE_TRACE(DataObject) {
249 visitor->trace(m_itemList); 260 visitor->trace(m_itemList);
250 Supplementable<DataObject>::trace(visitor); 261 Supplementable<DataObject>::trace(visitor);
251 } 262 }
252 263
253 DataObject* DataObject::create(WebDragData data) { 264 DataObject* DataObject::create(WebDragData data) {
254 DataObject* dataObject = create(); 265 DataObject* dataObject = create();
266 bool hasFileSystem = false;
255 267
256 WebVector<WebDragData::Item> items = data.items(); 268 WebVector<WebDragData::Item> items = data.items();
257 for (unsigned i = 0; i < items.size(); ++i) { 269 for (unsigned i = 0; i < items.size(); ++i) {
258 WebDragData::Item item = items[i]; 270 WebDragData::Item item = items[i];
259 271
260 switch (item.storageType) { 272 switch (item.storageType) {
261 case WebDragData::Item::StorageTypeString: 273 case WebDragData::Item::StorageTypeString:
262 if (String(item.stringType) == mimeTypeTextURIList) 274 if (String(item.stringType) == mimeTypeTextURIList)
263 dataObject->setURLAndTitle(item.stringData, item.title); 275 dataObject->setURLAndTitle(item.stringData, item.title);
264 else if (String(item.stringType) == mimeTypeTextHTML) 276 else if (String(item.stringType) == mimeTypeTextHTML)
265 dataObject->setHTMLAndBaseURL(item.stringData, item.baseURL); 277 dataObject->setHTMLAndBaseURL(item.stringData, item.baseURL);
266 else 278 else
267 dataObject->setData(item.stringType, item.stringData); 279 dataObject->setData(item.stringType, item.stringData);
268 break; 280 break;
269 case WebDragData::Item::StorageTypeFilename: 281 case WebDragData::Item::StorageTypeFilename:
270 dataObject->addFilename(item.filenameData, item.displayNameData); 282 hasFileSystem = true;
283 dataObject->addFilename(item.filenameData, item.displayNameData,
284 data.filesystemId());
271 break; 285 break;
272 case WebDragData::Item::StorageTypeBinaryData: 286 case WebDragData::Item::StorageTypeBinaryData:
273 // This should never happen when dragging in. 287 // This should never happen when dragging in.
274 break; 288 break;
275 case WebDragData::Item::StorageTypeFileSystemFile: { 289 case WebDragData::Item::StorageTypeFileSystemFile: {
276 // FIXME: The file system URL may refer a user visible file, see 290 // FIXME: The file system URL may refer a user visible file, see
277 // http://crbug.com/429077 291 // http://crbug.com/429077
292 hasFileSystem = true;
278 FileMetadata fileMetadata; 293 FileMetadata fileMetadata;
279 fileMetadata.length = item.fileSystemFileSize; 294 fileMetadata.length = item.fileSystemFileSize;
280 dataObject->add(File::createForFileSystemFile( 295
281 item.fileSystemURL, fileMetadata, File::IsNotUserVisible)); 296 dataObject->add(
297 File::createForFileSystemFile(item.fileSystemURL, fileMetadata,
298 File::IsNotUserVisible),
299 item.fileSystemId);
282 } break; 300 } break;
283 } 301 }
284 } 302 }
285 303
286 if (!data.filesystemId().isNull()) 304 dataObject->setFilesystemId(data.filesystemId());
287 DraggedIsolatedFileSystem::prepareForDataObject(dataObject, 305
288 data.filesystemId()); 306 if (hasFileSystem)
307 DraggedIsolatedFileSystem::prepareForDataObject(dataObject);
308
289 return dataObject; 309 return dataObject;
290 } 310 }
291 311
292 WebDragData DataObject::toWebDragData() { 312 WebDragData DataObject::toWebDragData() {
293 WebDragData data; 313 WebDragData data;
294 data.initialize(); 314 data.initialize();
295 data.setModifierKeyState(m_modifiers); 315 data.setModifierKeyState(m_modifiers);
296 WebVector<WebDragData::Item> itemList(length()); 316 WebVector<WebDragData::Item> itemList(length());
297 317
298 for (size_t i = 0; i < length(); ++i) { 318 for (size_t i = 0; i < length(); ++i) {
(...skipping 12 matching lines...) Expand all
311 if (blob->isFile()) { 331 if (blob->isFile()) {
312 File* file = toFile(blob); 332 File* file = toFile(blob);
313 if (file->hasBackingFile()) { 333 if (file->hasBackingFile()) {
314 item.storageType = WebDragData::Item::StorageTypeFilename; 334 item.storageType = WebDragData::Item::StorageTypeFilename;
315 item.filenameData = file->path(); 335 item.filenameData = file->path();
316 item.displayNameData = file->name(); 336 item.displayNameData = file->name();
317 } else if (!file->fileSystemURL().isEmpty()) { 337 } else if (!file->fileSystemURL().isEmpty()) {
318 item.storageType = WebDragData::Item::StorageTypeFileSystemFile; 338 item.storageType = WebDragData::Item::StorageTypeFileSystemFile;
319 item.fileSystemURL = file->fileSystemURL(); 339 item.fileSystemURL = file->fileSystemURL();
320 item.fileSystemFileSize = file->size(); 340 item.fileSystemFileSize = file->size();
341 item.fileSystemId = originalItem->fileSystemId();
321 } else { 342 } else {
322 // FIXME: support dragging constructed Files across renderers, see 343 // FIXME: support dragging constructed Files across renderers, see
323 // http://crbug.com/394955 344 // http://crbug.com/394955
324 item.storageType = WebDragData::Item::StorageTypeString; 345 item.storageType = WebDragData::Item::StorageTypeString;
325 item.stringType = "text/plain"; 346 item.stringType = "text/plain";
326 item.stringData = file->name(); 347 item.stringData = file->name();
327 } 348 }
328 } else { 349 } else {
329 ASSERT_NOT_REACHED(); 350 ASSERT_NOT_REACHED();
330 } 351 }
331 } else { 352 } else {
332 ASSERT_NOT_REACHED(); 353 ASSERT_NOT_REACHED();
333 } 354 }
334 } else { 355 } else {
335 ASSERT_NOT_REACHED(); 356 ASSERT_NOT_REACHED();
336 } 357 }
337 item.title = originalItem->title(); 358 item.title = originalItem->title();
338 item.baseURL = originalItem->baseURL(); 359 item.baseURL = originalItem->baseURL();
339 itemList[i] = item; 360 itemList[i] = item;
340 } 361 }
341 data.swapItems(itemList); 362 data.swapItems(itemList);
342 return data; 363 return data;
343 } 364 }
344 365
345 } // namespace blink 366 } // 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