Add bindings for new WebView APIs 08/205708/2
authorJiyun Yang <ji.yang@samsung.com>
Tue, 7 May 2019 09:37:06 +0000 (18:37 +0900)
committerJiyun Yang <ji.yang@samsung.com>
Mon, 13 May 2019 08:38:24 +0000 (17:38 +0900)
Add Properties
* CACHE_MODEL
* COOKIE_ACCEPT_POLICY
* USER_AGENT
* JAVASCRIPT_ENABLED
* LOAD_IMAGE_AUTOMATICALLY
* DEFAULT_TEXT_ENCODING_NAME
* DEFAULT_FONT_SIZE

Add Signals
* PageLoadErrorSignal

Add Methods
* Suspend
* Resume
* ClearCookies

Modify Methods
* EvaluateJavaScript

Change-Id: I8ebc688a071263af3dbac1771500a7a277fbca62
Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
dali-csharp-binder/src/dali_wrap.cpp
dali-csharp-binder/src/web-view-signal-converter.h [new file with mode: 0644]

index 39e89be..6c56001 100755 (executable)
@@ -472,6 +472,7 @@ void SWIG_CSharpException(int code, const char *msg) {
 #include <dali/public-api/events/mouse-button.h>
 
 #include <dali-toolkit/devel-api/controls/web-view/web-view.h>
+#include "web-view-signal-converter.h"
 
 
 // add here SWIG version check
@@ -103047,6 +103048,38 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_WebView_DownCast(void * jarg1) {
   return jresult;
 }
 
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_URL_get() {
+  return (int) Dali::Toolkit::WebView::Property::URL;
+}
+
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_CACHE_MODEL_get() {
+  return (int) Dali::Toolkit::WebView::Property::CACHE_MODEL;
+}
+
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_COOKIE_ACCEPT_POLICY_get() {
+  return (int) Dali::Toolkit::WebView::Property::COOKIE_ACCEPT_POLICY;
+}
+
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_USER_AGENT_get() {
+  return (int) Dali::Toolkit::WebView::Property::USER_AGENT;
+}
+
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_ENABLE_JAVASCRIPT_get() {
+  return (int) Dali::Toolkit::WebView::Property::ENABLE_JAVASCRIPT;
+}
+
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_LOAD_IMAGES_AUTOMATICALLY_get() {
+  return (int) Dali::Toolkit::WebView::Property::LOAD_IMAGES_AUTOMATICALLY;
+}
+
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_DEFAULT_TEXT_ENCODING_NAME_get() {
+  return (int) Dali::Toolkit::WebView::Property::DEFAULT_TEXT_ENCODING_NAME;
+}
+
+SWIGEXPORT int SWIGSTDCALL CSharp_Dali_WebView_Property_DEFAULT_FONT_SIZE_get() {
+  return (int) Dali::Toolkit::WebView::Property::DEFAULT_FONT_SIZE;
+}
+
 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_LoadUrl(void * jarg1, char * jarg2) {
   Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
   std::string *arg2;
@@ -103083,53 +103116,74 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_LoadUrl(void * jarg1, char * jar
   }
 }
 
-SWIGEXPORT char * SWIGSTDCALL CSharp_Dali_WebView_GetUrl(void * jarg1) {
-  char * jresult ;
-  std::string result;
-
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_LoadHTMLString(void * jarg1, char * jarg2) {
   Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
+  std::string *arg2;
 
   arg1 = (Dali::Toolkit::WebView *)jarg1;
+  if (!jarg2) {
+    SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0);
+    return;
+  }
+  std::string jarg2str = std::string(jarg2);
+  arg2 = &jarg2str;
   {
     try {
-      result = arg1->GetUrl();
+      (arg1)->LoadHTMLString((std::string const &)*arg2);
     } catch (std::out_of_range& e) {
       {
-        SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return 0;
+        SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
       };
     } catch (std::exception& e) {
       {
-        SWIG_CSharpException(SWIG_RuntimeError, const_cast<char*>(e.what())); return 0;
+        SWIG_CSharpException(SWIG_RuntimeError, const_cast<char*>(e.what())); return ;
       };
     } catch (Dali::DaliException e) {
       {
-        SWIG_CSharpException(SWIG_UnknownError, e.condition); return 0;
+        SWIG_CSharpException(SWIG_UnknownError, e.condition); return ;
       };
     } catch (...) {
       {
-        SWIG_CSharpException(SWIG_UnknownError, "unknown error"); return 0;
+        SWIG_CSharpException(SWIG_UnknownError, "unknown error"); return ;
       };
     }
   }
-
-  jresult = SWIG_csharp_string_callback((&result)->c_str());
-  return jresult;
 }
 
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_LoadHTMLString(void * jarg1, char * jarg2) {
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_Reload(void * jarg1) {
   Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
-  std::string *arg2;
 
   arg1 = (Dali::Toolkit::WebView *)jarg1;
-  if (!jarg2) {
-    SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0);
-    return;
+  {
+    try {
+      (arg1)->Reload();
+    } catch (std::out_of_range& e) {
+      {
+        SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
+      };
+    } catch (std::exception& e) {
+      {
+        SWIG_CSharpException(SWIG_RuntimeError, const_cast<char*>(e.what())); return ;
+      };
+    } catch (Dali::DaliException e) {
+      {
+        SWIG_CSharpException(SWIG_UnknownError, e.condition); return ;
+      };
+    } catch (...) {
+      {
+        SWIG_CSharpException(SWIG_UnknownError, "unknown error"); return ;
+      };
+    }
   }
-  std::string jarg2str = std::string(jarg2);
-  arg2 = &jarg2str;
+}
+
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_StopLoading(void * jarg1) {
+  Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
+
+  arg1 = (Dali::Toolkit::WebView *)jarg1;
   {
     try {
-      (arg1)->LoadHTMLString((std::string const &)*arg2);
+      (arg1)->StopLoading();
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
@@ -103150,13 +103204,13 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_LoadHTMLString(void * jarg1, cha
   }
 }
 
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_Reload(void * jarg1) {
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_Suspend(void * jarg1) {
   Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
 
   arg1 = (Dali::Toolkit::WebView *)jarg1;
   {
     try {
-      (arg1)->Reload();
+      (arg1)->Suspend();
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
@@ -103177,13 +103231,13 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_Reload(void * jarg1) {
   }
 }
 
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_StopLoading(void * jarg1) {
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_Resume(void * jarg1) {
   Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
 
   arg1 = (Dali::Toolkit::WebView *)jarg1;
   {
     try {
-      (arg1)->StopLoading();
+      (arg1)->Resume();
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
@@ -103316,7 +103370,7 @@ SWIGEXPORT bool SWIGSTDCALL CSharp_Dali_WebView_CanGoForward(void * jarg1) {
   return ret;
 }
 
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_EvaluateJavaScript(void * jarg1, char * jarg2) {
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_EvaluateJavaScript(void * jarg1, char * jarg2, void* jarg3) {
   Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
   std::string *arg2;
 
@@ -103327,9 +103381,14 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_EvaluateJavaScript(void * jarg1,
   }
   std::string jarg2_str = std::string(jarg2);
   arg2 = &jarg2_str;
+
+  void (*handler)(char*) = (void (*)(char*)) jarg3;
+
   {
     try {
-      (arg1)->EvaluateJavaScript((std::string const &)*arg2);
+      (arg1)->EvaluateJavaScript((std::string const &)*arg2, [handler](const std::string& result) {
+        handler(SWIG_csharp_string_callback(result.c_str()));
+      });
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
@@ -103440,79 +103499,43 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_ClearCache(void * jarg1) {
   }
 }
 
-SWIGEXPORT Dali::Toolkit::Control * SWIGSTDCALL CSharp_Dali_WebView_SWIGUpcast(Dali::Toolkit::WebView *jarg1) {
-    return (Dali::Toolkit::Control *)jarg1;
-}
-
-
-// Proxy class of WebViewSignal.
-// WebViewSignal has an argument of std::string type which is not supported at C# side.
-// The purpose of this class is to convert signal argument of string type safely.
-class WebViewSignalProxy : public ConnectionTracker
-{
-public:
-  typedef Dali::Signal< void(Dali::Toolkit::WebView, const std::string&) > OriginalSignalType;
-  typedef Dali::Signal< void(Dali::Toolkit::WebView, char*) > ProxySignalType;
-  typedef void (*CallbackType)(Dali::Toolkit::WebView, char *);
-
-  WebViewSignalProxy(OriginalSignalType* signal)
-    : mSignalPtr(signal)
-  {
-  }
-
-  void Connect(CallbackType csharpCallback)
-  {
-    if (mSignalPtr->Empty())
-    {
-      mSignalPtr->Connect(this, &WebViewSignalProxy::OnEmit);
-    }
-    mProxySignal.Connect(csharpCallback);
-  }
-
-  void Disconnect(CallbackType csharpCallback)
-  {
-    mProxySignal.Disconnect(csharpCallback);
-    if (mProxySignal.Empty())
-    {
-      mSignalPtr->Disconnect(this, &WebViewSignalProxy::OnEmit);
-    }
-  }
-
-  bool Empty()
-  {
-    return mProxySignal.Empty();
-  }
-
-  std::size_t GetConnectionCount()
-  {
-    return mProxySignal.GetConnectionCount();
-  }
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebView_ClearCookies(void * jarg1) {
+  Dali::Toolkit::WebView *arg1 = (Dali::Toolkit::WebView *) 0 ;
 
-  void Emit(Dali::Toolkit::WebView& webview, char* url)
+  arg1 = (Dali::Toolkit::WebView *)jarg1;
   {
-    if (!mProxySignal.Empty())
-    {
-      mProxySignal.Emit(webview, url);
+    try {
+      (arg1)->ClearCookies();
+    } catch (std::out_of_range& e) {
+      {
+        SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
+      };
+    } catch (std::exception& e) {
+      {
+        SWIG_CSharpException(SWIG_RuntimeError, const_cast<char*>(e.what())); return ;
+      };
+    } catch (Dali::DaliException e) {
+      {
+        SWIG_CSharpException(SWIG_UnknownError, e.condition); return ;
+      };
+    } catch (...) {
+      {
+        SWIG_CSharpException(SWIG_UnknownError, "unknown error"); return ;
+      };
     }
   }
+}
 
-  void OnEmit(Dali::Toolkit::WebView webview, const std::string& url)
-  {
-    // Safe string conversion
-    mProxySignal.Emit(webview, SWIG_csharp_string_callback(url.c_str()));
-  }
-
-private:
-  OriginalSignalType* mSignalPtr;
-  ProxySignalType mProxySignal;
-};
+SWIGEXPORT Dali::Toolkit::Control * SWIGSTDCALL CSharp_Dali_WebView_SWIGUpcast(Dali::Toolkit::WebView *jarg1) {
+    return (Dali::Toolkit::Control *)jarg1;
+}
 
-SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_WebViewSignalProxy_PageLoadStarted(void * jarg1) {
+SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_WebViewPageLoadSignal_PageLoadStarted(void * jarg1) {
   Dali::Toolkit::WebView* webview = (Dali::Toolkit::WebView *) jarg1;
-  WebViewSignalProxy* result = NULL;
+  SignalConverter::WebViewPageLoadSignal* result = NULL;
   {
     try {
-      result = new WebViewSignalProxy(&webview->PageLoadStartedSignal());
+      result = new SignalConverter::WebViewPageLoadSignal(&webview->PageLoadStartedSignal());
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return 0;
@@ -103534,12 +103557,12 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_WebViewSignalProxy_PageLoadStarted
   return (void*) result;
 }
 
-SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_WebViewSignalProxy_PageLoadFinished(void * jarg1) {
+SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_WebViewPageLoadSignal_PageLoadFinished(void * jarg1) {
   Dali::Toolkit::WebView* webview = (Dali::Toolkit::WebView *) jarg1;
-  WebViewSignalProxy* result = NULL;
+  SignalConverter::WebViewPageLoadSignal* result = NULL;
   {
     try {
-      result = new WebViewSignalProxy(&webview->PageLoadFinishedSignal());
+      result = new SignalConverter::WebViewPageLoadSignal(&webview->PageLoadFinishedSignal());
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return 0;
@@ -103561,9 +103584,9 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_WebViewSignalProxy_PageLoadFinishe
   return (void*) result;
 }
 
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_WebViewSignalProxy(void * jarg1)
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_WebViewPageLoadSignal(void * jarg1)
 {
-  WebViewSignalProxy* object = (WebViewSignalProxy*) jarg1;
+  SignalConverter::WebViewPageLoadSignal* object = (SignalConverter::WebViewPageLoadSignal*) jarg1;
   {
     try {
       delete object;
@@ -103587,42 +103610,66 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_WebViewSignalProxy(void * jarg1)
   }
 }
 
-SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_Empty(void * jarg1)
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewPageLoadSignal_Connect(void * jarg1, void * jarg2)
 {
-  bool result;
-  WebViewSignalProxy* proxy = (WebViewSignalProxy*) jarg1;
+  SignalConverter::WebViewPageLoadSignal* proxy = (SignalConverter::WebViewPageLoadSignal*) jarg1;
+  SignalConverter::WebViewPageLoadSignal::CallbackType callback = (SignalConverter::WebViewPageLoadSignal::CallbackType) jarg2;
   {
     try {
-      result = (bool)proxy->Empty();
+      proxy->Connect(callback);
     } catch (std::out_of_range& e) {
       {
-        SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return 0;
+        SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
       };
     } catch (std::exception& e) {
       {
-        SWIG_CSharpException(SWIG_RuntimeError, const_cast<char*>(e.what())); return 0;
+        SWIG_CSharpException(SWIG_RuntimeError, const_cast<char*>(e.what())); return ;
       };
     } catch (Dali::DaliException e) {
       {
-        SWIG_CSharpException(SWIG_UnknownError, e.condition); return 0;
+        SWIG_CSharpException(SWIG_UnknownError, e.condition); return ;
       };
     } catch (...) {
       {
-        SWIG_CSharpException(SWIG_UnknownError, "unknown error"); return 0;
+        SWIG_CSharpException(SWIG_UnknownError, "unknown error"); return ;
       };
     }
   }
-  return (unsigned int) result;
 }
 
 
-SWIGEXPORT unsigned long SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_GetConnectionCount(void * jarg1)
-{
-  std::size_t result;
-  WebViewSignalProxy* arg1 = (WebViewSignalProxy*) jarg1;
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewPageLoadSignal_Disconnect(void * jarg1, void * jarg2) {
+  SignalConverter::WebViewPageLoadSignal* proxy = (SignalConverter::WebViewPageLoadSignal*) jarg1;
+  SignalConverter::WebViewPageLoadSignal::CallbackType callback = (SignalConverter::WebViewPageLoadSignal::CallbackType) jarg2;
   {
     try {
-      result = arg1->GetConnectionCount();
+      proxy->Disconnect(callback);
+    } catch (std::out_of_range& e) {
+      {
+        SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
+      };
+    } catch (std::exception& e) {
+      {
+        SWIG_CSharpException(SWIG_RuntimeError, const_cast<char*>(e.what())); return ;
+      };
+    } catch (Dali::DaliException e) {
+      {
+        SWIG_CSharpException(SWIG_UnknownError, e.condition); return ;
+      };
+    } catch (...) {
+      {
+        SWIG_CSharpException(SWIG_UnknownError, "unknown error"); return ;
+      };
+    }
+  }
+}
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_Dali_new_WebViewPageLoadErrorSignal_PageLoadError(void * jarg1) {
+  Dali::Toolkit::WebView* webview = (Dali::Toolkit::WebView *) jarg1;
+  SignalConverter::WebViewPageLoadErrorSignal* result = NULL;
+  {
+    try {
+      result = new SignalConverter::WebViewPageLoadErrorSignal(&webview->PageLoadErrorSignal());
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return 0;
@@ -103641,16 +103688,15 @@ SWIGEXPORT unsigned long SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_GetConnectio
       };
     }
   }
-  return (unsigned long) result;
+  return (void*) result;
 }
 
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_Connect(void * jarg1, void * jarg2)
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_WebViewPageLoadErrorSignal(void * jarg1)
 {
-  WebViewSignalProxy* proxy = (WebViewSignalProxy*) jarg1;
-  WebViewSignalProxy::CallbackType callback = (WebViewSignalProxy::CallbackType) jarg2;
+  SignalConverter::WebViewPageLoadErrorSignal* object = (SignalConverter::WebViewPageLoadErrorSignal*) jarg1;
   {
     try {
-      proxy->Connect(callback);
+      delete object;
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
@@ -103671,13 +103717,13 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_Connect(void * jarg1,
   }
 }
 
-
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_Disconnect(void * jarg1, void * jarg2) {
-  WebViewSignalProxy* proxy = (WebViewSignalProxy*) jarg1;
-  WebViewSignalProxy::CallbackType callback = (WebViewSignalProxy::CallbackType) jarg2;
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewPageLoadErrorSignal_Connect(void * jarg1, void * jarg2)
+{
+  SignalConverter::WebViewPageLoadErrorSignal* proxy = (SignalConverter::WebViewPageLoadErrorSignal*) jarg1;
+  SignalConverter::WebViewPageLoadErrorSignal::CallbackType callback = (SignalConverter::WebViewPageLoadErrorSignal::CallbackType) jarg2;
   {
     try {
-      proxy->Disconnect(callback);
+      proxy->Connect(callback);
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
@@ -103699,21 +103745,12 @@ SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_Disconnect(void * jar
 }
 
 
-SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewSignalProxy_Emit(void * jarg1, void * jarg2, char * jarg3) {
-  if (!jarg2) {
-    SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Dali::Toolkit::WebView & type is null", 0);
-    return ;
-  }
-  if (!jarg3) {
-    SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "jarg3 is null string", 0);
-    return ;
-  }
-
-  WebViewSignalProxy* proxy = (WebViewSignalProxy*) jarg1;
-  Dali::Toolkit::WebView* webview = (Dali::Toolkit::WebView*) jarg2;
+SWIGEXPORT void SWIGSTDCALL CSharp_Dali_WebViewPageLoadErrorSignal_Disconnect(void * jarg1, void * jarg2) {
+  SignalConverter::WebViewPageLoadErrorSignal* proxy = (SignalConverter::WebViewPageLoadErrorSignal*) jarg1;
+  SignalConverter::WebViewPageLoadErrorSignal::CallbackType callback = (SignalConverter::WebViewPageLoadErrorSignal::CallbackType) jarg2;
   {
     try {
-      proxy->Emit(*webview, jarg3);
+      proxy->Disconnect(callback);
     } catch (std::out_of_range& e) {
       {
         SWIG_CSharpException(SWIG_IndexError, const_cast<char*>(e.what())); return ;
diff --git a/dali-csharp-binder/src/web-view-signal-converter.h b/dali-csharp-binder/src/web-view-signal-converter.h
new file mode 100644 (file)
index 0000000..e200522
--- /dev/null
@@ -0,0 +1,136 @@
+#ifndef __DALI_CSHARP_BINDER_WEB_VIEW_SIGNAL_CONVERTER_H__
+#define __DALI_CSHARP_BINDER_WEB_VIEW_SIGNAL_CONVERTER_H__
+/*
+ * Copyright (c) 2019 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.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/signals/connection-tracker.h>
+#include <dali-toolkit/devel-api/controls/web-view/web-view.h>
+
+namespace SignalConverter
+{
+
+// Proxy class of WebViewPageLoadSignal.
+// WebViewPageLoadSignal has an argument of std::string type which is not supported at C# side.
+// The purpose of this class is to convert signal argument of string type safely.
+class WebViewPageLoadSignal : public Dali::ConnectionTracker
+{
+
+public:
+  typedef Dali::Signal< void(Dali::Toolkit::WebView, const std::string&) > NativeSignalType;
+  typedef Dali::Signal< void(Dali::Toolkit::WebView, char*) > ProxySignalType;
+  typedef void (*CallbackType)(Dali::Toolkit::WebView, char*);
+
+  WebViewPageLoadSignal( NativeSignalType* signal )
+    : mNativeSignalPtr( signal )
+  {
+  }
+
+  ~WebViewPageLoadSignal()
+  {
+    if( !mProxySignal.Empty() )
+    {
+      mNativeSignalPtr->Disconnect( this, &SignalConverter::WebViewPageLoadSignal::OnEmit );
+    }
+  }
+
+  void Connect( CallbackType csharpCallback )
+  {
+    if( mNativeSignalPtr->Empty())
+    {
+      mNativeSignalPtr->Connect( this, &SignalConverter::WebViewPageLoadSignal::OnEmit );
+    }
+    mProxySignal.Connect( csharpCallback );
+  }
+
+  void Disconnect( CallbackType csharpCallback )
+  {
+    mProxySignal.Disconnect( csharpCallback );
+    if( mProxySignal.Empty() )
+    {
+      mNativeSignalPtr->Disconnect( this, &SignalConverter::WebViewPageLoadSignal::OnEmit );
+    }
+  }
+
+  void OnEmit( Dali::Toolkit::WebView webview, const std::string& url )
+  {
+    // Safe string conversion
+    mProxySignal.Emit( webview, SWIG_csharp_string_callback( url.c_str() ) );
+  }
+
+private:
+
+  NativeSignalType* mNativeSignalPtr;
+  ProxySignalType   mProxySignal;
+};
+
+// Proxy class of WebViewPageLoadErrorSignal.
+// WebViewPageLoadSignal has an argument of std::string type which is not supported at C# side.
+// The purpose of this class is to convert signal argument of string type safely.
+class WebViewPageLoadErrorSignal : public Dali::ConnectionTracker
+{
+public:
+  typedef Dali::Signal< void(Dali::Toolkit::WebView, const std::string&, Dali::Toolkit::WebView::LoadErrorCode) > NativeSignalType;
+  typedef Dali::Signal< void(Dali::Toolkit::WebView, char*, int) > ProxySignalType;
+  typedef void (*CallbackType)(Dali::Toolkit::WebView, char*, int);
+
+  WebViewPageLoadErrorSignal( NativeSignalType* signal )
+    : mNativeSignalPtr( signal )
+  {
+  }
+
+  ~WebViewPageLoadErrorSignal()
+  {
+    if( !mProxySignal.Empty() )
+    {
+      mNativeSignalPtr->Disconnect( this, &SignalConverter::WebViewPageLoadErrorSignal::OnEmit );
+    }
+  }
+
+  void Connect( CallbackType csharpCallback )
+  {
+    if( mNativeSignalPtr->Empty() )
+    {
+      mNativeSignalPtr->Connect( this, &SignalConverter::WebViewPageLoadErrorSignal::OnEmit );
+    }
+    mProxySignal.Connect( csharpCallback );
+  }
+
+  void Disconnect( CallbackType csharpCallback )
+  {
+    mProxySignal.Disconnect( csharpCallback );
+    if( mProxySignal.Empty() )
+    {
+      mNativeSignalPtr->Disconnect( this, &SignalConverter::WebViewPageLoadErrorSignal::OnEmit );
+    }
+  }
+
+  void OnEmit( Dali::Toolkit::WebView webview, const std::string& url, Dali::Toolkit::WebView::LoadErrorCode code )
+  {
+    // Safe string conversion
+    mProxySignal.Emit( webview, SWIG_csharp_string_callback( url.c_str() ), static_cast<int>( code ) );
+  }
+
+private:
+
+  NativeSignalType* mNativeSignalPtr;
+  ProxySignalType   mProxySignal;
+};
+
+} // namespace SignalConverter
+
+#endif // __DALI_CSHARP_BINDER_WEB_VIEW_SIGNAL_CONVERTER_H__
\ No newline at end of file