| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "config.h" |
| 6 #include "modules/fetch/DataConsumerHandleUtil.h" |
| 7 |
| 8 #include "platform/Task.h" |
| 9 #include "platform/blob/BlobData.h" |
| 10 #include "public/platform/Platform.h" |
| 11 #include "public/platform/WebThread.h" |
| 12 #include "public/platform/WebTraceLocation.h" |
| 13 #include "wtf/Functional.h" |
| 14 |
| 15 namespace blink { |
| 16 |
| 17 using Result = WebDataConsumerHandle::Result; |
| 18 |
| 19 namespace { |
| 20 |
| 21 class WaitingHandle final : public WebDataConsumerHandle { |
| 22 private: |
| 23 class ReaderImpl final : public WebDataConsumerHandle::Reader { |
| 24 public: |
| 25 Result read(void*, size_t, WebDataConsumerHandle::Flags, size_t *readSiz
e) override |
| 26 { |
| 27 *readSize = 0; |
| 28 return ShouldWait; |
| 29 } |
| 30 Result beginRead(const void** buffer, WebDataConsumerHandle::Flags, size
_t *available) override |
| 31 { |
| 32 *available = 0; |
| 33 *buffer = nullptr; |
| 34 return ShouldWait; |
| 35 } |
| 36 Result endRead(size_t) override |
| 37 { |
| 38 return UnexpectedError; |
| 39 } |
| 40 }; |
| 41 Reader* obtainReaderInternal(Client*) override { return new ReaderImpl; } |
| 42 }; |
| 43 |
| 44 class RepeatingReader final : public WebDataConsumerHandle::Reader { |
| 45 public: |
| 46 explicit RepeatingReader(Result result, WebDataConsumerHandle::Client* clien
t) : m_result(result), m_notifier(client) { } |
| 47 |
| 48 private: |
| 49 Result read(void*, size_t, WebDataConsumerHandle::Flags, size_t *readSize) o
verride |
| 50 { |
| 51 *readSize = 0; |
| 52 return m_result; |
| 53 } |
| 54 Result beginRead(const void** buffer, WebDataConsumerHandle::Flags, size_t *
available) override |
| 55 { |
| 56 *available = 0; |
| 57 *buffer = nullptr; |
| 58 return m_result; |
| 59 } |
| 60 Result endRead(size_t) override |
| 61 { |
| 62 return WebDataConsumerHandle::UnexpectedError; |
| 63 } |
| 64 |
| 65 Result m_result; |
| 66 NotifyOnReaderCreationHelper m_notifier; |
| 67 }; |
| 68 |
| 69 class DoneHandle final : public WebDataConsumerHandle { |
| 70 private: |
| 71 Reader* obtainReaderInternal(Client* client) override { return new Repeating
Reader(Done, client); } |
| 72 }; |
| 73 |
| 74 class UnexpectedErrorHandle final : public WebDataConsumerHandle { |
| 75 private: |
| 76 Reader* obtainReaderInternal(Client* client) override { return new Repeating
Reader(UnexpectedError, client); } |
| 77 }; |
| 78 |
| 79 class WebToFetchDataConsumerHandleAdapter : public FetchDataConsumerHandle { |
| 80 public: |
| 81 WebToFetchDataConsumerHandleAdapter(PassOwnPtr<WebDataConsumerHandle> handle
) : m_handle(handle) { } |
| 82 private: |
| 83 class ReaderImpl final : public FetchDataConsumerHandle::Reader { |
| 84 public: |
| 85 ReaderImpl(PassOwnPtr<WebDataConsumerHandle::Reader> reader) : m_reader(
reader) { } |
| 86 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride |
| 87 { |
| 88 return m_reader->read(data, size, flags, readSize); |
| 89 } |
| 90 |
| 91 Result beginRead(const void** buffer, Flags flags, size_t* available) ov
erride |
| 92 { |
| 93 return m_reader->beginRead(buffer, flags, available); |
| 94 } |
| 95 Result endRead(size_t readSize) override |
| 96 { |
| 97 return m_reader->endRead(readSize); |
| 98 } |
| 99 private: |
| 100 OwnPtr<WebDataConsumerHandle::Reader> m_reader; |
| 101 }; |
| 102 |
| 103 Reader* obtainReaderInternal(Client* client) override { return new ReaderImp
l(m_handle->obtainReader(client)); } |
| 104 |
| 105 OwnPtr<WebDataConsumerHandle> m_handle; |
| 106 }; |
| 107 |
| 108 } // namespace |
| 109 |
| 110 PassOwnPtr<WebDataConsumerHandle> createWaitingDataConsumerHandle() |
| 111 { |
| 112 return adoptPtr(new WaitingHandle); |
| 113 } |
| 114 |
| 115 PassOwnPtr<WebDataConsumerHandle> createDoneDataConsumerHandle() |
| 116 { |
| 117 return adoptPtr(new DoneHandle); |
| 118 } |
| 119 |
| 120 PassOwnPtr<WebDataConsumerHandle> createUnexpectedErrorDataConsumerHandle() |
| 121 { |
| 122 return adoptPtr(new UnexpectedErrorHandle); |
| 123 } |
| 124 |
| 125 PassOwnPtr<FetchDataConsumerHandle> createFetchDataConsumerHandleFromWebHandle(P
assOwnPtr<WebDataConsumerHandle> handle) |
| 126 { |
| 127 return adoptPtr(new WebToFetchDataConsumerHandleAdapter(handle)); |
| 128 } |
| 129 |
| 130 NotifyOnReaderCreationHelper::NotifyOnReaderCreationHelper(WebDataConsumerHandle
::Client* client) |
| 131 : m_factory(this) |
| 132 { |
| 133 if (!client) |
| 134 return; |
| 135 // Note we don't need thread safety here because this object is |
| 136 // bound to the current thread. |
| 137 Platform::current()->currentThread()->postTask(FROM_HERE, new Task(bind(&Not
ifyOnReaderCreationHelper::notify, m_factory.createWeakPtr(), client))); |
| 138 } |
| 139 |
| 140 void NotifyOnReaderCreationHelper::notify(WebDataConsumerHandle::Client* client) |
| 141 { |
| 142 // |client| dereference is safe here because: |
| 143 // - |this| is owned by a reader, |
| 144 // so the reader outlives |this|, and |
| 145 // - |client| is the client of the reader, so |client| outlives the reader |
| 146 // (guaranteed by the user of the reader), |
| 147 // and therefore |client| outlives |this|. |
| 148 client->didGetReadable(); |
| 149 } |
| 150 |
| 151 } // namespace blink |
| OLD | NEW |