Parcourir la source

Ensure ReadRequest type can be loaded on server. Fixes #26882 (#26931)

Steve Sanderson il y a 5 ans
Parent
commit
d052b22874

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
src/Components/Web.JS/dist/Release/blazor.server.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
src/Components/Web.JS/dist/Release/blazor.webassembly.js


+ 5 - 5
src/Components/Web.JS/src/InputFile.ts

@@ -112,11 +112,11 @@ async function readFileData(elem: InputElement, fileId: number, startOffset: num
 function readFileDataSharedMemory(readRequest: any): number {
 function readFileDataSharedMemory(readRequest: any): number {
   const inputFileElementReferenceId = monoPlatform.readStringField(readRequest, 0);
   const inputFileElementReferenceId = monoPlatform.readStringField(readRequest, 0);
   const inputFileElement = document.querySelector(`[_bl_${inputFileElementReferenceId}]`);
   const inputFileElement = document.querySelector(`[_bl_${inputFileElementReferenceId}]`);
-  const fileId = monoPlatform.readInt32Field(readRequest, 4);
-  const sourceOffset = monoPlatform.readUint64Field(readRequest, 8);
-  const destination = monoPlatform.readInt32Field(readRequest, 16) as unknown as System_Array<number>;
-  const destinationOffset = monoPlatform.readInt32Field(readRequest, 20);
-  const maxBytes = monoPlatform.readInt32Field(readRequest, 24);
+  const fileId = monoPlatform.readInt32Field(readRequest, 8);
+  const sourceOffset = monoPlatform.readUint64Field(readRequest, 12);
+  const destination = monoPlatform.readInt32Field(readRequest, 24) as unknown as System_Array<number>;
+  const destinationOffset = monoPlatform.readInt32Field(readRequest, 32);
+  const maxBytes = monoPlatform.readInt32Field(readRequest, 36);
 
 
   const sourceArrayBuffer = getFileById(inputFileElement as InputElement, fileId).arrayBuffer as ArrayBuffer;
   const sourceArrayBuffer = getFileById(inputFileElement as InputElement, fileId).arrayBuffer as ArrayBuffer;
   const bytesToRead = Math.min(maxBytes, sourceArrayBuffer.byteLength - sourceOffset);
   const bytesToRead = Math.min(maxBytes, sourceArrayBuffer.byteLength - sourceOffset);

+ 8 - 5
src/Components/Web/src/Forms/InputFile/ReadRequest.cs

@@ -8,22 +8,25 @@ namespace Microsoft.AspNetCore.Components.Forms
     [StructLayout(LayoutKind.Explicit)]
     [StructLayout(LayoutKind.Explicit)]
     internal struct ReadRequest
     internal struct ReadRequest
     {
     {
+        // Even though this type is only intended for use on WebAssembly, make it able to
+        // load on 64-bit runtimes by allowing 8 bytes for each reference-typed field.
+
         [FieldOffset(0)]
         [FieldOffset(0)]
         public string InputFileElementReferenceId;
         public string InputFileElementReferenceId;
 
 
-        [FieldOffset(4)]
+        [FieldOffset(8)]
         public int FileId;
         public int FileId;
 
 
-        [FieldOffset(8)]
+        [FieldOffset(12)]
         public long SourceOffset;
         public long SourceOffset;
 
 
-        [FieldOffset(16)]
+        [FieldOffset(24)]
         public byte[] Destination;
         public byte[] Destination;
 
 
-        [FieldOffset(20)]
+        [FieldOffset(32)]
         public int DestinationOffset;
         public int DestinationOffset;
 
 
-        [FieldOffset(24)]
+        [FieldOffset(36)]
         public int MaxBytes;
         public int MaxBytes;
     }
     }
 }
 }

+ 11 - 0
src/Components/Web/test/Forms/InputFileChangeEventArgsTest.cs

@@ -65,5 +65,16 @@ namespace Microsoft.AspNetCore.Components.Forms
             var ex = Assert.Throws<InvalidOperationException>(() => instance.GetMultipleFiles(1));
             var ex = Assert.Throws<InvalidOperationException>(() => instance.GetMultipleFiles(1));
             Assert.Equal($"The maximum number of files accepted is 1, but 2 were supplied.", ex.Message);
             Assert.Equal($"The maximum number of files accepted is 1, but 2 were supplied.", ex.Message);
         }
         }
+
+        [Fact]
+        public void ReadRequestTypeCanBeLoaded()
+        {
+            // Represents https://github.com/dotnet/aspnetcore/issues/26882
+            // Even though the ReadRequest type is only ever used on WebAssembly, developers might
+            // do something that causes the type to be loaded on other environments, for example
+            // using reflection. It's just a DTO with no behaviors so there's nothing to test
+            // except that loading the type doesn't trigger an exception.
+            GC.KeepAlive(new ReadRequest());
+        }
     }
     }
 }
 }

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff