Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 51bbd24

Browse files
committed
fixes nan
1 parent 466be0d commit 51bbd24

File tree

2 files changed

+70
-9
lines changed

2 files changed

+70
-9
lines changed

shell/platform/darwin/ios/framework/Source/SemanticsObject.mm

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -221,16 +221,39 @@ - (id)accessibilityContainer {
221221

222222
// private methods
223223

224+
- (float)scrollExtentMax {
225+
if (![_semanticsObject isAccessibilityBridgeAlive]) {
226+
return 0.0;
227+
}
228+
float scrollExtentMax = _semanticsObject.node.scrollExtentMax;
229+
if (isnan(scrollExtentMax)) {
230+
scrollExtentMax = 0.0;
231+
} else if (!isfinite(scrollExtentMax)) {
232+
scrollExtentMax = kScrollExtentMaxForInf + [self scrollPosition];
233+
}
234+
return scrollExtentMax;
235+
}
236+
237+
- (float)scrollPosition {
238+
if (![_semanticsObject isAccessibilityBridgeAlive]) {
239+
return 0.0;
240+
}
241+
float scrollPosition = _semanticsObject.node.scrollPosition;
242+
if (isnan(scrollPosition)) {
243+
scrollPosition = 0.0;
244+
}
245+
NSCAssert(isfinite(scrollPosition), @"The scrollPosition must not be infinity");
246+
return scrollPosition;
247+
}
248+
224249
- (CGSize)contentSizeInternal {
225250
CGRect result;
226251
const SkRect& rect = _semanticsObject.node.rect;
227-
float scrollExtentMax = isfinite(_semanticsObject.node.scrollExtentMax)
228-
? _semanticsObject.node.scrollExtentMax
229-
: kScrollExtentMaxForInf + _semanticsObject.node.scrollPosition;
252+
230253
if (_semanticsObject.node.actions & flutter::kVerticalScrollSemanticsActions) {
231-
result = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height() + scrollExtentMax);
254+
result = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height() + [self scrollExtentMax]);
232255
} else if (_semanticsObject.node.actions & flutter::kHorizontalScrollSemanticsActions) {
233-
result = CGRectMake(rect.x(), rect.y(), rect.width() + scrollExtentMax, rect.height());
256+
result = CGRectMake(rect.x(), rect.y(), rect.width() + [self scrollExtentMax], rect.height());
234257
} else {
235258
result = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
236259
}
@@ -242,11 +265,11 @@ - (CGPoint)contentOffsetInternal {
242265
CGPoint origin = self.frame.origin;
243266
const SkRect& rect = _semanticsObject.node.rect;
244267
if (_semanticsObject.node.actions & flutter::kVerticalScrollSemanticsActions) {
245-
result = ConvertPointToGlobal(
246-
_semanticsObject, CGPointMake(rect.x(), rect.y() + _semanticsObject.node.scrollPosition));
268+
result = ConvertPointToGlobal(_semanticsObject,
269+
CGPointMake(rect.x(), rect.y() + [self scrollPosition]));
247270
} else if (_semanticsObject.node.actions & flutter::kHorizontalScrollSemanticsActions) {
248-
result = ConvertPointToGlobal(
249-
_semanticsObject, CGPointMake(rect.x() + _semanticsObject.node.scrollPosition, rect.y()));
271+
result = ConvertPointToGlobal(_semanticsObject,
272+
CGPointMake(rect.x() + [self scrollPosition], rect.y()));
250273
} else {
251274
result = origin;
252275
}

shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,44 @@ - (void)testCanHandleInfiniteScrollExtent {
285285
CGPointMake(0, scrollPosition * effectivelyScale)));
286286
}
287287

288+
- (void)testCanHandleNaNScrollExtent {
289+
fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
290+
new flutter::MockAccessibilityBridge());
291+
fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
292+
293+
float transformScale = 0.5f;
294+
float screenScale = [[bridge->view() window] screen].scale;
295+
float effectivelyScale = transformScale / screenScale;
296+
float x = 10;
297+
float y = 10;
298+
float w = 100;
299+
float h = 200;
300+
float scrollExtentMax = std::nan("");
301+
float scrollPosition = std::nan("");
302+
303+
flutter::SemanticsNode node;
304+
node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
305+
node.actions = flutter::kVerticalScrollSemanticsActions;
306+
node.rect = SkRect::MakeXYWH(x, y, w, h);
307+
node.scrollExtentMax = scrollExtentMax;
308+
node.scrollPosition = scrollPosition;
309+
node.transform = {
310+
transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
311+
FlutterSemanticsObject* delegate = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
312+
FlutterScrollableSemanticsObject* scrollable =
313+
[[FlutterScrollableSemanticsObject alloc] initWithSemanticsObject:delegate];
314+
SemanticsObject* scrollable_object = static_cast<SemanticsObject*>(scrollable);
315+
[scrollable_object setSemanticsNode:&node];
316+
[scrollable_object accessibilityBridgeDidFinishUpdate];
317+
XCTAssertTrue(
318+
CGRectEqualToRect(scrollable.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
319+
w * effectivelyScale, h * effectivelyScale)));
320+
// Content size equal to the scrollable size.
321+
XCTAssertTrue(CGSizeEqualToSize(scrollable.contentSize,
322+
CGSizeMake(w * effectivelyScale, h * effectivelyScale)));
323+
XCTAssertTrue(CGPointEqualToPoint(scrollable.contentOffset, CGPointMake(0, 0)));
324+
}
325+
288326
- (void)testFlutterScrollableSemanticsObjectIsNotHittestable {
289327
fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
290328
new flutter::MockAccessibilityBridge());

0 commit comments

Comments
 (0)