Difference between revisions of "User:Minooz/OSD600/FF/patch565031"

From CDOT Wiki
< User:Minooz‎ | OSD600‎ | FF
Jump to: navigation, search
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
<div id="Apr16">
 +
=== 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...
 
<source lang="java">
 
<source lang="java">
 +
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);
 +
}
 +
</source></div>
 +
------
 +
<div id="Apr6">
 +
 +
=== Apr6 ===
 +
<source lang="java">
 +
// Modified based on Matt Postil's Version
 
diff -r e6b318aca788 layout/generic/nsImageMap.cpp
 
diff -r e6b318aca788 layout/generic/nsImageMap.cpp
 
--- a/layout/generic/nsImageMap.cpp Wed Apr 06 17:38:21 2011 -0700
 
--- a/layout/generic/nsImageMap.cpp Wed Apr 06 17:38:21 2011 -0700
Line 40: Line 168:
 
         if (*tptr == ',')
 
         if (*tptr == ',')
 
         {
 
         {
</source>
+
</source></div>

Latest revision as of 20:33, 20 April 2011

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 == ',')
         {