public EdgeHtmlWebview(WebviewBridge bridge) { this.bridge = bridge ?? throw new ArgumentNullException(nameof(bridge)); var version = Native.GetOsVersion(); supportsInitializeScript = version.MajorVersion >= 10 && version.BuildNumber >= 17763; var process = new WebViewControlProcess(); var bounds = new global::Windows.Foundation.Rect(Bounds.X, Bounds.Y, Bounds.Width, Bounds.Height); webview = process.CreateWebViewControlAsync(Handle.ToInt64(), bounds) .AsTask() .RunSyncWithPump(); UpdateSize(); if (supportsInitializeScript) { string initScript = Resources.GetInitScript("Windows"); webview.AddInitializeScript(initScript); } webview.ScriptNotify += Webview_ScriptNotify; webview.NavigationStarting += Webview_NavigationStarting; webview.NavigationCompleted += Webview_NavigationCompleted; Layout += (s, e) => UpdateSize(); }
private void Init() { var process = new WebViewControlProcess(); var bounds = new Rect(Bounds.X, Bounds.Y, Bounds.Width, Bounds.Height); webview = process.CreateWebViewControlAsync(Handle.ToInt64(), bounds) .AsTask() .ConfigureAwait(false) .GetAwaiter() .GetResult(); UpdateSize(); webview.DefaultBackgroundColor = ParseColor(config.BackgroundColor); webview.Settings.IsScriptNotifyAllowed = config.EnableScriptInterface; if (config.EnableScriptInterface) { webview.ScriptNotify += Webview_ScriptNotify; // TODO: needs Win10 1809 - 10.0.17763.0 // webview.AddInitializeScript(initScript); } webview.NavigationCompleted += Webview_NavigationCompleted; }
private async void Form1_Load(object sender, EventArgs e) { var options = new WebViewControlProcessOptions { // Enable private network access to enable Enterprise SSO PrivateNetworkClientServerCapability = WebViewControlProcessCapabilityState.Enabled }; var process = new WebViewControlProcess(options); var control = await process.CreateWebViewControlAsync( (long)this.Handle, new Windows.Foundation.Rect(0.0f, 0.0f, Width, Height)); this.Layout += (o, a) => { // This event is raised once at startup with the AffectedControl and AffectedProperty properties // on the LayoutEventArgs as null. if (a.AffectedControl != null && a.AffectedProperty != null) { // Ensure that the affected property is the Bounds property to the control if (a.AffectedProperty == nameof(this.Bounds)) { // In a typical control the DisplayRectangle is the interior canvas of the control // and in a scrolling control the DisplayRectangle would be larger than the ClientRectangle. // However, that is abstracted from us in WebView so we need to synchronize the ClientRectangle // and permit WebView to handle scrolling based on the new viewport var rect = new Rect( this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width, this.ClientRectangle.Height); control.Bounds = rect; } } }; control.ContainsFullScreenElementChanged += (o, a) => { void EnterFullScreen() { this.WindowState = FormWindowState.Normal; this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized; } void LeaveFullScreen() { this.FormBorderStyle = FormBorderStyle.Sizable; this.WindowState = FormWindowState.Normal; } // Toggle this.isFullScreen = !this.isFullScreen; if (this.isFullScreen) { EnterFullScreen(); } else { LeaveFullScreen(); } }; control.ScriptNotify += (o, a) => { MessageBox.Show(a.Value, a.Uri?.ToString() ?? string.Empty); }; control.NavigationCompleted += (o, a) => { this.Text = o.DocumentTitle; if (!a.IsSuccess) { MessageBox.Show( $"Could not navigate to {a.Uri}", $"Error: {a.WebErrorStatus}", MessageBoxButtons.OK, MessageBoxIcon.Error); } }; control.NavigationStarting += (o, a) => { this.Text = "Navigating " + (a.Uri?.ToString() ?? string.Empty); }; control.PermissionRequested += (o, a) => { if (a.PermissionRequest.State == WebViewControlPermissionState.Allow) { return; } var msg = $"Allow {a.PermissionRequest.Uri.Host} to access {a.PermissionRequest.PermissionType}?"; var response = MessageBox.Show(msg, "Permission Request", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (response == DialogResult.Yes) { if (a.PermissionRequest.State == WebViewControlPermissionState.Defer) { o.GetDeferredPermissionRequestById(a.PermissionRequest.Id, out var permission); permission?.Allow(); } else { a.PermissionRequest.Allow(); } } else { if (a.PermissionRequest.State == WebViewControlPermissionState.Defer) { o.GetDeferredPermissionRequestById(a.PermissionRequest.Id, out var permission); permission?.Deny(); } else { a.PermissionRequest.Deny(); } } }; control.Navigate(new Uri("http://bing.com")); }
public static async Task <WebAuthenticationResult> AuthenticateAsync( Uri requestUri, Uri callbackUri, Window parentWindow) { var webViewControlProcess = new WebViewControlProcess(); WebViewControl webViewControl = null; var webViewWindow = new WebAuthenticationWindow(); webViewWindow.Owner = parentWindow; // Response details string responseData = ""; uint responseCode = 0; var status = WebAuthenticationStatus.Success; webViewWindow.Loaded += async(_, __) => { await Task.Delay(200); webViewControl = await webViewControlProcess.CreateWebViewControlAsync( new WindowInteropHelper(webViewWindow).Handle.ToInt64(), new Windows.Foundation.Rect(0, 0, webViewWindow.ActualWidth, webViewWindow.ActualHeight)); webViewControl.NavigationStarting += (s, e) => { // Check for the Uri first -- localhost will give a 404 // but we might already have the data we want if (e.Uri.ToString().StartsWith(callbackUri.ToString())) { responseData = e.Uri.ToString(); webViewWindow.DialogResult = true; } }; webViewControl.NavigationCompleted += (s, e) => { if (!e.IsSuccess) { webViewWindow.DialogResult = false; responseCode = (uint)e.WebErrorStatus; } }; webViewControl.Navigate(requestUri); }; var dialogResult = await ShowDialogAsync(webViewWindow); if (dialogResult.HasValue) { status = dialogResult.Value ? WebAuthenticationStatus.Success : WebAuthenticationStatus.Error; } else { status = WebAuthenticationStatus.Canceled; } webViewControlProcess.Terminate(); return(new WebAuthenticationResult(responseData, responseCode, status)); }