summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorLuke Wilde <lukew@serenityos.org>2022-02-14 06:38:03 +0000
committerAndreas Kling <kling@serenityos.org>2022-02-14 11:32:17 +0100
commitb305ee86924911754836a03f8e9fa0b53cca1e46 (patch)
tree9e13ee25d78bdcbdd253f40a5a9da7a094367246 /Userland
parentb7c435de173e6e8dc23ed548860e661f0e8d6c21 (diff)
downloadserenity-b305ee86924911754836a03f8e9fa0b53cca1e46.zip
LibWeb: Add support for the record variant of URLSearchParams
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibWeb/URL/URLSearchParams.cpp16
-rw-r--r--Userland/Libraries/LibWeb/URL/URLSearchParams.h2
-rw-r--r--Userland/Libraries/LibWeb/URL/URLSearchParams.idl3
3 files changed, 16 insertions, 5 deletions
diff --git a/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp b/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp
index 48cb919917..34ca58a0e9 100644
--- a/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp
+++ b/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp
@@ -66,7 +66,9 @@ Vector<QueryParam> url_decode(StringView input)
return output;
}
-DOM::ExceptionOr<NonnullRefPtr<URLSearchParams>> URLSearchParams::create_with_global_object(Bindings::WindowObject&, Variant<Vector<Vector<String>>, String> const& init)
+// https://url.spec.whatwg.org/#dom-urlsearchparams-urlsearchparams
+// https://url.spec.whatwg.org/#urlsearchparams-initialize
+DOM::ExceptionOr<NonnullRefPtr<URLSearchParams>> URLSearchParams::create_with_global_object(Bindings::WindowObject&, Variant<Vector<Vector<String>>, OrderedHashMap<String, String>, String> const& init)
{
// 1. If init is a string and starts with U+003F (?), then remove the first code point from init.
// NOTE: We do this when we know that it's a string on step 3 of initialization.
@@ -94,8 +96,18 @@ DOM::ExceptionOr<NonnullRefPtr<URLSearchParams>> URLSearchParams::create_with_gl
return URLSearchParams::create(move(list));
}
- // TODO
// 2. Otherwise, if init is a record, then for each name โ†’ value of init, append a new name-value pair whose name is name and value is value, to queryโ€™s list.
+ if (init.has<OrderedHashMap<String, String>>()) {
+ auto const& init_record = init.get<OrderedHashMap<String, String>>();
+
+ Vector<QueryParam> list;
+ list.ensure_capacity(init_record.size());
+
+ for (auto const& pair : init_record)
+ list.append(QueryParam { .name = pair.key, .value = pair.value });
+
+ return URLSearchParams::create(move(list));
+ }
// 3. Otherwise:
// a. Assert: init is a string.
diff --git a/Userland/Libraries/LibWeb/URL/URLSearchParams.h b/Userland/Libraries/LibWeb/URL/URLSearchParams.h
index 22f44a5a97..7fe3ea8114 100644
--- a/Userland/Libraries/LibWeb/URL/URLSearchParams.h
+++ b/Userland/Libraries/LibWeb/URL/URLSearchParams.h
@@ -30,7 +30,7 @@ public:
return adopt_ref(*new URLSearchParams(move(list)));
}
- static DOM::ExceptionOr<NonnullRefPtr<URLSearchParams>> create_with_global_object(Bindings::WindowObject&, Variant<Vector<Vector<String>>, String> const& init);
+ static DOM::ExceptionOr<NonnullRefPtr<URLSearchParams>> create_with_global_object(Bindings::WindowObject&, Variant<Vector<Vector<String>>, OrderedHashMap<String, String>, String> const& init);
void append(String const& name, String const& value);
void delete_(String const& name);
diff --git a/Userland/Libraries/LibWeb/URL/URLSearchParams.idl b/Userland/Libraries/LibWeb/URL/URLSearchParams.idl
index e552a248b4..b5030d004b 100644
--- a/Userland/Libraries/LibWeb/URL/URLSearchParams.idl
+++ b/Userland/Libraries/LibWeb/URL/URLSearchParams.idl
@@ -1,7 +1,6 @@
interface URLSearchParams {
- // FIXME: the real type of init is (sequence<sequence<USVString>> or record<USVString, USVString> or USVString)
- constructor(optional (sequence<sequence<USVString>> or USVString) init = "");
+ constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = "");
undefined append(USVString name, USVString value);
undefined delete(USVString name);