[NUI] Fix issue that objects are disposed outside callback. (#3514)
authorhuayongxu <49056704+huayongxu@users.noreply.github.com>
Tue, 7 Sep 2021 07:33:40 +0000 (15:33 +0800)
committerhuiyu <35286162+huiyueun@users.noreply.github.com>
Tue, 7 Sep 2021 09:05:39 +0000 (18:05 +0900)
src/Tizen.NUI/src/internal/WebView/WebContext.cs
src/Tizen.NUI/src/internal/WebView/WebContextMenuItem.cs
src/Tizen.NUI/src/internal/WebView/WebHitTestResult.cs
src/Tizen.NUI/src/internal/WebView/WebView.cs
test/Tizen.NUI.WebViewTest/SimpleWebViewApp.cs

index aa82b1c..829ef2b 100755 (executable)
@@ -33,12 +33,11 @@ namespace Tizen.NUI
         private float timeOffset;
         private ApplicationType applicationType;
         private WebSecurityOriginList securityOriginList;
-        private SecurityOriginListAcquiredCallback securityOriginsAcquiredCallback;
+        private SecurityOriginListAcquiredCallback securityOriginListAcquiredCallback;
         private readonly WebContextSecurityOriginListAcquiredProxyCallback securityOriginListAcquiredProxyCallback;
-        private WebPasswordDataList passwordList;
+        private WebPasswordDataList passwordDataList;
         private PasswordDataListAcquiredCallback passwordDataListAcquiredCallback;
         private readonly WebContextPasswordDataListAcquiredProxyCallback passwordDataListAcquiredProxyCallback;
-        private WebHttpRequestInterceptor httpRequestInterceptor;
         private HttpRequestInterceptedCallback httpRequestInterceptedCallback;
         private readonly WebContextHttpRequestInterceptedProxyCallback httpRequestInterceptedProxyCallback;
 
@@ -65,18 +64,14 @@ namespace Tizen.NUI
                 //Called by User
                 //Release your own managed resources here.
                 //You should release all of your own disposable objects here.
-                if (passwordList != null)
+                if (passwordDataList != null)
                 {
-                    passwordList.Dispose();
+                    passwordDataList.Dispose();
                 }
                 if (securityOriginList != null)
                 {
                     securityOriginList.Dispose();
                 }
-                if (httpRequestInterceptor != null)
-                {
-                    httpRequestInterceptor.Dispose();
-                }
             }
 
             base.Dispose(type);
@@ -115,7 +110,7 @@ namespace Tizen.NUI
         /// </summary>
         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public delegate bool MimeOverriddenCallback(string url, string currentMime, string newMime);
+        public delegate bool MimeOverriddenCallback(string url, string currentMime, out string newMime);
 
         /// <summary>
         /// The callback function that is invoked when http request need be intercepted.
@@ -400,7 +395,7 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         public bool GetWebDatabaseOrigins(SecurityOriginListAcquiredCallback callback)
         {
-            securityOriginsAcquiredCallback = callback;
+            securityOriginListAcquiredCallback = callback;
             IntPtr ip = Marshal.GetFunctionPointerForDelegate(securityOriginListAcquiredProxyCallback);
             bool result = Interop.WebContext.GetWebDatabaseOrigins(SwigCPtr, new HandleRef(this, ip));
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
@@ -426,7 +421,7 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         public bool GetWebStorageOrigins(SecurityOriginListAcquiredCallback callback)
         {
-            securityOriginsAcquiredCallback = callback;
+            securityOriginListAcquiredCallback = callback;
             IntPtr ip = Marshal.GetFunctionPointerForDelegate(securityOriginListAcquiredProxyCallback);
             bool result = Interop.WebContext.GetWebStorageOrigins(SwigCPtr, new HandleRef(this, ip));
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
@@ -540,7 +535,7 @@ namespace Tizen.NUI
 
         /// <summary>
         /// Registers callback for http request interceptor.
-        /// <param name="callback">callback for overriding mime type</param>
+        /// <param name="callback">callback for intercepting http request</param>
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public void RegisterHttpRequestInterceptedCallback(HttpRequestInterceptedCallback callback)
@@ -708,32 +703,29 @@ namespace Tizen.NUI
             {
                 originList.Add(securityOriginList.GetItemAtIndex(i));
             }
-            securityOriginsAcquiredCallback?.Invoke(originList);
+            securityOriginListAcquiredCallback?.Invoke(originList);
         }
 
         private void OnPasswordDataListAcquired(IntPtr alist)
         {
-            if (passwordList != null)
+            if (passwordDataList != null)
             {
-                passwordList.Dispose();
+                passwordDataList.Dispose();
             }
-            passwordList = new WebPasswordDataList(alist, true);
-            List<WebPasswordData> passwordDataList = new List<WebPasswordData>();
-            for(uint i = 0; i < passwordList.ItemCount; i++)
+            passwordDataList = new WebPasswordDataList(alist, true);
+            List<WebPasswordData> pList = new List<WebPasswordData>();
+            for(uint i = 0; i < passwordDataList.ItemCount; i++)
             {
-                passwordDataList.Add(passwordList.GetItemAtIndex(i));
+                pList.Add(passwordDataList.GetItemAtIndex(i));
             }
-            passwordDataListAcquiredCallback?.Invoke(passwordDataList);
+            passwordDataListAcquiredCallback?.Invoke(pList);
         }
 
         private void OnHttpRequestIntercepted(IntPtr interceptor)
         {
-            if (httpRequestInterceptor != null)
-            {
-                httpRequestInterceptor.Dispose();
-            }
-            httpRequestInterceptor = new WebHttpRequestInterceptor(interceptor, true);
-            httpRequestInterceptedCallback?.Invoke(httpRequestInterceptor);
+#pragma warning disable CA2000 // Dispose objects before losing scope
+            httpRequestInterceptedCallback?.Invoke(new WebHttpRequestInterceptor(interceptor, true));
+#pragma warning restore CA2000 // Dispose objects before losing scope
         }
     }
 }
index 4b332c0..0721040 100755 (executable)
@@ -41,6 +41,7 @@ namespace Tizen.NUI
         /// <summary>
         /// Enum that provides the tags of items for the context menu.
         /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
         public enum ItemTag
         {
             NoAction = 0,
@@ -140,6 +141,7 @@ namespace Tizen.NUI
         /// <summary>
         /// Enum that defines the types of the items for the context menu.
         /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
         public enum ItemType
         {
             Action,
index 87d53f5..ada41d9 100755 (executable)
@@ -226,6 +226,7 @@ namespace Tizen.NUI
                 ImageView image = new ImageView(url.ToString());
                 image.Size = new Size(pixelData.GetWidth(), pixelData.GetHeight());
                 pixelData.Dispose();
+                url.Dispose();
                 return image;
             }
         }
index 51be8a5..e96f3d0 100755 (executable)
@@ -2008,9 +2008,9 @@ namespace Tizen.NUI.BaseComponents
 
         private void OnScreenshotAcquired(IntPtr data)
         {
-            ImageView image = new ImageView(data, true);
-            screenshotAcquiredCallback?.Invoke(image);
-            image.Dispose();
+#pragma warning disable CA2000 // Dispose objects before losing scope
+            screenshotAcquiredCallback?.Invoke(new ImageView(data, true));
+#pragma warning restore CA2000 // Dispose objects before losing scope
         }
 
         private void OnResponsePolicyDecided(IntPtr maker)
@@ -2050,9 +2050,9 @@ namespace Tizen.NUI.BaseComponents
 
         private void OnHitTestFinished(IntPtr test)
         {
-            WebHitTestResult hitTest = new WebHitTestResult(test, true);
-            hitTestFinishedCallback?.Invoke(hitTest);
-            hitTest.Dispose();
+#pragma warning disable CA2000 // Dispose objects before losing scope
+            hitTestFinishedCallback?.Invoke(new WebHitTestResult(test, true));
+#pragma warning restore CA2000 // Dispose objects before losing scope
         }
     }
 }
index 31724d3..9b931bb 100755 (executable)
@@ -328,23 +328,23 @@ namespace Tizen.NUI.WebViewTest
                 FocusManager.Instance.SetCurrentFocusView(simpleWebView);
             }
 
-            //if (args.Touch.GetState(0) == PointStateType.Down && args.Touch.GetMouseButton(0) == MouseButton.Secondary)
-            //{
-            //    if (menuView == null && menuPosition == null)
-            //    {
-            //        menuPosition = args.Touch.GetScreenPosition(0);
-            //    }
-            //}
-            //else if(args.Touch.GetState(0) == PointStateType.Down && args.Touch.GetMouseButton(0) == MouseButton.Primary)
-            //{
-            //    if (menuView != null)
-            //    {
-            //        menuView.HideMenu();
-            //        GetDefaultWindow().Remove(menuView);
-            //        menuView = null;
-            //        menuPosition = null;
-            //    }
-            //}
+            if (args.Touch.GetState(0) == PointStateType.Down && args.Touch.GetMouseButton(0) == MouseButton.Secondary)
+            {
+                if (menuView == null && menuPosition == null)
+                {
+                    menuPosition = args.Touch.GetScreenPosition(0);
+                }
+            }
+            else if (args.Touch.GetState(0) == PointStateType.Down && args.Touch.GetMouseButton(0) == MouseButton.Primary)
+            {
+                if (menuView != null)
+                {
+                    menuView.HideMenu();
+                    GetDefaultWindow().Remove(menuView);
+                    menuView = null;
+                    menuPosition = null;
+                }
+            }
             return false;
         }
 
@@ -666,7 +666,7 @@ namespace Tizen.NUI.WebViewTest
             Log.Info("WebView", $"------------download started, url: {url}-------");
         }
 
-        private bool OnMimeOverridden(string url, string currentMime, string newMime)
+        private bool OnMimeOverridden(string url, string currentMime, out string newMime)
         {
             Log.Info("WebView", $"------------mime overridden, url: {url}-------");
             Log.Info("WebView", $"------------mime overridden, currentMime: {currentMime}-------");