summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/geometry
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/geometry')
-rw-r--r--chromium/third_party/blink/renderer/platform/geometry/calculation_value.cc5
-rw-r--r--chromium/third_party/blink/renderer/platform/geometry/layout_unit.h24
-rw-r--r--chromium/third_party/blink/renderer/platform/geometry/length_functions.cc2
-rw-r--r--chromium/third_party/blink/renderer/platform/geometry/length_functions_test.cc17
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