diff --git a/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs b/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs index 9e333adf..dbb2943e 100644 --- a/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs +++ b/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. +using System; using Microsoft.MobileBlazorBindings.Core; using Microsoft.MobileBlazorBindings.WebView.Elements; using XF = Xamarin.Forms; @@ -12,6 +13,8 @@ public class WebViewHandler : ViewHandler public WebViewExtended Control { get; } private ulong _onWebMessageReceivedEventHandlerId; + private ulong _onNavigationStartingEventHandlerId; + private ulong _onNavigationFinishedEventHandlerId; public WebViewHandler(NativeComponentRenderer renderer, WebViewExtended control) : base(renderer, control) @@ -30,6 +33,33 @@ public WebViewHandler(NativeComponentRenderer renderer, WebViewExtended control) renderer.Dispatcher.InvokeAsync(() => renderer.DispatchEventAsync(_onWebMessageReceivedEventHandlerId, null, new WebView.WebMessageEventArgs { Message = message })); } }; + + ConfigureEvent( + eventName: "onnavigationstarting", + setId: id => _onNavigationStartingEventHandlerId = id, + clearId: id => { if (_onNavigationStartingEventHandlerId == id) { _onNavigationStartingEventHandlerId = 0; } }); + + Control.OnNavigationStarting += (sender, uri) => + { + if (_onNavigationStartingEventHandlerId != default) + { + renderer.Dispatcher.InvokeAsync(() => renderer.DispatchEventAsync(_onNavigationStartingEventHandlerId, null, new WebView.NavigationEventArgs() { Uri = uri })); + } + }; + + ConfigureEvent( + eventName: "onnavigationfinished", + setId: id => _onNavigationFinishedEventHandlerId = id, + clearId: id => { if (_onNavigationFinishedEventHandlerId == id) { _onNavigationFinishedEventHandlerId = 0; } }); + + Control.OnNavigationFinished += (sender, uri) => + { + if (_onNavigationFinishedEventHandlerId != default) + { + renderer.Dispatcher.InvokeAsync(() => renderer.DispatchEventAsync(_onNavigationFinishedEventHandlerId, null, new WebView.NavigationEventArgs() { Uri = uri })); + } + }; + } public override void ApplyAttribute(ulong attributeEventHandlerId, string attributeName, object attributeValue, string attributeEventUpdatesAttributeName) diff --git a/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs b/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs index c03805b7..fa874581 100644 --- a/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs +++ b/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs @@ -23,6 +23,8 @@ static WebView() [Parameter] public XF.WebViewSource Source { get; set; } [Parameter] public EventCallback OnWebMessageReceived { get; set; } + [Parameter] public EventCallback OnNavigationStarting { get; set; } + [Parameter] public EventCallback OnNavigationFinished { get; set; } public void SendMessage(string message) { @@ -34,6 +36,8 @@ protected override void RenderAttributes(AttributesBuilder builder) base.RenderAttributes(builder); builder.AddAttribute("onwebmessagereceived", EventCallback.Factory.Create(this, HandleOnWebMessageReceived)); + builder.AddAttribute("onnavigationstarting", EventCallback.Factory.Create(this, HandleOnNavigationStarting)); + builder.AddAttribute("onnavigationfinished", EventCallback.Factory.Create(this, HandleOnNavigationFinished)); switch (Source) { @@ -49,9 +53,20 @@ protected override void RenderAttributes(AttributesBuilder builder) private Task HandleOnWebMessageReceived(WebMessageEventArgs args) => OnWebMessageReceived.InvokeAsync(args.Message); + private Task HandleOnNavigationStarting(NavigationEventArgs args) + => OnNavigationStarting.InvokeAsync(args.Uri); + + private Task HandleOnNavigationFinished(NavigationEventArgs args) + => OnNavigationFinished.InvokeAsync(args.Uri); + internal class WebMessageEventArgs : EventArgs { public string Message { get; set; } } + + internal class NavigationEventArgs : EventArgs + { + public Uri Uri { get; set; } + } } }