Index: Source/core/html/forms/FileInputType.cpp |
diff --git a/Source/core/html/forms/FileInputType.cpp b/Source/core/html/forms/FileInputType.cpp |
index 5c74604d1c3ab71f6f326edf3f8fe3683e0e25ab..120759f4700399a14b432e427543e5e88ee169f8 100644 |
--- a/Source/core/html/forms/FileInputType.cpp |
+++ b/Source/core/html/forms/FileInputType.cpp |
@@ -217,7 +217,7 @@ void FileInputType::setValue(const String&, bool valueChanged, TextFieldEventBeh |
element().setNeedsValidityCheck(); |
} |
-FileList* FileInputType::createFileList(const Vector<FileChooserFileInfo>& files) const |
+FileList* FileInputType::createFileList(const Vector<FileChooserFileInfo>& files, bool hasWebkitDirectoryAttr) |
{ |
FileList* fileList(FileList::create()); |
size_t size = files.size(); |
@@ -225,10 +225,10 @@ FileList* FileInputType::createFileList(const Vector<FileChooserFileInfo>& files |
// If a directory is being selected, the UI allows a directory to be chosen |
// and the paths provided here share a root directory somewhere up the tree; |
// we want to store only the relative paths from that point. |
- if (size && element().fastHasAttribute(webkitdirectoryAttr)) { |
+ if (size && hasWebkitDirectoryAttr) { |
// Find the common root path. |
String rootPath = directoryName(files[0].path); |
- for (size_t i = 1; i < size; i++) { |
+ for (size_t i = 1; i < size; ++i) { |
while (!files[i].path.startsWith(rootPath)) |
rootPath = directoryName(rootPath); |
} |
@@ -237,7 +237,7 @@ FileList* FileInputType::createFileList(const Vector<FileChooserFileInfo>& files |
int rootLength = rootPath.length(); |
if (rootPath[rootLength - 1] != '\\' && rootPath[rootLength - 1] != '/') |
rootLength += 1; |
- for (size_t i = 0; i < size; i++) { |
+ for (size_t i = 0; i < size; ++i) { |
// Normalize backslashes to slashes before exposing the relative path to script. |
String relativePath = files[i].path.substring(rootLength).replace('\\', '/'); |
fileList->append(File::createWithRelativePath(files[i].path, relativePath)); |
@@ -245,8 +245,13 @@ FileList* FileInputType::createFileList(const Vector<FileChooserFileInfo>& files |
return fileList; |
} |
- for (size_t i = 0; i < size; i++) |
- fileList->append(File::createForUserProvidedFile(files[i].path, files[i].displayName)); |
+ for (size_t i = 0; i < size; ++i) { |
+ if (files[i].fileSystemURL.isEmpty()) { |
+ fileList->append(File::createForUserProvidedFile(files[i].path, files[i].displayName)); |
+ } else { |
+ fileList->append(File::createForFileSystemFile(files[i].fileSystemURL, files[i].metadata)); |
+ } |
+ } |
return fileList; |
} |
@@ -281,13 +286,13 @@ void FileInputType::setFiles(FileList* files) |
RefPtrWillBeRawPtr<HTMLInputElement> input(element()); |
- bool pathsChanged = false; |
+ bool filesChanged = false; |
if (files->length() != m_fileList->length()) { |
- pathsChanged = true; |
+ filesChanged = true; |
} else { |
for (unsigned i = 0; i < files->length(); ++i) { |
- if (files->item(i)->path() != m_fileList->item(i)->path()) { |
- pathsChanged = true; |
+ if (!files->item(i)->hasSameSource(*m_fileList->item(i))) { |
+ filesChanged = true; |
break; |
} |
} |
@@ -301,7 +306,7 @@ void FileInputType::setFiles(FileList* files) |
if (input->renderer()) |
input->renderer()->setShouldDoFullPaintInvalidation(); |
- if (pathsChanged) { |
+ if (filesChanged) { |
// This call may cause destruction of this instance. |
// input instance is safe since it is ref-counted. |
input->dispatchChangeEvent(); |
@@ -311,7 +316,7 @@ void FileInputType::setFiles(FileList* files) |
void FileInputType::filesChosen(const Vector<FileChooserFileInfo>& files) |
{ |
- setFiles(createFileList(files)); |
+ setFiles(createFileList(files, element().fastHasAttribute(webkitdirectoryAttr))); |
} |
void FileInputType::receiveDropForDirectoryUpload(const Vector<String>& paths) |