Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Apr 2006 05:21:08 +0000 (05:21 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Apr 2006 05:21:08 +0000 (05:21 +0000)
        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=7118
          Property values with extra items do not get treated as invalid (they should)

        Tests: fast/css/invalidation-errors.html
               fast/css/invalidation-errors-2.html
               fast/css/invalidation-errors-3.html

        * css/CSSGrammar.y: Rollback the properties added by parseValue() when it returns false.
        * css/cssparser.h: Moved shorthand counting to ShorthandScope, a new class in cssparser.cpp.
        * css/cssparser.cpp:
        (WebCore::CSSParser::rollbackLastProperties): Added.
        (WebCore::CSSParser::parseValue): Return false if there are too many properties in the list.
        (WebCore::CSSParser::parseBackgroundShorthand): Use ShorthandScope.
        (WebCore::CSSParser::parseShorthand): Ditto.
        (WebCore::CSSParser::parse4Values): Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@13673 268f45cc-cd09-0410-ab3c-d52691b4dbfc

20 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/block/margin-collapse/103-expected.checksum
LayoutTests/fast/block/margin-collapse/103-expected.png
LayoutTests/fast/block/margin-collapse/103-expected.txt
LayoutTests/fast/css/invalidation-errors-2-expected.checksum [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-2-expected.png [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-2-expected.txt [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-2.html [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-3-expected.checksum [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-3-expected.png [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-3-expected.txt [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-3.html [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-expected.checksum [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-expected.png [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors-expected.txt [new file with mode: 0644]
LayoutTests/fast/css/invalidation-errors.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/css/CSSGrammar.y
WebCore/css/cssparser.cpp
WebCore/css/cssparser.h

index 2e060d497aac470df4164cdd81ba751f64d75b58..d44dcac2e683aaaae637bb1df535733d91aefa01 100644 (file)
@@ -1,3 +1,26 @@
+2006-04-03  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        - tests for http://bugzilla.opendarwin.org/show_bug.cgi?id=7118
+          Property values with extra items do not get treated as invalid (they should)
+
+        * fast/block/margin-collapse/103-expected.checksum: Corrected the results.
+        * fast/block/margin-collapse/103-expected.png:
+        * fast/block/margin-collapse/103-expected.txt:
+        * fast/css/invalidation-errors-2-expected.checksum: Added.
+        * fast/css/invalidation-errors-2-expected.png: Added.
+        * fast/css/invalidation-errors-2-expected.txt: Added.
+        * fast/css/invalidation-errors-2.html: Added.
+        * fast/css/invalidation-errors-3-expected.checksum: Added.
+        * fast/css/invalidation-errors-3-expected.png: Added.
+        * fast/css/invalidation-errors-3-expected.txt: Added.
+        * fast/css/invalidation-errors-3.html: Added.
+        * fast/css/invalidation-errors-expected.checksum: Added.
+        * fast/css/invalidation-errors-expected.png: Added.
+        * fast/css/invalidation-errors-expected.txt: Added.
+        * fast/css/invalidation-errors.html: Added.
+
 2006-04-03  Darin Adler  <darin@apple.com>
 
         - add a test of RTL to the test for bug 8106
index a7e834fb4ae0bc5de973e67ea0f21bce776af0b9..8554a50c3bc1a208c0d742acdd11dff79bc117b2 100644 (file)
@@ -1 +1 @@
-b0a4b15bd1c0de763dc4ca23f39b934e
\ No newline at end of file
+193b74a67961c892e96709f3ce75b5b2
\ No newline at end of file
index 7d257f1f8a91a69cb4d981e406cd80adc7694afd..74781064ea13b67a92a45fb12420989cac230d8d 100644 (file)
Binary files a/LayoutTests/fast/block/margin-collapse/103-expected.png and b/LayoutTests/fast/block/margin-collapse/103-expected.png differ
index 49034432985a6027e5dffcdc066dc7a0d03ef7a9..a4ae8ac9a1902a3487101a2edc34a60d443840df 100644 (file)
@@ -10,7 +10,7 @@ layer at (0,0) size 785x1691
             RenderText {TEXT} at (0,2) size 520x40
               text run at (0,2) width 520: "We are trying to understand how UVic students perform Shakespeare related research for"
               text run at (0,22) width 265: "classes as well as for their own interest. The "
-            RenderInline {A} at (0,0) size 173x16 [border: (1px dashed #333333) none]
+            RenderInline {A} at (0,0) size 173x15
               RenderText {TEXT} at (265,22) size 173x20
                 text run at (265,22) width 173: "Internet Shakespeare Editions"
             RenderText {TEXT} at (438,22) size 560x60
diff --git a/LayoutTests/fast/css/invalidation-errors-2-expected.checksum b/LayoutTests/fast/css/invalidation-errors-2-expected.checksum
new file mode 100644 (file)
index 0000000..cfe58c2
--- /dev/null
@@ -0,0 +1 @@
+ef0f2313cde66deebf7baa97ae54de3f
\ No newline at end of file
diff --git a/LayoutTests/fast/css/invalidation-errors-2-expected.png b/LayoutTests/fast/css/invalidation-errors-2-expected.png
new file mode 100644 (file)
index 0000000..806e148
Binary files /dev/null and b/LayoutTests/fast/css/invalidation-errors-2-expected.png differ
diff --git a/LayoutTests/fast/css/invalidation-errors-2-expected.txt b/LayoutTests/fast/css/invalidation-errors-2-expected.txt
new file mode 100644 (file)
index 0000000..955066b
--- /dev/null
@@ -0,0 +1,28 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x576
+      RenderBlock {P} at (0,0) size 784x18
+        RenderInline {A} at (0,0) size 60x18 [color=#0000EE]
+          RenderText {TEXT} at (0,0) size 60x18
+            text run at (0,0) width 60: "bug 7118"
+        RenderText {TEXT} at (60,0) size 356x18
+          text run at (60,0) width 356: ": Wrong property values do not get invalidated correctly."
+      RenderBlock (anonymous) at (0,34) size 784x0
+        RenderInline {DIV} at (0,0) size 0x0
+          RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+layer at (8,42) size 200x200
+  RenderBlock (floating) {DIV} at (0,0) size 200x200 [color=#FFFFFF] [bgcolor=#006400]
+    RenderText {TEXT} at (0,0) size 194x128
+      text run at (0,0) width 160: "this text should be left-"
+      text run at (0,16) width 157: "aligned, all lower-case,"
+      text run at (0,32) width 169: "normal font, white, 14px,"
+      text run at (0,48) width 182: "bold, normally spaced and"
+      text run at (0,64) width 165: "wrapped, in a darkgreen"
+      text run at (0,80) width 102: "200x200px div "
+      text run at (102,80) width 92: "in the top left"
+      text run at (0,96) width 174: "corner with no borders or"
+      text run at (0,112) width 60: "outlines."
diff --git a/LayoutTests/fast/css/invalidation-errors-2.html b/LayoutTests/fast/css/invalidation-errors-2.html
new file mode 100644 (file)
index 0000000..e944804
--- /dev/null
@@ -0,0 +1,109 @@
+<head>
+    <style type="text/css">
+    #testblock {
+        width: 200px;
+        height: 200px;
+        /* invalid width and height */
+        width: 500px auto;
+        height: 500px 200px;
+        
+        /* Font-size */
+        font-size: 14px;
+        /* Invalid font-sizes */
+        font-size: 36px auto;
+        
+        float: left;
+        float: right auto;
+        /* Trying colors */
+        /* The !important is here so you don't break this while fixing this bug */
+        color: white !important;
+        color: black;
+        background: darkgreen;
+        /* the color and background-color below should be invalidated, 
+        so the text should be green */
+        color: black auto !important;
+        background-color: darkred auto;
+        background-repeat: no-repeat;
+        
+        /* These ones actually get invalidated correctly */
+        background: url('http://webkit.opendarwin.org/images/welcomeopen.gif') auto;
+        background-repeat: auto repeat-x;
+
+        /* Trying text and font properties */
+        font-family: sans-serif;
+        font-weight: 900;
+        text-decoration: none;
+        word-spacing: normal;
+        letter-spacing: normal;
+        text-align: left; 
+        direction: ltr;
+        text-transform: lowercase;
+        font-variant: normal;
+        white-space: normal;
+        
+        /* Invalid text and font properties */
+        /* This one actually DOES get invalidated */
+        font: "Comic Sans MS" woopdidoo;
+        font-weight: 500 500;
+        /* This one actually DOES get invalidated */
+        text-decoration: line-through auto;
+        word-spacing: 10px auto;
+        letter-spacing: 5px auto;
+        text-align: right left; 
+        direction: rtl auto; 
+        text-transform: capitalize auto;     
+        font-variant: small-caps auto;
+        white-space: pre auto;
+    
+        outline: none;
+        outline: red 3px dotted blue;
+        outline: red solid auto;
+
+        overflow: hidden;
+        overflow: visible scroll;
+    }
+    #Content {
+        display: inline;
+        /* invalid */
+        display: block auto;
+        
+        /* All margins, paddings and borders until the next comment are incorrect and 
+        should be invalidated, resulting in padding and margin 0 */
+        margin-left: 50px auto;
+        margin-right: 50px auto;
+        margin-top: 50px auto;
+        margin-bottom: 50px auto;
+        padding-left: 50px auto;
+        padding-right: 50px auto;
+        padding-top: 50px auto;
+        padding-bottom: 50px auto; 
+        border: 1px solid auto;
+        border-top: yellow auto;        
+        border-right: blue auto;
+        border-bottom: yellow auto;        
+        border-left: blue auto;
+        /* The values below get invalidated correctly but are in here 
+        for completeness. */
+        margin: 100px 100px 100px 100px auto; 
+        padding: 100px 100px 100px 100px auto;
+    }
+    </style>
+</head>
+
+<body>
+<p><a href="http://bugzilla.opendarwin.org/show_bug.cgi?id=7118">bug 7118</a>: Wrong property values do not get invalidated correctly.</p>
+<div id="Content">
+    <div id="testblock">
+This text should be
+left-aligned, all lower-case,
+normal font, white, 14px,
+bold, normally spaced
+and wrapped, in a
+darkgreen 200x200px div 
+in the top left corner
+with no borders or
+outlines.
+</div>
+</div>
+
+</body>
diff --git a/LayoutTests/fast/css/invalidation-errors-3-expected.checksum b/LayoutTests/fast/css/invalidation-errors-3-expected.checksum
new file mode 100644 (file)
index 0000000..c2afda7
--- /dev/null
@@ -0,0 +1 @@
+43d6b129826089a86d30d7e3461ab763
\ No newline at end of file
diff --git a/LayoutTests/fast/css/invalidation-errors-3-expected.png b/LayoutTests/fast/css/invalidation-errors-3-expected.png
new file mode 100644 (file)
index 0000000..3f26f57
Binary files /dev/null and b/LayoutTests/fast/css/invalidation-errors-3-expected.png differ
diff --git a/LayoutTests/fast/css/invalidation-errors-3-expected.txt b/LayoutTests/fast/css/invalidation-errors-3-expected.txt
new file mode 100644 (file)
index 0000000..f440c6e
--- /dev/null
@@ -0,0 +1,21 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x542
+      RenderBlock {P} at (0,0) size 784x18
+        RenderInline {A} at (0,0) size 60x18 [color=#0000EE]
+          RenderText {TEXT} at (0,0) size 60x18
+            text run at (0,0) width 60: "bug 7118"
+        RenderText {TEXT} at (60,0) size 356x18
+          text run at (60,0) width 356: ": Wrong property values do not get invalidated correctly."
+      RenderBlock {P} at (0,34) size 784x18
+        RenderText {TEXT} at (0,0) size 379x18
+          text run at (0,0) width 379: "The two words \"test\" should look the same, with no outline:"
+      RenderBlock {DIV} at (0,102) size 784x59
+        RenderBlock {P} at (0,0) size 100x59
+          RenderText {TEXT} at (0,0) size 69x59
+            text run at (0,0) width 69: "test"
+      RenderBlock {P} at (0,211) size 784x59
+        RenderText {TEXT} at (0,0) size 69x59
+          text run at (0,0) width 69: "test"
diff --git a/LayoutTests/fast/css/invalidation-errors-3.html b/LayoutTests/fast/css/invalidation-errors-3.html
new file mode 100644 (file)
index 0000000..6891b05
--- /dev/null
@@ -0,0 +1,10 @@
+<head>
+</head>
+<body>
+<p><a href="http://bugzilla.opendarwin.org/show_bug.cgi?id=7118">bug 7118</a>: Wrong property values do not get invalidated correctly.</p>
+<p>The two words "test" should look the same, with no outline:</p>
+<div style="outline: blue solid;visibility:hidden;font-size:50px">
+<p style="outline:inherit inherit;width:100px;visibility:visible;font-size:initial initial;">test</p>
+</div>
+<p style="font-size:50px">test</p>
+</body>
diff --git a/LayoutTests/fast/css/invalidation-errors-expected.checksum b/LayoutTests/fast/css/invalidation-errors-expected.checksum
new file mode 100644 (file)
index 0000000..cfe58c2
--- /dev/null
@@ -0,0 +1 @@
+ef0f2313cde66deebf7baa97ae54de3f
\ No newline at end of file
diff --git a/LayoutTests/fast/css/invalidation-errors-expected.png b/LayoutTests/fast/css/invalidation-errors-expected.png
new file mode 100644 (file)
index 0000000..806e148
Binary files /dev/null and b/LayoutTests/fast/css/invalidation-errors-expected.png differ
diff --git a/LayoutTests/fast/css/invalidation-errors-expected.txt b/LayoutTests/fast/css/invalidation-errors-expected.txt
new file mode 100644 (file)
index 0000000..955066b
--- /dev/null
@@ -0,0 +1,28 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x576
+      RenderBlock {P} at (0,0) size 784x18
+        RenderInline {A} at (0,0) size 60x18 [color=#0000EE]
+          RenderText {TEXT} at (0,0) size 60x18
+            text run at (0,0) width 60: "bug 7118"
+        RenderText {TEXT} at (60,0) size 356x18
+          text run at (60,0) width 356: ": Wrong property values do not get invalidated correctly."
+      RenderBlock (anonymous) at (0,34) size 784x0
+        RenderInline {DIV} at (0,0) size 0x0
+          RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+        RenderText {TEXT} at (0,0) size 0x0
+layer at (8,42) size 200x200
+  RenderBlock (floating) {DIV} at (0,0) size 200x200 [color=#FFFFFF] [bgcolor=#006400]
+    RenderText {TEXT} at (0,0) size 194x128
+      text run at (0,0) width 160: "this text should be left-"
+      text run at (0,16) width 157: "aligned, all lower-case,"
+      text run at (0,32) width 169: "normal font, white, 14px,"
+      text run at (0,48) width 182: "bold, normally spaced and"
+      text run at (0,64) width 165: "wrapped, in a darkgreen"
+      text run at (0,80) width 102: "200x200px div "
+      text run at (102,80) width 92: "in the top left"
+      text run at (0,96) width 174: "corner with no borders or"
+      text run at (0,112) width 60: "outlines."
diff --git a/LayoutTests/fast/css/invalidation-errors.html b/LayoutTests/fast/css/invalidation-errors.html
new file mode 100644 (file)
index 0000000..eb79206
--- /dev/null
@@ -0,0 +1,109 @@
+<head>
+    <style type="text/css">
+    #testblock {
+        width: 200px;
+        height: 200px;
+        /* invalid width and height */
+        width: 500px garbage;
+        height: 500px 200px;
+        
+        /* Font-size */
+        font-size: 14px;
+        /* Invalid font-sizes */
+        font-size: 36px garbage;
+        
+        float: left;
+        float: right garbage;
+        /* Trying colors */
+        /* The !important is here so you don't break this while fixing this bug */
+        color: white !important;
+        color: black;
+        background: darkgreen;
+        /* the color and background-color below should be invalidated, 
+        so the text should be green */
+        color: black garbage !important;
+        background-color: darkred garbage;
+        background-repeat: no-repeat;
+        
+        /* These ones actually get invalidated correctly */
+        background: url('http://webkit.opendarwin.org/images/welcomeopen.gif') garbage;
+        background-repeat: garbage repeat-x;
+
+        /* Trying text and font properties */
+        font-family: sans-serif;
+        font-weight: 900;
+        text-decoration: none;
+        word-spacing: normal;
+        letter-spacing: normal;
+        text-align: left; 
+        direction: ltr;
+        text-transform: lowercase;
+        font-variant: normal;
+        white-space: normal;
+        
+        /* Invalid text and font properties */
+        /* This one actually DOES get invalidated */
+        font: "Comic Sans MS" woopdidoo;
+        font-weight: 500 500;
+        /* This one actually DOES get invalidated */
+        text-decoration: line-through garbage;
+        word-spacing: 10px garbage;
+        letter-spacing: 5px garbage;
+        text-align: right left; 
+        direction: rtl garbage; 
+        text-transform: capitalize garbage;     
+        font-variant: small-caps garbage;
+        white-space: pre garbage;
+    
+        outline: none;
+        outline: red 3px dotted garbage;
+        outline: red solid garbage;
+
+        overflow: hidden;
+        overflow: visible scroll;
+    }
+    #Content {
+        display: inline;
+        /* invalid */
+        display: block garbage;
+        
+        /* All margins, paddings and borders until the next comment are incorrect and 
+        should be invalidated, resulting in padding and margin 0 */
+        margin-left: 50px garbage;
+        margin-right: 50px garbage;
+        margin-top: 50px garbage;
+        margin-bottom: 50px garbage;
+        padding-left: 50px garbage;
+        padding-right: 50px garbage;
+        padding-top: 50px garbage;
+        padding-bottom: 50px garbage; 
+        border: 1px solid garbage;
+        border-top: yellow garbage;        
+        border-right: blue garbage;
+        border-bottom: yellow garbage;        
+        border-left: blue garbage;
+        /* The values below get invalidated correctly but are in here 
+        for completeness. */
+        margin: 100px 100px 100px 100px garbage; 
+        padding: 100px 100px 100px 100px garbage;
+    }
+    </style>
+</head>
+
+<body>
+<p><a href="http://bugzilla.opendarwin.org/show_bug.cgi?id=7118">bug 7118</a>: Wrong property values do not get invalidated correctly.</p>
+<div id="Content">
+    <div id="testblock">
+This text should be
+left-aligned, all lower-case,
+normal font, white, 14px,
+bold, normally spaced
+and wrapped, in a
+darkgreen 200x200px div 
+in the top left corner
+with no borders or
+outlines.
+</div>
+</div>
+
+</body>
index 8a7c6681c61e6470edd0e4da9e3b1e7a12a35379..d48fd1417809e750dfcf3c4e844deb8d8de7a822 100644 (file)
@@ -1,3 +1,23 @@
+2006-04-03  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=7118
+          Property values with extra items do not get treated as invalid (they should)
+
+        Tests: fast/css/invalidation-errors.html
+               fast/css/invalidation-errors-2.html
+               fast/css/invalidation-errors-3.html
+
+        * css/CSSGrammar.y: Rollback the properties added by parseValue() when it returns false.
+        * css/cssparser.h: Moved shorthand counting to ShorthandScope, a new class in cssparser.cpp.
+        * css/cssparser.cpp:
+        (WebCore::CSSParser::rollbackLastProperties): Added.
+        (WebCore::CSSParser::parseValue): Return false if there are too many properties in the list.
+        (WebCore::CSSParser::parseBackgroundShorthand): Use ShorthandScope.
+        (WebCore::CSSParser::parseShorthand): Ditto.
+        (WebCore::CSSParser::parse4Values): Ditto.
+
 2006-04-03  Darin Adler  <darin@apple.com>
 
         - changed StyleSheet back to hand-generated since the generated toJS
index df4435642731529dc13883dc771a3c37d7119fb9..04429f8e529eec7edd4fa91f05414af77d2fd4d0 100644 (file)
@@ -284,7 +284,9 @@ khtml_value:
         CSSParser *p = static_cast<CSSParser *>(parser);
         if ($4) {
             p->valueList = p->sinkFloatingValueList($4);
-            p->parseValue(p->id, p->important);
+            int oldParsedProperties = p->numParsedProperties;
+            if (!p->parseValue(p->id, p->important))
+                p->rollbackLastProperties(p->numParsedProperties - oldParsedProperties);
             delete p->valueList;
             p->valueList = 0;
         }
@@ -804,7 +806,10 @@ declaration:
         CSSParser *p = static_cast<CSSParser *>(parser);
         if ($1 && $4) {
             p->valueList = p->sinkFloatingValueList($4);
+            int oldParsedProperties = p->numParsedProperties;
             $$ = p->parseValue($1, $5);
+            if (!$$)
+                p->rollbackLastProperties(p->numParsedProperties - oldParsedProperties);
             delete p->valueList;
             p->valueList = 0;
         }
index c65b0fde20da06fa5fdb92a14c18f387a053d809..dc2cdd193ae821dd4630f6b485559df7c9d92058 100644 (file)
@@ -55,6 +55,25 @@ ValueList::~ValueList()
              delete m_values[i].function;
 }
 
+namespace {
+    class ShorthandScope {
+    public:
+        ShorthandScope(CSSParser* parser, int propId) : m_parser(parser)
+        {
+            if (!(m_parser->m_inParseShorthand++))
+                m_parser->m_currentShorthand = propId;
+        }
+        ~ShorthandScope()
+        {
+            if (!(--m_parser->m_inParseShorthand))
+                m_parser->m_currentShorthand = 0;
+        }
+
+    private:
+        CSSParser* m_parser;
+    };
+}
+
 CSSParser* CSSParser::currentParser = 0;
 
 CSSParser::CSSParser(bool strictParsing)
@@ -262,6 +281,15 @@ void CSSParser::addProperty(int propId, CSSValue *value, bool important)
     parsedProperties[numParsedProperties++] = prop;
 }
 
+void CSSParser::rollbackLastProperties(int num)
+{
+    ASSERT(num >= 0);
+    ASSERT(numParsedProperties >= num);
+
+    for (int i = 0; i < num; ++i)
+        delete parsedProperties[--numParsedProperties];
+}
+
 void CSSParser::clearProperties()
 {
     for (int i = 0; i < numParsedProperties; i++)
@@ -339,11 +367,17 @@ bool CSSParser::parseValue(int propId, bool important)
 
     int id = value->id;
 
+    int num = inShorthand() ? 1 : valueList->size();
+
     if (id == CSS_VAL_INHERIT) {
+        if (num != 1)
+            return false;
         addProperty(propId, new CSSInheritedValue(), important);
         return true;
     }
     else if (id == CSS_VAL_INITIAL) {
+        if (num != 1)
+            return false;
         addProperty(propId, new CSSInitialValue(), important);
         return true;
     }
@@ -542,16 +576,18 @@ bool CSSParser::parseValue(int propId, bool important)
     case CSS_PROP_BORDER_SPACING: {
         const int properties[2] = { CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING,
                                     CSS_PROP__KHTML_BORDER_VERTICAL_SPACING };
-        int num = valueList->size();
         if (num == 1) {
-            if (!parseValue(properties[0], important)) return false;
+            ShorthandScope scope(this, CSS_PROP_BORDER_SPACING);
+            if (!parseValue(properties[0], important))
+                return false;
             CSSValue* value = parsedProperties[numParsedProperties-1]->value();
             addProperty(properties[1], value, important);
             return true;
         }
         else if (num == 2) {
-            if (!parseValue(properties[0], important)) return false;
-            if (!parseValue(properties[1], important)) return false;
+            ShorthandScope scope(this, CSS_PROP_BORDER_SPACING);
+            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
+                return false;
             return true;
         }
         return false;
@@ -678,7 +714,7 @@ bool CSSParser::parseValue(int propId, bool important)
         break;
 
     case CSS_PROP__KHTML_FONT_SIZE_DELTA:           // <length>
-           valid_primitive = validUnit(value, FLength, strict);
+        valid_primitive = validUnit(value, FLength, strict);
         break;
 
     case CSS_PROP__KHTML_NBSP_MODE:     // normal | space
@@ -881,7 +917,6 @@ bool CSSParser::parseValue(int propId, bool important)
     case CSS_PROP_BORDER_BOTTOM_LEFT_RADIUS:
     case CSS_PROP_BORDER_BOTTOM_RIGHT_RADIUS:
     case CSS_PROP_BORDER_RADIUS: {
-        int num = valueList->size();
         if (num != 1 && num != 2)
             return false;
         valid_primitive = validUnit(value, FLength, strict);
@@ -1011,16 +1046,18 @@ bool CSSParser::parseValue(int propId, bool important)
     case CSS_PROP__KHTML_MARGIN_COLLAPSE: {
         const int properties[2] = { CSS_PROP__KHTML_MARGIN_TOP_COLLAPSE,
             CSS_PROP__KHTML_MARGIN_BOTTOM_COLLAPSE };
-        int num = valueList->size();
         if (num == 1) {
-            if (!parseValue(properties[0], important)) return false;
+            ShorthandScope scope(this, CSS_PROP__KHTML_MARGIN_COLLAPSE);
+            if (!parseValue(properties[0], important))
+                return false;
             CSSValue* value = parsedProperties[numParsedProperties-1]->value();
             addProperty(properties[1], value, important);
             return true;
         }
         else if (num == 2) {
-            if (!parseValue(properties[0], important)) return false;
-            if (!parseValue(properties[1], important)) return false;
+            ShorthandScope scope(this, CSS_PROP__KHTML_MARGIN_COLLAPSE);
+            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
+                return false;
             return true;
         }
         return false;
@@ -1186,8 +1223,11 @@ bool CSSParser::parseValue(int propId, bool important)
         valueList->next();
     }
     if (parsedValue) {
-        addProperty(propId, parsedValue, important);
-        return true;
+        if (!valueList->current() || inShorthand()) {
+            addProperty(propId, parsedValue, important);
+            return true;
+        }
+        delete parsedValue;
     }
     return false;
 }
@@ -1218,7 +1258,7 @@ bool CSSParser::parseBackgroundShorthand(bool important)
         CSS_PROP_BACKGROUND_ATTACHMENT, CSS_PROP_BACKGROUND_POSITION, CSS_PROP_BACKGROUND_CLIP,
         CSS_PROP_BACKGROUND_ORIGIN, CSS_PROP_BACKGROUND_COLOR };
     
-    enterShorthand(CSS_PROP_BACKGROUND);
+    ShorthandScope scope(this, CSS_PROP_BACKGROUND);
 
     bool parsedProperty[numProperties] = { false }; // compiler will repeat false as necessary
     CSSValue* values[numProperties] = { 0 }; // compiler will repeat 0 as necessary
@@ -1286,11 +1326,9 @@ bool CSSParser::parseBackgroundShorthand(bool important)
             addProperty(properties[i], values[i], important);
     }
     
-    exitShorthand();
     return true;
 
 fail:
-    exitShorthand();
     for (int k = 0; k < numProperties; k++)
         delete values[k];
     delete positionYValue;
@@ -1302,7 +1340,7 @@ bool CSSParser::parseShorthand(int propId, const int *properties, int numPropert
     // We try to match as many properties as possible
     // We set up an array of booleans to mark which property has been found,
     // and we try to search for properties until it makes no longer any sense.
-    enterShorthand(propId);
+    ShorthandScope scope(this, propId);
 
     bool found = false;
     bool fnd[6]; // Trust me ;)
@@ -1320,10 +1358,8 @@ bool CSSParser::parseShorthand(int propId, const int *properties, int numPropert
 
         // if we didn't find at least one match, this is an
         // invalid shorthand and we have to ignore it
-        if (!found) {
-            exitShorthand();
+        if (!found)
             return false;
-        }
     }
     
     // Fill in any remaining properties with the initial value.
@@ -1334,7 +1370,6 @@ bool CSSParser::parseShorthand(int propId, const int *properties, int numPropert
     }
     m_implicitShorthand = false;
 
-    exitShorthand();
     return true;
 }
 
@@ -1350,15 +1385,13 @@ bool CSSParser::parse4Values(int propId, const int *properties,  bool important)
     
     int num = inShorthand() ? 1 : valueList->size();
     
-    enterShorthand(propId);
+    ShorthandScope scope(this, propId);
 
     // the order is top, right, bottom, left
     switch (num) {
         case 1: {
-            if (!parseValue(properties[0], important)) {
-                exitShorthand();
+            if (!parseValue(properties[0], important))
                 return false;
-            }
             CSSValue *value = parsedProperties[numParsedProperties-1]->value();
             m_implicitShorthand = true;
             addProperty(properties[1], value, important);
@@ -1368,10 +1401,8 @@ bool CSSParser::parse4Values(int propId, const int *properties,  bool important)
             break;
         }
         case 2: {
-            if (!parseValue(properties[0], important) || !parseValue(properties[1], important)) {
-                exitShorthand();
+            if (!parseValue(properties[0], important) || !parseValue(properties[1], important))
                 return false;
-            }
             CSSValue *value = parsedProperties[numParsedProperties-2]->value();
             m_implicitShorthand = true;
             addProperty(properties[2], value, important);
@@ -1381,11 +1412,8 @@ bool CSSParser::parse4Values(int propId, const int *properties,  bool important)
             break;
         }
         case 3: {
-            if (!parseValue(properties[0], important) || !parseValue(properties[1], important) ||
-                !parseValue(properties[2], important)) {
-                exitShorthand();
+            if (!parseValue(properties[0], important) || !parseValue(properties[1], important) || !parseValue(properties[2], important))
                 return false;
-            }
             CSSValue *value = parsedProperties[numParsedProperties-2]->value();
             m_implicitShorthand = true;
             addProperty(properties[3], value, important);
@@ -1394,19 +1422,15 @@ bool CSSParser::parse4Values(int propId, const int *properties,  bool important)
         }
         case 4: {
             if (!parseValue(properties[0], important) || !parseValue(properties[1], important) ||
-                !parseValue(properties[2], important) || !parseValue(properties[3], important)) {
-                exitShorthand();
+                !parseValue(properties[2], important) || !parseValue(properties[3], important))
                 return false;
-            }
             break;
         }
         default: {
-            exitShorthand();
             return false;
         }
     }
     
-    exitShorthand();
     return true;
 }
 
index 5d9e1d6475362cc678476dcbf020f89a58503254..5cf2ba146ed1316d578d052e8183b1664a4d4034 100644 (file)
@@ -123,6 +123,7 @@ namespace WebCore {
         Document* document() const;
 
         void addProperty(int propId, CSSValue*, bool important);
+        void rollbackLastProperties(int num);
         bool hasProperties() const { return numParsedProperties > 0; }
 
         bool parseValue(int propId, bool important);
@@ -212,16 +213,7 @@ namespace WebCore {
         void clearProperties();
 
         void setupParser(const char* prefix, const String&, const char* suffix);
-        void enterShorthand(int propId)
-        {
-            if (!(m_inParseShorthand++))
-                m_currentShorthand = propId;
-        }
-        void exitShorthand()
-        {
-            if (!(--m_inParseShorthand))
-                m_currentShorthand = 0;
-        }
+
         bool inShorthand() const { return m_inParseShorthand; }
 
         unsigned short* data;