Skip to content

Commit b9454b7

Browse files
committed
- silence errors before aborting the iframe
- separate iframe code
1 parent fedf64f commit b9454b7

10 files changed

Lines changed: 184 additions & 153 deletions

File tree

src/mono/sample/wasm/browser-bench/AppStart.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,11 @@ class PageShow : BenchTask.Measurement
4747

4848
public override int InitialSamples => 3;
4949

50-
async Task RunAsyncStep()
51-
{
52-
var function = Activator.CreateInstance(jsFunctionType, new object[] { new object[] { @"return App.StartAppUI();" } });
53-
var task = (Task<object>)functionCall.Invoke(function, new object[] { });
54-
55-
await task;
56-
}
57-
5850
public override bool HasRunStepAsync => true;
5951

6052
public override async Task RunStepAsync()
6153
{
62-
var function = Activator.CreateInstance(jsFunctionType, new object[] { new object[] { @"return App.PageShow();" } });
54+
var function = Activator.CreateInstance(jsFunctionType, new object[] { new object[] { @"return mainApp.PageShow();" } });
6355
await (Task<object>)functionCall.Invoke(function, null);
6456
}
6557
}
@@ -70,8 +62,8 @@ class ReachManaged : BenchTask.Measurement
7062
public override int InitialSamples => 3;
7163
public override bool HasRunStepAsync => true;
7264

73-
static object jsUIReachedManagedFunction = Activator.CreateInstance(jsFunctionType, new object[] { new object[] { @"return App.ReachedManaged();" } });
74-
static object jsReached = Activator.CreateInstance(jsFunctionType, new object[] { new object[] { @"return App.reached();" } });
65+
static object jsUIReachedManagedFunction = Activator.CreateInstance(jsFunctionType, new object[] { new object[] { @"return mainApp.ReachedManaged();" } });
66+
static object jsReached = Activator.CreateInstance(jsFunctionType, new object[] { new object[] { @"return frameApp.reached();" } });
7567

7668
[MethodImpl(MethodImplOptions.NoInlining)]
7769
public static void Reached()

src/mono/sample/wasm/browser-bench/Wasm.Browser.Bench.Sample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<ItemGroup>
1010
<WasmExtraFilesToDeploy Include="index.html" />
1111
<WasmExtraFilesToDeploy Include="appstart-frame.html" />
12-
<WasmExtraFilesToDeploy Include="appstart.js" />
12+
<WasmExtraFilesToDeploy Include="frame-main.js" />
1313
<WasmExtraFilesToDeploy Include="style.css" />
1414
<Compile Remove="Console/Console.cs" />
1515
</ItemGroup>

src/mono/sample/wasm/browser-bench/appstart-frame.html

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,18 @@
22
<!-- Licensed to the .NET Foundation under one or more agreements. -->
33
<!-- The .NET Foundation licenses this file to you under the MIT license. -->
44
<html>
5-
<head>
6-
<title>App task</title>
7-
<meta charset="UTF-8">
8-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
9-
</head>
10-
<body>
11-
<h3 id="header">Wasm Browser Sample - App task frame</h3>
12-
<span id="out"></span>
13-
<script type='text/javascript'>
14-
function set_exit_code (exit_code, reason)
15-
{
16-
/* Set result in a tests_done element, to be read by xharness */
17-
var tests_done_elem = document.createElement("label");
18-
tests_done_elem.id = "tests_done";
19-
tests_done_elem.innerHTML = exit_code.toString();
20-
document.body.appendChild(tests_done_elem);
215

22-
console.log(`WASM EXIT ${exit_code}`);
23-
};
6+
<head>
7+
<title>App task</title>
8+
<meta charset="UTF-8">
9+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
10+
</head>
2411

25-
window.addEventListener("pageshow", event => { window.parent.resolveAppStartEvent(event); })
12+
<body>
13+
<h3 id="header">Wasm Browser Sample - App task frame</h3>
14+
<span id="out"></span>
15+
<script type="text/javascript" src="dotnet.js"></script>
16+
<script type="text/javascript" src="frame-main.js"></script>
17+
</body>
2618

27-
var App = {
28-
init: function () {
29-
INTERNAL.call_static_method("[Wasm.Browser.Bench.Sample] Sample.AppStartTask/ReachManaged:Reached");
30-
},
31-
32-
reached: function() {
33-
window.parent.resolveAppStartEvent("reached");
34-
}
35-
};
36-
37-
</script>
38-
<script type="text/javascript" src="main.js"></script>
39-
<script defer src="dotnet.js"></script>
40-
</body>
41-
</html>
19+
</html>

src/mono/sample/wasm/browser-bench/appstart.js

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
"use strict";
5+
class FrameApp {
6+
async init({ BINDING }) {
7+
const reachManagedReached = BINDING.bind_static_method("[Wasm.Browser.Bench.Sample] Sample.AppStartTask/ReachManaged:Reached");
8+
await reachManagedReached();
9+
}
10+
11+
reached() {
12+
window.parent.resolveAppStartEvent("reached");
13+
}
14+
}
15+
16+
globalThis.frameApp = new FrameApp();
17+
18+
let mute = false;
19+
createDotnetRuntime(({ BINDING }) => {
20+
return {
21+
disableDotnet6Compatibility: true,
22+
configSrc: "./mono-config.json",
23+
printErr: function () {
24+
if (!mute) {
25+
console.error(...arguments);
26+
}
27+
},
28+
onConfigLoaded: () => {
29+
window.parent.resolveAppStartEvent("onConfigLoaded");
30+
// Module.config.diagnostic_tracing = true;
31+
},
32+
onDotnetReady: async () => {
33+
window.parent.resolveAppStartEvent("onDotnetReady");
34+
try {
35+
await frameApp.init({ BINDING });
36+
window.parent.resolveAppStartEvent("done");
37+
} catch (error) {
38+
set_exit_code(1, error);
39+
throw (error);
40+
}
41+
},
42+
onAbort: (error) => {
43+
set_exit_code(1, error);
44+
},
45+
}
46+
}).catch(err => {
47+
if (!mute) {
48+
console.error(`WASM ERROR ${err}`);
49+
}
50+
})
51+
52+
window.addEventListener("pageshow", event => { window.parent.resolveAppStartEvent("pageshow"); })
53+
54+
window.muteErrors = () => {
55+
mute = true;
56+
}
57+
58+
function set_exit_code(exit_code, reason) {
59+
/* Set result in a tests_done element, to be read by xharness */
60+
var tests_done_elem = document.createElement("label");
61+
tests_done_elem.id = "tests_done";
62+
tests_done_elem.innerHTML = exit_code.toString();
63+
document.body.appendChild(tests_done_elem);
64+
65+
console.log(`WASM EXIT ${exit_code}`);
66+
};

src/mono/sample/wasm/browser-bench/index.html

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -10,70 +10,11 @@
1010
<link rel="stylesheet" href="style.css">
1111
</head>
1212

13-
<body onload="onLoad()">
13+
<body>
1414
<h3 id="header">Wasm Browser Sample - Simple Benchmark</h3>
1515
Output:<br><br> <span id="out"></span>
16-
<script type='text/javascript'>
17-
let tasks = '';
18-
var onLoad = function () {
19-
var url = new URL(decodeURI(window.location));
20-
tasks = url.searchParams.getAll('task');
21-
};
22-
23-
function set_exit_code(exit_code, reason) {
24-
/* Set result in a tests_done element, to be read by xharness */
25-
const tests_done_elem = document.createElement("label");
26-
tests_done_elem.id = "tests_done";
27-
tests_done_elem.innerHTML = exit_code.toString();
28-
document.body.appendChild(tests_done_elem);
29-
30-
console.log(`WASM EXIT ${exit_code}`);
31-
};
32-
33-
function yieldBench() {
34-
const runBenchmark = BINDING.bind_static_method("[Wasm.Browser.Bench.Sample] Sample.Test:RunBenchmark");
35-
let promise = runBenchmark();
36-
promise.then(ret => {
37-
document.getElementById("out").innerHTML += ret;
38-
if (ret.length > 0) {
39-
setTimeout(function () { yieldBench(); }, 0);
40-
} else {
41-
document.getElementById("out").innerHTML += "Finished";
42-
}
43-
});
44-
}
45-
46-
const App = {
47-
init: function () {
48-
if (tasks != '') {
49-
const setTasks = BINDING.bind_static_method("[Wasm.Browser.Bench.Sample] Sample.Test:SetTasks");
50-
setTasks(tasks);
51-
}
52-
yieldBench();
53-
},
54-
55-
PageShow: async function () {
56-
AppStart.Construct();
57-
try {
58-
await AppStart.WaitForPageShow();
59-
} finally {
60-
AppStart.RemoveFrame();
61-
}
62-
},
63-
64-
ReachedManaged: async function () {
65-
AppStart.Construct();
66-
try {
67-
await AppStart.WaitForReached();
68-
} finally {
69-
AppStart.RemoveFrame();
70-
}
71-
}
72-
};
73-
</script>
16+
<script type="text/javascript" src="dotnet.js"></script>
7417
<script type="text/javascript" src="main.js"></script>
75-
<script type="text/javascript" src="appstart.js"></script>
76-
<script defer src="dotnet.js"></script>
7718
</body>
7819

7920
</html>

src/mono/sample/wasm/browser-bench/main.js

Lines changed: 89 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,104 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
"use strict";
5-
var Module = {
5+
6+
let runBenchmark;
7+
let setTasks;
8+
9+
class MainApp {
10+
init({ BINDING }) {
11+
runBenchmark = BINDING.bind_static_method("[Wasm.Browser.Bench.Sample] Sample.Test:RunBenchmark");
12+
setTasks = BINDING.bind_static_method("[Wasm.Browser.Bench.Sample] Sample.Test:SetTasks");
13+
14+
var url = new URL(decodeURI(window.location));
15+
let tasks = url.searchParams.getAll('task');
16+
if (tasks != '') {
17+
setTasks(tasks.join(','));
18+
}
19+
20+
this.yieldBench();
21+
}
22+
23+
24+
yieldBench() {
25+
let promise = runBenchmark();
26+
promise.then(ret => {
27+
document.getElementById("out").innerHTML += ret;
28+
if (ret.length > 0) {
29+
setTimeout(() => { this.yieldBench(); }, 0);
30+
} else {
31+
document.getElementById("out").innerHTML += "Finished";
32+
}
33+
});
34+
}
35+
36+
async PageShow() {
37+
try {
38+
await this.waitFor('pageshow');
39+
} finally {
40+
this.removeFrame();
41+
}
42+
}
43+
44+
async ReachedManaged() {
45+
try {
46+
await this.waitFor('reached');
47+
} finally {
48+
this.removeFrame();
49+
}
50+
}
51+
52+
async waitFor(eventName) {
53+
try {
54+
let promise;
55+
let promiseResolve;
56+
this._frame = document.createElement('iframe');
57+
this._frame.src = 'appstart-frame.html';
58+
59+
promise = new Promise(resolve => { promiseResolve = resolve; })
60+
window.resolveAppStartEvent = function (event) {
61+
if (!eventName || event == eventName)
62+
promiseResolve();
63+
}
64+
65+
document.body.appendChild(this._frame);
66+
await promise;
67+
} catch (err) {
68+
console.log(err);
69+
throw err;
70+
}
71+
}
72+
73+
removeFrame() {
74+
this._frame.contentWindow.muteErrors();
75+
document.body.removeChild(this._frame);
76+
}
77+
}
78+
79+
globalThis.mainApp = new MainApp();
80+
81+
createDotnetRuntime(({ BINDING }) => ({
82+
disableDotnet6Compatibility: true,
683
configSrc: "./mono-config.json",
784
onDotnetReady: () => {
885
try {
9-
App.init();
86+
mainApp.init({ BINDING });
1087
} catch (error) {
11-
console.log("exception: " + error);
1288
set_exit_code(1, error);
1389
throw (error);
1490
}
1591
},
1692
onAbort: (error) => {
1793
set_exit_code(1, error);
1894
},
95+
}));
96+
97+
function set_exit_code(exit_code, reason) {
98+
/* Set result in a tests_done element, to be read by xharness */
99+
const tests_done_elem = document.createElement("label");
100+
tests_done_elem.id = "tests_done";
101+
tests_done_elem.innerHTML = exit_code.toString();
102+
document.body.appendChild(tests_done_elem);
103+
104+
console.log(`WASM EXIT ${exit_code}`);
19105
};

src/mono/wasm/runtime/exports.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,10 @@ function initializeImportsAndExports(
171171
}
172172

173173
if (!module.print) {
174-
module.print = console.log;
174+
module.print = console.log.bind(module);
175175
}
176176
if (!module.printErr) {
177-
module.printErr = console.error;
177+
module.printErr = console.error.bind(module);
178178
}
179179
module.imports = module.imports || <DotnetModuleConfigImports>{};
180180
if (!module.imports.require) {

0 commit comments

Comments
 (0)