25 internal static class WebView2Initializer
35 private const string LowResourceModeEnvironmentVariable =
"DREAMINE_WEBVIEW2_LOW_RESOURCE_MODE";
53 public static string GetSafeUserDataFolder()
55 var basePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
56 var processName = Process.GetCurrentProcess().ProcessName;
57 var integrity = IsAdministrator() ?
"Admin" :
"User";
58 var path = Path.Combine(basePath,
"Dreamine",
"WebView2Cache", processName, integrity);
59 Directory.CreateDirectory(path);
79 private static string GetAdditionalBrowserArguments()
81 var lowResourceMode = Environment.GetEnvironmentVariable(LowResourceModeEnvironmentVariable);
82 if (
string.Equals(lowResourceMode,
"0", StringComparison.OrdinalIgnoreCase) ||
83 string.Equals(lowResourceMode,
"false", StringComparison.OrdinalIgnoreCase))
88 return string.Join(
" ",
new[]
91 "--disable-gpu-compositing",
92 "--disable-accelerated-2d-canvas",
93 "--disable-accelerated-video-decode",
94 "--disable-smooth-scrolling",
95 "--disable-features=CalculateNativeWinOcclusion,msWebOOUI,msPdfOOUI"
115 private static bool IsAdministrator()
119 using WindowsIdentity identity = WindowsIdentity.GetCurrent();
120 return new WindowsPrincipal(identity).IsInRole(WindowsBuiltInRole.Administrator);
144 public static WebView2 CreateConfiguredWebView2()
146 var cachePath = GetSafeUserDataFolder();
147 var browserArguments = GetAdditionalBrowserArguments();
148 Debug.WriteLine($
"[WebView2.CachePath] {cachePath}");
149 Debug.WriteLine($
"[WebView2.Args] {(string.IsNullOrWhiteSpace(browserArguments) ? "(none)
" : browserArguments)}");
151 var webView =
new WebView2
153 CreationProperties =
new CoreWebView2CreationProperties
155 UserDataFolder = cachePath,
156 AdditionalBrowserArguments = browserArguments
160 webView.CoreWebView2InitializationCompleted += (s, a) =>
163 Debug.WriteLine($
"[WebView2.InitFailed] {a.InitializationException}");
165 Debug.WriteLine($
"[WebView2.InitOK] {webView.CoreWebView2?.Environment?.BrowserVersionString}");
168 webView.NavigationStarting += (s, e) => Debug.WriteLine($
"[WebView2.NavStarting] {e.Uri}");
169 webView.NavigationCompleted += (s, e) =>
172 Debug.WriteLine($
"[WebView2.NavFailed] {e.WebErrorStatus}");
174 Debug.WriteLine(
"[WebView2.NavOK]");
220 public static async Task ShowOfflineMessageAsync(WebView2 webView,
string url)
224 await webView.EnsureCoreWebView2Async();
225 webView.NavigateToString(
$@"
228<head><meta charset='utf-8'><title>Server Offline</title></head>
229<body style='font-family:Segoe UI; background:#222; color:#ddd; padding:24px;'>
230 <h2>Blazor Server에 연결할 수 없습니다.</h2>
231 <p>대상: <b>{System.Net.WebUtility.HtmlEncode(url)}</b></p>
233 <li>Kestrel이 지정 포트에서 기동 중인지 확인(UseUrls)</li>