From 0c0d4497ef156aa6defaa4cce05fac5831576dd4 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sun, 11 Feb 2024 05:51:09 -0800 Subject: [PATCH] Browser StaticWebAssets sdk support (#14225) * Property support StaticWebAssets SDK when it's available * Fix browser issue with dispatcher used before initialization * Use RequestAnimationFrame instead of WebEmbeddableControlRoot hack * Always include both types of assets by default, as I couldn't find a reliable way to detect project capabilities properly * Remove "WasmRuntimeAssetsLocation" override, instead let users use default value set by .NET SDK * Revert "Fix browser issue with dispatcher used before initialization" This reverts commit fc43c7e3d506aedd476cc472b9bdeb7a53b3aa44. * Add AvaloniaAllowWebGl2 prop * What --- .gitignore | 1 + .../ControlCatalog.Browser.Blazor.csproj | 4 +- .../ControlCatalog.Browser.csproj | 6 +- .../MobileSandbox.Browser.csproj | 21 +----- samples/MobileSandbox.Browser/Roots.xml | 7 -- .../Avalonia.Browser.Blazor.csproj | 21 +----- .../BlazorSingleViewLifetime.cs | 3 - .../Avalonia.Browser/Avalonia.Browser.csproj | 16 +++-- .../Avalonia.Browser/Avalonia.Browser.props | 10 --- src/Browser/Avalonia.Browser/AvaloniaView.cs | 18 ++--- .../BrowserSingleViewLifetime.cs | 2 +- .../WebEmbeddableControlRoot.cs | 68 ------------------- .../build/Avalonia.Browser.props | 13 ++++ .../{ => build}/Avalonia.Browser.targets | 10 +-- ...Microsoft.AspNetCore.StaticWebAssets.props | 22 ++++++ .../Avalonia.Browser/{ => build}/interop.js | 0 src/Browser/Avalonia.Browser/webapp/build.js | 2 +- 17 files changed, 68 insertions(+), 156 deletions(-) delete mode 100644 samples/MobileSandbox.Browser/Roots.xml delete mode 100644 src/Browser/Avalonia.Browser/Avalonia.Browser.props delete mode 100644 src/Browser/Avalonia.Browser/WebEmbeddableControlRoot.cs create mode 100644 src/Browser/Avalonia.Browser/build/Avalonia.Browser.props rename src/Browser/Avalonia.Browser/{ => build}/Avalonia.Browser.targets (81%) create mode 100644 src/Browser/Avalonia.Browser/build/Microsoft.AspNetCore.StaticWebAssets.props rename src/Browser/Avalonia.Browser/{ => build}/interop.js (100%) diff --git a/.gitignore b/.gitignore index ddbe436d3a..32ada6ca2b 100644 --- a/.gitignore +++ b/.gitignore @@ -218,3 +218,4 @@ src/Browser/Avalonia.Browser.Blazor/webapp/package-lock.json src/Browser/Avalonia.Browser.Blazor/wwwroot src/Browser/Avalonia.Browser/wwwroot api/diff +src/Browser/Avalonia.Browser/staticwebassets diff --git a/samples/ControlCatalog.Browser.Blazor/ControlCatalog.Browser.Blazor.csproj b/samples/ControlCatalog.Browser.Blazor/ControlCatalog.Browser.Blazor.csproj index 733a4b7194..363c6a8b27 100644 --- a/samples/ControlCatalog.Browser.Blazor/ControlCatalog.Browser.Blazor.csproj +++ b/samples/ControlCatalog.Browser.Blazor/ControlCatalog.Browser.Blazor.csproj @@ -22,8 +22,8 @@ - - + + diff --git a/samples/ControlCatalog.Browser/ControlCatalog.Browser.csproj b/samples/ControlCatalog.Browser/ControlCatalog.Browser.csproj index 12338d615e..d1cec4e017 100644 --- a/samples/ControlCatalog.Browser/ControlCatalog.Browser.csproj +++ b/samples/ControlCatalog.Browser/ControlCatalog.Browser.csproj @@ -1,6 +1,4 @@  - - net7.0 browser-wasm @@ -8,6 +6,7 @@ Exe true true + ./ @@ -20,5 +19,6 @@ - + + diff --git a/samples/MobileSandbox.Browser/MobileSandbox.Browser.csproj b/samples/MobileSandbox.Browser/MobileSandbox.Browser.csproj index 001fe94c7f..6174b4f135 100644 --- a/samples/MobileSandbox.Browser/MobileSandbox.Browser.csproj +++ b/samples/MobileSandbox.Browser/MobileSandbox.Browser.csproj @@ -7,25 +7,10 @@ true true true - -sVERBOSE -sERROR_ON_UNDEFINED_SYMBOLS=0 + ./ - - true - true - full - true - true - -O2 - -O2 - - - - - - - @@ -38,6 +23,6 @@ - - + + diff --git a/samples/MobileSandbox.Browser/Roots.xml b/samples/MobileSandbox.Browser/Roots.xml deleted file mode 100644 index 5255ae3ef8..0000000000 --- a/samples/MobileSandbox.Browser/Roots.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/Browser/Avalonia.Browser.Blazor/Avalonia.Browser.Blazor.csproj b/src/Browser/Avalonia.Browser.Blazor/Avalonia.Browser.Blazor.csproj index 19d18e2e29..66cb6f7780 100644 --- a/src/Browser/Avalonia.Browser.Blazor/Avalonia.Browser.Blazor.csproj +++ b/src/Browser/Avalonia.Browser.Blazor/Avalonia.Browser.Blazor.csproj @@ -1,8 +1,7 @@ - + net7.0 - _IncludeGeneratedAvaloniaStaticFiles;$(ResolveStaticWebAssetsInputsDependsOn) @@ -20,22 +19,4 @@ - - - - <_AvaloniaWebAssets Include="$(MSBuildThisFileDirectory)../Avalonia.Browser/wwwroot/**/*.*" /> - - - - - diff --git a/src/Browser/Avalonia.Browser.Blazor/BlazorSingleViewLifetime.cs b/src/Browser/Avalonia.Browser.Blazor/BlazorSingleViewLifetime.cs index 7c5ee27c66..cf3c034b00 100644 --- a/src/Browser/Avalonia.Browser.Blazor/BlazorSingleViewLifetime.cs +++ b/src/Browser/Avalonia.Browser.Blazor/BlazorSingleViewLifetime.cs @@ -17,9 +17,6 @@ public static class BlazorAppBuilder /// Browser backend specific options. public static async Task StartBlazorAppAsync(this AppBuilder builder, BrowserPlatformOptions? options = null) { - options ??= new BrowserPlatformOptions(); - options.FrameworkAssetPathResolver ??= filePath => $"/_content/Avalonia.Browser.Blazor/{filePath}"; - builder = await BrowserAppBuilder.PreSetupBrowser(builder, options); builder.SetupWithLifetime(new BlazorSingleViewLifetime()); diff --git a/src/Browser/Avalonia.Browser/Avalonia.Browser.csproj b/src/Browser/Avalonia.Browser/Avalonia.Browser.csproj index ec65717cbb..83f4b8c75f 100644 --- a/src/Browser/Avalonia.Browser/Avalonia.Browser.csproj +++ b/src/Browser/Avalonia.Browser/Avalonia.Browser.csproj @@ -1,7 +1,6 @@ net7.0 - enable true @@ -22,21 +21,26 @@ - + + true build/ - + + true + build/;buildTransitive/;buildMultiTargeting/ + + true build/;buildTransitive/ - + true build/interop.js;buildTransitive/interop.js - + true - build/wwwroot;buildTransitive/wwwroot + staticwebassets/ diff --git a/src/Browser/Avalonia.Browser/Avalonia.Browser.props b/src/Browser/Avalonia.Browser/Avalonia.Browser.props deleted file mode 100644 index 2c3942de1f..0000000000 --- a/src/Browser/Avalonia.Browser/Avalonia.Browser.props +++ /dev/null @@ -1,10 +0,0 @@ - - - True - True - True - - - ./ - - diff --git a/src/Browser/Avalonia.Browser/AvaloniaView.cs b/src/Browser/Avalonia.Browser/AvaloniaView.cs index 1abcd8689b..bba1c8bb0d 100644 --- a/src/Browser/Avalonia.Browser/AvaloniaView.cs +++ b/src/Browser/Avalonia.Browser/AvaloniaView.cs @@ -71,26 +71,18 @@ namespace Avalonia.Browser _splash = DomHelper.GetElementById("avalonia-splash"); _topLevelImpl = new BrowserTopLevelImpl(this, _containerElement); - - _topLevel = new WebEmbeddableControlRoot(_topLevelImpl, () => - { - Dispatcher.UIThread.Post(() => - { - if (_splash != null) - { - DomHelper.AddCssClass(_splash, "splash-close"); - } - }); - }); - _topLevelImpl.SetCssCursor = (cursor) => { InputHelper.SetCursor(_containerElement, cursor); }; + _topLevel = new EmbeddableControlRoot(_topLevelImpl); _topLevel.Prepare(); - _topLevel.Renderer.Start(); + if (_splash != null) + { + _topLevel.RequestAnimationFrame(_ => DomHelper.AddCssClass(_splash, "splash-close")); + } InputHelper.InitializeBackgroundHandlers(); diff --git a/src/Browser/Avalonia.Browser/BrowserSingleViewLifetime.cs b/src/Browser/Avalonia.Browser/BrowserSingleViewLifetime.cs index f534c3f27b..e568067b74 100644 --- a/src/Browser/Avalonia.Browser/BrowserSingleViewLifetime.cs +++ b/src/Browser/Avalonia.Browser/BrowserSingleViewLifetime.cs @@ -49,5 +49,5 @@ internal class BrowserSingleViewLifetime : ISingleViewApplicationLifetime, IActi public event EventHandler? Deactivated; public bool TryLeaveBackground() => false; - public bool TryEnterBackground() => true; + public bool TryEnterBackground() => false; } diff --git a/src/Browser/Avalonia.Browser/WebEmbeddableControlRoot.cs b/src/Browser/Avalonia.Browser/WebEmbeddableControlRoot.cs deleted file mode 100644 index 993414f17f..0000000000 --- a/src/Browser/Avalonia.Browser/WebEmbeddableControlRoot.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using Avalonia.Controls.Embedding; -using Avalonia.Media; -using Avalonia.Platform; -using Avalonia.Rendering.SceneGraph; - -namespace Avalonia.Browser -{ - internal class WebEmbeddableControlRoot : EmbeddableControlRoot - { - class SplashScreenCloseCustomDrawingOperation : ICustomDrawOperation - { - private bool _hasRendered; - private Action _onFirstRender; - - public SplashScreenCloseCustomDrawingOperation(Action onFirstRender) - { - _onFirstRender = onFirstRender; - } - - public Rect Bounds => default; - - public bool HasRendered => _hasRendered; - - public void Dispose() - { - - } - - public bool Equals(ICustomDrawOperation? other) - { - return false; - } - - public bool HitTest(Point p) - { - return false; - } - - public void Render(ImmediateDrawingContext context) - { - _hasRendered = true; - _onFirstRender(); - } - } - - public WebEmbeddableControlRoot(ITopLevelImpl impl, Action onFirstRender) : base(impl) - { - _splashCloseOp = new SplashScreenCloseCustomDrawingOperation(() => - { - _splashCloseOp = null; - onFirstRender(); - }); - } - - private SplashScreenCloseCustomDrawingOperation? _splashCloseOp; - - public override void Render(DrawingContext context) - { - base.Render(context); - - if (_splashCloseOp != null) - { - context.Custom(_splashCloseOp); - } - } - } -} diff --git a/src/Browser/Avalonia.Browser/build/Avalonia.Browser.props b/src/Browser/Avalonia.Browser/build/Avalonia.Browser.props new file mode 100644 index 0000000000..6e0884c2c7 --- /dev/null +++ b/src/Browser/Avalonia.Browser/build/Avalonia.Browser.props @@ -0,0 +1,13 @@ + + + true + True + True + True + + True + True + + + + diff --git a/src/Browser/Avalonia.Browser/Avalonia.Browser.targets b/src/Browser/Avalonia.Browser/build/Avalonia.Browser.targets similarity index 81% rename from src/Browser/Avalonia.Browser/Avalonia.Browser.targets rename to src/Browser/Avalonia.Browser/build/Avalonia.Browser.targets index 8740564ea9..47a22336b3 100644 --- a/src/Browser/Avalonia.Browser/Avalonia.Browser.targets +++ b/src/Browser/Avalonia.Browser/build/Avalonia.Browser.targets @@ -1,12 +1,14 @@ $(EmccExtraLDFlags) --js-library="$(MSBuildThisFileDirectory)/interop.js" - $(EmccExtraLDFlags) -sERROR_ON_UNDEFINED_SYMBOLS=0 + $(EmccFlags) -sERROR_ON_UNDEFINED_SYMBOLS=0 + $(EmccFlags) -sUSE_WEBGL2=1 -sMAX_WEBGL_VERSION=2 -lGL - - - + + + + diff --git a/src/Browser/Avalonia.Browser/build/Microsoft.AspNetCore.StaticWebAssets.props b/src/Browser/Avalonia.Browser/build/Microsoft.AspNetCore.StaticWebAssets.props new file mode 100644 index 0000000000..79d0385074 --- /dev/null +++ b/src/Browser/Avalonia.Browser/build/Microsoft.AspNetCore.StaticWebAssets.props @@ -0,0 +1,22 @@ + + + <_AvaloniaWebAssetsFolder>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)../staticwebassets/)) + + + + <_AvaloniaWebAssets Include="$(_AvaloniaWebAssetsFolder)**/*.*" /> + + Package + Avalonia.Browser + $(_AvaloniaWebAssetsFolder) + / + $(WasmRuntimeAssetsLocation)/%(FileName)%(Extension) + All + All + Primary + PreserveNewest + PreserveNewest + $(_AvaloniaWebAssetsFolder)%(FileName)%(Extension) + + + diff --git a/src/Browser/Avalonia.Browser/interop.js b/src/Browser/Avalonia.Browser/build/interop.js similarity index 100% rename from src/Browser/Avalonia.Browser/interop.js rename to src/Browser/Avalonia.Browser/build/interop.js diff --git a/src/Browser/Avalonia.Browser/webapp/build.js b/src/Browser/Avalonia.Browser/webapp/build.js index e8e49554cd..3b278e7dcb 100644 --- a/src/Browser/Avalonia.Browser/webapp/build.js +++ b/src/Browser/Avalonia.Browser/webapp/build.js @@ -4,7 +4,7 @@ require("esbuild").build({ "./modules/storage.ts", "./modules/sw.ts" ], - outdir: "../wwwroot", + outdir: "../staticwebassets", bundle: true, minify: true, format: "esm",