User:Minooz/OSD600/FF/patch565031

From CDOT Wiki
< User:Minooz‎ | OSD600‎ | FF
Revision as of 21:33, 20 April 2011 by Minooz (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Apr16

The review of the bug suggests to start over the function based on the HTML5 specs.
However, the spec is using an integer list to add the valid values dynamically. There are memory allocation problems with that in c++.
Seems the existing method is more reasonable for doing the same concept but not following exact same steps.
Also I'm not sure how using aSpec of type nsAString is doable instead of converting it using ToNewCString(aSpec)
So, still working on these issues...
 void Area::ParseCoords(const nsAString& aSpec)
{
  char* cp = ToNewCString(aSpec);
  if (!cp) {
    return;
  }
    char *tptr;
    char *n_str;
    PRInt32 i, cnt, pos, value;
    PRInt32 *value_list;
    PRBool negated = false;
    PRBool started = false;
    PRBool gotNumber = false;
    PRBool finished = false;
    PRBool bogus = false;

    /*
     * Nothing in an empty list
     */
    mNumCoords = 0;
    mCoords = nsnull;

    value_list = new int [5];

    /*
     * Make a pass where any two numbers separated by just whitespace
     * are given a comma separator.  Count entries while passing.
     */
    cnt = 0;
    value = 0;
    n_str = cp;
    
    while (*n_str != '\0')
    {
      while (is_separator(*n_str))
      {
        n_str++;
        value = 0;
        negated = false;
        started = false;
        gotNumber = false;
        finished = false;
        bogus = false;
      }
      
      if (*n_str == '\0')
      {
        break;
      }
      
      if (*n_str == '-') 
      {
        if (gotNumber)
        {
          finished = true;
        }
        if (!finished)
        {
          if (started)
            negated = false;
          else 
          {
            if (!bogus)
              negated = true;
          }
        }  
        started = true;
        n_str++;
      }
      else if (*n_str >= '0' && *n_str <= '9') 
      {
        if (!finished)
        {
          value *= 10;
          value += *n_str - '0';
          started = true;
          gotNumber = true;
          n_str++;
        }  
      
        if (is_separator(*n_str)) 
        {
          if (!gotNumber)
          {
            break;
          }  
          if (negated)
          {
            value *= -1;
          }  
          value_list[cnt] = value;
          cnt++;
        }  
      }
      else 
      {
        if (!finished)
        {
          negated = false;
          bogus = true;
          if (started)
          {
            break;
          }
        }
      }
      
    }

    mNumCoords = cnt;
    mCoords = value_list;

    NS_Free(cp);
}

Apr6

// Modified based on Matt Postil's Version
diff -r e6b318aca788 layout/generic/nsImageMap.cpp
--- a/layout/generic/nsImageMap.cpp	Wed Apr 06 17:38:21 2011 -0700
+++ b/layout/generic/nsImageMap.cpp	Sat Apr 09 20:50:51 2011 -0400
@@ -112,12 +112,7 @@
 inline PRBool
 is_space(char c)
 {
-  return (c == ' ' ||
-          c == '\f' ||
-          c == '\n' ||
-          c == '\r' ||
-          c == '\t' ||
-          c == '\v');
+  return c == ' ';
 }
 
 static void logMessage(nsIContent*      aContent,
@@ -186,12 +181,17 @@
        * Skip to a separator
        */
       tptr = n_str;
-      while (!is_space(*tptr) && *tptr != ',' && *tptr != '\0')
+      while (!is_space(*tptr) && *tptr != ',' &&  *tptr != ';' && *tptr != '\0')
       {
         tptr++;
       }
       n_str = tptr;
 
       /*
        * If no more entries, break out here
        */
@@ -205,7 +205,7 @@
        * comma.
        */
       has_comma = PR_FALSE;
-      while (is_space(*tptr) || *tptr == ',')
+      while (is_space(*tptr) || *tptr == ',' || *tptr == ';')
       {
         if (*tptr == ',')
         {