| 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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 , m_context(context) | 91 , m_context(context) |
| 92 , m_inViewport(inViewport) | 92 , m_inViewport(inViewport) |
| 93 , m_parsedProperties(parsedProperties) | 93 , m_parsedProperties(parsedProperties) |
| 94 , m_ruleType(ruleType) | 94 , m_ruleType(ruleType) |
| 95 , m_inParseShorthand(0) | 95 , m_inParseShorthand(0) |
| 96 , m_currentShorthand(CSSPropertyInvalid) | 96 , m_currentShorthand(CSSPropertyInvalid) |
| 97 , m_implicitShorthand(false) | 97 , m_implicitShorthand(false) |
| 98 { | 98 { |
| 99 } | 99 } |
| 100 | 100 |
| 101 bool CSSPropertyParser::parseValue(CSSPropertyID property, bool important, | 101 bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
ant, |
| 102 CSSParserValueList* valueList, const CSSParserContext& context, bool inViewp
ort, | 102 CSSParserValueList* valueList, const CSSParserContext& context, bool inViewp
ort, |
| 103 WillBeHeapVector<CSSProperty, 256>& parsedProperties, StyleRule::Type ruleTy
pe) | 103 WillBeHeapVector<CSSProperty, 256>& parsedProperties, StyleRule::Type ruleTy
pe) |
| 104 { | 104 { |
| 105 int parsedPropertiesSize = parsedProperties.size(); | 105 int parsedPropertiesSize = parsedProperties.size(); |
| 106 | 106 |
| 107 CSSPropertyParser parser(valueList, context, inViewport, parsedProperties, r
uleType); | 107 CSSPropertyParser parser(valueList, context, inViewport, parsedProperties, r
uleType); |
| 108 bool parseSuccess = parser.parseValue(property, important); | 108 bool parseSuccess = parser.parseValue(unresolvedProperty, important); |
| 109 | 109 |
| 110 // This doesn't count UA style sheets | 110 // This doesn't count UA style sheets |
| 111 if (parseSuccess && context.useCounter()) | 111 if (parseSuccess && context.useCounter()) |
| 112 context.useCounter()->count(context, property); | 112 context.useCounter()->count(context, unresolvedProperty); |
| 113 | 113 |
| 114 if (!parseSuccess) | 114 if (!parseSuccess) |
| 115 parser.rollbackLastProperties(parsedProperties.size() - parsedProperties
Size); | 115 parser.rollbackLastProperties(parsedProperties.size() - parsedProperties
Size); |
| 116 | 116 |
| 117 return parseSuccess; | 117 return parseSuccess; |
| 118 } | 118 } |
| 119 | 119 |
| 120 void CSSPropertyParser::addPropertyWithPrefixingVariant(CSSPropertyID propId, Pa
ssRefPtrWillBeRawPtr<CSSValue> value, bool important, bool implicit) | 120 void CSSPropertyParser::addPropertyWithPrefixingVariant(CSSPropertyID propId, Pa
ssRefPtrWillBeRawPtr<CSSValue> value, bool important, bool implicit) |
| 121 { | 121 { |
| 122 RefPtrWillBeRawPtr<CSSValue> val = value.get(); | 122 RefPtrWillBeRawPtr<CSSValue> val = value.get(); |
| 123 addProperty(propId, value, important, implicit); | 123 addProperty(propId, value, important, implicit); |
| 124 | 124 |
| 125 CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propId); | 125 CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propId); |
| 126 if (prefixingVariant == propId) | 126 if (prefixingVariant == propId) |
| 127 return; | 127 return; |
| 128 | 128 |
| 129 if (m_currentShorthand) { | 129 if (m_currentShorthand) { |
| 130 // We can't use ShorthandScope here as we can already be inside one (e.g
we are parsing CSSTransition). | 130 // We can't use ShorthandScope here as we can already be inside one (e.g
we are parsing CSSTransition). |
| 131 m_currentShorthand = prefixingVariantForPropertyId(m_currentShorthand); | 131 m_currentShorthand = prefixingVariantForPropertyId(m_currentShorthand); |
| 132 addProperty(prefixingVariant, val.release(), important, implicit); | 132 addProperty(prefixingVariant, val.release(), important, implicit); |
| 133 m_currentShorthand = prefixingVariantForPropertyId(m_currentShorthand); | 133 m_currentShorthand = prefixingVariantForPropertyId(m_currentShorthand); |
| 134 } else { | 134 } else { |
| 135 addProperty(prefixingVariant, val.release(), important, implicit); | 135 addProperty(prefixingVariant, val.release(), important, implicit); |
| 136 } | 136 } |
| 137 } | 137 } |
| 138 | 138 |
| 139 void CSSPropertyParser::addProperty(CSSPropertyID propId, PassRefPtrWillBeRawPtr
<CSSValue> value, bool important, bool implicit) | 139 void CSSPropertyParser::addProperty(CSSPropertyID propId, PassRefPtrWillBeRawPtr
<CSSValue> value, bool important, bool implicit) |
| 140 { | 140 { |
| 141 ASSERT(!isPropertyAlias(propId)); |
| 142 |
| 141 int shorthandIndex = 0; | 143 int shorthandIndex = 0; |
| 142 bool setFromShorthand = false; | 144 bool setFromShorthand = false; |
| 143 | 145 |
| 144 if (m_currentShorthand) { | 146 if (m_currentShorthand) { |
| 145 Vector<StylePropertyShorthand, 4> shorthands; | 147 Vector<StylePropertyShorthand, 4> shorthands; |
| 146 getMatchingShorthandsForLonghand(propId, &shorthands); | 148 getMatchingShorthandsForLonghand(propId, &shorthands); |
| 147 // Viewport descriptors have width and height as shorthands, but it does
n't | 149 // Viewport descriptors have width and height as shorthands, but it does
n't |
| 148 // make sense for CSSProperties.in to consider them as such. The shortha
nd | 150 // make sense for CSSProperties.in to consider them as such. The shortha
nd |
| 149 // index is only used by the inspector and doesn't affect viewport | 151 // index is only used by the inspector and doesn't affect viewport |
| 150 // descriptors. | 152 // descriptors. |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 return; | 417 return; |
| 416 } | 418 } |
| 417 | 419 |
| 418 RefPtrWillBeRawPtr<CSSValue> value = prpValue; | 420 RefPtrWillBeRawPtr<CSSValue> value = prpValue; |
| 419 ShorthandScope scope(this, propId); | 421 ShorthandScope scope(this, propId); |
| 420 const CSSPropertyID* longhands = shorthand.properties(); | 422 const CSSPropertyID* longhands = shorthand.properties(); |
| 421 for (unsigned i = 0; i < shorthandLength; ++i) | 423 for (unsigned i = 0; i < shorthandLength; ++i) |
| 422 addPropertyWithPrefixingVariant(longhands[i], value, important); | 424 addPropertyWithPrefixingVariant(longhands[i], value, important); |
| 423 } | 425 } |
| 424 | 426 |
| 425 bool CSSPropertyParser::parseValue(CSSPropertyID propId, bool important) | 427 bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
ant) |
| 426 { | 428 { |
| 429 CSSPropertyID propId = resolveCSSPropertyID(unresolvedProperty); |
| 430 |
| 427 if (!m_valueList) | 431 if (!m_valueList) |
| 428 return false; | 432 return false; |
| 429 | 433 |
| 430 CSSParserValue* value = m_valueList->current(); | 434 CSSParserValue* value = m_valueList->current(); |
| 431 | 435 |
| 432 if (!value) | 436 if (!value) |
| 433 return false; | 437 return false; |
| 434 | 438 |
| 435 if (inViewport()) { | 439 if (inViewport()) { |
| 436 // Allow @viewport rules from UA stylesheets even if the feature is disa
bled. | 440 // Allow @viewport rules from UA stylesheets even if the feature is disa
bled. |
| (...skipping 2574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3011 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseAnimationProperty() | 3015 PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseAnimationProperty() |
| 3012 { | 3016 { |
| 3013 CSSParserValue* value = m_valueList->current(); | 3017 CSSParserValue* value = m_valueList->current(); |
| 3014 if (value->unit != CSSPrimitiveValue::CSS_IDENT) | 3018 if (value->unit != CSSPrimitiveValue::CSS_IDENT) |
| 3015 return nullptr; | 3019 return nullptr; |
| 3016 // Since all is valid css property keyword, cssPropertyID for all | 3020 // Since all is valid css property keyword, cssPropertyID for all |
| 3017 // returns non-null value. We need to check "all" before | 3021 // returns non-null value. We need to check "all" before |
| 3018 // cssPropertyID check. | 3022 // cssPropertyID check. |
| 3019 if (value->id == CSSValueAll) | 3023 if (value->id == CSSValueAll) |
| 3020 return cssValuePool().createIdentifierValue(CSSValueAll); | 3024 return cssValuePool().createIdentifierValue(CSSValueAll); |
| 3021 CSSPropertyID property = cssPropertyID(value->string); | 3025 CSSPropertyID property = unresolvedCSSPropertyID(value->string); |
| 3022 if (property) { | 3026 if (property) { |
| 3023 ASSERT(CSSPropertyMetadata::isEnabledProperty(property)); | 3027 ASSERT(CSSPropertyMetadata::isEnabledProperty(property)); |
| 3024 return cssValuePool().createIdentifierValue(property); | 3028 return cssValuePool().createIdentifierValue(property); |
| 3025 } | 3029 } |
| 3026 if (value->id == CSSValueNone) | 3030 if (value->id == CSSValueNone) |
| 3027 return cssValuePool().createIdentifierValue(CSSValueNone); | 3031 return cssValuePool().createIdentifierValue(CSSValueNone); |
| 3028 if (value->id == CSSValueInitial || value->id == CSSValueInherit) | 3032 if (value->id == CSSValueInitial || value->id == CSSValueInherit) |
| 3029 return nullptr; | 3033 return nullptr; |
| 3030 return createPrimitiveCustomIdentValue(value); | 3034 return createPrimitiveCustomIdentValue(value); |
| 3031 } | 3035 } |
| (...skipping 4124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7156 return values.release(); | 7160 return values.release(); |
| 7157 } | 7161 } |
| 7158 | 7162 |
| 7159 // Every comma-separated list of CSS_IDENTs is a valid will-change value, | 7163 // Every comma-separated list of CSS_IDENTs is a valid will-change value, |
| 7160 // unless the list includes an explicitly disallowed CSS_IDENT. | 7164 // unless the list includes an explicitly disallowed CSS_IDENT. |
| 7161 while (true) { | 7165 while (true) { |
| 7162 CSSParserValue* currentValue = m_valueList->current(); | 7166 CSSParserValue* currentValue = m_valueList->current(); |
| 7163 if (!currentValue || currentValue->unit != CSSPrimitiveValue::CSS_IDENT) | 7167 if (!currentValue || currentValue->unit != CSSPrimitiveValue::CSS_IDENT) |
| 7164 return nullptr; | 7168 return nullptr; |
| 7165 | 7169 |
| 7166 CSSPropertyID property = cssPropertyID(currentValue->string); | 7170 CSSPropertyID unresolvedProperty = unresolvedCSSPropertyID(currentValue-
>string); |
| 7167 if (property) { | 7171 if (unresolvedProperty) { |
| 7168 ASSERT(CSSPropertyMetadata::isEnabledProperty(property)); | 7172 ASSERT(CSSPropertyMetadata::isEnabledProperty(unresolvedProperty)); |
| 7169 // Now "all" is used by both CSSValue and CSSPropertyValue. | 7173 // Now "all" is used by both CSSValue and CSSPropertyValue. |
| 7170 // Need to return nullptr when currentValue is CSSPropertyAll. | 7174 // Need to return nullptr when currentValue is CSSPropertyAll. |
| 7171 if (property == CSSPropertyWillChange || property == CSSPropertyAll) | 7175 if (unresolvedProperty == CSSPropertyWillChange || unresolvedPropert
y == CSSPropertyAll) |
| 7172 return nullptr; | 7176 return nullptr; |
| 7173 values->append(cssValuePool().createIdentifierValue(property)); | 7177 values->append(cssValuePool().createIdentifierValue(unresolvedProper
ty)); |
| 7174 } else { | 7178 } else { |
| 7175 switch (currentValue->id) { | 7179 switch (currentValue->id) { |
| 7176 case CSSValueNone: | 7180 case CSSValueNone: |
| 7177 case CSSValueAll: | 7181 case CSSValueAll: |
| 7178 case CSSValueAuto: | 7182 case CSSValueAuto: |
| 7179 case CSSValueDefault: | 7183 case CSSValueDefault: |
| 7180 case CSSValueInitial: | 7184 case CSSValueInitial: |
| 7181 case CSSValueInherit: | 7185 case CSSValueInherit: |
| 7182 return nullptr; | 7186 return nullptr; |
| 7183 case CSSValueContents: | 7187 case CSSValueContents: |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7802 | 7806 |
| 7803 // If just one value is supplied, the second value | 7807 // If just one value is supplied, the second value |
| 7804 // is implicitly initialized with the first value. | 7808 // is implicitly initialized with the first value. |
| 7805 if (numValues == 1) | 7809 if (numValues == 1) |
| 7806 m_valueList->previous(); | 7810 m_valueList->previous(); |
| 7807 | 7811 |
| 7808 return parseViewportProperty(second, important); | 7812 return parseViewportProperty(second, important); |
| 7809 } | 7813 } |
| 7810 | 7814 |
| 7811 template <typename CharacterType> | 7815 template <typename CharacterType> |
| 7812 static CSSPropertyID cssPropertyID(const CharacterType* propertyName, unsigned l
ength) | 7816 static CSSPropertyID unresolvedCSSPropertyID(const CharacterType* propertyName,
unsigned length) |
| 7813 { | 7817 { |
| 7814 char buffer[maxCSSPropertyNameLength + 1]; // 1 for null character | 7818 char buffer[maxCSSPropertyNameLength + 1]; // 1 for null character |
| 7815 | 7819 |
| 7816 for (unsigned i = 0; i != length; ++i) { | 7820 for (unsigned i = 0; i != length; ++i) { |
| 7817 CharacterType c = propertyName[i]; | 7821 CharacterType c = propertyName[i]; |
| 7818 if (c == 0 || c >= 0x7F) | 7822 if (c == 0 || c >= 0x7F) |
| 7819 return CSSPropertyInvalid; // illegal character | 7823 return CSSPropertyInvalid; // illegal character |
| 7820 buffer[i] = toASCIILower(c); | 7824 buffer[i] = toASCIILower(c); |
| 7821 } | 7825 } |
| 7822 buffer[length] = '\0'; | 7826 buffer[length] = '\0'; |
| 7823 | 7827 |
| 7824 const char* name = buffer; | 7828 const char* name = buffer; |
| 7825 const Property* hashTableEntry = findProperty(name, length); | 7829 const Property* hashTableEntry = findProperty(name, length); |
| 7826 if (!hashTableEntry) | 7830 if (!hashTableEntry) |
| 7827 return CSSPropertyInvalid; | 7831 return CSSPropertyInvalid; |
| 7828 CSSPropertyID property = static_cast<CSSPropertyID>(hashTableEntry->id); | 7832 CSSPropertyID property = static_cast<CSSPropertyID>(hashTableEntry->id); |
| 7829 if (!CSSPropertyMetadata::isEnabledProperty(property)) | 7833 if (!CSSPropertyMetadata::isEnabledProperty(property)) |
| 7830 return CSSPropertyInvalid; | 7834 return CSSPropertyInvalid; |
| 7831 return property; | 7835 return property; |
| 7832 } | 7836 } |
| 7833 | 7837 |
| 7834 CSSPropertyID cssPropertyID(const String& string) | 7838 CSSPropertyID unresolvedCSSPropertyID(const String& string) |
| 7835 { | 7839 { |
| 7836 unsigned length = string.length(); | 7840 unsigned length = string.length(); |
| 7837 | 7841 |
| 7838 if (!length) | 7842 if (!length) |
| 7839 return CSSPropertyInvalid; | 7843 return CSSPropertyInvalid; |
| 7840 if (length > maxCSSPropertyNameLength) | 7844 if (length > maxCSSPropertyNameLength) |
| 7841 return CSSPropertyInvalid; | 7845 return CSSPropertyInvalid; |
| 7842 | 7846 |
| 7843 return string.is8Bit() ? cssPropertyID(string.characters8(), length) : cssPr
opertyID(string.characters16(), length); | 7847 return string.is8Bit() ? unresolvedCSSPropertyID(string.characters8(), lengt
h) : unresolvedCSSPropertyID(string.characters16(), length); |
| 7844 } | 7848 } |
| 7845 | 7849 |
| 7846 CSSPropertyID cssPropertyID(const CSSParserString& string) | 7850 CSSPropertyID cssPropertyID(const String& string) |
| 7851 { |
| 7852 return resolveCSSPropertyID(unresolvedCSSPropertyID(string)); |
| 7853 } |
| 7854 |
| 7855 CSSPropertyID unresolvedCSSPropertyID(const CSSParserString& string) |
| 7847 { | 7856 { |
| 7848 unsigned length = string.length(); | 7857 unsigned length = string.length(); |
| 7849 | 7858 |
| 7850 if (!length) | 7859 if (!length) |
| 7851 return CSSPropertyInvalid; | 7860 return CSSPropertyInvalid; |
| 7852 if (length > maxCSSPropertyNameLength) | 7861 if (length > maxCSSPropertyNameLength) |
| 7853 return CSSPropertyInvalid; | 7862 return CSSPropertyInvalid; |
| 7854 | 7863 |
| 7855 return string.is8Bit() ? cssPropertyID(string.characters8(), length) : cssPr
opertyID(string.characters16(), length); | 7864 return string.is8Bit() ? unresolvedCSSPropertyID(string.characters8(), lengt
h) : unresolvedCSSPropertyID(string.characters16(), length); |
| 7856 } | 7865 } |
| 7857 | 7866 |
| 7858 template <typename CharacterType> | 7867 template <typename CharacterType> |
| 7859 static CSSValueID cssValueKeywordID(const CharacterType* valueKeyword, unsigned
length) | 7868 static CSSValueID cssValueKeywordID(const CharacterType* valueKeyword, unsigned
length) |
| 7860 { | 7869 { |
| 7861 char buffer[maxCSSValueKeywordLength + 1]; // 1 for null character | 7870 char buffer[maxCSSValueKeywordLength + 1]; // 1 for null character |
| 7862 | 7871 |
| 7863 for (unsigned i = 0; i != length; ++i) { | 7872 for (unsigned i = 0; i != length; ++i) { |
| 7864 CharacterType c = valueKeyword[i]; | 7873 CharacterType c = valueKeyword[i]; |
| 7865 if (c == 0 || c >= 0x7F) | 7874 if (c == 0 || c >= 0x7F) |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8485 } | 8494 } |
| 8486 } | 8495 } |
| 8487 | 8496 |
| 8488 if (!list->length()) | 8497 if (!list->length()) |
| 8489 return nullptr; | 8498 return nullptr; |
| 8490 | 8499 |
| 8491 return list.release(); | 8500 return list.release(); |
| 8492 } | 8501 } |
| 8493 | 8502 |
| 8494 } // namespace blink | 8503 } // namespace blink |
| OLD | NEW |