Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/FetchFormDataConsumerHandle.cpp

Issue 2080623002: Revert "Remove OwnPtr from Blink." (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698