aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/URLSearchParams.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-22 23:21:48 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-22 23:21:48 -0700
commit729d445b6885f69dd2c6355f38707bd42851c791 (patch)
treef87a7c408929ea3f57bbb7ace380cf869da83c0e /src/bun.js/bindings/URLSearchParams.cpp
parent25f820c6bf1d8ec6d444ef579cc036b8c0607b75 (diff)
downloadbun-729d445b6885f69dd2c6355f38707bd42851c791.tar.gz
bun-729d445b6885f69dd2c6355f38707bd42851c791.tar.zst
bun-729d445b6885f69dd2c6355f38707bd42851c791.zip
change the directory structurejarred/rename
Diffstat (limited to 'src/bun.js/bindings/URLSearchParams.cpp')
-rw-r--r--src/bun.js/bindings/URLSearchParams.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/bun.js/bindings/URLSearchParams.cpp b/src/bun.js/bindings/URLSearchParams.cpp
new file mode 100644
index 000000000..0ce9554c7
--- /dev/null
+++ b/src/bun.js/bindings/URLSearchParams.cpp
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "URLSearchParams.h"
+
+#include "DOMURL.h"
+#include "wtf/URLParser.h"
+
+namespace WebCore {
+
+URLSearchParams::URLSearchParams(const String& init, DOMURL* associatedURL)
+ : m_associatedURL(associatedURL)
+ , m_pairs(init.startsWith('?') ? WTF::URLParser::parseURLEncodedForm(StringView(init).substring(1)) : WTF::URLParser::parseURLEncodedForm(init))
+{
+}
+
+URLSearchParams::URLSearchParams(const Vector<KeyValuePair<String, String>>& pairs)
+ : m_pairs(pairs)
+{
+}
+
+ExceptionOr<Ref<URLSearchParams>> URLSearchParams::create(std::variant<Vector<Vector<String>>, Vector<KeyValuePair<String, String>>, String>&& variant)
+{
+ auto visitor = WTF::makeVisitor([&](const Vector<Vector<String>>& vector) -> ExceptionOr<Ref<URLSearchParams>> {
+ Vector<KeyValuePair<String, String>> pairs;
+ for (const auto& pair : vector) {
+ if (pair.size() != 2)
+ return Exception { TypeError };
+ pairs.append({pair[0], pair[1]});
+ }
+ return adoptRef(*new URLSearchParams(WTFMove(pairs))); }, [&](const Vector<KeyValuePair<String, String>>& pairs) -> ExceptionOr<Ref<URLSearchParams>> { return adoptRef(*new URLSearchParams(pairs)); }, [&](const String& string) -> ExceptionOr<Ref<URLSearchParams>> { return adoptRef(*new URLSearchParams(string, nullptr)); });
+ return std::visit(visitor, variant);
+}
+
+String URLSearchParams::get(const String& name) const
+{
+ for (const auto& pair : m_pairs) {
+ if (pair.key == name)
+ return pair.value;
+ }
+ return String();
+}
+
+bool URLSearchParams::has(const String& name) const
+{
+ for (const auto& pair : m_pairs) {
+ if (pair.key == name)
+ return true;
+ }
+ return false;
+}
+
+void URLSearchParams::sort()
+{
+ std::stable_sort(m_pairs.begin(), m_pairs.end(), [](const auto& a, const auto& b) {
+ return WTF::codePointCompareLessThan(a.key, b.key);
+ });
+ updateURL();
+}
+
+void URLSearchParams::set(const String& name, const String& value)
+{
+ for (auto& pair : m_pairs) {
+ if (pair.key != name)
+ continue;
+ if (pair.value != value)
+ pair.value = value;
+ bool skippedFirstMatch = false;
+ m_pairs.removeAllMatching([&](const auto& pair) {
+ if (pair.key == name) {
+ if (skippedFirstMatch)
+ return true;
+ skippedFirstMatch = true;
+ }
+ return false;
+ });
+ updateURL();
+ return;
+ }
+ m_pairs.append({ name, value });
+ updateURL();
+}
+
+void URLSearchParams::append(const String& name, const String& value)
+{
+ m_pairs.append({ name, value });
+ updateURL();
+}
+
+Vector<String> URLSearchParams::getAll(const String& name) const
+{
+ Vector<String> values;
+ values.reserveInitialCapacity(m_pairs.size());
+ for (const auto& pair : m_pairs) {
+ if (pair.key == name)
+ values.uncheckedAppend(pair.value);
+ }
+ values.shrinkToFit();
+ return values;
+}
+
+void URLSearchParams::remove(const String& name)
+{
+ m_pairs.removeAllMatching([&](const auto& pair) {
+ return pair.key == name;
+ });
+ updateURL();
+}
+
+String URLSearchParams::toString() const
+{
+ return WTF::URLParser::serialize(m_pairs);
+}
+
+void URLSearchParams::updateURL()
+{
+ if (m_associatedURL)
+ m_associatedURL->setQuery(WTF::URLParser::serialize(m_pairs));
+}
+
+void URLSearchParams::updateFromAssociatedURL()
+{
+ ASSERT(m_associatedURL);
+ String search = m_associatedURL->search();
+ m_pairs = search.startsWith('?') ? WTF::URLParser::parseURLEncodedForm(StringView(search).substring(1)) : WTF::URLParser::parseURLEncodedForm(search);
+}
+
+std::optional<KeyValuePair<String, String>> URLSearchParams::Iterator::next()
+{
+ auto& pairs = m_target->pairs();
+ if (m_index >= pairs.size())
+ return std::nullopt;
+
+ auto& pair = pairs[m_index++];
+ return KeyValuePair<String, String> { pair.key, pair.value };
+}
+
+URLSearchParams::Iterator::Iterator(URLSearchParams& params)
+ : m_target(params)
+{
+}
+
+}