diff --git a/Source/ASTextNode.mm b/Source/ASTextNode.mm index 71138045e..7995d206b 100644 --- a/Source/ASTextNode.mm +++ b/Source/ASTextNode.mm @@ -464,12 +464,16 @@ - (void)setAttributedText:(NSAttributedString *)attributedText attributedText = [[NSAttributedString alloc] initWithString:@"" attributes:nil]; } + NSAttributedString *oldAttributedText = nil; + { ASLockScopeSelf(); if (ASObjectIsEqual(attributedText, _attributedText)) { return; } + oldAttributedText = _attributedText; + NSAttributedString *cleanedAttributedString = ASCleanseAttributedStringOfCoreTextAttributes(attributedText); // Invalidating the truncation text must be done while we still hold the lock. Because after we release it, @@ -498,7 +502,12 @@ - (void)setAttributedText:(NSAttributedString *)attributedText // Accessiblity const auto currentAttributedText = self.attributedText; // Grab attributed string again in case it changed in the meantime self.accessibilityLabel = self.defaultAccessibilityLabel; - self.isAccessibilityElement = (currentAttributedText.length != 0); // We're an accessibility element by default if there is a string. + + // We update the isAccessibilityElement setting if this node is not switching between strings. + if (oldAttributedText.length == 0 || currentAttributedText.length == 0) { + // We're an accessibility element by default if there is a string. + self.isAccessibilityElement = (currentAttributedText.length != 0); + } #if AS_TEXTNODE_RECORD_ATTRIBUTED_STRINGS [ASTextNode _registerAttributedText:_attributedText]; diff --git a/Source/ASTextNode2.mm b/Source/ASTextNode2.mm index 2eb0ad5aa..ceca414a0 100644 --- a/Source/ASTextNode2.mm +++ b/Source/ASTextNode2.mm @@ -396,6 +396,7 @@ - (void)setAttributedText:(NSAttributedString *)attributedText // Holding it for the duration of the method is more efficient in this case. ASLockScopeSelf(); + NSAttributedString *oldAttributedText = _attributedText; if (!ASCompareAssignCopy(_attributedText, attributedText)) { return; } @@ -418,7 +419,12 @@ - (void)setAttributedText:(NSAttributedString *)attributedText // Accessiblity self.accessibilityLabel = self.defaultAccessibilityLabel; - self.isAccessibilityElement = (length != 0); // We're an accessibility element by default if there is a string. + + // We update the isAccessibilityElement setting if this node is not switching between strings. + if (oldAttributedText.length == 0 || length == 0) { + // We're an accessibility element by default if there is a string. + self.isAccessibilityElement = (length != 0); + } #if AS_TEXTNODE2_RECORD_ATTRIBUTED_STRINGS [ASTextNode _registerAttributedText:_attributedText]; diff --git a/Tests/ASTextNode2Tests.mm b/Tests/ASTextNode2Tests.mm index b8f08ed45..39d3b7aa6 100644 --- a/Tests/ASTextNode2Tests.mm +++ b/Tests/ASTextNode2Tests.mm @@ -91,4 +91,20 @@ - (void)testAccessibility _textNode.defaultAccessibilityLabel, _attributedText.string); } +- (void)testRespectingAccessibilitySetting +{ + ASTextNode2 *textNode = [[ASTextNode2 alloc] init]; + textNode.attributedText = _attributedText; + textNode.isAccessibilityElement = NO; + + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"new string"]; + XCTAssertFalse(textNode.isAccessibilityElement); + + // Ensure removing string on an accessible text node updates the setting. + ASTextNode2 *accessibleTextNode = [ASTextNode2 new]; + accessibleTextNode.attributedText = _attributedText; + accessibleTextNode.attributedText = nil; + XCTAssertFalse(accessibleTextNode.isAccessibilityElement); +} + @end diff --git a/Tests/ASTextNodeTests.mm b/Tests/ASTextNodeTests.mm index dd6ae4c94..77b6954bb 100644 --- a/Tests/ASTextNodeTests.mm +++ b/Tests/ASTextNodeTests.mm @@ -175,6 +175,23 @@ - (void)testAccessibility XCTAssertTrue([_textNode.accessibilityLabel isEqualToString:_attributedText.string], @"Accessibility label is incorrectly set to \n%@\n when it should be \n%@\n", _textNode.accessibilityLabel, _attributedText.string); } +- (void)testRespectingAccessibilitySetting +{ + ASTextNode *textNode = [ASTextNode new]; + + textNode.attributedText = _attributedText; + textNode.isAccessibilityElement = NO; + + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"new string"]; + XCTAssertFalse(textNode.isAccessibilityElement); + + // Ensure removing string on an accessible text node updates the setting. + ASTextNode *accessibleTextNode = [ASTextNode new]; + accessibleTextNode.attributedText = _attributedText; + accessibleTextNode.attributedText = nil; + XCTAssertFalse(accessibleTextNode.isAccessibilityElement); +} + - (void)testLinkAttribute { NSString *linkAttributeName = @"MockLinkAttributeName";