From ccbccca8ff531cb8beeea71e910c98e5c1292efe Mon Sep 17 00:00:00 2001 From: "dongsug.song" Date: Thu, 5 Sep 2024 22:12:37 +0900 Subject: [PATCH] [NUI] Add WebAuthDisplayQR, Response and MediaPermission --- .../Interop.WebUserMediaPermissionRequest.cs | 36 +++++ .../src/internal/Interop/Interop.WebView.cs | 14 +- .../WebView/WebUserMediaPermissionRequest.cs | 64 +++++++++ ...ViewUserMediaPermissionRequestEventArgs.cs | 48 +++++++ .../WebViewWebAuthDisplayQREventArgs.cs | 40 ++++++ src/Tizen.NUI/src/public/WebView/WebView.cs | 131 ++++++++++++++++++ 6 files changed, 332 insertions(+), 1 deletion(-) create mode 100755 src/Tizen.NUI/src/internal/Interop/Interop.WebUserMediaPermissionRequest.cs create mode 100755 src/Tizen.NUI/src/internal/WebView/WebUserMediaPermissionRequest.cs create mode 100755 src/Tizen.NUI/src/internal/WebView/WebViewUserMediaPermissionRequestEventArgs.cs create mode 100755 src/Tizen.NUI/src/internal/WebView/WebViewWebAuthDisplayQREventArgs.cs diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.WebUserMediaPermissionRequest.cs b/src/Tizen.NUI/src/internal/Interop/Interop.WebUserMediaPermissionRequest.cs new file mode 100755 index 00000000000..93b1d93658b --- /dev/null +++ b/src/Tizen.NUI/src/internal/Interop/Interop.WebUserMediaPermissionRequest.cs @@ -0,0 +1,36 @@ +/* + * Copyright(c) 2024 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +namespace Tizen.NUI +{ + internal static partial class Interop + { + internal static partial class WebUserMediaPermissionRequest + { + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_delete_UserMediaPermissionRequest")] + public static extern void Delete(global::System.Runtime.InteropServices.HandleRef webPermission); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_UserMediaPermissionRequest_Set")] + public static extern void Set(global::System.Runtime.InteropServices.HandleRef webPermission, bool allowed); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_UserMediaPermissionRequest_Suspend")] + [return: global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.U1)] + public static extern bool Suspend(global::System.Runtime.InteropServices.HandleRef webPermission); + } + } +} + diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs b/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs index 93a471f79bb..fad83bc31b1 100755 --- a/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs +++ b/src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs @@ -1,5 +1,5 @@ /* - * Copyright(c) 2021 Samsung Electronics Co., Ltd. + * Copyright(c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -333,6 +333,18 @@ internal static partial class WebView [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_GetPlainTextAsynchronously")] public static extern void GetPlainTextAsynchronously(global::System.Runtime.InteropServices.HandleRef webViewRef, global::System.Runtime.InteropServices.HandleRef callbackRef); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_WebAuthenticationCancel")] + public static extern void WebAuthenticationCancel(global::System.Runtime.InteropServices.HandleRef webViewRef); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_RegisterWebAuthDisplayQRCallback")] + public static extern void RegisterWebAuthDisplayQRCallback(global::System.Runtime.InteropServices.HandleRef webViewRef, global::System.Runtime.InteropServices.HandleRef callbackRef); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_RegisterWebAuthResponseCallback")] + public static extern void RegisterWebAuthResponseCallback(global::System.Runtime.InteropServices.HandleRef webViewRef, global::System.Runtime.InteropServices.HandleRef callbackRef); + + [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_RegisterUserMediaPermissionRequestCallback")] + public static extern void RegisterUserMediaPermissionRequestCallback(global::System.Runtime.InteropServices.HandleRef webViewRef, global::System.Runtime.InteropServices.HandleRef callbackRef); } } } diff --git a/src/Tizen.NUI/src/internal/WebView/WebUserMediaPermissionRequest.cs b/src/Tizen.NUI/src/internal/WebView/WebUserMediaPermissionRequest.cs new file mode 100755 index 00000000000..16b01c317e6 --- /dev/null +++ b/src/Tizen.NUI/src/internal/WebView/WebUserMediaPermissionRequest.cs @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +using System; +using System.ComponentModel; + +namespace Tizen.NUI +{ + /// + /// WebUserMediaPermissionRequest. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WebUserMediaPermissionRequest : Disposable + { + internal WebUserMediaPermissionRequest(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn) + { + } + + /// This will not be public opened. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr) + { + Interop.WebUserMediaPermissionRequest.Delete(swigCPtr); + } + + /// + /// Set allowed. + /// + /// Allowed or not + [EditorBrowsable(EditorBrowsableState.Never)] + public void Set(bool allowed) + { + Interop.WebUserMediaPermissionRequest.Set(SwigCPtr, allowed); + if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + } + + /// + /// Suspend. + /// + /// true for done, otherwise, false + [EditorBrowsable(EditorBrowsableState.Never)] + public bool Suspend() + { + bool ret = Interop.WebUserMediaPermissionRequest.Suspend(SwigCPtr); + if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } +} diff --git a/src/Tizen.NUI/src/internal/WebView/WebViewUserMediaPermissionRequestEventArgs.cs b/src/Tizen.NUI/src/internal/WebView/WebViewUserMediaPermissionRequestEventArgs.cs new file mode 100755 index 00000000000..788cdf4a2be --- /dev/null +++ b/src/Tizen.NUI/src/internal/WebView/WebViewUserMediaPermissionRequestEventArgs.cs @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +using System; +using System.ComponentModel; + +namespace Tizen.NUI +{ + /// + /// Event arguments that WebViewUserMediaPermissionRequest. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WebViewUserMediaPermissionRequestEventArgs : EventArgs + { + internal WebViewUserMediaPermissionRequestEventArgs(WebUserMediaPermissionRequest permission, string message) + { + UserMediaPermissionRequest = permission; + Message = message; + } + + /// + /// Gets UserMediaPermissionRequest. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public WebUserMediaPermissionRequest UserMediaPermissionRequest { get; } + + /// + /// Gets Message. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public string Message { get; } + + } +} diff --git a/src/Tizen.NUI/src/internal/WebView/WebViewWebAuthDisplayQREventArgs.cs b/src/Tizen.NUI/src/internal/WebView/WebViewWebAuthDisplayQREventArgs.cs new file mode 100755 index 00000000000..4e7507b08ae --- /dev/null +++ b/src/Tizen.NUI/src/internal/WebView/WebViewWebAuthDisplayQREventArgs.cs @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +using System; +using System.ComponentModel; + +namespace Tizen.NUI +{ + /// + /// Event arguments that passed via the WebView.WebAuthDisplayQR. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WebViewWebAuthDisplayQREventArgs : EventArgs + { + internal WebViewWebAuthDisplayQREventArgs(string contents) + { + Contents = contents; + } + + /// + /// The string contents to make QR code image in user side. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public string Contents { get; } + } +} diff --git a/src/Tizen.NUI/src/public/WebView/WebView.cs b/src/Tizen.NUI/src/public/WebView/WebView.cs index bcbe42dbf9b..2208fd6da18 100755 --- a/src/Tizen.NUI/src/public/WebView/WebView.cs +++ b/src/Tizen.NUI/src/public/WebView/WebView.cs @@ -162,6 +162,14 @@ static WebView() private PlainTextReceivedCallback plainTextReceivedCallback; + private EventHandler webAuthDisplayQREventHandler; + private WebViewWebAuthDisplayQRCallback webAuthDisplayQRCallback; + private EventHandler webAuthResponseEventHandler; + private WebViewWebAuthResponseCallback webAuthResponseCallback; + + private EventHandler userMediaPermissionRequestEventHandler; + private WebViewUserMediaPermissionRequestCallback userMediaPermissionRequestCallback; + /// /// Creates a WebView. @@ -325,6 +333,10 @@ protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef [EditorBrowsable(EditorBrowsableState.Never)] public delegate void GeolocationPermissionCallback(string host, string protocol); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + [EditorBrowsable(EditorBrowsableState.Never)] + public delegate void UserMediaPermissionCallback(IntPtr permission); + /// /// The callback function that is invoked when hit test is finished. /// @@ -393,6 +405,16 @@ protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef [UnmanagedFunctionPointer(CallingConvention.StdCall)] private delegate void WebViewTextFoundCallback(uint count); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void WebViewWebAuthDisplayQRCallback(string contents); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void WebViewWebAuthResponseCallback(); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void WebViewUserMediaPermissionRequestCallback(IntPtr permission, string message); + + /// /// Event for the PageLoadStarted signal which can be used to subscribe or unsubscribe the event handler.
/// This signal is emitted when page loading has started.
@@ -981,6 +1003,89 @@ public event EventHandler TextFound } } + /// + /// Event to informs user application to display QR code popup for passkey scenario. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler WebAuthDisplayQR + { + add + { + if (webAuthDisplayQREventHandler == null) + { + webAuthDisplayQRCallback = OnWebAuthDisplayQR; + IntPtr ip = Marshal.GetFunctionPointerForDelegate(webAuthDisplayQRCallback); + Interop.WebView.RegisterWebAuthDisplayQRCallback(SwigCPtr, new HandleRef(this, ip)); + } + webAuthDisplayQREventHandler += value; + } + remove + { + webAuthDisplayQREventHandler -= value; + if (webAuthDisplayQREventHandler == null) + { + IntPtr ip = IntPtr.Zero; + Interop.WebView.RegisterWebAuthDisplayQRCallback(SwigCPtr, new HandleRef(this, ip)); + } + } + } + + /// + /// Event to informs user application that the passkey registration and authentication has been successful. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler WebAuthResponse + { + add + { + if (webAuthResponseEventHandler == null) + { + webAuthResponseCallback = OnWebAuthResponse; + IntPtr ip = Marshal.GetFunctionPointerForDelegate(webAuthResponseCallback); + Interop.WebView.RegisterWebAuthResponseCallback(SwigCPtr, new HandleRef(this, ip)); + } + webAuthResponseEventHandler += value; + } + remove + { + webAuthResponseEventHandler -= value; + if (webAuthResponseEventHandler == null) + { + IntPtr ip = IntPtr.Zero; + Interop.WebView.RegisterWebAuthResponseCallback(SwigCPtr, new HandleRef(this, ip)); + } + } + } + + + /// + /// Event to UserMediaPermissionRequest. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public event EventHandler UserMediaPermissionRequest + { + add + { + if (userMediaPermissionRequestEventHandler == null) + { + userMediaPermissionRequestCallback = OnUserMediaPermissionRequset; + IntPtr ip = Marshal.GetFunctionPointerForDelegate(userMediaPermissionRequestCallback); + Interop.WebView.RegisterUserMediaPermissionRequestCallback(SwigCPtr, new HandleRef(this, ip)); + } + userMediaPermissionRequestEventHandler += value; + } + remove + { + userMediaPermissionRequestEventHandler -= value; + if (userMediaPermissionRequestEventHandler == null) + { + IntPtr ip = IntPtr.Zero; + Interop.WebView.RegisterUserMediaPermissionRequestCallback(SwigCPtr, new HandleRef(this, ip)); + } + } + } + + /// /// Options for searching texts. /// @@ -2821,6 +2926,16 @@ public void GetPlainTextAsynchronously(PlainTextReceivedCallback callback) if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } + /// + /// cancel in progress web authentication that is passkey operation. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public void WebAuthenticationCancel() + { + Interop.WebView.WebAuthenticationCancel(SwigCPtr); + if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); + } + internal static WebView DownCast(BaseHandle handle) { WebView ret = new WebView(Interop.WebView.DownCast(BaseHandle.getCPtr(handle)), true); @@ -2981,5 +3096,21 @@ private void OnTextFound(uint count) { textFoundEventHandler?.Invoke(this, new WebViewTextFoundEventArgs(count)); } + + private void OnWebAuthDisplayQR(string contents) + { + webAuthDisplayQREventHandler?.Invoke(this, new WebViewWebAuthDisplayQREventArgs(contents)); + } + + private void OnWebAuthResponse() + { + webAuthResponseEventHandler?.Invoke(this, new EventArgs()); + } + + private void OnUserMediaPermissionRequset(IntPtr permission, string message) + { + userMediaPermissionRequestEventHandler?.Invoke(this, new WebViewUserMediaPermissionRequestEventArgs(new WebUserMediaPermissionRequest(permission, true), message)); + } + } }