Skip to content

Commit 79cdc74

Browse files
author
Copilot CI
committed
Harden iOS safe area edge handling
Handle floating keyboard geometry, preserve UIKit-adjusted scroll insets, and avoid redundant ancestor work while retaining layout-order correctness. Add focused device and specificity regressions for every exact-head review finding. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: de9c7c01-82c4-42fd-9ab7-882279aadd15
1 parent 104f814 commit 79cdc74

4 files changed

Lines changed: 401 additions & 19 deletions

File tree

src/Controls/tests/Core.UnitTests/SafeAreaTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,42 @@ public void HasExplicitSafeAreaEdges_StyleValueCountsAsExplicit()
435435
Assert.True(((ISafeAreaElement)layout).HasExplicitSafeAreaEdges);
436436
}
437437

438+
[Fact]
439+
public void SafeAreaEdgesSpecificityChangesUpdateHandlerOnlyOnce()
440+
{
441+
var view = new CustomSafeAreaView();
442+
var defaultEdges = view.SafeAreaEdges;
443+
var styleSpecificity = new SetterSpecificity(
444+
SetterSpecificity.StyleLocal,
445+
id: 0,
446+
@class: 0,
447+
type: 0);
448+
449+
view.ResetSafeAreaHandlerUpdateCount();
450+
view.SetValue(CustomSafeAreaView.SafeAreaEdgesProperty, defaultEdges, styleSpecificity);
451+
452+
Assert.True(((ISafeAreaElement)view).HasExplicitSafeAreaEdges);
453+
Assert.Equal(1, view.SafeAreaHandlerUpdateCount);
454+
455+
view.SetValue(CustomSafeAreaView.SafeAreaEdgesProperty, defaultEdges, styleSpecificity);
456+
457+
Assert.Equal(1, view.SafeAreaHandlerUpdateCount);
458+
459+
view.SetValue(
460+
CustomSafeAreaView.SafeAreaEdgesProperty,
461+
defaultEdges,
462+
SetterSpecificity.ManualValueSetter);
463+
464+
Assert.Equal(2, view.SafeAreaHandlerUpdateCount);
465+
466+
view.SetValue(
467+
CustomSafeAreaView.SafeAreaEdgesProperty,
468+
defaultEdges,
469+
SetterSpecificity.ManualValueSetter);
470+
471+
Assert.Equal(2, view.SafeAreaHandlerUpdateCount);
472+
}
473+
438474
[Fact]
439475
public void HasExplicitSafeAreaEdges_BindingValueCountsAsExplicit()
440476
{
@@ -462,12 +498,24 @@ sealed class CustomSafeAreaView : View, ISafeAreaElement
462498
{
463499
public static readonly BindableProperty SafeAreaEdgesProperty = SafeAreaElement.SafeAreaEdgesProperty;
464500

501+
public int SafeAreaHandlerUpdateCount { get; private set; }
502+
465503
public SafeAreaEdges SafeAreaEdges
466504
{
467505
get => (SafeAreaEdges)GetValue(SafeAreaEdgesProperty);
468506
set => SetValue(SafeAreaEdgesProperty, value);
469507
}
470508

509+
public void ResetSafeAreaHandlerUpdateCount() => SafeAreaHandlerUpdateCount = 0;
510+
511+
private protected override void UpdateHandlerValue(string propertyName, bool valueChanged)
512+
{
513+
if (propertyName == SafeAreaEdgesProperty.PropertyName && valueChanged)
514+
SafeAreaHandlerUpdateCount++;
515+
516+
base.UpdateHandlerValue(propertyName, valueChanged);
517+
}
518+
471519
bool ISafeAreaElement.HasExplicitSafeAreaEdges => SafeAreaElement.IsSafeAreaEdgesSet(this);
472520

473521
SafeAreaEdges ISafeAreaElement.GetDefaultSafeAreaEdges() => SafeAreaEdges.Container;

0 commit comments

Comments
 (0)