Skip to content

Commit

Permalink
[NUI] Add WebAuthDisplayQR, Response and MediaPermission
Browse files Browse the repository at this point in the history
  • Loading branch information
dongsug-song committed Sep 27, 2024
1 parent 09e3c21 commit ccbccca
Show file tree
Hide file tree
Showing 6 changed files with 332 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -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);
}
}
}

14 changes: 13 additions & 1 deletion src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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);
}
}
}
Original file line number Diff line number Diff line change
@@ -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
{
/// <summary>
/// WebUserMediaPermissionRequest.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class WebUserMediaPermissionRequest : Disposable
{
internal WebUserMediaPermissionRequest(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn)
{
}

/// This will not be public opened.
/// <param name="swigCPtr"></param>
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void ReleaseSwigCPtr(System.Runtime.InteropServices.HandleRef swigCPtr)
{
Interop.WebUserMediaPermissionRequest.Delete(swigCPtr);
}

/// <summary>
/// Set allowed.
/// </summary>
/// <param name="allowed">Allowed or not</param>
[EditorBrowsable(EditorBrowsableState.Never)]
public void Set(bool allowed)
{
Interop.WebUserMediaPermissionRequest.Set(SwigCPtr, allowed);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}

/// <summary>
/// Suspend.
/// </summary>
/// <returns>true for done, otherwise, false</returns>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool Suspend()
{
bool ret = Interop.WebUserMediaPermissionRequest.Suspend(SwigCPtr);
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
}
}
Original file line number Diff line number Diff line change
@@ -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
{
/// <summary>
/// Event arguments that WebViewUserMediaPermissionRequest.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class WebViewUserMediaPermissionRequestEventArgs : EventArgs
{
internal WebViewUserMediaPermissionRequestEventArgs(WebUserMediaPermissionRequest permission, string message)
{
UserMediaPermissionRequest = permission;
Message = message;
}

/// <summary>
/// Gets UserMediaPermissionRequest.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public WebUserMediaPermissionRequest UserMediaPermissionRequest { get; }

/// <summary>
/// Gets Message.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public string Message { get; }

}
}
Original file line number Diff line number Diff line change
@@ -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
{
/// <summary>
/// Event arguments that passed via the WebView.WebAuthDisplayQR.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class WebViewWebAuthDisplayQREventArgs : EventArgs
{
internal WebViewWebAuthDisplayQREventArgs(string contents)
{
Contents = contents;
}

/// <summary>
/// The string contents to make QR code image in user side.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public string Contents { get; }
}
}
131 changes: 131 additions & 0 deletions src/Tizen.NUI/src/public/WebView/WebView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,14 @@ static WebView()

private PlainTextReceivedCallback plainTextReceivedCallback;

private EventHandler<WebViewWebAuthDisplayQREventArgs> webAuthDisplayQREventHandler;
private WebViewWebAuthDisplayQRCallback webAuthDisplayQRCallback;
private EventHandler webAuthResponseEventHandler;
private WebViewWebAuthResponseCallback webAuthResponseCallback;

private EventHandler<WebViewUserMediaPermissionRequestEventArgs> userMediaPermissionRequestEventHandler;
private WebViewUserMediaPermissionRequestCallback userMediaPermissionRequestCallback;


/// <summary>
/// Creates a WebView.
Expand Down Expand Up @@ -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);

/// <summary>
/// The callback function that is invoked when hit test is finished.
/// </summary>
Expand Down Expand Up @@ -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);


/// <summary>
/// Event for the PageLoadStarted signal which can be used to subscribe or unsubscribe the event handler.<br />
/// This signal is emitted when page loading has started.<br />
Expand Down Expand Up @@ -981,6 +1003,89 @@ public event EventHandler<WebViewTextFoundEventArgs> TextFound
}
}

/// <summary>
/// Event to informs user application to display QR code popup for passkey scenario.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public event EventHandler<WebViewWebAuthDisplayQREventArgs> 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));
}
}
}

/// <summary>
/// Event to informs user application that the passkey registration and authentication has been successful.
/// </summary>
[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));
}
}
}


/// <summary>
/// Event to UserMediaPermissionRequest.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public event EventHandler<WebViewUserMediaPermissionRequestEventArgs> 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));
}
}
}


/// <summary>
/// Options for searching texts.
/// </summary>
Expand Down Expand Up @@ -2821,6 +2926,16 @@ public void GetPlainTextAsynchronously(PlainTextReceivedCallback callback)
if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}

/// <summary>
/// cancel in progress web authentication that is passkey operation.
/// </summary>
[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);
Expand Down Expand Up @@ -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));
}

}
}

0 comments on commit ccbccca

Please sign in to comment.