From 71c44843c8881d84519890c888af07cd097d6c59 Mon Sep 17 00:00:00 2001 From: rcancro <@pinterest.com> Date: Wed, 16 Dec 2015 13:14:33 -0800 Subject: [PATCH 1/2] enforce pixels bounds for ASLayout size/position --- AsyncDisplayKit/Layout/ASLayout.mm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/AsyncDisplayKit/Layout/ASLayout.mm b/AsyncDisplayKit/Layout/ASLayout.mm index 92e2d307..745b325e 100644 --- a/AsyncDisplayKit/Layout/ASLayout.mm +++ b/AsyncDisplayKit/Layout/ASLayout.mm @@ -11,6 +11,7 @@ #import "ASLayout.h" #import "ASAssert.h" #import "ASLayoutSpecUtilities.h" +#import "ASInternalHelpers.h" #import CGPoint const CGPointNull = {NAN, NAN}; @@ -37,8 +38,12 @@ extern BOOL CGPointIsNull(CGPoint point) ASLayout *l = [super new]; if (l) { l->_layoutableObject = layoutableObject; - l->_size = size; - l->_position = position; + l->_size = CGSizeMake(ASCeilPixelValue(size.width), ASCeilPixelValue(size.height)); + if (CGPointIsNull(position) == NO) { + l->_position = CGPointMake(ASCeilPixelValue(position.x), ASCeilPixelValue(position.y)); + } else { + l->_position = position; + } l->_sublayouts = [sublayouts copy]; } return l; From 2e6e81e66b2ccebd0ae19ac3140830beaa2d37aa Mon Sep 17 00:00:00 2001 From: rcancro <@pinterest.com> Date: Wed, 16 Dec 2015 15:34:30 -0800 Subject: [PATCH 2/2] Don't allow unitialized or under constrained layouts cause a crash. Should I move the pixel bounds rounding to here instead of leaving it in ASLayout? --- AsyncDisplayKit/ASDisplayNode.mm | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 0ca02217..7758561d 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -1816,8 +1816,28 @@ void recursivelyEnsureDisplayForLayer(CALayer *layer) CGRect subnodeFrame = CGRectZero; for (ASLayout *subnodeLayout in _layout.sublayouts) { ASDisplayNodeAssert([_subnodes containsObject:subnodeLayout.layoutableObject], @"Cached sublayouts must only contain subnodes' layout."); - subnodeFrame.origin = subnodeLayout.position; - subnodeFrame.size = subnodeLayout.size; + CGPoint adjustedOrigin = subnodeLayout.position; + if (isfinite(adjustedOrigin.x) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid position"); + adjustedOrigin.x = 0; + } + if (isfinite(adjustedOrigin.y) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid position"); + adjustedOrigin.y = 0; + } + subnodeFrame.origin = adjustedOrigin; + + CGSize adjustedSize = subnodeLayout.size; + if (isfinite(adjustedSize.width) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid size"); + adjustedSize.width = 0; + } + if (isfinite(adjustedSize.height) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid position"); + adjustedSize.height = 0; + } + subnodeFrame.size = adjustedSize; + subnode = ((ASDisplayNode *)subnodeLayout.layoutableObject); [subnode setFrame:subnodeFrame]; }