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