Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(222)

Side by Side Diff: third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp

Issue 1603193002: Move two shape related properties into CSSPropertyParser (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698