From 5c158690873adbcd387a330befbbfa5738952a70 Mon Sep 17 00:00:00 2001 From: Adlai Holler Date: Wed, 9 Nov 2016 10:25:02 +0900 Subject: [PATCH] Disable Text Node Fast Path (#2581) * Disable text node fast path * Actually commit the test change --- AsyncDisplayKit/TextKit/ASTextKitRenderer.mm | 15 +++++++++------ .../ASTextNodeSnapshotTests.m | 6 ++++-- .../testThatSlowPathTruncationWorks@2x.png | Bin 4018 -> 3491 bytes .../testThatSlowPathTruncationWorks@2x.png | Bin 3974 -> 3452 bytes 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/AsyncDisplayKit/TextKit/ASTextKitRenderer.mm b/AsyncDisplayKit/TextKit/ASTextKitRenderer.mm index b7e333e86b..d4246b2a1c 100755 --- a/AsyncDisplayKit/TextKit/ASTextKitRenderer.mm +++ b/AsyncDisplayKit/TextKit/ASTextKitRenderer.mm @@ -205,12 +205,15 @@ static NSCharacterSet *_defaultAvoidTruncationCharacterSet() - (BOOL)canUseFastPath { - return self.isScaled == NO - && self.usesCustomTruncation == NO - && self.usesExclusionPaths == NO - // NSAttributedString drawing methods ignore usesLineFragmentOrigin if max line count 1, - // rendering them useless: - && (_attributes.maximumNumberOfLines != 1 || isinf(_constrainedSize.width)); + return NO; +// Fast path is temporarily disabled, because it's crashing in production. +// NOTE: Remember to re-enable testFastPathTruncation when we re-enable this. +// return self.isScaled == NO +// && self.usesCustomTruncation == NO +// && self.usesExclusionPaths == NO +// // NSAttributedString drawing methods ignore usesLineFragmentOrigin if max line count 1, +// // rendering them useless: +// && (_attributes.maximumNumberOfLines != 1 || isinf(_constrainedSize.width)); } #pragma mark - Drawing diff --git a/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m b/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m index a819ba2f22..1dac0c198c 100644 --- a/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m +++ b/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m @@ -75,7 +75,8 @@ ASSnapshotVerifyView(backgroundView, nil); } -- (void)testThatFastPathTruncationWorks +// This test is disabled because the fast-path is disabled. +- (void)DISABLED_testThatFastPathTruncationWorks { ASTextNode *textNode = [[ASTextNode alloc] init]; textNode.attributedText = [[NSAttributedString alloc] initWithString:@"Quality is Important" attributes:@{ NSForegroundColorAttributeName: [UIColor blueColor], NSFontAttributeName: [UIFont italicSystemFontOfSize:24] }]; @@ -87,8 +88,9 @@ { ASTextNode *textNode = [[ASTextNode alloc] init]; textNode.attributedText = [[NSAttributedString alloc] initWithString:@"Quality is Important" attributes:@{ NSForegroundColorAttributeName: [UIColor blueColor], NSFontAttributeName: [UIFont italicSystemFontOfSize:24] }]; - [textNode layoutThatFits:ASSizeRangeMake(CGSizeZero, CGSizeMake(100, 50))]; + // Set exclusion paths to trigger slow path textNode.exclusionPaths = @[ [UIBezierPath bezierPath] ]; + [textNode layoutThatFits:ASSizeRangeMake(CGSizeZero, CGSizeMake(100, 50))]; ASSnapshotVerifyNode(textNode, nil); } diff --git a/AsyncDisplayKitTests/ReferenceImages_64/ASTextNodeSnapshotTests/testThatSlowPathTruncationWorks@2x.png b/AsyncDisplayKitTests/ReferenceImages_64/ASTextNodeSnapshotTests/testThatSlowPathTruncationWorks@2x.png index dcae0039092c3ce3d71e5010f4d64442ad92bf72..4d68f59813ee2482129851cd535aa03eee16d6fc 100644 GIT binary patch literal 3491 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 diff --git a/AsyncDisplayKitTests/ReferenceImages_iOS_10/ASTextNodeSnapshotTests/testThatSlowPathTruncationWorks@2x.png b/AsyncDisplayKitTests/ReferenceImages_iOS_10/ASTextNodeSnapshotTests/testThatSlowPathTruncationWorks@2x.png index bf816c2ed4b7818599b00b5f06df29c7f770d53e..18de8b27fe77534b8bb48847963d8009c1a67889 100644 GIT binary patch literal 3452 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 Y;Ob3abZ&ii_bCEssp+fMD%(c>2T9L&<^TWy delta 3945 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 Di%6DS