using System.Runtime.InteropServices;
using System.Text;
using System.Text.Json;
using XFESystem.Browser;
if (args.Length != 2 || args[0] != "--Verify")
{
global::System.Console.Error.WriteLine("Usage: XFESystem.BrowserDemo --Verify Report.json");
return 2;
}
var browser = new BrowserService();
var page = browser.Navigate("about:Start");
var javascript = browser.PreviewJavaScript("const numbers = [1,2,3]; console.log('JS', numbers.map(x => x * 2).reduce((a,b) => a + b, 0)); 6 * 7");
var markdown = browser.PreviewMarkdown("# XFESystem\n\n**Markdown preview**\n\n```js\nconsole.log(42);\n```");
using var quotaRuntime=new JavaScriptRuntime(new BrowserLimits { MaximumStatements = 100 });
using var atomicsRuntime=new JavaScriptRuntime();
var quota = quotaRuntime.Evaluate("while(true) {}");
var atomics = atomicsRuntime.Evaluate("Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0)");
var assertions = new Dictionary<string, bool>
{
["ActualInlineScriptAndDomMutation"] = page.Text.Contains("JavaScript ready: 12", StringComparison.Ordinal),
["ActualJavaScriptInterpreter"] = javascript == "JS 12\n42",
["FreshPreviewHasNoPageDom"] = browser.PreviewJavaScript("typeof document") == "undefined",
["WebsiteMarkdownRenderer"] = markdown.Contains("Markdown preview", StringComparison.Ordinal) && markdown.Contains("console.log(42);", StringComparison.Ordinal),
["StatementLimitStopsInfiniteLoop"] = !quota.Success && quota.Error.Contains("statement", StringComparison.OrdinalIgnoreCase),
["AtomicsCannotSuspend"] = !atomics.Success && atomics.Error.Contains("Atomics.wait cannot be used", StringComparison.Ordinal),
["NoClrAccess"] = browser.PreviewJavaScript("typeof System") == "undefined",
["NativeNetworkDoesNotFallBackToHost"] = browser.Navigate("https://example.test/").Title == "Navigation failed"
};
var report = new BrowserVerificationReport
{
Schema = "XFESystem.Browser.HostVerification.V1",
HostOnly = true,
GuestExecution = false,
NetworkVerified = false,
Runtime = RuntimeInformation.FrameworkDescription,
OperatingSystem = RuntimeInformation.OSDescription,
Capabilities = browser.Capabilities,
Passed = assertions.Values.All(value => value),
Assertions = assertions,
HtmlPageText = page.Text,
JavaScriptText = javascript,
MarkdownText = markdown
};
var path = Path.GetFullPath(args[1]);
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
File.WriteAllText(path, JsonSerializer.Serialize(report,
BrowserReportJsonContext.Default.BrowserVerificationReport), new UTF8Encoding(false));
global::System.Console.WriteLine($"Host browser verification: {path}");
return report.Passed ? 0 : 1;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.Json;
using XFESystem.Browser;
if (args.Length != 2 || args[0] != "--Verify")
{
global::System.Console.Error.WriteLine("Usage: XFESystem.BrowserDemo --Verify Report.json");
return 2;
}
var browser = new BrowserService();
var page = browser.Navigate("about:Start");
var javascript = browser.PreviewJavaScript("const numbers = [1,2,3]; console.log('JS', numbers.map(x => x * 2).reduce((a,b) => a + b, 0)); 6 * 7");
var markdown = browser.PreviewMarkdown("# XFESystem\n\n**Markdown preview**\n\n```js\nconsole.log(42);\n```");
using var quotaRuntime=new JavaScriptRuntime(new BrowserLimits { MaximumStatements = 100 });
using var atomicsRuntime=new JavaScriptRuntime();
var quota = quotaRuntime.Evaluate("while(true) {}");
var atomics = atomicsRuntime.Evaluate("Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0)");
var assertions = new Dictionary<string, bool>
{
["ActualInlineScriptAndDomMutation"] = page.Text.Contains("JavaScript ready: 12", StringComparison.Ordinal),
["ActualJavaScriptInterpreter"] = javascript == "JS 12\n42",
["FreshPreviewHasNoPageDom"] = browser.PreviewJavaScript("typeof document") == "undefined",
["WebsiteMarkdownRenderer"] = markdown.Contains("Markdown preview", StringComparison.Ordinal) && markdown.Contains("console.log(42);", StringComparison.Ordinal),
["StatementLimitStopsInfiniteLoop"] = !quota.Success && quota.Error.Contains("statement", StringComparison.OrdinalIgnoreCase),
["AtomicsCannotSuspend"] = !atomics.Success && atomics.Error.Contains("Atomics.wait cannot be used", StringComparison.Ordinal),
["NoClrAccess"] = browser.PreviewJavaScript("typeof System") == "undefined",
["NativeNetworkDoesNotFallBackToHost"] = browser.Navigate("https://example.test/").Title == "Navigation failed"
};
var report = new BrowserVerificationReport
{
Schema = "XFESystem.Browser.HostVerification.V1",
HostOnly = true,
GuestExecution = false,
NetworkVerified = false,
Runtime = RuntimeInformation.FrameworkDescription,
OperatingSystem = RuntimeInformation.OSDescription,
Capabilities = browser.Capabilities,
Passed = assertions.Values.All(value => value),
Assertions = assertions,
HtmlPageText = page.Text,
JavaScriptText = javascript,
MarkdownText = markdown
};
var path = Path.GetFullPath(args[1]);
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
File.WriteAllText(path, JsonSerializer.Serialize(report,
BrowserReportJsonContext.Default.BrowserVerificationReport), new UTF8Encoding(false));
global::System.Console.WriteLine($"Host browser verification: {path}");
return report.Passed ? 0 : 1;