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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp

Issue 1418813004: [Fetch API] Reflect spec changes of bodyUsed property (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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 unified diff | Download patch
OLDNEW
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 #include "config.h" 5 #include "config.h"
6 #include "modules/fetch/BodyStreamBuffer.h" 6 #include "modules/fetch/BodyStreamBuffer.h"
7 7
8 #include "core/dom/DOMArrayBuffer.h" 8 #include "core/dom/DOMArrayBuffer.h"
9 #include "core/dom/DOMTypedArray.h" 9 #include "core/dom/DOMTypedArray.h"
10 #include "core/dom/ExceptionCode.h" 10 #include "core/dom/ExceptionCode.h"
11 #include "modules/fetch/DataConsumerHandleUtil.h" 11 #include "modules/fetch/DataConsumerHandleUtil.h"
12 #include "platform/blob/BlobData.h" 12 #include "platform/blob/BlobData.h"
13 #include "platform/network/EncodedFormData.h" 13 #include "platform/network/EncodedFormData.h"
14 14
15 namespace blink { 15 namespace blink {
16 16
17 class BodyStreamBuffer::LoaderHolder final : public GarbageCollectedFinalized<Lo aderHolder>, public ActiveDOMObject, public FetchDataLoader::Client { 17 class BodyStreamBuffer::LoaderClient final : public GarbageCollectedFinalized<Lo aderClient>, public ActiveDOMObject, public FetchDataLoader::Client {
18 WTF_MAKE_NONCOPYABLE(LoaderHolder); 18 WTF_MAKE_NONCOPYABLE(LoaderClient);
19 USING_GARBAGE_COLLECTED_MIXIN(LoaderHolder); 19 USING_GARBAGE_COLLECTED_MIXIN(LoaderClient);
20 public: 20 public:
21 LoaderHolder(ExecutionContext* executionContext, BodyStreamBuffer* buffer, F etchDataLoader* loader, FetchDataLoader::Client* client) 21 LoaderClient(ExecutionContext* executionContext, BodyStreamBuffer* buffer, F etchDataLoader::Client* client)
22 : ActiveDOMObject(executionContext) 22 : ActiveDOMObject(executionContext)
23 , m_buffer(buffer) 23 , m_buffer(buffer)
24 , m_loader(loader)
25 , m_client(client) 24 , m_client(client)
26 { 25 {
27 suspendIfNeeded(); 26 suspendIfNeeded();
28 } 27 }
29 28
30 void start(PassOwnPtr<FetchDataConsumerHandle> handle) { m_loader->start(han dle.get(), this); }
31
32 void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> blobDataHandle) override 29 void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> blobDataHandle) override
33 { 30 {
34 m_loader.clear(); 31 m_buffer->endLoading();
35 m_buffer->endLoading(this, EndLoadingDone);
36 m_client->didFetchDataLoadedBlobHandle(blobDataHandle); 32 m_client->didFetchDataLoadedBlobHandle(blobDataHandle);
37 } 33 }
38 34
39 void didFetchDataLoadedArrayBuffer(PassRefPtr<DOMArrayBuffer> arrayBuffer) o verride 35 void didFetchDataLoadedArrayBuffer(PassRefPtr<DOMArrayBuffer> arrayBuffer) o verride
40 { 36 {
41 m_loader.clear(); 37 m_buffer->endLoading();
42 m_buffer->endLoading(this, EndLoadingDone);
43 m_client->didFetchDataLoadedArrayBuffer(arrayBuffer); 38 m_client->didFetchDataLoadedArrayBuffer(arrayBuffer);
44 } 39 }
45 40
46 void didFetchDataLoadedString(const String& string) override 41 void didFetchDataLoadedString(const String& string) override
47 { 42 {
48 m_loader.clear(); 43 m_buffer->endLoading();
49 m_buffer->endLoading(this, EndLoadingDone);
50 m_client->didFetchDataLoadedString(string); 44 m_client->didFetchDataLoadedString(string);
51 } 45 }
52 46
53 void didFetchDataLoadedStream() override 47 void didFetchDataLoadedStream() override
54 { 48 {
55 m_loader.clear(); 49 m_buffer->endLoading();
56 m_buffer->endLoading(this, EndLoadingDone);
57 m_client->didFetchDataLoadedStream(); 50 m_client->didFetchDataLoadedStream();
58 } 51 }
59 52
60 void didFetchDataLoadFailed() override 53 void didFetchDataLoadFailed() override
61 { 54 {
62 m_loader.clear(); 55 m_buffer->endLoading();
63 m_buffer->endLoading(this, EndLoadingErrored);
64 m_client->didFetchDataLoadFailed(); 56 m_client->didFetchDataLoadFailed();
65 } 57 }
66 58
67 DEFINE_INLINE_TRACE() 59 DEFINE_INLINE_TRACE()
68 { 60 {
69 visitor->trace(m_buffer); 61 visitor->trace(m_buffer);
70 visitor->trace(m_loader);
71 visitor->trace(m_client); 62 visitor->trace(m_client);
72 ActiveDOMObject::trace(visitor); 63 ActiveDOMObject::trace(visitor);
73 FetchDataLoader::Client::trace(visitor); 64 FetchDataLoader::Client::trace(visitor);
74 } 65 }
75 66
76 private: 67 private:
77 void stop() override 68 void stop() override
78 { 69 {
79 if (m_loader) { 70 m_buffer->stopLoading();
80 m_loader->cancel();
81 m_loader.clear();
82 m_buffer->endLoading(this, EndLoadingErrored);
83 }
84 } 71 }
85 72
86 Member<BodyStreamBuffer> m_buffer; 73 Member<BodyStreamBuffer> m_buffer;
87 Member<FetchDataLoader> m_loader;
88 Member<FetchDataLoader::Client> m_client; 74 Member<FetchDataLoader::Client> m_client;
89 }; 75 };
90 76
91 BodyStreamBuffer::BodyStreamBuffer(PassOwnPtr<FetchDataConsumerHandle> handle) 77 BodyStreamBuffer::BodyStreamBuffer(PassOwnPtr<FetchDataConsumerHandle> handle)
92 : m_handle(handle) 78 : m_handle(handle)
93 , m_reader(m_handle->obtainReader(this)) 79 , m_reader(m_handle->obtainReader(this))
94 , m_stream(new ReadableByteStream(this, new ReadableByteStream::StrictStrate gy)) 80 , m_stream(new ReadableByteStream(this, new ReadableByteStream::StrictStrate gy))
95 , m_lockLevel(0)
96 , m_streamNeedsMore(false) 81 , m_streamNeedsMore(false)
97 { 82 {
98 m_stream->didSourceStart(); 83 m_stream->didSourceStart();
99 } 84 }
100 85
101 PassRefPtr<BlobDataHandle> BodyStreamBuffer::drainAsBlobDataHandle(FetchDataCons umerHandle::Reader::BlobSizePolicy policy) 86 PassRefPtr<BlobDataHandle> BodyStreamBuffer::drainAsBlobDataHandle(FetchDataCons umerHandle::Reader::BlobSizePolicy policy)
102 { 87 {
103 ASSERT(!isLocked()); 88 ASSERT(!stream()->isLocked());
89 m_stream->setIsDisturbed();
104 if (ReadableStream::Closed == m_stream->stateInternal() || ReadableStream::E rrored == m_stream->stateInternal()) 90 if (ReadableStream::Closed == m_stream->stateInternal() || ReadableStream::E rrored == m_stream->stateInternal())
105 return nullptr; 91 return nullptr;
106 92
107 RefPtr<BlobDataHandle> blobDataHandle = m_reader->drainAsBlobDataHandle(poli cy); 93 RefPtr<BlobDataHandle> blobDataHandle = m_reader->drainAsBlobDataHandle(poli cy);
108 if (blobDataHandle) { 94 if (blobDataHandle) {
109 close(); 95 close();
110 return blobDataHandle.release(); 96 return blobDataHandle.release();
111 } 97 }
112 return nullptr; 98 return nullptr;
113 } 99 }
114 100
115 PassRefPtr<EncodedFormData> BodyStreamBuffer::drainAsFormData() 101 PassRefPtr<EncodedFormData> BodyStreamBuffer::drainAsFormData()
116 { 102 {
117 ASSERT(!isLocked()); 103 ASSERT(!stream()->isLocked());
104 m_stream->setIsDisturbed();
118 if (ReadableStream::Closed == m_stream->stateInternal() || ReadableStream::E rrored == m_stream->stateInternal()) 105 if (ReadableStream::Closed == m_stream->stateInternal() || ReadableStream::E rrored == m_stream->stateInternal())
119 return nullptr; 106 return nullptr;
120 107
121 RefPtr<EncodedFormData> formData = m_reader->drainAsFormData(); 108 RefPtr<EncodedFormData> formData = m_reader->drainAsFormData();
122 if (formData) { 109 if (formData) {
123 close(); 110 close();
124 return formData.release(); 111 return formData.release();
125 } 112 }
126 return nullptr; 113 return nullptr;
127 } 114 }
128 115
129 PassOwnPtr<FetchDataConsumerHandle> BodyStreamBuffer::lock(ExecutionContext* exe cutionContext) 116 PassOwnPtr<FetchDataConsumerHandle> BodyStreamBuffer::releaseHandle(ExecutionCon text* executionContext)
130 { 117 {
131 ASSERT(!isLocked()); 118 ASSERT(!stream()->isLocked());
132 ++m_lockLevel;
133 m_reader = nullptr; 119 m_reader = nullptr;
134 OwnPtr<FetchDataConsumerHandle> handle = m_handle.release(); 120 m_stream->setIsDisturbed();
121 TrackExceptionState exceptionState;
122 m_stream->getBytesReader(executionContext, exceptionState);
123
135 if (ReadableStream::Closed == m_stream->stateInternal()) 124 if (ReadableStream::Closed == m_stream->stateInternal())
136 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer Handle()); 125 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer Handle());
137 if (ReadableStream::Errored == m_stream->stateInternal()) 126 if (ReadableStream::Errored == m_stream->stateInternal())
138 return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorD ataConsumerHandle()); 127 return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorD ataConsumerHandle());
139 128
140 TrackExceptionState exceptionState; 129 ASSERT(m_handle);
141 m_streamReader = m_stream->getBytesReader(executionContext, exceptionState); 130 OwnPtr<FetchDataConsumerHandle> handle = m_handle.release();
131 close();
142 return handle.release(); 132 return handle.release();
143 } 133 }
144 134
145 void BodyStreamBuffer::startLoading(ExecutionContext* executionContext, FetchDat aLoader* loader, FetchDataLoader::Client* client) 135 void BodyStreamBuffer::startLoading(ExecutionContext* executionContext, FetchDat aLoader* loader, FetchDataLoader::Client* client)
146 { 136 {
147 OwnPtr<FetchDataConsumerHandle> handle = lock(executionContext); 137 ASSERT(!m_loader);
148 auto holder = new LoaderHolder(executionContext, this, loader, client); 138 OwnPtr<FetchDataConsumerHandle> handle = releaseHandle(executionContext);
149 m_loaders.add(holder); 139 m_loader = loader;
150 holder->start(handle.release()); 140 loader->start(handle.get(), new LoaderClient(executionContext, this, client) );
141 }
142
143 bool BodyStreamBuffer::hasPendingActivity() const
144 {
145 return m_loader || (m_stream->isLocked() && m_stream->stateInternal() == Rea dableStream::Readable);
151 } 146 }
152 147
153 void BodyStreamBuffer::pullSource() 148 void BodyStreamBuffer::pullSource()
154 { 149 {
155 ASSERT(!m_streamNeedsMore); 150 ASSERT(!m_streamNeedsMore);
156 m_streamNeedsMore = true; 151 m_streamNeedsMore = true;
157 processData(); 152 processData();
158 } 153 }
159 154
160 ScriptPromise BodyStreamBuffer::cancelSource(ScriptState* scriptState, ScriptVal ue) 155 ScriptPromise BodyStreamBuffer::cancelSource(ScriptState* scriptState, ScriptVal ue)
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 221
227 case WebDataConsumerHandle::Busy: 222 case WebDataConsumerHandle::Busy:
228 case WebDataConsumerHandle::ResourceExhausted: 223 case WebDataConsumerHandle::ResourceExhausted:
229 case WebDataConsumerHandle::UnexpectedError: 224 case WebDataConsumerHandle::UnexpectedError:
230 error(); 225 error();
231 return; 226 return;
232 } 227 }
233 } 228 }
234 } 229 }
235 230
236 void BodyStreamBuffer::unlock() 231 void BodyStreamBuffer::endLoading()
237 { 232 {
238 ASSERT(m_lockLevel > 0); 233 ASSERT(m_loader);
239 if (m_streamReader) { 234 m_loader = nullptr;
240 m_streamReader->releaseLock();
241 m_streamReader = nullptr;
242 }
243 --m_lockLevel;
244 } 235 }
245 236
246 void BodyStreamBuffer::endLoading(FetchDataLoader::Client* client, EndLoadingMod e mode) 237 void BodyStreamBuffer::stopLoading()
247 { 238 {
248 ASSERT(m_loaders.contains(client)); 239 if (!m_loader)
249 m_loaders.remove(client); 240 return;
250 unlock(); 241 m_loader->cancel();
251 if (mode == EndLoadingDone) { 242 m_loader = nullptr;
252 close();
253 } else {
254 ASSERT(mode == EndLoadingErrored);
255 error();
256 }
257 } 243 }
258 244
259 } // namespace blink 245 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698