JSXMLHttpRequestCustom.cpp [plain text]
#include "config.h"
#include "JSXMLHttpRequest.h"
#include "JSBlob.h"
#include "JSDOMConvertBufferSource.h"
#include "JSDOMConvertInterface.h"
#include "JSDOMConvertJSON.h"
#include "JSDOMConvertNullable.h"
#include "JSDOMConvertStrings.h"
#include "JSDocument.h"
namespace WebCore {
using namespace JSC;
void JSXMLHttpRequest::visitAdditionalChildren(SlotVisitor& visitor)
{
if (auto* upload = wrapped().optionalUpload())
visitor.addOpaqueRoot(upload);
if (auto* responseDocument = wrapped().optionalResponseXML())
visitor.addOpaqueRoot(responseDocument);
}
JSValue JSXMLHttpRequest::response(ExecState& state) const
{
auto cacheResult = [&] (JSValue value) -> JSValue {
m_response.set(state.vm(), this, value);
return value;
};
if (wrapped().responseCacheIsValid())
return m_response.get();
auto type = wrapped().responseType();
switch (type) {
case XMLHttpRequest::ResponseType::EmptyString:
case XMLHttpRequest::ResponseType::Text: {
auto scope = DECLARE_THROW_SCOPE(state.vm());
return cacheResult(toJS<IDLNullable<IDLUSVString>>(state, scope, wrapped().responseText()));
}
default:
break;
}
if (!wrapped().doneWithoutErrors())
return cacheResult(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 cacheResult(value);
}
}