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

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

Issue 2050123002: Remove OwnPtr from Blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: First attempt to land. 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"
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698