diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/geometry')
4 files changed, 45 insertions, 3 deletions
diff --git a/chromium/third_party/blink/renderer/platform/geometry/calculation_value.cc b/chromium/third_party/blink/renderer/platform/geometry/calculation_value.cc index ed540165fc9..797e34099d8 100644 --- a/chromium/third_party/blink/renderer/platform/geometry/calculation_value.cc +++ b/chromium/third_party/blink/renderer/platform/geometry/calculation_value.cc @@ -45,8 +45,9 @@ CalculationValue::~CalculationValue() { } float CalculationValue::Evaluate(float max_value) const { - float value = is_expression_ ? value = data_.expression->Evaluate(max_value) - : value = Pixels() + Percent() / 100 * max_value; + float value = + clampTo<float>(is_expression_ ? data_.expression->Evaluate(max_value) + : Pixels() + Percent() / 100 * max_value); return (IsNonNegative() && value < 0) ? 0 : value; } diff --git a/chromium/third_party/blink/renderer/platform/geometry/layout_unit.h b/chromium/third_party/blink/renderer/platform/geometry/layout_unit.h index 19788bffabe..b70b4df9e8b 100644 --- a/chromium/third_party/blink/renderer/platform/geometry/layout_unit.h +++ b/chromium/third_party/blink/renderer/platform/geometry/layout_unit.h @@ -88,6 +88,17 @@ ALWAYS_INLINE int GetMinSaturatedSetResultForTesting() { class PLATFORM_EXPORT LayoutUnit; constexpr bool operator<(const LayoutUnit&, const LayoutUnit&); +// kIndefiniteSize is a special value used within layout code. It is typical +// within layout to have sizes which are only allowed to be non-negative or +// "indefinite". We use the value of "-1" to represent these indefinite values. +// +// It is common to clamp these indefinite values to zero. +// |LayoutUnit::ClampIndefiniteToZero| provides this functionality, and +// additionally DCHECKs that it isn't some other negative value. +// +// TODO(wangxianzhu): Make it a constexpr when LayoutUnit allows it. +#define kIndefiniteSize LayoutUnit(-1) + class LayoutUnit { DISALLOW_NEW(); @@ -208,6 +219,15 @@ class LayoutUnit { return value_ > 0 ? LayoutUnit() : *this; } + LayoutUnit ClampIndefiniteToZero() const { + // We compare to |kFixedPointDenominator| here instead of |kIndefiniteSize| + // as the operator== for LayoutUnit is inlined below. + if (value_ == -kFixedPointDenominator) + return LayoutUnit(); + DCHECK_GE(value_, 0); + return *this; + } + constexpr bool HasFraction() const { return RawValue() % kFixedPointDenominator; } @@ -750,6 +770,10 @@ inline int FloorToInt(LayoutUnit value) { return value.Floor(); } +inline int CeilToInt(LayoutUnit value) { + return value.Ceil(); +} + inline LayoutUnit AbsoluteValue(const LayoutUnit& value) { return value.Abs(); } diff --git a/chromium/third_party/blink/renderer/platform/geometry/length_functions.cc b/chromium/third_party/blink/renderer/platform/geometry/length_functions.cc index f07da329692..e1fd678021a 100644 --- a/chromium/third_party/blink/renderer/platform/geometry/length_functions.cc +++ b/chromium/third_party/blink/renderer/platform/geometry/length_functions.cc @@ -40,7 +40,7 @@ float FloatValueForLength(const Length& length, float maximum_value) { case Length::kFixed: return length.GetFloatValue(); case Length::kPercent: - return static_cast<float>(maximum_value * length.Percent() / 100.0f); + return clampTo<float>(maximum_value * length.Percent() / 100.0f); case Length::kFillAvailable: case Length::kAuto: return static_cast<float>(maximum_value); diff --git a/chromium/third_party/blink/renderer/platform/geometry/length_functions_test.cc b/chromium/third_party/blink/renderer/platform/geometry/length_functions_test.cc new file mode 100644 index 00000000000..86abeb020c6 --- /dev/null +++ b/chromium/third_party/blink/renderer/platform/geometry/length_functions_test.cc @@ -0,0 +1,17 @@ +// Copyright 2020 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 "third_party/blink/renderer/platform/geometry/length_functions.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +TEST(LengthFunctionsTest, OutOfRangePercentage) { + Length max = Length::Percent(std::numeric_limits<float>::max()); + float value = FloatValueForLength(max, 800); + EXPECT_TRUE(isfinite(value)); +} + +} // namespace blink |