Bug 1170274 - A better string parser for nsGenericHTMLElement::GetURIListAttr, r=ehsan
☠☠ backed out by d8df8c6f33ef ☠ ☠
authorAndrea Marchesini <amarchesini@mozilla.com>
Wed, 17 Jun 2015 12:43:53 +0100
changeset 249287 689ce5819b24dcc8bd8491c87652c1e9ba94628d
parent 249286 d772d098a392c569e854b81b27e24f97c4619e14
child 249288 fce5800610499026a804d5599bcfae0f6185ad05
push id61208
push useramarchesini@mozilla.com
push dateWed, 17 Jun 2015 11:44:22 +0000
treeherdermozilla-inbound@689ce5819b24 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersehsan
bugs1170274
milestone41.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1170274 - A better string parser for nsGenericHTMLElement::GetURIListAttr, r=ehsan
dom/html/nsGenericHTMLElement.cpp
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -1727,45 +1727,44 @@ nsGenericHTMLElement::GetURIListAttr(nsI
 
   nsAutoString value;
   if (!GetAttr(kNameSpaceID_None, aAttr, value))
     return NS_OK;
 
   nsIDocument* doc = OwnerDoc(); 
   nsCOMPtr<nsIURI> baseURI = GetBaseURI();
 
-  // Value contains relative URIs split on spaces (U+0020)
-  const char16_t *start = value.BeginReading();
-  const char16_t *end   = value.EndReading();
-  const char16_t *iter  = start;
-  for (;;) {
-    if (iter < end && *iter != ' ') {
-      ++iter;
-    } else {  // iter is pointing at either end or a space
-      while (*start == ' ' && start < iter)
-        ++start;
-      if (iter != start) {
-        if (!aResult.IsEmpty())
-          aResult.Append(char16_t(' '));
-        const nsSubstring& uriPart = Substring(start, iter);
-        nsCOMPtr<nsIURI> attrURI;
-        nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(attrURI),
-                                                  uriPart, doc, baseURI);
-        if (attrURI) {
-          nsAutoCString spec;
-          attrURI->GetSpec(spec);
-          AppendUTF8toUTF16(spec, aResult);
-        } else {
-          aResult.Append(uriPart);
-        }
-      }
-      start = iter = iter + 1;
-      if (iter >= end)
-        break;
+  NS_ConvertUTF16toUTF8 str(value);
+  char* buffer = str.BeginWriting();
+
+  while (char* token = NS_strtok(" ", &buffer)) {
+    if (!aResult.IsEmpty()) {
+      aResult.Append(NS_LITERAL_STRING(" "));
     }
+
+    NS_ConvertUTF8toUTF16 uriPart(token);
+    nsCOMPtr<nsIURI> attrURI;
+    nsresult rv =
+      nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(attrURI),
+                                                uriPart, doc, baseURI);
+    if (NS_FAILED(rv)) {
+      aResult.Append(uriPart);
+      continue;
+    }
+
+    MOZ_ASSERT(attrURI);
+
+    nsAutoCString spec;
+    rv = attrURI->GetSpec(spec);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      aResult.Append(uriPart);
+      continue;
+    }
+
+    AppendUTF8toUTF16(spec, aResult);
   }
 
   return NS_OK;
 }
 
 HTMLMenuElement*
 nsGenericHTMLElement::GetContextMenu() const
 {