Add callback for navigation policy decision.
authorhuayong.xu <huayong.xu@samsung.com>
Thu, 13 Jan 2022 10:11:06 +0000 (18:11 +0800)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Tue, 8 Feb 2022 04:41:28 +0000 (13:41 +0900)
src/Tizen.NUI/src/internal/Interop/Interop.WebView.cs
src/Tizen.NUI/src/internal/WebView/WebViewPolicyDecidedEventArgs.cs [moved from src/Tizen.NUI/src/internal/WebView/WebViewResponsePolicyDecidedEventArgs.cs with 88% similarity]
src/Tizen.NUI/src/public/WebView/WebView.cs
test/Tizen.NUI.WebViewTest/SimpleWebViewApp.cs

index 8dc41d5..da9fc65 100755 (executable)
@@ -283,6 +283,9 @@ namespace Tizen.NUI
             [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_RegisterResponsePolicyDecidedCallback")]
             public static extern void RegisterResponsePolicyDecidedCallback(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
 
+            [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_RegisterNavigationPolicyDecidedCallback")]
+            public static extern void RegisterNavigationPolicyDecidedCallback(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
+
             [global::System.Runtime.InteropServices.DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_WebView_RegisterCertificateConfirmedCallback")]
             public static extern void RegisterCertificateConfirmedCallback(global::System.Runtime.InteropServices.HandleRef jarg1, global::System.Runtime.InteropServices.HandleRef jarg2);
 
@@ -24,9 +24,9 @@ namespace Tizen.NUI
     /// Event arguments that passed via the WebView.ResponsePolicyDecided.
     /// </summary>
     [EditorBrowsable(EditorBrowsableState.Never)]
-    public class WebViewResponsePolicyDecidedEventArgs : EventArgs
+    public class WebViewPolicyDecidedEventArgs : EventArgs
     {
-        internal WebViewResponsePolicyDecidedEventArgs(WebPolicyDecisionMaker maker)
+        internal WebViewPolicyDecidedEventArgs(WebPolicyDecisionMaker maker)
         {
             ResponsePolicyDecisionMaker = maker;
         }
index ff91df6..d67e68a 100755 (executable)
@@ -35,28 +35,28 @@ namespace Tizen.NUI.BaseComponents
         private bool cursorEnabledByClient;
 
         private EventHandler<WebViewPageLoadEventArgs> pageLoadStartedEventHandler;
-        private WebViewPageLoadCallbackDelegate pageLoadStartedCallback;
+        private WebViewPageLoadCallback pageLoadStartedCallback;
 
         private EventHandler<WebViewPageLoadEventArgs> pageLoadingEventHandler;
-        private WebViewPageLoadCallbackDelegate pageLoadingCallback;
+        private WebViewPageLoadCallback pageLoadingCallback;
 
         private EventHandler<WebViewPageLoadEventArgs> pageLoadFinishedEventHandler;
-        private WebViewPageLoadCallbackDelegate pageLoadFinishedCallback;
+        private WebViewPageLoadCallback pageLoadFinishedCallback;
 
         private EventHandler<WebViewPageLoadErrorEventArgs> pageLoadErrorEventHandler;
-        private WebViewPageLoadErrorCallbackDelegate pageLoadErrorCallback;
+        private WebViewPageLoadErrorCallback pageLoadErrorCallback;
 
         private EventHandler<WebViewScrollEdgeReachedEventArgs> scrollEdgeReachedEventHandler;
-        private WebViewScrollEdgeReachedCallbackDelegate scrollEdgeReachedCallback;
+        private WebViewScrollEdgeReachedCallback scrollEdgeReachedCallback;
 
         private EventHandler<WebViewUrlChangedEventArgs> urlChangedEventHandler;
-        private WebViewUrlChangedCallbackDelegate urlChangedCallback;
+        private WebViewUrlChangedCallback urlChangedCallback;
 
         private EventHandler<WebViewFormRepostPolicyDecidedEventArgs> formRepostPolicyDecidedEventHandler;
-        private WebViewFormRepostPolicyDecidedCallbackDelegate formRepostPolicyDecidedCallback;
+        private WebViewFormRepostPolicyDecidedCallback formRepostPolicyDecidedCallback;
 
         private EventHandler<EventArgs> frameRenderedEventHandler;
-        private WebViewFrameRenderedCallbackDelegate frameRenderedCallback;
+        private WebViewFrameRenderedCallback frameRenderedCallback;
 
         private ScreenshotAcquiredCallback screenshotAcquiredCallback;
         private readonly WebViewScreenshotAcquiredProxyCallback screenshotAcquiredProxyCallback;
@@ -64,26 +64,29 @@ namespace Tizen.NUI.BaseComponents
         private HitTestFinishedCallback hitTestFinishedCallback;
         private readonly WebViewHitTestFinishedProxyCallback hitTestFinishedProxyCallback;
 
-        private EventHandler<WebViewResponsePolicyDecidedEventArgs> responsePolicyDecidedEventHandler;
-        private WebViewResponsePolicyDecidedCallbackDelegate responsePolicyDecidedCallback;
+        private EventHandler<WebViewPolicyDecidedEventArgs> responsePolicyDecidedEventHandler;
+        private WebViewPolicyDecidedCallback responsePolicyDecidedCallback;
+
+        private EventHandler<WebViewPolicyDecidedEventArgs> navigationPolicyDecidedEventHandler;
+        private WebViewPolicyDecidedCallback navigationPolicyDecidedCallback;
 
         private EventHandler<WebViewCertificateReceivedEventArgs> certificateConfirmedEventHandler;
-        private WebViewCertificateReceivedCallbackDelegate certificateConfirmedCallback;
+        private WebViewCertificateReceivedCallback certificateConfirmedCallback;
 
         private EventHandler<WebViewCertificateReceivedEventArgs> sslCertificateChangedEventHandler;
-        private WebViewCertificateReceivedCallbackDelegate sslCertificateChangedCallback;
+        private WebViewCertificateReceivedCallback sslCertificateChangedCallback;
 
         private EventHandler<WebViewHttpAuthRequestedEventArgs> httpAuthRequestedEventHandler;
-        private WebViewHttpAuthRequestedCallbackDelegate httpAuthRequestedCallback;
+        private WebViewHttpAuthRequestedCallback httpAuthRequestedCallback;
 
         private EventHandler<WebViewConsoleMessageReceivedEventArgs> consoleMessageReceivedEventHandler;
-        private WebViewConsoleMessageReceivedCallbackDelegate consoleMessageReceivedCallback;
+        private WebViewConsoleMessageReceivedCallback consoleMessageReceivedCallback;
 
         private EventHandler<WebViewContextMenuShownEventArgs> contextMenuShownEventHandler;
-        private WebViewContextMenuShownCallbackDelegate contextMenuShownCallback;
+        private WebViewContextMenuShownCallback contextMenuShownCallback;
 
         private EventHandler<WebViewContextMenuHiddenEventArgs> contextMenuHiddenEventHandler;
-        private WebViewContextMenuHiddenCallbackDelegate contextMenuHiddenCallback;
+        private WebViewContextMenuHiddenCallback contextMenuHiddenCallback;
 
         private PlainTextReceivedCallback plainTextReceivedCallback;
 
@@ -235,22 +238,22 @@ namespace Tizen.NUI.BaseComponents
         public delegate void PlainTextReceivedCallback(string plainText);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewPageLoadCallbackDelegate(string pageUrl);
+        private delegate void WebViewPageLoadCallback(string pageUrl);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewPageLoadErrorCallbackDelegate(IntPtr error);
+        private delegate void WebViewPageLoadErrorCallback(IntPtr error);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewScrollEdgeReachedCallbackDelegate(int edge);
+        private delegate void WebViewScrollEdgeReachedCallback(int edge);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewUrlChangedCallbackDelegate(string pageUrl);
+        private delegate void WebViewUrlChangedCallback(string pageUrl);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewFormRepostPolicyDecidedCallbackDelegate(IntPtr maker);
+        private delegate void WebViewFormRepostPolicyDecidedCallback(IntPtr maker);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewFrameRenderedCallbackDelegate();
+        private delegate void WebViewFrameRenderedCallback();
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
         private delegate void WebViewScreenshotAcquiredProxyCallback(IntPtr data);
@@ -259,22 +262,22 @@ namespace Tizen.NUI.BaseComponents
         private delegate void WebViewHitTestFinishedProxyCallback(IntPtr data);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewResponsePolicyDecidedCallbackDelegate(IntPtr maker);
+        private delegate void WebViewPolicyDecidedCallback(IntPtr maker);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewCertificateReceivedCallbackDelegate(IntPtr certificate);
+        private delegate void WebViewCertificateReceivedCallback(IntPtr certificate);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewHttpAuthRequestedCallbackDelegate(IntPtr handler);
+        private delegate void WebViewHttpAuthRequestedCallback(IntPtr handler);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewConsoleMessageReceivedCallbackDelegate(IntPtr message);
+        private delegate void WebViewConsoleMessageReceivedCallback(IntPtr message);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewContextMenuShownCallbackDelegate(IntPtr menu);
+        private delegate void WebViewContextMenuShownCallback(IntPtr menu);
 
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
-        private delegate void WebViewContextMenuHiddenCallbackDelegate(IntPtr menu);
+        private delegate void WebViewContextMenuHiddenCallback(IntPtr menu);
 
         /// <summary>
         /// Event for the PageLoadStarted signal which can be used to subscribe or unsubscribe the event handler.<br />
@@ -465,7 +468,7 @@ namespace Tizen.NUI.BaseComponents
         /// This signal is emitted when response policy would be decided.<br />
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public event EventHandler<WebViewResponsePolicyDecidedEventArgs> ResponsePolicyDecided
+        public event EventHandler<WebViewPolicyDecidedEventArgs> ResponsePolicyDecided
         {
             add
             {
@@ -484,6 +487,29 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
+        /// Event for the NavigationPolicyDecided signal which can be used to subscribe or unsubscribe the event handler.<br />
+        /// This signal is emitted when response policy would be decided.<br />
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public event EventHandler<WebViewPolicyDecidedEventArgs> NavigationPolicyDecided
+        {
+            add
+            {
+                if (navigationPolicyDecidedEventHandler == null)
+                {
+                    navigationPolicyDecidedCallback = OnNavigationPolicyDecided;
+                    IntPtr ip = Marshal.GetFunctionPointerForDelegate(navigationPolicyDecidedCallback);
+                    Interop.WebView.RegisterNavigationPolicyDecidedCallback(SwigCPtr, new HandleRef(this, ip));
+                }
+                navigationPolicyDecidedEventHandler += value;
+            }
+            remove
+            {
+                navigationPolicyDecidedEventHandler -= value;
+            }
+        }
+
+        /// <summary>
         /// Event for the CertificateConfirmed signal which can be used to subscribe or unsubscribe the event handler.<br />
         /// This signal is emitted when certificate would be confirmed.<br />
         /// </summary>
@@ -2107,7 +2133,12 @@ namespace Tizen.NUI.BaseComponents
 
         private void OnResponsePolicyDecided(IntPtr maker)
         {
-            responsePolicyDecidedEventHandler?.Invoke(this, new WebViewResponsePolicyDecidedEventArgs(new WebPolicyDecisionMaker(maker, true)));
+            responsePolicyDecidedEventHandler?.Invoke(this, new WebViewPolicyDecidedEventArgs(new WebPolicyDecisionMaker(maker, true)));
+        }
+
+        private void OnNavigationPolicyDecided(IntPtr maker)
+        {
+            navigationPolicyDecidedEventHandler?.Invoke(this, new WebViewPolicyDecidedEventArgs(new WebPolicyDecisionMaker(maker, true)));
         }
 
         private void OnCertificateConfirmed(IntPtr certificate)
index 200bb59..50276fb 100755 (executable)
@@ -234,6 +234,7 @@ namespace Tizen.NUI.WebViewTest
             simpleWebView.ConsoleMessageReceived += OnConsoleMessageReceived;
             simpleWebView.CertificateConfirmed += OnCertificateConfirmed;
             simpleWebView.ResponsePolicyDecided += OnResponsePolicyDecided;
+            simpleWebView.NavigationPolicyDecided += OnNavigationPolicyDecided;
             GetDefaultWindow().Add(simpleWebView);
 
             GetDefaultWindow().KeyEvent += Instance_KeyEvent;
@@ -543,7 +544,25 @@ namespace Tizen.NUI.WebViewTest
             e.Certificate.Allow(true);
         }
 
-        private void OnResponsePolicyDecided(object sender, WebViewResponsePolicyDecidedEventArgs e)
+        private void OnNavigationPolicyDecided(object sender, WebViewPolicyDecidedEventArgs e)
+        {
+            Log.Info("WebView", $"------------response policy decided, Url: {e.ResponsePolicyDecisionMaker.Url}-------");
+            Log.Info("WebView", $"------------response policy decided, Cookie: {e.ResponsePolicyDecisionMaker.Cookie}-------");
+            Log.Info("WebView", $"------------response policy decided, PolicyDecisionType: {e.ResponsePolicyDecisionMaker.PolicyDecisionType}-------");
+            Log.Info("WebView", $"------------response policy decided, ResponseMime: {e.ResponsePolicyDecisionMaker.ResponseMime}-------");
+            Log.Info("WebView", $"------------response policy decided, ResponseStatusCode: {e.ResponsePolicyDecisionMaker.ResponseStatusCode}-------");
+            Log.Info("WebView", $"------------response policy decided, DecisionNavigationType: {e.ResponsePolicyDecisionMaker.DecisionNavigationType}-------");
+            Log.Info("WebView", $"------------response policy decided, Scheme: {e.ResponsePolicyDecisionMaker.Scheme}-------");
+            if (e.ResponsePolicyDecisionMaker.Frame != null)
+            {
+                Log.Info("WebView", $"------------response policy decided, Frame.IsMainFrame: {e.ResponsePolicyDecisionMaker.Frame.IsMainFrame}-------");
+            }
+            //e.ResponsePolicyDecisionMaker.Ignore();
+            //e.ResponsePolicyDecisionMaker.Suspend();
+            //e.ResponsePolicyDecisionMaker.Use();
+        }
+
+        private void OnResponsePolicyDecided(object sender, WebViewPolicyDecidedEventArgs e)
         {
             Log.Info("WebView", $"------------response policy decided, Url: {e.ResponsePolicyDecisionMaker.Url}-------");
             Log.Info("WebView", $"------------response policy decided, Cookie: {e.ResponsePolicyDecisionMaker.Cookie}-------");