Implement URLSearchParams's sort()

master
Fedor 2020-05-25 08:50:14 +03:00
parent 56466b9697
commit c3e2f1e0bf
3 changed files with 51 additions and 1 deletions

View File

@ -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)
{

View File

@ -70,7 +70,7 @@ public:
void Get(const nsAString& aName, nsString& aRetval);
void GetAll(const nsAString& aName, nsTArray<nsString >& aRetval);
void GetAll(const nsAString& aName, nsTArray<nsString>& aRetval);
void Set(const nsAString& aName, const nsAString& aValue);
@ -103,6 +103,8 @@ public:
return mParams[aIndex].mValue;
}
nsresult Sort();
bool
ReadStructuredClone(JSStructuredCloneReader* aReader);
@ -171,6 +173,8 @@ public:
const nsAString& GetKeyAtIndex(uint32_t aIndex) const;
const nsAString& GetValueAtIndex(uint32_t aIndex) const;
void Sort(ErrorResult& aRv);
void Stringify(nsString& aRetval) const
{
Serialize(aRetval);

View File

@ -22,6 +22,10 @@ interface URLSearchParams {
sequence<USVString> getAll(USVString name);
boolean has(USVString name);
void set(USVString name, USVString value);
[Throws]
void sort();
iterable<USVString, USVString>;
stringifier;
};