| 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 "wtf/text/StringBuilder.h" | 8 #include "wtf/text/StringBuilder.h" |
| 9 #include "wtf/text/WTFString.h" | 9 #include "wtf/text/WTFString.h" |
| 10 #include "wtf/typed_arrays/ArrayBufferBuilder.h" | 10 #include "wtf/typed_arrays/ArrayBufferBuilder.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 { | 32 { |
| 33 ASSERT(!m_client); | 33 ASSERT(!m_client); |
| 34 ASSERT(!m_reader); | 34 ASSERT(!m_reader); |
| 35 | 35 |
| 36 m_client = client; | 36 m_client = client; |
| 37 // Passing |this| here is safe because |this| owns |m_reader|. | 37 // Passing |this| here is safe because |this| owns |m_reader|. |
| 38 m_reader = handle->obtainReader(this); | 38 m_reader = handle->obtainReader(this); |
| 39 RefPtr<BlobDataHandle> blobHandle = m_reader->drainAsBlobDataHandle(); | 39 RefPtr<BlobDataHandle> blobHandle = m_reader->drainAsBlobDataHandle(); |
| 40 if (blobHandle) { | 40 if (blobHandle) { |
| 41 ASSERT(blobHandle->size() != UINT64_MAX); | 41 ASSERT(blobHandle->size() != UINT64_MAX); |
| 42 m_reader.clear(); | 42 m_reader.reset(); |
| 43 if (blobHandle->type() != m_mimeType) { | 43 if (blobHandle->type() != m_mimeType) { |
| 44 // A new BlobDataHandle is created to override the Blob's type. | 44 // A new BlobDataHandle is created to override the Blob's type. |
| 45 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(bl
obHandle->uuid(), m_mimeType, blobHandle->size())); | 45 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(bl
obHandle->uuid(), m_mimeType, blobHandle->size())); |
| 46 } else { | 46 } else { |
| 47 m_client->didFetchDataLoadedBlobHandle(blobHandle); | 47 m_client->didFetchDataLoadedBlobHandle(blobHandle); |
| 48 } | 48 } |
| 49 m_client.clear(); | 49 m_client.clear(); |
| 50 return; | 50 return; |
| 51 } | 51 } |
| 52 | 52 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 65 size_t available; | 65 size_t available; |
| 66 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); | 66 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 67 | 67 |
| 68 switch (result) { | 68 switch (result) { |
| 69 case WebDataConsumerHandle::Ok: | 69 case WebDataConsumerHandle::Ok: |
| 70 m_blobData->appendBytes(buffer, available); | 70 m_blobData->appendBytes(buffer, available); |
| 71 m_reader->endRead(available); | 71 m_reader->endRead(available); |
| 72 break; | 72 break; |
| 73 | 73 |
| 74 case WebDataConsumerHandle::Done: { | 74 case WebDataConsumerHandle::Done: { |
| 75 m_reader.clear(); | 75 m_reader.reset(); |
| 76 long long size = m_blobData->length(); | 76 long long size = m_blobData->length(); |
| 77 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(st
d::move(m_blobData), size)); | 77 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(st
d::move(m_blobData), size)); |
| 78 m_client.clear(); | 78 m_client.clear(); |
| 79 return; | 79 return; |
| 80 } | 80 } |
| 81 | 81 |
| 82 case WebDataConsumerHandle::ShouldWait: | 82 case WebDataConsumerHandle::ShouldWait: |
| 83 return; | 83 return; |
| 84 | 84 |
| 85 case WebDataConsumerHandle::Busy: | 85 case WebDataConsumerHandle::Busy: |
| 86 case WebDataConsumerHandle::ResourceExhausted: | 86 case WebDataConsumerHandle::ResourceExhausted: |
| 87 case WebDataConsumerHandle::UnexpectedError: | 87 case WebDataConsumerHandle::UnexpectedError: |
| 88 m_reader.clear(); | 88 m_reader.reset(); |
| 89 m_blobData.clear(); | 89 m_blobData.reset(); |
| 90 m_client->didFetchDataLoadFailed(); | 90 m_client->didFetchDataLoadFailed(); |
| 91 m_client.clear(); | 91 m_client.clear(); |
| 92 return; | 92 return; |
| 93 } | 93 } |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 | 96 |
| 97 void cancel() override | 97 void cancel() override |
| 98 { | 98 { |
| 99 m_reader.clear(); | 99 m_reader.reset(); |
| 100 m_blobData.clear(); | 100 m_blobData.reset(); |
| 101 m_client.clear(); | 101 m_client.clear(); |
| 102 } | 102 } |
| 103 | 103 |
| 104 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; | 104 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; |
| 105 Member<FetchDataLoader::Client> m_client; | 105 Member<FetchDataLoader::Client> m_client; |
| 106 | 106 |
| 107 String m_mimeType; | 107 String m_mimeType; |
| 108 OwnPtr<BlobData> m_blobData; | 108 OwnPtr<BlobData> m_blobData; |
| 109 }; | 109 }; |
| 110 | 110 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 m_reader->endRead(0); | 151 m_reader->endRead(0); |
| 152 error(); | 152 error(); |
| 153 return; | 153 return; |
| 154 } | 154 } |
| 155 ASSERT(bytesAppended == available); | 155 ASSERT(bytesAppended == available); |
| 156 } | 156 } |
| 157 m_reader->endRead(available); | 157 m_reader->endRead(available); |
| 158 break; | 158 break; |
| 159 | 159 |
| 160 case WebDataConsumerHandle::Done: | 160 case WebDataConsumerHandle::Done: |
| 161 m_reader.clear(); | 161 m_reader.reset(); |
| 162 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m
_rawData->toArrayBuffer())); | 162 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m
_rawData->toArrayBuffer())); |
| 163 m_rawData.clear(); | 163 m_rawData.reset(); |
| 164 m_client.clear(); | 164 m_client.clear(); |
| 165 return; | 165 return; |
| 166 | 166 |
| 167 case WebDataConsumerHandle::ShouldWait: | 167 case WebDataConsumerHandle::ShouldWait: |
| 168 return; | 168 return; |
| 169 | 169 |
| 170 case WebDataConsumerHandle::Busy: | 170 case WebDataConsumerHandle::Busy: |
| 171 case WebDataConsumerHandle::ResourceExhausted: | 171 case WebDataConsumerHandle::ResourceExhausted: |
| 172 case WebDataConsumerHandle::UnexpectedError: | 172 case WebDataConsumerHandle::UnexpectedError: |
| 173 error(); | 173 error(); |
| 174 return; | 174 return; |
| 175 } | 175 } |
| 176 } | 176 } |
| 177 } | 177 } |
| 178 | 178 |
| 179 void error() | 179 void error() |
| 180 { | 180 { |
| 181 m_reader.clear(); | 181 m_reader.reset(); |
| 182 m_rawData.clear(); | 182 m_rawData.reset(); |
| 183 m_client->didFetchDataLoadFailed(); | 183 m_client->didFetchDataLoadFailed(); |
| 184 m_client.clear(); | 184 m_client.clear(); |
| 185 } | 185 } |
| 186 | 186 |
| 187 void cancel() override | 187 void cancel() override |
| 188 { | 188 { |
| 189 m_reader.clear(); | 189 m_reader.reset(); |
| 190 m_rawData.clear(); | 190 m_rawData.reset(); |
| 191 m_client.clear(); | 191 m_client.clear(); |
| 192 } | 192 } |
| 193 | 193 |
| 194 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; | 194 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; |
| 195 Member<FetchDataLoader::Client> m_client; | 195 Member<FetchDataLoader::Client> m_client; |
| 196 | 196 |
| 197 OwnPtr<ArrayBufferBuilder> m_rawData; | 197 OwnPtr<ArrayBufferBuilder> m_rawData; |
| 198 }; | 198 }; |
| 199 | 199 |
| 200 class FetchDataLoaderAsString | 200 class FetchDataLoaderAsString |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); | 233 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 234 | 234 |
| 235 switch (result) { | 235 switch (result) { |
| 236 case WebDataConsumerHandle::Ok: | 236 case WebDataConsumerHandle::Ok: |
| 237 if (available > 0) | 237 if (available > 0) |
| 238 m_builder.append(m_decoder->decode(static_cast<const char*>(
buffer), available)); | 238 m_builder.append(m_decoder->decode(static_cast<const char*>(
buffer), available)); |
| 239 m_reader->endRead(available); | 239 m_reader->endRead(available); |
| 240 break; | 240 break; |
| 241 | 241 |
| 242 case WebDataConsumerHandle::Done: | 242 case WebDataConsumerHandle::Done: |
| 243 m_reader.clear(); | 243 m_reader.reset(); |
| 244 m_builder.append(m_decoder->flush()); | 244 m_builder.append(m_decoder->flush()); |
| 245 m_client->didFetchDataLoadedString(m_builder.toString()); | 245 m_client->didFetchDataLoadedString(m_builder.toString()); |
| 246 m_builder.clear(); | 246 m_builder.clear(); |
| 247 m_decoder.clear(); | 247 m_decoder.reset(); |
| 248 m_client.clear(); | 248 m_client.clear(); |
| 249 return; | 249 return; |
| 250 | 250 |
| 251 case WebDataConsumerHandle::ShouldWait: | 251 case WebDataConsumerHandle::ShouldWait: |
| 252 return; | 252 return; |
| 253 | 253 |
| 254 case WebDataConsumerHandle::Busy: | 254 case WebDataConsumerHandle::Busy: |
| 255 case WebDataConsumerHandle::ResourceExhausted: | 255 case WebDataConsumerHandle::ResourceExhausted: |
| 256 case WebDataConsumerHandle::UnexpectedError: | 256 case WebDataConsumerHandle::UnexpectedError: |
| 257 error(); | 257 error(); |
| 258 return; | 258 return; |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 } | 261 } |
| 262 | 262 |
| 263 void error() | 263 void error() |
| 264 { | 264 { |
| 265 m_reader.clear(); | 265 m_reader.reset(); |
| 266 m_builder.clear(); | 266 m_builder.clear(); |
| 267 m_decoder.clear(); | 267 m_decoder.reset(); |
| 268 m_client->didFetchDataLoadFailed(); | 268 m_client->didFetchDataLoadFailed(); |
| 269 m_client.clear(); | 269 m_client.clear(); |
| 270 } | 270 } |
| 271 | 271 |
| 272 void cancel() override | 272 void cancel() override |
| 273 { | 273 { |
| 274 m_reader.clear(); | 274 m_reader.reset(); |
| 275 m_builder.clear(); | 275 m_builder.clear(); |
| 276 m_decoder.clear(); | 276 m_decoder.reset(); |
| 277 m_client.clear(); | 277 m_client.clear(); |
| 278 } | 278 } |
| 279 | 279 |
| 280 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; | 280 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; |
| 281 Member<FetchDataLoader::Client> m_client; | 281 Member<FetchDataLoader::Client> m_client; |
| 282 | 282 |
| 283 OwnPtr<TextResourceDecoder> m_decoder; | 283 OwnPtr<TextResourceDecoder> m_decoder; |
| 284 StringBuilder m_builder; | 284 StringBuilder m_builder; |
| 285 }; | 285 }; |
| 286 | 286 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); | 320 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 321 | 321 |
| 322 switch (result) { | 322 switch (result) { |
| 323 case WebDataConsumerHandle::Ok: | 323 case WebDataConsumerHandle::Ok: |
| 324 m_outStream->addData(static_cast<const char*>(buffer), available
); | 324 m_outStream->addData(static_cast<const char*>(buffer), available
); |
| 325 m_reader->endRead(available); | 325 m_reader->endRead(available); |
| 326 needToFlush = true; | 326 needToFlush = true; |
| 327 break; | 327 break; |
| 328 | 328 |
| 329 case WebDataConsumerHandle::Done: | 329 case WebDataConsumerHandle::Done: |
| 330 m_reader.clear(); | 330 m_reader.reset(); |
| 331 if (needToFlush) | 331 if (needToFlush) |
| 332 m_outStream->flush(); | 332 m_outStream->flush(); |
| 333 m_outStream->finalize(); | 333 m_outStream->finalize(); |
| 334 m_client->didFetchDataLoadedStream(); | 334 m_client->didFetchDataLoadedStream(); |
| 335 cleanup(); | 335 cleanup(); |
| 336 return; | 336 return; |
| 337 | 337 |
| 338 case WebDataConsumerHandle::ShouldWait: | 338 case WebDataConsumerHandle::ShouldWait: |
| 339 if (needToFlush) | 339 if (needToFlush) |
| 340 m_outStream->flush(); | 340 m_outStream->flush(); |
| 341 return; | 341 return; |
| 342 | 342 |
| 343 case WebDataConsumerHandle::Busy: | 343 case WebDataConsumerHandle::Busy: |
| 344 case WebDataConsumerHandle::ResourceExhausted: | 344 case WebDataConsumerHandle::ResourceExhausted: |
| 345 case WebDataConsumerHandle::UnexpectedError: | 345 case WebDataConsumerHandle::UnexpectedError: |
| 346 // If the stream is aborted soon after the stream is registered | 346 // If the stream is aborted soon after the stream is registered |
| 347 // to the StreamRegistry, ServiceWorkerURLRequestJob may not | 347 // to the StreamRegistry, ServiceWorkerURLRequestJob may not |
| 348 // notice the error and continue waiting forever. | 348 // notice the error and continue waiting forever. |
| 349 // FIXME: Add new message to report the error to the browser | 349 // FIXME: Add new message to report the error to the browser |
| 350 // process. | 350 // process. |
| 351 m_reader.clear(); | 351 m_reader.reset(); |
| 352 m_outStream->abort(); | 352 m_outStream->abort(); |
| 353 m_client->didFetchDataLoadFailed(); | 353 m_client->didFetchDataLoadFailed(); |
| 354 cleanup(); | 354 cleanup(); |
| 355 return; | 355 return; |
| 356 } | 356 } |
| 357 } | 357 } |
| 358 } | 358 } |
| 359 | 359 |
| 360 void cancel() override | 360 void cancel() override |
| 361 { | 361 { |
| 362 cleanup(); | 362 cleanup(); |
| 363 } | 363 } |
| 364 | 364 |
| 365 void cleanup() | 365 void cleanup() |
| 366 { | 366 { |
| 367 m_reader.clear(); | 367 m_reader.reset(); |
| 368 m_client.clear(); | 368 m_client.clear(); |
| 369 m_outStream.clear(); | 369 m_outStream.clear(); |
| 370 } | 370 } |
| 371 | 371 |
| 372 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; | 372 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; |
| 373 Member<FetchDataLoader::Client> m_client; | 373 Member<FetchDataLoader::Client> m_client; |
| 374 | 374 |
| 375 Member<Stream> m_outStream; | 375 Member<Stream> m_outStream; |
| 376 }; | 376 }; |
| 377 | 377 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 392 { | 392 { |
| 393 return new FetchDataLoaderAsString(); | 393 return new FetchDataLoaderAsString(); |
| 394 } | 394 } |
| 395 | 395 |
| 396 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) | 396 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) |
| 397 { | 397 { |
| 398 return new FetchDataLoaderAsStream(outStream); | 398 return new FetchDataLoaderAsStream(outStream); |
| 399 } | 399 } |
| 400 | 400 |
| 401 } // namespace blink | 401 } // namespace blink |
| OLD | NEW |