| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BodyStreamBuffer_h | 5 #ifndef BodyStreamBuffer_h |
| 6 #define BodyStreamBuffer_h | 6 #define BodyStreamBuffer_h |
| 7 | 7 |
| 8 #include "core/dom/DOMException.h" | 8 #include "core/dom/DOMException.h" |
| 9 #include "modules/ModulesExport.h" | 9 #include "modules/ModulesExport.h" |
| 10 #include "modules/fetch/FetchDataConsumerHandle.h" |
| 11 #include "modules/fetch/FetchDataLoader.h" |
| 10 #include "platform/blob/BlobData.h" | 12 #include "platform/blob/BlobData.h" |
| 11 #include "platform/heap/Heap.h" | 13 #include "platform/heap/Heap.h" |
| 12 #include "public/platform/WebDataConsumerHandle.h" | 14 #include "public/platform/WebDataConsumerHandle.h" |
| 13 #include "wtf/Deque.h" | 15 #include "wtf/Deque.h" |
| 14 #include "wtf/RefPtr.h" | 16 #include "wtf/RefPtr.h" |
| 15 #include "wtf/text/WTFString.h" | 17 #include "wtf/text/WTFString.h" |
| 16 | 18 |
| 17 namespace blink { | 19 namespace blink { |
| 18 | 20 |
| 19 class DOMArrayBuffer; | 21 class DOMArrayBuffer; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 DOMException* exception() const { return m_exception; } | 53 DOMException* exception() const { return m_exception; } |
| 52 | 54 |
| 53 // Can't call after close() or error() was called. | 55 // Can't call after close() or error() was called. |
| 54 void write(PassRefPtr<DOMArrayBuffer>); | 56 void write(PassRefPtr<DOMArrayBuffer>); |
| 55 // Can't call after close() or error() was called. | 57 // Can't call after close() or error() was called. |
| 56 void close(); | 58 void close(); |
| 57 // Can't call after close() or error() was called. | 59 // Can't call after close() or error() was called. |
| 58 void error(DOMException*); | 60 void error(DOMException*); |
| 59 void cancel() { m_canceller->cancel(); } | 61 void cancel() { m_canceller->cancel(); } |
| 60 | 62 |
| 61 // This function registers an observer so it fails and returns false when an | |
| 62 // observer was already registered. | |
| 63 bool readAllAndCreateBlobHandle(const String& contentType, BlobHandleCreator
Client*); | |
| 64 | |
| 65 // This function registers an observer so it fails and returns false when an | |
| 66 // observer was already registered. | |
| 67 bool startTee(BodyStreamBuffer* out1, BodyStreamBuffer* out2); | |
| 68 | |
| 69 // When an observer was registered this function fails and returns false. | 63 // When an observer was registered this function fails and returns false. |
| 70 bool registerObserver(Observer*); | 64 bool registerObserver(Observer*); |
| 71 void unregisterObserver(); | 65 void unregisterObserver(); |
| 72 bool isObserverRegistered() const { return m_observer.get(); } | 66 bool isObserverRegistered() const { return m_observer.get(); } |
| 73 DECLARE_TRACE(); | 67 DECLARE_TRACE(); |
| 74 | 68 |
| 75 // Creates a BodyStreamBuffer from |handle| as the source. | 69 // Creates a BodyStreamBuffer from |handle| as the source. |
| 76 // On failure, BodyStreamBuffer::error() is called with a NetworkError | 70 // On failure, BodyStreamBuffer::error() is called with a NetworkError |
| 77 // with |failureMessage|. | 71 // with |failureMessage|. |
| 78 static BodyStreamBuffer* create(PassOwnPtr<WebDataConsumerHandle> /* handle
*/, const String& failureMessage); | 72 static BodyStreamBuffer* create(PassOwnPtr<WebDataConsumerHandle> /* handle
*/, const String& failureMessage); |
| 79 | 73 |
| 80 private: | 74 private: |
| 81 Deque<RefPtr<DOMArrayBuffer>> m_queue; | 75 Deque<RefPtr<DOMArrayBuffer>> m_queue; |
| 82 bool m_isClosed; | 76 bool m_isClosed; |
| 83 Member<DOMException> m_exception; | 77 Member<DOMException> m_exception; |
| 84 Member<Observer> m_observer; | 78 Member<Observer> m_observer; |
| 85 Member<Canceller> m_canceller; | 79 Member<Canceller> m_canceller; |
| 86 }; | 80 }; |
| 87 | 81 |
| 82 /* |
| 83 // #define createDebugHandleAlways(handle) FetchDebugDataConsumerHandle::create(
handle, __FILE__, __LINE__) |
| 84 #define createDebugHandleAlways(handle) (handle) |
| 85 #define createDebugHandle(handle) (handle) |
| 86 |
| 87 class FetchDebugDataConsumerHandle : public FetchDataConsumerHandle { |
| 88 public: |
| 89 static PassOwnPtr<FetchDataConsumerHandle> create(PassOwnPtr<FetchDataConsum
erHandle> handle, const char* file, int line) { return adoptPtr(new FetchDebugDa
taConsumerHandle(handle, file, line)); } |
| 90 private: |
| 91 FetchDebugDataConsumerHandle(PassOwnPtr<FetchDataConsumerHandle> handle, con
st char *file, int line) |
| 92 : m_handle(handle) |
| 93 , m_name(m_handle->debugName()) { } |
| 94 |
| 95 class ReaderImpl final : public FetchDataConsumerHandle::Reader { |
| 96 public: |
| 97 ReaderImpl(FetchDebugDataConsumerHandle* handle, PassOwnPtr<FetchDataCon
sumerHandle::Reader> reader) : m_handle(handle), m_name(handle->debugName()), m_
reader(reader), m_isInTwoPhaseRead(false) { } |
| 98 ~ReaderImpl() |
| 99 { |
| 100 ASSERT(!m_isInTwoPhaseRead); |
| 101 print("dtor\n", (long long)currentThread(), this); |
| 102 } |
| 103 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride |
| 104 { |
| 105 ASSERT(!m_isInTwoPhaseRead); |
| 106 print("read(%lld)\n", (long long)size); |
| 107 Result result = m_reader->read(data, size, flags, readSize); |
| 108 print("read(%lld) -> %d (%lld)\n", (long long)size, result, (long lo
ng)*readSize); |
| 109 return result; |
| 110 } |
| 111 |
| 112 Result beginRead(const void** buffer, Flags flags, size_t* available) ov
erride |
| 113 { |
| 114 ASSERT(!m_isInTwoPhaseRead); |
| 115 print("beginRead()\n"); |
| 116 Result result = m_reader->beginRead(buffer, flags, available); |
| 117 print("beginRead() -> %d (%lld)\n", result, (long long)*available); |
| 118 if (result == Ok) |
| 119 m_isInTwoPhaseRead = true; |
| 120 return result; |
| 121 } |
| 122 Result endRead(size_t readSize) override |
| 123 { |
| 124 ASSERT(m_isInTwoPhaseRead); |
| 125 m_isInTwoPhaseRead = false; |
| 126 print("endRead(%lld)\n", (long long)readSize); |
| 127 Result result = m_reader->endRead(readSize); |
| 128 print("endRead(%lld) -> %d\n", (long long)readSize, result); |
| 129 return result; |
| 130 } |
| 131 PassRefPtr<BlobDataHandle> drainAsBlobDataHandle() override |
| 132 { |
| 133 print("drainAsBlobDataHandle()\n"); |
| 134 RefPtr<BlobDataHandle> blobDataHandle = m_reader->drainAsBlobDataHan
dle(); |
| 135 print("drainAsBlobDataHandle() -> %p\n", blobDataHandle.get()); |
| 136 return blobDataHandle.release(); |
| 137 } |
| 138 void print(const char* format, ...) |
| 139 { |
| 140 fprintf(stderr, "[Thread:%lld] [Handle:%p (%s)] [Reader:%p] [TargetR
eader:%p]: ", |
| 141 (long long)currentThread(), |
| 142 m_handle, |
| 143 m_name.c_str(), |
| 144 this, |
| 145 m_reader.get()); |
| 146 |
| 147 va_list args; |
| 148 va_start(args, format); |
| 149 vfprintf(stderr, format, args); |
| 150 va_end(args); |
| 151 } |
| 152 private: |
| 153 FetchDebugDataConsumerHandle* m_handle; // debugging only |
| 154 std::string m_name; |
| 155 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; |
| 156 bool m_isInTwoPhaseRead; |
| 157 }; |
| 158 class ClientWrapper : public Client { |
| 159 public: |
| 160 ClientWrapper(FetchDebugDataConsumerHandle* handle, Client* client) : m_
handle(handle), m_name(handle->debugName()), m_reader(nullptr), m_client(client)
{ } |
| 161 void didGetReadable() override |
| 162 { |
| 163 print("didGetReadable\n"); |
| 164 if (m_client) |
| 165 m_client->didGetReadable(); |
| 166 print("didGetReadable done\n"); |
| 167 } |
| 168 void setReader(Reader* reader) { m_reader = reader; } |
| 169 |
| 170 void print(const char* format, ...) |
| 171 { |
| 172 fprintf(stderr, "[Thread:%lld] [Handle:%p (%s)] [Reader:%p] [Client:
%p] [TargetClient:%p]: ", |
| 173 (long long)currentThread(), |
| 174 m_handle, |
| 175 m_name.c_str(), |
| 176 m_reader, |
| 177 this, |
| 178 m_client); |
| 179 |
| 180 va_list args; |
| 181 va_start(args, format); |
| 182 vfprintf(stderr, format, args); |
| 183 va_end(args); |
| 184 } |
| 185 private: |
| 186 FetchDebugDataConsumerHandle* m_handle; // debugging only |
| 187 std::string m_name; |
| 188 Reader* m_reader; // logging only |
| 189 |
| 190 Client* m_client; |
| 191 }; |
| 192 Reader* obtainReaderInternal(Client* client) override |
| 193 { |
| 194 print("obtainReaderInternal(Client=%p)\n", client); |
| 195 ClientWrapper* clientWrapper = new ClientWrapper(this, client); |
| 196 Reader* reader = new ReaderImpl(this, m_handle->obtainReader(clientWrapp
er)); // FIXME: Leaking |
| 197 clientWrapper->setReader(reader); |
| 198 print("obtainReaderInternal(Client=%p) -> %p\n", client, reader); |
| 199 return reader; |
| 200 } |
| 201 void print(const char* format, ...) |
| 202 { |
| 203 fprintf(stderr, "[Thread:%lld] [Handle:%p (%s)]: ", |
| 204 (long long)currentThread(), |
| 205 this, |
| 206 debugName()); |
| 207 |
| 208 va_list args; |
| 209 va_start(args, format); |
| 210 vfprintf(stderr, format, args); |
| 211 va_end(args); |
| 212 } |
| 213 |
| 214 const char* debugName() const override { return m_name.c_str(); } |
| 215 |
| 216 OwnPtr<FetchDataConsumerHandle> m_handle; |
| 217 std::string m_name; |
| 218 }; |
| 219 */ |
| 220 |
| 221 class MODULES_EXPORT BodyStreamBuffer2 final : public GarbageCollectedFinalized<
BodyStreamBuffer2> { |
| 222 public: |
| 223 static BodyStreamBuffer2* create(PassOwnPtr<FetchDataConsumerHandle> handle)
{ return new BodyStreamBuffer2(handle); } |
| 224 |
| 225 FetchDataConsumerHandle* handle() const { return m_handle.get(); } |
| 226 PassOwnPtr<FetchDataConsumerHandle> releaseHandle() { return m_handle.releas
e(); } |
| 227 |
| 228 void registerLoader(FetchDataLoader* loader) { ASSERT(!m_fetchDataLoader); m
_fetchDataLoader = loader; } |
| 229 void unregisterLoader() { m_fetchDataLoader.clear(); } |
| 230 DEFINE_INLINE_TRACE() |
| 231 { |
| 232 visitor->trace(m_fetchDataLoader); |
| 233 } |
| 234 |
| 235 private: |
| 236 explicit BodyStreamBuffer2(PassOwnPtr<FetchDataConsumerHandle> handle) : m_h
andle(handle) { } |
| 237 |
| 238 OwnPtr<FetchDataConsumerHandle> m_handle; |
| 239 Member<FetchDataLoader> m_fetchDataLoader; |
| 240 }; |
| 241 |
| 88 } // namespace blink | 242 } // namespace blink |
| 89 | 243 |
| 90 #endif // BodyStreamBuffer_h | 244 #endif // BodyStreamBuffer_h |
| OLD | NEW |