From eca68aad8846f20f64167cf53dc1f432abe1590e Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Fri, 24 Jan 2025 00:32:30 +1300 Subject: [PATCH] LibWeb/FileAPI: Implement FileReader readAsBinaryString --- Libraries/LibWeb/FileAPI/FileReader.cpp | 8 +++++-- .../filereader_readAsBinaryString.any.txt | 6 +++++ .../filereader_readAsBinaryString.any.html | 15 ++++++++++++ .../filereader_readAsBinaryString.any.js | 23 +++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.html create mode 100644 Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.js diff --git a/Libraries/LibWeb/FileAPI/FileReader.cpp b/Libraries/LibWeb/FileAPI/FileReader.cpp index e66b3dfd11e..51010d13404 100644 --- a/Libraries/LibWeb/FileAPI/FileReader.cpp +++ b/Libraries/LibWeb/FileAPI/FileReader.cpp @@ -105,8 +105,12 @@ WebIDL::ExceptionOr FileReader::blob_package_data(JS::Realm& // Return a new ArrayBuffer whose contents are bytes. return JS::ArrayBuffer::create(realm, move(bytes)); case Type::BinaryString: - // FIXME: Return bytes as a binary string, in which every byte is represented by a code unit of equal value [0..255]. - return WebIDL::NotSupportedError::create(realm, "BinaryString not supported yet"_string); + // Return bytes as a binary string, in which every byte is represented by a code unit of equal value [0..255]. + Vector builder; + builder.ensure_capacity(bytes.size()); + for (auto byte : bytes.bytes()) + builder.unchecked_append(byte); + return MUST(Utf16View { builder }.to_utf8(Utf16View::AllowInvalidCodeUnits::Yes)); } VERIFY_NOT_REACHED(); } diff --git a/Tests/LibWeb/Text/expected/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.txt b/Tests/LibWeb/Text/expected/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.txt new file mode 100644 index 00000000000..03495c44a48 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.txt @@ -0,0 +1,6 @@ +Harness status: OK + +Found 1 tests + +1 Pass +Pass FileAPI Test: filereader_readAsBinaryString \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.html b/Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.html new file mode 100644 index 00000000000..db6953e72b4 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.html @@ -0,0 +1,15 @@ + + +FileAPI Test: filereader_readAsBinaryString + + + + +
+ diff --git a/Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.js b/Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.js new file mode 100644 index 00000000000..e69ff15e75b --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/FileAPI/reading-data-section/filereader_readAsBinaryString.any.js @@ -0,0 +1,23 @@ +// META: title=FileAPI Test: filereader_readAsBinaryString + +async_test(t => { + const blob = new Blob(["σ"]); + const reader = new FileReader(); + + reader.onload = t.step_func_done(() => { + assert_equals(typeof reader.result, "string", "The result is string"); + assert_equals(reader.result.length, 2, "The result length is 2"); + assert_equals(reader.result, "\xcf\x83", "The result is \xcf\x83"); + assert_equals(reader.readyState, reader.DONE); + }); + + reader.onloadstart = t.step_func(() => { + assert_equals(reader.readyState, reader.LOADING); + }); + + reader.onprogress = t.step_func(() => { + assert_equals(reader.readyState, reader.LOADING); + }); + + reader.readAsBinaryString(blob); +});