From 3bd8bc3362bc2ecc84a6707dba113263ac42bebf Mon Sep 17 00:00:00 2001 From: Hixie Date: Wed, 10 Feb 2016 10:54:26 -0800 Subject: [PATCH] Improve asserts around BoxConstraints Negative constraints never make sense, so catch those too. Make RenderObject.layout's isNormalized assert use the newer more fancy debug version of isNormalized. --- examples/rendering/lib/sector_layout.dart | 4 ++++ packages/flutter/lib/src/rendering/box.dart | 15 ++++++++++++--- packages/flutter/lib/src/rendering/object.dart | 6 +++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/examples/rendering/lib/sector_layout.dart b/examples/rendering/lib/sector_layout.dart index 5747608cf62..d8b69f4768d 100644 --- a/examples/rendering/lib/sector_layout.dart +++ b/examples/rendering/lib/sector_layout.dart @@ -39,6 +39,10 @@ class SectorConstraints extends Constraints { bool get isTight => minDeltaTheta >= maxDeltaTheta && minDeltaTheta >= maxDeltaTheta; bool get isNormalized => minDeltaRadius <= maxDeltaRadius && minDeltaTheta <= maxDeltaTheta; + bool get debugAssertIsNormalized { + assert(isNormalized); + return isNormalized; + } } class SectorDimensions { diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index 1d283defa90..f6f70b56055 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -272,12 +272,21 @@ class BoxConstraints extends Constraints { /// normalized and have undefined behavior when they are not. In /// checked mode, many of these APIs will assert if the constraints /// are not normalized. - bool get isNormalized => minWidth <= maxWidth && minHeight <= maxHeight; + bool get isNormalized { + return minWidth >= 0.0 && + minWidth <= maxWidth && + minHeight >= 0.0 && + minHeight <= maxHeight; + } - /// Same as [isNormalized] but, in checked mode, throws an exception - /// if isNormalized is false. bool get debugAssertIsNormalized { assert(() { + if (minWidth < 0.0 && minHeight < 0.0) + throw new RenderingError('BoxConstraints has both a negative minimum width and a negative minimum height.\n$this'); + if (minWidth < 0.0) + throw new RenderingError('BoxConstraints has a negative minimum width.\n$this'); + if (minHeight < 0.0) + throw new RenderingError('BoxConstraints has a negative minimum height.\n$this'); if (maxWidth < minWidth && maxHeight < minHeight) throw new RenderingError('BoxConstraints has both width and height constraints non-normalized.\n$this'); if (maxWidth < minWidth) diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index d2d8c400019..1a8225af656 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -353,6 +353,10 @@ abstract class Constraints { /// Whether the constraint is expressed in a consistent manner. bool get isNormalized; + + /// Same as [isNormalized] but, in checked mode, throws an exception + /// if isNormalized is false. + bool get debugAssertIsNormalized; } typedef void RenderObjectVisitor(RenderObject child); @@ -975,7 +979,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { /// implemented here) to return early if the child does not need to do any /// work to update its layout information. void layout(Constraints constraints, { bool parentUsesSize: false }) { - assert(constraints.isNormalized); + assert(constraints.debugAssertIsNormalized); assert(!_debugDoingThisResize); assert(!_debugDoingThisLayout); final RenderObject parent = this.parent;