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/FetchFormDataConsumerHandle.h" | 5 #include "modules/fetch/FetchFormDataConsumerHandle.h" |
6 | 6 |
7 #include "modules/fetch/DataConsumerHandleUtil.h" | 7 #include "modules/fetch/DataConsumerHandleUtil.h" |
8 #include "modules/fetch/FetchBlobDataConsumerHandle.h" | 8 #include "modules/fetch/FetchBlobDataConsumerHandle.h" |
| 9 #include "wtf/PtrUtil.h" |
9 #include "wtf/ThreadingPrimitives.h" | 10 #include "wtf/ThreadingPrimitives.h" |
10 #include "wtf/Vector.h" | 11 #include "wtf/Vector.h" |
11 #include "wtf/text/TextCodec.h" | 12 #include "wtf/text/TextCodec.h" |
12 #include "wtf/text/TextEncoding.h" | 13 #include "wtf/text/TextEncoding.h" |
13 #include "wtf/text/WTFString.h" | 14 #include "wtf/text/WTFString.h" |
14 | 15 #include <memory> |
15 #include <utility> | 16 #include <utility> |
16 | 17 |
17 namespace blink { | 18 namespace blink { |
18 | 19 |
19 using Result = FetchDataConsumerHandle::Result; | 20 using Result = FetchDataConsumerHandle::Result; |
20 | 21 |
21 namespace { | 22 namespace { |
22 | 23 |
23 bool isSimple(const EncodedFormData* formData) | 24 bool isSimple(const EncodedFormData* formData) |
24 { | 25 { |
25 for (const auto& element : formData->elements()) { | 26 for (const auto& element : formData->elements()) { |
26 if (element.m_type != FormDataElement::data) | 27 if (element.m_type != FormDataElement::data) |
27 return false; | 28 return false; |
28 } | 29 } |
29 return true; | 30 return true; |
30 } | 31 } |
31 | 32 |
32 } // namespace | 33 } // namespace |
33 | 34 |
34 class FetchFormDataConsumerHandle::Context : public ThreadSafeRefCounted<Context
> { | 35 class FetchFormDataConsumerHandle::Context : public ThreadSafeRefCounted<Context
> { |
35 WTF_MAKE_NONCOPYABLE(Context); | 36 WTF_MAKE_NONCOPYABLE(Context); |
36 public: | 37 public: |
37 virtual ~Context() {} | 38 virtual ~Context() {} |
38 virtual PassOwnPtr<FetchDataConsumerHandle::Reader> obtainReader(Client*) =
0; | 39 virtual std::unique_ptr<FetchDataConsumerHandle::Reader> obtainReader(Client
*) = 0; |
39 | 40 |
40 protected: | 41 protected: |
41 explicit Context() {} | 42 explicit Context() {} |
42 }; | 43 }; |
43 | 44 |
44 class FetchFormDataConsumerHandle::SimpleContext final : public Context { | 45 class FetchFormDataConsumerHandle::SimpleContext final : public Context { |
45 class ReaderImpl; | 46 class ReaderImpl; |
46 public: | 47 public: |
47 static PassRefPtr<SimpleContext> create(const String& body) { return adoptRe
f(new SimpleContext(body)); } | 48 static PassRefPtr<SimpleContext> create(const String& body) { return adoptRe
f(new SimpleContext(body)); } |
48 static PassRefPtr<SimpleContext> create(const void* data, size_t size) { ret
urn adoptRef(new SimpleContext(data, size)); } | 49 static PassRefPtr<SimpleContext> create(const void* data, size_t size) { ret
urn adoptRef(new SimpleContext(data, size)); } |
49 static PassRefPtr<SimpleContext> create(PassRefPtr<EncodedFormData> body) {
return adoptRef(new SimpleContext(body)); } | 50 static PassRefPtr<SimpleContext> create(PassRefPtr<EncodedFormData> body) {
return adoptRef(new SimpleContext(body)); } |
50 | 51 |
51 PassOwnPtr<Reader> obtainReader(Client* client) override | 52 std::unique_ptr<Reader> obtainReader(Client* client) override |
52 { | 53 { |
53 // For memory barrier. | 54 // For memory barrier. |
54 Mutex m; | 55 Mutex m; |
55 MutexLocker locker(m); | 56 MutexLocker locker(m); |
56 return ReaderImpl::create(this, client); | 57 return ReaderImpl::create(this, client); |
57 } | 58 } |
58 | 59 |
59 PassRefPtr<BlobDataHandle> drainAsBlobDataHandle() | 60 PassRefPtr<BlobDataHandle> drainAsBlobDataHandle() |
60 { | 61 { |
61 if (!m_formData) | 62 if (!m_formData) |
62 return nullptr; | 63 return nullptr; |
63 flatten(); | 64 flatten(); |
64 OwnPtr<BlobData> blobData = BlobData::create(); | 65 std::unique_ptr<BlobData> blobData = BlobData::create(); |
65 blobData->appendBytes(m_flattenFormData.data(), m_flattenFormData.size()
); | 66 blobData->appendBytes(m_flattenFormData.data(), m_flattenFormData.size()
); |
66 m_flattenFormData.clear(); | 67 m_flattenFormData.clear(); |
67 auto length = blobData->length(); | 68 auto length = blobData->length(); |
68 return BlobDataHandle::create(std::move(blobData), length); | 69 return BlobDataHandle::create(std::move(blobData), length); |
69 } | 70 } |
70 | 71 |
71 PassRefPtr<EncodedFormData> drainFormData() | 72 PassRefPtr<EncodedFormData> drainFormData() |
72 { | 73 { |
73 ASSERT(!m_formData || m_formData->isSafeToSendToAnotherThread()); | 74 ASSERT(!m_formData || m_formData->isSafeToSendToAnotherThread()); |
74 return m_formData.release(); | 75 return m_formData.release(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 RELEASE_ASSERT(read <= m_flattenFormData.size() - m_flattenFormDataOffse
t); | 115 RELEASE_ASSERT(read <= m_flattenFormData.size() - m_flattenFormDataOffse
t); |
115 m_flattenFormDataOffset += read; | 116 m_flattenFormDataOffset += read; |
116 | 117 |
117 return WebDataConsumerHandle::Ok; | 118 return WebDataConsumerHandle::Ok; |
118 } | 119 } |
119 | 120 |
120 private: | 121 private: |
121 class ReaderImpl final : public FetchDataConsumerHandle::Reader { | 122 class ReaderImpl final : public FetchDataConsumerHandle::Reader { |
122 WTF_MAKE_NONCOPYABLE(ReaderImpl); | 123 WTF_MAKE_NONCOPYABLE(ReaderImpl); |
123 public: | 124 public: |
124 static PassOwnPtr<ReaderImpl> create(PassRefPtr<SimpleContext> context,
Client* client) { return adoptPtr(new ReaderImpl(context, client)); } | 125 static std::unique_ptr<ReaderImpl> create(PassRefPtr<SimpleContext> cont
ext, Client* client) { return wrapUnique(new ReaderImpl(context, client)); } |
125 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride | 126 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride |
126 { | 127 { |
127 return m_context->read(data, size, flags, readSize); | 128 return m_context->read(data, size, flags, readSize); |
128 } | 129 } |
129 Result beginRead(const void** buffer, Flags flags, size_t* available) ov
erride | 130 Result beginRead(const void** buffer, Flags flags, size_t* available) ov
erride |
130 { | 131 { |
131 return m_context->beginRead(buffer, flags, available); | 132 return m_context->beginRead(buffer, flags, available); |
132 } | 133 } |
133 Result endRead(size_t read) override | 134 Result endRead(size_t read) override |
134 { | 135 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 class FetchFormDataConsumerHandle::ComplexContext final : public Context { | 178 class FetchFormDataConsumerHandle::ComplexContext final : public Context { |
178 class ReaderImpl; | 179 class ReaderImpl; |
179 public: | 180 public: |
180 static PassRefPtr<ComplexContext> create(ExecutionContext* executionContext, | 181 static PassRefPtr<ComplexContext> create(ExecutionContext* executionContext, |
181 PassRefPtr<EncodedFormData> formData, | 182 PassRefPtr<EncodedFormData> formData, |
182 FetchBlobDataConsumerHandle::LoaderFactory* factory) | 183 FetchBlobDataConsumerHandle::LoaderFactory* factory) |
183 { | 184 { |
184 return adoptRef(new ComplexContext(executionContext, formData, factory))
; | 185 return adoptRef(new ComplexContext(executionContext, formData, factory))
; |
185 } | 186 } |
186 | 187 |
187 PassOwnPtr<FetchFormDataConsumerHandle::Reader> obtainReader(Client* client)
override | 188 std::unique_ptr<FetchFormDataConsumerHandle::Reader> obtainReader(Client* cl
ient) override |
188 { | 189 { |
189 // For memory barrier. | 190 // For memory barrier. |
190 Mutex m; | 191 Mutex m; |
191 MutexLocker locker(m); | 192 MutexLocker locker(m); |
192 return ReaderImpl::create(this, client); | 193 return ReaderImpl::create(this, client); |
193 } | 194 } |
194 | 195 |
195 private: | 196 private: |
196 class ReaderImpl final : public FetchDataConsumerHandle::Reader { | 197 class ReaderImpl final : public FetchDataConsumerHandle::Reader { |
197 WTF_MAKE_NONCOPYABLE(ReaderImpl); | 198 WTF_MAKE_NONCOPYABLE(ReaderImpl); |
198 public: | 199 public: |
199 static PassOwnPtr<ReaderImpl> create(PassRefPtr<ComplexContext> context,
Client* client) { return adoptPtr(new ReaderImpl(context, client)); } | 200 static std::unique_ptr<ReaderImpl> create(PassRefPtr<ComplexContext> con
text, Client* client) { return wrapUnique(new ReaderImpl(context, client)); } |
200 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride | 201 Result read(void* data, size_t size, Flags flags, size_t* readSize) over
ride |
201 { | 202 { |
202 Result r = m_reader->read(data, size, flags, readSize); | 203 Result r = m_reader->read(data, size, flags, readSize); |
203 if (!(size == 0 && (r == Ok || r == ShouldWait))) { | 204 if (!(size == 0 && (r == Ok || r == ShouldWait))) { |
204 m_context->drainFormData(); | 205 m_context->drainFormData(); |
205 } | 206 } |
206 return r; | 207 return r; |
207 } | 208 } |
208 Result beginRead(const void** buffer, Flags flags, size_t* available) ov
erride | 209 Result beginRead(const void** buffer, Flags flags, size_t* available) ov
erride |
209 { | 210 { |
(...skipping 22 matching lines...) Expand all Loading... |
232 // in fact not specified at FetchDataConsumerHandle level, but | 233 // in fact not specified at FetchDataConsumerHandle level, but |
233 // |m_context->m_handle| is a FetchBlobDataConsumerHandle. | 234 // |m_context->m_handle| is a FetchBlobDataConsumerHandle. |
234 ASSERT(handle); | 235 ASSERT(handle); |
235 } | 236 } |
236 return formData.release(); | 237 return formData.release(); |
237 } | 238 } |
238 private: | 239 private: |
239 ReaderImpl(PassRefPtr<ComplexContext> context, Client* client) : m_conte
xt(context), m_reader(m_context->m_handle->obtainReader(client)) {} | 240 ReaderImpl(PassRefPtr<ComplexContext> context, Client* client) : m_conte
xt(context), m_reader(m_context->m_handle->obtainReader(client)) {} |
240 | 241 |
241 RefPtr<ComplexContext> m_context; | 242 RefPtr<ComplexContext> m_context; |
242 OwnPtr<FetchDataConsumerHandle::Reader> m_reader; | 243 std::unique_ptr<FetchDataConsumerHandle::Reader> m_reader; |
243 }; | 244 }; |
244 | 245 |
245 ComplexContext(ExecutionContext* executionContext, PassRefPtr<EncodedFormDat
a> body, FetchBlobDataConsumerHandle::LoaderFactory* factory) | 246 ComplexContext(ExecutionContext* executionContext, PassRefPtr<EncodedFormDat
a> body, FetchBlobDataConsumerHandle::LoaderFactory* factory) |
246 { | 247 { |
247 OwnPtr<BlobData> blobData = BlobData::create(); | 248 std::unique_ptr<BlobData> blobData = BlobData::create(); |
248 for (const auto& element : body->elements()) { | 249 for (const auto& element : body->elements()) { |
249 switch (element.m_type) { | 250 switch (element.m_type) { |
250 case FormDataElement::data: | 251 case FormDataElement::data: |
251 blobData->appendBytes(element.m_data.data(), element.m_data.size
()); | 252 blobData->appendBytes(element.m_data.data(), element.m_data.size
()); |
252 break; | 253 break; |
253 case FormDataElement::encodedFile: | 254 case FormDataElement::encodedFile: |
254 blobData->appendFile(element.m_filename, element.m_fileStart, el
ement.m_fileLength, element.m_expectedFileModificationTime); | 255 blobData->appendFile(element.m_filename, element.m_fileStart, el
ement.m_fileLength, element.m_expectedFileModificationTime); |
255 break; | 256 break; |
256 case FormDataElement::encodedBlob: | 257 case FormDataElement::encodedBlob: |
257 if (element.m_optionalBlobDataHandle) | 258 if (element.m_optionalBlobDataHandle) |
(...skipping 19 matching lines...) Expand all Loading... |
277 // ref-counting. | 278 // ref-counting. |
278 m_formData = body->deepCopy(); | 279 m_formData = body->deepCopy(); |
279 } | 280 } |
280 PassRefPtr<EncodedFormData> drainFormData() | 281 PassRefPtr<EncodedFormData> drainFormData() |
281 { | 282 { |
282 ASSERT(!m_formData || m_formData->isSafeToSendToAnotherThread()); | 283 ASSERT(!m_formData || m_formData->isSafeToSendToAnotherThread()); |
283 return m_formData.release(); | 284 return m_formData.release(); |
284 } | 285 } |
285 | 286 |
286 RefPtr<EncodedFormData> m_formData; | 287 RefPtr<EncodedFormData> m_formData; |
287 OwnPtr<FetchDataConsumerHandle> m_handle; | 288 std::unique_ptr<FetchDataConsumerHandle> m_handle; |
288 }; | 289 }; |
289 | 290 |
290 PassOwnPtr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(const St
ring& body) | 291 std::unique_ptr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(con
st String& body) |
291 { | 292 { |
292 return adoptPtr(new FetchFormDataConsumerHandle(body)); | 293 return wrapUnique(new FetchFormDataConsumerHandle(body)); |
293 } | 294 } |
294 PassOwnPtr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(DOMArray
Buffer* body) | 295 std::unique_ptr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(DOM
ArrayBuffer* body) |
295 { | 296 { |
296 return adoptPtr(new FetchFormDataConsumerHandle(body->data(), body->byteLeng
th())); | 297 return wrapUnique(new FetchFormDataConsumerHandle(body->data(), body->byteLe
ngth())); |
297 } | 298 } |
298 PassOwnPtr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(DOMArray
BufferView* body) | 299 std::unique_ptr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(DOM
ArrayBufferView* body) |
299 { | 300 { |
300 return adoptPtr(new FetchFormDataConsumerHandle(body->baseAddress(), body->b
yteLength())); | 301 return wrapUnique(new FetchFormDataConsumerHandle(body->baseAddress(), body-
>byteLength())); |
301 } | 302 } |
302 PassOwnPtr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(const vo
id* data, size_t size) | 303 std::unique_ptr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(con
st void* data, size_t size) |
303 { | 304 { |
304 return adoptPtr(new FetchFormDataConsumerHandle(data, size)); | 305 return wrapUnique(new FetchFormDataConsumerHandle(data, size)); |
305 } | 306 } |
306 PassOwnPtr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(Executio
nContext* executionContext, PassRefPtr<EncodedFormData> body) | 307 std::unique_ptr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::create(Exe
cutionContext* executionContext, PassRefPtr<EncodedFormData> body) |
307 { | 308 { |
308 return adoptPtr(new FetchFormDataConsumerHandle(executionContext, body)); | 309 return wrapUnique(new FetchFormDataConsumerHandle(executionContext, body)); |
309 } | 310 } |
310 PassOwnPtr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::createForTest( | 311 std::unique_ptr<FetchDataConsumerHandle> FetchFormDataConsumerHandle::createForT
est( |
311 ExecutionContext* executionContext, | 312 ExecutionContext* executionContext, |
312 PassRefPtr<EncodedFormData> body, | 313 PassRefPtr<EncodedFormData> body, |
313 FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory) | 314 FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory) |
314 { | 315 { |
315 return adoptPtr(new FetchFormDataConsumerHandle(executionContext, body, load
erFactory)); | 316 return wrapUnique(new FetchFormDataConsumerHandle(executionContext, body, lo
aderFactory)); |
316 } | 317 } |
317 | 318 |
318 FetchFormDataConsumerHandle::FetchFormDataConsumerHandle(const String& body) : m
_context(SimpleContext::create(body)) {} | 319 FetchFormDataConsumerHandle::FetchFormDataConsumerHandle(const String& body) : m
_context(SimpleContext::create(body)) {} |
319 FetchFormDataConsumerHandle::FetchFormDataConsumerHandle(const void* data, size_
t size) : m_context(SimpleContext::create(data, size)) {} | 320 FetchFormDataConsumerHandle::FetchFormDataConsumerHandle(const void* data, size_
t size) : m_context(SimpleContext::create(data, size)) {} |
320 FetchFormDataConsumerHandle::FetchFormDataConsumerHandle(ExecutionContext* execu
tionContext, | 321 FetchFormDataConsumerHandle::FetchFormDataConsumerHandle(ExecutionContext* execu
tionContext, |
321 PassRefPtr<EncodedFormData> body, | 322 PassRefPtr<EncodedFormData> body, |
322 FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory) | 323 FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory) |
323 { | 324 { |
324 if (isSimple(body.get())) { | 325 if (isSimple(body.get())) { |
325 m_context = SimpleContext::create(body); | 326 m_context = SimpleContext::create(body); |
326 } else { | 327 } else { |
327 m_context = ComplexContext::create(executionContext, body, loaderFactory
); | 328 m_context = ComplexContext::create(executionContext, body, loaderFactory
); |
328 } | 329 } |
329 } | 330 } |
330 FetchFormDataConsumerHandle::~FetchFormDataConsumerHandle() {} | 331 FetchFormDataConsumerHandle::~FetchFormDataConsumerHandle() {} |
331 | 332 |
332 FetchDataConsumerHandle::Reader* FetchFormDataConsumerHandle::obtainReaderIntern
al(Client* client) | 333 FetchDataConsumerHandle::Reader* FetchFormDataConsumerHandle::obtainReaderIntern
al(Client* client) |
333 { | 334 { |
334 return m_context->obtainReader(client).leakPtr(); | 335 return m_context->obtainReader(client).release(); |
335 } | 336 } |
336 | 337 |
337 } // namespace blink | 338 } // namespace blink |
OLD | NEW |