Changeset 81849 in webkit
- Timestamp:
- Mar 23, 2011 8:18:35 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 9 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r81848 r81849 1 2011-03-23 Mike Lawther <mikelawther@chromium.org> 2 3 Reviewed by Ojan Vafai. 4 5 flex/bison tokens and grammar for CSS calc 6 https://bugs.webkit.org/show_bug.cgi?id=54412 7 8 Only the 'errors' tests pass as ultimately intended right now. As of this 9 patch, none of the actual calculations are expected to work, since only 10 the lexing/grammar stage is present. 11 12 * css3/calc/calc-errors-expected.txt: Added. 13 * css3/calc/calc-errors.html: Added. 14 * css3/calc/minmax-errors-expected.txt: Added. 15 * css3/calc/minmax-errors.html: Added. 16 * css3/calc/simple-calcs-expected.txt: Added. 17 * css3/calc/simple-calcs.html: Added. 18 * css3/calc/simple-minmax-expected.txt: Added. 19 * css3/calc/simple-minmax.html: Added. 20 1 21 2011-03-23 Adam Klein <adamk@chromium.org> 2 22 -
trunk/Source/WebCore/ChangeLog
r81848 r81849 1 2011-03-23 Mike Lawther <mikelawther@chromium.org> 2 3 Reviewed by Ojan Vafai. 4 5 flex/bison tokens and grammar for CSS calc 6 https://bugs.webkit.org/show_bug.cgi?id=54412 7 8 Tests: css3/calc/calc-errors.html 9 css3/calc/minmax-errors.html 10 css3/calc/simple-calcs.html 11 css3/calc/simple-minmax.html 12 13 * css/CSSGrammar.y: 14 * css/CSSParserValues.cpp: 15 (WebCore::CSSParserValueList::insertValueAt): 16 (WebCore::CSSParserValueList::extend): 17 * css/CSSParserValues.h: 18 * css/tokenizer.flex: 19 1 20 2011-03-23 Adam Klein <adamk@chromium.org> 2 21 -
trunk/Source/WebCore/css/CSSGrammar.y
r81845 r81849 100 100 %} 101 101 102 %expect 5 1102 %expect 55 103 103 104 104 %nonassoc LOWEST_PREC … … 184 184 %token <number> KHERTZ 185 185 %token <string> DIMEN 186 %token <string> INVALIDDIMEN 186 187 %token <number> PERCENTAGE 187 188 %token <number> FLOATTOKEN … … 192 193 %token <string> ANYFUNCTION 193 194 %token <string> NOTFUNCTION 195 %token <string> CALCFUNCTION 196 %token <string> MINFUNCTION 197 %token <string> MAXFUNCTION 194 198 195 199 %token <string> UNICODERANGE … … 273 277 %type <value> unary_term 274 278 %type <value> function 279 %type <value> calc_func_term 280 %type <character> calc_func_operator 281 %type <valueList> calc_func_expr 282 %type <valueList> calc_func_expr_list 283 %type <valueList> calc_func_paren_expr 284 %type <value> calc_function 285 %type <string> min_or_max 286 %type <value> min_or_max_function 275 287 276 288 %type <string> element_name … … 1407 1419 /* FIXME: according to the specs a function can have a unary_operator in front. I know no case where this makes sense */ 1408 1420 | function { 1421 $$ = $1; 1422 } 1423 | calc_function { 1424 $$ = $1; 1425 } 1426 | min_or_max_function { 1409 1427 $$ = $1; 1410 1428 } … … 1465 1483 } 1466 1484 ; 1485 1486 calc_func_term: 1487 unary_term { $$ = $1; } 1488 | unary_operator unary_term { $$ = $2; $$.fValue *= $1; } 1489 ; 1490 1491 calc_func_operator: 1492 '+' WHITESPACE { 1493 $$ = '+'; 1494 } 1495 | '-' WHITESPACE { 1496 $$ = '-'; 1497 } 1498 | '*' maybe_space { 1499 $$ = '*'; 1500 } 1501 | '/' maybe_space { 1502 $$ = '/'; 1503 } 1504 | IDENT maybe_space { 1505 if (equalIgnoringCase("mod", $1.characters, $1.length)) 1506 $$ = '%'; 1507 else 1508 $$ = 0; 1509 } 1510 ; 1511 1512 calc_func_paren_expr: 1513 '(' maybe_space calc_func_expr maybe_space ')' maybe_space { 1514 if ($3) { 1515 $$ = $3; 1516 CSSParserValue v; 1517 v.id = 0; 1518 v.unit = CSSParserValue::Operator; 1519 v.iValue = '('; 1520 $$->insertValueAt(0, v); 1521 v.iValue = ')'; 1522 $$->addValue(v); 1523 } 1524 } 1525 1526 calc_func_expr: 1527 calc_func_term maybe_space { 1528 CSSParser* p = static_cast<CSSParser*>(parser); 1529 $$ = p->createFloatingValueList(); 1530 $$->addValue(p->sinkFloatingValue($1)); 1531 } 1532 | calc_func_expr calc_func_operator calc_func_term { 1533 CSSParser* p = static_cast<CSSParser*>(parser); 1534 if ($1 && $2) { 1535 $$ = $1; 1536 CSSParserValue v; 1537 v.id = 0; 1538 v.unit = CSSParserValue::Operator; 1539 v.iValue = $2; 1540 $$->addValue(v); 1541 $$->addValue(p->sinkFloatingValue($3)); 1542 } else 1543 $$ = 0; 1544 1545 } 1546 | calc_func_expr calc_func_operator calc_func_paren_expr { 1547 if ($1 && $2 && $3) { 1548 $$ = $1; 1549 CSSParserValue v; 1550 v.id = 0; 1551 v.unit = CSSParserValue::Operator; 1552 v.iValue = $2; 1553 $$->addValue(v); 1554 $$->extend(*($3)); 1555 } else 1556 $$ = 0; 1557 } 1558 | calc_func_paren_expr 1559 | calc_func_expr error { 1560 $$ = 0; 1561 } 1562 ; 1563 1564 calc_func_expr_list: 1565 calc_func_expr { 1566 $$ = $1; 1567 } 1568 | calc_func_expr_list ',' maybe_space calc_func_expr { 1569 if ($1 && $4) { 1570 $$ = $1; 1571 CSSParserValue v; 1572 v.id = 0; 1573 v.unit = CSSParserValue::Operator; 1574 v.iValue = ','; 1575 $$->addValue(v); 1576 $$->extend(*($4)); 1577 } else 1578 $$ = 0; 1579 } 1580 1581 1582 calc_function: 1583 CALCFUNCTION maybe_space calc_func_expr ')' maybe_space { 1584 CSSParser* p = static_cast<CSSParser*>(parser); 1585 CSSParserFunction* f = p->createFloatingFunction(); 1586 f->name = $1; 1587 f->args = p->sinkFloatingValueList($3); 1588 $$.id = 0; 1589 $$.unit = CSSParserValue::Function; 1590 $$.function = f; 1591 } 1592 | CALCFUNCTION maybe_space error { 1593 YYERROR; 1594 } 1595 ; 1596 1597 1598 min_or_max: 1599 MINFUNCTION { 1600 $$ = $1; 1601 } 1602 | MAXFUNCTION { 1603 $$ = $1; 1604 } 1605 ; 1606 1607 min_or_max_function: 1608 min_or_max maybe_space calc_func_expr_list ')' maybe_space { 1609 CSSParser* p = static_cast<CSSParser*>(parser); 1610 CSSParserFunction* f = p->createFloatingFunction(); 1611 f->name = $1; 1612 f->args = p->sinkFloatingValueList($3); 1613 $$.id = 0; 1614 $$.unit = CSSParserValue::Function; 1615 $$.function = f; 1616 } 1617 | min_or_max maybe_space error { 1618 YYERROR; 1619 } 1620 ; 1621 1467 1622 /* 1468 1623 * There is a constraint on the color that it must -
trunk/Source/WebCore/css/CSSParserValues.cpp
r81742 r81849 45 45 m_values.append(v); 46 46 } 47 47 48 void CSSParserValueList::insertValueAt(unsigned i, const CSSParserValue& v) 49 { 50 m_values.insert(i, v); 51 } 52 48 53 void CSSParserValueList::deleteValueAt(unsigned i) 49 54 { 50 55 m_values.remove(i); 56 } 57 58 void CSSParserValueList::extend(CSSParserValueList& valueList) 59 { 60 for (unsigned int i = 0; i < valueList.size(); ++i) 61 m_values.append(*(valueList.valueAt(i))); 51 62 } 52 63 -
trunk/Source/WebCore/css/CSSParserValues.h
r81845 r81849 72 72 73 73 void addValue(const CSSParserValue&); 74 void insertValueAt(unsigned, const CSSParserValue&); 74 75 void deleteValueAt(unsigned); 76 void extend(CSSParserValueList&); 75 77 76 78 unsigned size() const { return m_values.size(); } -
trunk/Source/WebCore/css/tokenizer.flex
r81742 r81849 103 103 {num}kHz {yyTok = KHERTZ; return yyTok;} 104 104 {num}{ident} {yyTok = DIMEN; return yyTok;} 105 {num}{ident}\+ {yyTok = INVALIDDIMEN; return yyTok;} 105 106 {num}%+ {yyTok = PERCENTAGE; return yyTok;} 106 107 {intnum} {yyTok = INTEGER; return yyTok;} … … 111 112 "url("{w}{string}{w}")" {yyTok = URI; return yyTok;} 112 113 "url("{w}{url}{w}")" {yyTok = URI; return yyTok;} 114 "-webkit-calc(" {yyTok = CALCFUNCTION; return yyTok;} 115 "-webkit-min(" {yyTok = MINFUNCTION; return yyTok;} 116 "-webkit-max(" {yyTok = MAXFUNCTION; return yyTok;} 113 117 {ident}"(" {yyTok = FUNCTION; return yyTok;} 114 118
Note: See TracChangeset
for help on using the changeset viewer.