| 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/PtrUtil.h" | 8 #include "wtf/PtrUtil.h" |
| 9 #include "wtf/text/StringBuilder.h" | 9 #include "wtf/text/StringBuilder.h" |
| 10 #include "wtf/text/WTFString.h" | 10 #include "wtf/text/WTFString.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 | 25 |
| 26 DEFINE_INLINE_VIRTUAL_TRACE() | 26 DEFINE_INLINE_VIRTUAL_TRACE() |
| 27 { | 27 { |
| 28 FetchDataLoader::trace(visitor); | 28 FetchDataLoader::trace(visitor); |
| 29 visitor->trace(m_client); | 29 visitor->trace(m_client); |
| 30 } | 30 } |
| 31 | 31 |
| 32 private: | 32 private: |
| 33 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override | 33 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override |
| 34 { | 34 { |
| 35 ASSERT(!m_client); | 35 DCHECK(client); |
| 36 ASSERT(!m_reader); | 36 DCHECK(!m_client); |
| 37 DCHECK(!m_reader); |
| 37 | 38 |
| 38 m_client = client; | 39 m_client = client; |
| 39 // Passing |this| here is safe because |this| owns |m_reader|. | 40 // Passing |this| here is safe because |this| owns |m_reader|. |
| 40 m_reader = handle->obtainFetchDataReader(this); | 41 m_reader = handle->obtainFetchDataReader(this); |
| 41 RefPtr<BlobDataHandle> blobHandle = m_reader->drainAsBlobDataHandle(); | 42 RefPtr<BlobDataHandle> blobHandle = m_reader->drainAsBlobDataHandle(); |
| 42 if (blobHandle) { | 43 if (blobHandle) { |
| 43 ASSERT(blobHandle->size() != UINT64_MAX); | 44 DCHECK(blobHandle->size() != UINT64_MAX); |
| 44 m_reader.reset(); | 45 m_reader.reset(); |
| 45 if (blobHandle->type() != m_mimeType) { | 46 if (blobHandle->type() != m_mimeType) { |
| 46 // A new BlobDataHandle is created to override the Blob's type. | 47 // A new BlobDataHandle is created to override the Blob's type. |
| 47 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(bl
obHandle->uuid(), m_mimeType, blobHandle->size())); | 48 m_client->didFetchDataLoadedBlobHandle(BlobDataHandle::create(bl
obHandle->uuid(), m_mimeType, blobHandle->size())); |
| 48 } else { | 49 } else { |
| 49 m_client->didFetchDataLoadedBlobHandle(blobHandle); | 50 m_client->didFetchDataLoadedBlobHandle(blobHandle); |
| 50 } | 51 } |
| 51 m_client.clear(); | 52 m_client.clear(); |
| 52 return; | 53 return; |
| 53 } | 54 } |
| 54 | 55 |
| 55 // We read data from |m_reader| and create a new blob. | 56 // We read data from |m_reader| and create a new blob. |
| 56 m_blobData = BlobData::create(); | 57 m_blobData = BlobData::create(); |
| 57 m_blobData->setContentType(m_mimeType); | 58 m_blobData->setContentType(m_mimeType); |
| 58 } | 59 } |
| 59 | 60 |
| 60 void didGetReadable() override | 61 void didGetReadable() override |
| 61 { | 62 { |
| 62 ASSERT(m_client); | 63 DCHECK(m_client); |
| 63 ASSERT(m_reader); | 64 DCHECK(m_reader); |
| 64 | 65 |
| 65 while (true) { | 66 while (true) { |
| 66 const void* buffer; | 67 const void* buffer; |
| 67 size_t available; | 68 size_t available; |
| 68 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); | 69 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 69 | 70 |
| 70 switch (result) { | 71 switch (result) { |
| 71 case WebDataConsumerHandle::Ok: | 72 case WebDataConsumerHandle::Ok: |
| 72 m_blobData->appendBytes(buffer, available); | 73 m_blobData->appendBytes(buffer, available); |
| 73 m_reader->endRead(available); | 74 m_reader->endRead(available); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 89 case WebDataConsumerHandle::UnexpectedError: | 90 case WebDataConsumerHandle::UnexpectedError: |
| 90 m_reader.reset(); | 91 m_reader.reset(); |
| 91 m_blobData.reset(); | 92 m_blobData.reset(); |
| 92 m_client->didFetchDataLoadFailed(); | 93 m_client->didFetchDataLoadFailed(); |
| 93 m_client.clear(); | 94 m_client.clear(); |
| 94 return; | 95 return; |
| 95 } | 96 } |
| 96 } | 97 } |
| 97 } | 98 } |
| 98 | 99 |
| 100 WebTaskRunner* getTaskRunner() override |
| 101 { |
| 102 return m_client->getTaskRunner(); |
| 103 } |
| 104 |
| 99 void cancel() override | 105 void cancel() override |
| 100 { | 106 { |
| 101 m_reader.reset(); | 107 m_reader.reset(); |
| 102 m_blobData.reset(); | 108 m_blobData.reset(); |
| 103 m_client.clear(); | 109 m_client.clear(); |
| 104 } | 110 } |
| 105 | 111 |
| 106 std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; | 112 std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; |
| 107 Member<FetchDataLoader::Client> m_client; | 113 Member<FetchDataLoader::Client> m_client; |
| 108 | 114 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 119 | 125 |
| 120 DEFINE_INLINE_VIRTUAL_TRACE() | 126 DEFINE_INLINE_VIRTUAL_TRACE() |
| 121 { | 127 { |
| 122 FetchDataLoader::trace(visitor); | 128 FetchDataLoader::trace(visitor); |
| 123 visitor->trace(m_client); | 129 visitor->trace(m_client); |
| 124 } | 130 } |
| 125 | 131 |
| 126 protected: | 132 protected: |
| 127 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override | 133 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override |
| 128 { | 134 { |
| 129 ASSERT(!m_client); | 135 DCHECK(!m_client); |
| 130 ASSERT(!m_rawData); | 136 DCHECK(!m_rawData); |
| 131 ASSERT(!m_reader); | 137 DCHECK(!m_reader); |
| 132 m_client = client; | 138 m_client = client; |
| 133 m_rawData = wrapUnique(new ArrayBufferBuilder()); | 139 m_rawData = wrapUnique(new ArrayBufferBuilder()); |
| 134 m_reader = handle->obtainFetchDataReader(this); | 140 m_reader = handle->obtainFetchDataReader(this); |
| 135 } | 141 } |
| 136 | 142 |
| 137 void didGetReadable() override | 143 void didGetReadable() override |
| 138 { | 144 { |
| 139 ASSERT(m_client); | 145 DCHECK(m_client); |
| 140 ASSERT(m_rawData); | 146 DCHECK(m_rawData); |
| 141 ASSERT(m_reader); | 147 DCHECK(m_reader); |
| 142 | 148 |
| 143 while (true) { | 149 while (true) { |
| 144 const void* buffer; | 150 const void* buffer; |
| 145 size_t available; | 151 size_t available; |
| 146 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); | 152 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 147 | 153 |
| 148 switch (result) { | 154 switch (result) { |
| 149 case WebDataConsumerHandle::Ok: | 155 case WebDataConsumerHandle::Ok: |
| 150 if (available > 0) { | 156 if (available > 0) { |
| 151 unsigned bytesAppended = m_rawData->append(static_cast<const
char*>(buffer), available); | 157 unsigned bytesAppended = m_rawData->append(static_cast<const
char*>(buffer), available); |
| 152 if (!bytesAppended) { | 158 if (!bytesAppended) { |
| 153 m_reader->endRead(0); | 159 m_reader->endRead(0); |
| 154 error(); | 160 error(); |
| 155 return; | 161 return; |
| 156 } | 162 } |
| 157 ASSERT(bytesAppended == available); | 163 DCHECK(bytesAppended == available); |
| 158 } | 164 } |
| 159 m_reader->endRead(available); | 165 m_reader->endRead(available); |
| 160 break; | 166 break; |
| 161 | 167 |
| 162 case WebDataConsumerHandle::Done: | 168 case WebDataConsumerHandle::Done: |
| 163 m_reader.reset(); | 169 m_reader.reset(); |
| 164 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m
_rawData->toArrayBuffer())); | 170 m_client->didFetchDataLoadedArrayBuffer(DOMArrayBuffer::create(m
_rawData->toArrayBuffer())); |
| 165 m_rawData.reset(); | 171 m_rawData.reset(); |
| 166 m_client.clear(); | 172 m_client.clear(); |
| 167 return; | 173 return; |
| 168 | 174 |
| 169 case WebDataConsumerHandle::ShouldWait: | 175 case WebDataConsumerHandle::ShouldWait: |
| 170 return; | 176 return; |
| 171 | 177 |
| 172 case WebDataConsumerHandle::Busy: | 178 case WebDataConsumerHandle::Busy: |
| 173 case WebDataConsumerHandle::ResourceExhausted: | 179 case WebDataConsumerHandle::ResourceExhausted: |
| 174 case WebDataConsumerHandle::UnexpectedError: | 180 case WebDataConsumerHandle::UnexpectedError: |
| 175 error(); | 181 error(); |
| 176 return; | 182 return; |
| 177 } | 183 } |
| 178 } | 184 } |
| 179 } | 185 } |
| 180 | 186 |
| 187 WebTaskRunner* getTaskRunner() override |
| 188 { |
| 189 return m_client->getTaskRunner(); |
| 190 } |
| 191 |
| 181 void error() | 192 void error() |
| 182 { | 193 { |
| 183 m_reader.reset(); | 194 m_reader.reset(); |
| 184 m_rawData.reset(); | 195 m_rawData.reset(); |
| 185 m_client->didFetchDataLoadFailed(); | 196 m_client->didFetchDataLoadFailed(); |
| 186 m_client.clear(); | 197 m_client.clear(); |
| 187 } | 198 } |
| 188 | 199 |
| 189 void cancel() override | 200 void cancel() override |
| 190 { | 201 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 208 | 219 |
| 209 DEFINE_INLINE_VIRTUAL_TRACE() | 220 DEFINE_INLINE_VIRTUAL_TRACE() |
| 210 { | 221 { |
| 211 FetchDataLoader::trace(visitor); | 222 FetchDataLoader::trace(visitor); |
| 212 visitor->trace(m_client); | 223 visitor->trace(m_client); |
| 213 } | 224 } |
| 214 | 225 |
| 215 protected: | 226 protected: |
| 216 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override | 227 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override |
| 217 { | 228 { |
| 218 ASSERT(!m_client); | 229 DCHECK(client); |
| 219 ASSERT(!m_decoder); | 230 DCHECK(!m_client); |
| 220 ASSERT(!m_reader); | 231 DCHECK(!m_decoder); |
| 232 DCHECK(!m_reader); |
| 221 m_client = client; | 233 m_client = client; |
| 222 m_decoder = TextResourceDecoder::createAlwaysUseUTF8ForText(); | 234 m_decoder = TextResourceDecoder::createAlwaysUseUTF8ForText(); |
| 223 m_reader = handle->obtainFetchDataReader(this); | 235 m_reader = handle->obtainFetchDataReader(this); |
| 224 } | 236 } |
| 225 | 237 |
| 226 void didGetReadable() override | 238 void didGetReadable() override |
| 227 { | 239 { |
| 228 ASSERT(m_client); | 240 DCHECK(m_client); |
| 229 ASSERT(m_decoder); | 241 DCHECK(m_decoder); |
| 230 ASSERT(m_reader); | 242 DCHECK(m_reader); |
| 231 | 243 |
| 232 while (true) { | 244 while (true) { |
| 233 const void* buffer; | 245 const void* buffer; |
| 234 size_t available; | 246 size_t available; |
| 235 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); | 247 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 236 | 248 |
| 237 switch (result) { | 249 switch (result) { |
| 238 case WebDataConsumerHandle::Ok: | 250 case WebDataConsumerHandle::Ok: |
| 239 if (available > 0) | 251 if (available > 0) |
| 240 m_builder.append(m_decoder->decode(static_cast<const char*>(
buffer), available)); | 252 m_builder.append(m_decoder->decode(static_cast<const char*>(
buffer), available)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 255 | 267 |
| 256 case WebDataConsumerHandle::Busy: | 268 case WebDataConsumerHandle::Busy: |
| 257 case WebDataConsumerHandle::ResourceExhausted: | 269 case WebDataConsumerHandle::ResourceExhausted: |
| 258 case WebDataConsumerHandle::UnexpectedError: | 270 case WebDataConsumerHandle::UnexpectedError: |
| 259 error(); | 271 error(); |
| 260 return; | 272 return; |
| 261 } | 273 } |
| 262 } | 274 } |
| 263 } | 275 } |
| 264 | 276 |
| 277 WebTaskRunner* getTaskRunner() override |
| 278 { |
| 279 DCHECK(m_client); |
| 280 return m_client->getTaskRunner(); |
| 281 } |
| 282 |
| 265 void error() | 283 void error() |
| 266 { | 284 { |
| 267 m_reader.reset(); | 285 m_reader.reset(); |
| 268 m_builder.clear(); | 286 m_builder.clear(); |
| 269 m_decoder.reset(); | 287 m_decoder.reset(); |
| 270 m_client->didFetchDataLoadFailed(); | 288 m_client->didFetchDataLoadFailed(); |
| 271 m_client.clear(); | 289 m_client.clear(); |
| 272 } | 290 } |
| 273 | 291 |
| 274 void cancel() override | 292 void cancel() override |
| (...skipping 22 matching lines...) Expand all Loading... |
| 297 DEFINE_INLINE_VIRTUAL_TRACE() | 315 DEFINE_INLINE_VIRTUAL_TRACE() |
| 298 { | 316 { |
| 299 FetchDataLoader::trace(visitor); | 317 FetchDataLoader::trace(visitor); |
| 300 visitor->trace(m_client); | 318 visitor->trace(m_client); |
| 301 visitor->trace(m_outStream); | 319 visitor->trace(m_outStream); |
| 302 } | 320 } |
| 303 | 321 |
| 304 protected: | 322 protected: |
| 305 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override | 323 void start(FetchDataConsumerHandle* handle, FetchDataLoader::Client* client)
override |
| 306 { | 324 { |
| 307 ASSERT(!m_client); | 325 DCHECK(!m_client); |
| 308 ASSERT(!m_reader); | 326 DCHECK(!m_reader); |
| 309 m_client = client; | 327 m_client = client; |
| 310 m_reader = handle->obtainFetchDataReader(this); | 328 m_reader = handle->obtainFetchDataReader(this); |
| 311 } | 329 } |
| 312 | 330 |
| 313 void didGetReadable() override | 331 void didGetReadable() override |
| 314 { | 332 { |
| 315 ASSERT(m_client); | 333 DCHECK(m_client); |
| 316 ASSERT(m_reader); | 334 DCHECK(m_reader); |
| 317 | 335 |
| 318 bool needToFlush = false; | 336 bool needToFlush = false; |
| 319 while (true) { | 337 while (true) { |
| 320 const void* buffer; | 338 const void* buffer; |
| 321 size_t available; | 339 size_t available; |
| 322 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); | 340 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer,
WebDataConsumerHandle::FlagNone, &available); |
| 323 | 341 |
| 324 switch (result) { | 342 switch (result) { |
| 325 case WebDataConsumerHandle::Ok: | 343 case WebDataConsumerHandle::Ok: |
| 326 m_outStream->addData(static_cast<const char*>(buffer), available
); | 344 m_outStream->addData(static_cast<const char*>(buffer), available
); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 352 // process. | 370 // process. |
| 353 m_reader.reset(); | 371 m_reader.reset(); |
| 354 m_outStream->abort(); | 372 m_outStream->abort(); |
| 355 m_client->didFetchDataLoadFailed(); | 373 m_client->didFetchDataLoadFailed(); |
| 356 cleanup(); | 374 cleanup(); |
| 357 return; | 375 return; |
| 358 } | 376 } |
| 359 } | 377 } |
| 360 } | 378 } |
| 361 | 379 |
| 380 WebTaskRunner* getTaskRunner() override |
| 381 { |
| 382 return m_client->getTaskRunner(); |
| 383 } |
| 384 |
| 362 void cancel() override | 385 void cancel() override |
| 363 { | 386 { |
| 364 cleanup(); | 387 cleanup(); |
| 365 } | 388 } |
| 366 | 389 |
| 367 void cleanup() | 390 void cleanup() |
| 368 { | 391 { |
| 369 m_reader.reset(); | 392 m_reader.reset(); |
| 370 m_client.clear(); | 393 m_client.clear(); |
| 371 m_outStream.clear(); | 394 m_outStream.clear(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 394 { | 417 { |
| 395 return new FetchDataLoaderAsString(); | 418 return new FetchDataLoaderAsString(); |
| 396 } | 419 } |
| 397 | 420 |
| 398 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) | 421 FetchDataLoader* FetchDataLoader::createLoaderAsStream(Stream* outStream) |
| 399 { | 422 { |
| 400 return new FetchDataLoaderAsStream(outStream); | 423 return new FetchDataLoaderAsStream(outStream); |
| 401 } | 424 } |
| 402 | 425 |
| 403 } // namespace blink | 426 } // namespace blink |
| OLD | NEW |