Changeset 59751 in webkit


Ignore:
Timestamp:
May 19, 2010 12:33:28 AM (14 years ago)
Author:
yuzo@google.com
Message:

2010-05-18 Yuzo Fujishima <yuzo@google.com>

Reviewed by Shinichiro Hamaji.

Make CSS Parser properly handle only-for-pages pseudo-classes.

https://bugs.webkit.org/show_bug.cgi?id=38731

  • fast/css/misplaced-paged-media-pseudo-expected.txt: Removed.
  • fast/css/misplaced-paged-media-pseudo.html: Removed.
  • printing/page-rule-css-text-expected.txt:
  • printing/page-rule-css-text.html:
  • printing/pseudo-class-outside-page-expected.txt:
  • printing/pseudo-class-outside-page.html:

2010-05-18 Yuzo Fujishima <yuzo@google.com>

Reviewed by Shinichiro Hamaji.

Make CSS Parser properly handle only-for-pages pseudo-classes.

A new Match category, PagePseudoClass, is introduced to distinguish
only-for-pages pseudo-classes from others. A new symbol, pseudo_page,
is introduced to handle them separately.

https://bugs.webkit.org/show_bug.cgi?id=38731

  • css/CSSGrammar.y:
  • css/CSSParser.cpp: (WebCore::CSSParser::createMarginAtRule):
  • css/CSSParser.h:
  • css/CSSSelector.cpp: (WebCore::CSSSelector::extractPseudoType): (WebCore::CSSSelector::selectorText):
  • css/CSSSelector.h: (WebCore::CSSSelector::):
  • css/CSSStyleSelector.cpp: (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector):
Location:
trunk
Files:
2 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r59748 r59751  
     12010-05-18  Yuzo Fujishima  <yuzo@google.com>
     2
     3        Reviewed by Shinichiro Hamaji.
     4
     5        Make CSS Parser properly handle only-for-pages pseudo-classes.
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=38731
     8
     9        * fast/css/misplaced-paged-media-pseudo-expected.txt: Removed.
     10        * fast/css/misplaced-paged-media-pseudo.html: Removed.
     11        * printing/page-rule-css-text-expected.txt:
     12        * printing/page-rule-css-text.html:
     13        * printing/pseudo-class-outside-page-expected.txt:
     14        * printing/pseudo-class-outside-page.html:
     15
    1162010-05-18  Alejandro G. Castro  <alex@igalia.com>
    217
  • trunk/LayoutTests/printing/page-rule-css-text-expected.txt

    r58922 r59751  
    11@page { margin-top: 5cm; margin-bottom: 10cm; }
     2@page :left { margin-right: 3cm; }
     3@page :right { margin-left: 3cm; }
     4@page :first { border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; }
    25@page hello { color: green; }
     6@page world:right { background-color: green; }
     7@media print { @page somepage:first { margin-top: 3cm; margin-right: 3cm; margin-bottom: 3cm; margin-left: 3cm; } }
    38@page auto_page { size: auto; }
    49@page square_page { size: 4in; }
  • trunk/LayoutTests/printing/page-rule-css-text.html

    r58385 r59751  
    33<head>
    44<style type="text/css">
     5@page :visited { /* :visited is invalid for @page */
     6    color: red;
     7}
     8@page a_page_name:visited { /* :visited is invalid for @page */
     9    background-color: red;
     10}
     11
    512@page {
    613    margin-top:5cm;
     
    2027}
    2128@page world:right {
    22     color:red;
     29    background-color:green;
    2330}
    2431@media print {
  • trunk/LayoutTests/printing/pseudo-class-outside-page-expected.txt

    r58578 r59751  
    11Test case for SHOULD NEVER BE REACHED assertion loading forbes.com. Paged media related pseudo-classes should be ignored outside of @page.
    22
    3 You should see a green box.
     3You should see a green box for Test 1, "Test n: PASS" for the rest.
    44
     5Test 2: PASS
     6Test 3: PASS
     7Test 4: PASS
     8Test 5: PASS
     9Test 6: PASS
     10Test 7: PASS
     11Test 8: PASS
     12Test 9: PASS
     13Test 10: PASS
     14Test 11: PASS
     15Test 12: PASS
     16Test 13: PASS
    517PASS
  • trunk/LayoutTests/printing/pseudo-class-outside-page.html

    r58578 r59751  
    77        background-color: green;
    88    }
    9     #test {
     9    #test1 {
    1010        width: 100px;
    1111        height: 100px;
    1212        background-color: green;
    1313    }
     14    .exception_test {
     15        color: red;
     16    }
    1417    /* These selectors should be ignored */
    15     #test:first {
     18    #test1:first {
    1619        background-color: red;
    1720    }
    18     #test:left {
     21    #test1:left {
    1922        background-color: red;
    2023    }
    21     #test:right {
     24    #test1:right {
    2225        background-color: red;
    2326    }
     
    3033    {
    3134        var expected = getComputedStyle(document.getElementById("green"), null).backgroundColor;
    32         var actual = getComputedStyle(document.getElementById("test"), null).backgroundColor;
     35        var actual = getComputedStyle(document.getElementById("test1"), null).backgroundColor;
    3336        var result = "PASS";
    3437        if (actual != expected)
    3538            result = "Expected " + expected + ", but comes " + actual;
    3639        document.getElementById("result").innerHTML = result;
     40
     41        var invalidSelectors = [":first", ":left", ":right", "::first", "::left", "::right",
     42                                ".login-popup:first", ".login-popup:left", ".login-popup:right", ".login-popup::first", ".login-popup::left", ".login-popup::right"];
     43        for (var testId = 2; testId <= 13; testId++) {
     44            var element = document.getElementById("test" + testId);
     45            var invalidSelector = invalidSelectors[testId - 2];
     46            try {
     47                document.querySelectorAll(invalidSelector);
     48                element.innerHTML = "Test " + testId + ": FAIL";
     49            } catch (e) {
     50                element.innerHTML = "Test " + testId + ": PASS";
     51                element.style.color = "green";
     52            }
     53        }
    3754    }
    3855</script>
     
    4562
    4663<p>
    47 You should see a green box.
     64You should see a green box for Test 1, "Test n: PASS" for the rest.
    4865
    4966<div id="green"></div>
    50 <div id="test"></div>
     67<div id="test1"></div>
     68<div id="test2" class="exception_test">Test 2: Didn't run</div>
     69<div id="test3" class="exception_test">Test 3: Didn't run</div>
     70<div id="test4" class="exception_test">Test 4: Didn't run</div>
     71<div id="test5" class="exception_test">Test 5: Didn't run</div>
     72<div id="test6" class="exception_test">Test 6: Didn't run</div>
     73<div id="test7" class="exception_test">Test 7: Didn't run</div>
     74<div id="test8" class="exception_test">Test 8: Didn't run</div>
     75<div id="test9" class="exception_test">Test 9: Didn't run</div>
     76<div id="test10" class="exception_test">Test 10: Didn't run</div>
     77<div id="test11" class="exception_test">Test 11: Didn't run</div>
     78<div id="test12" class="exception_test">Test 12: Didn't run</div>
     79<div id="test13" class="exception_test">Test 13: Didn't run</div>
    5180<div id="result"></div>
    5281
  • trunk/WebCore/ChangeLog

    r59750 r59751  
     12010-05-18  Yuzo Fujishima  <yuzo@google.com>
     2
     3        Reviewed by Shinichiro Hamaji.
     4
     5        Make CSS Parser properly handle only-for-pages pseudo-classes.
     6
     7        A new Match category, PagePseudoClass, is introduced to distinguish
     8        only-for-pages pseudo-classes from others. A new symbol, pseudo_page,
     9        is introduced to handle them separately.
     10
     11        https://bugs.webkit.org/show_bug.cgi?id=38731
     12
     13        * css/CSSGrammar.y:
     14        * css/CSSParser.cpp:
     15        (WebCore::CSSParser::createMarginAtRule):
     16        * css/CSSParser.h:
     17        * css/CSSSelector.cpp:
     18        (WebCore::CSSSelector::extractPseudoType):
     19        (WebCore::CSSSelector::selectorText):
     20        * css/CSSSelector.h:
     21        (WebCore::CSSSelector::):
     22        * css/CSSStyleSelector.cpp:
     23        (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector):
     24
    1252010-05-19  Adam Barth  <abarth@webkit.org>
    226
  • trunk/WebCore/css/CSSGrammar.y

    r58374 r59751  
    258258%type <selector> attrib
    259259%type <selector> pseudo
     260%type <selector> pseudo_page
    260261%type <selector> page_selector
    261262
     
    756757    '{' maybe_space declarations_and_margins closing_brace {
    757758        CSSParser* p = static_cast<CSSParser*>(parser);
    758         $$ = p->createPageRule(p->sinkFloatingSelector($3));
     759        if ($3)
     760            $$ = p->createPageRule(p->sinkFloatingSelector($3));
     761        else {
     762            // Clear properties in the invalid @page rule.
     763            p->clearProperties();
     764            // Also clear margin at-rules here once we fully implement margin at-rules parsing.
     765            $$ = 0;
     766        }
    759767    }
    760768    | PAGE_SYM error invalid_block {
     
    772780        $$->m_tag = QualifiedName(nullAtom, $1, p->m_defaultNamespace);
    773781    }
    774     | IDENT pseudo {
     782    | IDENT pseudo_page {
    775783        CSSParser* p = static_cast<CSSParser*>(parser);
    776784        $$ = $2;
     
    778786            $$->m_tag = QualifiedName(nullAtom, $1, p->m_defaultNamespace);
    779787    }
    780     | pseudo {
     788    | pseudo_page {
    781789        $$ = $1;
    782790    }
     
    11671175  | STRING
    11681176    ;
     1177
     1178pseudo_page:
     1179    ':' IDENT {
     1180        $$ = static_cast<CSSParser*>(parser)->createFloatingSelector();
     1181        $$->m_match = CSSSelector::PagePseudoClass;
     1182        $2.lower();
     1183        $$->m_value = $2;
     1184        CSSSelector::PseudoType type = $$->pseudoType();
     1185        if (type == CSSSelector::PseudoUnknown)
     1186            $$ = 0;
     1187    }
    11691188
    11701189pseudo:
  • trunk/WebCore/css/CSSParser.cpp

    r59473 r59751  
    53475347    //        - marginBox: margin box
    53485348    //        - m_parsedProperties: properties at [m_numParsedPropertiesBeforeMarginBox, m_numParsedProperties) are for this at-rule.
     5349    // Don't forget to also update the action for page symbol in CSSGrammar.y such that margin at-rule data is cleared if page_selector is invalid.
    53495350
    53505351    endDeclarationsForMarginBox();
  • trunk/WebCore/css/CSSParser.h

    r58867 r59751  
    210210        void updateLastSelectorLine() { m_lastSelectorLine = m_line; }
    211211
     212        void clearProperties();
     213
    212214        bool m_strict;
    213215        bool m_important;
     
    246248        void recheckAtKeyword(const UChar* str, int len);
    247249   
    248         void clearProperties();
    249 
    250250        void setupParser(const char* prefix, const String&, const char* suffix);
    251251
  • trunk/WebCore/css/CSSSelector.cpp

    r58922 r59751  
    425425void CSSSelector::extractPseudoType() const
    426426{
    427     if (m_match != PseudoClass && m_match != PseudoElement)
     427    if (m_match != PseudoClass && m_match != PseudoElement && m_match != PagePseudoClass)
    428428        return;
    429429
     
    432432    bool element = false; // pseudo-element
    433433    bool compat = false; // single colon compatbility mode
     434    bool isPagePseudoClass = false; // Page pseudo-class
    434435
    435436    switch (m_pseudoType) {
     
    530531    case PseudoLeftPage:
    531532    case PseudoRightPage:
    532         // FIXME: These should only be allowed in @page rules. Disabled them altogether until that's implemented correctly.
     533        isPagePseudoClass = true;
     534        break;
     535    }
     536
     537    bool matchPagePseudoClass = (m_match == PagePseudoClass);
     538    if (matchPagePseudoClass != isPagePseudoClass)
    533539        m_pseudoType = PseudoUnknown;
    534         return;
    535     }
    536 
    537     if (m_match == PseudoClass && element) {
     540    else if (m_match == PseudoClass && element) {
    538541        if (!compat)
    539542            m_pseudoType = PseudoUnknown;
     
    587590            str += ".";
    588591            str += cs->m_value;
    589         } else if (cs->m_match == CSSSelector::PseudoClass) {
     592        } else if (cs->m_match == CSSSelector::PseudoClass || cs->m_match == CSSSelector::PagePseudoClass) {
    590593            str += ":";
    591594            str += cs->m_value;
  • trunk/WebCore/css/CSSSelector.h

    r59197 r59751  
    8686            PseudoClass,
    8787            PseudoElement,
    88             Contain,   // css3: E[foo*="bar"]
    89             Begin,     // css3: E[foo^="bar"]
    90             End        // css3: E[foo$="bar"]
     88            Contain, // css3: E[foo*="bar"]
     89            Begin, // css3: E[foo^="bar"]
     90            End, // css3: E[foo$="bar"]
     91            PagePseudoClass
    9192        };
    9293
  • trunk/WebCore/css/CSSStyleSelector.cpp

    r59724 r59751  
    25692569                return true;
    25702570            }
    2571             case CSSSelector::PseudoLeftPage:
    2572             case CSSSelector::PseudoRightPage:
    2573             case CSSSelector::PseudoFirstPage:
    2574                 // Page media related pseudo-classes are not handled yet.
    2575                 return false;
    25762571            case CSSSelector::PseudoUnknown:
    25772572            case CSSSelector::PseudoNotParsed:
Note: See TracChangeset for help on using the changeset viewer.