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

Unified Diff: Source/modules/fetch/DataConsumerHandleUtil.cpp

Issue 1176243004: Add FetchDataConsumerHandle and utility functions/classes (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Build break fix. Created 5 years, 6 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
« no previous file with comments | « Source/modules/fetch/DataConsumerHandleUtil.h ('k') | Source/modules/fetch/DataConsumerHandleUtilTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/fetch/DataConsumerHandleUtil.cpp
diff --git a/Source/modules/fetch/DataConsumerHandleUtil.cpp b/Source/modules/fetch/DataConsumerHandleUtil.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..587b92628168468b8e970e4809d1ed2ade7d8d63
--- /dev/null
+++ b/Source/modules/fetch/DataConsumerHandleUtil.cpp
@@ -0,0 +1,151 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "modules/fetch/DataConsumerHandleUtil.h"
+
+#include "platform/Task.h"
+#include "platform/blob/BlobData.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebThread.h"
+#include "public/platform/WebTraceLocation.h"
+#include "wtf/Functional.h"
+
+namespace blink {
+
+using Result = WebDataConsumerHandle::Result;
+
+namespace {
+
+class WaitingHandle final : public WebDataConsumerHandle {
+private:
+ class ReaderImpl final : public WebDataConsumerHandle::Reader {
+ public:
+ Result read(void*, size_t, WebDataConsumerHandle::Flags, size_t *readSize) override
+ {
+ *readSize = 0;
+ return ShouldWait;
+ }
+ Result beginRead(const void** buffer, WebDataConsumerHandle::Flags, size_t *available) override
+ {
+ *available = 0;
+ *buffer = nullptr;
+ return ShouldWait;
+ }
+ Result endRead(size_t) override
+ {
+ return UnexpectedError;
+ }
+ };
+ Reader* obtainReaderInternal(Client*) override { return new ReaderImpl; }
+};
+
+class RepeatingReader final : public WebDataConsumerHandle::Reader {
+public:
+ explicit RepeatingReader(Result result, WebDataConsumerHandle::Client* client) : m_result(result), m_notifier(client) { }
+
+private:
+ Result read(void*, size_t, WebDataConsumerHandle::Flags, size_t *readSize) override
+ {
+ *readSize = 0;
+ return m_result;
+ }
+ Result beginRead(const void** buffer, WebDataConsumerHandle::Flags, size_t *available) override
+ {
+ *available = 0;
+ *buffer = nullptr;
+ return m_result;
+ }
+ Result endRead(size_t) override
+ {
+ return WebDataConsumerHandle::UnexpectedError;
+ }
+
+ Result m_result;
+ NotifyOnReaderCreationHelper m_notifier;
+};
+
+class DoneHandle final : public WebDataConsumerHandle {
+private:
+ Reader* obtainReaderInternal(Client* client) override { return new RepeatingReader(Done, client); }
+};
+
+class UnexpectedErrorHandle final : public WebDataConsumerHandle {
+private:
+ Reader* obtainReaderInternal(Client* client) override { return new RepeatingReader(UnexpectedError, client); }
+};
+
+class WebToFetchDataConsumerHandleAdapter : public FetchDataConsumerHandle {
+public:
+ WebToFetchDataConsumerHandleAdapter(PassOwnPtr<WebDataConsumerHandle> handle) : m_handle(handle) { }
+private:
+ class ReaderImpl final : public FetchDataConsumerHandle::Reader {
+ public:
+ ReaderImpl(PassOwnPtr<WebDataConsumerHandle::Reader> reader) : m_reader(reader) { }
+ Result read(void* data, size_t size, Flags flags, size_t* readSize) override
+ {
+ return m_reader->read(data, size, flags, readSize);
+ }
+
+ Result beginRead(const void** buffer, Flags flags, size_t* available) override
+ {
+ return m_reader->beginRead(buffer, flags, available);
+ }
+ Result endRead(size_t readSize) override
+ {
+ return m_reader->endRead(readSize);
+ }
+ private:
+ OwnPtr<WebDataConsumerHandle::Reader> m_reader;
+ };
+
+ Reader* obtainReaderInternal(Client* client) override { return new ReaderImpl(m_handle->obtainReader(client)); }
+
+ OwnPtr<WebDataConsumerHandle> m_handle;
+};
+
+} // namespace
+
+PassOwnPtr<WebDataConsumerHandle> createWaitingDataConsumerHandle()
+{
+ return adoptPtr(new WaitingHandle);
+}
+
+PassOwnPtr<WebDataConsumerHandle> createDoneDataConsumerHandle()
+{
+ return adoptPtr(new DoneHandle);
+}
+
+PassOwnPtr<WebDataConsumerHandle> createUnexpectedErrorDataConsumerHandle()
+{
+ return adoptPtr(new UnexpectedErrorHandle);
+}
+
+PassOwnPtr<FetchDataConsumerHandle> createFetchDataConsumerHandleFromWebHandle(PassOwnPtr<WebDataConsumerHandle> handle)
+{
+ return adoptPtr(new WebToFetchDataConsumerHandleAdapter(handle));
+}
+
+NotifyOnReaderCreationHelper::NotifyOnReaderCreationHelper(WebDataConsumerHandle::Client* client)
+ : m_factory(this)
+{
+ if (!client)
+ return;
+ // Note we don't need thread safety here because this object is
+ // bound to the current thread.
+ Platform::current()->currentThread()->postTask(FROM_HERE, new Task(bind(&NotifyOnReaderCreationHelper::notify, m_factory.createWeakPtr(), client)));
+}
+
+void NotifyOnReaderCreationHelper::notify(WebDataConsumerHandle::Client* client)
+{
+ // |client| dereference is safe here because:
+ // - |this| is owned by a reader,
+ // so the reader outlives |this|, and
+ // - |client| is the client of the reader, so |client| outlives the reader
+ // (guaranteed by the user of the reader),
+ // and therefore |client| outlives |this|.
+ client->didGetReadable();
+}
+
+} // namespace blink
« no previous file with comments | « Source/modules/fetch/DataConsumerHandleUtil.h ('k') | Source/modules/fetch/DataConsumerHandleUtilTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698