Browse Source

LibWeb: Implement value argument of URLSearchParams.has

Shannon Booth 11 months ago
parent
commit
264b5160c2

+ 5 - 0
Tests/LibWeb/Text/expected/URL/search-params-has.txt

@@ -0,0 +1,5 @@
+false
+true
+false
+true
+false

+ 11 - 0
Tests/LibWeb/Text/input/URL/search-params-has.html

@@ -0,0 +1,11 @@
+<script src="../include.js"></script>
+<script>
+    test(() => {
+        const params = new URLSearchParams('animal=octopus&place=ocean');
+        println(params.has('non-existing-key'));
+        println(params.has('animal'));
+        println(params.has('place', 'non-existing-value'));
+        println(params.has('place', 'ocean'));
+        println(params.has('animal', 'ocean'));
+    });
+</script>

+ 23 - 6
Userland/Libraries/LibWeb/DOMURL/URLSearchParams.cpp

@@ -278,13 +278,30 @@ WebIDL::ExceptionOr<Vector<String>> URLSearchParams::get_all(String const& name)
     return values;
 }
 
-bool URLSearchParams::has(String const& name)
+// https://url.spec.whatwg.org/#dom-urlsearchparams-has
+bool URLSearchParams::has(String const& name, Optional<String> const& value)
 {
-    // return true if there is a name-value pair whose name is name in this’s list, and false otherwise.
-    return !m_list.find_if([&name](auto& entry) {
-                      return entry.name == name;
-                  })
-                .is_end();
+    // 1. If value is given and there is a tuple whose name is name and value is value in this’s list, then return true.
+    if (value.has_value()) {
+        if (!m_list.find_if([&name, &value](auto& entry) {
+                       return entry.name == name && entry.value == value.value();
+                   })
+                 .is_end()) {
+            return true;
+        }
+    }
+    // 2. If value is not given and there is a tuple whose name is name in this’s list, then return true.
+    else {
+        if (!m_list.find_if([&name](auto& entry) {
+                       return entry.name == name;
+                   })
+                 .is_end()) {
+            return true;
+        }
+    }
+
+    // 3. Return false.
+    return false;
 }
 
 WebIDL::ExceptionOr<void> URLSearchParams::set(String const& name, String const& value)

+ 1 - 1
Userland/Libraries/LibWeb/DOMURL/URLSearchParams.h

@@ -35,7 +35,7 @@ public:
     WebIDL::ExceptionOr<void> delete_(String const& name, Optional<String> const& value = {});
     Optional<String> get(String const& name);
     WebIDL::ExceptionOr<Vector<String>> get_all(String const& name);
-    bool has(String const& name);
+    bool has(String const& name, Optional<String> const& value = {});
     WebIDL::ExceptionOr<void> set(String const& name, String const& value);
 
     WebIDL::ExceptionOr<void> sort();

+ 1 - 1
Userland/Libraries/LibWeb/DOMURL/URLSearchParams.idl

@@ -10,7 +10,7 @@ interface URLSearchParams {
     undefined delete(USVString name, optional USVString value);
     USVString? get(USVString name);
     sequence<USVString> getAll(USVString name);
-    boolean has(USVString name);
+    boolean has(USVString name, optional USVString value);
     undefined set(USVString name, USVString value);
 
     undefined sort();