Index: third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
index fec9a497236d9d93f5b8453eb8943fb6cbf832e3..db1044f75c85b44c0025105ebc2c5274747c4f2a 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -7,10 +7,12 @@ |
#include "core/StylePropertyShorthand.h" |
#include "core/css/CSSCalculationValue.h" |
+#include "core/css/CSSCursorImageValue.h" |
#include "core/css/CSSCustomIdentValue.h" |
#include "core/css/CSSFontFaceSrcValue.h" |
#include "core/css/CSSFontFeatureValue.h" |
#include "core/css/CSSFunctionValue.h" |
+#include "core/css/CSSImageSetValue.h" |
#include "core/css/CSSPathValue.h" |
#include "core/css/CSSPrimitiveValueMappings.h" |
#include "core/css/CSSQuadValue.h" |
@@ -2139,6 +2141,94 @@ static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeBaselineShift(CSSParserT |
return consumeLengthOrPercent(range, SVGAttributeMode, ValueRangeAll, UnitlessQuirk::Forbid); |
} |
+PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeImageSet(CSSParserTokenRange& range) |
+{ |
+ CSSParserTokenRange rangeCopy = range; |
+ CSSParserTokenRange args = consumeFunction(rangeCopy); |
+ RefPtrWillBeRawPtr<CSSImageSetValue> imageSet = CSSImageSetValue::create(); |
+ do { |
+ AtomicString urlValue(consumeUrl(args)); |
+ if (urlValue.isNull()) |
+ return nullptr; |
+ |
+ RefPtrWillBeRawPtr<CSSValue> image = createCSSImageValueWithReferrer(urlValue, completeURL(urlValue)); |
+ imageSet->append(image); |
+ |
+ const CSSParserToken& token = args.consumeIncludingWhitespace(); |
+ if (token.type() != DimensionToken) |
+ return nullptr; |
+ if (String(token.value()) != "x") |
+ return nullptr; |
+ ASSERT(token.unitType() == CSSPrimitiveValue::UnitType::Unknown); |
+ double imageScaleFactor = token.numericValue(); |
+ if (imageScaleFactor <= 0) |
+ return nullptr; |
+ imageSet->append(cssValuePool().createValue(imageScaleFactor, CSSPrimitiveValue::UnitType::Number)); |
+ } while (consumeCommaIncludingWhitespace(args)); |
+ if (!args.atEnd()) |
+ return nullptr; |
+ range = rangeCopy; |
+ return imageSet.release(); |
+} |
+ |
+PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::consumeCursor(CSSParserTokenRange& range) |
+{ |
+ RefPtrWillBeRawPtr<CSSValueList> list = nullptr; |
+ while (!range.atEnd()) { |
+ RefPtrWillBeRawPtr<CSSValue> image = nullptr; |
+ AtomicString uri(consumeUrl(range)); |
+ if (!uri.isNull()) { |
+ image = createCSSImageValueWithReferrer(uri, completeURL(uri)); |
+ } else if (range.peek().type() == FunctionToken && range.peek().functionId() == CSSValueWebkitImageSet) { |
+ image = consumeImageSet(range); |
+ if (!image) |
+ return nullptr; |
+ } else { |
+ break; |
+ } |
+ |
+ double num; |
+ IntPoint hotSpot(-1, -1); |
+ bool hotSpotSpecified = false; |
+ if (consumeNumberRaw(range, num)) { |
+ hotSpot.setX(int(num)); |
+ if (!consumeNumberRaw(range, num)) |
+ return nullptr; |
+ hotSpot.setY(int(num)); |
+ hotSpotSpecified = true; |
+ } |
+ |
+ if (!list) |
+ list = CSSValueList::createCommaSeparated(); |
+ |
+ list->append(CSSCursorImageValue::create(image, hotSpotSpecified, hotSpot)); |
+ if (!consumeCommaIncludingWhitespace(range)) |
+ return nullptr; |
+ } |
+ |
+ CSSValueID id = range.peek().id(); |
+ if (!range.atEnd() && m_context.useCounter()) { |
+ if (id == CSSValueWebkitZoomIn) |
+ m_context.useCounter()->count(UseCounter::PrefixedCursorZoomIn); |
+ else if (id == CSSValueWebkitZoomOut) |
+ m_context.useCounter()->count(UseCounter::PrefixedCursorZoomOut); |
+ } |
+ RefPtrWillBeRawPtr<CSSValue> cursorType; |
+ if (id == CSSValueHand) { |
+ if (inQuirksMode()) // Non-standard behavior |
+ cursorType = cssValuePool().createIdentifierValue(CSSValuePointer); |
+ range.consumeIncludingWhitespace(); |
+ } else if ((id >= CSSValueAuto && id <= CSSValueWebkitZoomOut) || id == CSSValueCopy || id == CSSValueNone) { |
+ cursorType = consumeIdent(range); |
+ } |
+ |
+ if (!list) |
+ return cursorType.release(); |
+ if (cursorType) |
+ list->append(cursorType.release()); |
+ return list.release(); |
+} |
+ |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty) |
{ |
CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); |
@@ -2353,6 +2443,8 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSProperty |
case CSSPropertyRx: |
case CSSPropertyRy: |
return consumeLengthOrPercent(m_range, SVGAttributeMode, ValueRangeAll, UnitlessQuirk::Forbid); |
+ case CSSPropertyCursor: |
+ return consumeCursor(m_range); |
default: |
return nullptr; |
} |