From 9ea597016a55e68a3c05cd0984a97df890232aca Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sun, 18 Jun 2023 21:45:39 +1200 Subject: [PATCH] LibWeb: Implement Streams AO ExtractHighWaterMark(strategy, defaultHWM) --- .../LibWeb/Streams/AbstractOperations.cpp | 19 +++++++++++++++++++ .../LibWeb/Streams/AbstractOperations.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp index e1a2957c07..f374e74118 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -186,6 +187,24 @@ bool readable_stream_has_default_reader(ReadableStream const& stream) return false; } +// https://streams.spec.whatwg.org/#validate-and-normalize-high-water-mark +WebIDL::ExceptionOr extract_high_water_mark(QueuingStrategy const& strategy, double default_hwm) +{ + // 1. If strategy["highWaterMark"] does not exist, return defaultHWM. + if (!strategy.high_water_mark.has_value()) + return default_hwm; + + // 2. Let highWaterMark be strategy["highWaterMark"]. + auto high_water_mark = strategy.high_water_mark.value(); + + // 3. If highWaterMark is NaN or highWaterMark < 0, throw a RangeError exception. + if (isnan(high_water_mark) || high_water_mark < 0) + return WebIDL::SimpleException { WebIDL::SimpleExceptionType::RangeError, "Invalid value for high water mark"sv }; + + // 4. Return highWaterMark. + return high_water_mark; +} + // https://streams.spec.whatwg.org/#readable-stream-close void readable_stream_close(ReadableStream& stream) { diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h index 6ff90c6e5c..f76502ff8a 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.h +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.h @@ -28,6 +28,8 @@ using WriteAlgorithm = JS::SafeFunction> acquire_readable_stream_default_reader(ReadableStream&); bool is_readable_stream_locked(ReadableStream const&); +WebIDL::ExceptionOr extract_high_water_mark(QueuingStrategy const&, double default_hwm); + void readable_stream_close(ReadableStream&); void readable_stream_error(ReadableStream&, JS::Value error); void readable_stream_add_read_request(ReadableStream&, ReadRequest const&);