Index: Source/modules/fetch/BodyStreamBuffer.h |
diff --git a/Source/modules/fetch/BodyStreamBuffer.h b/Source/modules/fetch/BodyStreamBuffer.h |
index cdb47baab116261c68167786d96f4c924f8e15d1..a49894e3332a5584445cb39f297308a0aac69474 100644 |
--- a/Source/modules/fetch/BodyStreamBuffer.h |
+++ b/Source/modules/fetch/BodyStreamBuffer.h |
@@ -7,6 +7,9 @@ |
#include "core/dom/DOMException.h" |
#include "modules/ModulesExport.h" |
+#include "modules/fetch/DataConsumerHandleUtil.h" |
+#include "modules/fetch/FetchDataConsumerHandle.h" |
+#include "modules/fetch/FetchDataLoader.h" |
#include "platform/blob/BlobData.h" |
#include "platform/heap/Heap.h" |
#include "public/platform/WebDataConsumerHandle.h" |
@@ -16,73 +19,76 @@ |
namespace blink { |
-class DOMArrayBuffer; |
+class DrainingBodyStreamBuffer; |
class MODULES_EXPORT BodyStreamBuffer final : public GarbageCollectedFinalized<BodyStreamBuffer> { |
public: |
- class Observer : public GarbageCollectedFinalized<Observer> { |
- public: |
- virtual ~Observer() { } |
- virtual void onWrite() = 0; |
- virtual void onClose() = 0; |
- virtual void onError() = 0; |
- DEFINE_INLINE_VIRTUAL_TRACE() { } |
- }; |
+ static BodyStreamBuffer* create(PassOwnPtr<FetchDataConsumerHandle> handle) { return new BodyStreamBuffer(handle); } |
+ static BodyStreamBuffer* createEmpty(); |
- class Canceller : public GarbageCollected<Canceller> { |
- public: |
- virtual void cancel() = 0; |
- DEFINE_INLINE_VIRTUAL_TRACE() { } |
- }; |
+ FetchDataConsumerHandle* handle() const; |
+ PassOwnPtr<FetchDataConsumerHandle> releaseHandle(); |
- class BlobHandleCreatorClient : public GarbageCollectedFinalized<BlobHandleCreatorClient> { |
+ class DrainingStreamNotificationClient : public GarbageCollectedMixin { |
public: |
- virtual ~BlobHandleCreatorClient() { } |
- virtual void didCreateBlobHandle(PassRefPtr<BlobDataHandle>) = 0; |
- virtual void didFail(DOMException*) = 0; |
- DEFINE_INLINE_VIRTUAL_TRACE() { } |
+ virtual ~DrainingStreamNotificationClient() { } |
+ // Called after FetchDataLoader::Client methods. |
+ virtual void didFetchDataLoadFinishedFromDrainingStream() = 0; |
}; |
- explicit BodyStreamBuffer(Canceller*); |
- ~BodyStreamBuffer() { } |
- |
- PassRefPtr<DOMArrayBuffer> read(); |
- bool isClosed() const { return m_isClosed; } |
- bool hasError() const { return m_exception; } |
- DOMException* exception() const { return m_exception; } |
- |
- // Can't call after close() or error() was called. |
- void write(PassRefPtr<DOMArrayBuffer>); |
- // Can't call after close() or error() was called. |
- void close(); |
- // Can't call after close() or error() was called. |
- void error(DOMException*); |
- void cancel() { m_canceller->cancel(); } |
- |
- // This function registers an observer so it fails and returns false when an |
- // observer was already registered. |
- bool readAllAndCreateBlobHandle(const String& contentType, BlobHandleCreatorClient*); |
- |
- // This function registers an observer so it fails and returns false when an |
- // observer was already registered. |
- bool startTee(BodyStreamBuffer* out1, BodyStreamBuffer* out2); |
- |
- // When an observer was registered this function fails and returns false. |
- bool registerObserver(Observer*); |
- void unregisterObserver(); |
- bool isObserverRegistered() const { return m_observer.get(); } |
- DECLARE_TRACE(); |
- |
- // Creates a BodyStreamBuffer from |handle| as the source. |
- // On failure, BodyStreamBuffer::error() is called with a NetworkError |
- // with |failureMessage|. |
- static BodyStreamBuffer* create(PassOwnPtr<WebDataConsumerHandle> /* handle */, const String& failureMessage); |
+ |
+ DEFINE_INLINE_TRACE() |
+ { |
+ visitor->trace(m_fetchDataLoader); |
+ visitor->trace(m_drainingStreamNotificationClient); |
+ } |
+ |
+ void didFetchDataLoadFinished(); |
+ |
+private: |
+ explicit BodyStreamBuffer(PassOwnPtr<FetchDataConsumerHandle> handle) : m_handle(handle) { } |
+ |
+ void setDrainingStreamNotificationClient(DrainingStreamNotificationClient*); |
+ |
+ void startLoading(FetchDataLoader*, FetchDataLoader::Client*); |
+ // Call DrainingStreamNotificationClient. |
+ void doDrainingStreamNotification(); |
+ // Clear DrainingStreamNotificationClient without calling. |
+ void clearDrainingStreamNotification(); |
+ |
+ friend class DrainingBodyStreamBuffer; |
+ |
+ OwnPtr<FetchDataConsumerHandle> m_handle; |
+ Member<FetchDataLoader> m_fetchDataLoader; |
+ Member<DrainingStreamNotificationClient> m_drainingStreamNotificationClient; |
+}; |
+ |
+// DrainingBodyStreamBuffer wraps BodyStreamBuffer returned from |
+// Body::createDrainingStream() and calls DrainingStreamNotificationClient |
+// callbacks unless leakBuffer() is called: |
+// - If startLoading() is called, the callback is called after loading finished. |
+// - If drainAsBlobDataHandle() is called, the callback is called immediately. |
+// - If leakBuffer() is called, the callback is no longer called. |
+// Any calls to DrainingBodyStreamBuffer methods after a call to either of |
+// methods above is no-op. |
+// After calling one of the methods above, we don't have to keep |
+// DrainingBodyStreamBuffer alive. |
+// If DrainingBodyStreamBuffer is destructed before any of above is called, |
+// the callback is called at destruction. |
+class MODULES_EXPORT DrainingBodyStreamBuffer final { |
+public: |
+ static PassOwnPtr<DrainingBodyStreamBuffer> create(BodyStreamBuffer* buffer, BodyStreamBuffer::DrainingStreamNotificationClient* client) |
+ { |
+ return adoptPtr(new DrainingBodyStreamBuffer(buffer, client)); |
+ } |
+ ~DrainingBodyStreamBuffer(); |
+ void startLoading(FetchDataLoader*, FetchDataLoader::Client*); |
+ BodyStreamBuffer* leakBuffer(); |
+ PassRefPtr<BlobDataHandle> drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::BlobSizePolicy); |
private: |
- Deque<RefPtr<DOMArrayBuffer>> m_queue; |
- bool m_isClosed; |
- Member<DOMException> m_exception; |
- Member<Observer> m_observer; |
- Member<Canceller> m_canceller; |
+ DrainingBodyStreamBuffer(BodyStreamBuffer*, BodyStreamBuffer::DrainingStreamNotificationClient*); |
+ |
+ Persistent<BodyStreamBuffer> m_buffer; |
}; |
} // namespace blink |