Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/Controls/src/Core/Border/Border.cs
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,12 @@ SafeAreaRegions ISafeAreaView2.GetSafeAreaRegionsForEdge(int edge)
// Use direct property
var regionForEdge = SafeAreaEdges.GetEdge(edge);

if (regionForEdge == SafeAreaRegions.Default)
{
// If no safe area edges are set, return None
return SafeAreaRegions.None;
}

// For Border, return as-is
return regionForEdge;
}
Expand Down
6 changes: 6 additions & 0 deletions src/Controls/src/Core/ContentView/ContentView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ SafeAreaRegions ISafeAreaView2.GetSafeAreaRegionsForEdge(int edge)
// Use direct property
var regionForEdge = SafeAreaEdges.GetEdge(edge);

if (regionForEdge == SafeAreaRegions.Default)
{
// If no safe area edges are set, return None
return SafeAreaRegions.None;
}

// For ContentView, return the region directly
return regionForEdge;
}
Expand Down
14 changes: 9 additions & 5 deletions src/Controls/src/Core/Page/Page.cs
Original file line number Diff line number Diff line change
Expand Up @@ -265,11 +265,15 @@ Thickness ISafeAreaView2.SafeAreaInsets
/// <inheritdoc cref="ISafeAreaView2.GetSafeAreaRegionsForEdge"/>
SafeAreaRegions ISafeAreaView2.GetSafeAreaRegionsForEdge(int edge)
{
// Use new SafeAreaElement method
var regionForEdge = SafeAreaElement.GetEdgeValue(this, edge);

// For Page (but not ContentPage), return as-is
return regionForEdge;
var ignoreSafeArea = ((ISafeAreaView)this).IgnoreSafeArea;
if (ignoreSafeArea)
{
return SafeAreaRegions.None; // If legacy says "ignore", return None (edge-to-edge)
}
else
{
return SafeAreaRegions.Container; // If legacy says "don't ignore", return Container
}
}

/// <summary>
Expand Down
338 changes: 186 additions & 152 deletions src/Controls/tests/TestCases.HostApp/Issues/Issue28986_Border.xaml

Large diffs are not rendered by default.

333 changes: 182 additions & 151 deletions src/Controls/tests/TestCases.HostApp/Issues/Issue28986_ContentView.xaml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#if IOS
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.TestCases.Tests.Issues
{
public class Issue28986_Border : _IssuesUITest
{
public override string Issue => "Test SafeArea Border for per-edge safe area control";

public Issue28986_Border(TestDevice device) : base(device)
{
}

[Test]
[Category(UITestCategories.Border)]
public void SafeAreaBorderBasicFunctionality()
{
var borderContent = App.WaitForElement("BorderContent");

// 1. Ensure SafeAreaEdges is Default
var initialSettings = App.FindElement("CurrentSettings").GetText();
Assert.That(initialSettings, Does.Contain("Left: Default, Top: Default, Right: Default, Bottom: Default"));
var borderWithDefaultSettings = borderContent.GetRect();
// Verify that Border starts at Y=5 when SafeAreaEdges is Default
// Because the border stroke thickness is 5
Assert.That(borderWithDefaultSettings.Y, Is.EqualTo(5), "Border should start at Y=5 when SafeAreaEdges is set to Default");

// 2. Ensure SafeAreaEdges are set to All
App.Tap("ResetAllButton");
var allSettings = App.FindElement("CurrentSettings").GetText();
Assert.That(allSettings, Does.Contain("Left: All, Top: All, Right: All, Bottom: All"));
var borderSafeAreaEdgesAll = App.WaitForElement("BorderContent").GetRect();
Assert.That(borderSafeAreaEdgesAll.Y, Is.GreaterThan(borderWithDefaultSettings.Y), "Border should move down (greater Y position) when SafeAreaEdges changes from Default to All");

// 3. Ensure SafeAreaEdges are set to None (edge-to-edge)
App.Tap("ResetNoneButton");
var noneSettings = App.FindElement("CurrentSettings").GetText();
Assert.That(noneSettings, Does.Contain("Left: None, Top: None, Right: None, Bottom: None"));
var borderSafeAreaEdgesNone = App.WaitForElement("BorderContent").GetRect();
// Verify that Border position is at Y=5 when SafeAreaEdges is None
// This is because the border stroke thickness is 5
Assert.That(borderSafeAreaEdgesNone.Y, Is.EqualTo(5),
"Border should be at Y=5 when SafeAreaEdges is set to None (edge-to-edge)");
}
}
}
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#if IOS
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.TestCases.Tests.Issues
{
public class Issue28986_ContentView : _IssuesUITest
{
public override string Issue => "Test SafeArea ContentView for per-edge safe area control";

public Issue28986_ContentView(TestDevice device) : base(device)
{
}

[Test]
[Category(UITestCategories.Layout)]
public void SafeAreaContentViewBasicFunctionality()
{
var contentViewContent = App.WaitForElement("ContentViewContent");

// 1. Ensure SafeAreaEdges is Default
var initialSettings = App.FindElement("CurrentSettings").GetText();
Assert.That(initialSettings, Does.Contain("Left: Default, Top: Default, Right: Default, Bottom: Default"));
var contentViewWithDefaultSettings = contentViewContent.GetRect();
// Verify that ContentView content starts at Y=0 when SafeAreaEdges is Default
Assert.That(contentViewWithDefaultSettings.Y, Is.EqualTo(0),
"ContentView should start at Y=0 when SafeAreaEdges is set to Default");

// 2. Ensure SafeAreaEdges are set to All
App.Tap("ResetAllButton");
var allSettings = App.FindElement("CurrentSettings").GetText();
Assert.That(allSettings, Does.Contain("Left: All, Top: All, Right: All, Bottom: All"));
var contentViewSafeAreaEdgesAll = App.WaitForElement("ContentViewContent").GetRect();
Assert.That(contentViewSafeAreaEdgesAll.Y, Is.GreaterThan(contentViewWithDefaultSettings.Y),
"ContentView should move down (greater Y position) when SafeAreaEdges changes from Default to All");

// 3. Ensure SafeAreaEdges are set to None (edge-to-edge)
App.Tap("ResetNoneButton");
var noneSettings = App.FindElement("CurrentSettings").GetText();
Assert.That(noneSettings, Does.Contain("Left: None, Top: None, Right: None, Bottom: None"));
var contentViewSafeAreaEdgesNone = App.WaitForElement("ContentViewContent").GetRect();
// Verify that ContentView position is at Y=0 when SafeAreaEdges is None
Assert.That(contentViewSafeAreaEdgesNone.Y, Is.EqualTo(0),
"ContentView should be at Y=0 when SafeAreaEdges is set to None (edge-to-edge)");
}
}
}
#endif
Loading