Commit b4fbf814 authored by kinuko@chromium.org's avatar kinuko@chromium.org

Ignore symlinks in Drag-and-drop'ed folder

This patch also deprecate recursive enumeration support in
IsolatedFileUtil as we no longer need it (http://crbug.com/176443)
and adding symlink fix in the dead code doesn't sound productive.

BUG=176443,229849
TEST=IsolatedFileUtilTest.ReadDirectoryTest


Review URL: https://chromiumcodereview.appspot.com/13850004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@193413 0039d316-1c4b-4281-b951-d872f2087c98
parent fd56fb54
......@@ -53,57 +53,6 @@ class SetFileEnumerator : public FileSystemFileUtil::AbstractFileEnumerator {
base::PlatformFileInfo file_info_;
};
// Recursively enumerate each path from a given paths set.
class RecursiveSetFileEnumerator
: public FileSystemFileUtil::AbstractFileEnumerator {
public:
explicit RecursiveSetFileEnumerator(const std::vector<FileInfo>& files)
: files_(files) {
file_iter_ = files_.begin();
current_enumerator_.reset(new SetFileEnumerator(files));
}
virtual ~RecursiveSetFileEnumerator() {}
// AbstractFileEnumerator overrides.
virtual base::FilePath Next() OVERRIDE;
virtual int64 Size() OVERRIDE {
DCHECK(current_enumerator_.get());
return current_enumerator_->Size();
}
virtual bool IsDirectory() OVERRIDE {
DCHECK(current_enumerator_.get());
return current_enumerator_->IsDirectory();
}
virtual base::Time LastModifiedTime() OVERRIDE {
DCHECK(current_enumerator_.get());
return current_enumerator_->LastModifiedTime();
}
private:
std::vector<FileInfo> files_;
std::vector<FileInfo>::iterator file_iter_;
scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> current_enumerator_;
};
base::FilePath RecursiveSetFileEnumerator::Next() {
if (current_enumerator_.get()) {
base::FilePath path = current_enumerator_->Next();
if (!path.empty())
return path;
}
// We reached the end.
if (file_iter_ == files_.end())
return base::FilePath();
// Enumerates subdirectories of the next path.
FileInfo& next_file = *file_iter_++;
current_enumerator_ = NativeFileUtil::CreateFileEnumerator(
next_file.path, true /* recursive */);
DCHECK(current_enumerator_.get());
return current_enumerator_->Next();
}
} // namespace
//-------------------------------------------------------------------------
......@@ -163,20 +112,20 @@ scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator>
FileSystemOperationContext* context,
const FileSystemURL& root,
bool recursive) {
if (recursive) {
NOTREACHED() << "Recursive enumeration not supported.";
return scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator>(
new EmptyFileEnumerator);
}
DCHECK(root.is_valid());
if (!root.path().empty())
return NativeFileUtil::CreateFileEnumerator(root.path(), recursive);
return LocalFileUtil::CreateFileEnumerator(context, root, recursive);
// Root path case.
std::vector<FileInfo> toplevels;
IsolatedContext::GetInstance()->GetDraggedFileInfo(
root.filesystem_id(), &toplevels);
if (!recursive) {
return make_scoped_ptr(new SetFileEnumerator(toplevels))
.PassAs<FileSystemFileUtil::AbstractFileEnumerator>();
}
return make_scoped_ptr(new RecursiveSetFileEnumerator(toplevels))
.PassAs<FileSystemFileUtil::AbstractFileEnumerator>();
return scoped_ptr<AbstractFileEnumerator>(new SetFileEnumerator(toplevels));
}
} // namespace fileapi
......@@ -370,8 +370,9 @@ TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) {
base::FileUtilProxy::Entry> EntryMap;
EntryMap expected_entry_map;
base::FilePath dir_path = GetTestCasePlatformPath(test_case.path);
FileEnumerator file_enum(
GetTestCasePlatformPath(test_case.path), false /* not recursive */,
dir_path, false /* not recursive */,
FileEnumerator::FILES | FileEnumerator::DIRECTORIES);
base::FilePath current;
while (!(current = file_enum.Next()).empty()) {
......@@ -383,6 +384,16 @@ TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) {
entry.size = FileEnumerator::GetFilesize(file_info);
entry.last_modified_time = FileEnumerator::GetLastModifiedTime(file_info);
expected_entry_map[entry.name] = entry;
#if defined(OS_POSIX)
// Creates a symlink for each file/directory.
// They should be ignored by ReadDirectory, so we don't add them
// to expected_entry_map.
file_util::CreateSymbolicLink(
current,
dir_path.Append(current.BaseName().AddExtension(
FILE_PATH_LITERAL("link"))));
#endif
}
// Perform ReadDirectory in the isolated filesystem.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment