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 "config.h" | 5 #include "config.h" |
6 #include "modules/fetch/FetchDataLoader.h" | 6 #include "modules/fetch/FetchDataLoader.h" |
7 | 7 |
8 #include "wtf/ArrayBufferBuilder.h" | 8 #include "wtf/ArrayBufferBuilder.h" |
9 #include "wtf/text/WTFString.h" | 9 #include "wtf/text/WTFString.h" |
10 | 10 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 m_client.clear(); | 205 m_client.clear(); |
206 } | 206 } |
207 | 207 |
208 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; | 208 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; |
209 Member<FetchDataLoader::Client> m_client; | 209 Member<FetchDataLoader::Client> m_client; |
210 | 210 |
211 LoadType m_loadType; | 211 LoadType m_loadType; |
212 OwnPtr<ArrayBufferBuilder> m_rawData; | 212 OwnPtr<ArrayBufferBuilder> m_rawData; |
213 }; | 213 }; |
214 | 214 |
| 215 class FetchDataLoaderAsStream |
| 216 : public FetchDataLoader |
| 217 , public WebDataConsumerHandle::Client { |
| 218 public: |
| 219 explicit FetchDataLoaderAsStream(Stream* outStream) |
| 220 : m_client(nullptr) |
| 221 , m_outStream(outStream) { } |
| 222 |
| 223 DEFINE_INLINE_VIRTUAL_TRACE() |
| 224 { |
| 225 FetchDataLoader::trace(visitor); |
| 226 visitor->trace(m_client); |
| 227 visitor->trace(m_outStream); |
| 228 } |
| 229 |
| 230 protected: |
| 231 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override |
| 232 { |
| 233 ASSERT(!m_client); |
| 234 ASSERT(!m_reader); |
| 235 m_client = client; |
| 236 m_reader = handle->obtainReader(this); |
| 237 } |
| 238 |
| 239 void didGetReadable() override |
| 240 { |
| 241 ASSERT(m_client); |
| 242 ASSERT(m_reader); |
| 243 |
| 244 while (true) { |
| 245 const void* buffer; |
| 246 size_t available; |
| 247 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 248 |
| 249 bool needToFlush = false; |
| 250 |
| 251 switch (result) { |
| 252 case WebDataConsumerHandle::Ok: |
| 253 m_outStream->addData(static_cast<const char*>(buffer), available
); |
| 254 m_reader->endRead(available); |
| 255 break; |
| 256 |
| 257 case WebDataConsumerHandle::Done: |
| 258 m_reader.clear(); |
| 259 if (needToFlush) |
| 260 m_outStream->flush(); |
| 261 m_outStream->finalize(); |
| 262 m_client->didFetchDataLoadedStream(); |
| 263 cleanup(); |
| 264 return; |
| 265 |
| 266 case WebDataConsumerHandle::ShouldWait: |
| 267 if (needToFlush) |
| 268 m_outStream->flush(); |
| 269 return; |
| 270 |
| 271 case WebDataConsumerHandle::Busy: |
| 272 case WebDataConsumerHandle::ResourceExhausted: |
| 273 case WebDataConsumerHandle::UnexpectedError: |
| 274 // If the stream is aborted soon after the stream is registered |
| 275 // to the StreamRegistry, ServiceWorkerURLRequestJob may not |
| 276 // notice the error and continue waiting forever. |
| 277 // FIXME: Add new message to report the error to the browser |
| 278 // process. |
| 279 m_reader.clear(); |
| 280 if (needToFlush) |
| 281 m_outStream->flush(); |
| 282 m_outStream->abort(); |
| 283 m_client->didFetchDataLoadFailed(); |
| 284 cleanup(); |
| 285 return; |
| 286 } |
| 287 } |
| 288 } |
| 289 |
| 290 void cancel() override |
| 291 { |
| 292 cleanup(); |
| 293 } |
| 294 |
| 295 void cleanup() |
| 296 { |
| 297 m_reader.clear(); |
| 298 m_client.clear(); |
| 299 m_outStream.clear(); |
| 300 } |
| 301 |
| 302 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; |
| 303 Member<FetchDataLoader::Client> m_client; |
| 304 |
| 305 Member<Stream> m_outStream; |
| 306 }; |
| 307 |
| 308 |
215 } // namespace | 309 } // namespace |
216 | 310 |
217 FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle(const String& mimeTyp
e) | 311 FetchDataLoader* FetchDataLoader::createLoaderAsBlobHandle(const String& mimeTyp
e) |
218 { | 312 { |
219 return new FetchDataLoaderAsBlobHandle(mimeType); | 313 return new FetchDataLoaderAsBlobHandle(mimeType); |
220 } | 314 } |
221 | 315 |
222 FetchDataLoader* FetchDataLoader::createLoaderAsArrayBuffer() | 316 FetchDataLoader* FetchDataLoader::createLoaderAsArrayBuffer() |
223 { | 317 { |
224 return new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsArrayBuffer
OrString::LoadAsArrayBuffer); | 318 return new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsArrayBuffer
OrString::LoadAsArrayBuffer); |
225 } | 319 } |
226 | 320 |
227 FetchDataLoader* FetchDataLoader::createLoaderAsString() | 321 FetchDataLoader* FetchDataLoader::createLoaderAsString() |
228 { | 322 { |
229 return new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsArrayBuffer
OrString::LoadAsString); | 323 return new FetchDataLoaderAsArrayBufferOrString(FetchDataLoaderAsArrayBuffer
OrString::LoadAsString); |
230 } | 324 } |
231 | 325 |
| 326 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) |
| 327 { |
| 328 return new FetchDataLoaderAsStream(outStream); |
| 329 } |
| 330 |
232 } // namespace blink | 331 } // namespace blink |
OLD | NEW |