Просмотр исходного кода

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

Steve Sanderson 5 лет назад
Родитель
Сommit
d052b22874

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/Components/Web.JS/dist/Release/blazor.server.js


Разница между файлами не показана из-за своего большого размера
+ 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 {
   const inputFileElementReferenceId = monoPlatform.readStringField(readRequest, 0);
   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 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)]
     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)]
         public string InputFileElementReferenceId;
 
-        [FieldOffset(4)]
+        [FieldOffset(8)]
         public int FileId;
 
-        [FieldOffset(8)]
+        [FieldOffset(12)]
         public long SourceOffset;
 
-        [FieldOffset(16)]
+        [FieldOffset(24)]
         public byte[] Destination;
 
-        [FieldOffset(20)]
+        [FieldOffset(32)]
         public int DestinationOffset;
 
-        [FieldOffset(24)]
+        [FieldOffset(36)]
         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));
             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());
+        }
     }
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов