1/*
2 This file is part of the WebKit open source project.
3 This file has been generated by generate-bindings.pl. DO NOT MODIFY!
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21#include "config.h"
22#include "JSXMLHttpRequest.h"
23
24#include "EventNames.h"
25#include "JSBlob.h"
26#include "JSDOMAttribute.h"
27#include "JSDOMBinding.h"
28#include "JSDOMConstructor.h"
29#include "JSDOMConvertBoolean.h"
30#include "JSDOMConvertBufferSource.h"
31#include "JSDOMConvertInterface.h"
32#include "JSDOMConvertNullable.h"
33#include "JSDOMConvertNumbers.h"
34#include "JSDOMConvertStrings.h"
35#include "JSDOMConvertUnion.h"
36#include "JSDOMExceptionHandling.h"
37#include "JSDOMFormData.h"
38#include "JSDOMGlobalObject.h"
39#include "JSDOMOperation.h"
40#include "JSDOMWrapperCache.h"
41#include "JSDocument.h"
42#include "JSEventListener.h"
43#include "JSXMLHttpRequestUpload.h"
44#include "ScriptExecutionContext.h"
45#include <JavaScriptCore/HeapSnapshotBuilder.h>
46#include <JavaScriptCore/JSCInlines.h>
47#include <JavaScriptCore/JSString.h>
48#include <wtf/GetPtr.h>
49#include <wtf/PointerPreparations.h>
50#include <wtf/URL.h>
51#include <wtf/Variant.h>
52
53
54namespace WebCore {
55using namespace JSC;
56
57String convertEnumerationToString(XMLHttpRequest::ResponseType enumerationValue)
58{
59 static const NeverDestroyed<String> values[] = {
60 emptyString(),
61 MAKE_STATIC_STRING_IMPL("arraybuffer"),
62 MAKE_STATIC_STRING_IMPL("blob"),
63 MAKE_STATIC_STRING_IMPL("document"),
64 MAKE_STATIC_STRING_IMPL("json"),
65 MAKE_STATIC_STRING_IMPL("text"),
66 };
67 static_assert(static_cast<size_t>(XMLHttpRequest::ResponseType::EmptyString) == 0, "XMLHttpRequest::ResponseType::EmptyString is not 0 as expected");
68 static_assert(static_cast<size_t>(XMLHttpRequest::ResponseType::Arraybuffer) == 1, "XMLHttpRequest::ResponseType::Arraybuffer is not 1 as expected");
69 static_assert(static_cast<size_t>(XMLHttpRequest::ResponseType::Blob) == 2, "XMLHttpRequest::ResponseType::Blob is not 2 as expected");
70 static_assert(static_cast<size_t>(XMLHttpRequest::ResponseType::Document) == 3, "XMLHttpRequest::ResponseType::Document is not 3 as expected");
71 static_assert(static_cast<size_t>(XMLHttpRequest::ResponseType::Json) == 4, "XMLHttpRequest::ResponseType::Json is not 4 as expected");
72 static_assert(static_cast<size_t>(XMLHttpRequest::ResponseType::Text) == 5, "XMLHttpRequest::ResponseType::Text is not 5 as expected");
73 ASSERT(static_cast<size_t>(enumerationValue) < WTF_ARRAY_LENGTH(values));
74 return values[static_cast<size_t>(enumerationValue)];
75}
76
77template<> JSString* convertEnumerationToJS(ExecState& state, XMLHttpRequest::ResponseType enumerationValue)
78{
79 return jsStringWithCache(&state, convertEnumerationToString(enumerationValue));
80}
81
82template<> Optional<XMLHttpRequest::ResponseType> parseEnumeration<XMLHttpRequest::ResponseType>(ExecState& state, JSValue value)
83{
84 auto stringValue = value.toWTFString(&state);
85 if (stringValue.isEmpty())
86 return XMLHttpRequest::ResponseType::EmptyString;
87 if (stringValue == "arraybuffer")
88 return XMLHttpRequest::ResponseType::Arraybuffer;
89 if (stringValue == "blob")
90 return XMLHttpRequest::ResponseType::Blob;
91 if (stringValue == "document")
92 return XMLHttpRequest::ResponseType::Document;
93 if (stringValue == "json")
94 return XMLHttpRequest::ResponseType::Json;
95 if (stringValue == "text")
96 return XMLHttpRequest::ResponseType::Text;
97 return WTF::nullopt;
98}
99
100template<> const char* expectedEnumerationValues<XMLHttpRequest::ResponseType>()
101{
102 return "\"\", \"arraybuffer\", \"blob\", \"document\", \"json\", \"text\"";
103}
104
105// Functions
106
107JSC::EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionOpen(JSC::ExecState*);
108JSC::EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionSetRequestHeader(JSC::ExecState*);
109JSC::EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionSend(JSC::ExecState*);
110JSC::EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionAbort(JSC::ExecState*);
111JSC::EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionGetResponseHeader(JSC::ExecState*);
112JSC::EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionGetAllResponseHeaders(JSC::ExecState*);
113JSC::EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionOverrideMimeType(JSC::ExecState*);
114
115// Attributes
116
117JSC::EncodedJSValue jsXMLHttpRequestConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
118bool setJSXMLHttpRequestConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
119JSC::EncodedJSValue jsXMLHttpRequestOnreadystatechange(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
120bool setJSXMLHttpRequestOnreadystatechange(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
121JSC::EncodedJSValue jsXMLHttpRequestReadyState(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
122JSC::EncodedJSValue jsXMLHttpRequestTimeout(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
123bool setJSXMLHttpRequestTimeout(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
124JSC::EncodedJSValue jsXMLHttpRequestWithCredentials(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
125bool setJSXMLHttpRequestWithCredentials(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
126JSC::EncodedJSValue jsXMLHttpRequestUpload(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
127JSC::EncodedJSValue jsXMLHttpRequestResponseURL(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
128JSC::EncodedJSValue jsXMLHttpRequestStatus(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
129JSC::EncodedJSValue jsXMLHttpRequestStatusText(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
130JSC::EncodedJSValue jsXMLHttpRequestResponseType(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
131bool setJSXMLHttpRequestResponseType(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
132JSC::EncodedJSValue jsXMLHttpRequestResponse(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
133JSC::EncodedJSValue jsXMLHttpRequestResponseText(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
134JSC::EncodedJSValue jsXMLHttpRequestResponseXML(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
135
136class JSXMLHttpRequestPrototype : public JSC::JSNonFinalObject {
137public:
138 using Base = JSC::JSNonFinalObject;
139 static JSXMLHttpRequestPrototype* create(JSC::VM& vm, JSDOMGlobalObject* globalObject, JSC::Structure* structure)
140 {
141 JSXMLHttpRequestPrototype* ptr = new (NotNull, JSC::allocateCell<JSXMLHttpRequestPrototype>(vm.heap)) JSXMLHttpRequestPrototype(vm, globalObject, structure);
142 ptr->finishCreation(vm);
143 return ptr;
144 }
145
146 DECLARE_INFO;
147 static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
148 {
149 return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
150 }
151
152private:
153 JSXMLHttpRequestPrototype(JSC::VM& vm, JSC::JSGlobalObject*, JSC::Structure* structure)
154 : JSC::JSNonFinalObject(vm, structure)
155 {
156 }
157
158 void finishCreation(JSC::VM&);
159};
160
161using JSXMLHttpRequestConstructor = JSDOMConstructor<JSXMLHttpRequest>;
162
163/* Hash table for constructor */
164
165static const HashTableValue JSXMLHttpRequestConstructorTableValues[] =
166{
167 { "UNSENT", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0) } },
168 { "OPENED", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(1) } },
169 { "HEADERS_RECEIVED", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(2) } },
170 { "LOADING", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(3) } },
171 { "DONE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(4) } },
172};
173
174static_assert(XMLHttpRequest::UNSENT == 0, "UNSENT in XMLHttpRequest does not match value from IDL");
175static_assert(XMLHttpRequest::OPENED == 1, "OPENED in XMLHttpRequest does not match value from IDL");
176static_assert(XMLHttpRequest::HEADERS_RECEIVED == 2, "HEADERS_RECEIVED in XMLHttpRequest does not match value from IDL");
177static_assert(XMLHttpRequest::LOADING == 3, "LOADING in XMLHttpRequest does not match value from IDL");
178static_assert(XMLHttpRequest::DONE == 4, "DONE in XMLHttpRequest does not match value from IDL");
179
180template<> EncodedJSValue JSC_HOST_CALL JSXMLHttpRequestConstructor::construct(ExecState* state)
181{
182 VM& vm = state->vm();
183 auto throwScope = DECLARE_THROW_SCOPE(vm);
184 UNUSED_PARAM(throwScope);
185 auto* castedThis = jsCast<JSXMLHttpRequestConstructor*>(state->jsCallee());
186 ASSERT(castedThis);
187 auto* context = castedThis->scriptExecutionContext();
188 if (UNLIKELY(!context))
189 return throwConstructorScriptExecutionContextUnavailableError(*state, throwScope, "XMLHttpRequest");
190 auto object = XMLHttpRequest::create(*context);
191 return JSValue::encode(toJSNewlyCreated<IDLInterface<XMLHttpRequest>>(*state, *castedThis->globalObject(), WTFMove(object)));
192}
193
194template<> JSValue JSXMLHttpRequestConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
195{
196 return JSXMLHttpRequestEventTarget::getConstructor(vm, &globalObject);
197}
198
199template<> void JSXMLHttpRequestConstructor::initializeProperties(VM& vm, JSDOMGlobalObject& globalObject)
200{
201 putDirect(vm, vm.propertyNames->prototype, JSXMLHttpRequest::prototype(vm, globalObject), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
202 putDirect(vm, vm.propertyNames->name, jsNontrivialString(&vm, String("XMLHttpRequest"_s)), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
203 putDirect(vm, vm.propertyNames->length, jsNumber(0), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
204 reifyStaticProperties(vm, JSXMLHttpRequest::info(), JSXMLHttpRequestConstructorTableValues, *this);
205}
206
207template<> const ClassInfo JSXMLHttpRequestConstructor::s_info = { "XMLHttpRequest", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSXMLHttpRequestConstructor) };
208
209/* Hash table for prototype */
210
211static const HashTableValue JSXMLHttpRequestPrototypeTableValues[] =
212{
213 { "constructor", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSXMLHttpRequestConstructor) } },
214 { "onreadystatechange", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestOnreadystatechange), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSXMLHttpRequestOnreadystatechange) } },
215 { "readyState", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestReadyState), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
216 { "timeout", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestTimeout), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSXMLHttpRequestTimeout) } },
217 { "withCredentials", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestWithCredentials), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSXMLHttpRequestWithCredentials) } },
218 { "upload", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestUpload), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
219 { "responseURL", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestResponseURL), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
220 { "status", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestStatus), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
221 { "statusText", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestStatusText), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
222 { "responseType", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestResponseType), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSXMLHttpRequestResponseType) } },
223 { "response", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestResponse), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
224 { "responseText", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestResponseText), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
225 { "responseXML", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsXMLHttpRequestResponseXML), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
226 { "open", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsXMLHttpRequestPrototypeFunctionOpen), (intptr_t) (2) } },
227 { "setRequestHeader", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsXMLHttpRequestPrototypeFunctionSetRequestHeader), (intptr_t) (2) } },
228 { "send", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsXMLHttpRequestPrototypeFunctionSend), (intptr_t) (0) } },
229 { "abort", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsXMLHttpRequestPrototypeFunctionAbort), (intptr_t) (0) } },
230 { "getResponseHeader", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsXMLHttpRequestPrototypeFunctionGetResponseHeader), (intptr_t) (1) } },
231 { "getAllResponseHeaders", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsXMLHttpRequestPrototypeFunctionGetAllResponseHeaders), (intptr_t) (0) } },
232 { "overrideMimeType", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsXMLHttpRequestPrototypeFunctionOverrideMimeType), (intptr_t) (1) } },
233 { "UNSENT", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0) } },
234 { "OPENED", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(1) } },
235 { "HEADERS_RECEIVED", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(2) } },
236 { "LOADING", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(3) } },
237 { "DONE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(4) } },
238};
239
240const ClassInfo JSXMLHttpRequestPrototype::s_info = { "XMLHttpRequestPrototype", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSXMLHttpRequestPrototype) };
241
242void JSXMLHttpRequestPrototype::finishCreation(VM& vm)
243{
244 Base::finishCreation(vm);
245 reifyStaticProperties(vm, JSXMLHttpRequest::info(), JSXMLHttpRequestPrototypeTableValues, *this);
246 bool hasDisabledRuntimeProperties = false;
247 if (!jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->isDocument()) {
248 hasDisabledRuntimeProperties = true;
249 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("responseXML"), strlen("responseXML"));
250 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
251 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
252 }
253 if (hasDisabledRuntimeProperties && structure()->isDictionary())
254 flattenDictionaryObject(vm);
255}
256
257const ClassInfo JSXMLHttpRequest::s_info = { "XMLHttpRequest", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSXMLHttpRequest) };
258
259JSXMLHttpRequest::JSXMLHttpRequest(Structure* structure, JSDOMGlobalObject& globalObject, Ref<XMLHttpRequest>&& impl)
260 : JSXMLHttpRequestEventTarget(structure, globalObject, WTFMove(impl))
261{
262}
263
264void JSXMLHttpRequest::finishCreation(VM& vm)
265{
266 Base::finishCreation(vm);
267 ASSERT(inherits(vm, info()));
268
269}
270
271JSObject* JSXMLHttpRequest::createPrototype(VM& vm, JSDOMGlobalObject& globalObject)
272{
273 return JSXMLHttpRequestPrototype::create(vm, &globalObject, JSXMLHttpRequestPrototype::createStructure(vm, &globalObject, JSXMLHttpRequestEventTarget::prototype(vm, globalObject)));
274}
275
276JSObject* JSXMLHttpRequest::prototype(VM& vm, JSDOMGlobalObject& globalObject)
277{
278 return getDOMPrototype<JSXMLHttpRequest>(vm, globalObject);
279}
280
281JSValue JSXMLHttpRequest::getConstructor(VM& vm, const JSGlobalObject* globalObject)
282{
283 return getDOMConstructor<JSXMLHttpRequestConstructor>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));
284}
285
286template<> inline JSXMLHttpRequest* IDLAttribute<JSXMLHttpRequest>::cast(ExecState& state, EncodedJSValue thisValue)
287{
288 return jsDynamicCast<JSXMLHttpRequest*>(state.vm(), JSValue::decode(thisValue));
289}
290
291template<> inline JSXMLHttpRequest* IDLOperation<JSXMLHttpRequest>::cast(ExecState& state)
292{
293 return jsDynamicCast<JSXMLHttpRequest*>(state.vm(), state.thisValue());
294}
295
296EncodedJSValue jsXMLHttpRequestConstructor(ExecState* state, EncodedJSValue thisValue, PropertyName)
297{
298 VM& vm = state->vm();
299 auto throwScope = DECLARE_THROW_SCOPE(vm);
300 auto* prototype = jsDynamicCast<JSXMLHttpRequestPrototype*>(vm, JSValue::decode(thisValue));
301 if (UNLIKELY(!prototype))
302 return throwVMTypeError(state, throwScope);
303 return JSValue::encode(JSXMLHttpRequest::getConstructor(state->vm(), prototype->globalObject()));
304}
305
306bool setJSXMLHttpRequestConstructor(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
307{
308 VM& vm = state->vm();
309 auto throwScope = DECLARE_THROW_SCOPE(vm);
310 auto* prototype = jsDynamicCast<JSXMLHttpRequestPrototype*>(vm, JSValue::decode(thisValue));
311 if (UNLIKELY(!prototype)) {
312 throwVMTypeError(state, throwScope);
313 return false;
314 }
315 // Shadowing a built-in constructor
316 return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue));
317}
318
319static inline JSValue jsXMLHttpRequestOnreadystatechangeGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
320{
321 UNUSED_PARAM(throwScope);
322 UNUSED_PARAM(state);
323 return eventHandlerAttribute(thisObject.wrapped(), eventNames().readystatechangeEvent, worldForDOMObject(thisObject));
324}
325
326EncodedJSValue jsXMLHttpRequestOnreadystatechange(ExecState* state, EncodedJSValue thisValue, PropertyName)
327{
328 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestOnreadystatechangeGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "onreadystatechange");
329}
330
331static inline bool setJSXMLHttpRequestOnreadystatechangeSetter(ExecState& state, JSXMLHttpRequest& thisObject, JSValue value, ThrowScope& throwScope)
332{
333 UNUSED_PARAM(throwScope);
334 setEventHandlerAttribute(state, thisObject, thisObject.wrapped(), eventNames().readystatechangeEvent, value);
335 return true;
336}
337
338bool setJSXMLHttpRequestOnreadystatechange(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
339{
340 return IDLAttribute<JSXMLHttpRequest>::set<setJSXMLHttpRequestOnreadystatechangeSetter>(*state, thisValue, encodedValue, "onreadystatechange");
341}
342
343static inline JSValue jsXMLHttpRequestReadyStateGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
344{
345 UNUSED_PARAM(throwScope);
346 UNUSED_PARAM(state);
347 auto& impl = thisObject.wrapped();
348 JSValue result = toJS<IDLUnsignedShort>(state, throwScope, impl.readyState());
349 return result;
350}
351
352EncodedJSValue jsXMLHttpRequestReadyState(ExecState* state, EncodedJSValue thisValue, PropertyName)
353{
354 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestReadyStateGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "readyState");
355}
356
357static inline JSValue jsXMLHttpRequestTimeoutGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
358{
359 UNUSED_PARAM(throwScope);
360 UNUSED_PARAM(state);
361 auto& impl = thisObject.wrapped();
362 JSValue result = toJS<IDLUnsignedLong>(state, throwScope, impl.timeout());
363 return result;
364}
365
366EncodedJSValue jsXMLHttpRequestTimeout(ExecState* state, EncodedJSValue thisValue, PropertyName)
367{
368 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestTimeoutGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "timeout");
369}
370
371static inline bool setJSXMLHttpRequestTimeoutSetter(ExecState& state, JSXMLHttpRequest& thisObject, JSValue value, ThrowScope& throwScope)
372{
373 UNUSED_PARAM(throwScope);
374 auto& impl = thisObject.wrapped();
375 auto nativeValue = convert<IDLUnsignedLong>(state, value);
376 RETURN_IF_EXCEPTION(throwScope, false);
377 AttributeSetter::call(state, throwScope, [&] {
378 return impl.setTimeout(WTFMove(nativeValue));
379 });
380 return true;
381}
382
383bool setJSXMLHttpRequestTimeout(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
384{
385 return IDLAttribute<JSXMLHttpRequest>::set<setJSXMLHttpRequestTimeoutSetter>(*state, thisValue, encodedValue, "timeout");
386}
387
388static inline JSValue jsXMLHttpRequestWithCredentialsGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
389{
390 UNUSED_PARAM(throwScope);
391 UNUSED_PARAM(state);
392 auto& impl = thisObject.wrapped();
393 JSValue result = toJS<IDLBoolean>(state, throwScope, impl.withCredentials());
394 return result;
395}
396
397EncodedJSValue jsXMLHttpRequestWithCredentials(ExecState* state, EncodedJSValue thisValue, PropertyName)
398{
399 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestWithCredentialsGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "withCredentials");
400}
401
402static inline bool setJSXMLHttpRequestWithCredentialsSetter(ExecState& state, JSXMLHttpRequest& thisObject, JSValue value, ThrowScope& throwScope)
403{
404 UNUSED_PARAM(throwScope);
405 auto& impl = thisObject.wrapped();
406 auto nativeValue = convert<IDLBoolean>(state, value);
407 RETURN_IF_EXCEPTION(throwScope, false);
408 AttributeSetter::call(state, throwScope, [&] {
409 return impl.setWithCredentials(WTFMove(nativeValue));
410 });
411 return true;
412}
413
414bool setJSXMLHttpRequestWithCredentials(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
415{
416 return IDLAttribute<JSXMLHttpRequest>::set<setJSXMLHttpRequestWithCredentialsSetter>(*state, thisValue, encodedValue, "withCredentials");
417}
418
419static inline JSValue jsXMLHttpRequestUploadGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
420{
421 UNUSED_PARAM(throwScope);
422 UNUSED_PARAM(state);
423 auto& impl = thisObject.wrapped();
424 JSValue result = toJS<IDLInterface<XMLHttpRequestUpload>>(state, *thisObject.globalObject(), throwScope, impl.upload());
425 return result;
426}
427
428EncodedJSValue jsXMLHttpRequestUpload(ExecState* state, EncodedJSValue thisValue, PropertyName)
429{
430 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestUploadGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "upload");
431}
432
433static inline JSValue jsXMLHttpRequestResponseURLGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
434{
435 UNUSED_PARAM(throwScope);
436 UNUSED_PARAM(state);
437 auto& impl = thisObject.wrapped();
438 JSValue result = toJS<IDLUSVString>(state, throwScope, impl.responseURL());
439 return result;
440}
441
442EncodedJSValue jsXMLHttpRequestResponseURL(ExecState* state, EncodedJSValue thisValue, PropertyName)
443{
444 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestResponseURLGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "responseURL");
445}
446
447static inline JSValue jsXMLHttpRequestStatusGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
448{
449 UNUSED_PARAM(throwScope);
450 UNUSED_PARAM(state);
451 auto& impl = thisObject.wrapped();
452 JSValue result = toJS<IDLUnsignedShort>(state, throwScope, impl.status());
453 return result;
454}
455
456EncodedJSValue jsXMLHttpRequestStatus(ExecState* state, EncodedJSValue thisValue, PropertyName)
457{
458 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestStatusGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "status");
459}
460
461static inline JSValue jsXMLHttpRequestStatusTextGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
462{
463 UNUSED_PARAM(throwScope);
464 UNUSED_PARAM(state);
465 auto& impl = thisObject.wrapped();
466 JSValue result = toJS<IDLByteString>(state, throwScope, impl.statusText());
467 return result;
468}
469
470EncodedJSValue jsXMLHttpRequestStatusText(ExecState* state, EncodedJSValue thisValue, PropertyName)
471{
472 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestStatusTextGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "statusText");
473}
474
475static inline JSValue jsXMLHttpRequestResponseTypeGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
476{
477 UNUSED_PARAM(throwScope);
478 UNUSED_PARAM(state);
479 auto& impl = thisObject.wrapped();
480 JSValue result = toJS<IDLEnumeration<XMLHttpRequest::ResponseType>>(state, throwScope, impl.responseType());
481 return result;
482}
483
484EncodedJSValue jsXMLHttpRequestResponseType(ExecState* state, EncodedJSValue thisValue, PropertyName)
485{
486 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestResponseTypeGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "responseType");
487}
488
489static inline bool setJSXMLHttpRequestResponseTypeSetter(ExecState& state, JSXMLHttpRequest& thisObject, JSValue value, ThrowScope& throwScope)
490{
491 UNUSED_PARAM(throwScope);
492 auto& impl = thisObject.wrapped();
493 auto optionalNativeValue = parseEnumeration<XMLHttpRequest::ResponseType>(state, value);
494 RETURN_IF_EXCEPTION(throwScope, false);
495 if (UNLIKELY(!optionalNativeValue))
496 return false;
497 auto nativeValue = optionalNativeValue.value();
498 AttributeSetter::call(state, throwScope, [&] {
499 return impl.setResponseType(WTFMove(nativeValue));
500 });
501 return true;
502}
503
504bool setJSXMLHttpRequestResponseType(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
505{
506 return IDLAttribute<JSXMLHttpRequest>::set<setJSXMLHttpRequestResponseTypeSetter>(*state, thisValue, encodedValue, "responseType");
507}
508
509static inline JSValue jsXMLHttpRequestResponseGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
510{
511 UNUSED_PARAM(throwScope);
512 UNUSED_PARAM(state);
513 return thisObject.response(state);
514}
515
516EncodedJSValue jsXMLHttpRequestResponse(ExecState* state, EncodedJSValue thisValue, PropertyName)
517{
518 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestResponseGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "response");
519}
520
521static inline JSValue jsXMLHttpRequestResponseTextGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
522{
523 UNUSED_PARAM(throwScope);
524 UNUSED_PARAM(state);
525 auto& impl = thisObject.wrapped();
526 JSValue result = toJS<IDLUSVString>(state, throwScope, impl.responseText());
527 return result;
528}
529
530EncodedJSValue jsXMLHttpRequestResponseText(ExecState* state, EncodedJSValue thisValue, PropertyName)
531{
532 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestResponseTextGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "responseText");
533}
534
535static inline JSValue jsXMLHttpRequestResponseXMLGetter(ExecState& state, JSXMLHttpRequest& thisObject, ThrowScope& throwScope)
536{
537 UNUSED_PARAM(throwScope);
538 UNUSED_PARAM(state);
539 auto& impl = thisObject.wrapped();
540 JSValue result = toJS<IDLNullable<IDLInterface<Document>>>(state, *thisObject.globalObject(), throwScope, impl.responseXML());
541 return result;
542}
543
544EncodedJSValue jsXMLHttpRequestResponseXML(ExecState* state, EncodedJSValue thisValue, PropertyName)
545{
546 return IDLAttribute<JSXMLHttpRequest>::get<jsXMLHttpRequestResponseXMLGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "responseXML");
547}
548
549static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionOpen1Body(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
550{
551 UNUSED_PARAM(state);
552 UNUSED_PARAM(throwScope);
553 auto& impl = castedThis->wrapped();
554 auto method = convert<IDLByteString>(*state, state->uncheckedArgument(0));
555 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
556 auto url = convert<IDLDOMString>(*state, state->uncheckedArgument(1));
557 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
558 propagateException(*state, throwScope, impl.open(WTFMove(method), WTFMove(url)));
559 return JSValue::encode(jsUndefined());
560}
561
562static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionOpen2Body(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
563{
564 UNUSED_PARAM(state);
565 UNUSED_PARAM(throwScope);
566 auto& impl = castedThis->wrapped();
567 auto method = convert<IDLByteString>(*state, state->uncheckedArgument(0));
568 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
569 auto url = convert<IDLDOMString>(*state, state->uncheckedArgument(1));
570 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
571 auto async = convert<IDLBoolean>(*state, state->uncheckedArgument(2));
572 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
573 auto user = state->argument(3).isUndefined() ? String() : convert<IDLNullable<IDLDOMString>>(*state, state->uncheckedArgument(3));
574 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
575 auto password = state->argument(4).isUndefined() ? String() : convert<IDLNullable<IDLDOMString>>(*state, state->uncheckedArgument(4));
576 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
577 propagateException(*state, throwScope, impl.open(WTFMove(method), WTFMove(url), WTFMove(async), WTFMove(user), WTFMove(password)));
578 return JSValue::encode(jsUndefined());
579}
580
581static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionOpenOverloadDispatcher(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
582{
583 UNUSED_PARAM(state);
584 UNUSED_PARAM(throwScope);
585 VM& vm = state->vm();
586 UNUSED_PARAM(vm);
587 size_t argsCount = std::min<size_t>(5, state->argumentCount());
588 if (argsCount == 2) {
589 return jsXMLHttpRequestPrototypeFunctionOpen1Body(state, castedThis, throwScope);
590 }
591 if (argsCount == 3) {
592 return jsXMLHttpRequestPrototypeFunctionOpen2Body(state, castedThis, throwScope);
593 }
594 if (argsCount == 4) {
595 return jsXMLHttpRequestPrototypeFunctionOpen2Body(state, castedThis, throwScope);
596 }
597 if (argsCount == 5) {
598 return jsXMLHttpRequestPrototypeFunctionOpen2Body(state, castedThis, throwScope);
599 }
600 return argsCount < 2 ? throwVMError(state, throwScope, createNotEnoughArgumentsError(state)) : throwVMTypeError(state, throwScope);
601}
602
603EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionOpen(ExecState* state)
604{
605 return IDLOperation<JSXMLHttpRequest>::call<jsXMLHttpRequestPrototypeFunctionOpenOverloadDispatcher>(*state, "open");
606}
607
608static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionSetRequestHeaderBody(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
609{
610 UNUSED_PARAM(state);
611 UNUSED_PARAM(throwScope);
612 auto& impl = castedThis->wrapped();
613 if (UNLIKELY(state->argumentCount() < 2))
614 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
615 auto header = convert<IDLByteString>(*state, state->uncheckedArgument(0));
616 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
617 auto value = convert<IDLByteString>(*state, state->uncheckedArgument(1));
618 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
619 propagateException(*state, throwScope, impl.setRequestHeader(WTFMove(header), WTFMove(value)));
620 return JSValue::encode(jsUndefined());
621}
622
623EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionSetRequestHeader(ExecState* state)
624{
625 return IDLOperation<JSXMLHttpRequest>::call<jsXMLHttpRequestPrototypeFunctionSetRequestHeaderBody>(*state, "setRequestHeader");
626}
627
628static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionSendBody(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
629{
630 UNUSED_PARAM(state);
631 UNUSED_PARAM(throwScope);
632 auto& impl = castedThis->wrapped();
633 auto body = state->argument(0).isUndefined() ? WTF::nullopt : convert<IDLNullable<IDLUnion<IDLInterface<Document>, IDLInterface<Blob>, IDLArrayBufferView, IDLArrayBuffer, IDLInterface<DOMFormData>, IDLUSVString>>>(*state, state->uncheckedArgument(0));
634 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
635 propagateException(*state, throwScope, impl.send(WTFMove(body)));
636 return JSValue::encode(jsUndefined());
637}
638
639EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionSend(ExecState* state)
640{
641 return IDLOperation<JSXMLHttpRequest>::call<jsXMLHttpRequestPrototypeFunctionSendBody>(*state, "send");
642}
643
644static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionAbortBody(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
645{
646 UNUSED_PARAM(state);
647 UNUSED_PARAM(throwScope);
648 auto& impl = castedThis->wrapped();
649 impl.abort();
650 return JSValue::encode(jsUndefined());
651}
652
653EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionAbort(ExecState* state)
654{
655 return IDLOperation<JSXMLHttpRequest>::call<jsXMLHttpRequestPrototypeFunctionAbortBody>(*state, "abort");
656}
657
658static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionGetResponseHeaderBody(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
659{
660 UNUSED_PARAM(state);
661 UNUSED_PARAM(throwScope);
662 auto& impl = castedThis->wrapped();
663 if (UNLIKELY(state->argumentCount() < 1))
664 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
665 auto name = convert<IDLByteString>(*state, state->uncheckedArgument(0));
666 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
667 return JSValue::encode(toJS<IDLNullable<IDLByteString>>(*state, impl.getResponseHeader(WTFMove(name))));
668}
669
670EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionGetResponseHeader(ExecState* state)
671{
672 return IDLOperation<JSXMLHttpRequest>::call<jsXMLHttpRequestPrototypeFunctionGetResponseHeaderBody>(*state, "getResponseHeader");
673}
674
675static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionGetAllResponseHeadersBody(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
676{
677 UNUSED_PARAM(state);
678 UNUSED_PARAM(throwScope);
679 auto& impl = castedThis->wrapped();
680 return JSValue::encode(toJS<IDLByteString>(*state, impl.getAllResponseHeaders()));
681}
682
683EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionGetAllResponseHeaders(ExecState* state)
684{
685 return IDLOperation<JSXMLHttpRequest>::call<jsXMLHttpRequestPrototypeFunctionGetAllResponseHeadersBody>(*state, "getAllResponseHeaders");
686}
687
688static inline JSC::EncodedJSValue jsXMLHttpRequestPrototypeFunctionOverrideMimeTypeBody(JSC::ExecState* state, typename IDLOperation<JSXMLHttpRequest>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
689{
690 UNUSED_PARAM(state);
691 UNUSED_PARAM(throwScope);
692 auto& impl = castedThis->wrapped();
693 if (UNLIKELY(state->argumentCount() < 1))
694 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
695 auto mime = convert<IDLDOMString>(*state, state->uncheckedArgument(0));
696 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
697 propagateException(*state, throwScope, impl.overrideMimeType(WTFMove(mime)));
698 return JSValue::encode(jsUndefined());
699}
700
701EncodedJSValue JSC_HOST_CALL jsXMLHttpRequestPrototypeFunctionOverrideMimeType(ExecState* state)
702{
703 return IDLOperation<JSXMLHttpRequest>::call<jsXMLHttpRequestPrototypeFunctionOverrideMimeTypeBody>(*state, "overrideMimeType");
704}
705
706void JSXMLHttpRequest::visitChildren(JSCell* cell, SlotVisitor& visitor)
707{
708 auto* thisObject = jsCast<JSXMLHttpRequest*>(cell);
709 ASSERT_GC_OBJECT_INHERITS(thisObject, info());
710 Base::visitChildren(thisObject, visitor);
711 thisObject->visitAdditionalChildren(visitor);
712 visitor.reportExtraMemoryVisited(thisObject->wrapped().memoryCost());
713 visitor.append(thisObject->m_response);
714}
715
716void JSXMLHttpRequest::visitOutputConstraints(JSCell* cell, SlotVisitor& visitor)
717{
718 auto* thisObject = jsCast<JSXMLHttpRequest*>(cell);
719 ASSERT_GC_OBJECT_INHERITS(thisObject, info());
720 Base::visitOutputConstraints(thisObject, visitor);
721 thisObject->visitAdditionalChildren(visitor);
722}
723
724size_t JSXMLHttpRequest::estimatedSize(JSCell* cell, VM& vm)
725{
726 auto* thisObject = jsCast<JSXMLHttpRequest*>(cell);
727 return Base::estimatedSize(thisObject, vm) + thisObject->wrapped().memoryCost();
728}
729
730void JSXMLHttpRequest::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder)
731{
732 auto* thisObject = jsCast<JSXMLHttpRequest*>(cell);
733 builder.setWrappedObjectForCell(cell, &thisObject->wrapped());
734 if (thisObject->scriptExecutionContext())
735 builder.setLabelForCell(cell, "url " + thisObject->scriptExecutionContext()->url().string());
736 Base::heapSnapshot(cell, builder);
737}
738
739bool JSXMLHttpRequestOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason)
740{
741 auto* jsXMLHttpRequest = jsCast<JSXMLHttpRequest*>(handle.slot()->asCell());
742 if (jsXMLHttpRequest->wrapped().hasPendingActivity()) {
743 if (UNLIKELY(reason))
744 *reason = "ActiveDOMObject with pending activity";
745 return true;
746 }
747 if (jsXMLHttpRequest->wrapped().isFiringEventListeners()) {
748 if (UNLIKELY(reason))
749 *reason = "EventTarget firing event listeners";
750 return true;
751 }
752 UNUSED_PARAM(visitor);
753 UNUSED_PARAM(reason);
754 return false;
755}
756
757void JSXMLHttpRequestOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context)
758{
759 auto* jsXMLHttpRequest = static_cast<JSXMLHttpRequest*>(handle.slot()->asCell());
760 auto& world = *static_cast<DOMWrapperWorld*>(context);
761 uncacheWrapper(world, &jsXMLHttpRequest->wrapped(), jsXMLHttpRequest);
762}
763
764#if ENABLE(BINDING_INTEGRITY)
765#if PLATFORM(WIN)
766#pragma warning(disable: 4483)
767extern "C" { extern void (*const __identifier("??_7XMLHttpRequest@WebCore@@6B@")[])(); }
768#else
769extern "C" { extern void* _ZTVN7WebCore14XMLHttpRequestE[]; }
770#endif
771#endif
772
773JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject* globalObject, Ref<XMLHttpRequest>&& impl)
774{
775
776#if ENABLE(BINDING_INTEGRITY)
777 void* actualVTablePointer = *(reinterpret_cast<void**>(impl.ptr()));
778#if PLATFORM(WIN)
779 void* expectedVTablePointer = WTF_PREPARE_VTBL_POINTER_FOR_INSPECTION(__identifier("??_7XMLHttpRequest@WebCore@@6B@"));
780#else
781 void* expectedVTablePointer = WTF_PREPARE_VTBL_POINTER_FOR_INSPECTION(&_ZTVN7WebCore14XMLHttpRequestE[2]);
782#endif
783
784 // If this fails XMLHttpRequest does not have a vtable, so you need to add the
785 // ImplementationLacksVTable attribute to the interface definition
786 static_assert(std::is_polymorphic<XMLHttpRequest>::value, "XMLHttpRequest is not polymorphic");
787
788 // If you hit this assertion you either have a use after free bug, or
789 // XMLHttpRequest has subclasses. If XMLHttpRequest has subclasses that get passed
790 // to toJS() we currently require XMLHttpRequest you to opt out of binding hardening
791 // by adding the SkipVTableValidation attribute to the interface IDL definition
792 RELEASE_ASSERT(actualVTablePointer == expectedVTablePointer);
793#endif
794 globalObject->vm().heap.reportExtraMemoryAllocated(impl->memoryCost());
795 return createWrapper<XMLHttpRequest>(globalObject, WTFMove(impl));
796}
797
798JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, XMLHttpRequest& impl)
799{
800 return wrap(state, globalObject, impl);
801}
802
803XMLHttpRequest* JSXMLHttpRequest::toWrapped(JSC::VM& vm, JSC::JSValue value)
804{
805 if (auto* wrapper = jsDynamicCast<JSXMLHttpRequest*>(vm, value))
806 return &wrapper->wrapped();
807 return nullptr;
808}
809
810}
811