summaryrefslogtreecommitdiffstats
path: root/webkit/browser/fileapi/async_file_util_adapter.cc
diff options
context:
space:
mode:
authorhashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-12 20:32:38 +0000
committerhashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-12 20:32:38 +0000
commitaacb291eb98ba43e574b33f7f892ef19e72d1933 (patch)
tree1787246278a15579ef2ad80b3f56fe7fc8ef5675 /webkit/browser/fileapi/async_file_util_adapter.cc
parentc06c58c602d8f2d1dd1a271e30a329c3a797d294 (diff)
downloadchromium_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.cc96
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);
}