summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb
diff options
context:
space:
mode:
authorLuke Wilde <lukew@serenityos.org>2022-02-11 21:04:42 +0000
committerAndreas Kling <kling@serenityos.org>2022-02-12 12:53:28 +0100
commit4ccade42b7f87bb07e36de047a12fade0ddeccef (patch)
treeb19a3d7329f85b6c9323eff0c4cf0701e52ce5a2 /Userland/Libraries/LibWeb
parent8cfeca526172a40f8dd6026ff8cfec129e930735 (diff)
downloadserenity-4ccade42b7f87bb07e36de047a12fade0ddeccef.zip
LibWeb: Implement XMLHttpRequest.overrideMimeType
This allows you to ignore the Content-Type returned by the server and always parse the content as if it's the given MIME type. This will currently be used for allowing you to override the charset of text responses.
Diffstat (limited to 'Userland/Libraries/LibWeb')
-rw-r--r--Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp17
-rw-r--r--Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h6
-rw-r--r--Userland/Libraries/LibWeb/XHR/XMLHttpRequest.idl1
3 files changed, 24 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp
index d7224f87a5..309be13573 100644
--- a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp
+++ b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp
@@ -291,4 +291,21 @@ String XMLHttpRequest::get_all_response_headers() const
return builder.to_string();
}
+// https://xhr.spec.whatwg.org/#dom-xmlhttprequest-overridemimetype
+DOM::ExceptionOr<void> XMLHttpRequest::override_mime_type(String const& mime)
+{
+ // 1. If this’s state is loading or done, then throw an "InvalidStateError" DOMException.
+ if (m_ready_state == ReadyState::Loading || m_ready_state == ReadyState::Done)
+ return DOM::InvalidStateError::create("Cannot override MIME type when state is Loading or Done.");
+
+ // 2. Set this’s override MIME type to the result of parsing mime.
+ m_override_mime_type = MimeSniff::MimeType::from_string(mime);
+
+ // 3. If this’s override MIME type is failure, then set this’s override MIME type to application/octet-stream.
+ if (!m_override_mime_type.has_value())
+ m_override_mime_type = MimeSniff::MimeType("application"sv, "octet-stream"sv);
+
+ return {};
+}
+
}
diff --git a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h
index 62e7e420b4..5c980701bd 100644
--- a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h
+++ b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.h
@@ -14,6 +14,7 @@
#include <LibWeb/Bindings/Wrappable.h>
#include <LibWeb/DOM/EventTarget.h>
#include <LibWeb/DOM/ExceptionOr.h>
+#include <LibWeb/MimeSniff/MimeType.h>
#include <LibWeb/XHR/XMLHttpRequestEventTarget.h>
namespace Web::XHR {
@@ -62,6 +63,8 @@ public:
Bindings::CallbackType* onreadystatechange();
void set_onreadystatechange(Optional<Bindings::CallbackType>);
+ DOM::ExceptionOr<void> override_mime_type(String const& mime);
+
private:
virtual void ref_event_target() override { ref(); }
virtual void unref_event_target() override { unref(); }
@@ -91,6 +94,9 @@ private:
bool m_timed_out { false };
ByteBuffer m_response_object;
+
+ // https://xhr.spec.whatwg.org/#override-mime-type
+ Optional<MimeSniff::MimeType> m_override_mime_type;
};
}
diff --git a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.idl b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.idl
index 9e1e0ec14c..df794fd04d 100644
--- a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.idl
+++ b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.idl
@@ -18,6 +18,7 @@ interface XMLHttpRequest : XMLHttpRequestEventTarget {
ByteString? getResponseHeader(ByteString name);
ByteString getAllResponseHeaders();
+ undefined overrideMimeType(DOMString mime);
attribute EventHandler onreadystatechange;