JSXMLHttpRequestCustom.cpp [plain text]
#include "config.h"
#include "JSXMLHttpRequest.h"
#include "JSBlob.h"
#include "JSDOMConvertBufferSource.h"
#include "JSDOMConvertInterface.h"
#include "JSDOMConvertJSON.h"
#include "JSDocument.h"
#include <runtime/ArrayBuffer.h>
#include <runtime/JSArrayBuffer.h>
#include <runtime/JSArrayBufferView.h>
using namespace JSC;
namespace WebCore {
void JSXMLHttpRequest::visitAdditionalChildren(SlotVisitor& visitor)
{
if (XMLHttpRequestUpload* upload = wrapped().optionalUpload())
visitor.addOpaqueRoot(upload);
if (Document* responseDocument = wrapped().optionalResponseXML())
visitor.addOpaqueRoot(responseDocument);
}
JSValue JSXMLHttpRequest::responseText(ExecState& state) const
{
auto result = wrapped().responseText();
if (UNLIKELY(result.hasException())) {
auto& vm = state.vm();
auto scope = DECLARE_THROW_SCOPE(vm);
propagateException(state, scope, result.releaseException());
return { };
}
auto resultValue = result.releaseReturnValue();
if (resultValue.isNull())
return jsNull();
return jsOwnedString(&state, resultValue);
}
JSValue JSXMLHttpRequest::retrieveResponse(ExecState& state)
{
auto type = wrapped().responseType();
switch (type) {
case XMLHttpRequest::ResponseType::EmptyString:
case XMLHttpRequest::ResponseType::Text:
return responseText(state);
default:
break;
}
if (!wrapped().doneWithoutErrors())
return jsNull();
JSValue value;
switch (type) {
case XMLHttpRequest::ResponseType::EmptyString:
case XMLHttpRequest::ResponseType::Text:
ASSERT_NOT_REACHED();
return jsUndefined();
case XMLHttpRequest::ResponseType::Json:
value = toJS<IDLJSON>(state, wrapped().responseTextIgnoringResponseType());
if (!value)
value = jsNull();
break;
case XMLHttpRequest::ResponseType::Document: {
auto document = wrapped().responseXML();
ASSERT(!document.hasException());
value = toJS<IDLInterface<Document>>(state, *globalObject(), document.releaseReturnValue());
break;
}
case XMLHttpRequest::ResponseType::Blob:
value = toJSNewlyCreated<IDLInterface<Blob>>(state, *globalObject(), wrapped().createResponseBlob());
break;
case XMLHttpRequest::ResponseType::Arraybuffer:
value = toJS<IDLInterface<ArrayBuffer>>(state, *globalObject(), wrapped().createResponseArrayBuffer());
break;
}
wrapped().didCacheResponse();
return value;
}
}