Chromium Code Reviews| Index: third_party/WebKit/Source/core/css/properties/CSSPropertyAPITransform.cpp | 
| diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPITransform.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPITransform.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..a3b03273274d0082ac870c9b017061dcc9a96550 | 
| --- /dev/null | 
| +++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPITransform.cpp | 
| @@ -0,0 +1,202 @@ | 
| +// Copyright 2017 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "core/css/properties/CSSPropertyAPITransform.h" | 
| + | 
| +#include "core/css/CSSFunctionValue.h" | 
| +#include "core/css/CSSValueList.h" | 
| +#include "core/css/parser/CSSParserContext.h" | 
| +#include "core/css/parser/CSSPropertyParserHelpers.h" | 
| +#include "platform/Length.h" | 
| + | 
| +namespace blink { | 
| + | 
| +namespace { | 
| + | 
| +bool ConsumeNumbers(CSSParserTokenRange& args, | 
| + CSSFunctionValue*& transform_value, | 
| + unsigned number_of_arguments) { | 
| + do { | 
| + CSSValue* parsed_value = | 
| + CSSPropertyParserHelpers::ConsumeNumber(args, kValueRangeAll); | 
| + if (!parsed_value) | 
| + return false; | 
| + transform_value->Append(*parsed_value); | 
| + if (--number_of_arguments && | 
| + !CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(args)) | 
| 
 
alancutter (OOO until 2018)
2017/04/20 03:33:12
Let's give multiline ifs braces in this file (and
 
Bugs Nash
2017/04/20 04:01:51
Done.
 
 | 
| + return false; | 
| + } while (number_of_arguments); | 
| + return true; | 
| +} | 
| + | 
| +bool ConsumePerspective(CSSParserTokenRange& args, | 
| + const CSSParserContext* context, | 
| + CSSFunctionValue*& transform_value, | 
| + bool use_legacy_parsing) { | 
| + CSSPrimitiveValue* parsed_value = CSSPropertyParserHelpers::ConsumeLength( | 
| + args, context->Mode(), kValueRangeNonNegative); | 
| + if (!parsed_value && use_legacy_parsing) { | 
| + double perspective; | 
| + if (!CSSPropertyParserHelpers::ConsumeNumberRaw(args, perspective) || | 
| + perspective < 0) | 
| + return false; | 
| + context->Count(UseCounter::kUnitlessPerspectiveInTransformProperty); | 
| + parsed_value = CSSPrimitiveValue::Create( | 
| + perspective, CSSPrimitiveValue::UnitType::kPixels); | 
| + } | 
| + if (!parsed_value) | 
| + return false; | 
| + transform_value->Append(*parsed_value); | 
| + return true; | 
| +} | 
| + | 
| +bool ConsumeTranslate3d(CSSParserTokenRange& args, | 
| + CSSParserMode css_parser_mode, | 
| + CSSFunctionValue*& transform_value) { | 
| + unsigned number_of_arguments = 2; | 
| + CSSValue* parsed_value = nullptr; | 
| + do { | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeLengthOrPercent( | 
| + args, css_parser_mode, kValueRangeAll); | 
| + if (!parsed_value) | 
| + return false; | 
| + transform_value->Append(*parsed_value); | 
| + if (!CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(args)) | 
| + return false; | 
| + } while (--number_of_arguments); | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeLength(args, css_parser_mode, | 
| + kValueRangeAll); | 
| + if (!parsed_value) | 
| + return false; | 
| + transform_value->Append(*parsed_value); | 
| + return true; | 
| +} | 
| + | 
| +CSSValue* ConsumeTransformValue(CSSParserTokenRange& range, | 
| + const CSSParserContext* context, | 
| + bool use_legacy_parsing) { | 
| + CSSValueID function_id = range.Peek().FunctionId(); | 
| + if (function_id == CSSValueInvalid) | 
| + return nullptr; | 
| + CSSParserTokenRange args = CSSPropertyParserHelpers::ConsumeFunction(range); | 
| + if (args.AtEnd()) | 
| + return nullptr; | 
| + CSSFunctionValue* transform_value = CSSFunctionValue::Create(function_id); | 
| + CSSValue* parsed_value = nullptr; | 
| + switch (function_id) { | 
| + case CSSValueRotate: | 
| + case CSSValueRotateX: | 
| + case CSSValueRotateY: | 
| + case CSSValueRotateZ: | 
| + case CSSValueSkewX: | 
| + case CSSValueSkewY: | 
| + case CSSValueSkew: | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeAngle(args); | 
| + if (!parsed_value) | 
| + return nullptr; | 
| + if (function_id == CSSValueSkew && | 
| + CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(args)) { | 
| + transform_value->Append(*parsed_value); | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeAngle(args); | 
| + if (!parsed_value) | 
| + return nullptr; | 
| + } | 
| + break; | 
| + case CSSValueScaleX: | 
| + case CSSValueScaleY: | 
| + case CSSValueScaleZ: | 
| + case CSSValueScale: | 
| + parsed_value = | 
| + CSSPropertyParserHelpers::ConsumeNumber(args, kValueRangeAll); | 
| + if (!parsed_value) | 
| + return nullptr; | 
| + if (function_id == CSSValueScale && | 
| + CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(args)) { | 
| + transform_value->Append(*parsed_value); | 
| + parsed_value = | 
| + CSSPropertyParserHelpers::ConsumeNumber(args, kValueRangeAll); | 
| + if (!parsed_value) | 
| + return nullptr; | 
| + } | 
| + break; | 
| + case CSSValuePerspective: | 
| + if (!ConsumePerspective(args, context, transform_value, | 
| + use_legacy_parsing)) | 
| + return nullptr; | 
| + break; | 
| + case CSSValueTranslateX: | 
| + case CSSValueTranslateY: | 
| + case CSSValueTranslate: | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeLengthOrPercent( | 
| + args, context->Mode(), kValueRangeAll); | 
| + if (!parsed_value) | 
| + return nullptr; | 
| + if (function_id == CSSValueTranslate && | 
| + CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(args)) { | 
| + transform_value->Append(*parsed_value); | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeLengthOrPercent( | 
| + args, context->Mode(), kValueRangeAll); | 
| + if (!parsed_value) | 
| + return nullptr; | 
| + } | 
| + break; | 
| + case CSSValueTranslateZ: | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeLength( | 
| + args, context->Mode(), kValueRangeAll); | 
| + break; | 
| + case CSSValueMatrix: | 
| + case CSSValueMatrix3d: | 
| + if (!ConsumeNumbers(args, transform_value, | 
| + (function_id == CSSValueMatrix3d) ? 16 : 6)) | 
| + return nullptr; | 
| + break; | 
| + case CSSValueScale3d: | 
| + if (!ConsumeNumbers(args, transform_value, 3)) | 
| + return nullptr; | 
| + break; | 
| + case CSSValueRotate3d: | 
| + if (!ConsumeNumbers(args, transform_value, 3) || | 
| + !CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(args)) | 
| + return nullptr; | 
| + parsed_value = CSSPropertyParserHelpers::ConsumeAngle(args); | 
| + if (!parsed_value) | 
| + return nullptr; | 
| + break; | 
| + case CSSValueTranslate3d: | 
| + if (!ConsumeTranslate3d(args, context->Mode(), transform_value)) | 
| + return nullptr; | 
| + break; | 
| + default: | 
| + return nullptr; | 
| + } | 
| + if (parsed_value) | 
| + transform_value->Append(*parsed_value); | 
| + if (!args.AtEnd()) | 
| + return nullptr; | 
| + return transform_value; | 
| +} | 
| + | 
| +} // namespace | 
| + | 
| +const CSSValue* CSSPropertyAPITransform::parseSingleValue( | 
| + CSSParserTokenRange& range, | 
| + const CSSParserContext& context, | 
| + CSSPropertyID unresolved_property) { | 
| + if (range.Peek().Id() == CSSValueNone) | 
| + return CSSPropertyParserHelpers::ConsumeIdent(range); | 
| + | 
| + CSSValueList* list = CSSValueList::CreateSpaceSeparated(); | 
| + do { | 
| + CSSValue* parsed_transform_value = ConsumeTransformValue( | 
| + range, &context, | 
| + unresolved_property == CSSPropertyAliasWebkitTransform); | 
| + if (!parsed_transform_value) | 
| + return nullptr; | 
| + list->Append(*parsed_transform_value); | 
| + } while (!range.AtEnd()); | 
| + | 
| + return list; | 
| +} | 
| + | 
| +} // namespace blink |