| Index: third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| index d23f9a0d730630f9196c543fd6d5371a524537da..35b4e0e744576319b32198c8292875c36860682e 100644
|
| --- a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| +++ b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| @@ -54,7 +54,6 @@
|
| #include "core/css/parser/CSSParserFastPaths.h"
|
| #include "core/css/parser/CSSParserValues.h"
|
| #include "core/frame/UseCounter.h"
|
| -#include "core/layout/LayoutTheme.h"
|
| #include "core/style/GridCoordinate.h"
|
| #include "core/svg/SVGPathUtilities.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| @@ -1283,12 +1282,6 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
|
| return parse4Values(propId, paddingShorthand().properties(), important);
|
| case CSSPropertyFlexFlow:
|
| return parseShorthand(propId, flexFlowShorthand(), important);
|
| - case CSSPropertyFont:
|
| - // [ [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]?
|
| - // 'font-family' ] | caption | icon | menu | message-box | small-caption | status-bar | inherit
|
| - if (id >= CSSValueCaption && id <= CSSValueStatusBar)
|
| - return parseSystemFont(important);
|
| - return parseFont(important);
|
| case CSSPropertyListStyle:
|
| return parseShorthand(propId, listStyleShorthand(), important);
|
| case CSSPropertyWebkitColumns:
|
| @@ -1386,6 +1379,7 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import
|
| case CSSPropertyFontSize:
|
| case CSSPropertyLineHeight:
|
| case CSSPropertyRotate:
|
| + case CSSPropertyFont:
|
| validPrimitive = false;
|
| break;
|
|
|
| @@ -4362,277 +4356,6 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseBasicShape()
|
| return shape.release();
|
| }
|
|
|
| -// [ 'font-style' || 'font-variant' || 'font-weight' ]? 'font-size' [ / 'line-height' ]? 'font-family'
|
| -bool CSSPropertyParser::parseFont(bool important)
|
| -{
|
| - // Let's check if there is an inherit or initial somewhere in the shorthand.
|
| - for (unsigned i = 0; i < m_valueList->size(); ++i) {
|
| - if (m_valueList->valueAt(i)->id == CSSValueInherit || m_valueList->valueAt(i)->id == CSSValueInitial)
|
| - return false;
|
| - }
|
| -
|
| - ShorthandScope scope(this, CSSPropertyFont);
|
| - // Optional font-style, font-variant and font-weight.
|
| - bool fontStyleParsed = false;
|
| - bool fontVariantParsed = false;
|
| - bool fontWeightParsed = false;
|
| - bool fontStretchParsed = false;
|
| - CSSParserValue* value = m_valueList->current();
|
| - for (; value; value = m_valueList->next()) {
|
| - if (!fontStyleParsed && CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyFontStyle, value->id)) {
|
| - addProperty(CSSPropertyFontStyle, cssValuePool().createIdentifierValue(value->id), important);
|
| - fontStyleParsed = true;
|
| - } else if (!fontVariantParsed && (value->id == CSSValueNormal || value->id == CSSValueSmallCaps)) {
|
| - // Font variant in the shorthand is particular, it only accepts normal or small-caps.
|
| - addProperty(CSSPropertyFontVariant, cssValuePool().createIdentifierValue(value->id), important);
|
| - fontVariantParsed = true;
|
| - } else if (!fontWeightParsed && parseFontWeight(important)) {
|
| - fontWeightParsed = true;
|
| - } else if (!fontStretchParsed && CSSParserFastPaths::isValidKeywordPropertyAndValue(CSSPropertyFontStretch, value->id)) {
|
| - addProperty(CSSPropertyFontStretch, cssValuePool().createIdentifierValue(value->id), important);
|
| - fontStretchParsed = true;
|
| - } else {
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (!value)
|
| - return false;
|
| -
|
| - if (!fontStyleParsed)
|
| - addProperty(CSSPropertyFontStyle, cssValuePool().createIdentifierValue(CSSValueNormal), important, true);
|
| - if (!fontVariantParsed)
|
| - addProperty(CSSPropertyFontVariant, cssValuePool().createIdentifierValue(CSSValueNormal), important, true);
|
| - if (!fontWeightParsed)
|
| - addProperty(CSSPropertyFontWeight, cssValuePool().createIdentifierValue(CSSValueNormal), important, true);
|
| - if (!fontStretchParsed)
|
| - addProperty(CSSPropertyFontStretch, cssValuePool().createIdentifierValue(CSSValueNormal), important, true);
|
| -
|
| - // Now a font size _must_ come.
|
| - // <absolute-size> | <relative-size> | <length> | <percentage> | inherit
|
| - if (!parseFontSize(important))
|
| - return false;
|
| -
|
| - value = m_valueList->current();
|
| - if (!value)
|
| - return false;
|
| -
|
| - if (isForwardSlashOperator(value)) {
|
| - // The line-height property.
|
| - value = m_valueList->next();
|
| - if (!value)
|
| - return false;
|
| - RefPtrWillBeRawPtr<CSSPrimitiveValue> lineHeight = parseLineHeight();
|
| - if (!lineHeight)
|
| - return false;
|
| - addProperty(CSSPropertyLineHeight, lineHeight.release(), important);
|
| - } else {
|
| - addProperty(CSSPropertyLineHeight, cssValuePool().createIdentifierValue(CSSValueNormal), important, true);
|
| - }
|
| -
|
| - // Font family must come now.
|
| - RefPtrWillBeRawPtr<CSSValue> parsedFamilyValue = parseFontFamily();
|
| - if (!parsedFamilyValue)
|
| - return false;
|
| -
|
| - addProperty(CSSPropertyFontFamily, parsedFamilyValue.release(), important);
|
| -
|
| - // FIXME: http://www.w3.org/TR/2011/WD-css3-fonts-20110324/#font-prop requires that
|
| - // "font-stretch", "font-size-adjust", and "font-kerning" be reset to their initial values
|
| - // but we don't seem to support them at the moment. They should also be added here once implemented.
|
| - if (m_valueList->current())
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool CSSPropertyParser::parseSystemFont(bool important)
|
| -{
|
| - CSSValueID systemFontID = m_valueList->valueAt(0)->id;
|
| - ASSERT(systemFontID >= CSSValueCaption && systemFontID <= CSSValueStatusBar);
|
| - if (m_valueList->next())
|
| - return false;
|
| -
|
| - FontStyle fontStyle = FontStyleNormal;
|
| - FontWeight fontWeight = FontWeightNormal;
|
| - float fontSize = 0;
|
| - AtomicString fontFamily;
|
| - LayoutTheme::theme().systemFont(systemFontID, fontStyle, fontWeight, fontSize, fontFamily);
|
| -
|
| - ShorthandScope scope(this, CSSPropertyFont);
|
| - addProperty(CSSPropertyFontStyle, cssValuePool().createIdentifierValue(fontStyle == FontStyleItalic ? CSSValueItalic : CSSValueNormal), important);
|
| - addProperty(CSSPropertyFontWeight, cssValuePool().createValue(fontWeight), important);
|
| - addProperty(CSSPropertyFontSize, cssValuePool().createValue(fontSize, CSSPrimitiveValue::UnitType::Pixels), important);
|
| - RefPtrWillBeRawPtr<CSSValueList> fontFamilyList = CSSValueList::createCommaSeparated();
|
| - fontFamilyList->append(cssValuePool().createFontFamilyValue(fontFamily));
|
| - addProperty(CSSPropertyFontFamily, fontFamilyList.release(), important);
|
| -
|
| - addProperty(CSSPropertyFontStretch, cssValuePool().createIdentifierValue(CSSValueNormal), important);
|
| - addProperty(CSSPropertyFontVariant, cssValuePool().createIdentifierValue(CSSValueNormal), important);
|
| - addProperty(CSSPropertyLineHeight, cssValuePool().createIdentifierValue(CSSValueNormal), important);
|
| - return true;
|
| -}
|
| -
|
| -class FontFamilyValueBuilder {
|
| - STACK_ALLOCATED();
|
| -public:
|
| - FontFamilyValueBuilder(CSSValueList* list)
|
| - : m_list(list)
|
| - {
|
| - }
|
| -
|
| - void add(const CSSParserString& string)
|
| - {
|
| - if (!m_builder.isEmpty())
|
| - m_builder.append(' ');
|
| -
|
| - if (string.is8Bit()) {
|
| - m_builder.append(string.characters8(), string.length());
|
| - return;
|
| - }
|
| -
|
| - m_builder.append(string.characters16(), string.length());
|
| - }
|
| -
|
| - void commit()
|
| - {
|
| - if (m_builder.isEmpty())
|
| - return;
|
| - m_list->append(cssValuePool().createFontFamilyValue(m_builder.toString()));
|
| - m_builder.clear();
|
| - }
|
| -
|
| -private:
|
| - StringBuilder m_builder;
|
| - RawPtrWillBeMember<CSSValueList> m_list;
|
| -};
|
| -
|
| -PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseFontFamily()
|
| -{
|
| - RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
|
| - CSSParserValue* value = m_valueList->current();
|
| -
|
| - FontFamilyValueBuilder familyBuilder(list.get());
|
| - bool inFamily = false;
|
| -
|
| - while (value) {
|
| - CSSParserValue* nextValue = m_valueList->next();
|
| - bool nextValBreaksFont = !nextValue || isComma(nextValue);
|
| - bool nextValIsFontName = nextValue &&
|
| - ((nextValue->id >= CSSValueSerif && nextValue->id <= CSSValueWebkitBody) ||
|
| - (nextValue->unit() == CSSPrimitiveValue::UnitType::String || nextValue->m_unit == CSSParserValue::Identifier));
|
| -
|
| - if (isCSSWideKeyword(*value) && !inFamily) {
|
| - if (nextValBreaksFont)
|
| - return nullptr;
|
| - else if (nextValIsFontName)
|
| - value = nextValue;
|
| - continue;
|
| - }
|
| -
|
| - if (value->id >= CSSValueSerif && value->id <= CSSValueWebkitBody) {
|
| - if (inFamily)
|
| - familyBuilder.add(value->string);
|
| - else if (nextValBreaksFont || !nextValIsFontName)
|
| - list->append(cssValuePool().createIdentifierValue(value->id));
|
| - else {
|
| - familyBuilder.commit();
|
| - familyBuilder.add(value->string);
|
| - inFamily = true;
|
| - }
|
| - } else if (value->unit() == CSSPrimitiveValue::UnitType::String) {
|
| - // Strings never share in a family name.
|
| - inFamily = false;
|
| - familyBuilder.commit();
|
| - list->append(cssValuePool().createFontFamilyValue(value->string));
|
| - } else if (value->m_unit == CSSParserValue::Identifier) {
|
| - if (inFamily)
|
| - familyBuilder.add(value->string);
|
| - else if (nextValBreaksFont || !nextValIsFontName)
|
| - list->append(cssValuePool().createFontFamilyValue(value->string));
|
| - else {
|
| - familyBuilder.commit();
|
| - familyBuilder.add(value->string);
|
| - inFamily = true;
|
| - }
|
| - } else {
|
| - break;
|
| - }
|
| -
|
| - if (!nextValue)
|
| - break;
|
| -
|
| - if (nextValBreaksFont) {
|
| - value = m_valueList->next();
|
| - familyBuilder.commit();
|
| - inFamily = false;
|
| - }
|
| - else if (nextValIsFontName)
|
| - value = nextValue;
|
| - else
|
| - break;
|
| - }
|
| - familyBuilder.commit();
|
| - if (!list->length() || (m_ruleType == StyleRule::FontFace && list->length() > 1))
|
| - list = nullptr;
|
| - return list.release();
|
| -}
|
| -
|
| -PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseLineHeight()
|
| -{
|
| - CSSParserValue* value = m_valueList->current();
|
| - CSSValueID id = value->id;
|
| -
|
| - // normal | <number> | <length> | <percentage> | inherit
|
| - if (id == CSSValueNormal) {
|
| - m_valueList->next();
|
| - return cssValuePool().createIdentifierValue(id);
|
| - }
|
| -
|
| - if (!validUnit(value, FNumber | FLength | FPercent | FNonNeg))
|
| - return nullptr;
|
| - // The line-height property can accept both percents and numbers but additive opertaions are
|
| - // not permitted on them in calc() expressions.
|
| - if (m_parsedCalculation && m_parsedCalculation->category() == CalcPercentNumber) {
|
| - m_parsedCalculation.release();
|
| - return nullptr;
|
| - }
|
| - m_valueList->next();
|
| - return createPrimitiveNumericValue(value);
|
| -}
|
| -
|
| -bool CSSPropertyParser::parseFontSize(bool important)
|
| -{
|
| - CSSParserValue* value = m_valueList->current();
|
| - CSSValueID id = value->id;
|
| - bool validPrimitive = false;
|
| - // <absolute-size> | <relative-size> | <length> | <percentage> | inherit
|
| - if (id >= CSSValueXxSmall && id <= CSSValueLarger)
|
| - validPrimitive = true;
|
| - else
|
| - validPrimitive = validUnit(value, FLength | FPercent | FNonNeg | (inShorthand() ? FUnknown : FUnitlessQuirk));
|
| - if (validPrimitive && (!m_valueList->next() || inShorthand()))
|
| - addProperty(CSSPropertyFontSize, parseValidPrimitive(id, value), important);
|
| - return validPrimitive;
|
| -}
|
| -
|
| -bool CSSPropertyParser::parseFontWeight(bool important)
|
| -{
|
| - CSSParserValue* value = m_valueList->current();
|
| - if (value->id >= CSSValueNormal && value->id <= CSSValueLighter) {
|
| - addProperty(CSSPropertyFontWeight, cssValuePool().createIdentifierValue(value->id), important);
|
| - return true;
|
| - }
|
| - if (value->unit() == CSSPrimitiveValue::UnitType::Number) {
|
| - int weight = static_cast<int>(value->fValue);
|
| - if (!(weight % 100) && weight >= 100 && weight <= 900) {
|
| - addProperty(CSSPropertyFontWeight, cssValuePool().createIdentifierValue(static_cast<CSSValueID>(CSSValue100 + weight / 100 - 1)), important);
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| inline int CSSPropertyParser::colorIntFromValue(CSSParserValue* v)
|
| {
|
| bool isPercent;
|
|
|