mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-25 20:22:18 +03:00
LibWeb: Make the atob JS function compliant with the spec
It is specified to use the "forgiving-base64" decoder instead of the regular base64 decoder, which is slightly different
This commit is contained in:
parent
bbaf86fb46
commit
598fcfca26
Notes:
sideshowbarker
2024-07-17 04:03:27 +09:00
Author: https://github.com/kuzux Commit: https://github.com/SerenityOS/serenity/commit/598fcfca26 Pull-request: https://github.com/SerenityOS/serenity/pull/16692 Reviewed-by: https://github.com/drunderscore
@ -1394,19 +1394,33 @@ JS_DEFINE_NATIVE_FUNCTION(Window::cancel_idle_callback)
|
|||||||
return JS::js_undefined();
|
return JS::js_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/webappapis.html#dom-atob-dev
|
||||||
JS_DEFINE_NATIVE_FUNCTION(Window::atob)
|
JS_DEFINE_NATIVE_FUNCTION(Window::atob)
|
||||||
{
|
{
|
||||||
if (!vm.argument_count())
|
if (!vm.argument_count())
|
||||||
return vm.throw_completion<JS::TypeError>(JS::ErrorType::BadArgCountOne, "atob");
|
return vm.throw_completion<JS::TypeError>(JS::ErrorType::BadArgCountOne, "atob");
|
||||||
auto string = TRY(vm.argument(0).to_string(vm));
|
auto deprecated_string = TRY(vm.argument(0).to_string(vm));
|
||||||
auto decoded = decode_base64(StringView(string));
|
auto string = String::from_utf8(deprecated_string).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
|
// must throw an "InvalidCharacterError" DOMException if data contains any character whose code point is greater than U+00FF
|
||||||
|
for (auto code_point : string.code_points()) {
|
||||||
|
if (code_point > 0x00FF)
|
||||||
|
return throw_completion(WebIDL::InvalidCharacterError::create(*vm.current_realm(), "Data contains characters outside the range U+0000 and U+00FF"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, the user agent must convert data to a byte sequence whose nth byte is the eight-bit representation of the nth code point of data
|
||||||
|
// and then must apply forgiving-base64 encode to that byte sequence and return the result.
|
||||||
|
auto decoded = AK::decode_forgiving_base64(StringView(deprecated_string));
|
||||||
if (decoded.is_error())
|
if (decoded.is_error())
|
||||||
return vm.throw_completion<JS::TypeError>(JS::ErrorType::InvalidFormat, "Base64");
|
return vm.throw_completion<JS::TypeError>(JS::ErrorType::InvalidFormat, "Base64");
|
||||||
|
|
||||||
// decode_base64() returns a byte string. LibJS uses UTF-8 for strings. Use Latin1Decoder to convert bytes 128-255 to UTF-8.
|
// The bytes object might contain bytes greater than 128, encode them in UTF8
|
||||||
auto decoder = TextCodec::decoder_for("windows-1252");
|
// NOTE: Any 8-bit encoding -> utf-8 decoder will work for this
|
||||||
VERIFY(decoder);
|
auto text_decoder = TextCodec::decoder_for("windows-1252");
|
||||||
return JS::PrimitiveString::create(vm, decoder->to_utf8(decoded.value()));
|
VERIFY(text_decoder);
|
||||||
|
auto text = text_decoder->to_utf8(decoded.release_value());
|
||||||
|
|
||||||
|
return JS::PrimitiveString::create(vm, DeprecatedString(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_DEFINE_NATIVE_FUNCTION(Window::btoa)
|
JS_DEFINE_NATIVE_FUNCTION(Window::btoa)
|
||||||
|
Loading…
Reference in New Issue
Block a user