From 4312daf75a633445f75e83bb42b7239f3a12fd0d Mon Sep 17 00:00:00 2001 From: Yury Date: Wed, 1 Oct 2025 18:30:42 +0200 Subject: [PATCH] Fix: Browser StorageItem methods not working and handle conversion issue (#19708) * Fix names in browser StorageHelpers methods import * Fix returning handlers instead of files in BrowserStorageProvider * Fix returning handles instead of storage items in Move, GetFile and GetFolder methods --- .../Avalonia.Browser/Interop/StorageHelper.cs | 8 ++--- .../Storage/BrowserStorageProvider.cs | 36 +++++++++++-------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/Browser/Avalonia.Browser/Interop/StorageHelper.cs b/src/Browser/Avalonia.Browser/Interop/StorageHelper.cs index 76f1273f2e..bad9b8ac70 100644 --- a/src/Browser/Avalonia.Browser/Interop/StorageHelper.cs +++ b/src/Browser/Avalonia.Browser/Interop/StorageHelper.cs @@ -56,16 +56,16 @@ internal static partial class StorageHelper [JSImport("StorageProvider.createAcceptType", AvaloniaModule.StorageModuleName)] public static partial JSObject CreateAcceptType(string description, string[] mimeTypes, string[]? extensions); - [JSImport("StorageProvider.deleteAsync", AvaloniaModule.StorageModuleName)] + [JSImport("StorageItem.deleteAsync", AvaloniaModule.StorageModuleName)] public static partial Task DeleteAsync(JSObject fileHandle); - [JSImport("StorageProvider.moveAsync", AvaloniaModule.StorageModuleName)] + [JSImport("StorageItem.moveAsync", AvaloniaModule.StorageModuleName)] public static partial Task MoveAsync(JSObject fileHandle, JSObject destinationFolder); - [JSImport("StorageProvider.createFile", AvaloniaModule.StorageModuleName)] + [JSImport("StorageItem.createFile", AvaloniaModule.StorageModuleName)] public static partial Task CreateFile(JSObject folderHandle, string name); - [JSImport("StorageProvider.createFolder", AvaloniaModule.StorageModuleName)] + [JSImport("StorageItem.createFolder", AvaloniaModule.StorageModuleName)] public static partial Task CreateFolder(JSObject folderHandle, string name); [JSImport("StorageItem.getFile", AvaloniaModule.StorageModuleName)] diff --git a/src/Browser/Avalonia.Browser/Storage/BrowserStorageProvider.cs b/src/Browser/Avalonia.Browser/Storage/BrowserStorageProvider.cs index cef13b4d3b..fa34e07993 100644 --- a/src/Browser/Avalonia.Browser/Storage/BrowserStorageProvider.cs +++ b/src/Browser/Avalonia.Browser/Storage/BrowserStorageProvider.cs @@ -235,11 +235,13 @@ internal abstract class JSStorageItem : IStorageBookmarkItem throw new InvalidOperationException("Destination folder must be initialized the StorageProvider API."); } - var storageItem = await StorageHelper.MoveAsync(FileHandle, folder.FileHandle); - if (storageItem is null) + var itemHandle = await StorageHelper.MoveAsync(FileHandle, folder.FileHandle); + if (itemHandle is null) { return null; } + + var storageItem = StorageHelper.StorageItemFromHandle(itemHandle)!; var kind = storageItem.GetPropertyAsString("kind"); return kind switch @@ -356,12 +358,13 @@ internal class JSStorageFolder : JSStorageItem, IStorageBookmarkFolder { try { - var storageFile = await StorageHelper.CreateFile(FileHandle, name); - if (storageFile is null) + var fileHandle = await StorageHelper.CreateFile(FileHandle, name); + if (fileHandle is null) { return null; } - + + var storageFile = StorageHelper.StorageItemFromHandle(fileHandle)!; return new JSStorageFile(storageFile); } catch (JSException ex) when (ex.Message == BrowserStorageProvider.NoPermissionsMessage) @@ -374,13 +377,14 @@ internal class JSStorageFolder : JSStorageItem, IStorageBookmarkFolder { try { - var storageFile = await StorageHelper.CreateFolder(FileHandle, name); - if (storageFile is null) + var folderHandler = await StorageHelper.CreateFolder(FileHandle, name); + if (folderHandler is null) { return null; } - - return new JSStorageFolder(storageFile); + + var storageFolder = StorageHelper.StorageItemFromHandle(folderHandler)!; + return new JSStorageFolder(storageFolder); } catch (JSException ex) when (ex.Message == BrowserStorageProvider.NoPermissionsMessage) { @@ -392,13 +396,15 @@ internal class JSStorageFolder : JSStorageItem, IStorageBookmarkFolder { try { - var storageFile = await StorageHelper.GetFolder(FileHandle, name); - if (storageFile is null) + var folderHandle = await StorageHelper.GetFolder(FileHandle, name); + if (folderHandle is null) { return null; } + + var storageFolder = StorageHelper.StorageItemFromHandle(folderHandle)!; - return new JSStorageFolder(storageFile); + return new JSStorageFolder(storageFolder); } catch (JSException ex) when (ShouldSupressErrorOnFileAccess(ex)) { @@ -410,11 +416,13 @@ internal class JSStorageFolder : JSStorageItem, IStorageBookmarkFolder { try { - var storageFile = await StorageHelper.GetFile(FileHandle, name); - if (storageFile is null) + var fileHandle = await StorageHelper.GetFile(FileHandle, name); + if (fileHandle is null) { return null; } + + var storageFile = StorageHelper.StorageItemFromHandle(fileHandle)!; return new JSStorageFile(storageFile); }