diff --git a/src/Components/WebView/Platforms/WebView2/src/CoreWebView2WebResourceContextWrapper.cs b/src/Components/WebView/Platforms/WebView2/src/CoreWebView2WebResourceContextWrapper.cs
new file mode 100644
index 000000000000..9ebde6a2a2df
--- /dev/null
+++ b/src/Components/WebView/Platforms/WebView2/src/CoreWebView2WebResourceContextWrapper.cs
@@ -0,0 +1,83 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace Microsoft.AspNetCore.Components.WebView.WebView2
+{
+ ///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
+ /// Specifies the web resource request contexts.
+ ///
+ public enum CoreWebView2WebResourceContextWrapper
+ {
+ ///
+ /// Specifies all resources.
+ ///
+ All,
+ ///
+ /// Specifies a document resources.
+ ///
+ Document,
+ ///
+ /// Specifies a CSS resources.
+ ///
+ Stylesheet,
+ ///
+ /// Specifies an image resources.
+ ///
+ Image,
+ ///
+ /// Specifies another media resource such as a video.
+ ///
+ Media,
+ ///
+ /// Specifies a font resource.
+ ///
+ Font,
+ ///
+ /// Specifies a script resource.
+ ///
+ Script,
+ ///
+ /// Specifies an XML HTTP request.
+ ///
+ XmlHttpRequest,
+ ///
+ /// Specifies a Fetch API communication.
+ ///
+ Fetch,
+ ///
+ /// Specifies a TextTrack resource.
+ ///
+ TextTrack,
+ ///
+ /// Specifies an EventSource API communication.
+ ///
+ EventSource,
+ ///
+ /// Specifies a WebSocket API communication.
+ ///
+ Websocket,
+ ///
+ /// Specifies a Web App Manifest.
+ ///
+ Manifest,
+ ///
+ /// Specifies a Signed HTTP Exchange.
+ ///
+ SignedExchange,
+ ///
+ /// Specifies a Ping request.
+ ///
+ Ping,
+ ///
+ /// Specifies a CSP Violation Report.
+ ///
+ CspViolationReport,
+ ///
+ /// Specifies an other resource.
+ ///
+ Other
+ }
+}
diff --git a/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs
new file mode 100644
index 000000000000..9674d539fa83
--- /dev/null
+++ b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs
@@ -0,0 +1,32 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace Microsoft.AspNetCore.Components.WebView.WebView2
+{
+ ///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
+ /// Event args for the AcceleratorKeyPressed event.
+ ///
+ public interface ICoreWebView2AcceleratorKeyPressedEventArgsWrapper
+ {
+ ///
+ /// Gets the Win32 virtual key code of the key that was pressed or released.
+ ///
+ uint VirtualKey { get; }
+
+ ///
+ /// Gets the LPARAM value that accompanied the window message.
+ ///
+ int KeyEventLParam { get; }
+
+ ///
+ /// Indicates whether the AcceleratorKeyPressed event is handled by host.
+ ///
+ ///
+ /// If set to true then this prevents the WebView from performing the default action for this accelerator key. Otherwise the WebView will perform the default action for the accelerator key.
+ ///
+ bool Handled { get; set; }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2SettingsWrapper.cs b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2SettingsWrapper.cs
new file mode 100644
index 000000000000..2211fbd044d8
--- /dev/null
+++ b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2SettingsWrapper.cs
@@ -0,0 +1,93 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace Microsoft.AspNetCore.Components.WebView.WebView2
+{
+ ///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
+ /// Defines properties that enable, disable, or modify WebView features.
+ ///
+ ///
+ /// Setting changes made after event do not apply until the next top-level navigation.
+ ///
+ public interface ICoreWebView2SettingsWrapper
+ {
+ ///
+ /// Determines whether running JavaScript is enabled in all future navigations in the WebView.
+ ///
+ ///
+ /// This only affects scripts in the document. Scripts injected with runs even if script is disabled. The default value is true.
+ ///
+ public bool IsScriptEnabled { get; set; }
+
+ ///
+ /// Determines whether communication from the host to the top-level HTML document of the WebView is allowed.
+ ///
+ ///
+ /// This is used when loading a new HTML document. If set to true, communication from the host to the top-level HTML document of the WebView is allowed using , , and message event of window.chrome.webview. Communication from the top-level HTML document of the WebView to the host is allowed using window.chrome.webview.postMessage function and the event. If set to false, then communication is disallowed. and fail and window.chrome.webview.postMessage fails by throwing an instance of an Error object. The default value is true.
+ ///
+ ///
+ ///
+ ///
+ public bool IsWebMessageEnabled { get; set; }
+
+ ///
+ /// Determines whether WebView renders the default Javascript dialog box.
+ ///
+ ///
+ /// This is used when loading a new HTML document. If set to false, WebView does not render the default JavaScript dialog box (specifically those displayed by the JavaScript alert, confirm, prompt functions and beforeunload event). Instead, WebView raises event that contains all of the information for the dialog and allow the host app to show a custom UI. The default value is true.
+ ///
+ ///
+ public bool AreDefaultScriptDialogsEnabled { get; set; }
+
+ ///
+ /// Determines whether the status bar is displayed.
+ ///
+ ///
+ /// The status bar is usually displayed in the lower left of the WebView and shows things such as the URI of a link when the user hovers over it and other information. The default value is true.
+ ///
+ public bool IsStatusBarEnabled { get; set; }
+
+ ///
+ /// Determines whether the user is able to use the context menu or keyboard shortcuts to open the DevTools window.
+ ///
+ ///
+ /// The default value is true.
+ ///
+ public bool AreDevToolsEnabled { get; set; }
+
+ ///
+ /// Determines whether the default context menus are shown to the user in WebView.
+ ///
+ ///
+ /// The default value is true.
+ ///
+ public bool AreDefaultContextMenusEnabled { get; set; }
+
+ ///
+ /// Determines whether host objects are accessible from the page in WebView.
+ ///
+ ///
+ /// The default value is true.
+ ///
+ public bool AreHostObjectsAllowed { get; set; }
+
+ ///
+ /// Determines whether the user is able to impact the zoom of the WebView.
+ ///
+ ///
+ /// When disabled, the user is not able to zoom using Ctrl++, Ctr+-, or Ctrl+mouse wheel, but the zoom is set using property. The default value is true.
+ ///
+ public bool IsZoomControlEnabled { get; set; }
+
+ ///
+ /// Determines whether to disable built in error page for navigation failure and render process failure.
+ ///
+ ///
+ /// When disabled, blank page is displayed when related error happens. The default value is true.
+ ///
+ public bool IsBuiltInErrorPageEnabled { get; set; }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2WebResourceRequestWrapper.cs b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2WebResourceRequestWrapper.cs
new file mode 100644
index 000000000000..e8cf3e483389
--- /dev/null
+++ b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2WebResourceRequestWrapper.cs
@@ -0,0 +1,38 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace Microsoft.AspNetCore.Components.WebView.WebView2
+{
+ ///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
+ /// An HTTP request used with the event.
+ ///
+ public interface ICoreWebView2WebResourceRequestWrapper
+ {
+ ///
+ /// Gets or sets the request URI.
+ ///
+ string Uri { get; set; }
+
+ ///
+ /// Gets or sets the HTTP request method.
+ ///
+ string Method { get; set; }
+
+ /////
+ ///// Gets or sets the HTTP request message body as stream.
+ /////
+ /////
+ ///// POST data should be here. If a stream is set, which overrides the message body, the stream must have all the content data available by the time the event deferral of this request is completed. Stream should be agile or be created from a background STA to prevent performance impact to the UI thread. null means no content data.
+ /////
+ /////
+ //Stream Content { get; set; }
+
+ /////
+ ///// Gets the mutable HTTP request headers.
+ /////
+ //ICoreWebView2HttpRequestHeadersWrapper Headers { get; }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2WebResourceRequestedEventArgsWrapper.cs b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2WebResourceRequestedEventArgsWrapper.cs
new file mode 100644
index 000000000000..9260ee10475b
--- /dev/null
+++ b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2WebResourceRequestedEventArgsWrapper.cs
@@ -0,0 +1,38 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+
+namespace Microsoft.AspNetCore.Components.WebView.WebView2
+{
+ ///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
+ /// Event args for the WebResourceRequested event.
+ ///
+ public interface ICoreWebView2WebResourceRequestedEventArgsWrapper
+ {
+ ///
+ /// Gets the web resource request.
+ ///
+ ///
+ /// The request object may be missing some headers that are added by network stack at a later time.
+ ///
+ ICoreWebView2WebResourceRequestWrapper Request { get; }
+
+ ///
+ /// Gets the web resource request context.
+ ///
+ CoreWebView2WebResourceContextWrapper ResourceContext { get; }
+
+ ///
+ /// Set the response content for this web resource.
+ ///
+ ///
+ ///
+ ///
+ ///
+ void SetResponse(Stream content, int statusCode, string statusMessage, string headerString);
+ }
+}
diff --git a/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2Wrapper.cs b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2Wrapper.cs
new file mode 100644
index 000000000000..284f160db5b3
--- /dev/null
+++ b/src/Components/WebView/Platforms/WebView2/src/ICoreWebView2Wrapper.cs
@@ -0,0 +1,52 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading.Tasks;
+
+namespace Microsoft.AspNetCore.Components.WebView.WebView2
+{
+ ///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
+ /// Defines an abstraction for different WebView2 implementations on different platforms.
+ ///
+ public interface ICoreWebView2Wrapper
+ {
+ ///
+ /// Gets the object contains various modifiable settings for the running WebView.
+ ///
+ public ICoreWebView2SettingsWrapper Settings { get; }
+
+ ///
+ /// Adds the provided JavaScript to a list of scripts that should be run after the global object has been created, but before the HTML document has been parsed and before any other script included by the HTML document is run.
+ ///
+ /// The JavaScript code to be run.
+ Task AddScriptToExecuteOnDocumentCreatedAsync(string javaScript);
+
+
+ ///
+ /// WebMessageReceived is raised when the IsWebMessageEnabled setting is set and the top-level document of the WebView runs window.chrome.webview.postMessage.
+ ///
+ Action AddWebMessageReceivedHandler(Action messageReceivedHandler);
+
+ ///
+ /// Adds a URI and resource context filter to the WebResourceRequested event.
+ ///
+ /// An URI to be added to the WebResourceRequested event.
+ /// A resource context filter to be added to the WebResourceRequested event.
+ void AddWebResourceRequestedFilter(string uri, CoreWebView2WebResourceContextWrapper resourceContext);
+
+ ///
+ /// WebResourceRequested is raised when the WebView is performing a URL request to a matching URL and resource context filter that was added with AddWebResourceRequestedFilter />.
+ ///
+ Action AddWebResourceRequestedHandler(EventHandler webResourceRequestedHandler);
+
+ ///
+ /// Posts a message that is a simple rather than a JSON string representation of a JavaScript object.
+ ///
+ /// The web message to be posted to the top level document in this WebView.
+ void PostWebMessageAsString(string webMessageAsString);
+ }
+}
diff --git a/src/Components/WebView/Platforms/WebView2/src/IWebView2Wrapper.cs b/src/Components/WebView/Platforms/WebView2/src/IWebView2Wrapper.cs
index e406af0b9c8b..f5dcd61d3f70 100644
--- a/src/Components/WebView/Platforms/WebView2/src/IWebView2Wrapper.cs
+++ b/src/Components/WebView/Platforms/WebView2/src/IWebView2Wrapper.cs
@@ -3,22 +3,31 @@
using System;
using System.Threading.Tasks;
-using Microsoft.Web.WebView2.Core;
namespace Microsoft.AspNetCore.Components.WebView.WebView2
{
///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
/// Provides an abstraction for different UI frameworks to provide access to APIs from
- /// and related controls.
+ /// Microsoft.Web.WebView2.Core.CoreWebView2 and related controls.
///
public interface IWebView2Wrapper
{
///
- /// Gets the instance on the control. This is only available
- /// once the returned by
- /// has completed.
+ /// Creates a WebView2 Environment using the installed or a custom WebView2 Runtime version.
+ /// The implementation should store the CoreWebView2Environment created in this method so that it can
+ /// be used in .
///
- CoreWebView2 CoreWebView2 { get; }
+ Task CreateEnvironmentAsync();
+
+ ///
+ /// The underlying CoreWebView2. Use this property to perform more operations on the WebView2 content than is exposed
+ /// on the WebView2. This value is null until it is initialized. You can force the underlying CoreWebView2 to
+ /// initialize via the InitializeAsync method.
+ ///
+ ICoreWebView2Wrapper CoreWebView2 { get; }
///
/// Gets or sets the source URI of the control. Setting the source URI causes page navigation.
@@ -26,16 +35,14 @@ public interface IWebView2Wrapper
Uri Source { get; set; }
///
- /// Initializes the instance on the control. This should only be called once
- /// per control.
+ /// Explicitly trigger initialization of the control's CoreWebView2. The implementation should use the CoreWebView2Environment that was
+ /// created in .
///
- /// A that can be used to customize the control's behavior.
- /// A that will complete once the is initialized and attached to the control.
- Task EnsureCoreWebView2Async(CoreWebView2Environment environment = null);
+ Task EnsureCoreWebView2Async();
///
/// Event that occurs when an accelerator key is pressed.
///
- event EventHandler AcceleratorKeyPressed;
+ Action AddAcceleratorKeyPressedHandler(EventHandler eventHandler);
}
}
diff --git a/src/Components/WebView/Platforms/WebView2/src/Microsoft.AspNetCore.Components.WebView.WebView2.csproj b/src/Components/WebView/Platforms/WebView2/src/Microsoft.AspNetCore.Components.WebView.WebView2.csproj
index 3744779f7e91..e50575b0ff51 100644
--- a/src/Components/WebView/Platforms/WebView2/src/Microsoft.AspNetCore.Components.WebView.WebView2.csproj
+++ b/src/Components/WebView/Platforms/WebView2/src/Microsoft.AspNetCore.Components.WebView.WebView2.csproj
@@ -1,10 +1,7 @@
-
+
-
- $(DefaultNetCoreTargetFramework)-windows
+ $(DefaultNetCoreTargetFramework)-windows
WebView2 wrappers for BlazorWebView components on Windows.
true
disable
@@ -12,7 +9,6 @@
-
diff --git a/src/Components/WebView/Platforms/WebView2/src/PublicAPI.Unshipped.txt b/src/Components/WebView/Platforms/WebView2/src/PublicAPI.Unshipped.txt
index 318076a2d943..a992fe96f020 100644
--- a/src/Components/WebView/Platforms/WebView2/src/PublicAPI.Unshipped.txt
+++ b/src/Components/WebView/Platforms/WebView2/src/PublicAPI.Unshipped.txt
@@ -1,11 +1,75 @@
#nullable enable
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.All = 0 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.CspViolationReport = 15 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Document = 1 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.EventSource = 10 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Fetch = 8 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Font = 5 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Image = 3 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Manifest = 12 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Media = 4 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Other = 16 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Ping = 14 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Script = 6 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.SignedExchange = 13 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Stylesheet = 2 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.TextTrack = 9 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.Websocket = 11 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper.XmlHttpRequest = 7 -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2AcceleratorKeyPressedEventArgsWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2AcceleratorKeyPressedEventArgsWrapper.Handled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2AcceleratorKeyPressedEventArgsWrapper.Handled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2AcceleratorKeyPressedEventArgsWrapper.KeyEventLParam.get -> int
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2AcceleratorKeyPressedEventArgsWrapper.VirtualKey.get -> uint
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreDefaultContextMenusEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreDefaultContextMenusEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreDefaultScriptDialogsEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreDefaultScriptDialogsEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreDevToolsEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreDevToolsEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreHostObjectsAllowed.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.AreHostObjectsAllowed.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsBuiltInErrorPageEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsBuiltInErrorPageEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsScriptEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsScriptEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsStatusBarEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsStatusBarEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsWebMessageEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsWebMessageEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsZoomControlEnabled.get -> bool
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper.IsZoomControlEnabled.set -> void
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestedEventArgsWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestedEventArgsWrapper.ResourceContext.get -> Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper
+Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper
Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper
-Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.AcceleratorKeyPressed -> System.EventHandler
-~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.CoreWebView2.get -> Microsoft.Web.WebView2.Core.CoreWebView2
-~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.EnsureCoreWebView2Async(Microsoft.Web.WebView2.Core.CoreWebView2Environment environment = null) -> System.Threading.Tasks.Task
+Microsoft.AspNetCore.Components.WebView.WebView2.WebMessageReceivedEventArgs
+virtual Microsoft.AspNetCore.Components.WebView.WebView2.WebView2WebViewManager.QueueBlazorStart() -> void
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestWrapper.Method.get -> string
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestWrapper.Method.set -> void
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestWrapper.Uri.get -> string
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestWrapper.Uri.set -> void
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestedEventArgsWrapper.Request.get -> Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestWrapper
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2WebResourceRequestedEventArgsWrapper.SetResponse(System.IO.Stream content, int statusCode, string statusMessage, string headerString) -> void
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper.AddScriptToExecuteOnDocumentCreatedAsync(string javaScript) -> System.Threading.Tasks.Task
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper.AddWebMessageReceivedHandler(System.Action messageReceivedHandler) -> System.Action
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper.AddWebResourceRequestedFilter(string uri, Microsoft.AspNetCore.Components.WebView.WebView2.CoreWebView2WebResourceContextWrapper resourceContext) -> void
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper.AddWebResourceRequestedHandler(System.EventHandler webResourceRequestedHandler) -> System.Action
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper.PostWebMessageAsString(string webMessageAsString) -> void
+~Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper.Settings.get -> Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2SettingsWrapper
+~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.AddAcceleratorKeyPressedHandler(System.EventHandler eventHandler) -> System.Action
+~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.CoreWebView2.get -> Microsoft.AspNetCore.Components.WebView.WebView2.ICoreWebView2Wrapper
+~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.CreateEnvironmentAsync() -> System.Threading.Tasks.Task
+~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.EnsureCoreWebView2Async() -> System.Threading.Tasks.Task
~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.Source.get -> System.Uri
~Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper.Source.set -> void
Microsoft.AspNetCore.Components.WebView.WebView2.WebView2WebViewManager
+~Microsoft.AspNetCore.Components.WebView.WebView2.WebMessageReceivedEventArgs.Source.get -> string
+~Microsoft.AspNetCore.Components.WebView.WebView2.WebMessageReceivedEventArgs.WebMessageAsString.get -> string
+~Microsoft.AspNetCore.Components.WebView.WebView2.WebMessageReceivedEventArgs.WebMessageReceivedEventArgs(string source, string webMessageAsString) -> void
~Microsoft.AspNetCore.Components.WebView.WebView2.WebView2WebViewManager.WebView2WebViewManager(Microsoft.AspNetCore.Components.WebView.WebView2.IWebView2Wrapper webview, System.IServiceProvider services, Microsoft.AspNetCore.Components.Dispatcher dispatcher, Microsoft.Extensions.FileProviders.IFileProvider fileProvider, string hostPageRelativePath) -> void
~override Microsoft.AspNetCore.Components.WebView.WebView2.WebView2WebViewManager.NavigateCore(System.Uri absoluteUri) -> void
~override Microsoft.AspNetCore.Components.WebView.WebView2.WebView2WebViewManager.SendMessage(string message) -> void
diff --git a/src/Components/WebView/Platforms/WebView2/src/WebMessageReceivedEventArgs.cs b/src/Components/WebView/Platforms/WebView2/src/WebMessageReceivedEventArgs.cs
new file mode 100644
index 000000000000..a5817424aab0
--- /dev/null
+++ b/src/Components/WebView/Platforms/WebView2/src/WebMessageReceivedEventArgs.cs
@@ -0,0 +1,37 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+
+namespace Microsoft.AspNetCore.Components.WebView.WebView2
+{
+ ///
+ /// Types in the Microsoft.AspNetCore.Components.WebView.WebView2 are not recommended for use outside
+ /// of the Blazor framework. These types will change in a future release.
+ ///
+ /// Event arguments for the WebMessageReceived event.
+ ///
+ public class WebMessageReceivedEventArgs : EventArgs
+ {
+ ///
+ /// Constructs a new instance of with the provider source and message.
+ ///
+ /// The URI of the document that sent this web message.
+ /// the message posted from the WebView content to the host as a .
+ public WebMessageReceivedEventArgs(string source, string webMessageAsString)
+ {
+ Source = source;
+ WebMessageAsString = webMessageAsString;
+ }
+
+ ///
+ /// Gets the URI of the document that sent this web message.
+ ///
+ public string Source { get; }
+
+ ///
+ /// Gets the message posted from the WebView content to the host as a .
+ ///
+ public string WebMessageAsString { get; }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WebView2/src/WebView2WebViewManager.cs b/src/Components/WebView/Platforms/WebView2/src/WebView2WebViewManager.cs
index 3180af07cdaf..0d8e4e266c4d 100644
--- a/src/Components/WebView/Platforms/WebView2/src/WebView2WebViewManager.cs
+++ b/src/Components/WebView/Platforms/WebView2/src/WebView2WebViewManager.cs
@@ -6,7 +6,6 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.FileProviders;
-using Microsoft.Web.WebView2.Core;
namespace Microsoft.AspNetCore.Components.WebView.WebView2
{
@@ -59,26 +58,26 @@ protected override void SendMessage(string message)
private async Task InitializeWebView2()
{
- var environment = await CoreWebView2Environment.CreateAsync().ConfigureAwait(true);
- await _webview.EnsureCoreWebView2Async(environment);
+ await _webview.CreateEnvironmentAsync().ConfigureAwait(true);
+ await _webview.EnsureCoreWebView2Async();
ApplyDefaultWebViewSettings();
- _webview.CoreWebView2.AddWebResourceRequestedFilter($"{AppOrigin}*", CoreWebView2WebResourceContext.All);
- _webview.CoreWebView2.WebResourceRequested += (sender, eventArgs) =>
+ _webview.CoreWebView2.AddWebResourceRequestedFilter($"{AppOrigin}*", CoreWebView2WebResourceContextWrapper.All);
+ var removeResourceCallback = _webview.CoreWebView2.AddWebResourceRequestedHandler((s, eventArgs) =>
{
// Unlike server-side code, we get told exactly why the browser is making the request,
// so we can be smarter about fallback. We can ensure that 'fetch' requests never result
// in fallback, for example.
var allowFallbackOnHostPage =
- eventArgs.ResourceContext == CoreWebView2WebResourceContext.Document ||
- eventArgs.ResourceContext == CoreWebView2WebResourceContext.Other; // e.g., dev tools requesting page source
+ eventArgs.ResourceContext == CoreWebView2WebResourceContextWrapper.Document ||
+ eventArgs.ResourceContext == CoreWebView2WebResourceContextWrapper.Other; // e.g., dev tools requesting page source
if (TryGetResponseContent(eventArgs.Request.Uri, allowFallbackOnHostPage, out var statusCode, out var statusMessage, out var content, out var headers))
{
var headerString = GetHeaderString(headers);
- eventArgs.Response = environment.CreateWebResourceResponse(content, statusCode, statusMessage, headerString);
+ eventArgs.SetResponse(content, statusCode, statusMessage, headerString);
}
- };
+ });
// The code inside blazor.webview.js is meant to be agnostic to specific webview technologies,
// so the following is an adaptor from blazor.webview.js conventions to WebView2 APIs
@@ -93,8 +92,17 @@ await _webview.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(@"
};
").ConfigureAwait(true);
- _webview.CoreWebView2.WebMessageReceived += (sender, eventArgs)
- => MessageReceived(new Uri(eventArgs.Source), eventArgs.TryGetWebMessageAsString());
+ QueueBlazorStart();
+
+ var removeMessageCallback = _webview.CoreWebView2.AddWebMessageReceivedHandler(e
+ => MessageReceived(new Uri(e.Source), e.WebMessageAsString));
+ }
+
+ ///
+ /// Override this method to queue a call to Blazor.start(). Not all platforms require this.
+ ///
+ protected virtual void QueueBlazorStart()
+ {
}
private static string GetHeaderString(IDictionary headers) =>
@@ -111,7 +119,7 @@ private void ApplyDefaultWebViewSettings()
// Desktop applications don't normally want to enable things like "alt-left to go back"
// or "ctrl+f to find". Developers should explicitly opt into allowing these.
// Issues #30511 and #30624 track making an option to control this.
- _webview.AcceleratorKeyPressed += (sender, eventArgs) =>
+ var removeKeyPressCallback = _webview.AddAcceleratorKeyPressedHandler((sender, eventArgs) =>
{
if (eventArgs.VirtualKey != 0x49) // Allow ctrl+shift+i to open dev tools, at least for now
{
@@ -120,7 +128,7 @@ private void ApplyDefaultWebViewSettings()
// WinForms. Leaving the code here because it's supposedly fixed in a newer version.
eventArgs.Handled = true;
}
- };
+ });
}
}
}
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/Microsoft.AspNetCore.Components.WebView.WindowsForms.csproj b/src/Components/WebView/Platforms/WindowsForms/src/Microsoft.AspNetCore.Components.WebView.WindowsForms.csproj
index 976f9878d420..c0267e983273 100644
--- a/src/Components/WebView/Platforms/WindowsForms/src/Microsoft.AspNetCore.Components.WebView.WindowsForms.csproj
+++ b/src/Components/WebView/Platforms/WindowsForms/src/Microsoft.AspNetCore.Components.WebView.WindowsForms.csproj
@@ -1,7 +1,10 @@
- $(DefaultNetCoreTargetFramework)-windows
+
+ $(DefaultNetCoreTargetFramework)-windows
Build Windows Forms applications with Blazor and WebView2.
true
true
@@ -11,6 +14,7 @@
+
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/RootComponent.cs b/src/Components/WebView/Platforms/WindowsForms/src/RootComponent.cs
index 037ada5ce24f..f4171bf806cb 100644
--- a/src/Components/WebView/Platforms/WindowsForms/src/RootComponent.cs
+++ b/src/Components/WebView/Platforms/WindowsForms/src/RootComponent.cs
@@ -5,6 +5,8 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+using WebView2Control = Microsoft.Web.WebView2.WinForms.WebView2;
namespace Microsoft.AspNetCore.Components.WebView.WindowsForms
{
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs
new file mode 100644
index 000000000000..cafd02faa1db
--- /dev/null
+++ b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs
@@ -0,0 +1,27 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.WindowsForms
+{
+ internal class WindowsFormsCoreWebView2AcceleratorKeyPressedEventArgsWrapper : ICoreWebView2AcceleratorKeyPressedEventArgsWrapper
+ {
+ private readonly CoreWebView2AcceleratorKeyPressedEventArgs _eventArgs;
+
+ public WindowsFormsCoreWebView2AcceleratorKeyPressedEventArgsWrapper(CoreWebView2AcceleratorKeyPressedEventArgs eventArgs)
+ {
+ _eventArgs = eventArgs;
+ }
+ public uint VirtualKey => _eventArgs.VirtualKey;
+
+ public int KeyEventLParam => _eventArgs.KeyEventLParam;
+
+ public bool Handled
+ {
+ get => _eventArgs.Handled;
+ set => _eventArgs.Handled = value;
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2SettingsWrapper.cs b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2SettingsWrapper.cs
new file mode 100644
index 000000000000..19d2d1da691c
--- /dev/null
+++ b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2SettingsWrapper.cs
@@ -0,0 +1,64 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.WindowsForms
+{
+ internal class WindowsFormsCoreWebView2SettingsWrapper : ICoreWebView2SettingsWrapper
+ {
+ private readonly CoreWebView2Settings _settings;
+
+ public WindowsFormsCoreWebView2SettingsWrapper(CoreWebView2Settings settings)
+ {
+ _settings = settings;
+ }
+
+ public bool IsScriptEnabled
+ {
+ get => _settings.IsScriptEnabled;
+ set => _settings.IsScriptEnabled = value;
+ }
+ public bool IsWebMessageEnabled
+ {
+ get => _settings.IsWebMessageEnabled;
+ set => _settings.IsWebMessageEnabled = value;
+ }
+ public bool AreDefaultScriptDialogsEnabled
+ {
+ get => _settings.AreDefaultScriptDialogsEnabled;
+ set => _settings.AreDefaultScriptDialogsEnabled = value;
+ }
+ public bool IsStatusBarEnabled
+ {
+ get => _settings.IsStatusBarEnabled;
+ set => _settings.IsStatusBarEnabled = value;
+ }
+ public bool AreDevToolsEnabled
+ {
+ get => _settings.AreDevToolsEnabled;
+ set => _settings.AreDevToolsEnabled = value;
+ }
+ public bool AreDefaultContextMenusEnabled
+ {
+ get => _settings.AreDefaultContextMenusEnabled;
+ set => _settings.AreDefaultContextMenusEnabled = value;
+ }
+ public bool AreHostObjectsAllowed
+ {
+ get => _settings.AreHostObjectsAllowed;
+ set => _settings.AreHostObjectsAllowed = value;
+ }
+ public bool IsZoomControlEnabled
+ {
+ get => _settings.IsZoomControlEnabled;
+ set => _settings.IsZoomControlEnabled = value;
+ }
+ public bool IsBuiltInErrorPageEnabled
+ {
+ get => _settings.IsBuiltInErrorPageEnabled;
+ set => _settings.IsBuiltInErrorPageEnabled = value;
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2WebResourceRequestWrapper.cs b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2WebResourceRequestWrapper.cs
new file mode 100644
index 000000000000..58f4a18ac319
--- /dev/null
+++ b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2WebResourceRequestWrapper.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.WindowsForms
+{
+ internal class WindowsFormsCoreWebView2WebResourceRequestWrapper : ICoreWebView2WebResourceRequestWrapper
+ {
+ private readonly CoreWebView2WebResourceRequestedEventArgs _webResourceRequestedEventArgs;
+
+ public WindowsFormsCoreWebView2WebResourceRequestWrapper(CoreWebView2WebResourceRequestedEventArgs webResourceRequestedEventArgs)
+ {
+ _webResourceRequestedEventArgs = webResourceRequestedEventArgs;
+ }
+
+ public string Uri
+ {
+ get => _webResourceRequestedEventArgs.Request.Uri;
+ set => _webResourceRequestedEventArgs.Request.Uri = value;
+ }
+ public string Method
+ {
+ get => _webResourceRequestedEventArgs.Request.Method;
+ set => _webResourceRequestedEventArgs.Request.Method = value;
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2WebResourceRequestedEventArgsWrapper.cs b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2WebResourceRequestedEventArgsWrapper.cs
new file mode 100644
index 000000000000..6fcc4a6e1182
--- /dev/null
+++ b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2WebResourceRequestedEventArgsWrapper.cs
@@ -0,0 +1,33 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.WindowsForms
+{
+ internal class WindowsFormsCoreWebView2WebResourceRequestedEventArgsWrapper : ICoreWebView2WebResourceRequestedEventArgsWrapper
+ {
+ private readonly CoreWebView2Environment _environment;
+ private readonly CoreWebView2WebResourceRequestedEventArgs _webResourceRequestedEventArgs;
+
+ public WindowsFormsCoreWebView2WebResourceRequestedEventArgsWrapper(CoreWebView2Environment environment, CoreWebView2WebResourceRequestedEventArgs webResourceRequestedEventArgs)
+ {
+ _environment = environment;
+ _webResourceRequestedEventArgs = webResourceRequestedEventArgs;
+
+ Request = new WindowsFormsCoreWebView2WebResourceRequestWrapper(webResourceRequestedEventArgs);
+ ResourceContext = (CoreWebView2WebResourceContextWrapper)webResourceRequestedEventArgs.ResourceContext;
+ }
+
+ public ICoreWebView2WebResourceRequestWrapper Request { get; }
+
+ public CoreWebView2WebResourceContextWrapper ResourceContext { get; }
+
+ public void SetResponse(Stream content, int statusCode, string statusMessage, string headerString)
+ {
+ _webResourceRequestedEventArgs.Response = _environment.CreateWebResourceResponse(content, statusCode, statusMessage, headerString);
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2Wrapper.cs b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2Wrapper.cs
new file mode 100644
index 000000000000..23703629f158
--- /dev/null
+++ b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsCoreWebView2Wrapper.cs
@@ -0,0 +1,85 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.WindowsForms
+{
+ internal class WindowsFormsCoreWebView2Wrapper : ICoreWebView2Wrapper
+ {
+ private readonly WindowsFormsWebView2Wrapper _webView2;
+ private WindowsFormsCoreWebView2SettingsWrapper _settings;
+
+ public WindowsFormsCoreWebView2Wrapper(WindowsFormsWebView2Wrapper webView2)
+ {
+ if (webView2 is null)
+ {
+ throw new ArgumentNullException(nameof(webView2));
+ }
+
+ _webView2 = webView2;
+ }
+
+ public ICoreWebView2SettingsWrapper Settings
+ {
+ get
+ {
+ if (_settings == null)
+ {
+ _settings = new WindowsFormsCoreWebView2SettingsWrapper(_webView2.WebView2.CoreWebView2.Settings);
+ }
+ return _settings;
+ }
+ }
+
+ public Task AddScriptToExecuteOnDocumentCreatedAsync(string javaScript)
+ {
+ return _webView2.WebView2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(javaScript);
+ }
+
+ public Action AddWebMessageReceivedHandler(Action messageReceivedHandler)
+ {
+ void nativeEventHandler(object sender, CoreWebView2WebMessageReceivedEventArgs e)
+ {
+ messageReceivedHandler(new WebMessageReceivedEventArgs(e.Source, e.TryGetWebMessageAsString()));
+ }
+
+ _webView2.WebView2.CoreWebView2.WebMessageReceived += nativeEventHandler;
+
+ // Return removal callback
+ return () =>
+ {
+ _webView2.WebView2.CoreWebView2.WebMessageReceived -= nativeEventHandler;
+ };
+ }
+
+ public void AddWebResourceRequestedFilter(string uri, CoreWebView2WebResourceContextWrapper resourceContext)
+ {
+ _webView2.WebView2.CoreWebView2.AddWebResourceRequestedFilter(uri, (CoreWebView2WebResourceContext)resourceContext);
+ }
+
+ public Action AddWebResourceRequestedHandler(EventHandler webResourceRequestedHandler)
+ {
+ void nativeEventHandler(object sender, CoreWebView2WebResourceRequestedEventArgs e)
+ {
+ webResourceRequestedHandler(_webView2.WebView2, new WindowsFormsCoreWebView2WebResourceRequestedEventArgsWrapper(_webView2.Environment, e));
+ }
+
+ _webView2.WebView2.CoreWebView2.WebResourceRequested += nativeEventHandler;
+
+ // Return removal callback
+ return () =>
+ {
+ _webView2.WebView2.CoreWebView2.WebResourceRequested -= nativeEventHandler;
+ };
+ }
+
+ public void PostWebMessageAsString(string webMessageAsString)
+ {
+ _webView2.WebView2.CoreWebView2.PostWebMessageAsString(webMessageAsString);
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsWebView2Wrapper.cs b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsWebView2Wrapper.cs
index 6459ea4cedd7..6dfe85eefa31 100644
--- a/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsWebView2Wrapper.cs
+++ b/src/Components/WebView/Platforms/WindowsForms/src/WindowsFormsWebView2Wrapper.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Components.WebView.WindowsForms
{
internal class WindowsFormsWebView2Wrapper : IWebView2Wrapper
{
- private readonly WebView2Control _webView2;
+ private readonly WindowsFormsCoreWebView2Wrapper _coreWebView2Wrapper;
public WindowsFormsWebView2Wrapper(WebView2Control webView2)
{
@@ -20,26 +20,42 @@ public WindowsFormsWebView2Wrapper(WebView2Control webView2)
throw new ArgumentNullException(nameof(webView2));
}
- _webView2 = webView2;
+ WebView2 = webView2;
+ _coreWebView2Wrapper = new WindowsFormsCoreWebView2Wrapper(this);
}
- public CoreWebView2 CoreWebView2 => _webView2.CoreWebView2;
+ public ICoreWebView2Wrapper CoreWebView2 => _coreWebView2Wrapper;
public Uri Source
{
- get => _webView2.Source;
- set => _webView2.Source = value;
+ get => WebView2.Source;
+ set => WebView2.Source = value;
}
- public event EventHandler AcceleratorKeyPressed
+ public WebView2Control WebView2 { get; }
+
+ public CoreWebView2Environment Environment { get; set; }
+
+ public Action AddAcceleratorKeyPressedHandler(EventHandler eventHandler)
+ {
+ EventHandler realHandler = (object sender, CoreWebView2AcceleratorKeyPressedEventArgs e) =>
+ {
+ eventHandler(WebView2, new WindowsFormsCoreWebView2AcceleratorKeyPressedEventArgsWrapper(e));
+ };
+ WebView2.AcceleratorKeyPressed += realHandler;
+
+ // Return removal callback
+ return () => { WebView2.AcceleratorKeyPressed -= realHandler; };
+ }
+
+ public async Task CreateEnvironmentAsync()
{
- add => _webView2.AcceleratorKeyPressed += value;
- remove => _webView2.AcceleratorKeyPressed -= value;
+ Environment = await CoreWebView2Environment.CreateAsync();
}
- public Task EnsureCoreWebView2Async(CoreWebView2Environment environment = null)
+ public Task EnsureCoreWebView2Async()
{
- return _webView2.EnsureCoreWebView2Async(environment);
+ return WebView2.EnsureCoreWebView2Async(Environment);
}
}
}
diff --git a/src/Components/WebView/Platforms/Wpf/src/BlazorWebView.cs b/src/Components/WebView/Platforms/Wpf/src/BlazorWebView.cs
index 0e94db1b31e3..a4aae055a15d 100644
--- a/src/Components/WebView/Platforms/Wpf/src/BlazorWebView.cs
+++ b/src/Components/WebView/Platforms/Wpf/src/BlazorWebView.cs
@@ -144,7 +144,7 @@ private void StartWebViewCoreIfPossible()
var hostPageRelativePath = Path.GetRelativePath(contentRootDir, HostPage);
var fileProvider = new PhysicalFileProvider(contentRootDir);
- _webviewManager = new WebView2WebViewManager(new WpfWeb2ViewWrapper(_webview), Services, WpfDispatcher.Instance, fileProvider, hostPageRelativePath);
+ _webviewManager = new WebView2WebViewManager(new WpfWebView2Wrapper(_webview), Services, WpfDispatcher.Instance, fileProvider, hostPageRelativePath);
foreach (var rootComponent in RootComponents)
{
// Since the page isn't loaded yet, this will always complete synchronously
diff --git a/src/Components/WebView/Platforms/Wpf/src/Microsoft.AspNetCore.Components.WebView.Wpf.csproj b/src/Components/WebView/Platforms/Wpf/src/Microsoft.AspNetCore.Components.WebView.Wpf.csproj
index abfb7bbc3151..87f347764d0e 100644
--- a/src/Components/WebView/Platforms/Wpf/src/Microsoft.AspNetCore.Components.WebView.Wpf.csproj
+++ b/src/Components/WebView/Platforms/Wpf/src/Microsoft.AspNetCore.Components.WebView.Wpf.csproj
@@ -1,7 +1,10 @@
- $(DefaultNetCoreTargetFramework)-windows
+
+ $(DefaultNetCoreTargetFramework)-windows
Build WPF applications with Blazor and WebView2.
true
true
@@ -11,6 +14,7 @@
+
diff --git a/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs
new file mode 100644
index 000000000000..1705677f92d5
--- /dev/null
+++ b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2AcceleratorKeyPressedEventArgsWrapper.cs
@@ -0,0 +1,27 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.Wpf
+{
+ internal class WpfCoreWebView2AcceleratorKeyPressedEventArgsWrapper : ICoreWebView2AcceleratorKeyPressedEventArgsWrapper
+ {
+ private readonly CoreWebView2AcceleratorKeyPressedEventArgs _eventArgs;
+
+ public WpfCoreWebView2AcceleratorKeyPressedEventArgsWrapper(CoreWebView2AcceleratorKeyPressedEventArgs eventArgs)
+ {
+ _eventArgs = eventArgs;
+ }
+ public uint VirtualKey => _eventArgs.VirtualKey;
+
+ public int KeyEventLParam => _eventArgs.KeyEventLParam;
+
+ public bool Handled
+ {
+ get => _eventArgs.Handled;
+ set => _eventArgs.Handled = value;
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2SettingsWrapper.cs b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2SettingsWrapper.cs
new file mode 100644
index 000000000000..6e7180d02a16
--- /dev/null
+++ b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2SettingsWrapper.cs
@@ -0,0 +1,64 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.Wpf
+{
+ internal class WpfCoreWebView2SettingsWrapper : ICoreWebView2SettingsWrapper
+ {
+ private readonly CoreWebView2Settings _settings;
+
+ public WpfCoreWebView2SettingsWrapper(CoreWebView2Settings settings)
+ {
+ _settings = settings;
+ }
+
+ public bool IsScriptEnabled
+ {
+ get => _settings.IsScriptEnabled;
+ set => _settings.IsScriptEnabled = value;
+ }
+ public bool IsWebMessageEnabled
+ {
+ get => _settings.IsWebMessageEnabled;
+ set => _settings.IsWebMessageEnabled = value;
+ }
+ public bool AreDefaultScriptDialogsEnabled
+ {
+ get => _settings.AreDefaultScriptDialogsEnabled;
+ set => _settings.AreDefaultScriptDialogsEnabled = value;
+ }
+ public bool IsStatusBarEnabled
+ {
+ get => _settings.IsStatusBarEnabled;
+ set => _settings.IsStatusBarEnabled = value;
+ }
+ public bool AreDevToolsEnabled
+ {
+ get => _settings.AreDevToolsEnabled;
+ set => _settings.AreDevToolsEnabled = value;
+ }
+ public bool AreDefaultContextMenusEnabled
+ {
+ get => _settings.AreDefaultContextMenusEnabled;
+ set => _settings.AreDefaultContextMenusEnabled = value;
+ }
+ public bool AreHostObjectsAllowed
+ {
+ get => _settings.AreHostObjectsAllowed;
+ set => _settings.AreHostObjectsAllowed = value;
+ }
+ public bool IsZoomControlEnabled
+ {
+ get => _settings.IsZoomControlEnabled;
+ set => _settings.IsZoomControlEnabled = value;
+ }
+ public bool IsBuiltInErrorPageEnabled
+ {
+ get => _settings.IsBuiltInErrorPageEnabled;
+ set => _settings.IsBuiltInErrorPageEnabled = value;
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2WebResourceRequestWrapper.cs b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2WebResourceRequestWrapper.cs
new file mode 100644
index 000000000000..333508e19180
--- /dev/null
+++ b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2WebResourceRequestWrapper.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.Wpf
+{
+ internal class WpfCoreWebView2WebResourceRequestWrapper : ICoreWebView2WebResourceRequestWrapper
+ {
+ private readonly CoreWebView2WebResourceRequestedEventArgs _webResourceRequestedEventArgs;
+
+ public WpfCoreWebView2WebResourceRequestWrapper(CoreWebView2WebResourceRequestedEventArgs webResourceRequestedEventArgs)
+ {
+ _webResourceRequestedEventArgs = webResourceRequestedEventArgs;
+ }
+
+ public string Uri
+ {
+ get => _webResourceRequestedEventArgs.Request.Uri;
+ set => _webResourceRequestedEventArgs.Request.Uri = value;
+ }
+ public string Method
+ {
+ get => _webResourceRequestedEventArgs.Request.Method;
+ set => _webResourceRequestedEventArgs.Request.Method = value;
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2WebResourceRequestedEventArgsWrapper.cs b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2WebResourceRequestedEventArgsWrapper.cs
new file mode 100644
index 000000000000..ec81295706fd
--- /dev/null
+++ b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2WebResourceRequestedEventArgsWrapper.cs
@@ -0,0 +1,33 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.Wpf
+{
+ internal class WpfCoreWebView2WebResourceRequestedEventArgsWrapper : ICoreWebView2WebResourceRequestedEventArgsWrapper
+ {
+ private readonly CoreWebView2Environment _environment;
+ private readonly CoreWebView2WebResourceRequestedEventArgs _webResourceRequestedEventArgs;
+
+ public WpfCoreWebView2WebResourceRequestedEventArgsWrapper(CoreWebView2Environment environment, CoreWebView2WebResourceRequestedEventArgs webResourceRequestedEventArgs)
+ {
+ _environment = environment;
+ _webResourceRequestedEventArgs = webResourceRequestedEventArgs;
+
+ Request = new WpfCoreWebView2WebResourceRequestWrapper(webResourceRequestedEventArgs);
+ ResourceContext = (CoreWebView2WebResourceContextWrapper)webResourceRequestedEventArgs.ResourceContext;
+ }
+
+ public ICoreWebView2WebResourceRequestWrapper Request { get; }
+
+ public CoreWebView2WebResourceContextWrapper ResourceContext { get; }
+
+ public void SetResponse(Stream content, int statusCode, string statusMessage, string headerString)
+ {
+ _webResourceRequestedEventArgs.Response = _environment.CreateWebResourceResponse(content, statusCode, statusMessage, headerString);
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2Wrapper.cs b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2Wrapper.cs
new file mode 100644
index 000000000000..0987823374d4
--- /dev/null
+++ b/src/Components/WebView/Platforms/Wpf/src/WpfCoreWebView2Wrapper.cs
@@ -0,0 +1,85 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components.WebView.WebView2;
+using Microsoft.Web.WebView2.Core;
+
+namespace Microsoft.AspNetCore.Components.WebView.Wpf
+{
+ internal class WpfCoreWebView2Wrapper : ICoreWebView2Wrapper
+ {
+ private readonly WpfWebView2Wrapper _webView2;
+ private WpfCoreWebView2SettingsWrapper _settings;
+
+ public WpfCoreWebView2Wrapper(WpfWebView2Wrapper webView2)
+ {
+ if (webView2 is null)
+ {
+ throw new ArgumentNullException(nameof(webView2));
+ }
+
+ _webView2 = webView2;
+ }
+
+ public ICoreWebView2SettingsWrapper Settings
+ {
+ get
+ {
+ if (_settings == null)
+ {
+ _settings = new WpfCoreWebView2SettingsWrapper(_webView2.WebView2.CoreWebView2.Settings);
+ }
+ return _settings;
+ }
+ }
+
+ public Task AddScriptToExecuteOnDocumentCreatedAsync(string javaScript)
+ {
+ return _webView2.WebView2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(javaScript);
+ }
+
+ public Action AddWebMessageReceivedHandler(Action messageReceivedHandler)
+ {
+ void nativeEventHandler(object sender, CoreWebView2WebMessageReceivedEventArgs e)
+ {
+ messageReceivedHandler(new WebMessageReceivedEventArgs(e.Source, e.TryGetWebMessageAsString()));
+ }
+
+ _webView2.WebView2.CoreWebView2.WebMessageReceived += nativeEventHandler;
+
+ // Return removal callback
+ return () =>
+ {
+ _webView2.WebView2.CoreWebView2.WebMessageReceived -= nativeEventHandler;
+ };
+ }
+
+ public void AddWebResourceRequestedFilter(string uri, CoreWebView2WebResourceContextWrapper resourceContext)
+ {
+ _webView2.WebView2.CoreWebView2.AddWebResourceRequestedFilter(uri, (CoreWebView2WebResourceContext)resourceContext);
+ }
+
+ public Action AddWebResourceRequestedHandler(EventHandler webResourceRequestedHandler)
+ {
+ void nativeEventHandler(object sender, CoreWebView2WebResourceRequestedEventArgs e)
+ {
+ webResourceRequestedHandler(_webView2.WebView2, new WpfCoreWebView2WebResourceRequestedEventArgsWrapper(_webView2.Environment, e));
+ }
+
+ _webView2.WebView2.CoreWebView2.WebResourceRequested += nativeEventHandler;
+
+ // Return removal callback
+ return () =>
+ {
+ _webView2.WebView2.CoreWebView2.WebResourceRequested -= nativeEventHandler;
+ };
+ }
+
+ public void PostWebMessageAsString(string webMessageAsString)
+ {
+ _webView2.WebView2.CoreWebView2.PostWebMessageAsString(webMessageAsString);
+ }
+ }
+}
diff --git a/src/Components/WebView/Platforms/Wpf/src/WpfWebView2Wrapper.cs b/src/Components/WebView/Platforms/Wpf/src/WpfWebView2Wrapper.cs
index 3ec16a7d40b5..226f30e30b7a 100644
--- a/src/Components/WebView/Platforms/Wpf/src/WpfWebView2Wrapper.cs
+++ b/src/Components/WebView/Platforms/Wpf/src/WpfWebView2Wrapper.cs
@@ -9,40 +9,53 @@
namespace Microsoft.AspNetCore.Components.WebView.Wpf
{
- internal class WpfWeb2ViewWrapper : IWebView2Wrapper
+ internal class WpfWebView2Wrapper : IWebView2Wrapper
{
- private readonly WebView2Control _webView2;
- private bool _hasInitialized;
+ private readonly WpfCoreWebView2Wrapper _coreWebView2Wrapper;
- public WpfWeb2ViewWrapper(WebView2Control webView2)
+ public WpfWebView2Wrapper(WebView2Control webView2)
{
- _webView2 = webView2 ?? throw new ArgumentNullException(nameof(webView2));
+ if (webView2 is null)
+ {
+ throw new ArgumentNullException(nameof(webView2));
+ }
+
+ WebView2 = webView2;
+ _coreWebView2Wrapper = new WpfCoreWebView2Wrapper(this);
}
- public CoreWebView2 CoreWebView2 => _webView2.CoreWebView2;
+ public ICoreWebView2Wrapper CoreWebView2 => _coreWebView2Wrapper;
public Uri Source
{
- get => _webView2.Source;
- set => _webView2.Source = value;
+ get => WebView2.Source;
+ set => WebView2.Source = value;
}
- public event EventHandler AcceleratorKeyPressed
+ public WebView2Control WebView2 { get; }
+
+ public CoreWebView2Environment Environment { get; set; }
+
+ public Action AddAcceleratorKeyPressedHandler(EventHandler eventHandler)
{
- add => _webView2.AcceleratorKeyPressed += value;
- remove => _webView2.AcceleratorKeyPressed -= value;
+ EventHandler realHandler = (object sender, CoreWebView2AcceleratorKeyPressedEventArgs e) =>
+ {
+ eventHandler(WebView2, new WpfCoreWebView2AcceleratorKeyPressedEventArgsWrapper(e));
+ };
+ WebView2.AcceleratorKeyPressed += realHandler;
+
+ // Return removal callback
+ return () => { WebView2.AcceleratorKeyPressed -= realHandler; };
}
- public Task EnsureCoreWebView2Async(CoreWebView2Environment environment = null)
+ public async Task CreateEnvironmentAsync()
{
- if (_hasInitialized)
- {
- // We don't want people to think they can set more than one environment
- throw new InvalidOperationException($"{nameof(EnsureCoreWebView2Async)} may only be called once per control.");
- }
+ Environment = await CoreWebView2Environment.CreateAsync();
+ }
- _hasInitialized = true;
- return _webView2.EnsureCoreWebView2Async(environment);
+ public Task EnsureCoreWebView2Async()
+ {
+ return WebView2.EnsureCoreWebView2Async(Environment);
}
}
}