Bug 1431449 - Make URLParams::ParseInput call URLParams::Parse instead of the opposite; r?bz draft
authorAnthony Ramine <n.oxyde@gmail.com>
Thu, 18 Jan 2018 13:13:51 +0100
changeset 722332 a6cc15ad1aa6386b7875382bec577c24e0085ea4
parent 722190 02ed4fbb2629b31cd0b571e4a8b75c21fa2ae647
child 746606 f44e78e65834ba03c781009c30cd0cab1e3438e0
push id96141
push userbmo:nox@mozilla.com
push dateThu, 18 Jan 2018 22:41:20 +0000
reviewersbz
bugs1431449
milestone59.0a1
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
caps/OriginAttributes.cpp
dom/base/BodyUtil.cpp
dom/url/URLSearchParams.cpp
dom/url/URLSearchParams.h
--- 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);