| Index: Source/core/xml/XMLHttpRequest.cpp
|
| diff --git a/Source/core/xml/XMLHttpRequest.cpp b/Source/core/xml/XMLHttpRequest.cpp
|
| index f61ccecb5197a0b09cc824fd4449325aec40d271..17f9b163b0be769f42c51f68bd898d1696082956 100644
|
| --- a/Source/core/xml/XMLHttpRequest.cpp
|
| +++ b/Source/core/xml/XMLHttpRequest.cpp
|
| @@ -224,6 +224,17 @@ ScriptString XMLHttpRequest::responseText(ExceptionState& es)
|
| return m_responseText;
|
| }
|
|
|
| +ScriptString XMLHttpRequest::responseJSONSource(ExceptionState& es)
|
| +{
|
| + if (m_responseTypeCode != ResponseTypeJSON) {
|
| + es.throwDOMException(InvalidStateError);
|
| + return ScriptString();
|
| + }
|
| + if (m_error || m_state != DONE)
|
| + return ScriptString();
|
| + return m_responseText;
|
| +}
|
| +
|
| Document* XMLHttpRequest::responseXML(ExceptionState& es)
|
| {
|
| if (m_responseTypeCode != ResponseTypeDefault && m_responseTypeCode != ResponseTypeDocument) {
|
| @@ -340,6 +351,8 @@ void XMLHttpRequest::setResponseType(const String& responseType, ExceptionState&
|
| m_responseTypeCode = ResponseTypeDefault;
|
| else if (responseType == "text")
|
| m_responseTypeCode = ResponseTypeText;
|
| + else if (responseType == "json")
|
| + m_responseTypeCode = ResponseTypeJSON;
|
| else if (responseType == "document")
|
| m_responseTypeCode = ResponseTypeDocument;
|
| else if (responseType == "blob")
|
| @@ -357,6 +370,8 @@ String XMLHttpRequest::responseType()
|
| return "";
|
| case ResponseTypeText:
|
| return "text";
|
| + case ResponseTypeJSON:
|
| + return "json";
|
| case ResponseTypeDocument:
|
| return "document";
|
| case ResponseTypeBlob:
|
| @@ -1129,10 +1144,12 @@ void XMLHttpRequest::didReceiveData(const char* data, int len)
|
| if (m_state < HEADERS_RECEIVED)
|
| changeState(HEADERS_RECEIVED);
|
|
|
| - bool useDecoder = m_responseTypeCode == ResponseTypeDefault || m_responseTypeCode == ResponseTypeText || m_responseTypeCode == ResponseTypeDocument;
|
| + bool useDecoder = m_responseTypeCode == ResponseTypeDefault || m_responseTypeCode == ResponseTypeText || m_responseTypeCode == ResponseTypeJSON || m_responseTypeCode == ResponseTypeDocument;
|
|
|
| if (useDecoder && !m_decoder) {
|
| - if (!m_responseEncoding.isEmpty())
|
| + if (m_responseTypeCode == ResponseTypeJSON)
|
| + m_decoder = TextResourceDecoder::create("application/json", "UTF-8");
|
| + else if (!m_responseEncoding.isEmpty())
|
| m_decoder = TextResourceDecoder::create("text/plain", m_responseEncoding);
|
| // allow TextResourceDecoder to look inside the m_response if it's XML or HTML
|
| else if (responseIsXML()) {
|
|
|