From 1dc29f4f444406e1a06d8e915f476475ec10e241 Mon Sep 17 00:00:00 2001 From: younghajung <35090305+younghajung@users.noreply.github.com> Date: Thu, 2 May 2019 19:35:18 +0900 Subject: [PATCH] [WebView] Copy the managed string into unmanaged memory for eina_hash_add (#817) Signed-off-by: yh106.jung --- src/Tizen.WebView/Interop/Interop.Eina.cs | 4 ++-- src/Tizen.WebView/Tizen.WebView/WebView.cs | 27 +++++++++++++++++++-------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/Tizen.WebView/Interop/Interop.Eina.cs b/src/Tizen.WebView/Interop/Interop.Eina.cs index cf88bc8..ad900f1 100644 --- a/src/Tizen.WebView/Interop/Interop.Eina.cs +++ b/src/Tizen.WebView/Interop/Interop.Eina.cs @@ -22,11 +22,11 @@ internal static partial class Interop internal static partial class Eina { [DllImport(Libraries.Eina)] - internal static extern IntPtr eina_hash_string_small_new(); + internal static extern IntPtr eina_hash_string_small_new(IntPtr dataFreeCb); [DllImport(Libraries.Eina)] [return: MarshalAs(UnmanagedType.U1)] - internal static extern bool eina_hash_add(IntPtr hash, string Key, string Value); + internal static extern bool eina_hash_add(IntPtr hash, IntPtr Key, IntPtr Value); [DllImport(Libraries.Eina)] internal static extern IntPtr eina_list_iterator_new(IntPtr list); diff --git a/src/Tizen.WebView/Tizen.WebView/WebView.cs b/src/Tizen.WebView/Tizen.WebView/WebView.cs index ee9b58b..9966b18 100644 --- a/src/Tizen.WebView/Tizen.WebView/WebView.cs +++ b/src/Tizen.WebView/Tizen.WebView/WebView.cs @@ -92,7 +92,7 @@ namespace Tizen.WebView /// /// Delete. /// - Delete, + Delete, } /// @@ -205,7 +205,7 @@ namespace Tizen.WebView /// /// 6 public event EventHandler ContextMenuItemSelected; - + /// The delegate is invoked when context menu customization is needed. /// /// The instance of ContextMenu. @@ -637,12 +637,23 @@ namespace Tizen.WebView /// 6 public void SetUrlRequest (string url, HttpMethod httpMethod, IDictionary httpHeaders, string httpBody) { - IntPtr hashHttpHeaders = Interop.Eina.eina_hash_string_small_new(); + List stringHandles = new List(); + IntPtr hashHttpHeaders = Interop.Eina.eina_hash_string_small_new(IntPtr.Zero); + foreach (KeyValuePair entry in httpHeaders) { - Interop.Eina.eina_hash_add(hashHttpHeaders, entry.Key, entry.Value); - } - Interop.ChromiumEwk.ewk_view_url_request_set(_realHandle, url, httpMethod, hashHttpHeaders, httpBody); + IntPtr keyHandle = Marshal.StringToHGlobalAnsi(entry.Key); + IntPtr valueHandle = Marshal.StringToHGlobalAnsi(entry.Value); + Interop.Eina.eina_hash_add(hashHttpHeaders, keyHandle, valueHandle); + stringHandles.Add(keyHandle); + stringHandles.Add(valueHandle); + } + Interop.ChromiumEwk.ewk_view_url_request_set(_realHandle, url, httpMethod, hashHttpHeaders, httpBody); + + foreach(IntPtr handle in stringHandles) + { + Marshal.FreeHGlobal(handle); + } } /// @@ -693,7 +704,7 @@ namespace Tizen.WebView _contextMenuItemSelected = new SmartEvent(this, _realHandle, "contextmenu,selected", ContextMenuItemEventArgs.CreateFromSmartEvent); _policyNavigationDecide = new SmartEvent(this, _realHandle, "policy,navigation,decide", NavigationPolicyEventArgs.CreateFromSmartEvent); _policyNewWindowDecide = new SmartEvent(this, _realHandle, "policy,newwindow,decide", NewWindowPolicyEventArgs.CreateFromSmartEvent); - _policyResponseDecide = new SmartEvent(this, _realHandle, "policy,response,decide", ResponsePolicyEventArgs.CreateFromSmartEvent); + _policyResponseDecide = new SmartEvent(this, _realHandle, "policy,response,decide", ResponsePolicyEventArgs.CreateFromSmartEvent); _loadStarted.On += (s, e) => { LoadStarted?.Invoke(this, EventArgs.Empty); }; _loadFinished.On += (s, e) => { LoadFinished?.Invoke(this, EventArgs.Empty); }; @@ -706,6 +717,6 @@ namespace Tizen.WebView _contextMenuItemSelected.On += (s, e) => { ContextMenuItemSelected?.Invoke(this, e); }; _contextMenuCustomize.On += (s, e) => { _contextMenuCustomizeDelegate?.Invoke(e.Menu); }; } - + } } -- 2.7.4