summaryrefslogtreecommitdiffstats
path: root/dom/url/URLSearchParams.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/url/URLSearchParams.cpp')
-rw-r--r--dom/url/URLSearchParams.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/dom/url/URLSearchParams.cpp b/dom/url/URLSearchParams.cpp
index f762299f8..e2172ea0e 100644
--- a/dom/url/URLSearchParams.cpp
+++ b/dom/url/URLSearchParams.cpp
@@ -448,6 +448,15 @@ URLSearchParams::GetValueAtIndex(uint32_t aIndex) const
return mParams->GetValueAtIndex(aIndex);
}
+void
+URLSearchParams::Sort(ErrorResult& aRv)
+{
+ aRv = mParams->Sort();
+ if (!aRv.Failed()) {
+ NotifyObserver();
+ }
+}
+
// Helper functions for structured cloning
inline bool
ReadString(JSStructuredCloneReader* aReader, nsString& aString)
@@ -472,6 +481,39 @@ ReadString(JSStructuredCloneReader* aReader, nsString& aString)
return true;
}
+nsresult
+URLParams::Sort()
+{
+ // Unfortunately we cannot use nsTArray<>.Sort() because it doesn't keep the
+ // correct order of the values for equal keys.
+
+ // Let's sort the keys, without duplicates.
+ FallibleTArray<nsString> keys;
+ for (const Param& param : mParams) {
+ if (!keys.Contains(param.mKey) &&
+ !keys.InsertElementSorted(param.mKey, fallible)) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ }
+
+ FallibleTArray<Param> params;
+
+ // Here we recreate the array starting from the sorted keys.
+ for (uint32_t keyId = 0, keysLength = keys.Length(); keyId < keysLength;
+ ++keyId) {
+ const nsString& key = keys[keyId];
+ for (const Param& param : mParams) {
+ if (param.mKey.Equals(key) &&
+ !params.AppendElement(param, fallible)) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ }
+ }
+
+ mParams.SwapElements(params);
+ return NS_OK;
+}
+
inline bool
WriteString(JSStructuredCloneWriter* aWriter, const nsString& aString)
{