v8::Handle<v8::Value> V8DOMFormData::appendCallback(const v8::Arguments& args) { if (args.Length() < 2) return throwError(v8SyntaxError, "Not enough arguments", args.GetIsolate()); DOMFormData* domFormData = V8DOMFormData::toNative(args.Holder()); String name = toWebCoreStringWithNullCheck(args[0]); v8::Handle<v8::Value> arg = args[1]; if (V8Blob::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); Blob* blob = V8Blob::toNative(object); ASSERT(blob); String filename; if (args.Length() >= 3 && !args[2]->IsUndefined()) filename = toWebCoreStringWithNullCheck(args[2]); domFormData->append(name, blob, filename); } else domFormData->append(name, toWebCoreStringWithNullCheck(arg)); return v8::Undefined(); }
/* v8::Handle<v8::Value> V8DOMFormData::constructorCallback(const v8::Arguments& args) { INC_STATS("DOM.FormData.Constructor"); if (!args.IsConstructCall()) return throwError("DOM object constructor cannot be called as a function.", V8Proxy::SyntaxError); HTMLFormElement* form = 0; if (args.Length() > 0 && V8HTMLFormElement::HasInstance(args[0])) form = V8HTMLFormElement::toNative(args[0]->ToObject()); RefPtr<DOMFormData> domFormData = DOMFormData::create(form); V8DOMWrapper::setDOMWrapper(args.Holder(), &info, domFormData.get()); return toV8(domFormData.release(), args.Holder()); } */ v8::Handle<v8::Value> V8DOMFormData::appendCallback(const v8::Arguments& args) { INC_STATS("DOM.FormData.append()"); if (args.Length() < 2) return throwError("Not enough arguments", V8Proxy::SyntaxError); DOMFormData* domFormData = V8DOMFormData::toNative(args.Holder()); String name = toWebCoreStringWithNullCheck(args[0]); v8::Handle<v8::Value> arg = args[1]; if (V8Blob::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); Blob* blob = V8Blob::toNative(object); ASSERT(blob); domFormData->append(name, blob); } else domFormData->append(name, toWebCoreStringWithNullCheck(arg)); return v8::Undefined(); }
ExceptionOr<void> XMLHttpRequest::send(DOMFormData& body) { if (auto result = prepareToSend()) return WTFMove(result.value()); if (m_method != "GET" && m_method != "HEAD" && m_url.protocolIsInHTTPFamily()) { m_requestEntityBody = FormData::createMultiPart(body, body.encoding(), document()); m_requestEntityBody->generateFiles(document()); if (!m_requestHeaders.contains(HTTPHeaderName::ContentType)) m_requestHeaders.set(HTTPHeaderName::ContentType, makeString("multipart/form-data; boundary=", m_requestEntityBody->boundary().data())); } return createRequest(); }
RequestInit::RequestInit(ExecutionContext* context, const Dictionary& options, ExceptionState& exceptionState) { DictionaryHelper::get(options, "method", method); DictionaryHelper::get(options, "headers", headers); if (!headers) { Vector<Vector<String>> headersVector; if (DictionaryHelper::get(options, "headers", headersVector, exceptionState)) headers = Headers::create(headersVector, exceptionState); else DictionaryHelper::get(options, "headers", headersDictionary); } DictionaryHelper::get(options, "mode", mode); DictionaryHelper::get(options, "credentials", credentials); v8::Local<v8::Value> body; if (!DictionaryHelper::get(options, "body", body) || body->IsUndefined() || body->IsNull()) return; OwnPtr<BlobData> blobData = BlobData::create(); v8::Isolate* isolate = toIsolate(context); if (body->IsArrayBuffer()) { DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(body)); ASSERT(arrayBuffer); blobData->appendBytes(arrayBuffer->data(), arrayBuffer->byteLength()); } else if (body->IsArrayBufferView()) { DOMArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(body)); ASSERT(arrayBufferView); blobData->appendBytes(arrayBufferView->baseAddress(), arrayBufferView->byteLength()); } else if (V8Blob::hasInstance(body, isolate)) { Blob* blob = V8Blob::toImpl(v8::Local<v8::Object>::Cast(body)); ASSERT(blob); blob->appendTo(*blobData); blobData->setContentType(blob->type()); } else if (V8FormData::hasInstance(body, isolate)) { DOMFormData* domFormData = V8FormData::toImpl(v8::Local<v8::Object>::Cast(body)); ASSERT(domFormData); RefPtr<FormData> httpBody = domFormData->createMultiPartFormData(); for (size_t i = 0; i < httpBody->elements().size(); ++i) { const FormDataElement& element = httpBody->elements()[i]; switch (element.m_type) { case FormDataElement::data: { blobData->appendBytes(element.m_data.data(), element.m_data.size()); break; } case FormDataElement::encodedFile: blobData->appendFile(element.m_filename, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime); break; case FormDataElement::encodedBlob: if (element.m_optionalBlobDataHandle) blobData->appendBlob(element.m_optionalBlobDataHandle, 0, element.m_optionalBlobDataHandle->size()); break; case FormDataElement::encodedFileSystemURL: blobData->appendFileSystemURL(element.m_fileSystemURL, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime); break; default: ASSERT_NOT_REACHED(); } } blobData->setContentType(AtomicString("multipart/form-data; boundary=", AtomicString::ConstructFromLiteral) + httpBody->boundary().data()); } else if (body->IsString()) { String stringValue(toUSVString(isolate, body, exceptionState)); blobData->appendText(stringValue, false); blobData->setContentType("text/plain;charset=UTF-8"); } else { return; } const long long blobSize = blobData->length(); bodyBlobHandle = BlobDataHandle::create(blobData.release(), blobSize); }