From e0f1c9850e33318d647e0e6941a152a6d8be46da Mon Sep 17 00:00:00 2001 From: Jerome Laban Date: Fri, 20 Sep 2019 15:20:00 -0400 Subject: [PATCH 1/2] Fix invalid ImageBrush stack overflow with delayed image reuse --- .../UITests.Shared/UITests.Shared.projitems | 5 ++ .../ImageBrush_SameWithDelay.xaml | 30 ++++++++ .../ImageBrush_SameWithDelay.xaml.cs | 69 +++++++++++++++++++ .../UI/Xaml/Media/ImageBrush.Android.cs | 3 +- 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml create mode 100644 src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml.cs diff --git a/src/SamplesApp/UITests.Shared/UITests.Shared.projitems b/src/SamplesApp/UITests.Shared/UITests.Shared.projitems index 31e6ad467434..5925459cf47d 100644 --- a/src/SamplesApp/UITests.Shared/UITests.Shared.projitems +++ b/src/SamplesApp/UITests.Shared/UITests.Shared.projitems @@ -2061,6 +2061,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -3494,6 +3498,7 @@ ImageBrushWithScaleTransform.xaml + ImageBrush_StreamSource.xaml diff --git a/src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml b/src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml new file mode 100644 index 000000000000..0c197053dbcc --- /dev/null +++ b/src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml.cs b/src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml.cs new file mode 100644 index 000000000000..b6e51e3c632c --- /dev/null +++ b/src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrush_SameWithDelay.xaml.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using Uno.UI.Samples.Controls; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; + +// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 + +namespace UITests.Shared.Windows_UI_Xaml_Media.ImageBrushTests +{ + [SampleControlInfo("ImageBrushTestControl", "ImageBrush_SameWithDelay")] + public sealed partial class ImageBrush_SameWithDelay : UserControl + { + BrushContext _ctx = new BrushContext(); + + public ImageBrush_SameWithDelay() + { + this.InitializeComponent(); + + DataContext = _ctx; + + Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => _ctx.ImgSource = "https://lh5.ggpht.com/lxBMauupBiLIpgOgu5apeiX_YStXeHRLK1oneS4NfwwNt7fGDKMP0KpQIMwfjfL9GdHRVEavmg7gOrj5RYC4qwrjh3Y0jCWFDj83jzg"); + + imageBrush.ImageOpened += (s, e) => { + _ctx.ImgSource2 = "https://lh5.ggpht.com/lxBMauupBiLIpgOgu5apeiX_YStXeHRLK1oneS4NfwwNt7fGDKMP0KpQIMwfjfL9GdHRVEavmg7gOrj5RYC4qwrjh3Y0jCWFDj83jzg"; + }; + } + } + + public class BrushContext : INotifyPropertyChanged + { + private string _imageSource; + private string _imageSource2; + + public string ImgSource + { + get { return _imageSource; } + set + { + _imageSource = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ImgSource))); + } + } + + public string ImgSource2 + { + get { return _imageSource2; } + set + { + _imageSource2 = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ImgSource2))); + } + } + + public event PropertyChangedEventHandler PropertyChanged; + } +} diff --git a/src/Uno.UI/UI/Xaml/Media/ImageBrush.Android.cs b/src/Uno.UI/UI/Xaml/Media/ImageBrush.Android.cs index c0c91a1202b9..a61d35f69d88 100644 --- a/src/Uno.UI/UI/Xaml/Media/ImageBrush.Android.cs +++ b/src/Uno.UI/UI/Xaml/Media/ImageBrush.Android.cs @@ -47,6 +47,8 @@ internal void ScheduleRefreshIfNeeded(Windows.Foundation.Rect drawRect, Action o //TODO: should also check if Stretch has changed if (_imageSourceChanged || !drawRect.Equals(_lastDrawRect)) { + _imageSourceChanged = false; + if (ImageSource != null) { RefreshImageAsync(drawRect); @@ -55,7 +57,6 @@ internal void ScheduleRefreshIfNeeded(Windows.Foundation.Rect drawRect, Action o { _refreshPaint.Disposable = null; } - _imageSourceChanged = false; _lastDrawRect = drawRect; } } From 08085c8608735e47400dc9e6556c8c745c1ac3ed Mon Sep 17 00:00:00 2001 From: Jerome Laban Date: Fri, 20 Sep 2019 15:24:11 -0400 Subject: [PATCH 2/2] Update release notes --- doc/ReleaseNotes/_ReleaseNotes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/ReleaseNotes/_ReleaseNotes.md b/doc/ReleaseNotes/_ReleaseNotes.md index 3bed5ccefc52..7d3a34cad517 100644 --- a/doc/ReleaseNotes/_ReleaseNotes.md +++ b/doc/ReleaseNotes/_ReleaseNotes.md @@ -125,6 +125,7 @@ * [Pivot] Add support for non PivotItem items * #1557 Fix local DataContext on ContentDialog is overwritten * [WASM] Fix display for multiple popups (eg ComboBox inside of ContentDialog) +* [Android] Fix invalid ImageBrush stack overflow with delayed image reuse ## Release 1.45.0 ### Features