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();
}
/**
* 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
*
*
* @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);
*
* @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);
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)
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));
}
-*/
{
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;
};
/**
*/
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));
}
-*/
#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));
}
-*/
#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_ */
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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_ */
'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',
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) {