OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "modules/fetch/FetchDataLoader.h" | 5 #include "modules/fetch/FetchDataLoader.h" |
6 | 6 |
7 #include "core/html/parser/TextResourceDecoder.h" | 7 #include "core/html/parser/TextResourceDecoder.h" |
8 #include "modules/fetch/BytesConsumer.h" | 8 #include "modules/fetch/BytesConsumer.h" |
9 #include "wtf/PtrUtil.h" | 9 #include "wtf/PtrUtil.h" |
10 #include "wtf/text/StringBuilder.h" | 10 #include "wtf/text/StringBuilder.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 void cancel() override | 53 void cancel() override |
54 { | 54 { |
55 m_consumer->cancel(); | 55 m_consumer->cancel(); |
56 } | 56 } |
57 | 57 |
58 void onStateChange() override | 58 void onStateChange() override |
59 { | 59 { |
60 while (true) { | 60 while (true) { |
61 const char* buffer; | 61 const char* buffer; |
62 size_t available; | 62 size_t available; |
63 switch (m_consumer->beginRead(&buffer, &available)) { | 63 auto result = m_consumer->beginRead(&buffer, &available); |
| 64 if (result == BytesConsumer::Result::ShouldWait) |
| 65 return; |
| 66 if (result == BytesConsumer::Result::Ok) { |
| 67 m_blobData->appendBytes(buffer, available); |
| 68 result = m_consumer->endRead(available); |
| 69 } |
| 70 switch (result) { |
64 case BytesConsumer::Result::Ok: | 71 case BytesConsumer::Result::Ok: |
65 m_blobData->appendBytes(buffer, available); | |
66 if (m_consumer->endRead(available) != BytesConsumer::Result::Ok)
{ | |
67 m_client->didFetchDataLoadFailed(); | |
68 return; | |
69 } | |
70 break; | 72 break; |
71 case BytesConsumer::Result::ShouldWait: | 73 case BytesConsumer::Result::ShouldWait: |
| 74 NOTREACHED(); |
72 return; | 75 return; |
73 case BytesConsumer::Result::Done: { | 76 case BytesConsumer::Result::Done: { |
74 auto size = m_blobData->length(); | 77 auto size = m_blobData->length(); |
75 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(st
d::move(m_blobData), size)); | 78 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(st
d::move(m_blobData), size)); |
76 return; | 79 return; |
77 } | 80 } |
78 case BytesConsumer::Result::Error: | 81 case BytesConsumer::Result::Error: |
79 m_client->didFetchDataLoadFailed(); | 82 m_client->didFetchDataLoadFailed(); |
80 return; | 83 return; |
81 } | 84 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 void cancel() override | 119 void cancel() override |
117 { | 120 { |
118 m_consumer->cancel(); | 121 m_consumer->cancel(); |
119 } | 122 } |
120 | 123 |
121 void onStateChange() override | 124 void onStateChange() override |
122 { | 125 { |
123 while (true) { | 126 while (true) { |
124 const char* buffer; | 127 const char* buffer; |
125 size_t available; | 128 size_t available; |
126 switch (m_consumer->beginRead(&buffer, &available)) { | 129 auto result = m_consumer->beginRead(&buffer, &available); |
127 case BytesConsumer::Result::Ok: | 130 if (result == BytesConsumer::Result::ShouldWait) |
| 131 return; |
| 132 if (result == BytesConsumer::Result::Ok) { |
128 if (available > 0) { | 133 if (available > 0) { |
129 unsigned bytesAppended = m_rawData->append(buffer, available
); | 134 unsigned bytesAppended = m_rawData->append(buffer, available
); |
130 if (!bytesAppended) { | 135 if (!bytesAppended) { |
131 auto unused = m_consumer->endRead(0); | 136 auto unused = m_consumer->endRead(0); |
132 ALLOW_UNUSED_LOCAL(unused); | 137 ALLOW_UNUSED_LOCAL(unused); |
133 m_consumer->cancel(); | 138 m_consumer->cancel(); |
134 m_client->didFetchDataLoadFailed(); | 139 m_client->didFetchDataLoadFailed(); |
135 return; | 140 return; |
136 } | 141 } |
137 DCHECK_EQ(bytesAppended, available); | 142 DCHECK_EQ(bytesAppended, available); |
138 } | 143 } |
139 if (m_consumer->endRead(available) != BytesConsumer::Result::Ok)
{ | 144 result = m_consumer->endRead(available); |
140 m_client->didFetchDataLoadFailed(); | 145 } |
141 return; | 146 switch (result) { |
142 } | 147 case BytesConsumer::Result::Ok: |
143 break; | 148 break; |
144 case BytesConsumer::Result::ShouldWait: | 149 case BytesConsumer::Result::ShouldWait: |
| 150 NOTREACHED(); |
145 return; | 151 return; |
146 case BytesConsumer::Result::Done: | 152 case BytesConsumer::Result::Done: |
147 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m
_rawData->toArrayBuffer())); | 153 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m
_rawData->toArrayBuffer())); |
148 return; | 154 return; |
149 case BytesConsumer::Result::Error: | 155 case BytesConsumer::Result::Error: |
150 m_client->didFetchDataLoadFailed(); | 156 m_client->didFetchDataLoadFailed(); |
151 return; | 157 return; |
152 } | 158 } |
153 } | 159 } |
154 } | 160 } |
(...skipping 26 matching lines...) Expand all Loading... |
181 m_consumer = consumer; | 187 m_consumer = consumer; |
182 m_consumer->setClient(this); | 188 m_consumer->setClient(this); |
183 onStateChange(); | 189 onStateChange(); |
184 } | 190 } |
185 | 191 |
186 void onStateChange() override | 192 void onStateChange() override |
187 { | 193 { |
188 while (true) { | 194 while (true) { |
189 const char* buffer; | 195 const char* buffer; |
190 size_t available; | 196 size_t available; |
191 switch (m_consumer->beginRead(&buffer, &available)) { | 197 auto result = m_consumer->beginRead(&buffer, &available); |
192 case BytesConsumer::Result::Ok: | 198 if (result == BytesConsumer::Result::ShouldWait) |
| 199 return; |
| 200 if (result == BytesConsumer::Result::Ok) { |
193 if (available > 0) | 201 if (available > 0) |
194 m_builder.append(m_decoder->decode(buffer, available)); | 202 m_builder.append(m_decoder->decode(buffer, available)); |
195 if (m_consumer->endRead(available) != BytesConsumer::Result::Ok)
{ | 203 result = m_consumer->endRead(available); |
196 m_client->didFetchDataLoadFailed(); | 204 } |
197 return; | 205 switch (result) { |
198 } | 206 case BytesConsumer::Result::Ok: |
199 break; | 207 break; |
200 case BytesConsumer::Result::ShouldWait: | 208 case BytesConsumer::Result::ShouldWait: |
| 209 NOTREACHED(); |
201 return; | 210 return; |
202 case BytesConsumer::Result::Done: | 211 case BytesConsumer::Result::Done: |
203 m_builder.append(m_decoder->flush()); | 212 m_builder.append(m_decoder->flush()); |
204 m_client->didFetchDataLoadedString(m_builder.toString()); | 213 m_client->didFetchDataLoadedString(m_builder.toString()); |
205 return; | 214 return; |
206 case BytesConsumer::Result::Error: | 215 case BytesConsumer::Result::Error: |
207 m_client->didFetchDataLoadFailed(); | 216 m_client->didFetchDataLoadFailed(); |
208 return; | 217 return; |
209 } | 218 } |
210 } | 219 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 m_consumer->setClient(this); | 257 m_consumer->setClient(this); |
249 onStateChange(); | 258 onStateChange(); |
250 } | 259 } |
251 | 260 |
252 void onStateChange() override | 261 void onStateChange() override |
253 { | 262 { |
254 bool needToFlush = false; | 263 bool needToFlush = false; |
255 while (true) { | 264 while (true) { |
256 const char* buffer; | 265 const char* buffer; |
257 size_t available; | 266 size_t available; |
258 switch (m_consumer->beginRead(&buffer, &available)) { | 267 auto result = m_consumer->beginRead(&buffer, &available); |
259 case BytesConsumer::Result::Ok: | 268 if (result == BytesConsumer::Result::ShouldWait) { |
260 m_outStream->addData(buffer, available); | |
261 if (m_consumer->endRead(available) != BytesConsumer::Result::Ok)
{ | |
262 m_outStream->abort(); | |
263 m_client->didFetchDataLoadFailed(); | |
264 return; | |
265 } | |
266 needToFlush = true; | |
267 break; | |
268 case BytesConsumer::Result::ShouldWait: | |
269 if (needToFlush) | 269 if (needToFlush) |
270 m_outStream->flush(); | 270 m_outStream->flush(); |
271 return; | 271 return; |
| 272 } |
| 273 if (result == BytesConsumer::Result::Ok) { |
| 274 m_outStream->addData(buffer, available); |
| 275 needToFlush = true; |
| 276 result = m_consumer->endRead(available); |
| 277 } |
| 278 switch (result) { |
| 279 case BytesConsumer::Result::Ok: |
| 280 break; |
| 281 case BytesConsumer::Result::ShouldWait: |
| 282 NOTREACHED(); |
| 283 return; |
272 case BytesConsumer::Result::Done: | 284 case BytesConsumer::Result::Done: |
273 if (needToFlush) | 285 if (needToFlush) |
274 m_outStream->flush(); | 286 m_outStream->flush(); |
275 m_outStream->finalize(); | 287 m_outStream->finalize(); |
276 m_client->didFetchDataLoadedStream(); | 288 m_client->didFetchDataLoadedStream(); |
277 return; | 289 return; |
278 case BytesConsumer::Result::Error: | 290 case BytesConsumer::Result::Error: |
279 // If the stream is aborted soon after the stream is registered | 291 // If the stream is aborted soon after the stream is registered |
280 // to the StreamRegistry, ServiceWorkerURLRequestJob may not | 292 // to the StreamRegistry, ServiceWorkerURLRequestJob may not |
281 // notice the error and continue waiting forever. | 293 // notice the error and continue waiting forever. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 { | 335 { |
324 return new FetchDataLoaderAsString(); | 336 return new FetchDataLoaderAsString(); |
325 } | 337 } |
326 | 338 |
327 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) | 339 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) |
328 { | 340 { |
329 return new FetchDataLoaderAsStream(outStream); | 341 return new FetchDataLoaderAsStream(outStream); |
330 } | 342 } |
331 | 343 |
332 } // namespace blink | 344 } // namespace blink |
OLD | NEW |