Bug 1170274 - Better tokenizer function for nsGenericHTMLElement::GetURIListAttr. r=ehsan
☠☠ backed out by 85f92f328b52 ☠ ☠
authorAndrea Marchesini <amarchesini@mozilla.com>
Tue, 16 Jun 2015 08:52:12 -0400
changeset 267216 e44f689c37565d889ebf96e70cfd891d9c992821
parent 267215 cf4421a96636450d4fcd8a83be9e779edc47e88e
child 267217 a726ca79e03d5c82f88f10c5c19cbc1db84118f3
push id4932
push userjlund@mozilla.com
push dateMon, 10 Aug 2015 18:23:06 +0000
treeherdermozilla-esr52@6dd5a4f5f745 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersehsan
bugs1170274
milestone41.0a1
Bug 1170274 - Better tokenizer function 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(char16_t(' '));
     }
+
+    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
 {