Files

89 lines
3.7 KiB
Python
Raw Permalink Normal View History

"""Isolated WebView2 test host."""
import json
import pathlib
import shutil
import subprocess
import urllib.request
import zipfile
from .common import BASE
ROOT = BASE / "webview2-harmless-test"
VERSION = "1.0.2903.40"
SOURCE = r'''
using System;
using System.IO;
using System.Windows.Forms;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
class Probe : Form {
WebView2 view = new WebView2();
string report;
Timer deadline = new Timer();
bool completed;
Probe(string path) {
report = path; ShowInTaskbar = false; Opacity = 0;
Controls.Add(view); view.Dock = DockStyle.Fill;
deadline.Interval = 45000;
deadline.Tick += (s,e) => Finish("{\"passed\":false,\"error\":\"timeout\"}", 2);
Shown += async (s,e) => {
deadline.Start();
try {
var env = await CoreWebView2Environment.CreateAsync(null,
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test-profile"));
await view.EnsureCoreWebView2Async(env);
var result = await view.CoreWebView2.ExecuteScriptAsync(
"({arithmetic:1+1,marker:'isolated-webview2-test',url:location.href})");
bool ok = result.Contains("\"arithmetic\":2") && result.Contains("isolated-webview2-test");
Finish("{\"passed\":" + (ok ? "true" : "false") +
",\"method\":\"CoreWebView2.ExecuteScriptAsync\",\"external_process_injection\":false," +
"\"result\":" + result + "}", ok ? 0 : 1);
} catch(Exception ex) {
File.WriteAllText(report + ".error.txt", ex.ToString());
Finish("{\"passed\":false,\"error\":\"See .error.txt\"}", 1);
}
};
}
void Finish(string data, int code) {
if(completed) return; completed=true; deadline.Stop();
File.WriteAllText(report,data); Environment.ExitCode=code;
view.Dispose(); Close();
}
[STAThread] static void Main(string[] args) {
Application.EnableVisualStyles(); Application.Run(new Probe(args[0]));
}
}
'''
def run_webview_test():
ROOT.mkdir(exist_ok=True)
package = ROOT / ('webview2-' + VERSION + '.nupkg')
if not package.exists():
urllib.request.urlretrieve(
'https://api.nuget.org/v3-flatcontainer/microsoft.web.webview2/' + VERSION +
'/microsoft.web.webview2.' + VERSION + '.nupkg', package)
with zipfile.ZipFile(package) as archive:
for name in ('lib/net462/Microsoft.Web.WebView2.Core.dll',
'lib/net462/Microsoft.Web.WebView2.WinForms.dll',
'runtimes/win-x64/native/WebView2Loader.dll'):
with archive.open(name) as src, (ROOT / pathlib.Path(name).name).open('wb') as dest:
shutil.copyfileobj(src, dest)
source = ROOT / 'Probe.cs'
source.write_text(SOURCE, encoding='utf-8')
exe = ROOT / 'Probe.exe'
compiler = r'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe'
subprocess.run([compiler, '/nologo', '/target:winexe', '/platform:x64',
'/out:' + str(exe), '/r:System.Windows.Forms.dll',
'/r:System.Drawing.dll',
'/r:' + str(ROOT / 'Microsoft.Web.WebView2.Core.dll'),
'/r:' + str(ROOT / 'Microsoft.Web.WebView2.WinForms.dll'),
str(source)], check=True, creationflags=subprocess.CREATE_NO_WINDOW)
report = ROOT / 'result.json'
report.unlink(missing_ok=True)
run = subprocess.run([str(exe), str(report)], cwd=ROOT, timeout=60,
creationflags=subprocess.CREATE_NO_WINDOW)
if report.exists():
print(json.dumps(json.loads(report.read_text(encoding='utf-8-sig')), indent=2))
else:
raise RuntimeError('Test host exited without a report: ' + str(run.returncode))
return run.returncode