| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |