Bug 1431449 - Make URLParams::ParseInput call URLParams::Parse instead of the opposite; r?bz
This trades off more virtual calls in URLParams::ParseInput, while removing any extra
allocation when calling URLParams::Parse.
MozReview-Commit-ID: HrIqsguQjrk
--- a/caps/OriginAttributes.cpp
+++ b/caps/OriginAttributes.cpp
@@ -171,18 +171,18 @@ public:
{
MOZ_ASSERT(aOriginAttributes);
// If mPrivateBrowsingId is passed in as >0 and is not present in the suffix,
// then it will remain >0 when it should be 0 according to the suffix. Set to 0 before
// iterating to fix this.
mOriginAttributes->mPrivateBrowsingId = 0;
}
- bool URLParamsIterator(const nsString& aName,
- const nsString& aValue) override
+ bool URLParamsIterator(const nsAString& aName,
+ const nsAString& aValue) override
{
if (aName.EqualsLiteral("appId")) {
nsresult rv;
int64_t val = aValue.ToInteger64(&rv);
NS_ENSURE_SUCCESS(rv, false);
NS_ENSURE_TRUE(val <= UINT32_MAX, false);
mOriginAttributes->mAppId = static_cast<uint32_t>(val);
--- a/dom/base/BodyUtil.cpp
+++ b/dom/base/BodyUtil.cpp
@@ -50,18 +50,18 @@ class MOZ_STACK_CLASS FillFormIterator f
{
public:
explicit FillFormIterator(FormData* aFormData)
: mFormData(aFormData)
{
MOZ_ASSERT(aFormData);
}
- bool URLParamsIterator(const nsString& aName,
- const nsString& aValue) override
+ bool URLParamsIterator(const nsAString& aName,
+ const nsAString& aValue) override
{
ErrorResult rv;
mFormData->Append(aName, aValue, rv);
MOZ_ASSERT(!rv.Failed());
return true;
}
private:
--- a/dom/url/URLSearchParams.cpp
+++ b/dom/url/URLSearchParams.cpp
@@ -161,27 +161,16 @@ URLParams::DecodeString(const nsACString
}
ConvertString(unescaped, aOutput);
}
/* static */ bool
URLParams::Parse(const nsACString& aInput, ForEachIterator& aIterator)
{
- URLParams params;
- params.ParseInput(aInput);
- return params.ForEach(aIterator);
-}
-
-void
-URLParams::ParseInput(const nsACString& aInput)
-{
- // Remove all the existing data before parsing a new input.
- DeleteAll();
-
nsACString::const_iterator start, end;
aInput.BeginReading(start);
aInput.EndReading(end);
nsACString::const_iterator iter(start);
while (start != end) {
nsAutoCString string;
@@ -215,18 +204,52 @@ URLParams::ParseInput(const nsACString&
}
nsAutoString decodedName;
DecodeString(name, decodedName);
nsAutoString decodedValue;
DecodeString(value, decodedValue);
- Append(decodedName, decodedValue);
+ if (!aIterator.URLParamsIterator(decodedName, decodedValue)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+class MOZ_STACK_CLASS PopulateIterator final
+ : public URLParams::ForEachIterator
+{
+public:
+ explicit PopulateIterator(URLParams* aParams)
+ : mParams(aParams)
+ {
+ MOZ_ASSERT(aParams);
}
+
+ bool URLParamsIterator(const nsAString& aName,
+ const nsAString& aValue) override
+ {
+ mParams->Append(aName, aValue);
+ return true;
+ }
+
+private:
+ URLParams* mParams;
+};
+
+void
+URLParams::ParseInput(const nsACString& aInput)
+{
+ // Remove all the existing data before parsing a new input.
+ DeleteAll();
+
+ PopulateIterator iter(this);
+ URLParams::Parse(aInput, iter);
}
namespace {
void SerializeString(const nsCString& aInput, nsAString& aValue)
{
const unsigned char* p = (const unsigned char*) aInput.get();
const unsigned char* end = p + aInput.Length();
--- a/dom/url/URLSearchParams.h
+++ b/dom/url/URLSearchParams.h
@@ -42,37 +42,25 @@ public:
{
DeleteAll();
}
class ForEachIterator
{
public:
virtual bool
- URLParamsIterator(const nsString& aName, const nsString& aValue) = 0;
+ URLParamsIterator(const nsAString& aName, const nsAString& aValue) = 0;
};
static bool
Parse(const nsACString& aInput, ForEachIterator& aIterator);
void
ParseInput(const nsACString& aInput);
- bool
- ForEach(ForEachIterator& aIterator) const
- {
- for (uint32_t i = 0; i < mParams.Length(); ++i) {
- if (!aIterator.URLParamsIterator(mParams[i].mKey, mParams[i].mValue)) {
- return false;
- }
- }
-
- return true;
- }
-
void Serialize(nsAString& aValue) const;
void Get(const nsAString& aName, nsString& aRetval);
void GetAll(const nsAString& aName, nsTArray<nsString>& aRetval);
void Set(const nsAString& aName, const nsAString& aValue);