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

Unified Diff: Source/modules/filesystem/DirectoryReaderSync.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/DirectoryReaderSync.cpp
diff --git a/Source/modules/filesystem/DirectoryReaderSync.cpp b/Source/modules/filesystem/DirectoryReaderSync.cpp
index 5f83d945020165d9e959fcf362ebc5b01de316c0..4b051868f6d3f644d6a6d770ee8e5f7e46999575 100644
--- a/Source/modules/filesystem/DirectoryReaderSync.cpp
+++ b/Source/modules/filesystem/DirectoryReaderSync.cpp
@@ -35,30 +35,74 @@
#include "core/dom/ExceptionCode.h"
#include "modules/filesystem/DirectoryEntry.h"
#include "modules/filesystem/DirectoryEntrySync.h"
+#include "modules/filesystem/EntriesCallback.h"
#include "modules/filesystem/EntrySync.h"
+#include "modules/filesystem/ErrorCallback.h"
#include "modules/filesystem/FileEntrySync.h"
-#include "modules/filesystem/SyncCallbackHelper.h"
namespace WebCore {
+class DirectoryReaderSync::EntriesCallbackHelper : public EntriesCallback {
+public:
+ EntriesCallbackHelper(PassRefPtr<DirectoryReaderSync> reader)
+ : m_reader(reader)
+ {
+ }
+
+ virtual void handleEvent(const Vector<RefPtr<Entry> >& entries) OVERRIDE
+ {
+ EntrySyncVector syncEntries;
+ syncEntries.reserveInitialCapacity(entries.size());
+ for (size_t i = 0; i < entries.size(); ++i)
+ syncEntries.uncheckedAppend(EntrySync::create(entries[i].get()));
+ m_reader->addEntries(syncEntries);
+ }
+
+private:
+ RefPtr<DirectoryReaderSync> m_reader;
+};
+
+class DirectoryReaderSync::ErrorCallbackHelper : public ErrorCallback {
+public:
+ ErrorCallbackHelper(PassRefPtr<DirectoryReaderSync> reader)
+ : m_reader(reader)
+ {
+ }
+
+ virtual void handleEvent(FileError* error) OVERRIDE
+ {
+ m_reader->setError(error->code());
+ }
+
+private:
+ RefPtr<DirectoryReaderSync> m_reader;
+};
+
DirectoryReaderSync::DirectoryReaderSync(PassRefPtr<DOMFileSystemBase> fileSystem, const String& fullPath)
: DirectoryReaderBase(fileSystem, fullPath)
+ , m_callbacksId(0)
+ , m_errorCode(FileError::OK)
{
ScriptWrappable::init(this);
}
EntrySyncVector DirectoryReaderSync::readEntries(ExceptionState& exceptionState)
{
- if (!m_hasMoreEntries)
- return EntrySyncVector();
+ if (!m_callbacksId) {
+ m_callbacksId = filesystem()->readDirectory(this, m_fullPath, adoptPtr(new EntriesCallbackHelper(this)), adoptPtr(new ErrorCallbackHelper(this)), DOMFileSystemBase::Synchronous);
+ }
+
+ if (m_errorCode == FileError::OK && m_hasMoreEntries && m_entries.isEmpty())
+ m_fileSystem->waitForAdditionalResult(m_callbacksId);
- EntriesSyncCallbackHelper helper;
- if (!m_fileSystem->readDirectory(this, m_fullPath, helper.successCallback(), helper.errorCallback(), DOMFileSystemBase::Synchronous)) {
- exceptionState.throwDOMException(InvalidModificationError, "Failed to read the directory.");
- setHasMoreEntries(false);
+ if (m_errorCode != FileError::OK) {
+ FileError::throwDOMException(exceptionState, m_errorCode);
return EntrySyncVector();
}
- return helper.getResult(exceptionState);
+
+ EntrySyncVector result;
+ result.swap(m_entries);
+ return result;
}
} // namespace

Powered by Google App Engine
This is Rietveld 408576698