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 { ["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;