2010-04-27 Yuzo Fujishima <yuzo@google.com>
authoryuzo@google.com <yuzo@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Apr 2010 06:45:35 +0000 (06:45 +0000)
committeryuzo@google.com <yuzo@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Apr 2010 06:45:35 +0000 (06:45 +0000)
        Reviewed by Dimitri Glazkov.

        Enhance CSS parser for Paged Media (Iteration 3)
        Implement size parameter parsing for Paged Media.
        https://bugs.webkit.org/show_bug.cgi?id=35851

        * printing/page-rule-css-text-expected.txt:
        * printing/page-rule-css-text.html:
2010-04-27  Yuzo Fujishima  <yuzo@google.com>

        Reviewed by Dimitri Glazkov.

        Enhance CSS parser for Paged Media (Iteration 3)
        Implement size parameter parsing for Paged Media.
        https://bugs.webkit.org/show_bug.cgi?id=35851

        I believe size property hasn't been used so far because (1) it hasn't been properly parsed and
        (2) a comment in CSSComputedStyleDeclaration::getPropertyCSSValue says so.
        Changing the way of parsing it should not cause any regressions -- no existing tests fail because of this change.

        * css/CSSParser.cpp:
        (WebCore::CSSParser::parseValue):
        (WebCore::CSSParser::parseSize):
        (WebCore::CSSParser::parseSizeParameter):
        * css/CSSParser.h:
        (WebCore::CSSParser::):
        * css/CSSValueKeywords.in:

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

LayoutTests/ChangeLog
LayoutTests/printing/page-rule-css-text-expected.txt
LayoutTests/printing/page-rule-css-text.html
WebCore/ChangeLog
WebCore/css/CSSParser.cpp
WebCore/css/CSSParser.h
WebCore/css/CSSValueKeywords.in

index 841143a..dc4af4c 100644 (file)
@@ -1,5 +1,16 @@
 2010-04-27  Yuzo Fujishima  <yuzo@google.com>
 
+        Reviewed by Dimitri Glazkov.
+
+        Enhance CSS parser for Paged Media (Iteration 3)
+        Implement size parameter parsing for Paged Media.
+        https://bugs.webkit.org/show_bug.cgi?id=35851
+
+        * printing/page-rule-css-text-expected.txt:
+        * printing/page-rule-css-text.html:
+
+2010-04-27  Yuzo Fujishima  <yuzo@google.com>
+
         Reviewed by Eric Seidel.
 
         Enhance CSS parser for Paged Media (Iteration 2)
index bb8bc9b..7748f15 100644 (file)
@@ -5,4 +5,16 @@
 @page hello { color: green; }
 @page world:right { color: red; }
 @media print { @page somepage:first { margin-top: 3cm; margin-right: 3cm; margin-bottom: 3cm; margin-left: 3cm; } }
+@page auto_page { size: auto; }
+@page square_page { size: 4in; }
+@page letter_page { size: letter; }
+@page page_widht_height { size: 10cm 15cm; }
+@page page_size_orientation { size: ledger landscape; }
+@page page_orientation_size { size: a4 portrait; }
+@page err_empty_size { }
+@page err_unknow_page_size { }
+@page err_length_and_page_size { }
+@page err_length_and_orientation { }
+@page err_orientations { }
+@page err_too_many_params { }
 
index 6c5f7d2..9f68d7f 100644 (file)
         margin:3cm;
     }
 }
-/* FIXME: Add the following once size property is implemented.
-
-@page :left {
-    size: 4in 6in;
+@page auto_page {
+    size: auto;
 }
-@page :right {
+@page square_page {
+    size: 4in;
+}
+@page letter_page {
     size: letter;
 }
-*/
+@page page_widht_height {
+    size: 10cm 15cm;
+}
+@page page_size_orientation {
+    size: ledger landscape;
+}
+@page page_orientation_size {
+    size: portrait a4;
+}
+@page err_empty_size {
+    size:;
+}
+@page err_unknow_page_size {
+    size: yotsugiri;
+}
+@page err_length_and_page_size {
+    size: 10cm letter;
+}
+@page err_length_and_orientation {
+    size: 10cm landscape;
+}
+@page err_orientations {
+    size: portrait landscape;
+}
+@page err_too_many_params {
+    size: a5 landscape auto;
+}
+
 /* FIXME: Add the following once margin at-rule is implemented.
 
 @page :first {
index 227667c..dc0c5fd 100644 (file)
@@ -1,5 +1,25 @@
 2010-04-27  Yuzo Fujishima  <yuzo@google.com>
 
+        Reviewed by Dimitri Glazkov.
+
+        Enhance CSS parser for Paged Media (Iteration 3)
+        Implement size parameter parsing for Paged Media.
+        https://bugs.webkit.org/show_bug.cgi?id=35851
+
+        I believe size property hasn't been used so far because (1) it hasn't been properly parsed and
+        (2) a comment in CSSComputedStyleDeclaration::getPropertyCSSValue says so.
+        Changing the way of parsing it should not cause any regressions -- no existing tests fail because of this change.
+
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseValue):
+        (WebCore::CSSParser::parseSize):
+        (WebCore::CSSParser::parseSizeParameter):
+        * css/CSSParser.h:
+        (WebCore::CSSParser::):
+        * css/CSSValueKeywords.in:
+
+2010-04-27  Yuzo Fujishima  <yuzo@google.com>
+
         Reviewed by Eric Seidel.
 
         Enhance CSS parser for Paged Media (Iteration 2)
index 89dd43b..0e5b3ba 100644 (file)
@@ -592,7 +592,9 @@ bool CSSParser::parseValue(int propId, bool important)
          * (see parseAuralValues). As we don't support them at all this seems reasonable.
          */
 
-    case CSSPropertySize:                 // <length>{1,2} | auto | portrait | landscape | inherit
+    case CSSPropertySize:                 // <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ]
+        return parseSize(propId, important);
+
     case CSSPropertyQuotes:               // [<string> <string>]+ | none | inherit
         if (id)
             validPrimitive = true;
@@ -2110,6 +2112,79 @@ bool CSSParser::parse4Values(int propId, const int *properties,  bool important)
     return true;
 }
 
+// <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ]
+bool CSSParser::parseSize(int propId, bool important)
+{
+    ASSERT(propId == CSSPropertySize);
+
+    if (m_valueList->size() > 2)
+        return false;
+
+    CSSParserValue* value = m_valueList->current();
+    if (!value)
+        return false;
+
+    RefPtr<CSSValueList> parsedValues = CSSValueList::createSpaceSeparated();
+
+    // First parameter.
+    SizeParameterType paramType = parseSizeParameter(parsedValues.get(), value, None);
+    if (paramType == None)
+        return false;
+
+    // Second parameter, if any.
+    value = m_valueList->next();
+    if (value) {
+        paramType = parseSizeParameter(parsedValues.get(), value, paramType);
+        if (paramType == None)
+            return false;
+    }
+
+    addProperty(propId, parsedValues.release(), important);
+    return true;
+}
+
+CSSParser::SizeParameterType CSSParser::parseSizeParameter(CSSValueList* parsedValues, CSSParserValue* value, SizeParameterType prevParamType)
+{
+    switch (value->id) {
+    case CSSValueAuto:
+        if (prevParamType == None) {
+            parsedValues->append(CSSPrimitiveValue::createIdentifier(value->id));
+            return Auto;
+        }
+        return None;
+    case CSSValueLandscape:
+    case CSSValuePortrait:
+        if (prevParamType == None || prevParamType == PageSize) {
+            parsedValues->append(CSSPrimitiveValue::createIdentifier(value->id));
+            return Orientation;
+        }
+        return None;
+    case CSSValueA3:
+    case CSSValueA4:
+    case CSSValueA5:
+    case CSSValueB4:
+    case CSSValueB5:
+    case CSSValueLedger:
+    case CSSValueLegal:
+    case CSSValueLetter:
+        if (prevParamType == None || prevParamType == Orientation) {
+            // Normalize to Page Size then Orientation order by prepending.
+            // This is not specified by the CSS3 Paged Media specification, but for simpler processing hereafter.
+            parsedValues->prepend(CSSPrimitiveValue::createIdentifier(value->id));
+            return PageSize;
+        }
+        return None;
+    case 0:
+        if (validUnit(value, FLength, m_strict) && (prevParamType == None || prevParamType == Length)) {
+            parsedValues->append(CSSPrimitiveValue::create(value->fValue, static_cast<CSSPrimitiveValue::UnitTypes>(value->unit)));
+            return Length;
+        }
+        return None;
+    default:
+        return None;
+    }
+}
+
 // [ <string> | <uri> | <counter> | attr(X) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
 // in CSS 2.1 this got somewhat reduced:
 // [ <string> | attr(X) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
index a88adc4..812980e 100644 (file)
@@ -252,6 +252,17 @@ namespace WebCore {
 
         void deleteFontFaceOnlyValues();
 
+        enum SizeParameterType {
+            None,
+            Auto,
+            Length,
+            PageSize,
+            Orientation,
+        };
+
+        bool parseSize(int propId, bool important);
+        SizeParameterType parseSizeParameter(CSSValueList* parsedValues, CSSParserValue* value, SizeParameterType prevParamType);
+
         UChar* m_data;
         UChar* yytext;
         UChar* yy_c_buf_p;
index 2e69320..06d966c 100644 (file)
@@ -380,10 +380,15 @@ collapse
 #
 # Unordered rest
 #
+a3
+a4
+a5
 above
 absolute
 always
 avoid
+b4
+b5
 below
 bidi-override
 blink
@@ -398,6 +403,9 @@ hide
 higher
 invert
 landscape
+ledger
+legal
+letter
 level
 line-through
 local