Index: third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp |
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp |
index eae72e1e03323bca9e761c5068e30b3531e7451d..c74d9e94739cd731464822eaaff8b2fe52b1bfc5 100644 |
--- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp |
+++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp |
@@ -23,7 +23,8 @@ |
#include "core/xmlhttprequest/XMLHttpRequest.h" |
-#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData.h" |
+#include <memory> |
+#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormDataOrURLSearchParams.h" |
#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.h" |
#include "bindings/core/v8/DOMWrapperWorld.h" |
#include "bindings/core/v8/ExceptionState.h" |
@@ -37,6 +38,7 @@ |
#include "core/dom/DocumentParser.h" |
#include "core/dom/ExceptionCode.h" |
#include "core/dom/ExecutionContext.h" |
+#include "core/dom/URLSearchParams.h" |
#include "core/dom/XMLDocument.h" |
#include "core/editing/serializers/Serialization.h" |
#include "core/events/Event.h" |
@@ -81,7 +83,6 @@ |
#include "wtf/AutoReset.h" |
#include "wtf/StdLibExtras.h" |
#include "wtf/text/CString.h" |
-#include <memory> |
namespace blink { |
@@ -704,7 +705,8 @@ bool XMLHttpRequest::initSend(ExceptionState& exceptionState) { |
} |
void XMLHttpRequest::send( |
- const ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData& body, |
+ const ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormDataOrURLSearchParams& |
+ body, |
ExceptionState& exceptionState) { |
probe::willSendXMLHttpOrFetchNetworkRequest(getExecutionContext(), url()); |
@@ -738,6 +740,11 @@ void XMLHttpRequest::send( |
return; |
} |
+ if (body.isURLSearchParams()) { |
+ send(body.getAsURLSearchParams(), exceptionState); |
+ return; |
+ } |
+ |
DCHECK(body.isString()); |
send(body.getAsString(), exceptionState); |
} |
@@ -784,17 +791,9 @@ void XMLHttpRequest::send(const String& body, ExceptionState& exceptionState) { |
RefPtr<EncodedFormData> httpBody; |
if (!body.isNull() && areMethodAndURLValidForSend()) { |
- String contentType = getRequestHeader(HTTPNames::Content_Type); |
- if (contentType.isEmpty()) { |
- setRequestHeaderInternal(HTTPNames::Content_Type, |
- "text/plain;charset=UTF-8"); |
- } else { |
- replaceCharsetInMediaType(contentType, "UTF-8"); |
- m_requestHeaders.set(HTTPNames::Content_Type, AtomicString(contentType)); |
- } |
- |
httpBody = EncodedFormData::create( |
UTF8Encoding().encode(body, WTF::EntitiesForUnencodables)); |
+ updateContentTypeAndCharset("text/plain;charset=UTF-8", "UTF-8"); |
} |
createRequest(std::move(httpBody), exceptionState); |
@@ -846,6 +845,8 @@ void XMLHttpRequest::send(FormData* body, ExceptionState& exceptionState) { |
if (areMethodAndURLValidForSend()) { |
httpBody = body->encodeMultiPartFormData(); |
+ // TODO (sof): override any author-provided charset= in the |
+ // content type value to UTF-8 ? |
if (getRequestHeader(HTTPNames::Content_Type).isEmpty()) { |
AtomicString contentType = |
AtomicString("multipart/form-data; boundary=") + |
@@ -857,6 +858,24 @@ void XMLHttpRequest::send(FormData* body, ExceptionState& exceptionState) { |
createRequest(std::move(httpBody), exceptionState); |
} |
+void XMLHttpRequest::send(URLSearchParams* body, |
+ ExceptionState& exceptionState) { |
+ NETWORK_DVLOG(1) << this << " send() URLSearchParams " << body; |
+ |
+ if (!initSend(exceptionState)) |
+ return; |
+ |
+ RefPtr<EncodedFormData> httpBody; |
+ |
+ if (areMethodAndURLValidForSend()) { |
+ httpBody = body->toEncodedFormData(); |
+ updateContentTypeAndCharset( |
+ "application/x-www-form-urlencoded;charset=UTF-8", "UTF-8"); |
+ } |
+ |
+ createRequest(std::move(httpBody), exceptionState); |
+} |
+ |
void XMLHttpRequest::send(DOMArrayBuffer* body, |
ExceptionState& exceptionState) { |
NETWORK_DVLOG(1) << this << " send() ArrayBuffer " << body; |
@@ -1443,6 +1462,20 @@ AtomicString XMLHttpRequest::finalResponseMIMETypeWithFallback() const { |
return AtomicString("text/xml"); |
} |
+void XMLHttpRequest::updateContentTypeAndCharset( |
+ const AtomicString& defaultContentType, |
+ const String& charset) { |
+ // http://xhr.spec.whatwg.org/#the-send()-method step 4's concilliation of |
+ // "charset=" in any author-provided Content-Type: request header. |
+ String contentType = getRequestHeader(HTTPNames::Content_Type); |
+ if (contentType.isEmpty()) { |
+ setRequestHeaderInternal(HTTPNames::Content_Type, defaultContentType); |
+ return; |
+ } |
+ replaceCharsetInMediaType(contentType, charset); |
+ m_requestHeaders.set(HTTPNames::Content_Type, AtomicString(contentType)); |
+} |
+ |
bool XMLHttpRequest::responseIsXML() const { |
return DOMImplementation::isXMLMIMEType(finalResponseMIMETypeWithFallback()); |
} |