using System.IO;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
+using System.Threading;
using Xunit;
#pragma warning disable xUnit1026 // Theory methods should use all of their parameters
}
[Fact]
+ public async Task CancelableImportAsync()
+ {
+ var cts = new CancellationTokenSource();
+ var exTask = Assert.ThrowsAsync<JSException>(async () => await JSHost.ImportAsync("JavaScriptTestHelper", "./JavaScriptTestHelper.mjs", cts.Token));
+ cts.Cancel();
+ var actualEx2 = await exTask;
+ Assert.Equal("OperationCanceledException", actualEx2.Message);
+
+ var actualEx = await Assert.ThrowsAsync<JSException>(async () => await JSHost.ImportAsync("JavaScriptTestHelper", "./JavaScriptTestHelper.mjs", new CancellationToken(true)));
+ Assert.Equal("OperationCanceledException", actualEx.Message);
+ }
+
+ [Fact]
public unsafe void GlobalThis()
{
Assert.Null(JSHost.GlobalThis.GetPropertyAsString("dummy"));
import { mono_wasm_symbolicate_string } from "./logging";
import { mono_wasm_get_jsobj_from_js_handle } from "./gc-handles";
import { endMeasure, MeasuredBlock, startMeasure } from "./profiler";
+import { wrap_as_cancelable_promise } from "./cancelable-promise";
const fn_wrapper_by_fn_handle: Function[] = <any>[null];// 0th slot is dummy, we never free bound functions
export const importedModulesPromises: Map<string, Promise<any>> = new Map();
export const importedModules: Map<string, Promise<any>> = new Map();
-export async function dynamic_import(module_name: string, module_url: string): Promise<any> {
+export function dynamic_import(module_name: string, module_url: string): Promise<any> {
mono_assert(module_name, "Invalid module_name");
mono_assert(module_url, "Invalid module_name");
let promise = importedModulesPromises.get(module_name);
promise = import(/* webpackIgnore: true */module_url);
importedModulesPromises.set(module_name, promise);
}
- const module = await promise;
- if (newPromise) {
- importedModules.set(module_name, module);
- if (runtimeHelpers.diagnosticTracing)
- console.debug(`MONO_WASM: imported ES6 module '${module_name}' from '${module_url}'`);
- }
- return module;
+
+ return wrap_as_cancelable_promise(async () => {
+ const module = await promise;
+ if (newPromise) {
+ importedModules.set(module_name, module);
+ if (runtimeHelpers.diagnosticTracing)
+ console.debug(`MONO_WASM: imported ES6 module '${module_name}' from '${module_url}'`);
+ }
+ return module;
+ });
}