| 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/FetchBlobDataConsumerHandle.h" | 5 #include "modules/fetch/FetchBlobDataConsumerHandle.h" |
| 6 | 6 |
| 7 #include "core/dom/ExecutionContext.h" | 7 #include "core/dom/ExecutionContext.h" |
| 8 #include "core/fetch/FetchInitiatorTypeNames.h" | 8 #include "core/fetch/FetchInitiatorTypeNames.h" |
| 9 #include "core/loader/ThreadableLoaderClient.h" | 9 #include "core/loader/ThreadableLoaderClient.h" |
| 10 #include "modules/fetch/CompositeDataConsumerHandle.h" | 10 #include "modules/fetch/CompositeDataConsumerHandle.h" |
| 11 #include "modules/fetch/CrossThreadHolder.h" | 11 #include "modules/fetch/CrossThreadHolder.h" |
| 12 #include "modules/fetch/DataConsumerHandleUtil.h" | 12 #include "modules/fetch/DataConsumerHandleUtil.h" |
| 13 #include "platform/blob/BlobRegistry.h" | 13 #include "platform/blob/BlobRegistry.h" |
| 14 #include "platform/blob/BlobURL.h" | 14 #include "platform/blob/BlobURL.h" |
| 15 #include "platform/network/ResourceRequest.h" | 15 #include "platform/network/ResourceRequest.h" |
| 16 #include "public/platform/WebTaskRunner.h" |
| 16 #include "wtf/PtrUtil.h" | 17 #include "wtf/PtrUtil.h" |
| 17 #include <memory> | 18 #include <memory> |
| 18 | 19 |
| 19 namespace blink { | 20 namespace blink { |
| 20 | 21 |
| 21 using Result = FetchBlobDataConsumerHandle::Result; | 22 using Result = FetchBlobDataConsumerHandle::Result; |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| 24 | 25 |
| 25 // Object graph: | 26 // Object graph: |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 } // namespace | 175 } // namespace |
| 175 | 176 |
| 176 // ReaderContext is referenced from FetchBlobDataConsumerHandle and | 177 // ReaderContext is referenced from FetchBlobDataConsumerHandle and |
| 177 // ReaderContext::ReaderImpl. | 178 // ReaderContext::ReaderImpl. |
| 178 // All functions/members must be called/accessed only on the reader thread, | 179 // All functions/members must be called/accessed only on the reader thread, |
| 179 // except for constructor, destructor, and obtainReader(). | 180 // except for constructor, destructor, and obtainReader(). |
| 180 class FetchBlobDataConsumerHandle::ReaderContext final : public ThreadSafeRefCou
nted<ReaderContext> { | 181 class FetchBlobDataConsumerHandle::ReaderContext final : public ThreadSafeRefCou
nted<ReaderContext> { |
| 181 public: | 182 public: |
| 182 class ReaderImpl : public FetchDataConsumerHandle::Reader { | 183 class ReaderImpl : public FetchDataConsumerHandle::Reader { |
| 183 public: | 184 public: |
| 184 ReaderImpl(Client* client, PassRefPtr<ReaderContext> readerContext, std:
:unique_ptr<WebDataConsumerHandle::Reader> reader) | 185 ReaderImpl(Client* client, PassRefPtr<ReaderContext> readerContext, std:
:unique_ptr<WebDataConsumerHandle::Reader> reader, std::unique_ptr<WebTaskRunner
> readerTaskRunner) |
| 185 : m_readerContext(readerContext) | 186 : m_readerContext(readerContext) |
| 186 , m_reader(std::move(reader)) | 187 , m_reader(std::move(reader)) |
| 187 , m_notifier(client) { } | 188 , m_notifier(client, readerTaskRunner.get()) { } |
| 188 ~ReaderImpl() override { } | 189 ~ReaderImpl() override { } |
| 189 | 190 |
| 190 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride | 191 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride |
| 191 { | 192 { |
| 192 if (m_readerContext->drained()) | 193 if (m_readerContext->drained()) |
| 193 return Done; | 194 return Done; |
| 194 m_readerContext->ensureStartLoader(); | 195 m_readerContext->ensureStartLoader(); |
| 195 Result r = m_reader->read(data, size, flags, readSize); | 196 Result r = m_reader->read(data, size, flags, readSize); |
| 196 if (!(size == 0 && (r == Ok || r == ShouldWait))) { | 197 if (!(size == 0 && (r == Ok || r == ShouldWait))) { |
| 197 // We read non-empty data, so we cannot use the blob data | 198 // We read non-empty data, so we cannot use the blob data |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 ReaderContext(ExecutionContext* executionContext, PassRefPtr<BlobDataHandle>
blobDataHandle, FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory) | 247 ReaderContext(ExecutionContext* executionContext, PassRefPtr<BlobDataHandle>
blobDataHandle, FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory) |
| 247 : m_blobDataHandleForDrain(blobDataHandle) | 248 : m_blobDataHandleForDrain(blobDataHandle) |
| 248 , m_loaderStarted(false) | 249 , m_loaderStarted(false) |
| 249 , m_drained(false) | 250 , m_drained(false) |
| 250 { | 251 { |
| 251 CompositeDataConsumerHandle::Updater* updater = nullptr; | 252 CompositeDataConsumerHandle::Updater* updater = nullptr; |
| 252 m_handle = CompositeDataConsumerHandle::create(createWaitingDataConsumer
Handle(), &updater); | 253 m_handle = CompositeDataConsumerHandle::create(createWaitingDataConsumer
Handle(), &updater); |
| 253 m_loaderContextHolder = CrossThreadHolder<LoaderContext>::create(executi
onContext, wrapUnique(new BlobLoaderContext(updater, m_blobDataHandleForDrain, l
oaderFactory))); | 254 m_loaderContextHolder = CrossThreadHolder<LoaderContext>::create(executi
onContext, wrapUnique(new BlobLoaderContext(updater, m_blobDataHandleForDrain, l
oaderFactory))); |
| 254 } | 255 } |
| 255 | 256 |
| 256 std::unique_ptr<FetchDataConsumerHandle::Reader> obtainReader(WebDataConsume
rHandle::Client* client) | 257 std::unique_ptr<FetchDataConsumerHandle::Reader> obtainReader(WebDataConsume
rHandle::Client* client, std::unique_ptr<WebTaskRunner> readerTaskRunner) |
| 257 { | 258 { |
| 258 return wrapUnique(new ReaderImpl(client, this, m_handle->obtainReader(cl
ient))); | 259 return wrapUnique(new ReaderImpl(client, this, m_handle->obtainReader(cl
ient, readerTaskRunner->clone()), readerTaskRunner->clone())); |
| 259 } | 260 } |
| 260 | 261 |
| 261 private: | 262 private: |
| 262 void ensureStartLoader() | 263 void ensureStartLoader() |
| 263 { | 264 { |
| 264 if (m_loaderStarted) | 265 if (m_loaderStarted) |
| 265 return; | 266 return; |
| 266 m_loaderStarted = true; | 267 m_loaderStarted = true; |
| 267 m_loaderContextHolder->postTask(crossThreadBind(&LoaderContext::start)); | 268 m_loaderContextHolder->postTask(crossThreadBind(&LoaderContext::start)); |
| 268 } | 269 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 } | 302 } |
| 302 | 303 |
| 303 std::unique_ptr<FetchDataConsumerHandle> FetchBlobDataConsumerHandle::create(Exe
cutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle) | 304 std::unique_ptr<FetchDataConsumerHandle> FetchBlobDataConsumerHandle::create(Exe
cutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle) |
| 304 { | 305 { |
| 305 if (!blobDataHandle) | 306 if (!blobDataHandle) |
| 306 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer
Handle()); | 307 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer
Handle()); |
| 307 | 308 |
| 308 return wrapUnique(new FetchBlobDataConsumerHandle(executionContext, blobData
Handle, new DefaultLoaderFactory)); | 309 return wrapUnique(new FetchBlobDataConsumerHandle(executionContext, blobData
Handle, new DefaultLoaderFactory)); |
| 309 } | 310 } |
| 310 | 311 |
| 311 std::unique_ptr<FetchDataConsumerHandle::Reader> FetchBlobDataConsumerHandle::ob
tainFetchDataReader(Client* client) | 312 std::unique_ptr<FetchDataConsumerHandle::Reader> FetchBlobDataConsumerHandle::ob
tainFetchDataReader(Client* client, std::unique_ptr<WebTaskRunner> readerTaskRun
ner) |
| 312 { | 313 { |
| 313 return m_readerContext->obtainReader(client); | 314 return m_readerContext->obtainReader(client, std::move(readerTaskRunner)); |
| 314 } | 315 } |
| 315 | 316 |
| 316 } // namespace blink | 317 } // namespace blink |
| OLD | NEW |