diff --git a/Tests/LibWeb/Text/expected/XMLHttpRequest-response-empty.txt b/Tests/LibWeb/Text/expected/XMLHttpRequest-response-empty.txt
new file mode 100644
index 0000000000..7ef22e9a43
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/XMLHttpRequest-response-empty.txt
@@ -0,0 +1 @@
+PASS
diff --git a/Tests/LibWeb/Text/expected/XMLHttpRequest-responseXML-empty.txt b/Tests/LibWeb/Text/expected/XMLHttpRequest-responseXML-empty.txt
new file mode 100644
index 0000000000..7ef22e9a43
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/XMLHttpRequest-responseXML-empty.txt
@@ -0,0 +1 @@
+PASS
diff --git a/Tests/LibWeb/Text/input/XMLHttpRequest-response-empty.html b/Tests/LibWeb/Text/input/XMLHttpRequest-response-empty.html
new file mode 100644
index 0000000000..bc635e45c5
--- /dev/null
+++ b/Tests/LibWeb/Text/input/XMLHttpRequest-response-empty.html
@@ -0,0 +1,16 @@
+
+
diff --git a/Tests/LibWeb/Text/input/XMLHttpRequest-responseXML-empty.html b/Tests/LibWeb/Text/input/XMLHttpRequest-responseXML-empty.html
new file mode 100644
index 0000000000..2bd4a5de83
--- /dev/null
+++ b/Tests/LibWeb/Text/input/XMLHttpRequest-responseXML-empty.html
@@ -0,0 +1,16 @@
+
+
diff --git a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp
index 1dde00f7f2..677a824d6b 100644
--- a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp
+++ b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp
@@ -89,7 +89,7 @@ void XMLHttpRequest::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_response);
visitor.visit(m_fetch_controller);
- if (auto* value = m_response_object.get_pointer())
+ if (auto* value = m_response_object.get_pointer>())
visitor.visit(*value);
}
@@ -138,7 +138,7 @@ WebIDL::ExceptionOr> XMLHttpRequest::response_xml()
// 4. If this’s response object is non-null, then return it.
if (!m_response_object.has())
- return &verify_cast(m_response_object.get().as_object());
+ return &verify_cast(*m_response_object.get>());
// 5. Set a document response for this.
set_document_response();
@@ -146,7 +146,7 @@ WebIDL::ExceptionOr> XMLHttpRequest::response_xml()
// 6. Return this’s response object.
if (m_response_object.has())
return nullptr;
- return &verify_cast(m_response_object.get().as_object());
+ return &verify_cast(*m_response_object.get>());
}
// https://xhr.spec.whatwg.org/#dom-xmlhttprequest-responsetype
@@ -193,7 +193,7 @@ WebIDL::ExceptionOr XMLHttpRequest::response()
// 4. If this’s response object is non-null, then return it.
if (!m_response_object.has())
- return m_response_object.get();
+ return m_response_object.get>();
// 5. If this’s response type is "arraybuffer",
if (m_response_type == Bindings::XMLHttpRequestResponseType::Arraybuffer) {
@@ -206,18 +206,21 @@ WebIDL::ExceptionOr XMLHttpRequest::response()
auto buffer = buffer_result.release_value();
buffer->buffer().overwrite(0, m_received_bytes.data(), m_received_bytes.size());
- m_response_object = JS::Value(buffer);
+ m_response_object = JS::NonnullGCPtr { buffer };
}
// 6. Otherwise, if this’s response type is "blob", set this’s response object to a new Blob object representing this’s received bytes with type set to the result of get a final MIME type for this.
else if (m_response_type == Bindings::XMLHttpRequestResponseType::Blob) {
auto mime_type_as_string = TRY_OR_THROW_OOM(vm, TRY_OR_THROW_OOM(vm, get_final_mime_type()).serialized());
auto blob_part = FileAPI::Blob::create(realm(), m_received_bytes, move(mime_type_as_string));
auto blob = FileAPI::Blob::create(realm(), Vector { JS::make_handle(*blob_part) });
- m_response_object = JS::Value(blob.ptr());
+ m_response_object = JS::NonnullGCPtr { blob };
}
// 7. Otherwise, if this’s response type is "document", set a document response for this.
else if (m_response_type == Bindings::XMLHttpRequestResponseType::Document) {
set_document_response();
+
+ if (m_response_object.has())
+ return JS::js_null();
}
// 8. Otherwise:
else {
@@ -234,11 +237,11 @@ WebIDL::ExceptionOr XMLHttpRequest::response()
return JS::js_null();
// 4. Set this’s response object to jsonObject.
- m_response_object = json_object_result.release_value();
+ m_response_object = JS::NonnullGCPtr { json_object_result.release_value().as_object() };
}
// 9. Return this’s response object.
- return m_response_object.get();
+ return m_response_object.get>();
}
// https://xhr.spec.whatwg.org/#text-response
@@ -316,7 +319,7 @@ void XMLHttpRequest::set_document_response()
else {
document = DOM::Document::create(realm());
if (!Web::build_xml_document(*document, m_received_bytes)) {
- m_response_object = JS::js_null();
+ m_response_object = Empty {};
return;
}
}
@@ -338,7 +341,7 @@ void XMLHttpRequest::set_document_response()
document->set_origin(HTML::relevant_settings_object(*this).origin());
// 12. Set xhr’s response object to document.
- m_response_object = JS::Value(document);
+ m_response_object = JS::NonnullGCPtr { *document };
}
// https://xhr.spec.whatwg.org/#final-mime-type
diff --git a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h
index 3f7a481752..bfb0b8ba48 100644
--- a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h
+++ b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h
@@ -183,7 +183,7 @@ private:
// response object
// An object, failure, or null, initially null.
// NOTE: This needs to be a JS::Value as the JSON response might not actually be an object.
- Variant m_response_object;
+ Variant, Failure, Empty> m_response_object;
// https://xhr.spec.whatwg.org/#xmlhttprequest-fetch-controller
// fetch controller