Changeset 206421 in webkit
- Timestamp:
- Sep 27, 2016 12:58:48 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r206419 r206421 1 2016-09-27 Youenn Fablet <youenn@apple.com> 2 3 [Fetch API] Refactor FetchBody to use std::experimental::variant 4 https://bugs.webkit.org/show_bug.cgi?id=162559 5 6 Reviewed by Alex Christensen. 7 8 Covered by exiting tests. 9 10 Using variant to represent the variant data types. 11 Adding nullptr as a specific type for default empty values and to allow clean-up. 12 Adding FetchBody::clone as the default copy constructor is deleted with this change. 13 14 * Modules/fetch/FetchBody.cpp: 15 (WebCore::FetchBody::FetchBody): 16 (WebCore::FetchBody::json): 17 (WebCore::FetchBody::text): 18 (WebCore::FetchBody::consumeAsStream): 19 (WebCore::FetchBody::consumeArrayBuffer): 20 (WebCore::FetchBody::consumeArrayBufferView): 21 (WebCore::FetchBody::consumeText): 22 (WebCore::FetchBody::consumeBlob): 23 (WebCore::FetchBody::extractFromText): 24 (WebCore::FetchBody::bodyForInternalRequest): 25 (WebCore::FetchBody::clone): 26 * Modules/fetch/FetchBody.h: 27 (WebCore::FetchBody::blobBody): 28 (WebCore::FetchBody::formDataBody): 29 (WebCore::FetchBody::arrayBufferBody): 30 (WebCore::FetchBody::arrayBufferViewBody): 31 (WebCore::FetchBody::textBody): 32 * Modules/fetch/FetchRequest.cpp: 33 (WebCore::FetchRequest::clone): 34 * Modules/fetch/FetchResponse.cpp: 35 (WebCore::FetchResponse::cloneForJS): 36 1 37 2016-09-26 Joonghun Park <jh718.park@samsung.com> 2 38 -
trunk/Source/WebCore/Modules/fetch/FetchBody.cpp
r206252 r206421 49 49 FetchBody::FetchBody(Ref<Blob>&& blob) 50 50 : m_type(Type::Blob) 51 , m_ contentType(blob->type())52 , m_ blob(WTFMove(blob))51 , m_data(WTFMove(blob)) 52 , m_contentType(this->blobBody().type()) 53 53 { 54 54 } … … 56 56 FetchBody::FetchBody(DOMFormData& formData, Document& document) 57 57 : m_type(Type::FormData) 58 , m_contentType(ASCIILiteral("multipart/form-data")) 59 { 60 m_formData = FormData::createMultiPart(formData, formData.encoding(), &document); 61 m_contentType = makeString("multipart/form-data;boundary=", m_formData->boundary().data()); 58 , m_data(FormData::createMultiPart(formData, formData.encoding(), &document)) 59 , m_contentType(makeString("multipart/form-data;boundary=", this->formDataBody().boundary().data())) 60 { 62 61 } 63 62 64 63 FetchBody::FetchBody(String&& text) 65 64 : m_type(Type::Text) 65 , m_data(WTFMove(text)) 66 66 , m_contentType(ASCIILiteral("text/plain;charset=UTF-8")) 67 , m_text(WTFMove(text))68 67 { 69 68 } … … 77 76 FetchBody::FetchBody(Ref<ArrayBufferView>&& dataView) 78 77 : m_type(Type::ArrayBufferView) 79 , m_dataView(WTFMove(dataView)) 78 , m_data(WTFMove(dataView)) 79 { 80 } 81 82 FetchBody::FetchBody(Type type, const String& contentType, const FetchBodyConsumer& consumer) 83 : m_type(type) 84 , m_contentType(contentType) 85 , m_consumer(consumer) 80 86 { 81 87 } … … 145 151 146 152 if (m_type == Type::Text) { 147 fulfillPromiseWithJSON(WTFMove(promise), m_text);153 fulfillPromiseWithJSON(WTFMove(promise), textBody()); 148 154 return; 149 155 } … … 157 163 158 164 if (m_type == Type::Text) { 159 promise->resolve( m_text);165 promise->resolve(textBody()); 160 166 return; 161 167 } … … 210 216 switch (m_type) { 211 217 case Type::ArrayBuffer: 212 ASSERT(m_data); 213 closeStream = source.enqueue(ArrayBuffer::tryCreate(m_data->data(), m_data->byteLength())); 218 closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferBody().data(), arrayBufferBody().byteLength())); 214 219 m_data = nullptr; 215 220 break; 216 221 case Type::ArrayBufferView: { 217 ASSERT(m_dataView); 218 closeStream = source.enqueue(ArrayBuffer::tryCreate(m_dataView->baseAddress(), m_dataView->byteLength())); 219 m_dataView = nullptr; 222 closeStream = source.enqueue(ArrayBuffer::tryCreate(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength())); 223 m_data = nullptr; 220 224 break; 221 225 } … … 223 227 Vector<uint8_t> data = extractFromText(); 224 228 closeStream = source.enqueue(ArrayBuffer::tryCreate(data.data(), data.size())); 225 m_ text = { };229 m_data = nullptr; 226 230 break; 227 231 } 228 232 case Type::Blob: 229 ASSERT(m_blob); 230 owner.loadBlob(*m_blob, nullptr); 231 m_blob = nullptr; 233 owner.loadBlob(blobBody(), nullptr); 234 m_data = nullptr; 232 235 break; 233 236 case Type::None: … … 249 252 void FetchBody::consumeArrayBuffer(Ref<DeferredPromise>&& promise) 250 253 { 251 ASSERT(m_data); 252 m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_data->data()), m_data->byteLength()); 254 m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(arrayBufferBody().data()), arrayBufferBody().byteLength()); 253 255 m_data = nullptr; 254 256 } … … 256 258 void FetchBody::consumeArrayBufferView(Ref<DeferredPromise>&& promise) 257 259 { 258 ASSERT(m_dataView); 259 m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_dataView->baseAddress()), m_dataView->byteLength()); 260 m_dataView = nullptr; 260 m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(arrayBufferViewBody().baseAddress()), arrayBufferViewBody().byteLength()); 261 m_data = nullptr; 261 262 } 262 263 … … 265 266 Vector<uint8_t> data = extractFromText(); 266 267 m_consumer.resolveWithData(WTFMove(promise), data.data(), data.size()); 267 m_ text = { };268 m_data = nullptr; 268 269 } 269 270 270 271 void FetchBody::consumeBlob(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise) 271 272 { 272 ASSERT(m_blob);273 274 273 m_consumePromise = WTFMove(promise); 275 owner.loadBlob( *m_blob, &m_consumer);276 m_ blob= nullptr;274 owner.loadBlob(blobBody(), &m_consumer); 275 m_data = nullptr; 277 276 } 278 277 … … 281 280 ASSERT(m_type == Type::Text); 282 281 // FIXME: This double allocation is not efficient. Might want to fix that at WTFString level. 283 CString data = m_text.utf8();282 CString data = textBody().utf8(); 284 283 Vector<uint8_t> value(data.length()); 285 284 memcpy(value.data(), data.data(), data.length()); … … 308 307 return nullptr; 309 308 case Type::Text: 310 return FormData::create(UTF8Encoding().encode( m_text, EntitiesForUnencodables));309 return FormData::create(UTF8Encoding().encode(textBody(), EntitiesForUnencodables)); 311 310 case Type::Blob: { 312 ASSERT(m_blob);313 311 RefPtr<FormData> body = FormData::create(); 314 body->appendBlob( m_blob->url());312 body->appendBlob(blobBody().url()); 315 313 return body; 316 314 } 317 315 case Type::ArrayBuffer: 318 ASSERT(m_data); 319 return FormData::create(m_data->data(), m_data->byteLength()); 316 return FormData::create(arrayBufferBody().data(), arrayBufferBody().byteLength()); 320 317 case Type::ArrayBufferView: 321 ASSERT(m_dataView); 322 return FormData::create(m_dataView->baseAddress(), m_dataView->byteLength()); 318 return FormData::create(arrayBufferViewBody().baseAddress(), arrayBufferViewBody().byteLength()); 323 319 case Type::FormData: { 324 ASSERT(m_formData);325 320 ASSERT(!context.isWorkerGlobalScope()); 326 auto body = m_formData;321 RefPtr<FormData> body = const_cast<FormData*>(&formDataBody()); 327 322 body->generateFiles(static_cast<Document*>(&context)); 328 323 return body; … … 334 329 } 335 330 331 FetchBody FetchBody::clone() const 332 { 333 ASSERT(!m_consumePromise); 334 FetchBody clone(m_type, m_contentType, m_consumer); 335 336 switch (m_type) { 337 case Type::ArrayBuffer: 338 clone.m_data = const_cast<ArrayBuffer&>(arrayBufferBody()); 339 break; 340 case Type::ArrayBufferView: 341 clone.m_data = const_cast<ArrayBufferView&>(arrayBufferViewBody()); 342 break; 343 case Type::Blob: 344 clone.m_data = const_cast<Blob&>(blobBody()); 345 break; 346 case Type::FormData: 347 clone.m_data = const_cast<FormData&>(formDataBody()); 348 break; 349 case Type::Text: 350 clone.m_data = textBody(); 351 break; 352 case Type::Loaded: 353 case Type::None: 354 case Type::Loading: 355 case Type::ReadableStream: 356 break; 357 } 358 return clone; 359 } 360 336 361 } 337 362 -
trunk/Source/WebCore/Modules/fetch/FetchBody.h
r206252 r206421 37 37 #include "FormData.h" 38 38 #include "JSDOMPromise.h" 39 #include <wtf/Variant.h> 39 40 40 41 namespace JSC { … … 86 87 void cleanConsumePromise() { m_consumePromise = nullptr; } 87 88 89 FetchBody clone() const; 90 88 91 private: 89 92 FetchBody(Ref<Blob>&&); … … 92 95 FetchBody(DOMFormData&, Document&); 93 96 FetchBody(String&&); 97 FetchBody(Type, const String&, const FetchBodyConsumer&); 94 98 FetchBody(Type type) : m_type(type) { } 95 99 … … 102 106 void consumeBlob(FetchBodyOwner&, Ref<DeferredPromise>&&); 103 107 108 Blob& blobBody() { return std::experimental::get<Ref<Blob>>(m_data).get(); } 109 const Blob& blobBody() const { return std::experimental::get<Ref<Blob>>(m_data).get(); } 110 FormData& formDataBody() { return std::experimental::get<Ref<FormData>>(m_data).get(); } 111 const FormData& formDataBody() const { return std::experimental::get<Ref<FormData>>(m_data).get(); } 112 ArrayBuffer& arrayBufferBody() { return std::experimental::get<Ref<ArrayBuffer>>(m_data).get(); } 113 const ArrayBuffer& arrayBufferBody() const { return std::experimental::get<Ref<ArrayBuffer>>(m_data).get(); } 114 ArrayBufferView& arrayBufferViewBody() { return std::experimental::get<Ref<ArrayBufferView>>(m_data).get(); } 115 const ArrayBufferView& arrayBufferViewBody() const { return std::experimental::get<Ref<ArrayBufferView>>(m_data).get(); } 116 String& textBody() { return std::experimental::get<String>(m_data); } 117 const String& textBody() const { return std::experimental::get<String>(m_data); } 118 104 119 Type m_type { Type::None }; 105 String m_contentType;106 120 107 121 // FIXME: Add support for URLSearchParams. 108 RefPtr<Blob> m_blob; 109 RefPtr<FormData> m_formData; 110 RefPtr<ArrayBuffer> m_data; 111 RefPtr<ArrayBufferView> m_dataView; 112 String m_text; 122 std::experimental::variant<std::nullptr_t, Ref<Blob>, Ref<FormData>, Ref<ArrayBuffer>, Ref<ArrayBufferView>, String> m_data; 123 String m_contentType; 113 124 114 125 FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::None }; -
trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp
r206009 r206421 315 315 } 316 316 317 return adoptRef(*new FetchRequest(context, FetchBody(m_body), FetchHeaders::create(m_headers.get()), FetchRequest::InternalRequest(m_internalRequest)));317 return adoptRef(*new FetchRequest(context, m_body.clone(), FetchHeaders::create(m_headers.get()), FetchRequest::InternalRequest(m_internalRequest))); 318 318 } 319 319 -
trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp
r206252 r206421 99 99 ASSERT(scriptExecutionContext()); 100 100 ASSERT(!isDisturbedOrLocked()); 101 return adoptRef(*new FetchResponse(*scriptExecutionContext(), FetchBody(m_body), FetchHeaders::create(headers()), ResourceResponse(m_response)));101 return adoptRef(*new FetchResponse(*scriptExecutionContext(), m_body.clone(), FetchHeaders::create(headers()), ResourceResponse(m_response))); 102 102 } 103 103
Note: See TracChangeset
for help on using the changeset viewer.