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 * |
(...skipping 8227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8238 return 0; | 8238 return 0; |
8239 | 8239 |
8240 unsigned numArgs = argsList->size(); | 8240 unsigned numArgs = argsList->size(); |
8241 if (numArgs < 1 || numArgs > 3) | 8241 if (numArgs < 1 || numArgs > 3) |
8242 return 0; | 8242 return 0; |
8243 | 8243 |
8244 RefPtr<CSSMixFunctionValue> mixFunction = CSSMixFunctionValue::create(); | 8244 RefPtr<CSSMixFunctionValue> mixFunction = CSSMixFunctionValue::create(); |
8245 | 8245 |
8246 bool hasBlendMode = false; | 8246 bool hasBlendMode = false; |
8247 bool hasAlphaCompositing = false; | 8247 bool hasAlphaCompositing = false; |
8248 CSSParserValue* arg; | 8248 |
8249 while ((arg = argsList->current())) { | 8249 for (CSSParserValue* arg = argsList->current(); arg; arg = argsList->next())
{ |
8250 RefPtr<CSSValue> value; | 8250 RefPtr<CSSValue> value; |
8251 | 8251 |
8252 unsigned argNumber = argsList->currentIndex(); | 8252 unsigned argNumber = argsList->currentIndex(); |
8253 if (!argNumber) { | 8253 if (!argNumber) { |
8254 if (arg->unit == CSSPrimitiveValue::CSS_URI) { | 8254 if (arg->unit == CSSPrimitiveValue::CSS_URI) { |
8255 KURL shaderURL = completeURL(arg->string); | 8255 KURL shaderURL = completeURL(arg->string); |
8256 value = CSSShaderValue::create(shaderURL.string()); | 8256 value = CSSShaderValue::create(shaderURL.string()); |
8257 } | 8257 } |
8258 } else if (argNumber == 1 || argNumber == 2) { | 8258 } else if (argNumber == 1 || argNumber == 2) { |
8259 if (!hasBlendMode && isBlendMode(arg->id)) { | 8259 if (!hasBlendMode && isBlendMode(arg->id)) { |
8260 hasBlendMode = true; | 8260 hasBlendMode = true; |
8261 value = cssValuePool().createIdentifierValue(arg->id); | 8261 value = cssValuePool().createIdentifierValue(arg->id); |
8262 } else if (!hasAlphaCompositing && isCompositeOperator(arg->id)) { | 8262 } else if (!hasAlphaCompositing && isCompositeOperator(arg->id)) { |
8263 hasAlphaCompositing = true; | 8263 hasAlphaCompositing = true; |
8264 value = cssValuePool().createIdentifierValue(arg->id); | 8264 value = cssValuePool().createIdentifierValue(arg->id); |
8265 } | 8265 } |
8266 } | 8266 } |
8267 | 8267 |
8268 if (!value) | 8268 if (!value) |
8269 return 0; | 8269 return 0; |
8270 | 8270 |
8271 mixFunction->append(value.release()); | 8271 mixFunction->append(value.release()); |
8272 | |
8273 arg = argsList->next(); | |
8274 } | 8272 } |
8275 | 8273 |
8276 return mixFunction; | 8274 return mixFunction; |
8277 } | 8275 } |
8278 | 8276 |
8279 PassRefPtr<CSSValueList> CSSParser::parseCustomFilterParameters(CSSParserValueLi
st* argsList) | 8277 PassRefPtr<CSSValueList> CSSParser::parseCustomFilterParameters(CSSParserValueLi
st* argsList) |
8280 { | 8278 { |
8281 // | 8279 // |
8282 // params: [<param-def>[,<param-def>*]] | 8280 // params: [<param-def>[,<param-def>*]] |
8283 // param-def: <param-name>wsp<param-value> | 8281 // param-def: <param-name>wsp<param-value> |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8418 CSSParserValueList* argsList = value->function->args.get(); | 8416 CSSParserValueList* argsList = value->function->args.get(); |
8419 if (!argsList) | 8417 if (!argsList) |
8420 return 0; | 8418 return 0; |
8421 | 8419 |
8422 RefPtr<CSSFilterValue> filterValue = CSSFilterValue::create(CSSFilterValue::
CustomFilterOperation); | 8420 RefPtr<CSSFilterValue> filterValue = CSSFilterValue::create(CSSFilterValue::
CustomFilterOperation); |
8423 | 8421 |
8424 // 1. Parse the shader URLs: <vertex-shader>[wsp<fragment-shader>] | 8422 // 1. Parse the shader URLs: <vertex-shader>[wsp<fragment-shader>] |
8425 RefPtr<CSSValueList> shadersList = CSSValueList::createSpaceSeparated(); | 8423 RefPtr<CSSValueList> shadersList = CSSValueList::createSpaceSeparated(); |
8426 bool hadAtLeastOneCustomShader = false; | 8424 bool hadAtLeastOneCustomShader = false; |
8427 CSSParserValue* arg; | 8425 CSSParserValue* arg; |
8428 while ((arg = argsList->current())) { | 8426 for (arg = argsList->current(); arg; arg = argsList->next()) { |
8429 RefPtr<CSSValue> value; | 8427 RefPtr<CSSValue> value; |
8430 if (arg->id == CSSValueNone) | 8428 if (arg->id == CSSValueNone) |
8431 value = cssValuePool().createIdentifierValue(CSSValueNone); | 8429 value = cssValuePool().createIdentifierValue(CSSValueNone); |
8432 else if (arg->unit == CSSPrimitiveValue::CSS_URI) { | 8430 else if (arg->unit == CSSPrimitiveValue::CSS_URI) { |
8433 KURL shaderURL = completeURL(arg->string); | 8431 KURL shaderURL = completeURL(arg->string); |
8434 value = CSSShaderValue::create(shaderURL.string()); | 8432 value = CSSShaderValue::create(shaderURL.string()); |
8435 hadAtLeastOneCustomShader = true; | 8433 hadAtLeastOneCustomShader = true; |
8436 } else if (argsList->currentIndex() == 1 && arg->unit == CSSParserValue:
:Function) { | 8434 } else if (argsList->currentIndex() == 1 && arg->unit == CSSParserValue:
:Function) { |
8437 if (!(value = parseMixFunction(arg))) | 8435 if (!(value = parseMixFunction(arg))) |
8438 return 0; | 8436 return 0; |
8439 hadAtLeastOneCustomShader = true; | 8437 hadAtLeastOneCustomShader = true; |
8440 } | 8438 } |
8441 | 8439 |
8442 if (!value) | 8440 if (!value) |
8443 break; | 8441 break; |
8444 shadersList->append(value.release()); | 8442 shadersList->append(value.release()); |
8445 argsList->next(); | |
8446 } | 8443 } |
8447 | 8444 |
8448 if (!shadersList->length() || !hadAtLeastOneCustomShader || shadersList->len
gth() > 2 || !acceptCommaOperator(argsList)) | 8445 if (!shadersList->length() || !hadAtLeastOneCustomShader || shadersList->len
gth() > 2 || !acceptCommaOperator(argsList)) |
8449 return 0; | 8446 return 0; |
8450 | 8447 |
8451 filterValue->append(shadersList.release()); | 8448 filterValue->append(shadersList.release()); |
8452 | 8449 |
8453 // 2. Parse the mesh size <vertex-mesh> | 8450 // 2. Parse the mesh size <vertex-mesh> |
8454 RefPtr<CSSValueList> meshSizeList = CSSValueList::createSpaceSeparated(); | 8451 RefPtr<CSSValueList> meshSizeList = CSSValueList::createSpaceSeparated(); |
8455 | 8452 |
8456 while ((arg = argsList->current())) { | 8453 for (arg = argsList->current(); arg; arg = argsList->next()) { |
8457 if (!validUnit(arg, FInteger | FNonNeg, CSSStrictMode)) | 8454 if (!validUnit(arg, FInteger | FNonNeg, CSSStrictMode)) |
8458 break; | 8455 break; |
8459 int integerValue = clampToInteger(arg->fValue); | 8456 int integerValue = clampToInteger(arg->fValue); |
8460 // According to the specification we can only accept positive non-zero v
alues. | 8457 // According to the specification we can only accept positive non-zero v
alues. |
8461 if (integerValue < 1) | 8458 if (integerValue < 1) |
8462 return 0; | 8459 return 0; |
8463 meshSizeList->append(cssValuePool().createValue(integerValue, CSSPrimiti
veValue::CSS_NUMBER)); | 8460 meshSizeList->append(cssValuePool().createValue(integerValue, CSSPrimiti
veValue::CSS_NUMBER)); |
8464 argsList->next(); | |
8465 } | 8461 } |
8466 | 8462 |
8467 if (meshSizeList->length() > 2) | 8463 if (meshSizeList->length() > 2) |
8468 return 0; | 8464 return 0; |
8469 | 8465 |
8470 // FIXME: For legacy content, we accept the mesh box types. We don't do anyt
hing else with them. | 8466 // FIXME: For legacy content, we accept the mesh box types. We don't do anyt
hing else with them. |
8471 // Eventually, we'll remove them completely. | 8467 // Eventually, we'll remove them completely. |
8472 // https://bugs.webkit.org/show_bug.cgi?id=103778 | 8468 // https://bugs.webkit.org/show_bug.cgi?id=103778 |
8473 if ((arg = argsList->current()) && (arg->id == CSSValueBorderBox || arg->id
== CSSValuePaddingBox | 8469 if ((arg = argsList->current()) && (arg->id == CSSValueBorderBox || arg->id
== CSSValuePaddingBox |
8474 || arg->id == CSSValueContentBox || arg->id == CSSValueFilterBox)) | 8470 || arg->id == CSSValueContentBox || arg->id == CSSValueFilterBox)) |
(...skipping 3331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11806 { | 11802 { |
11807 // The tokenizer checks for the construct of an+b. | 11803 // The tokenizer checks for the construct of an+b. |
11808 // However, since the {ident} rule precedes the {nth} rule, some of those | 11804 // However, since the {ident} rule precedes the {nth} rule, some of those |
11809 // tokens are identified as string literal. Furthermore we need to accept | 11805 // tokens are identified as string literal. Furthermore we need to accept |
11810 // "odd" and "even" which does not match to an+b. | 11806 // "odd" and "even" which does not match to an+b. |
11811 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even") | 11807 return equalIgnoringCase(token, "odd") || equalIgnoringCase(token, "even") |
11812 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n"); | 11808 || equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n"); |
11813 } | 11809 } |
11814 | 11810 |
11815 } | 11811 } |
OLD | NEW |