Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3011)

Unified Diff: Source/modules/filesystem/DirectoryReader.cpp

Issue 178333009: Handle has_more correctly (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Remove unneeded space Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/filesystem/DirectoryReader.cpp
diff --git a/Source/modules/filesystem/DirectoryReader.cpp b/Source/modules/filesystem/DirectoryReader.cpp
index 338d1081b54aca89ef60d13bd3309c1358fb308a..3737aa968cdb253210a08e482e25850903e95d17 100644
--- a/Source/modules/filesystem/DirectoryReader.cpp
+++ b/Source/modules/filesystem/DirectoryReader.cpp
@@ -38,19 +38,90 @@
namespace WebCore {
+class DirectoryReader::EntriesCallbackHelper : public EntriesCallback {
+public:
+ EntriesCallbackHelper(PassRefPtr<DirectoryReader> reader)
+ : m_reader(reader)
+ {
+ }
+
+ virtual void handleEvent(const Vector<RefPtr<Entry> >& entries) OVERRIDE
+ {
+ m_reader->addEntries(entries);
+ }
+
+private:
+ // FIXME: This RefPtr keeps the reader alive until all of the readDirectory results are received. crbug.com/350285
+ RefPtr<DirectoryReader> m_reader;
+};
+
+class DirectoryReader::ErrorCallbackHelper : public ErrorCallback {
+public:
+ ErrorCallbackHelper(PassRefPtr<DirectoryReader> reader)
+ : m_reader(reader)
+ {
+ }
+
+ virtual void handleEvent(FileError* error) OVERRIDE
+ {
+ m_reader->onError(error);
+ }
+
+private:
+ RefPtr<DirectoryReader> m_reader;
+};
+
DirectoryReader::DirectoryReader(PassRefPtr<DOMFileSystemBase> fileSystem, const String& fullPath)
: DirectoryReaderBase(fileSystem, fullPath)
+ , m_isReading(false)
{
ScriptWrappable::init(this);
}
void DirectoryReader::readEntries(PassOwnPtr<EntriesCallback> entriesCallback, PassOwnPtr<ErrorCallback> errorCallback)
{
- if (!m_hasMoreEntries) {
- filesystem()->scheduleCallback(entriesCallback, EntryVector());
+ if (!m_isReading) {
+ m_isReading = true;
+ filesystem()->readDirectory(this, m_fullPath, adoptPtr(new EntriesCallbackHelper(this)), adoptPtr(new ErrorCallbackHelper(this)));
+ }
+
+ if (m_error) {
+ filesystem()->scheduleCallback(errorCallback, m_error.get());
+ return;
+ }
+
+ if (m_entriesCallback) {
+ // Non-null m_entriesCallback means multiple readEntries() calls are made concurrently. We don't allow doing it.
+ filesystem()->scheduleCallback(errorCallback, FileError::create(FileError::INVALID_STATE_ERR));
return;
}
- filesystem()->readDirectory(this, m_fullPath, entriesCallback, errorCallback);
+
+ if (!m_hasMoreEntries || !m_entries.isEmpty()) {
+ filesystem()->scheduleCallback(entriesCallback, m_entries);
+ m_entries.clear();
+ return;
+ }
+
+ m_entriesCallback = entriesCallback;
+ m_errorCallback = errorCallback;
+}
+
+void DirectoryReader::addEntries(const Vector<RefPtr<Entry> >& entries)
+{
+ m_entries.appendVector(entries);
+ if (m_entriesCallback) {
+ OwnPtr<EntriesCallback> entriesCallback = m_entriesCallback.release();
+ Vector<RefPtr<Entry> > entries;
+ entries.swap(m_entries);
+ entriesCallback->handleEvent(entries);
+ }
+}
+
+void DirectoryReader::onError(FileError* error)
+{
+ m_error = error;
+ if (m_errorCallback)
+ m_errorCallback->handleEvent(error);
}
}

Powered by Google App Engine
This is Rietveld 408576698