Chromium Code Reviews| 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; | |
|
yhirano
2015/06/25 10:53:33
This variable should be defined out of the loop.
hiroshige
2015/06/25 11:12:26
Done.
| |
| 250 | |
| 251 switch (result) { | |
| 252 case WebDataConsumerHandle::Ok: | |
| 253 m_outStream->addData(static_cast<const char*>(buffer), available ); | |
| 254 m_reader->endRead(available); | |
|
yhirano
2015/06/25 10:53:33
needToFlush = true
hiroshige
2015/06/25 11:12:26
Done.
| |
| 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(); | |
|
yhirano
2015/06/25 10:53:33
I'm not sure if flushing is needed in this case.
hiroshige
2015/06/25 11:12:26
Done.
| |
| 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 |