| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright (C) 2003 Lars Knoll (knoll@kde.org) |     2  * Copyright (C) 2003 Lars Knoll (knoll@kde.org) | 
|     3  * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |     3  * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 
|     4  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
       All rights reserved. |     4  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
       All rights reserved. | 
|     5  * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |     5  * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> | 
|     6  * Copyright (C) 2008 Eric Seidel <eric@webkit.org> |     6  * Copyright (C) 2008 Eric Seidel <eric@webkit.org> | 
|     7  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
      bile.com/) |     7  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
      bile.com/) | 
|     8  * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. |     8  * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. | 
|     9  * Copyright (C) 2012 Intel Corporation. All rights reserved. |     9  * Copyright (C) 2012 Intel Corporation. All rights reserved. | 
|    10  * |    10  * | 
|    11  * This library is free software; you can redistribute it and/or |    11  * This library is free software; you can redistribute it and/or | 
|    12  * modify it under the terms of the GNU Library General Public |    12  * modify it under the terms of the GNU Library General Public | 
|    13  * License as published by the Free Software Foundation; either |    13  * License as published by the Free Software Foundation; either | 
|    14  * version 2 of the License, or (at your option) any later version. |    14  * version 2 of the License, or (at your option) any later version. | 
|    15  * |    15  * | 
|    16  * This library is distributed in the hope that it will be useful, |    16  * This library is distributed in the hope that it will be useful, | 
|    17  * but WITHOUT ANY WARRANTY; without even the implied warranty of |    17  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|    18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU |    18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|    19  * Library General Public License for more details. |    19  * Library General Public License for more details. | 
|    20  * |    20  * | 
|    21  * You should have received a copy of the GNU Library General Public License |    21  * You should have received a copy of the GNU Library General Public License | 
|    22  * along with this library; see the file COPYING.LIB.  If not, write to |    22  * along with this library; see the file COPYING.LIB.  If not, write to | 
|    23  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |    23  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 
|    24  * Boston, MA 02110-1301, USA. |    24  * Boston, MA 02110-1301, USA. | 
|    25  */ |    25  */ | 
|    26  |    26  | 
|    27 #include "core/css/parser/CSSPropertyParser.h" |    27 #include "core/css/parser/CSSPropertyParser.h" | 
|    28  |    28  | 
|    29 #include "core/StylePropertyShorthand.h" |    29 #include "core/StylePropertyShorthand.h" | 
|    30 #include "core/css/CSSBasicShapeValues.h" |  | 
|    31 #include "core/css/CSSBorderImage.h" |    30 #include "core/css/CSSBorderImage.h" | 
|    32 #include "core/css/CSSContentDistributionValue.h" |    31 #include "core/css/CSSContentDistributionValue.h" | 
|    33 #include "core/css/CSSCrossfadeValue.h" |    32 #include "core/css/CSSCrossfadeValue.h" | 
|    34 #include "core/css/CSSCustomIdentValue.h" |    33 #include "core/css/CSSCustomIdentValue.h" | 
|    35 #include "core/css/CSSFunctionValue.h" |    34 #include "core/css/CSSFunctionValue.h" | 
|    36 #include "core/css/CSSGridLineNamesValue.h" |    35 #include "core/css/CSSGridLineNamesValue.h" | 
|    37 #include "core/css/CSSImageSetValue.h" |    36 #include "core/css/CSSImageSetValue.h" | 
|    38 #include "core/css/CSSPrimitiveValueMappings.h" |    37 #include "core/css/CSSPrimitiveValueMappings.h" | 
|    39 #include "core/css/CSSProperty.h" |    38 #include "core/css/CSSProperty.h" | 
|    40 #include "core/css/CSSPropertyMetadata.h" |    39 #include "core/css/CSSPropertyMetadata.h" | 
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   440     case CSSPropertyGridRowStart: |   439     case CSSPropertyGridRowStart: | 
|   441         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |   440         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | 
|   442         parsedValue = parseGridPosition(); |   441         parsedValue = parseGridPosition(); | 
|   443         break; |   442         break; | 
|   444  |   443  | 
|   445     case CSSPropertyGridTemplateAreas: |   444     case CSSPropertyGridTemplateAreas: | 
|   446         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |   445         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | 
|   447         parsedValue = parseGridTemplateAreas(); |   446         parsedValue = parseGridTemplateAreas(); | 
|   448         break; |   447         break; | 
|   449  |   448  | 
|   450     case CSSPropertyWebkitClipPath: |  | 
|   451         if (id == CSSValueNone) { |  | 
|   452             validPrimitive = true; |  | 
|   453         } else if (value->m_unit == CSSParserValue::Function) { |  | 
|   454             parsedValue = parseBasicShape(); |  | 
|   455         } else if (value->m_unit == CSSParserValue::URI) { |  | 
|   456             // TODO(timloh): This will allow trailing junk |  | 
|   457             return CSSURIValue::create(value->string); |  | 
|   458         } |  | 
|   459         break; |  | 
|   460     case CSSPropertyShapeOutside: |  | 
|   461         if (id == CSSValueNone) |  | 
|   462             validPrimitive = true; |  | 
|   463         else |  | 
|   464             parsedValue = parseShapeProperty(propId); |  | 
|   465         break; |  | 
|   466  |  | 
|   467     case CSSPropertyAlignContent: |   449     case CSSPropertyAlignContent: | 
|   468         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |   450         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | 
|   469         parsedValue = parseContentDistributionOverflowPosition(); |   451         parsedValue = parseContentDistributionOverflowPosition(); | 
|   470         break; |   452         break; | 
|   471  |   453  | 
|   472     case CSSPropertyAlignSelf: |   454     case CSSPropertyAlignSelf: | 
|   473         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); |   455         ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); | 
|   474         parsedValue = parseItemPositionOverflowPosition(); |   456         parsedValue = parseItemPositionOverflowPosition(); | 
|   475         break; |   457         break; | 
|   476  |   458  | 
| (...skipping 1701 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2178         default: |  2160         default: | 
|  2179             return parsedValues; |  2161             return parsedValues; | 
|  2180         } |  2162         } | 
|  2181         parsedValues->append(cssValuePool().createIdentifierValue(value->id)); |  2163         parsedValues->append(cssValuePool().createIdentifierValue(value->id)); | 
|  2182         list.next(); |  2164         list.next(); | 
|  2183     } |  2165     } | 
|  2184  |  2166  | 
|  2185     return parsedValues; |  2167     return parsedValues; | 
|  2186 } |  2168 } | 
|  2187  |  2169  | 
|  2188 void completeBorderRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4]) |  | 
|  2189 { |  | 
|  2190     if (radii[3]) |  | 
|  2191         return; |  | 
|  2192     if (!radii[2]) { |  | 
|  2193         if (!radii[1]) |  | 
|  2194             radii[1] = radii[0]; |  | 
|  2195         radii[2] = radii[0]; |  | 
|  2196     } |  | 
|  2197     radii[3] = radii[1]; |  | 
|  2198 } |  | 
|  2199  |  | 
|  2200 PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseBasicSha
      peInset(CSSParserValueList* args) |  | 
|  2201 { |  | 
|  2202     ASSERT(args); |  | 
|  2203  |  | 
|  2204     RefPtrWillBeRawPtr<CSSBasicShapeInsetValue> shape = CSSBasicShapeInsetValue:
      :create(); |  | 
|  2205  |  | 
|  2206     CSSParserValue* argument = args->current(); |  | 
|  2207     WillBeHeapVector<RefPtrWillBeMember<CSSPrimitiveValue>> widthArguments; |  | 
|  2208     bool hasRoundedInset = false; |  | 
|  2209  |  | 
|  2210     while (argument) { |  | 
|  2211         if (argument->m_unit == CSSParserValue::Identifier && argument->id == CS
      SValueRound) { |  | 
|  2212             if (!args->next()) |  | 
|  2213                 return nullptr; |  | 
|  2214             hasRoundedInset = true; |  | 
|  2215             break; |  | 
|  2216         } |  | 
|  2217  |  | 
|  2218         Units unitFlags = FLength | FPercent; |  | 
|  2219         if (!validUnit(argument, unitFlags) || widthArguments.size() > 4) |  | 
|  2220             return nullptr; |  | 
|  2221  |  | 
|  2222         widthArguments.append(createPrimitiveNumericValue(argument)); |  | 
|  2223         argument = args->next(); |  | 
|  2224     } |  | 
|  2225  |  | 
|  2226     switch (widthArguments.size()) { |  | 
|  2227     case 1: { |  | 
|  2228         shape->updateShapeSize1Value(widthArguments[0].get()); |  | 
|  2229         break; |  | 
|  2230     } |  | 
|  2231     case 2: { |  | 
|  2232         shape->updateShapeSize2Values(widthArguments[0].get(), widthArguments[1]
      .get()); |  | 
|  2233         break; |  | 
|  2234         } |  | 
|  2235     case 3: { |  | 
|  2236         shape->updateShapeSize3Values(widthArguments[0].get(), widthArguments[1]
      .get(), widthArguments[2].get()); |  | 
|  2237         break; |  | 
|  2238     } |  | 
|  2239     case 4: { |  | 
|  2240         shape->updateShapeSize4Values(widthArguments[0].get(), widthArguments[1]
      .get(), widthArguments[2].get(), widthArguments[3].get()); |  | 
|  2241         break; |  | 
|  2242     } |  | 
|  2243     default: |  | 
|  2244         return nullptr; |  | 
|  2245     } |  | 
|  2246  |  | 
|  2247     if (hasRoundedInset) { |  | 
|  2248         // FIXME: Refactor completeBorderRadii and the array |  | 
|  2249         RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4]; |  | 
|  2250         RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4]; |  | 
|  2251         if (!parseRadii(radii, radii2, args)) |  | 
|  2252             return nullptr; |  | 
|  2253         shape->setTopLeftRadius(CSSValuePair::create(radii[0].release(), radii2[
      0].release(), CSSValuePair::DropIdenticalValues)); |  | 
|  2254         shape->setTopRightRadius(CSSValuePair::create(radii[1].release(), radii2
      [1].release(), CSSValuePair::DropIdenticalValues)); |  | 
|  2255         shape->setBottomRightRadius(CSSValuePair::create(radii[2].release(), rad
      ii2[2].release(), CSSValuePair::DropIdenticalValues)); |  | 
|  2256         shape->setBottomLeftRadius(CSSValuePair::create(radii[3].release(), radi
      i2[3].release(), CSSValuePair::DropIdenticalValues)); |  | 
|  2257     } |  | 
|  2258  |  | 
|  2259     return shape.release(); |  | 
|  2260 } |  | 
|  2261  |  | 
|  2262 static bool isContentDistributionKeyword(CSSValueID id) |  2170 static bool isContentDistributionKeyword(CSSValueID id) | 
|  2263 { |  2171 { | 
|  2264     return id == CSSValueSpaceBetween || id == CSSValueSpaceAround |  2172     return id == CSSValueSpaceBetween || id == CSSValueSpaceAround | 
|  2265         || id == CSSValueSpaceEvenly || id == CSSValueStretch; |  2173         || id == CSSValueSpaceEvenly || id == CSSValueStretch; | 
|  2266 } |  2174 } | 
|  2267  |  2175  | 
|  2268 static bool isContentPositionKeyword(CSSValueID id) |  2176 static bool isContentPositionKeyword(CSSValueID id) | 
|  2269 { |  2177 { | 
|  2270     return id == CSSValueStart || id == CSSValueEnd || id == CSSValueCenter |  2178     return id == CSSValueStart || id == CSSValueEnd || id == CSSValueCenter | 
|  2271         || id == CSSValueFlexStart || id == CSSValueFlexEnd |  2179         || id == CSSValueFlexStart || id == CSSValueFlexEnd | 
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2400     } |  2308     } | 
|  2401  |  2309  | 
|  2402     m_valueList->next(); |  2310     m_valueList->next(); | 
|  2403  |  2311  | 
|  2404     ASSERT(position); |  2312     ASSERT(position); | 
|  2405     if (overflowAlignmentKeyword) |  2313     if (overflowAlignmentKeyword) | 
|  2406         return CSSValuePair::create(position, overflowAlignmentKeyword, CSSValue
      Pair::DropIdenticalValues); |  2314         return CSSValuePair::create(position, overflowAlignmentKeyword, CSSValue
      Pair::DropIdenticalValues); | 
|  2407     return position.release(); |  2315     return position.release(); | 
|  2408 } |  2316 } | 
|  2409  |  2317  | 
|  2410 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseShapeRadius(CS
      SParserValue* value) |  | 
|  2411 { |  | 
|  2412     if (value->id == CSSValueClosestSide || value->id == CSSValueFarthestSide) |  | 
|  2413         return cssValuePool().createIdentifierValue(value->id); |  | 
|  2414  |  | 
|  2415     if (!validUnit(value, FLength | FPercent | FNonNeg)) |  | 
|  2416         return nullptr; |  | 
|  2417  |  | 
|  2418     return createPrimitiveNumericValue(value); |  | 
|  2419 } |  | 
|  2420  |  | 
|  2421 PassRefPtrWillBeRawPtr<CSSBasicShapeCircleValue> CSSPropertyParser::parseBasicSh
      apeCircle(CSSParserValueList* args) |  | 
|  2422 { |  | 
|  2423     ASSERT(args); |  | 
|  2424  |  | 
|  2425     // circle(radius) |  | 
|  2426     // circle(radius at <position>) |  | 
|  2427     // circle(at <position>) |  | 
|  2428     // where position defines centerX and centerY using a CSS <position> data ty
      pe. |  | 
|  2429     RefPtrWillBeRawPtr<CSSBasicShapeCircleValue> shape = CSSBasicShapeCircleValu
      e::create(); |  | 
|  2430  |  | 
|  2431     for (CSSParserValue* argument = args->current(); argument; argument = args->
      next()) { |  | 
|  2432         // The call to parseFillPosition below should consume all of the |  | 
|  2433         // arguments except the first two. Thus, and index greater than one |  | 
|  2434         // indicates an invalid production. |  | 
|  2435         if (args->currentIndex() > 1) |  | 
|  2436             return nullptr; |  | 
|  2437  |  | 
|  2438         if (!args->currentIndex() && argument->id != CSSValueAt) { |  | 
|  2439             if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius(
      argument)) { |  | 
|  2440                 shape->setRadius(radius); |  | 
|  2441                 continue; |  | 
|  2442             } |  | 
|  2443  |  | 
|  2444             return nullptr; |  | 
|  2445         } |  | 
|  2446  |  | 
|  2447         if (argument->id == CSSValueAt && args->next()) { |  | 
|  2448             RefPtrWillBeRawPtr<CSSValue> centerX = nullptr; |  | 
|  2449             RefPtrWillBeRawPtr<CSSValue> centerY = nullptr; |  | 
|  2450             parseFillPosition(args, centerX, centerY); |  | 
|  2451             if (centerX && centerY && !args->current()) { |  | 
|  2452                 shape->setCenterX(centerX); |  | 
|  2453                 shape->setCenterY(centerY); |  | 
|  2454             } else { |  | 
|  2455                 return nullptr; |  | 
|  2456             } |  | 
|  2457         } else { |  | 
|  2458             return nullptr; |  | 
|  2459         } |  | 
|  2460     } |  | 
|  2461  |  | 
|  2462     return shape.release(); |  | 
|  2463 } |  | 
|  2464  |  | 
|  2465 PassRefPtrWillBeRawPtr<CSSBasicShapeEllipseValue> CSSPropertyParser::parseBasicS
      hapeEllipse(CSSParserValueList* args) |  | 
|  2466 { |  | 
|  2467     ASSERT(args); |  | 
|  2468  |  | 
|  2469     // ellipse(radiusX) |  | 
|  2470     // ellipse(radiusX at <position>) |  | 
|  2471     // ellipse(radiusX radiusY) |  | 
|  2472     // ellipse(radiusX radiusY at <position>) |  | 
|  2473     // ellipse(at <position>) |  | 
|  2474     // where position defines centerX and centerY using a CSS <position> data ty
      pe. |  | 
|  2475     RefPtrWillBeRawPtr<CSSBasicShapeEllipseValue> shape = CSSBasicShapeEllipseVa
      lue::create(); |  | 
|  2476  |  | 
|  2477     for (CSSParserValue* argument = args->current(); argument; argument = args->
      next()) { |  | 
|  2478         // The call to parseFillPosition below should consume all of the |  | 
|  2479         // arguments except the first three. Thus, an index greater than two |  | 
|  2480         // indicates an invalid production. |  | 
|  2481         if (args->currentIndex() > 2) |  | 
|  2482             return nullptr; |  | 
|  2483  |  | 
|  2484         if (args->currentIndex() < 2 && argument->id != CSSValueAt) { |  | 
|  2485             if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius(
      argument)) { |  | 
|  2486                 if (!shape->radiusX()) |  | 
|  2487                     shape->setRadiusX(radius); |  | 
|  2488                 else |  | 
|  2489                     shape->setRadiusY(radius); |  | 
|  2490                 continue; |  | 
|  2491             } |  | 
|  2492  |  | 
|  2493             return nullptr; |  | 
|  2494         } |  | 
|  2495  |  | 
|  2496         if (argument->id != CSSValueAt || !args->next()) // expecting ellipse(..
       at <position>) |  | 
|  2497             return nullptr; |  | 
|  2498         RefPtrWillBeRawPtr<CSSValue> centerX = nullptr; |  | 
|  2499         RefPtrWillBeRawPtr<CSSValue> centerY = nullptr; |  | 
|  2500         parseFillPosition(args, centerX, centerY); |  | 
|  2501         if (!centerX || !centerY || args->current()) |  | 
|  2502             return nullptr; |  | 
|  2503  |  | 
|  2504         shape->setCenterX(centerX); |  | 
|  2505         shape->setCenterY(centerY); |  | 
|  2506     } |  | 
|  2507  |  | 
|  2508     return shape.release(); |  | 
|  2509 } |  | 
|  2510  |  | 
|  2511 PassRefPtrWillBeRawPtr<CSSBasicShapePolygonValue> CSSPropertyParser::parseBasicS
      hapePolygon(CSSParserValueList* args) |  | 
|  2512 { |  | 
|  2513     ASSERT(args); |  | 
|  2514  |  | 
|  2515     unsigned size = args->size(); |  | 
|  2516     if (!size) |  | 
|  2517         return nullptr; |  | 
|  2518  |  | 
|  2519     RefPtrWillBeRawPtr<CSSBasicShapePolygonValue> shape = CSSBasicShapePolygonVa
      lue::create(); |  | 
|  2520  |  | 
|  2521     CSSParserValue* argument = args->current(); |  | 
|  2522     if (argument->id == CSSValueEvenodd || argument->id == CSSValueNonzero) { |  | 
|  2523         shape->setWindRule(argument->id == CSSValueEvenodd ? RULE_EVENODD : RULE
      _NONZERO); |  | 
|  2524         args->next(); |  | 
|  2525  |  | 
|  2526         if (!consumeComma(args)) |  | 
|  2527             return nullptr; |  | 
|  2528  |  | 
|  2529         size -= 2; |  | 
|  2530     } |  | 
|  2531  |  | 
|  2532     // <length> <length>, ... <length> <length> -> each pair has 3 elements exce
      pt the last one |  | 
|  2533     if (!size || (size % 3) - 2) |  | 
|  2534         return nullptr; |  | 
|  2535  |  | 
|  2536     while (true) { |  | 
|  2537         CSSParserValue* argumentX = args->current(); |  | 
|  2538         if (!argumentX || !validUnit(argumentX, FLength | FPercent)) |  | 
|  2539             return nullptr; |  | 
|  2540         RefPtrWillBeRawPtr<CSSPrimitiveValue> xLength = createPrimitiveNumericVa
      lue(argumentX); |  | 
|  2541  |  | 
|  2542         CSSParserValue* argumentY = args->next(); |  | 
|  2543         if (!argumentY || !validUnit(argumentY, FLength | FPercent)) |  | 
|  2544             return nullptr; |  | 
|  2545         RefPtrWillBeRawPtr<CSSPrimitiveValue> yLength = createPrimitiveNumericVa
      lue(argumentY); |  | 
|  2546  |  | 
|  2547         shape->appendPoint(xLength.release(), yLength.release()); |  | 
|  2548  |  | 
|  2549         if (!args->next()) |  | 
|  2550             break; |  | 
|  2551         if (!consumeComma(args)) |  | 
|  2552             return nullptr; |  | 
|  2553     } |  | 
|  2554  |  | 
|  2555     return shape.release(); |  | 
|  2556 } |  | 
|  2557  |  | 
|  2558 static bool isBoxValue(CSSValueID valueId) |  | 
|  2559 { |  | 
|  2560     switch (valueId) { |  | 
|  2561     case CSSValueContentBox: |  | 
|  2562     case CSSValuePaddingBox: |  | 
|  2563     case CSSValueBorderBox: |  | 
|  2564     case CSSValueMarginBox: |  | 
|  2565         return true; |  | 
|  2566     default: |  | 
|  2567         break; |  | 
|  2568     } |  | 
|  2569  |  | 
|  2570     return false; |  | 
|  2571 } |  | 
|  2572  |  | 
|  2573 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseShapeProperty(CSSProper
      tyID propId) |  | 
|  2574 { |  | 
|  2575     RefPtrWillBeRawPtr<CSSValue> imageValue = nullptr; |  | 
|  2576     if (parseFillImage(m_valueList, imageValue)) { |  | 
|  2577         m_valueList->next(); |  | 
|  2578         return imageValue.release(); |  | 
|  2579     } |  | 
|  2580  |  | 
|  2581     return parseBasicShapeAndOrBox(); |  | 
|  2582 } |  | 
|  2583  |  | 
|  2584 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseBasicShapeAndOrBox() |  | 
|  2585 { |  | 
|  2586     CSSParserValue* value = m_valueList->current(); |  | 
|  2587  |  | 
|  2588     bool shapeFound = false; |  | 
|  2589     bool boxFound = false; |  | 
|  2590     CSSValueID valueId; |  | 
|  2591  |  | 
|  2592     RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
      ; |  | 
|  2593     for (unsigned i = 0; i < 2; ++i) { |  | 
|  2594         if (!value) |  | 
|  2595             break; |  | 
|  2596         valueId = value->id; |  | 
|  2597         if (value->m_unit == CSSParserValue::Function && !shapeFound) { |  | 
|  2598             // parseBasicShape already asks for the next value list item. |  | 
|  2599             RefPtrWillBeRawPtr<CSSValue> shapeValue = parseBasicShape(); |  | 
|  2600             if (!shapeValue) |  | 
|  2601                 return nullptr; |  | 
|  2602             list->append(shapeValue.release()); |  | 
|  2603             shapeFound = true; |  | 
|  2604         } else if (isBoxValue(valueId) && !boxFound) { |  | 
|  2605             list->append(parseValidPrimitive(valueId, value)); |  | 
|  2606             boxFound = true; |  | 
|  2607             m_valueList->next(); |  | 
|  2608         } else { |  | 
|  2609             return nullptr; |  | 
|  2610         } |  | 
|  2611  |  | 
|  2612         value = m_valueList->current(); |  | 
|  2613     } |  | 
|  2614  |  | 
|  2615     if (m_valueList->current()) |  | 
|  2616         return nullptr; |  | 
|  2617     return list.release(); |  | 
|  2618 } |  | 
|  2619  |  | 
|  2620 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseBasicShape() |  | 
|  2621 { |  | 
|  2622     CSSParserValue* value = m_valueList->current(); |  | 
|  2623     ASSERT(value->m_unit == CSSParserValue::Function); |  | 
|  2624     CSSParserValueList* args = value->function->args.get(); |  | 
|  2625  |  | 
|  2626     if (!args) |  | 
|  2627         return nullptr; |  | 
|  2628  |  | 
|  2629     RefPtrWillBeRawPtr<CSSValue> shape = nullptr; |  | 
|  2630     if (value->function->id == CSSValueCircle) |  | 
|  2631         shape = parseBasicShapeCircle(args); |  | 
|  2632     else if (value->function->id == CSSValueEllipse) |  | 
|  2633         shape = parseBasicShapeEllipse(args); |  | 
|  2634     else if (value->function->id == CSSValuePolygon) |  | 
|  2635         shape = parseBasicShapePolygon(args); |  | 
|  2636     else if (value->function->id == CSSValueInset) |  | 
|  2637         shape = parseBasicShapeInset(args); |  | 
|  2638  |  | 
|  2639     if (!shape) |  | 
|  2640         return nullptr; |  | 
|  2641  |  | 
|  2642     m_valueList->next(); |  | 
|  2643  |  | 
|  2644     return shape.release(); |  | 
|  2645 } |  | 
|  2646  |  | 
|  2647 inline int CSSPropertyParser::colorIntFromValue(CSSParserValue* v) |  2318 inline int CSSPropertyParser::colorIntFromValue(CSSParserValue* v) | 
|  2648 { |  2319 { | 
|  2649     bool isPercent; |  2320     bool isPercent; | 
|  2650     double value; |  2321     double value; | 
|  2651  |  2322  | 
|  2652     if (m_parsedCalculation) { |  2323     if (m_parsedCalculation) { | 
|  2653         isPercent = m_parsedCalculation->category() == CalcPercent; |  2324         isPercent = m_parsedCalculation->category() == CalcPercent; | 
|  2654         value = m_parsedCalculation->doubleValue(); |  2325         value = m_parsedCalculation->doubleValue(); | 
|  2655         m_parsedCalculation.release(); |  2326         m_parsedCalculation.release(); | 
|  2656     } else { |  2327     } else { | 
| (...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3325 bool CSSPropertyParser::parseBorderImageWidth(RefPtrWillBeRawPtr<CSSQuadValue>& 
      result) |  2996 bool CSSPropertyParser::parseBorderImageWidth(RefPtrWillBeRawPtr<CSSQuadValue>& 
      result) | 
|  3326 { |  2997 { | 
|  3327     return parseBorderImageQuad(FLength | FNumber | FNonNeg | FPercent, result); |  2998     return parseBorderImageQuad(FLength | FNumber | FNonNeg | FPercent, result); | 
|  3328 } |  2999 } | 
|  3329  |  3000  | 
|  3330 bool CSSPropertyParser::parseBorderImageOutset(RefPtrWillBeRawPtr<CSSQuadValue>&
       result) |  3001 bool CSSPropertyParser::parseBorderImageOutset(RefPtrWillBeRawPtr<CSSQuadValue>&
       result) | 
|  3331 { |  3002 { | 
|  3332     return parseBorderImageQuad(FLength | FNumber | FNonNeg, result); |  3003     return parseBorderImageQuad(FLength | FNumber | FNonNeg, result); | 
|  3333 } |  3004 } | 
|  3334  |  3005  | 
|  3335 bool CSSPropertyParser::parseRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4
      ], RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4], CSSParserValueList* args, CS
      SPropertyID unresolvedProperty) |  | 
|  3336 { |  | 
|  3337 #if ENABLE(OILPAN) |  | 
|  3338     // Unconditionally zero initialize the arrays of raw pointers. |  | 
|  3339     memset(radii, 0, 4 * sizeof(radii[0])); |  | 
|  3340     memset(radii2, 0, 4 * sizeof(radii2[0])); |  | 
|  3341 #endif |  | 
|  3342     CSSParserValue* value = args->current(); |  | 
|  3343     int i; |  | 
|  3344     for (i = 0; i < 4 && value && value->m_unit != CSSParserValue::Operator;++i,
       value = args->next()) { |  | 
|  3345         if (!validUnit(value, FLength | FPercent | FNonNeg)) |  | 
|  3346             return false; |  | 
|  3347  |  | 
|  3348         radii[i] = createPrimitiveNumericValue(value); |  | 
|  3349     } |  | 
|  3350  |  | 
|  3351     if (!i || (value && value->m_unit == CSSParserValue::Operator && value->iVal
      ue != '/')) |  | 
|  3352         return false; |  | 
|  3353     // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radi
      us: l1 / l2; |  | 
|  3354     if (!value && i == 2 && unresolvedProperty == CSSPropertyAliasWebkitBorderRa
      dius) { |  | 
|  3355         radii2[0] = radii[1]; |  | 
|  3356         radii[1] = nullptr; |  | 
|  3357         completeBorderRadii(radii); |  | 
|  3358         completeBorderRadii(radii2); |  | 
|  3359         return true; |  | 
|  3360     } |  | 
|  3361     completeBorderRadii(radii); |  | 
|  3362     if (value) { |  | 
|  3363         value = args->next(); |  | 
|  3364         for (i = 0; i < 4 && value && validUnit(value, FLength | FPercent | FNon
      Neg); ++i, value = args->next()) |  | 
|  3365             radii2[i] = createPrimitiveNumericValue(value); |  | 
|  3366         if (!i || value) |  | 
|  3367             return false; |  | 
|  3368         completeBorderRadii(radii2); |  | 
|  3369     } else { |  | 
|  3370         for (unsigned i = 0; i < 4; ++i) |  | 
|  3371             radii2[i] = radii[i]; |  | 
|  3372     } |  | 
|  3373  |  | 
|  3374     return true; |  | 
|  3375 } |  | 
|  3376  |  | 
|  3377 // This should go away once we drop support for -webkit-gradient |  3006 // This should go away once we drop support for -webkit-gradient | 
|  3378 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseDeprecatedGradientPoint(CS
      SParserValue* a, bool horizontal) |  3007 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseDeprecatedGradientPoint(CS
      SParserValue* a, bool horizontal) | 
|  3379 { |  3008 { | 
|  3380     RefPtrWillBeRawPtr<CSSPrimitiveValue> result = nullptr; |  3009     RefPtrWillBeRawPtr<CSSPrimitiveValue> result = nullptr; | 
|  3381     if (a->m_unit == CSSParserValue::Identifier) { |  3010     if (a->m_unit == CSSParserValue::Identifier) { | 
|  3382         if ((a->id == CSSValueLeft && horizontal) |  3011         if ((a->id == CSSValueLeft && horizontal) | 
|  3383             || (a->id == CSSValueTop && !horizontal)) |  3012             || (a->id == CSSValueTop && !horizontal)) | 
|  3384             result = cssValuePool().createValue(0., CSSPrimitiveValue::UnitType:
      :Percentage); |  3013             result = cssValuePool().createValue(0., CSSPrimitiveValue::UnitType:
      :Percentage); | 
|  3385         else if ((a->id == CSSValueRight && horizontal) |  3014         else if ((a->id == CSSValueRight && horizontal) | 
|  3386             || (a->id == CSSValueBottom && !horizontal)) |  3015             || (a->id == CSSValueBottom && !horizontal)) | 
| (...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4205     ASSERT(!m_parsedCalculation); |  3834     ASSERT(!m_parsedCalculation); | 
|  4206     m_parsedCalculation = CSSCalcValue::create(args, range); |  3835     m_parsedCalculation = CSSCalcValue::create(args, range); | 
|  4207  |  3836  | 
|  4208     if (!m_parsedCalculation) |  3837     if (!m_parsedCalculation) | 
|  4209         return false; |  3838         return false; | 
|  4210  |  3839  | 
|  4211     return true; |  3840     return true; | 
|  4212 } |  3841 } | 
|  4213  |  3842  | 
|  4214 } // namespace blink |  3843 } // namespace blink | 
| OLD | NEW |