diff options
author | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-12 20:32:38 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-12 20:32:38 +0000 |
commit | aacb291eb98ba43e574b33f7f892ef19e72d1933 (patch) | |
tree | 1787246278a15579ef2ad80b3f56fe7fc8ef5675 /webkit/browser/fileapi/async_file_util_adapter.cc | |
parent | c06c58c602d8f2d1dd1a271e30a329c3a797d294 (diff) | |
download | chromium_src-aacb291eb98ba43e574b33f7f892ef19e72d1933.zip chromium_src-aacb291eb98ba43e574b33f7f892ef19e72d1933.tar.gz chromium_src-aacb291eb98ba43e574b33f7f892ef19e72d1933.tar.bz2 |
Use has_more parameter to return entries from AsyncFileUtilAdapter
BUG=347900
TEST=git cl try
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=256217
Review URL: https://codereview.chromium.org/194233002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@256627 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/browser/fileapi/async_file_util_adapter.cc')
-rw-r--r-- | webkit/browser/fileapi/async_file_util_adapter.cc | 96 |
1 files changed, 50 insertions, 46 deletions
diff --git a/webkit/browser/fileapi/async_file_util_adapter.cc b/webkit/browser/fileapi/async_file_util_adapter.cc index 6950002..b66cf02 100644 --- a/webkit/browser/fileapi/async_file_util_adapter.cc +++ b/webkit/browser/fileapi/async_file_util_adapter.cc @@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/sequenced_task_runner.h" #include "base/task_runner_util.h" +#include "base/thread_task_runner_handle.h" #include "webkit/browser/fileapi/file_system_context.h" #include "webkit/browser/fileapi/file_system_file_util.h" #include "webkit/browser/fileapi/file_system_operation_context.h" @@ -82,50 +83,54 @@ class GetFileInfoHelper { DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper); }; -class ReadDirectoryHelper { - public: - ReadDirectoryHelper() : error_(base::File::FILE_OK) {} - - void RunWork(FileSystemFileUtil* file_util, - FileSystemOperationContext* context, - const FileSystemURL& url) { - base::File::Info file_info; - base::FilePath platform_path; - base::File::Error error = file_util->GetFileInfo( - context, url, &file_info, &platform_path); - if (error != base::File::FILE_OK) { - error_ = error; - return; - } - if (!file_info.is_directory) { - error_ = base::File::FILE_ERROR_NOT_A_DIRECTORY; - return; - } - - scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum( - file_util->CreateFileEnumerator(context, url)); - - base::FilePath current; - while (!(current = file_enum->Next()).empty()) { - DirectoryEntry entry; - entry.is_directory = file_enum->IsDirectory(); - entry.name = VirtualPath::BaseName(current).value(); - entry.size = file_enum->Size(); - entry.last_modified_time = file_enum->LastModifiedTime(); - entries_.push_back(entry); - } - error_ = base::File::FILE_OK; +void ReadDirectoryHelper(FileSystemFileUtil* file_util, + FileSystemOperationContext* context, + const FileSystemURL& url, + base::SingleThreadTaskRunner* origin_loop, + const AsyncFileUtil::ReadDirectoryCallback& callback) { + base::File::Info file_info; + base::FilePath platform_path; + base::File::Error error = file_util->GetFileInfo( + context, url, &file_info, &platform_path); + + if (error == base::File::FILE_OK && !file_info.is_directory) + error = base::File::FILE_ERROR_NOT_A_DIRECTORY; + + std::vector<DirectoryEntry> entries; + if (error != base::File::FILE_OK) { + origin_loop->PostTask( + FROM_HERE, base::Bind(callback, error, entries, false /* has_more */)); + return; } - void Reply(const AsyncFileUtil::ReadDirectoryCallback& callback) { - callback.Run(error_, entries_, false /* has_more */); + // Note: Increasing this value may make some tests in LayoutTests meaningless. + // (Namely, read-directory-many.html and read-directory-sync-many.html are + // assuming that they are reading much more entries than this constant.) + const size_t kResultChunkSize = 100; + + scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum( + file_util->CreateFileEnumerator(context, url)); + + base::FilePath current; + while (!(current = file_enum->Next()).empty()) { + DirectoryEntry entry; + entry.is_directory = file_enum->IsDirectory(); + entry.name = VirtualPath::BaseName(current).value(); + entry.size = file_enum->Size(); + entry.last_modified_time = file_enum->LastModifiedTime(); + entries.push_back(entry); + + if (entries.size() == kResultChunkSize) { + origin_loop->PostTask( + FROM_HERE, base::Bind(callback, base::File::FILE_OK, entries, + true /* has_more */)); + entries.clear(); + } } - - private: - base::File::Error error_; - std::vector<DirectoryEntry> entries_; - DISALLOW_COPY_AND_ASSIGN(ReadDirectoryHelper); -}; + origin_loop->PostTask( + FROM_HERE, base::Bind(callback, base::File::FILE_OK, entries, + false /* has_more */)); +} void RunCreateOrOpenCallback( const AsyncFileUtil::CreateOrOpenCallback& callback, @@ -211,12 +216,11 @@ void AsyncFileUtilAdapter::ReadDirectory( const FileSystemURL& url, const ReadDirectoryCallback& callback) { FileSystemOperationContext* context_ptr = context.release(); - ReadDirectoryHelper* helper = new ReadDirectoryHelper; - const bool success = context_ptr->task_runner()->PostTaskAndReply( + const bool success = context_ptr->task_runner()->PostTask( FROM_HERE, - Bind(&ReadDirectoryHelper::RunWork, Unretained(helper), - sync_file_util_.get(), base::Owned(context_ptr), url), - Bind(&ReadDirectoryHelper::Reply, Owned(helper), callback)); + Bind(&ReadDirectoryHelper, + sync_file_util_.get(), base::Owned(context_ptr), url, + base::ThreadTaskRunnerHandle::Get(), callback)); DCHECK(success); } |