Refactor implementation for ewk_certificate_policy_decision* API
authorWojciech Bielawski <w.bielawski@samsung.com>
Thu, 8 Jan 2015 13:10:05 +0000 (14:10 +0100)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
_Ewk_Certificate_Policy_Decision objects shall be destroyed after the user
takes decision with adequate API. Since policy decision may be suspended,
lifetime of _Ewk_Certificate_Policy_Decision needs to be passed over to API
functions. Similar behavior is needed for other API visible objects such as
_Ewk_Geolocation_Permission_Request, that's why common implementation is
provided in Ewk_Suspendable_Object class.
Modified tests:
utc_blink_ewk_certificate_policy_decision_ceritificate_pem_get_func
utc_blink_ewk_certificate_policy_decision_suspend_func
utc_blink_ewk_certificate_policy_decision_url_get_func

Bug: http://107.108.218.239/bugzilla/show_bug.cgi?id=9518
Reviewed by: Antonio Gomes, Janusz Majnert, Piotr Tworek

Change-Id: I80608c70247ebd02aac7b3bf1785b048143a3dcc
Signed-off-by: Wojciech Bielawski <w.bielawski@samsung.com>
tizen_src/ewk/efl_integration/public/ewk_certificate.cc
tizen_src/ewk/efl_integration/public/ewk_certificate.h
tizen_src/ewk/unittest/utc_blink_ewk_certificate_policy_decision_certificate_pem_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_certificate_policy_decision_suspend_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_certificate_policy_decision_url_get_func.cpp
tizen_src/impl/API/ewk_certificate_private.h
tizen_src/impl/API/ewk_suspendable_object.cc [new file with mode: 0644]
tizen_src/impl/API/ewk_suspendable_object.h [new file with mode: 0644]
tizen_src/impl/chromium-efl.gyp
tizen_src/impl/web_contents_delegate_efl.cc

index 1163cbf..c0c5c11 100644 (file)
 void ewk_certificate_policy_decision_allowed_set(Ewk_Certificate_Policy_Decision* certificatePolicyDecision, Eina_Bool allowed)
 {
   EINA_SAFETY_ON_NULL_RETURN(certificatePolicyDecision);
-  certificatePolicyDecision->isDecided = true;
-  certificatePolicyDecision->callback.Run(allowed);
+  certificatePolicyDecision->setDecision(allowed == EINA_TRUE);
 }
 
-void ewk_certificate_policy_decision_suspend(Ewk_Certificate_Policy_Decision* certificatePolicyDecision)
+Eina_Bool ewk_certificate_policy_decision_suspend(Ewk_Certificate_Policy_Decision* certificatePolicyDecision)
 {
-  EINA_SAFETY_ON_NULL_RETURN(certificatePolicyDecision);
-  certificatePolicyDecision->isSuspended = true;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(certificatePolicyDecision, EINA_FALSE);
+  return certificatePolicyDecision->suspend();
 }
 
 Eina_Stringshare* ewk_certificate_policy_decision_url_get(Ewk_Certificate_Policy_Decision* certificatePolicyDecision)
 {
-  EINA_SAFETY_ON_NULL_RETURN_VAL(certificatePolicyDecision, 0);
-  return certificatePolicyDecision->url;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(certificatePolicyDecision, "");
+  return certificatePolicyDecision->url();
 }
 
 Eina_Stringshare* ewk_certificate_policy_decision_certificate_pem_get(Ewk_Certificate_Policy_Decision* certificatePolicyDecision)
 {
-  EINA_SAFETY_ON_NULL_RETURN_VAL(certificatePolicyDecision, 0);
-  return certificatePolicyDecision->certificatePem;
+  EINA_SAFETY_ON_NULL_RETURN_VAL(certificatePolicyDecision, "");
+  return certificatePolicyDecision->certificatePem();
 }
 
 int ewk_certificate_policy_decision_error_get(Ewk_Certificate_Policy_Decision* certificatePolicyDecision)
 {
   EINA_SAFETY_ON_NULL_RETURN_VAL(certificatePolicyDecision, 0);
-  return certificatePolicyDecision->error;
+  return certificatePolicyDecision->error();
 }
index c42caba..3256aa8 100644 (file)
@@ -16,6 +16,8 @@ typedef struct _Ewk_Certificate_Policy_Decision Ewk_Certificate_Policy_Decision;
 
 /**
  * Set the variable to allow the site access about certificate error.
+ * After this function call Ewk_Certificate_Policy_Decision object becomes
+ * invalid.
  *
  * @param certificate_policy_decision certificate information data
  *
@@ -33,14 +35,15 @@ EAPI void ewk_certificate_policy_decision_allowed_set(Ewk_Certificate_Policy_Dec
  *
  * @return @c EINA_TRUE on success or @c EINA_FALSE on failure
  */
-EAPI void ewk_certificate_policy_decision_suspend(Ewk_Certificate_Policy_Decision* certificate_policy_decision);
+EAPI Eina_Bool ewk_certificate_policy_decision_suspend(Ewk_Certificate_Policy_Decision* certificate_policy_decision);
 
 /**
  * Get the variable url to check the site's url data about certificate error.
  *
  * @param certificate_policy_decision certificate information data
  *
- * @return @c url string on success or empty string on failure
+ * @return @c url string on success or empty string on failure. The string
+ * is only valid until related Ewk_Certificate_Policy_Decision object is valid.
  */
 EAPI Eina_Stringshare* ewk_certificate_policy_decision_url_get(Ewk_Certificate_Policy_Decision* certificate_policy_decision);
 
@@ -49,7 +52,9 @@ EAPI Eina_Stringshare* ewk_certificate_policy_decision_url_get(Ewk_Certificate_P
  *
  * @param certificate_policy_decision certificate information data
  *
- * @return @c certificate pem string on success or empty string on failure
+ * @return @c certificate pem string on success or empty string on failure.
+ * The string is only valid until related Ewk_Certificate_Policy_Decision
+ * object is valid.
  */
 EAPI Eina_Stringshare* ewk_certificate_policy_decision_certificate_pem_get(Ewk_Certificate_Policy_Decision* certificate_policy_decision);
 
index 875a066..4ff5028 100755 (executable)
 
 class utc_blink_ewk_certificate_policy_decision_certificate_pem_get : public utc_blink_ewk_base
 {
-
 protected:
-
   void PostSetUp()
   {
+    pem = NULL;
     evas_object_smart_callback_add(GetEwkWebView(), "request,certificate,confirm", policy_decision, this);
   }
 
   void PreTearDown()
   {
     evas_object_smart_callback_del(GetEwkWebView(), "request,certificate,confirm", policy_decision);
+    eina_stringshare_del(pem);
   }
 
   void LoadFinished(Evas_Object* webview)
@@ -31,52 +31,37 @@ protected:
   static void policy_decision(void* data, Evas_Object* webview, void* event_info)
   {
     utc_message("[policy decision] :: \n");
-    utc_blink_ewk_certificate_policy_decision_certificate_pem_get *owner = static_cast<utc_blink_ewk_certificate_policy_decision_certificate_pem_get*>(data);
+    utc_blink_ewk_certificate_policy_decision_certificate_pem_get *owner =
+        static_cast<utc_blink_ewk_certificate_policy_decision_certificate_pem_get*>(data);
 
     Ewk_Certificate_Policy_Decision* policy = (Ewk_Certificate_Policy_Decision*)event_info;
 
-    if (policy && ewk_certificate_policy_decision_certificate_pem_get(policy)) {
+    owner->pem = eina_stringshare_add(ewk_certificate_policy_decision_certificate_pem_get(policy));
+    if (policy && owner->pem) {
+      utc_message("[policy decision] :: pem: %s\n", owner->pem);
       owner->EventLoopStop(utc_blink_ewk_base::Success);
     }
   }
+
+protected:
+  Eina_Stringshare* pem;
 };
 
 /**
-* @brief Checking whether certification request confirmation works properly.
+* @brief Checking whether ewk_certificate_policy_decision_certificate_pem_get
+* returns not empty string.
 */
 TEST_F(utc_blink_ewk_certificate_policy_decision_certificate_pem_get, POS_TEST)
 {
-  Eina_Bool result = ewk_view_url_set(GetEwkWebView(), URL);
-
-  if (!result)
-    FAIL();
-
-  utc_blink_ewk_base::MainLoopResult main_result = EventLoopStart();
-
-  if (main_result != utc_blink_ewk_base::Success)
-    FAIL();
-
-  evas_object_show(GetEwkWebView());
-  evas_object_show(GetEwkWindow());
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), URL));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_STRNE("", pem);
 }
 
 /**
-* @brief Checking whether function works properly in case of NULL of a webview.
+* @brief Checking whether function works properly in case of NULL argument.
 */
-/*  To be implemented
 TEST_F(utc_blink_ewk_certificate_policy_decision_certificate_pem_get, NEG_TEST)
 {
-  is_failed = EINA_FALSE;
-  is_Accepted = EINA_FALSE;
-
-  Eina_Bool result = ewk_view_url_set(NULL, URL);
-  if (result)
-    utc_fail();
-
-  result = is_Accepted;
-
-  evas_object_show(test_view.webview);
-  evas_object_show(test_view.window);
-  utc_check_ne(result, EINA_TRUE);
+  ASSERT_STREQ("", ewk_certificate_policy_decision_certificate_pem_get(NULL));
 }
-*/
index 9fa9470..4fba434 100755 (executable)
@@ -12,34 +12,49 @@ class utc_blink_ewk_certificate_policy_decision_suspend  : public utc_blink_ewk_
 {
 protected:
 
-  void PostSetUp()
+  void PostSetUp() override
   {
     evas_object_smart_callback_add(GetEwkWebView(), "request,certificate,confirm", policy_decision, this);
   }
 
-  void PreTearDown()
+  void PreTearDown() override
   {
     evas_object_smart_callback_del(GetEwkWebView(), "request,certificate,confirm", policy_decision);
   }
 
-  void LoadFinished(Evas_Object* webview)
+  void LoadFinished(Evas_Object* webview) override
   {
-    EventLoopStop(utc_blink_ewk_base::Failure); // will noop if EventLoopStop was alraedy called
+    utc_message("[policy decision] :: Load finished for URL: %s\n", ewk_view_url_get(webview));
+
+    EventLoopStop(utc_blink_ewk_base::Failure);
   }
 
   static void policy_decision(void* data, Evas_Object* webview, void* event_info)
   {
     utc_message("[policy decision] :: \n");
-    utc_blink_ewk_certificate_policy_decision_suspend *owner = static_cast<utc_blink_ewk_certificate_policy_decision_suspend*>(data);
 
-    Ewk_Certificate_Policy_Decision* policy = (Ewk_Certificate_Policy_Decision*)event_info;
+    utc_blink_ewk_certificate_policy_decision_suspend *owner =
+            static_cast<utc_blink_ewk_certificate_policy_decision_suspend*>(data);
+    ASSERT_TRUE(owner) << "Event triggered with invalid data object";
 
-    if (policy) {
+    owner->certificate_policy_decision = static_cast<Ewk_Certificate_Policy_Decision*>(event_info);
 
-      ewk_certificate_policy_decision_suspend(policy);
-      owner->EventLoopStop(utc_blink_ewk_base::Success);
+    if (owner->certificate_policy_decision && !owner->policy_suspended) {
+      ewk_certificate_policy_decision_suspend(owner->certificate_policy_decision);
+      owner->policy_suspended = true;
     }
   }
+
+  bool TimeOut() override
+  {
+    EventLoopStop(policy_suspended ? Success : Failure);
+
+    return true;
+  }
+
+protected:
+  Ewk_Certificate_Policy_Decision *certificate_policy_decision = nullptr;
+  bool policy_suspended = false;
 };
 
 /**
@@ -47,37 +62,21 @@ protected:
 */
 TEST_F(utc_blink_ewk_certificate_policy_decision_suspend, POS_TEST)
 {
-  Eina_Bool result = ewk_view_url_set(GetEwkWebView(), URL);
-
-  if (!result)
-    FAIL();
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), URL));
 
-  utc_blink_ewk_base::MainLoopResult main_result = EventLoopStart();
+  ASSERT_EQ(Success, EventLoopStart(5));
 
-  if (main_result != utc_blink_ewk_base::Success)
-    FAIL();
+  ASSERT_TRUE(policy_suspended);
+  ASSERT_NE(certificate_policy_decision, nullptr);
 
-  evas_object_show(GetEwkWebView());
-  evas_object_show(GetEwkWindow());
+  ewk_certificate_policy_decision_allowed_set(certificate_policy_decision, EINA_TRUE);
+  ASSERT_EQ(Failure, EventLoopStart(10));
 }
 
 /**
-* @brief Checking whether function works properly in case of NULL of a webview.
+* @brief Checking whether function works properly in case of NULL argument.
 */
-/*TODO
 TEST_F(utc_blink_ewk_certificate_policy_decision_suspend, NEG_TEST)
 {
-  is_failed = EINA_FALSE;
-  is_Accepted = EINA_FALSE;
-
-  Eina_Bool result = ewk_view_url_set(NULL, URL);
-  if (result)
-    utc_fail();
-
-  result = is_Accepted;
-
-  evas_object_show(test_view.webview);
-  evas_object_show(test_view.window);
-  utc_check_ne(result, EINA_TRUE);
+  ASSERT_EQ(EINA_FALSE, ewk_certificate_policy_decision_suspend(NULL));
 }
-*/
index d66485b..5058e7c 100755 (executable)
@@ -6,78 +6,65 @@
 
 #include "utc_blink_ewk_base.h"
 
-#define URL "https://www.pcwebshop.co.uk"
+#define URL "https://www.pcwebshop.co.uk/"
 
 class utc_blink_ewk_certificate_policy_decision_url_get  : public utc_blink_ewk_base
 {
-
- protected:
-
-    void PostSetUp()
-    {
-        evas_object_smart_callback_add(GetEwkWebView(), "request,certificate,confirm", policy_decision, this);
+protected:
+  void PostSetUp()
+  {
+    url = NULL;
+    evas_object_smart_callback_add(GetEwkWebView(),
+        "request,certificate,confirm", policy_decision, this);
+  }
+
+  void PreTearDown()
+  {
+    evas_object_smart_callback_del(GetEwkWebView(),
+        "request,certificate,confirm", policy_decision);
+    eina_stringshare_del(url);
+  }
+
+  void LoadFinished(Evas_Object* webview)
+  {
+    EventLoopStop(utc_blink_ewk_base::Failure); // will noop if EventLoopStop was alraedy called
+  }
+
+  static void policy_decision(void* data, Evas_Object* webview, void* event_info)
+  {
+    utc_message("[policy decision]");
+    utc_blink_ewk_certificate_policy_decision_url_get *owner =
+        static_cast<utc_blink_ewk_certificate_policy_decision_url_get*>(data);
+
+    Ewk_Certificate_Policy_Decision* policy =
+        (Ewk_Certificate_Policy_Decision*) event_info;
+
+    owner->url = eina_stringshare_add(ewk_certificate_policy_decision_url_get(policy));
+    if (policy && owner->url) {
+      utc_message("[policy decision] :: URL: %s\n", owner->url);
+      owner->EventLoopStop(utc_blink_ewk_base::Success);
     }
+  }
 
-    void PreTearDown()
-    {
-        evas_object_smart_callback_del(GetEwkWebView(), "request,certificate,confirm", policy_decision);
-    }
-
-    void LoadFinished(Evas_Object* webview)
-    {
-        EventLoopStop(utc_blink_ewk_base::Failure); // will noop if EventLoopStop was alraedy called
-    }
-
-    static void policy_decision(void* data, Evas_Object* webview, void* event_info)
-    {
-        utc_message("[policy decision] :: \n");
-        utc_blink_ewk_certificate_policy_decision_url_get *owner = static_cast<utc_blink_ewk_certificate_policy_decision_url_get*>(data);
-
-        Ewk_Certificate_Policy_Decision* policy = (Ewk_Certificate_Policy_Decision*)event_info;
-
-        if (policy && ewk_certificate_policy_decision_url_get(policy)) {
-            owner->EventLoopStop(utc_blink_ewk_base::Success);
-        }
-    }
+protected:
+  Eina_Stringshare* url;
 };
 
 /**
-* @brief Checking whether certification request confirmation works properly.
+* @brief Checking whether ewk_certificate_policy_decision_url_get
+* returns not empty string.
 */
 TEST_F(utc_blink_ewk_certificate_policy_decision_url_get, POS_TEST)
 {
-    Eina_Bool result = ewk_view_url_set(GetEwkWebView(), URL);
-
-    if (!result)
-        FAIL();
-
-    utc_blink_ewk_base::MainLoopResult main_result = EventLoopStart();
-
-    if (main_result != utc_blink_ewk_base::Success)
-        FAIL();
-
-    evas_object_show(GetEwkWebView());
-    evas_object_show(GetEwkWindow());
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), URL));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_STREQ(URL, url);
 }
 
 /**
-* @brief Checking whether function works properly in case of NULL of a webview.
+* @brief Checking whether function works properly in case of NULL argument.
 */
-/*
-//TODO: should be implemented properly
-TEST_F(utc_blink_ewk_certificate_url_get, NEG_TEST)
+TEST_F(utc_blink_ewk_certificate_policy_decision_url_get, NEG_TEST)
 {
-  is_failed = EINA_FALSE;
-  is_Accepted = EINA_FALSE;
-
-  Eina_Bool result = ewk_view_url_set(NULL, URL);
-  if (result)
-    utc_fail();
-
-  result = is_Accepted;
-
-  evas_object_show(test_view.webview);
-  evas_object_show(test_view.window);
-  utc_check_ne(result, EINA_TRUE);
+  ASSERT_STREQ("", ewk_certificate_policy_decision_url_get(NULL));
 }
-*/
index fe4fc3c..50424e8 100644 (file)
@@ -6,38 +6,32 @@
 #define EWK_CERTIFICATE_PRIVATE_H_
 
 #include <string>
-#include "eina_stringshare.h"
 
-#include "base/callback.h"
+#include "ewk_suspendable_object.h"
 #include "url/gurl.h"
 
-struct _Ewk_Certificate_Policy_Decision {
+class _Ewk_Certificate_Policy_Decision : public Ewk_Suspendable_Object {
+ public:
   _Ewk_Certificate_Policy_Decision(const GURL& url, const std::string& cert, int error_code, const base::Callback<void(bool)>& result_callback)
-      : url(eina_stringshare_add(url.spec().c_str())),
-        certificatePem(eina_stringshare_add(cert.c_str())),
-        error(error_code),
-        isDecided(false),
-        isSuspended(false),
-        callback(result_callback) { }
-
-  _Ewk_Certificate_Policy_Decision()
-      : url(NULL),
-        certificatePem(NULL),
-        error(0),
-        isDecided(false),
-        isSuspended(false) { }
+      : error_(error_code),
+        Ewk_Suspendable_Object(result_callback) {
+    url_ = eina_stringshare_add(url.spec().c_str());
+    certificatePem_ = eina_stringshare_add(cert.c_str());
+  }
 
   ~_Ewk_Certificate_Policy_Decision() {
-    eina_stringshare_del(url);
-    eina_stringshare_del(certificatePem);
+    eina_stringshare_del(url_);
+    eina_stringshare_del(certificatePem_);
   }
 
-  const char* url;
-  const char* certificatePem;
-  int error;
-  bool isDecided;
-  bool isSuspended;
-  base::Callback<void(bool)> callback; //run when policy is set by app
+  Eina_Stringshare* url() const { return url_; }
+  Eina_Stringshare* certificatePem() const { return certificatePem_; }
+  int error() const { return error_; }
+
+ private:
+  Eina_Stringshare* url_ = nullptr;
+  Eina_Stringshare* certificatePem_ = nullptr;
+  int error_;
 };
 
 #endif /* EWK_CERTIFICATE_PRIVATE_H_ */
diff --git a/tizen_src/impl/API/ewk_suspendable_object.cc b/tizen_src/impl/API/ewk_suspendable_object.cc
new file mode 100644 (file)
index 0000000..61e4eef
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright 2014 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ewk_suspendable_object.h"
+
+#include "content/public/browser/browser_thread.h"
+
+using content::BrowserThread;
+
+bool Ewk_Suspendable_Object::setDecision(bool allowed) {
+  CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  if (!isDecided_) {
+    isDecided_ = true;
+    callback_.Run(allowed);
+
+    if (isSuspended_) {
+      // If decision was suspended, then it was not deleted by the creator
+      // Deletion of this object must be done after decision was made, as
+      // this object will no longer be valid. But if decision was not suspended
+      // it will be deleted right after permission callbacks are executed.
+      BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
+    }
+    return true;
+  }
+  return false;
+}
+
+void Ewk_Suspendable_Object::ignore() {
+  isDecided_ = true;
+}
+
+bool Ewk_Suspendable_Object::suspend() {
+  isSuspended_ = true;
+  return true;
+}
diff --git a/tizen_src/impl/API/ewk_suspendable_object.h b/tizen_src/impl/API/ewk_suspendable_object.h
new file mode 100644 (file)
index 0000000..42c33fb
--- /dev/null
@@ -0,0 +1,33 @@
+// Copyright 2014 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef EWK_SUSPENDABLE_OBJECT_H_
+#define EWK_SUSPENDABLE_OBJECT_H_
+
+#include <string>
+
+#include "base/callback.h"
+
+class Ewk_Suspendable_Object {
+ public:
+  Ewk_Suspendable_Object(const base::Callback<void(bool)>& result_callback)
+      : isDecided_(false),
+        isSuspended_(false),
+        callback_(result_callback) { }
+  virtual ~Ewk_Suspendable_Object() { }
+
+  bool setDecision(bool allowed);
+  void ignore();
+  bool suspend();
+
+  bool isDecided() const { return isDecided_; }
+  bool isSuspended() const { return isSuspended_; }
+
+ private:
+  bool isDecided_;
+  bool isSuspended_;
+  base::Callback<void(bool)> callback_; //run when policy is set by app
+};
+
+#endif /* EWK_SUSPENDABLE_OBJECT_H_ */
index 1662533..2cc7c87 100644 (file)
       'API/ewk_security_origin_private.h',
       'API/ewk_settings_private.cc',
       'API/ewk_settings_private.h',
+      'API/ewk_suspendable_object.cc',
+      'API/ewk_suspendable_object.h',
       'API/ewk_text_style_private.h',
       'API/ewk_user_media_private.h',
       'API/ewk_web_application_icon_data_private.h',
index 8713ac8..5850619 100644 (file)
@@ -386,8 +386,12 @@ void WebContentsDelegateEfl::RequestCertificateConfirm(WebContents* /*web_conten
                                                                                          cert_error,
                                                                                          callback));
   web_view_->SmartCallback<EWebViewCallbacks::RequestCertificateConfirm>().call(policy.get());
-  if (!policy->isSuspended && !policy->isDecided)
-    callback.Run(true);
+
+  if (!policy->isSuspended())
+    policy->setDecision(true);
+  else
+    policy.release(); // if policy is suspended, the API takes over the policy object lifetime
+                      // and policy will be deleted after decision is made
 }
 
 void WebContentsDelegateEfl::SetContentSecurityPolicy(const std::string& policy, tizen_webview::ContentSecurityPolicyType header_type) {