[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.1/kdelibs/khtml/css
From:       Maks Orlovich <maksim () kde ! org>
Date:       2008-08-24 19:11:48
Message-ID: 1219605108.776667.30300.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 851859 by orlovich:

Fix a couple of cases where background-position: parsing accepted invalid settings.
BUG: 169612


 M  +62 -25    cssparser.cpp  
 M  +9 -1      cssparser.h  


--- branches/KDE/4.1/kdelibs/khtml/css/cssparser.cpp #851858:851859
@@ -1478,30 +1478,29 @@
     return 0;
 }
 
-CSSValueImpl* CSSParser::parseBackgroundPositionXY(bool& xFound, bool& yFound)
+CSSValueImpl* CSSParser::parseBackgroundPositionXY(BackgroundPosKind& kindOut)
 {
     int id = valueList->current()->id;
     if (id == CSS_VAL_LEFT || id == CSS_VAL_TOP || id == CSS_VAL_RIGHT || id == \
CSS_VAL_BOTTOM || id == CSS_VAL_CENTER) {  int percent = 0;
         if (id == CSS_VAL_LEFT || id == CSS_VAL_RIGHT) {
-            if (xFound)
-                return 0;
-            xFound = true;
+            kindOut = BgPos_X;
             if (id == CSS_VAL_RIGHT)
                 percent = 100;
         }
         else if (id == CSS_VAL_TOP || id == CSS_VAL_BOTTOM) {
-            if (yFound)
-                return 0;
-            yFound = true;
+            kindOut = BgPos_Y;
             if (id == CSS_VAL_BOTTOM)
                 percent = 100;
         }
-        else if (id == CSS_VAL_CENTER)
+        else if (id == CSS_VAL_CENTER) {
             // Center is ambiguous, so we're not sure which position we've found \
yet, an x or a y. +            kindOut = BgPos_Center;
             percent = 50;
+        }
         return new CSSPrimitiveValueImpl(percent, \
CSSPrimitiveValue::CSS_PERCENTAGE);  }
+    kindOut = BgPos_NonKW;
     if (validUnit(valueList->current(), FPercent|FLength, strict))
         return new CSSPrimitiveValueImpl(valueList->current()->fValue,
                                          \
(CSSPrimitiveValue::UnitTypes)valueList->current()->unit); @@ -1515,8 +1514,8 @@
     Value* value = valueList->current();
 
     // Parse the first value.  We're just making sure that it is one of the valid \
                keywords or a percentage/length.
-    bool value1IsX = false, value1IsY = false;
-    value1 = parseBackgroundPositionXY(value1IsX, value1IsY);
+    BackgroundPosKind value1pos;
+    value1 = parseBackgroundPositionXY(value1pos);
     if (!value1)
         return;
 
@@ -1529,9 +1528,9 @@
     if (value && value->unit == Value::Operator && value->iValue == ',')
         value = 0;
 
-    bool value2IsX = false, value2IsY = false;
+    BackgroundPosKind value2pos = BgPos_Center; // true if not specified.
     if (value) {
-        value2 = parseBackgroundPositionXY(value2IsX, value2IsY);
+        value2 = parseBackgroundPositionXY(value2pos);
         if (value2)
             valueList->next();
         else {
@@ -1544,13 +1543,39 @@
     }
 
     if (!value2)
-        // Only one value was specified.  If that value was not a keyword, then it \
                sets the x position, and the y position
-        // is simply 50%.  This is our default.
-        // For keywords, the keyword was either an x-keyword (left/right), a \
                y-keyword (top/bottom), or an ambiguous keyword (center).
-        // For left/right/center, the default of 50% in the y is still correct.
+        // Only one value was specified.  The other direction is always 50%.
+        // If the one given was not a keyword, it should be viewed as 'x',
+        // and so setting value2 would set y, as desired.
+        // If the one value was a keyword, the swap below would put things in order
+        // if needed.
         value2 = new CSSPrimitiveValueImpl(50, CSSPrimitiveValue::CSS_PERCENTAGE);
 
-    if (value1IsY || value2IsX) {
+    // Check for various failures
+    bool ok = true;
+
+    // Two keywords on the same axis.
+    if (value1pos == BgPos_X && value2pos == BgPos_X)
+        ok = false;
+    if (value1pos == BgPos_Y && value2pos == BgPos_Y)
+        ok = false;
+
+    // Will we need to swap them?
+    bool swap = (value1pos == BgPos_Y || value2pos == BgPos_X);
+
+    // If we had a non-KW value and a keyword value that's in the "wrong" position,
+    // this is malformed (#169612)
+    if (swap && (value1pos == BgPos_NonKW || value2pos == BgPos_NonKW))
+        ok = false;
+
+    if (!ok) {
+        delete value1;
+        delete value2;
+        value1 = 0;
+        value2 = 0;
+        return;
+    }
+
+    if (swap) {
         // Swap our two values.
         CSSValueImpl* val = value2;
         value2 = value1;
@@ -1648,17 +1673,29 @@
                     // unlike the other functions, parseBackgroundPosition advances \
the valueList pointer  break;
                 case CSS_PROP_BACKGROUND_POSITION_X: {
-                    bool xFound = false, yFound = true;
-                    currValue = parseBackgroundPositionXY(xFound, yFound);
-                    if (currValue)
-                        valueList->next();
+                    BackgroundPosKind pos;
+                    currValue = parseBackgroundPositionXY(pos);
+                    if (currValue) {
+                        if (pos == BgPos_Y) {
+                            delete currValue;
+                            currValue = 0;
+                        } else {
+                            valueList->next();
+                        }
+                    }
                     break;
                 }
                 case CSS_PROP_BACKGROUND_POSITION_Y: {
-                    bool xFound = true, yFound = false;
-                    currValue = parseBackgroundPositionXY(xFound, yFound);
-                    if (currValue)
-                        valueList->next();
+                    BackgroundPosKind pos;
+                    currValue = parseBackgroundPositionXY(pos);
+                    if (currValue) {
+                        if (pos == BgPos_X) {
+                            delete currValue;
+                            currValue = 0;
+                        } else {                    
+                            valueList->next();
+                        }
+                    }
                     break;
                 }
                 case CSS_PROP_BACKGROUND_REPEAT:
--- branches/KDE/4.1/kdelibs/khtml/css/cssparser.h #851858:851859
@@ -128,7 +128,15 @@
 
         CSSValueImpl* parseBackgroundColor();
         CSSValueImpl* parseBackgroundImage(bool& didParse);
-        CSSValueImpl* parseBackgroundPositionXY(bool& xFound, bool& yFound);
+
+        enum BackgroundPosKind {
+            BgPos_X,
+            BgPos_Y,
+            BgPos_NonKW,
+            BgPos_Center
+        };
+        
+        CSSValueImpl* parseBackgroundPositionXY(BackgroundPosKind& kindOut);
         void parseBackgroundPosition(CSSValueImpl*& value1, CSSValueImpl*& value2);
         CSSValueImpl* parseBackgroundSize();
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic