Templatize EWebView callback classes.
authorAntonio Gomes <a1.gomes@samsung.com>
Mon, 4 Jan 2016 20:31:54 +0000 (16:31 -0400)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 07:55:23 +0000 (07:55 +0000)
Patch templatizes the following classes in order to remove duplication:
- EwkViewPlainTextGetCallback
- MHTMLCallbackDetails
- QuotaPermissionRequestCallback
- WebViewGeolocationPermissionCallback
- WebViewUserMediaPermissionCallback
- NotificationPermissionCallback
- WebViewUnfocusAllowCallback

They all share the same logic.

Original beta/m47 patches:
- http://165.213.202.130/gerrit/#/c/102267/
- http://165.213.202.130/gerrit/#/c/102906/ (by Grzegorz Czajkowski)

Bug: http://107.108.218.239/bugzilla/show_bug.cgi?id=15494

Reviewed by: djmix.kim, g.czajkowski

Change-Id: I6b8e97b05bed2fe30c4bfe236e9a48748108945c
Signed-off-by: Antonio Gomes <a1.gomes@samsung.com>
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h

index c529e46..c8407b3 100644 (file)
@@ -145,70 +145,6 @@ class WebViewAsyncRequestHitTestDataUserCallback: public WebViewAsyncRequestHitT
   void* user_data_;
 };
 
-class WebViewGeolocationPermissionCallback {
- public:
-  WebViewGeolocationPermissionCallback(Ewk_View_Geolocation_Permission_Callback cb, void* data)
-    : callback(cb)
-    , user_data(data) { }
-
-  Eina_Bool Run(Evas_Object* webview, _Ewk_Geolocation_Permission_Request* request, Eina_Bool* callback_result) {
-    CHECK(callback_result);
-    if (callback) {
-      Eina_Bool result = callback(webview, request, user_data);
-      *callback_result = result;
-      return true;
-    }
-    return false;
-  }
-
- private:
-  Ewk_View_Geolocation_Permission_Callback callback;
-  void* user_data;
-};
-
-class WebViewUserMediaPermissionCallback {
- public:
-  WebViewUserMediaPermissionCallback(
-      Ewk_View_User_Media_Permission_Callback cb, void* data)
-    : callback(cb)
-    , user_data(data) { }
-
-  Eina_Bool Run(Evas_Object* webview, _Ewk_User_Media_Permission_Request* request, Eina_Bool* callback_result) {
-    CHECK(callback_result);
-    if (callback) {
-      Eina_Bool result = callback(webview, request, user_data);
-      *callback_result = result;
-      return true;
-    }
-    return false;
-  }
-
- private:
-  Ewk_View_User_Media_Permission_Callback callback;
-  void* user_data;
-};
-
-class WebViewUnfocusAllowCallback {
- public:
-  WebViewUnfocusAllowCallback(Ewk_View_Unfocus_Allow_Callback cb, void* data)
-    : callback(cb)
-    , user_data(data) { }
-
-  Eina_Bool Run(Evas_Object* webview, Ewk_Unfocus_Direction direction, Eina_Bool* callback_result) {
-    CHECK(callback_result);
-    if (callback) {
-      Eina_Bool result = callback(webview, direction, user_data);
-      *callback_result = result;
-      return true;
-    }
-    return false;
-  }
-
- private:
-  Ewk_View_Unfocus_Allow_Callback callback;
-  void* user_data;
-};
-
 int EWebView::find_request_id_counter_ = 0;
 content::WebContentsEflDelegate::WebContentsCreateCallback
     EWebView::create_new_window_web_contents_cb_ =
@@ -254,11 +190,6 @@ void EWebView::Initialize() {
   back_forward_list_.reset(new _Ewk_Back_Forward_List(
       web_contents_->GetController()));
 
-  geolocation_permission_cb_.reset(new WebViewGeolocationPermissionCallback(NULL, NULL));
-  user_media_permission_cb_.reset(
-      new WebViewUserMediaPermissionCallback(NULL, NULL));
-  unfocus_allow_cb_.reset(new WebViewUnfocusAllowCallback(NULL, NULL));
-
   DCHECK(web_contents_->GetRenderViewHost());
   // Settings (content::WebPreferences) will be initalized by
   // RenderViewHostImpl::ComputeWebkitPrefs() based on command line switches.
@@ -1433,18 +1364,15 @@ void EWebView::SetOverrideEncoding(const std::string& encoding) {
 }
 
 void EWebView::SetQuotaPermissionRequestCallback(Ewk_Quota_Permission_Request_Callback callback, void *user_data) {
-  if (callback)
-    quota_request_callback_.reset(new QuotaPermissionRequestCallback(callback, user_data));
-  else
-    quota_request_callback_.reset();
+  quota_request_callback_.Set(callback, user_data);
 }
 
 void EWebView::InvokeQuotaPermissionRequest(_Ewk_Quota_Permission_Request* request,
                                             const content::QuotaPermissionContext::PermissionCallback& cb) {
   quota_permission_request_map_[request] = cb;
   request->setView(evas_object());
-  if (quota_request_callback_.get())
-    quota_request_callback_->Run(evas_object(), request);
+  if (quota_request_callback_.IsCallbackSet())
+    quota_request_callback_.Run(evas_object(), request);
   else
     QuotaRequestCancel(request);
 }
@@ -1635,34 +1563,23 @@ void EWebView::InvokeWebAppIconUrlsGetCallback(const StringMap &iconUrls, int ca
 
 void EWebView::SetNotificationPermissionCallback(
     Ewk_View_Notification_Permission_Callback callback, void *user_data) {
-  if (!callback) {
-    notification_permission_callback_.reset(nullptr);
-    return;
-  }
-  notification_permission_callback_.reset(
-      new NotificationPermissionCallback(evas_object_, callback, user_data));
+  notification_permission_callback_.Set(callback, user_data);
 }
 
 bool EWebView::IsNotificationPermissionCallbackSet() const {
-  return notification_permission_callback_;
+  return notification_permission_callback_.IsCallbackSet();
 }
 
 bool EWebView::InvokeNotificationPermissionCallback(
     Ewk_Notification_Permission_Request *request) {
-  if (!notification_permission_callback_) {
-    return false;
-  }
-  return notification_permission_callback_->Run(request);
-}
-
-void EwkViewPlainTextGetCallback::TriggerCallback(Evas_Object* obj, const std::string& content_text)
-{
-  if(callback_)
-    (callback_)(obj, content_text.c_str(), user_data_);
+  Eina_Bool ret = EINA_FALSE;
+  notification_permission_callback_.Run(evas_object_, request, &ret);
+  return ret;
 }
 
 int EWebView::SetEwkViewPlainTextGetCallback(Ewk_View_Plain_Text_Get_Callback callback, void* user_data) {
-  EwkViewPlainTextGetCallback* view_plain_text_callback_ptr = new EwkViewPlainTextGetCallback(callback, user_data);
+  EwkViewPlainTextGetCallback* view_plain_text_callback_ptr = new EwkViewPlainTextGetCallback;
+  view_plain_text_callback_ptr->Set(callback, user_data);
   return plain_text_get_callback_map_.Add(view_plain_text_callback_ptr);
 }
 
@@ -1676,40 +1593,38 @@ bool EWebView::PlainTextGet(Ewk_View_Plain_Text_Get_Callback callback, void* use
 
 void EWebView::InvokePlainTextGetCallback(const std::string& content_text, int plain_text_get_callback_id) {
   EwkViewPlainTextGetCallback* view_plain_text_callback_invoke_ptr = plain_text_get_callback_map_.Lookup(plain_text_get_callback_id);
-  view_plain_text_callback_invoke_ptr->TriggerCallback(evas_object(), content_text);
+  view_plain_text_callback_invoke_ptr->Run(evas_object(), content_text.c_str());
   plain_text_get_callback_map_.Remove(plain_text_get_callback_id);
 }
 
 void EWebView::SetViewGeolocationPermissionCallback(Ewk_View_Geolocation_Permission_Callback callback, void* user_data) {
-  geolocation_permission_cb_.reset(new WebViewGeolocationPermissionCallback(callback, user_data));
+  geolocation_permission_cb_.Set(callback, user_data);
 }
 
 bool EWebView::InvokeViewGeolocationPermissionCallback(_Ewk_Geolocation_Permission_Request* permission_context, Eina_Bool* callback_result) {
-  return geolocation_permission_cb_->Run(evas_object_, permission_context, callback_result);
+  return geolocation_permission_cb_.Run(evas_object_, permission_context, callback_result);
 }
 
 void EWebView::SetViewUserMediaPermissionCallback(
-    Ewk_View_User_Media_Permission_Callback callback,
-    void* user_data) {
-  user_media_permission_cb_.reset(new WebViewUserMediaPermissionCallback(
-      callback, user_data));
+    Ewk_View_User_Media_Permission_Callback callback, void* user_data) {
+  user_media_permission_cb_.Set(callback, user_data);
 }
 
 bool EWebView::InvokeViewUserMediaPermissionCallback(
     _Ewk_User_Media_Permission_Request* permission_context,
     Eina_Bool* callback_result) {
-  return user_media_permission_cb_->Run(evas_object_, permission_context,
+  return user_media_permission_cb_.Run(evas_object_, permission_context,
       callback_result);
 }
 
 void EWebView::SetViewUnfocusAllowCallback(
     Ewk_View_Unfocus_Allow_Callback callback, void* user_data) {
-  unfocus_allow_cb_.reset(new WebViewUnfocusAllowCallback(callback, user_data));
+  unfocus_allow_cb_.Set(callback, user_data);
 }
 
 bool EWebView::InvokeViewUnfocusAllowCallback(
     Ewk_Unfocus_Direction direction, Eina_Bool* callback_result) {
-  return unfocus_allow_cb_->Run(evas_object_, direction, callback_result);
+  return unfocus_allow_cb_.Run(evas_object_, direction, callback_result);
 }
 
 void EWebView::StopFinding() {
@@ -1743,22 +1658,18 @@ bool EWebView::GetMHTMLData(Ewk_View_MHTML_Data_Get_Callback callback, void* use
   if (!render_view_host)
     return false;
 
-  MHTMLCallbackDetails* callback_details = new MHTMLCallbackDetails(callback, user_data);
+  MHTMLCallbackDetails* callback_details = new MHTMLCallbackDetails;
+  callback_details->Set(callback, user_data);
   int mhtml_callback_id = mhtml_callback_map_.Add(callback_details);
   return render_view_host->Send(new EwkViewMsg_GetMHTMLData(render_view_host->GetRoutingID(), mhtml_callback_id));
 }
 
 void EWebView::OnMHTMLContentGet(const std::string& mhtml_content, int callback_id) {
   MHTMLCallbackDetails* callback_details = mhtml_callback_map_.Lookup(callback_id);
-  callback_details->Run(evas_object(), mhtml_content);
+  callback_details->Run(evas_object(), mhtml_content.c_str());
   mhtml_callback_map_.Remove(callback_id);
 }
 
-void MHTMLCallbackDetails::Run(Evas_Object* obj, const std::string& mhtml_content) {
-  if (callback_func_)
-    callback_func_(obj, mhtml_content.c_str(), user_data_);
-}
-
 bool EWebView::IsFullscreen() {
   return web_contents_delegate_->IsFullscreenForTabOrPending(web_contents_.get());
 }
index d424a6a..7a16f52 100644 (file)
@@ -70,29 +70,37 @@ class Ewk_Context;
 class WebViewEvasEventHandler;
 class _Ewk_Quota_Permission_Request;
 
-class EwkViewPlainTextGetCallback {
+template <typename CallbackPtr, typename CallbackParameter>
+class WebViewCallback {
  public:
-  EwkViewPlainTextGetCallback(Ewk_View_Plain_Text_Get_Callback callback,
-                              void* user_data)
-    : callback_(callback), user_data_(user_data)
-    { }
-  void TriggerCallback(Evas_Object* obj, const std::string& content_text);
+  WebViewCallback() { Set(nullptr, nullptr); }
 
- private:
-  Ewk_View_Plain_Text_Get_Callback callback_;
-  void* user_data_;
-};
+  void Set(CallbackPtr cb, void* data) {
+    callback_ = cb;
+    user_data_ = data;
+  }
 
-class MHTMLCallbackDetails {
- public:
-  MHTMLCallbackDetails(Ewk_View_MHTML_Data_Get_Callback callback_func, void *user_data)
-    : callback_func_(callback_func),
-      user_data_(user_data)
-  {}
-  void Run(Evas_Object* obj, const std::string& mhtml_content);
+  bool IsCallbackSet() const {
+    return callback_;
+  }
 
-  Ewk_View_MHTML_Data_Get_Callback callback_func_;
-  void *user_data_;
+  Eina_Bool Run(Evas_Object* webview, CallbackParameter param, Eina_Bool* callback_result) {
+    CHECK(callback_result);
+    if (IsCallbackSet()) {
+      *callback_result = callback_(webview, param, user_data_);
+      return true;
+    }
+    return false;
+  }
+
+  void Run(Evas_Object* webview, CallbackParameter param) {
+    if (IsCallbackSet())
+      callback_(webview, param, user_data_);
+  }
+
+ private:
+  CallbackPtr callback_;
+  void* user_data_;
 };
 
 class WebApplicationIconUrlGetCallback {
@@ -148,47 +156,8 @@ class WebApplicationCapableGetCallback {
   void *user_data_;
 };
 
-class AsyncHitTestRequest;
-class NotificationPermissionCallback {
- public:
-  NotificationPermissionCallback(
-      Evas_Object* obj,
-      Ewk_View_Notification_Permission_Callback func,
-      void* user_data)
-      : obj_(obj), func_(func), user_data_(user_data) {}
-  bool Run(Ewk_Notification_Permission_Request* request) {
-    if (func_) {
-      return (func_)(obj_, request, user_data_) == EINA_TRUE;
-    }
-    return false;
-  }
-
-private:
-  Evas_Object* obj_;
-  Ewk_View_Notification_Permission_Callback func_;
-  void* user_data_;
-};
-
-class QuotaPermissionRequestCallback {
-public:
-  QuotaPermissionRequestCallback(Ewk_Quota_Permission_Request_Callback func, void* user_data)
-    : func_(func), user_data_(user_data)
-  {}
-  void Run(Evas_Object* obj, const _Ewk_Quota_Permission_Request* req) {
-    if (func_) {
-      (func_)(obj, req, user_data_);
-    }
-  }
-private:
-  Ewk_Quota_Permission_Request_Callback func_;
-  void* user_data_;
-};
-
 class WebViewAsyncRequestHitTestDataCallback;
 class JavaScriptDialogManagerEfl;
-class WebViewGeolocationPermissionCallback;
-class WebViewUserMediaPermissionCallback;
-class WebViewUnfocusAllowCallback;
 class PermissionPopupManager;
 
 class EWebView {
@@ -512,32 +481,46 @@ class EWebView {
   base::string16 previous_text_;
   int current_find_request_id_;
   static int find_request_id_counter_;
+
+  typedef WebViewCallback<Ewk_View_Plain_Text_Get_Callback, const char*> EwkViewPlainTextGetCallback;
   IDMap<EwkViewPlainTextGetCallback, IDMapOwnPointer> plain_text_get_callback_map_;
+
+  typedef WebViewCallback<Ewk_View_MHTML_Data_Get_Callback, const char*> MHTMLCallbackDetails;
+  IDMap<MHTMLCallbackDetails, IDMapOwnPointer> mhtml_callback_map_;
+
   gfx::Size contents_size_;
   double progress_;
   mutable std::string title_;
   mutable std::string pem_certificate_;
   Hit_Test_Params hit_test_params_;
   base::WaitableEvent hit_test_completion_;
-  IDMap<MHTMLCallbackDetails, IDMapOwnPointer> mhtml_callback_map_;
   double page_scale_factor_;
   double min_page_scale_factor_;
   double max_page_scale_factor_;
-  scoped_ptr<WebViewGeolocationPermissionCallback> geolocation_permission_cb_;
-  scoped_ptr<WebViewUserMediaPermissionCallback> user_media_permission_cb_;
-  scoped_ptr<WebViewUnfocusAllowCallback> unfocus_allow_cb_;
+
+  WebViewCallback<Ewk_View_Geolocation_Permission_Callback,
+      _Ewk_Geolocation_Permission_Request*> geolocation_permission_cb_;
+  WebViewCallback<Ewk_View_User_Media_Permission_Callback,
+      _Ewk_User_Media_Permission_Request*> user_media_permission_cb_;
+  WebViewCallback<Ewk_View_Unfocus_Allow_Callback,
+      Ewk_Unfocus_Direction> unfocus_allow_cb_;
+  WebViewCallback<Ewk_View_Notification_Permission_Callback,
+      Ewk_Notification_Permission_Request*> notification_permission_callback_;
+  WebViewCallback<Ewk_Quota_Permission_Request_Callback,
+      const _Ewk_Quota_Permission_Request*> quota_request_callback_;
+
   scoped_ptr<content::InputPicker> inputPicker_;
   IDMap<WebApplicationIconUrlGetCallback, IDMapOwnPointer> web_app_icon_url_get_callback_map_;
   IDMap<WebApplicationIconUrlsGetCallback, IDMapOwnPointer> web_app_icon_urls_get_callback_map_;
   IDMap<WebApplicationCapableGetCallback, IDMapOwnPointer> web_app_capable_get_callback_map_;
-  scoped_ptr<NotificationPermissionCallback> notification_permission_callback_;
   scoped_ptr<PermissionPopupManager> permission_popup_manager_;
   scoped_ptr<ScrollDetector> scroll_detector_;
+
 #if defined(OS_TIZEN_MOBILE)
   content::FileChooserParams::Mode filechooser_mode_;
 #endif
   std::map<const _Ewk_Quota_Permission_Request*, content::QuotaPermissionContext::PermissionCallback> quota_permission_request_map_;
-  scoped_ptr<QuotaPermissionRequestCallback> quota_request_callback_;
+
   bool is_initialized_;
 
   scoped_ptr<_Ewk_Back_Forward_List> back_forward_list_;