1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 09:17:35 +00:00

LibWeb: Add support for DOM::Document to XHR::send()

This patch adds support for posting a DOM::Document using XHR::send().
This commit is contained in:
Kenneth Myhra 2022-10-15 16:28:49 +02:00 committed by Ali Mohammad Pur
parent d5247ae33e
commit 7831e62955
4 changed files with 27 additions and 10 deletions

View file

@ -396,7 +396,7 @@ WebIDL::ExceptionOr<void> XMLHttpRequest::open(String const& method_string, Stri
}
// https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send
WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<Fetch::XMLHttpRequestBodyInit> body)
WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<Variant<JS::Handle<DOM::Document>, Fetch::XMLHttpRequestBodyInit>> body)
{
auto& vm = this->vm();
auto& realm = *vm.current_realm();
@ -411,8 +411,15 @@ WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<Fetch::XMLHttpRequestBod
if (m_method.is_one_of("GET"sv, "HEAD"sv))
body = {};
auto body_with_type = body.has_value() ? TRY(Fetch::extract_body(realm, body.value())) : Optional<Fetch::Infrastructure::BodyWithType> {};
Optional<Fetch::Infrastructure::BodyWithType> body_with_type {};
Optional<ByteBuffer> serialized_document {};
if (body.has_value()) {
if (body->has<JS::Handle<DOM::Document>>()) {
serialized_document = body->get<JS::Handle<DOM::Document>>().cell()->serialize_fragment().to_byte_buffer();
} else {
body_with_type = TRY(Fetch::extract_body(realm, body.value().get<Fetch::XMLHttpRequestBodyInit>()));
}
}
AK::URL request_url = m_window->associated_document().parse_url(m_url.to_string());
dbgln("XHR send from {} to {}", m_window->associated_document().url(), request_url);
@ -432,7 +439,9 @@ WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<Fetch::XMLHttpRequestBod
auto request = LoadRequest::create_for_url_on_page(request_url, m_window->page());
request.set_method(m_method);
if (body_with_type.has_value()) {
if (serialized_document.has_value()) {
request.set_body(serialized_document.value());
} else if (body_with_type.has_value()) {
TRY(body_with_type->body.source().visit(
[&](ByteBuffer const& buffer) -> WebIDL::ExceptionOr<void> {
request.set_body(buffer);
@ -446,10 +455,14 @@ WebIDL::ExceptionOr<void> XMLHttpRequest::send(Optional<Fetch::XMLHttpRequestBod
[](auto&) -> WebIDL::ExceptionOr<void> {
return {};
}));
if (body_with_type->type.has_value()) {
// If type is non-null and thiss headerss header list does not contain `Content-Type`, then append (`Content-Type`, type) to thiss headers.
if (!m_request_headers.contains("Content-Type"sv))
request.set_header("Content-Type", String { body_with_type->type->span() });
}
// If type is non-null and thiss headerss header list does not contain `Content-Type`, then append (`Content-Type`, type) to thiss headers.
if (!m_request_headers.contains("Content-Type"sv)) {
if (body_with_type.has_value() && body_with_type->type.has_value()) {
request.set_header("Content-Type", String { body_with_type->type->span() });
} else if (body->has<JS::Handle<DOM::Document>>()) {
request.set_header("Content-Type", "text/html;charset=UTF-8");
}
}
for (auto& it : m_request_headers)