From 282023340ca5a0e92cf98ea6ff4298325dd5d3dc Mon Sep 17 00:00:00 2001 From: Pietro di Caprio Date: Tue, 19 Jan 2021 16:24:09 +0100 Subject: [PATCH 1/2] Expose starting and finished load events --- .../Elements/Handlers/WebViewHandler.cs | 7 +++++++ src/Microsoft.MobileBlazorBindings/Elements/WebView.cs | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs b/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs index 9e333adf..3009960a 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; @@ -42,6 +43,12 @@ public override void ApplyAttribute(ulong attributeEventHandlerId, string attrib case nameof(XF.UrlWebViewSource): Control.Source = new XF.UrlWebViewSource { Url = (string)attributeValue }; break; + case "OnNavigationStarting": + Control.OnNavigationStarting += (EventHandler)attributeValue; + break; + case "OnNavigationFinished": + Control.OnNavigationFinished += (EventHandler)attributeValue; + break; default: base.ApplyAttribute(attributeEventHandlerId, attributeName, attributeValue, attributeEventUpdatesAttributeName); break; diff --git a/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs b/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs index c03805b7..049bac34 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 EventHandler OnNavigationStarting { get; set; } + [Parameter] public EventHandler OnNavigationFinished { get; set; } public void SendMessage(string message) { @@ -34,7 +36,9 @@ protected override void RenderAttributes(AttributesBuilder builder) base.RenderAttributes(builder); builder.AddAttribute("onwebmessagereceived", EventCallback.Factory.Create(this, HandleOnWebMessageReceived)); - + builder.AddAttribute("OnNavigationStarting", OnNavigationStarting); + builder.AddAttribute("OnNavigationFinished", OnNavigationFinished); + switch (Source) { case XF.HtmlWebViewSource htmlWebViewSource: From 4e0a269fed44dc6b4e9406d8583ab74124165019 Mon Sep 17 00:00:00 2001 From: Pietro di Caprio Date: Thu, 21 Jan 2021 10:22:13 +0100 Subject: [PATCH 2/2] (WIP) Expose WebView load events --- .../Elements/Handlers/WebViewHandler.cs | 35 +++++++++++++++---- .../Elements/WebView.cs | 21 ++++++++--- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs b/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs index 3009960a..dbb2943e 100644 --- a/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs +++ b/src/Microsoft.MobileBlazorBindings/Elements/Handlers/WebViewHandler.cs @@ -13,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) @@ -31,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) @@ -43,12 +72,6 @@ public override void ApplyAttribute(ulong attributeEventHandlerId, string attrib case nameof(XF.UrlWebViewSource): Control.Source = new XF.UrlWebViewSource { Url = (string)attributeValue }; break; - case "OnNavigationStarting": - Control.OnNavigationStarting += (EventHandler)attributeValue; - break; - case "OnNavigationFinished": - Control.OnNavigationFinished += (EventHandler)attributeValue; - break; default: base.ApplyAttribute(attributeEventHandlerId, attributeName, attributeValue, attributeEventUpdatesAttributeName); break; diff --git a/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs b/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs index 049bac34..fa874581 100644 --- a/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs +++ b/src/Microsoft.MobileBlazorBindings/Elements/WebView.cs @@ -23,8 +23,8 @@ static WebView() [Parameter] public XF.WebViewSource Source { get; set; } [Parameter] public EventCallback OnWebMessageReceived { get; set; } - [Parameter] public EventHandler OnNavigationStarting { get; set; } - [Parameter] public EventHandler OnNavigationFinished { get; set; } + [Parameter] public EventCallback OnNavigationStarting { get; set; } + [Parameter] public EventCallback OnNavigationFinished { get; set; } public void SendMessage(string message) { @@ -36,9 +36,9 @@ protected override void RenderAttributes(AttributesBuilder builder) base.RenderAttributes(builder); builder.AddAttribute("onwebmessagereceived", EventCallback.Factory.Create(this, HandleOnWebMessageReceived)); - builder.AddAttribute("OnNavigationStarting", OnNavigationStarting); - builder.AddAttribute("OnNavigationFinished", OnNavigationFinished); - + builder.AddAttribute("onnavigationstarting", EventCallback.Factory.Create(this, HandleOnNavigationStarting)); + builder.AddAttribute("onnavigationfinished", EventCallback.Factory.Create(this, HandleOnNavigationFinished)); + switch (Source) { case XF.HtmlWebViewSource htmlWebViewSource: @@ -53,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; } + } } }