Implementation of ewk_notification_policies_removed.
authorTomasz Czekala <t.czekala@partner.samsung.com>
Thu, 15 Jan 2015 11:31:22 +0000 (12:31 +0100)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
This API function is for removing entries from the internal
engine's cache, while the real storage of the policies is
done on the client side (such as 'browser'). I've implemented
the cache (std::map) and added implementation of
webkitNotifications.checkPermission() to use this cache to check
for the permission (this was not implemented at all and
default implementation in blink returns always 'Allowed').
As the permission checking is done in the IO thread I've
made the NotificationControllerEfl a RefCountedThreadSafe
object, so it can be passed with the ResourceContext and
accessed without webview. To make this permissions cache
feature complete we need a function to set the initial state
(which e.g. browser could read from its database) - for
this purpose there is ewk_notification_cached_permissions_set()
function and this commit contains fuctionality needed by this
function.
EWK API regarding Notification's functionality is updated
in this patch. The "notification,permission,request" smart
callback is removed and replaced with a user defined callback
set with ewk_view_notification_permission_callback_set().
Other functions added in this patch:
  ewk_notification_permission_reply
Following functions are now deprecated:
  ewk_notification_permission_request_set
  ewk_notification_permission_request_suspend

This patch is a merge of the following patches:
http://165.213.202.130:8080/#/c/69294/
http://165.213.202.130:8080/#/c/70194/
http://165.213.202.130:8080/#/c/72200/
by Filip Piechocki

Bug: http://107.108.218.239/bugzilla/show_bug.cgi?id=9559
Reviewed by: Antonio Gomes, Kamil Klimek, Piotr Tworek

Change-Id: I34c818a7f09735bcbf4aec4298851a2002e7bbc1
Signed-off-by: Tomasz Czekala <t.czekala@partner.samsung.com>
47 files changed:
tizen_src/ewk/efl_integration/public/ewk_notification.cc
tizen_src/ewk/efl_integration/public/ewk_notification.h
tizen_src/ewk/efl_integration/public/ewk_security_origin.cc
tizen_src/ewk/efl_integration/public/ewk_security_origin.h
tizen_src/ewk/efl_integration/public/ewk_view.cc
tizen_src/ewk/efl_integration/public/ewk_view.h
tizen_src/ewk/efl_webview_app/app.c
tizen_src/ewk/unittest/ewk-tests.gypi
tizen_src/ewk/unittest/resources/common/sample_notification_2.html [changed mode: 0755->0644]
tizen_src/ewk/unittest/resources/common/sample_notification_3.html [deleted file]
tizen_src/ewk/unittest/utc_blink_ewk_notification_body_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_clicked_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_icon_url_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_id_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_permission_reply_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_notification_permission_request_origin_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_permission_request_set_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_permission_request_suspend_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_policies_removed_func.cpp [new file with mode: 0644]
tizen_src/ewk/unittest/utc_blink_ewk_notification_security_origin_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_showed_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_notification_title_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_security_origin_host_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_security_origin_port_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_security_origin_protocol_get_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_view_notification_closed_func.cpp
tizen_src/ewk/unittest/utc_blink_ewk_view_notification_permission_callback_set_func.cpp [new file with mode: 0644]
tizen_src/impl/API/ewk_notification_private.cc [deleted file]
tizen_src/impl/API/ewk_notification_private.h [deleted file]
tizen_src/impl/browser/notification/notification_controller_efl.cc
tizen_src/impl/browser/notification/notification_controller_efl.h
tizen_src/impl/browser/web_view_browser_message_filter.cc
tizen_src/impl/browser_context_efl.cc
tizen_src/impl/browser_context_efl.h
tizen_src/impl/chromium-efl.gyp
tizen_src/impl/content_browser_client_efl.cc
tizen_src/impl/content_browser_client_efl.h
tizen_src/impl/eweb_view.cc
tizen_src/impl/eweb_view.h
tizen_src/impl/eweb_view_callbacks.h
tizen_src/impl/tizen_webview/public/tw_callbacks.h
tizen_src/impl/tizen_webview/public/tw_notification.cc
tizen_src/impl/tizen_webview/public/tw_notification.h
tizen_src/impl/tizen_webview/public/tw_security_origin.cc
tizen_src/impl/tizen_webview/public/tw_security_origin.h
tizen_src/impl/tizen_webview/public/tw_webview.cc
tizen_src/impl/tizen_webview/public/tw_webview.h

index 465f194..d0345c5 100644 (file)
@@ -14,7 +14,6 @@
 #include "private/ewk_notification_private.h"
 #include "private/ewk_private.h"
 
-
 const char *ewk_notification_body_get(const Ewk_Notification *ewk_notification)
 {
   EINA_SAFETY_ON_NULL_RETURN_VAL(ewk_notification, 0);
@@ -42,6 +41,23 @@ uint64_t ewk_notification_id_get(const Ewk_Notification *ewk_notification)
   return ewk_notification->GetID();
 }
 
+void ewk_notification_cached_permissions_set(Ewk_Context *context, Eina_List *ewk_notification_permissions)
+{
+#if defined(ENABLE_NOTIFICATIONS)
+  EINA_SAFETY_ON_NULL_RETURN(context);
+  scoped_refptr<content::NotificationControllerEfl> notification_controller(context->browser_context()->GetNotificationController());
+  notification_controller->ClearPermissions();
+  Eina_List* list;
+  void* data;
+  EINA_LIST_FOREACH(ewk_notification_permissions, list, data) {
+    Ewk_Notification_Permission* perm = static_cast<Ewk_Notification_Permission*>(data);
+    notification_controller->AddPermission(GURL(perm->origin), (perm->allowed == EINA_TRUE));
+  }
+#else
+  NOTIMPLEMENTED();
+#endif
+}
+
 const Ewk_Security_Origin *ewk_notification_permission_request_origin_get(
     const Ewk_Notification_Permission_Request *request)
 {
@@ -49,15 +65,19 @@ const Ewk_Security_Origin *ewk_notification_permission_request_origin_get(
   return static_cast<const Ewk_Security_Origin*>(request->GetSecurityOrigin());
 }
 
+void ewk_notification_permission_reply(Ewk_Notification_Permission_Request *request, Eina_Bool allow)
+{
+#if defined(ENABLE_NOTIFICATIONS)
+  EINA_SAFETY_ON_NULL_RETURN(request);
+  request->Reply(allow == EINA_TRUE);
+#endif
+}
+
 void ewk_notification_permission_request_set(Ewk_Notification_Permission_Request *request, Eina_Bool allowed)
 {
-#if !defined(EWK_BRINGUP)
-#warning "[M38] TODO: Fix and re-enable notifications (edit efl_integration/public/ewk_notifications.cc)"
+#if defined(ENABLE_NOTIFICATIONS)
   EINA_SAFETY_ON_NULL_RETURN(request);
-  EWebView* view = EWebView::FromEvasObject(request->GetWebviewEvasObject());
-  if (view)
-    view->context()->browser_context()->GetNotificationController()->SetPermissionForNotification(request, allowed);
-  delete request;
+  request->Reply(allowed == EINA_TRUE);
 #endif
 }
 
@@ -69,7 +89,13 @@ void ewk_notification_permission_request_suspend(Ewk_Notification_Permission_Req
 
 void ewk_notification_policies_removed(Ewk_Context* ewkContext, Eina_List* origins)
 {
-  LOG_EWK_API_MOCKUP();
+#if defined(ENABLE_NOTIFICATIONS)
+  EINA_SAFETY_ON_NULL_RETURN(ewkContext);
+  EINA_SAFETY_ON_NULL_RETURN(origins);
+  ewkContext->browser_context()->GetNotificationController()->RemovePermissions(origins);
+#else
+  NOTIMPLEMENTED();
+#endif
 }
 
 const Ewk_Security_Origin *ewk_notification_security_origin_get(const Ewk_Notification *ewk_notification)
index 3932fed..3e49122 100644 (file)
@@ -61,6 +61,16 @@ EAPI const char *ewk_notification_icon_url_get(const Ewk_Notification *ewk_notif
 EAPI uint64_t ewk_notification_id_get(const Ewk_Notification *ewk_notification);
 
 /**
+ * Requests for setting cached notification permissions.
+ *
+ * By calling this notification permission is replaced as passed ewk_notification_permissions.
+ *
+ * @param context context object
+ * @param ewk_notification_permissions list of cached permissions(Ewk_Notification_Permission)
+ */
+EAPI void ewk_notification_cached_permissions_set(Ewk_Context *context, Eina_List *ewk_notification_permissions);
+
+/**
  * Requests for getting origin of notification permission request.
  *
  * @param request Ewk_Notification_Permission_Request object to get origin for notification permission request
@@ -71,13 +81,22 @@ EAPI uint64_t ewk_notification_id_get(const Ewk_Notification *ewk_notification);
 EAPI const Ewk_Security_Origin *ewk_notification_permission_request_origin_get(const Ewk_Notification_Permission_Request *request);
 
 /**
+ * Reply the result about notification permission.
+ *
+ * @param request Ewk_Notification_Permission_Request object to get the infomation about notification permission request.
+ * @param allow result about notification permission
+ */
+EAPI void ewk_notification_permission_reply(Ewk_Notification_Permission_Request *request, Eina_Bool allow);
+
+/**
+ * Deprecated, use ewk_notification_permission_reply instead.
  * Sets permission of notification.
  *
  * @param request Ewk_Notification_Permission_Request object to allow/deny notification permission
  *        request is freed in this function.
  * @param allowed @c EINA_TRUE if permission is allowed, @c EINA_FALSE if permission is denied
  */
-EAPI void ewk_notification_permission_request_set(Ewk_Notification_Permission_Request *request, Eina_Bool allowed);
+EINA_DEPRECATED EAPI void ewk_notification_permission_request_set(Ewk_Notification_Permission_Request *request, Eina_Bool allowed);
 
 /**
  * Suspend the operation for permission request.
index 21d9279..33d23dc 100644 (file)
@@ -43,3 +43,13 @@ uint16_t ewk_security_origin_port_get(const Ewk_Security_Origin* origin)
     return static_cast<uint16_t>(origin->GetPort());
 }
 
+void ewk_security_origin_free(Ewk_Security_Origin *o)
+{
+  delete o;
+}
+
+Ewk_Security_Origin *ewk_security_origin_new_from_string(const char *url)
+{
+  return static_cast<Ewk_Security_Origin *>(tizen_webview::Security_Origin::CreateFromString(url));
+}
+
index cb84509..df014dd 100644 (file)
@@ -42,6 +42,23 @@ EAPI Eina_Stringshare* ewk_security_origin_protocol_get(const Ewk_Security_Origi
  */
 EAPI uint16_t ewk_security_origin_port_get(const Ewk_Security_Origin* origin);
 
+/**
+ * Release all resources allocated by a security origin object.
+ *
+ * @param o security origin object
+ */
+EAPI void ewk_security_origin_free(Ewk_Security_Origin *o);
+
+/**
+ * Creates a security origin for a url.
+ *
+ * @param url the url for the security origin.
+ *
+ * @return the security origin object
+ */
+EAPI Ewk_Security_Origin *ewk_security_origin_new_from_string(const char *url);
+
+
 #ifdef __cplusplus
 }
 #endif
index 19f41b1..daf32d0 100644 (file)
@@ -661,7 +661,7 @@ Eina_Bool ewk_view_notification_closed(Evas_Object* ewkView, Eina_List* notifica
   assert(impl->GetWebContext());
   assert(impl->GetWebContext()->browser_context());
   assert(impl->GetWebContext()->browser_context()->GetNotificationController());
-  content::NotificationControllerEfl* controller =
+  scoped_refptr<content::NotificationControllerEfl> controller =
       impl->GetWebContext()->browser_context()->GetNotificationController();
 
   Eina_List* notification_iterator = NULL;
@@ -1004,6 +1004,12 @@ Ewk_Back_Forward_List* ewk_view_back_forward_list_get(const Evas_Object* ewkView
   return chromium_glue::from(impl->GetBackForwardList());
 }
 
+void ewk_view_notification_permission_callback_set(Evas_Object *o, Ewk_View_Notification_Permission_Callback callback, void *user_data)
+{
+  EWK_VIEW_IMPL_GET_OR_RETURN(o, impl);
+  impl->SetNotificationPermissionCallback(reinterpret_cast<tizen_webview::View_Notification_Permission_Callback>(callback), user_data);
+}
+
 void ewk_view_draw_focus_ring_enable_set(Evas_Object* ewkView, Eina_Bool enable)
 {
 #if defined(OS_TIZEN_TV) && !defined(EWK_BRINGUP)
index 6ca2d67..6195769 100644 (file)
 #include "ewk_window_features.h"
 #include "ewk_quota_permission_request.h"
 #include "ewk_geolocation.h"
+#include "ewk_notification.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -304,6 +305,17 @@ typedef void (*Ewk_Web_App_Icon_URLs_Get_Callback)(Eina_List *icon_urls, void *u
 // #endif
 
 /**
+ * Callback for ewk_view_notification_permission_callback_set
+ *
+ * @param o view object to request the notification permission
+ * @param request Ewk_Notification_Permission_Request object to get the information about notification permission request.
+ * @param user_data user data
+ *
+ * @return returned value is not used
+ */
+typedef Eina_Bool (*Ewk_View_Notification_Permission_Callback)(Evas_Object *o, Ewk_Notification_Permission_Request *request, void *user_data);
+
+/**
  * The version you have to put into the version field
  * in the @a Ewk_View_Smart_Class structure.
  */
@@ -1698,6 +1710,15 @@ EAPI void ewk_view_quota_permission_request_cancel(const Ewk_Quota_Permission_Re
  */
 EAPI Eina_Bool ewk_view_web_login_request(Evas_Object* ewkView);
 
+/**
+ * Sets the notification permission callback.
+ *
+ * @param o view object to request the notification permission
+ * @param callback Ewk_View_Notification_Permission_Callback function to notification permission
+ * @param user_data user data
+ */
+EAPI void ewk_view_notification_permission_callback_set(Evas_Object *o, Ewk_View_Notification_Permission_Callback callback, void *user_data);
+
 #ifdef __cplusplus
 }
 #endif
index 547d5ce..81f38dc 100644 (file)
@@ -120,7 +120,7 @@ static void __webprocess_crashed_cb(void* data, Evas_Object* obj, void* event_in
 
 static void on_evas_resize(Ecore_Evas*);
 static void __notification_show_cb(void *data, Evas_Object *obj, void *event_info);
-static void __notification_permission_cb(void *data, Evas_Object *obj, void *event_info);
+static Eina_Bool __notification_permission_cb(void *data, Evas_Object *obj, void *event_info);
 static void __notification_cancel_cb(void *data, Evas_Object *obj, void *event_info);
 static void __notification_cancel_byuser_cb(void *data, Evas_Object *obj, void *event_info);
 static void __download_callback(const char*download_url, void* user_data);
@@ -473,7 +473,6 @@ int main(int argc, char** argv)
   evas_object_smart_callback_add(view, "authentication,challenge", __auth_challenge_cb, 0);
   evas_object_smart_callback_add(view, "notification,show", __notification_show_cb,0);
   evas_object_smart_callback_add(view, "notification,cancel", __notification_cancel_cb,0);
-  evas_object_smart_callback_add(view, "notification,permission,request", __notification_permission_cb,0);
   evas_object_smart_callback_add(view, "policy,response,decide", __policy_response_decide_cb, 0);
   evas_object_smart_callback_add(view, "contextmenu,customize", __customize_context_menu_cb, 0);
   evas_object_smart_callback_add(view, "contextmenu,selected", __customize_context_menu_item_selected_cb, 0);
@@ -503,6 +502,7 @@ int main(int argc, char** argv)
   
   ewk_view_custom_header_add(view, "X-Test-header", "X-Value-1");
 
+  ewk_view_notification_permission_callback_set(view, __notification_permission_cb, 0);
   ewk_context_vibration_client_callbacks_set(context, __vibration_on_cb, __vibration_off_cb, NULL);
   ewk_context_mime_override_callback_set(__mime_override_cb);
   ewk_view_javascript_alert_callback_set(view, __ewk_view_javascript_alert_cb, 0);
@@ -978,7 +978,7 @@ void __notification_show_cb(void *data, Evas_Object *obj, void *event_info)
   printf ("APP.C callback called __notification_show_cb \n");
 }
 
-void __notification_permission_cb(void *data, Evas_Object *obj, void *event_info)
+Eina_Bool __notification_permission_cb(void *data, Evas_Object *obj, void *event_info)
 {
   Ewk_Notification_Permission_Request *request = (Ewk_Notification_Permission_Request*)event_info;
   if(request) {
@@ -987,8 +987,9 @@ void __notification_permission_cb(void *data, Evas_Object *obj, void *event_info
         printf("APP.C callback called __notification_permission_cb URL = %s, protocol = %s, port = %d\n",
         ewk_security_origin_host_get(sec_origin), ewk_security_origin_protocol_get(sec_origin),ewk_security_origin_port_get(sec_origin));
     }
-    ewk_notification_permission_request_set(request, 1);
+    ewk_notification_permission_reply(request, EINA_TRUE);
   }
+  return EINA_FALSE;
 }
 
 void __notification_cancel_cb(void *data, Evas_Object *obj, void *event_info)
index 65de28d..76647dd 100644 (file)
         'utc_blink_ewk_notification_clicked_func.cpp',
         'utc_blink_ewk_notification_icon_url_get_func.cpp',
         'utc_blink_ewk_notification_id_get_func.cpp',
+        'utc_blink_ewk_notification_permission_reply_func.cpp',
         'utc_blink_ewk_notification_permission_request_origin_get_func.cpp',
         'utc_blink_ewk_notification_permission_request_set_func.cpp',
         'utc_blink_ewk_notification_permission_request_suspend_func.cpp',
+        'utc_blink_ewk_notification_policies_removed_func.cpp',
         'utc_blink_ewk_notification_security_origin_get_func.cpp',
         'utc_blink_ewk_notification_showed_func.cpp',
         'utc_blink_ewk_notification_title_get_func.cpp',
         'utc_blink_ewk_view_main_frame_get_func.cpp',
         'utc_blink_ewk_view_mhtml_data_get_func.cpp',
         'utc_blink_ewk_view_notification_closed_func.cpp',
+        'utc_blink_ewk_view_notification_permission_callback_set_func.cpp',
         'utc_blink_ewk_view_orientation_lock_callback_set_func.cpp',
         'utc_blink_ewk_view_orientation_send_func.cpp',
         'utc_blink_ewk_view_page_visibility_state_set_func.cpp',
old mode 100755 (executable)
new mode 100644 (file)
index 01a4598..4c7cb0e
@@ -1,68 +1,58 @@
 <html>
+<meta name="viewport" content="initial-scale=1.0">
 <head>
-<title>EWK Notifications</title>
+<style>
+button {
+    width: 100%;
+    height: 100%;
+}
+</style>
 </head>
-<body onload="testNoti()">
-
-<h1>Sample Page</h1>
-
-<p id="notificationTest">This is a sample page to test EWK Notification APIs.</p>
-
+<body onload="test()">
+<button type="button" id="startButton" onclick="test()">start test</button>
 <script type="text/javascript">
-       
-function testNotifications()
-{
-    if (window.webkitNotifications.checkPermission() == 0)
-    {
-        var icon  = 'logo.png';
-        var title = 'Notification Title';
-        var body   = 'Notification body content';
 
-        var notification_test = window.webkitNotifications.createNotification(icon, title, body);
-        notification_test.show();
-    }
-    else
-    {
-        window.webkitNotifications.requestPermission(testNotifications);
-    }
-}
+function showNotification() {
+    var notification = new Notification("Notification Title", {
+        icon: "logo.png",
+        body: "Notification body content"
+    });
 
-function sleep()
-{
-    var startTime = new Date().getTime();
-    while(new Date().getTime() < startTime + 5000)
-    {
-    
-    }
+    notification.onclick = function() {
+        document.title = "notification_clicked";
+    };
 
-}
+    notification.onshow = function() {
+        document.title = "notification_shown";
+    };
 
-function testNotifications1()
-{
-    if (window.webkitNotifications.checkPermission() == 0)
-    {
-        var icon  = 'logo.png1';
-        var title = 'Notification Title1';
-        var body   = 'Notification body content1';
+    notification.onclose = function() {
+        document.title = "notification_closed";
+    };
+}
 
-        var notification_test = window.webkitNotifications.createNotification(icon, title, body);
-        notification_test.show();
+function test() {
+    console.log("Checking permissions");
+    if (!("Notification" in window)) {
+        console.log("Notifications not available!");
+        return;
     }
-    else
-    {
-        window.webkitNotifications.requestPermission(testNotifications);
+    if (Notification.permission === "granted") {
+        console.log("event_loop_stop:Permission granted");
+        showNotification();
+    } else {
+        console.log("Requesting permission...");
+        Notification.requestPermission(function (permission) {
+            console.log("received permission: " + permission);
+            if (permission === "granted") {
+               Notification.permission = permission;
+               console.log("event_loop_stop:Permission granted after request");
+               showNotification();
+            }
+        });
     }
 }
 
-function testNoti()
-{
-   testNotifications();
-   sleep();
-   testNotifications1();
-    
-}
-
 </script>
-
 </body>
 </html>
diff --git a/tizen_src/ewk/unittest/resources/common/sample_notification_3.html b/tizen_src/ewk/unittest/resources/common/sample_notification_3.html
deleted file mode 100644 (file)
index b444fab..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<html>
- <head>
-  <script>
-    function noti() {
-      window.webkitNotifications.requestPermission();
-      console.log("Notifications are supported!1");
-    }
-  </script>
- </head>
-<body>
-  <input type="button" value="Open Window" onclick="noti()">
-</body>
-</html>
index 919fa3f..19802ee 100755 (executable)
@@ -6,30 +6,37 @@
 
 class utc_blink_ewk_notification_body_get : public utc_blink_ewk_base {
 protected:
+  utc_blink_ewk_notification_body_get() : body(NULL) {}
+
   /* Startup function */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
   }
 
   /* Cleanup function */
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
   }
 
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: ");
 
-    if (!event_info)
-      utc_fail();
+    utc_blink_ewk_notification_body_get *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
   }
 
   /* Callback for "notification,show" */
@@ -48,20 +55,17 @@ protected:
     utc_blink_ewk_notification_body_get* owner = static_cast<utc_blink_ewk_notification_body_get*>(data);
 
     //call ewk_notification API
-    const char* body = ewk_notification_body_get((Ewk_Notification*)event_info);
-    if (strcmp(body, owner->notification_body_ref) == 0) {
-      owner->EventLoopStop(Success);
-    } else {
-      owner->EventLoopStop(Failure);
-    }
+    owner->body = strdup(ewk_notification_body_get((Ewk_Notification*)event_info));
+    owner->EventLoopStop(Success);
   }
 
 protected:
   static const char* const resource_relative_path;
   static const char* const notification_body_ref;
+  char* body;
 };
 
-const char* const utc_blink_ewk_notification_body_get::resource_relative_path = "/common/sample_notification_1.html";
+const char* const utc_blink_ewk_notification_body_get::resource_relative_path = "/common/sample_notification_2.html";
 const char* const utc_blink_ewk_notification_body_get::notification_body_ref = "Notification body content";
 
 /**
@@ -70,13 +74,11 @@ const char* const utc_blink_ewk_notification_body_get::notification_body_ref = "
 TEST_F(utc_blink_ewk_notification_body_get, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
-  Eina_Bool result = ewk_view_url_set(GetEwkWebView(), resource_url.c_str());
-
-  MainLoopResult loop_result = EventLoopStart();
-
-  if (loop_result != Success) {
-    FAIL();
-  }
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(body);
+  ASSERT_STREQ(body, notification_body_ref);
+  free(body);
 }
 
 /**
index 99b6bf1..920791d 100644 (file)
@@ -7,15 +7,21 @@
 class utc_blink_ewk_notification_clicked : public utc_blink_ewk_base
 {
  protected:
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  utc_blink_ewk_notification_clicked() : clicked(false) {}
+
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: \n");
-    if (!event_info) {
-      FAIL();
+    utc_blink_ewk_notification_clicked *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
     }
     //allow the notification
-    ewk_notification_permission_request_set(static_cast<Ewk_Notification_Permission_Request*>(event_info), EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
   }
 
   /* Callback for "notification,show" */
@@ -33,32 +39,51 @@ class utc_blink_ewk_notification_clicked : public utc_blink_ewk_base
       FAIL();
     }
 
-    utc_blink_ewk_notification_clicked* owner = static_cast<utc_blink_ewk_notification_clicked*>(data);
-
     uint64_t notification_id = ewk_notification_id_get(static_cast<Ewk_Notification*>(event_info));
     ewk_notification_clicked(context, notification_id);
-    owner->EventLoopStop(Success);;
+  }
+
+  static void titleChanged(void* data, Evas_Object* webview, void* event_info)
+  {
+    const char* title = static_cast<const char*>(event_info);
+    utc_message("[titleChanged] :: title = %s", title);
+    utc_blink_ewk_notification_clicked* owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (title && strcmp(title, "notification_clicked") == 0) {
+      owner->clicked = true;
+      owner->EventLoopStop(Success);
+    }
   }
 
   /* Startup function */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
+    evas_object_smart_callback_add(GetEwkWebView(), "title,changed", titleChanged, this);
   }
 
   /* Cleanup function */
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
+    evas_object_smart_callback_del(GetEwkWebView(), "title,changed", titleChanged);
+  }
+
+  // helper function
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
   }
 
 protected:
   static const char* const resource_relative_path;
+  bool clicked;
 };
 
-const char* const utc_blink_ewk_notification_clicked::resource_relative_path = "/common/sample_notification_1.html";
+const char* const utc_blink_ewk_notification_clicked::resource_relative_path = "/common/sample_notification_2.html";
 
 /**
 * @brief Positive test case for ewk_notification_clicked()
@@ -66,12 +91,9 @@ const char* const utc_blink_ewk_notification_clicked::resource_relative_path = "
 TEST_F(utc_blink_ewk_notification_clicked, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
-
-  if (!ewk_view_url_set(GetEwkWebView(), resource_url.c_str())) {
-    FAIL();
-  }
-
-  EXPECT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(clicked);
 }
 
 /**
index 4001f56..e5e6cb4 100755 (executable)
@@ -6,30 +6,37 @@
 
 class utc_blink_ewk_notification_icon_url_get : public utc_blink_ewk_base {
 protected:
+  utc_blink_ewk_notification_icon_url_get() : icon_url(NULL) {}
+
   /* Startup function */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
   }
 
   /* Cleanup function */
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
   }
 
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: ");
 
-    if (!event_info)
-      utc_fail();
+    utc_blink_ewk_notification_icon_url_get *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
   }
 
   /* Callback for "notification,show" */
@@ -47,28 +54,30 @@ protected:
 
     utc_blink_ewk_notification_icon_url_get* owner = static_cast<utc_blink_ewk_notification_icon_url_get*>(data);
     //call ewk_notification API
-    const char* iconURL = ewk_notification_icon_url_get((Ewk_Notification*)event_info);
-    if (iconURL)
-    {
-      char* getIconName = strrchr((char*)iconURL, '/');
-      getIconName++;
-      utc_message("[notificationShpw] :: icon name: %s", getIconName);
-      if (strcmp(getIconName, owner->notification_icon_ref) == 0) {
-        owner->EventLoopStop(Success);
-        return;
-      }
-
+    owner->icon_url = ewk_notification_icon_url_get((Ewk_Notification*)event_info);
+    utc_message("[notificationShow] :: icon_url = %s", owner->icon_url);
+    if (owner->icon_url) {
+      char* getIconName = strrchr((char*)owner->icon_url, '/');
+      owner->icon_url = ++getIconName;
     }
 
-    owner->EventLoopStop(Failure);
+    owner->EventLoopStop(Success);
+  }
+
+  // helper function
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
   }
 
 protected:
   static const char* const resource_relative_path;
   static const char* const notification_icon_ref;
+  const char* icon_url;
 };
 
-const char* const utc_blink_ewk_notification_icon_url_get::resource_relative_path = "/common/sample_notification_1.html";
+const char* const utc_blink_ewk_notification_icon_url_get::resource_relative_path = "/common/sample_notification_2.html";
 const char* const utc_blink_ewk_notification_icon_url_get::notification_icon_ref = "logo.png";
 
 /**
@@ -77,11 +86,10 @@ const char* const utc_blink_ewk_notification_icon_url_get::notification_icon_ref
 TEST_F(utc_blink_ewk_notification_icon_url_get, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
-  Eina_Bool result = ewk_view_url_set(GetEwkWebView(), resource_url.c_str());
-
-  MainLoopResult loop_result = EventLoopStart();
-
-  EXPECT_EQ(Success, loop_result);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(icon_url);
+  ASSERT_STREQ(icon_url, notification_icon_ref);
 }
 
 /**
index 9145bd0..8da70e2 100755 (executable)
@@ -8,30 +8,36 @@
 
 class utc_blink_ewk_notification_id_get : public utc_blink_ewk_base {
  protected:
+  utc_blink_ewk_notification_id_get() : id(0) {}
+
   /* Startup function */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
   }
 
   /* Cleanup function */
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
   }
 
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: ");
-    if (!event_info) {
-      FAIL();
+    utc_blink_ewk_notification_id_get *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
     }
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
   }
 
   /* Callback for "notification,show" */
@@ -49,19 +55,16 @@ class utc_blink_ewk_notification_id_get : public utc_blink_ewk_base {
     utc_blink_ewk_notification_id_get* owner = static_cast<utc_blink_ewk_notification_id_get*>(data);
 
     //call ewk_notification API
-    int id = ewk_notification_id_get((Ewk_Notification*)event_info);
-    if (id) {
-      owner->EventLoopStop(Success);
-    } else {
-      owner->EventLoopStop(Failure);
-    }
+    owner->id = ewk_notification_id_get((Ewk_Notification*)event_info);
+    owner->EventLoopStop(Success);
   }
 
 protected:
   static const char* const resource_relative_path;
+  int id;
 };
 
-const char* const utc_blink_ewk_notification_id_get::resource_relative_path = "/common/sample_notification_1.html";
+const char* const utc_blink_ewk_notification_id_get::resource_relative_path = "/common/sample_notification_2.html";
 
 /**
 * @brief Positive test case for ewk_notification_body_get(). Text returned by api is compared against expected text and result is set in notificationShow()
@@ -69,13 +72,9 @@ const char* const utc_blink_ewk_notification_id_get::resource_relative_path = "/
 TEST_F(utc_blink_ewk_notification_id_get, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
-  if (!ewk_view_url_set(GetEwkWebView(), resource_url.c_str())) {
-    FAIL();
-  }
-
-  MainLoopResult loop_result = EventLoopStart();
-
-  utc_check_eq(Success, loop_result);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(id);
 }
 
 /**
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_notification_permission_reply_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_notification_permission_reply_func.cpp
new file mode 100644 (file)
index 0000000..2bb86e4
--- /dev/null
@@ -0,0 +1,117 @@
+// 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 "utc_blink_ewk_base.h"
+
+class utc_blink_ewk_notification_permission_reply : public utc_blink_ewk_base {
+protected:
+  utc_blink_ewk_notification_permission_reply()
+  : utc_blink_ewk_base()
+  , notificationPermissionFirsttime(EINA_FALSE)
+  , notificationPermissionSecondtime(EINA_FALSE)
+  {
+  }
+
+  virtual ~utc_blink_ewk_notification_permission_reply() {
+  }
+
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
+  {
+    utc_blink_ewk_notification_permission_reply* owner = static_cast<utc_blink_ewk_notification_permission_reply*>(data);
+
+    Ewk_Context *context = ewk_view_context_get(webview);
+    if (!request || !context) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
+
+    //allow the notification
+    ewk_notification_permission_reply(request, EINA_TRUE);
+
+    if (!owner->notificationPermissionFirsttime) {
+      owner->notificationPermissionFirsttime = EINA_TRUE;
+    } else {
+      owner->notificationPermissionSecondtime = EINA_TRUE;
+      owner->EventLoopStop(Failure);
+    }
+    return EINA_TRUE;
+  }
+
+  static void cb_console_message(utc_blink_ewk_notification_permission_reply *owner, Evas_Object *obj, void *event_info)
+  {
+    Ewk_Console_Message* console = static_cast<Ewk_Console_Message*>(event_info);
+    const char *cmsg = ewk_console_message_text_get(console);
+    if (!cmsg) {
+      return;
+    }
+    std::string msg(cmsg);
+    std::string::size_type pos = msg.find(':');
+    if (pos == std::string::npos) {
+      return;
+    }
+    if (msg.substr(0, pos) == "event_loop_stop") {
+      owner->EventLoopStop(Success);
+    }
+  }
+
+  // helper function
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
+  }
+
+  /* Startup and cleanup functions */
+  virtual void PostSetUp()
+  {
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
+    evas_object_smart_callback_add(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message), this);
+  }
+
+  virtual void PreTearDown()
+  {
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
+    evas_object_smart_callback_del(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message));
+  }
+
+protected:
+  Eina_Bool notificationPermissionFirsttime;
+  Eina_Bool notificationPermissionSecondtime;
+  static const char* const resource_relative_path;
+};
+
+const char* const utc_blink_ewk_notification_permission_reply::resource_relative_path = "/common/sample_notification_2.html";
+
+/**
+ * @brief Positive test case for ewk_notification_permission_reply function
+ */
+TEST_F(utc_blink_ewk_notification_permission_reply, POS_TEST)
+{
+  std::string resource_url = GetResourceUrl(resource_relative_path);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(EINA_TRUE, notificationPermissionFirsttime);
+  ASSERT_EQ(EINA_FALSE, notificationPermissionSecondtime);
+
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(EINA_TRUE, notificationPermissionFirsttime);
+  ASSERT_EQ(EINA_FALSE, notificationPermissionSecondtime);
+}
+
+/**
+ * @brief Tests whether function works properly in case of NULL value pass.
+ */
+TEST_F(utc_blink_ewk_notification_permission_reply, NEG_TEST)
+{
+  /* TODO: this code should use ewk_notification_cached_permissions_set and check its behaviour.
+  Results should be reported using one of utc_ macros */
+  ewk_notification_permission_reply(NULL,0);
+
+  // If  NULL argument passing wont give segmentation fault negative test case will pass
+  SUCCEED();
+}
index dbd4b62..870f3c1 100755 (executable)
@@ -6,27 +6,17 @@
 
 class utc_blink_ewk_notification_permission_request_origin_get : public utc_blink_ewk_base {
 protected:
-  static void script_execute_callback(Evas_Object* webview, const char* result_value, void* user_data)
-  {
-    utc_message("execution result: %s", result_value);
-  }
-
-  /* Callback for "load,finished" */
-  void LoadFinished(Evas_Object* webview)
-  {
-    utc_message("[loadFinished] :: ");
-    ewk_view_script_execute(webview, "noti();", script_execute_callback, this);
-  }
-
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request *request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: ");
-    ASSERT_TRUE(data != NULL);
     utc_blink_ewk_notification_permission_request_origin_get *owner = static_cast<utc_blink_ewk_notification_permission_request_origin_get *>(data);
+    if (!owner) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
 
     MainLoopResult res = Failure;
-    Ewk_Notification_Permission_Request *request = (Ewk_Notification_Permission_Request*)event_info;
     const Ewk_Security_Origin* origin = ewk_notification_permission_request_origin_get(request);
 
     if (origin) {
@@ -42,20 +32,21 @@ protected:
     }
 
     //allow the notification
-    ewk_notification_permission_request_set(request, EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
     owner->EventLoopStop(res);
+    return EINA_TRUE;
   }
 
   /* Startup and cleanup functions */
   virtual void PostSetUp()
   {
     ewk_view_mouse_events_enabled_set(GetEwkWebView(), EINA_TRUE);
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
   }
 
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
   }
 
 protected:
@@ -65,20 +56,18 @@ protected:
   static const uint16_t expected_origin_port;
 };
 
-const char* const utc_blink_ewk_notification_permission_request_origin_get::resource_file = "common/sample_notification_3.html";
+const char* const utc_blink_ewk_notification_permission_request_origin_get::resource_file = "common/sample_notification_2.html";
 const char* const utc_blink_ewk_notification_permission_request_origin_get::expected_origin_protocol = "";
 const char* const utc_blink_ewk_notification_permission_request_origin_get::expected_origin_host = "";
 const uint16_t utc_blink_ewk_notification_permission_request_origin_get::expected_origin_port = 65535;
 
-
 /**
- * @brief Positive test case for ewk_notification_permission_request_set function
+ * @brief Positive test case for ewk_notification_permission_reply function
  */
 TEST_F(utc_blink_ewk_notification_permission_request_origin_get, POS_TEST)
 {
-  /* TODO: this code should use ewk_notification_permission_request_set and check its behaviour.
+  /* TODO: this code should use ewk_notification_permission_reply and check its behaviour.
   Results should be reported using one of utc_ macros */
-
   ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl(resource_file).c_str()));
   ASSERT_EQ(Success, EventLoopStart());
 }
@@ -90,7 +79,7 @@ TEST_F(utc_blink_ewk_notification_permission_request_origin_get, NEG_TEST)
 {
   /* TODO: this code should use ewk_notification_cached_permissions_set and check its behaviour.
   Results should be reported using one of utc_ macros */
-  ewk_notification_permission_request_set(NULL,0);
+  ewk_notification_permission_reply(NULL,0);
 
   // If  NULL argument passing wont give segmentation fault negative test case will pass
   utc_pass();
index ea5dbab..f75898b 100755 (executable)
@@ -16,22 +16,19 @@ protected:
   virtual ~utc_blink_ewk_notification_permission_request_set() {
   }
 
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
-    if (!data) {
-      FAIL();
-    }
-
     utc_blink_ewk_notification_permission_request_set* owner = static_cast<utc_blink_ewk_notification_permission_request_set*>(data);
 
     Ewk_Context *context = ewk_view_context_get(webview);
-    if (!event_info || !context) {
-      FAIL();
+    if (!request || !context) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
     }
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_request_set(request, EINA_TRUE);
 
     if (!owner->notificationPermissionFirsttime) {
       owner->notificationPermissionFirsttime = EINA_TRUE;
@@ -39,35 +36,46 @@ protected:
       owner->notificationPermissionSecondtime = EINA_TRUE;
       owner->EventLoopStop(Failure);
     }
+    return EINA_TRUE;
   }
 
-  /* Callback for "notification,show" */
-  static void notificationShow(void* data, Evas_Object* webview, void* event_info)
+  static void cb_console_message(utc_blink_ewk_notification_permission_request_set *owner, Evas_Object *obj, void *event_info)
   {
-    if (!event_info) {
-      FAIL();
+    Ewk_Console_Message* console = static_cast<Ewk_Console_Message*>(event_info);
+    const char *cmsg = ewk_console_message_text_get(console);
+    if (!cmsg) {
+      return;
     }
-
-    if (!data) {
-      FAIL();
+    std::string msg(cmsg);
+    std::string::size_type pos = msg.find(':');
+    if (pos == std::string::npos) {
+      return;
     }
+    if (msg.substr(0, pos) == "event_loop_stop") {
+      owner->EventLoopStop(Success);
+    }
+  }
 
-    utc_blink_ewk_notification_permission_request_set* owner = static_cast<utc_blink_ewk_notification_permission_request_set*>(data);
-
-    owner->EventLoopStop(Success);
+  // helper function
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
   }
 
   /* Startup and cleanup functions */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
+    evas_object_smart_callback_add(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message), this);
   }
 
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
+    evas_object_smart_callback_del(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message));
   }
 
 protected:
@@ -84,20 +92,15 @@ const char* const utc_blink_ewk_notification_permission_request_set::resource_re
 TEST_F(utc_blink_ewk_notification_permission_request_set, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
-
-  if (!ewk_view_url_set(GetEwkWebView(), resource_url.c_str())) {
-    FAIL();
-  }
-  /* TODO: this code should use ewk_notification_permission_request_set and check its behaviour.
-  Results should be reported using one of utc_ macros */
-
-  MainLoopResult loop_result = EventLoopStart();
-
-  if (loop_result != Success) {
-    FAIL();
-  }
-
-  EXPECT_EQ(notificationPermissionSecondtime, EINA_FALSE);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(EINA_TRUE, notificationPermissionFirsttime);
+  ASSERT_EQ(EINA_FALSE, notificationPermissionSecondtime);
+
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_EQ(EINA_TRUE, notificationPermissionFirsttime);
+  ASSERT_EQ(EINA_FALSE, notificationPermissionSecondtime);
 }
 
 /**
index 554116d..d40abf7 100755 (executable)
@@ -6,45 +6,63 @@
 
 class utc_blink_ewk_notification_permission_request_suspend : public utc_blink_ewk_base {
 protected:
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  utc_blink_ewk_notification_permission_request_suspend() {}
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     Ewk_Context *context = ewk_view_context_get(webview);
-    if(!event_info || !context) {
-      utc_message("event_info: %p\ncontext: %p", event_info, context);
-      FAIL();
-      return;
+    utc_blink_ewk_notification_permission_request_suspend *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if(!request || !context) {
+      utc_message("event_info: %p\ncontext: %p", request, context);
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
     }
 
     //allow the notification
-    ewk_notification_permission_request_suspend((Ewk_Notification_Permission_Request*)event_info);
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_request_suspend(request);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    owner->EventLoopStop(Success);
+    return EINA_TRUE;
   }
 
-  /* Callback for "notification,show" */
-  static void notificationShow(void* data, Evas_Object* webview, void* event_info)
+  static void cb_console_message(utc_blink_ewk_notification_permission_request_suspend *owner, Evas_Object *obj, void *event_info)
   {
-    if (!data || !event_info) {
-      utc_message("data: %p\nevent_info: %p", data, event_info);
-      FAIL();
+    Ewk_Console_Message* console = static_cast<Ewk_Console_Message*>(event_info);
+    const char *cmsg = ewk_console_message_text_get(console);
+    if (!cmsg) {
+      return;
+    }
+    std::string msg(cmsg);
+    std::string::size_type pos = msg.find(':');
+    if (pos == std::string::npos) {
+      return;
+    }
+    if (msg.substr(0, pos) == "event_loop_stop") {
+      owner->EventLoopStop(Success);
     }
-
-    utc_blink_ewk_notification_permission_request_suspend* owner = static_cast<utc_blink_ewk_notification_permission_request_suspend*>(data);
-    owner->EventLoopStop(Success);
   }
 
   /* Startup function */
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
+  }
+
+  /* Startup and cleanup functions */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
+    evas_object_smart_callback_add(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message), this);
   }
 
-  /* Cleanup function */
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
+    evas_object_smart_callback_del(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message));
   }
 
 protected:
@@ -52,7 +70,7 @@ protected:
   static const char* const notification_title_ref;
 };
 
-const char* const utc_blink_ewk_notification_permission_request_suspend::resource_relative_path = "/common/sample_notification_1.html";
+const char* const utc_blink_ewk_notification_permission_request_suspend::resource_relative_path = "/common/sample_notification_2.html";
 const char* const utc_blink_ewk_notification_permission_request_suspend::notification_title_ref = "Notification Title";
 
 /**
@@ -61,12 +79,11 @@ const char* const utc_blink_ewk_notification_permission_request_suspend::notific
 TEST_F(utc_blink_ewk_notification_permission_request_suspend, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
-  if (!ewk_view_url_set(GetEwkWebView(), resource_url.c_str())) {
-    FAIL();
-  }
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Success, EventLoopStart());
 
-  MainLoopResult result = EventLoopStart();
-  EXPECT_EQ(result, Success);
 }
 
 /**
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_notification_policies_removed_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_notification_policies_removed_func.cpp
new file mode 100644 (file)
index 0000000..24a7902
--- /dev/null
@@ -0,0 +1,127 @@
+// 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 "utc_blink_ewk_base.h"
+
+class utc_blink_ewk_notification_policies_removed : public utc_blink_ewk_base {
+protected:
+  utc_blink_ewk_notification_policies_removed()
+    : permission_requested_(false), proto_(NULL), host_(NULL)
+  {
+  }
+
+  ~utc_blink_ewk_notification_policies_removed()
+  {
+    if (proto_) free(proto_);
+    if (host_) free(host_);
+  }
+
+  void PostSetUp()
+  {
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), cb_permission_request, this);
+    evas_object_smart_callback_add(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message), this);
+    // clear permissions
+    ewk_notification_cached_permissions_set(ewk_view_context_get(GetEwkWebView()), NULL);
+  }
+
+  void PreTearDown()
+  {
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
+    evas_object_smart_callback_del(GetEwkWebView(), "console,message",
+                                   ToSmartCallback(cb_console_message));
+  }
+
+  /* Callback for notification permission request */
+  static Eina_Bool cb_permission_request(Evas_Object *obj, Ewk_Notification_Permission_Request *request, void *data)
+  {
+    utc_message("[cb_permission_request()]");
+    utc_blink_ewk_notification_policies_removed *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
+    const Ewk_Security_Origin* origin = ewk_notification_permission_request_origin_get(request);
+    if (!origin) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
+    owner->proto_ = strdup(ewk_security_origin_protocol_get(origin));
+    utc_message("[cb_permission_request] :: proto_ : %s", owner->proto_);
+    owner->host_ = strdup(ewk_security_origin_host_get(origin));
+    utc_message("[cb_permission_request] :: host_ : %s", owner->host_);
+    owner->permission_requested_ = true;
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
+  }
+
+  static void cb_console_message(utc_blink_ewk_notification_policies_removed *owner, Evas_Object *obj, void *event_info)
+  {
+    Ewk_Console_Message* console = static_cast<Ewk_Console_Message*>(event_info);
+    const char *cmsg = ewk_console_message_text_get(console);
+    if (!cmsg) {
+      return;
+    }
+    std::string msg(cmsg);
+    std::string::size_type pos = msg.find(':');
+    if (pos == std::string::npos) {
+      return;
+    }
+    if (msg.substr(0, pos) == "event_loop_stop") {
+      owner->EventLoopStop(Success);
+    }
+  }
+
+  // helper function
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
+  }
+
+protected:
+  bool permission_requested_;
+  char *proto_;
+  char *host_;
+  static const char * const expected_proto_;
+  static const char * const expected_host_;
+  static const char * const resource_file_;
+};
+
+const char * const utc_blink_ewk_notification_policies_removed::expected_proto_ = "";
+const char * const utc_blink_ewk_notification_policies_removed::expected_host_ = "";
+const char * const utc_blink_ewk_notification_policies_removed::resource_file_ = "common/sample_notification_2.html";
+
+TEST_F(utc_blink_ewk_notification_policies_removed, POS_TEST)
+{
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), GetResourceUrl(resource_file_).c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(permission_requested_);
+  ASSERT_STREQ(expected_proto_, proto_);
+  ASSERT_STREQ(expected_host_, host_);
+
+  permission_requested_ = false;
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_FALSE(permission_requested_);
+
+  Eina_List *list = NULL;
+  Ewk_Security_Origin *origin = ewk_security_origin_new_from_string((std::string(proto_) + "://" + std::string(host_)).c_str());
+  list = eina_list_append(list, origin);
+  ewk_notification_policies_removed(ewk_view_context_get(GetEwkWebView()), list);
+  ewk_security_origin_free(origin);
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(permission_requested_);
+}
+
+TEST_F(utc_blink_ewk_notification_policies_removed, NEG_TEST)
+{
+  ewk_notification_policies_removed(ewk_view_context_get(GetEwkWebView()), NULL);
+  SUCCEED();
+}
index 81b9754..296fc29 100755 (executable)
@@ -7,45 +7,67 @@
 class utc_blink_ewk_notification_security_origin_get_func : public utc_blink_ewk_base
 {
 protected:
+  utc_blink_ewk_notification_security_origin_get_func() {}
 
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* owner, Evas_Object* webview, void* event_info)
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] ::");
-    ASSERT_TRUE(NULL != event_info);
+    utc_blink_ewk_notification_security_origin_get_func *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
 
     //allow the notification
-    ewk_notification_permission_request_set(static_cast<Ewk_Notification_Permission_Request*>(event_info), EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
   }
 
   /* Callback for "notification,show" */
-  static void notificationShow(void* owner, Evas_Object* webview, void* event_info)
+  static void notificationShow(void* data, Evas_Object* webview, void* event_info)
   {
     utc_message("[notificationShow] ::");
     ASSERT_TRUE(event_info != NULL);
-    ASSERT_TRUE(owner != NULL);
+    ASSERT_TRUE(data != NULL);
 
     //call ewk_notification API
     const Ewk_Security_Origin* origin = ewk_notification_security_origin_get(static_cast<Ewk_Notification*>(event_info));
     ASSERT_TRUE(origin != NULL);
+    utc_blink_ewk_notification_security_origin_get_func *owner = NULL;
+    OwnerFromVoid(data, &owner);
 
-    ASSERT_STREQ(ewk_security_origin_protocol_get(origin), "");
-    ASSERT_STREQ(ewk_security_origin_host_get(origin), "");
-    ASSERT_EQ(ewk_security_origin_port_get(origin), 0);
-    static_cast<utc_blink_ewk_notification_security_origin_get_func*>(owner)->EventLoopStop(Success);
+    owner->protocol = ewk_security_origin_protocol_get(origin);
+    owner->host = ewk_security_origin_host_get(origin);
+    owner->port = ewk_security_origin_port_get(origin);
+
+    owner->EventLoopStop(Success);
   }
 
   void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
   }
 
   void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
   }
+
+  // helper function
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
+  }
+
+protected:
+  const char* protocol;
+  const char* host;
+  uint16_t port;
 };
 
 /**
@@ -53,8 +75,14 @@ protected:
 */
 TEST_F(utc_blink_ewk_notification_security_origin_get_func, POS_TEST)
 {
-  ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), GetResourceUrl("common/sample_notification_1.html").c_str()));
-  EXPECT_EQ(Success, EventLoopStart());
+  std::string resource_url = GetResourceUrl("common/sample_notification_2.html");
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(protocol);
+  ASSERT_TRUE(host);
+  ASSERT_STREQ("", protocol);
+  ASSERT_STREQ("", host);
+  ASSERT_EQ(0, port);
 }
 
 /**
index b6b61a7..1ccba81 100755 (executable)
@@ -6,14 +6,21 @@
 
 class utc_blink_ewk_notification_showed : public utc_blink_ewk_base {
  protected:
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  utc_blink_ewk_notification_showed() {}
+
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: \n");
-    if (!event_info)
-        FAIL();
+    utc_blink_ewk_notification_showed *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+        owner->EventLoopStop(Failure);
+        return EINA_FALSE;
+    }
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
   }
 
   /* Callback for "notification,show" */
@@ -35,20 +42,20 @@ class utc_blink_ewk_notification_showed : public utc_blink_ewk_base {
 
     uint64_t notification_id = ewk_notification_id_get((Ewk_Notification*)event_info);
     ewk_notification_showed(context, notification_id);
-    owner->EventLoopStop(Success);;
+    owner->EventLoopStop(Success);
   }
 
   /* Startup function */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
   }
 
   /* Cleanup function */
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
   }
 
@@ -56,7 +63,7 @@ protected:
   static const char* const resource_relative_path;
 };
 
-const char* const utc_blink_ewk_notification_showed::resource_relative_path = "/common/sample_notification_1.html";
+const char* const utc_blink_ewk_notification_showed::resource_relative_path = "/common/sample_notification_2.html";
 
 /**
 * @brief Positive test case for ewk_notification_showed()
@@ -64,14 +71,8 @@ const char* const utc_blink_ewk_notification_showed::resource_relative_path = "/
 TEST_F(utc_blink_ewk_notification_showed, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
-
-  if (!ewk_view_url_set(GetEwkWebView(), resource_url.c_str())) {
-    FAIL();
-  }
-
-  MainLoopResult main_result = EventLoopStart();
-
-  utc_check_eq(Success, main_result);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 }
 
 /**
index f62df2c..12249cf 100755 (executable)
@@ -7,17 +7,22 @@
 
 class utc_blink_ewk_notification_title_get : public utc_blink_ewk_base {
 protected:
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  utc_blink_ewk_notification_title_get() : title(NULL) {}
+
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: ");
-
-    if (!event_info) {
-      FAIL();
+    utc_blink_ewk_notification_title_get *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
     }
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
+    return EINA_TRUE;
   }
 
   /* Callback for "notification,show" */
@@ -36,34 +41,31 @@ protected:
     utc_blink_ewk_notification_title_get* owner = static_cast<utc_blink_ewk_notification_title_get*>(data);
 
     //call ewk_notification API
-    const char* getTitle = ewk_notification_title_get((Ewk_Notification*)event_info);
-    if (strcmp(getTitle, notification_title_ref) == 0) {
-      owner->EventLoopStop(Success);
-    } else {
-      owner->EventLoopStop(Failure);
-    }
+    owner->title = ewk_notification_title_get((Ewk_Notification*)event_info);
+    owner->EventLoopStop(Success);
   }
 
   /* Startup function */
   virtual void PostSetUp()
   {
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
   }
 
   /* Cleanup function */
   virtual void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
   }
 
 protected:
   static const char* const resource_relative_path;
   static const char* const notification_title_ref;
+  const char* title;
 };
 
-const char* const utc_blink_ewk_notification_title_get::resource_relative_path = "/common/sample_notification_1.html";
+const char* const utc_blink_ewk_notification_title_get::resource_relative_path = "/common/sample_notification_2.html";
 const char* const utc_blink_ewk_notification_title_get::notification_title_ref = "Notification Title";
 
 /**
@@ -73,13 +75,10 @@ TEST_F(utc_blink_ewk_notification_title_get, POS_TEST)
 {
   std::string resource_url = GetResourceUrl(resource_relative_path);
 
-  if (!ewk_view_url_set(GetEwkWebView(), resource_url.c_str())) {
-    FAIL();
-  }
-
-  MainLoopResult loop_result = EventLoopStart();
-
-  utc_check_eq(Success, loop_result);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(title);
+  ASSERT_STREQ(notification_title_ref, title);
 }
 
 /**
index 322b132..d858905 100755 (executable)
@@ -29,7 +29,7 @@ protected:
       utc_fail();
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
   }
 
    /* Callback for "notification,show" */
index 99dbdb1..b34a036 100755 (executable)
@@ -29,7 +29,7 @@ protected:
       utc_fail();
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
   }
 
    /* Callback for "notification,show" */
index ad8e2ae..74c376e 100755 (executable)
@@ -29,7 +29,7 @@ protected:
       utc_fail();
 
     //allow the notification
-    ewk_notification_permission_request_set((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
+    ewk_notification_permission_reply((Ewk_Notification_Permission_Request*)event_info, EINA_TRUE);
   }
 
    /* Callback for "notification,show" */
index a707bde..8254726 100755 (executable)
@@ -7,14 +7,25 @@
 class utc_blink_ewk_view_notification_closed : public utc_blink_ewk_base
 {
  protected:
-  /* Callback for "notification,permission,request" */
-  static void notificationPermissionRequest(void* data, Evas_Object* webview, void* event_info)
+  utc_blink_ewk_view_notification_closed()
+    : closed(false)
+    , old_notification(NULL)
+  {}
+
+  /* Callback for notification permission request */
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
   {
     utc_message("[notificationPermissionRequest] :: \n");
-    if (!event_info)
-        utc_fail();
+    assert(data != NULL);
+    utc_blink_ewk_view_notification_closed* owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (!request) {
+      owner->EventLoopStop(Failure);
+      return EINA_FALSE;
+    }
+
     //allow the notification
-    ewk_notification_permission_request_set(static_cast<Ewk_Notification_Permission_Request*>(event_info), EINA_TRUE);
+    ewk_notification_permission_reply(request, EINA_TRUE);
   }
 
   /* Callback for "notification,show" */
@@ -35,43 +46,57 @@ class utc_blink_ewk_view_notification_closed : public utc_blink_ewk_base
     owner->EventLoopStop(Success);
   }
 
+  static void titleChanged(void* data, Evas_Object* webview, void* event_info)
+  {
+    const char* title = static_cast<const char*>(event_info);
+    utc_message("[titleChanged] :: title = %s", title);
+    utc_blink_ewk_view_notification_closed* owner = NULL;
+    OwnerFromVoid(data, &owner);
+    if (title && strcmp(title, "notification_closed") == 0) {
+      owner->closed = true;
+      owner->EventLoopStop(Success);
+    }
+  }
+
   /* Startup function */
   void PostSetUp()
   {
     old_notification=0;
-    evas_object_smart_callback_add(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest, this);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
     evas_object_smart_callback_add(GetEwkWebView(), "notification,show", notificationShow, this);
+    evas_object_smart_callback_add(GetEwkWebView(), "title,changed", titleChanged, this);
   }
 
   /* Cleanup function */
   void PreTearDown()
   {
-    evas_object_smart_callback_del(GetEwkWebView(), "notification,permission,request", notificationPermissionRequest);
+    ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, NULL);
     evas_object_smart_callback_del(GetEwkWebView(), "notification,show", notificationShow);
+    evas_object_smart_callback_del(GetEwkWebView(), "title,changed", titleChanged);
   }
 
 protected:
-  static const char*const sample;
+  static const char* const sample;
+  bool closed;
   Ewk_Notification* old_notification;
 };
 
-const char*const utc_blink_ewk_view_notification_closed::sample="common/sample_notification_1.html";
+const char*const utc_blink_ewk_view_notification_closed::sample="common/sample_notification_2.html";
 
 /**
 * @brief Positive test case for ewk_notification_showed()
 */
 TEST_F(utc_blink_ewk_view_notification_closed, POS_TEST)
 {
-  if(!ewk_view_url_set(GetEwkWebView(), GetResourceUrl(sample).c_str()))
-    utc_fail();
-
-  if(!EventLoopStart())
-     utc_fail();
+  std::string resource_url = GetResourceUrl(sample);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
 
   Eina_List *list = NULL;
   list =  eina_list_append(list, old_notification);
-  ewk_view_notification_closed(GetEwkWebView(), list);
-  utc_pass();
+  ASSERT_EQ(EINA_TRUE, ewk_view_notification_closed(GetEwkWebView(), list));
+  ASSERT_EQ(Success, EventLoopStart());
+  ASSERT_TRUE(closed);
 }
 
 /**
diff --git a/tizen_src/ewk/unittest/utc_blink_ewk_view_notification_permission_callback_set_func.cpp b/tizen_src/ewk/unittest/utc_blink_ewk_view_notification_permission_callback_set_func.cpp
new file mode 100644 (file)
index 0000000..aaad4b2
--- /dev/null
@@ -0,0 +1,70 @@
+// 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 "utc_blink_ewk_base.h"
+
+class utc_blink_ewk_view_notification_permission_callback_set : public utc_blink_ewk_base
+{
+ protected:
+  utc_blink_ewk_view_notification_permission_callback_set() : called(false) {}
+
+  void LoadFinished(Evas_Object *o)
+  {
+    EventLoopStop(Success);
+  }
+
+  static Eina_Bool notificationPermissionRequest(Evas_Object* webview, Ewk_Notification_Permission_Request* request, void* data)
+  {
+    utc_blink_ewk_view_notification_permission_callback_set *owner = NULL;
+    OwnerFromVoid(data, &owner);
+    owner->called = true;
+    owner->EventLoopStop(Success);
+    return EINA_TRUE;
+  }
+
+  // helper function
+  bool click()
+  {
+    utc_message("[click] :: ");
+    return ewk_view_script_execute(GetEwkWebView(), "document.getElementById(\"startButton\").click();", NULL, NULL) == EINA_TRUE;
+  }
+
+ protected:
+  bool called;
+  static const char* const sample;
+};
+
+const char* const utc_blink_ewk_view_notification_permission_callback_set::sample = "common/sample_notification_2.html";
+
+TEST_F(utc_blink_ewk_view_notification_permission_callback_set, POS_TEST)
+{
+  std::string resource_url = GetResourceUrl(sample);
+  ASSERT_EQ(EINA_TRUE, ewk_view_url_set(GetEwkWebView(), resource_url.c_str()));
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Timeout, EventLoopStart(5.0));
+
+  ASSERT_FALSE(called);
+
+  ewk_view_notification_permission_callback_set(GetEwkWebView(), notificationPermissionRequest, this);
+
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Success, EventLoopStart());
+
+  ASSERT_TRUE(called);
+  called = false;
+
+  ewk_view_notification_permission_callback_set(GetEwkWebView(), NULL, this);
+
+  ASSERT_TRUE(click());
+  ASSERT_EQ(Timeout, EventLoopStart(5.0));
+
+  ASSERT_FALSE(called);
+}
+
+TEST_F(utc_blink_ewk_view_notification_permission_callback_set, NEG_TEST)
+{
+  ewk_view_notification_permission_callback_set(NULL, NULL, NULL);
+}
diff --git a/tizen_src/impl/API/ewk_notification_private.cc b/tizen_src/impl/API/ewk_notification_private.cc
deleted file mode 100644 (file)
index 79b1d0c..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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_notification_private.h"
-#include "tizen_webview/public/tw_url.h"
-#include "tizen_webview/public/tw_security_origin.h"
-
-// _Ewk_Notification ----------------------------------------------------------
-_Ewk_Notification::_Ewk_Notification(
-    const std::string& body,
-    const std::string& iconURL,
-    const std::string& replaceID,
-    const std::string& title,
-    uint64_t notificationID,
-    const tizen_webview::URL& origin)
-    : body_(body),
-      iconURL_(iconURL),
-      replaceID_(replaceID),
-      title_(title),
-#if 0
-      notificationID_(notificationID),
-#else
-#warning "[M37] params.notification_id does not exist"
-      notificationID_(0),
-#endif
-      securityOrigin_(new tizen_webview::Security_Origin(origin.getHost(),
-                                                         origin.getProtocol(),
-                                                         origin.getPort())) {
-}
-
-_Ewk_Notification::~_Ewk_Notification() {
-  delete securityOrigin_;
-}
-
-// _Ewk_Notification_Permission_Request ---------------------------------------
-_Ewk_Notification_Permission_Request::_Ewk_Notification_Permission_Request(
-    Evas_Object* webview, int callback_context,
-    const tizen_webview::URL& source_origin)
-  : webview_(webview),
-    origin_(new tizen_webview::Security_Origin(source_origin)),
-    decided_(false),
-    suspended_(false),
-    callback_context_(callback_context) {
-}
-
-_Ewk_Notification_Permission_Request::~_Ewk_Notification_Permission_Request() {
-  delete origin_;
-}
diff --git a/tizen_src/impl/API/ewk_notification_private.h b/tizen_src/impl/API/ewk_notification_private.h
deleted file mode 100644 (file)
index a1b155c..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2014 The Chromium Authors. All rights reserved.
-// Copyright 2013 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 TIZEN_WEBVIEW_PRIVATE_TW_NOTIFICATION_IMPL_H_
-#define TIZEN_WEBVIEW_PRIVATE_TW_NOTIFICATION_IMPL_H_
-
-#include <Eina.h>
-#include <Evas.h>
-
-#include "base/strings/utf_string_conversions.h"
-#include "content/public/common/show_desktop_notification_params.h"
-
-#include "eweb_view.h"
-#include "eweb_context.h"
-
-namespace tizen_webview {
-class Security_Origin;
-class URL;
-}
-
-struct _Ewk_Notification {
-  std::string body_;
-  std::string iconURL_;
-  std::string replaceID_;
-  std::string title_;
-  uint64_t notificationID_;
-  tizen_webview::Security_Origin* securityOrigin_;
-
-  _Ewk_Notification(const std::string& body,
-                    const std::string& iconURL,
-                    const std::string& replaceID,
-                    const std::string& title,
-                    uint64_t notificationID,
-                    const tizen_webview::URL& securityOrigin);
-  ~_Ewk_Notification();
-};
-
-struct _Ewk_Notification_Permission_Request {
-  Evas_Object* webview_;
-  tizen_webview::Security_Origin* origin_;
-  bool decided_;
-  bool suspended_;
-  int callback_context_; // required by content API
-
-  _Ewk_Notification_Permission_Request(Evas_Object* webview,
-      int callback_context, const tizen_webview::URL& source_origin);
-  ~_Ewk_Notification_Permission_Request();
-};
-
-#endif // TIZEN_WEBVIEW_PRIVATE_TW_NOTIFICATION_IMPL_H_
index 1876c4d..8b110e9 100644 (file)
@@ -4,14 +4,14 @@
 
 #include "browser/notification/notification_controller_efl.h"
 
-#include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/public/browser/web_contents.h"
+#include <Eina.h>
 
-#include "API/ewk_notification_private.h"
 #include "eweb_view.h"
-
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/public/browser/web_contents.h"
 #include "tizen_webview/public/tw_notification.h"
 #include "tizen_webview/public/tw_security_origin.h"
+#include "tizen_webview/tw_misc_utility.h"
 
 using tizen_webview::NotificationPermissionRequest;
 using tizen_webview::Security_Origin;
@@ -62,14 +62,59 @@ void NotificationControllerEfl::SetPermissionForNotification(
   RenderViewHost* render_view_host =
       wv->web_contents().GetRenderViewHost();
 
-#warning "[M38] need proper impl. for desktop notification"
-//  if (render_view_host) {
-//    render_view_host->DesktopNotificationPermissionRequestDone(
-//                          notification->GetInternalCallbackContext());
-//    if (isAllowed)
-//      render_view_host->DesktopNotificationPostDisplay(
-//                            notification->GetInternalCallbackContext());
-//  }
+  if (render_view_host) {
+    GURL origin = tizen_webview::GetGURL(
+        notification->GetSecurityOrigin()->GetURL());
+    // save decision in permissions map
+    permissions_mutex_.Acquire();
+    permissions_map_[origin] = isAllowed;
+    permissions_mutex_.Release();
+  }
+}
+
+void NotificationControllerEfl::SetPermissions(
+    const std::map<const char*, Eina_Bool>& permissions) {
+  base::AutoLock locker(permissions_mutex_);
+  permissions_map_.clear();
+  std::map<const char*, Eina_Bool>::const_iterator it = permissions.begin();
+  for (; it != permissions.end(); ++it) {
+    permissions_map_[GURL(it->first)] = (it->second == EINA_TRUE);
+  }
+}
+
+void NotificationControllerEfl::AddPermission(const GURL origin,
+                                              bool allowed) {
+  base::AutoLock locker(permissions_mutex_);
+  permissions_map_[origin] = allowed;
+}
+
+blink::WebNotificationPermission
+NotificationControllerEfl::CheckPermissionForOrigin(
+    const GURL &origin) const {
+  base::AutoLock locker(permissions_mutex_);
+  std::map<GURL, bool>::const_iterator it = permissions_map_.find(origin);
+  if (it == permissions_map_.end())
+    return blink::WebNotificationPermissionDefault;
+  return it->second ?
+      blink::WebNotificationPermissionAllowed :
+      blink::WebNotificationPermissionDenied;
+}
+
+void NotificationControllerEfl::ClearPermissions() {
+  base::AutoLock locker(permissions_mutex_);
+  permissions_map_.clear();
+}
+
+void NotificationControllerEfl::RemovePermissions(Eina_List* origins) {
+  Eina_List* list = NULL;
+  void* data = NULL;
+  base::AutoLock locker(permissions_mutex_);
+  EINA_LIST_FOREACH(origins, list, data) {
+    tizen_webview::Security_Origin* o =
+        static_cast<tizen_webview::Security_Origin*>(data);
+    GURL origin = tizen_webview::GetGURL(o->GetURL());
+    permissions_map_.erase(origin);
+  }
 }
 
 bool NotificationControllerEfl::IsNotificationPresent(const base::string16& replaceid, uint64_t& notification_id) {
@@ -84,4 +129,54 @@ bool NotificationControllerEfl::IsNotificationPresent(const base::string16& repl
   return false;
 }
 
+void NotificationControllerEfl::RequestPermission(
+    WebContents* web_contents,
+    const GURL& requesting_frame,
+    const base::Callback<void(bool)>& result_callback) {
+  const bool kDefaultResponse = false;
+
+  WebContentsDelegate* delegate = web_contents->GetDelegate();
+  if (!delegate) {
+    LOG(ERROR) << "Dropping PermissionNotification request caused by lack "
+                  "of the WebContents delegate";
+    result_callback.Run(kDefaultResponse);
+    return;
+  }
+
+  WebContentsDelegateEfl* delegat_efl =
+      static_cast<WebContentsDelegateEfl*>(delegate);
+  EWebView* web_view = delegat_efl->web_view();
+  if (!web_view) {
+    LOG(ERROR) << "Dropping PermissionNotification request caused by lack "
+                  "of the WebView";
+    result_callback.Run(kDefaultResponse);
+    return;
+  }
+  scoped_ptr<NotificationPermissionRequest> notification_permission(
+      new NotificationPermissionRequest(web_view->evas_object(),
+          result_callback,    tizen_webview::GetURL(requesting_frame)));
+
+  if (!web_view->IsNotificationPermissionCallbackSet()) {
+    LOG(ERROR) << "Dropping PermissionNotification request caused by lack "
+                  "of the Notification Permission Callback";
+    result_callback.Run(kDefaultResponse);
+    return;
+  }
+
+  blink::WebNotificationPermission web_notification_permission =
+      CheckPermissionForOrigin(requesting_frame);
+  if (web_notification_permission ==
+      blink::WebNotificationPermissionDefault) {
+    web_view->InvokeNotificationPermissionCallback(
+        notification_permission.get());
+    if (notification_permission->IsSuspended()) {
+      notification_permission.release();
+      return;
+    }
+  } else {
+    result_callback.Run(web_notification_permission ==
+        blink::WebNotificationPermissionAllowed);
+  }
+}
+
 }//namespace
index 4049394..5aba8de 100644 (file)
@@ -5,10 +5,19 @@
 #ifndef NOTIFICATION_CONTROLLER_EFL_H
 #define NOTIFICATION_CONTROLLER_EFL_H
 
+#include <map>
+
 #include <Eina.h>
 #include <Evas.h>
-#include "base/strings/utf_string_conversions.h"
+
+#include "base/callback.h"
 #include "base/id_map.h"
+#include "base/memory/ref_counted.h"
+#include "base/strings/utf_string_conversions.h"
+#include "third_party/WebKit/public/platform/WebNotificationPermission.h"
+#include "tizen_webview/public/tw_url.h"
+#include "url/gurl.h"
+
 
 namespace tizen_webview {
 class NotificationPermissionRequest;
@@ -16,6 +25,8 @@ class NotificationPermissionRequest;
 
 namespace content {
 
+class WebContents;
+
 struct NotificationData {
   int render_process_id;
   int render_view_id;
@@ -32,7 +43,8 @@ struct NotificationData {
   }
 };
 
-class NotificationControllerEfl {
+class NotificationControllerEfl :
+    public base::RefCountedThreadSafe<NotificationControllerEfl> {
  public:
   NotificationControllerEfl();
   ~NotificationControllerEfl();
@@ -51,12 +63,35 @@ class NotificationControllerEfl {
       tizen_webview::NotificationPermissionRequest* notification,
       bool isAllowed);
 
+  // Sets the permissions for given origins
+  void SetPermissions(const std::map<const char*, Eina_Bool> &permissions);
+
+  // Adds permission to map
+  void AddPermission(const GURL origin, bool allowed);
+
+  // Checks stored permission for given origin
+  blink::WebNotificationPermission CheckPermissionForOrigin(
+      const GURL& origin) const;
+
+  // Removes all stored permissions
+  void ClearPermissions();
+
+  // Removes stored permissions for given origins
+  void RemovePermissions(Eina_List* origins);
+
   // Checks if the notification is already present.
   // If present returns the notification id of the notification else false
   bool IsNotificationPresent(const base::string16& replaceid, uint64_t& notification_id);
 
+
+  void RequestPermission(WebContents* web_contents,
+                         const GURL& requesting_frame,
+                         const base::Callback<void(bool)>& result_callback);
+
  private:
   IDMap<NotificationData, IDMapOwnPointer> notification_map; // This stores the notifications displayed to the user
+  std::map<GURL, bool> permissions_map_;
+  mutable base::Lock permissions_mutex_;
 
   DISALLOW_COPY_AND_ASSIGN(NotificationControllerEfl);
 };
index eb0034f..ff357e6 100644 (file)
@@ -12,6 +12,7 @@
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_source.h"
 #include "content/public/browser/notification_types.h"
+#include "content/public/browser/web_contents.h"
 #include "tizen_webview/public/tw_error.h"
 
 using content::BrowserThread;
index 66b575a..5a0150d 100644 (file)
@@ -89,11 +89,23 @@ BrowserContextEfl::ResourceContextEfl::GetCookieManager() const {
   return getter_->cookieManager();
 }
 
+#if defined(ENABLE_NOTIFICATIONS)
+scoped_refptr<NotificationControllerEfl>
+    BrowserContextEfl::ResourceContextEfl::GetNotificationController() const {
+  return notification_controller_efl_;
+}
+
+void BrowserContextEfl::ResourceContextEfl::set_notification_controller_efl(
+    const scoped_refptr<NotificationControllerEfl>& controller) {
+  notification_controller_efl_ = controller;
+}
+#endif
+
 BrowserContextEfl::BrowserContextEfl(EWebContext* web_context, bool incognito)
   : resource_context_(NULL),
     web_context_(web_context),
 #if defined(ENABLE_NOTIFICATIONS)
-    notification_controllerefl_(new NotificationControllerEfl()),
+    notification_controller_efl_(new NotificationControllerEfl()),
 #endif
     temp_dir_creation_attempted_(false),
     incognito_(incognito) {
@@ -105,8 +117,13 @@ net::URLRequestContextGetter* BrowserContextEfl::GetRequestContext() {
 }
 
 ResourceContext* BrowserContextEfl::GetResourceContext() {
-  if (!resource_context_)
+  if (!resource_context_) {
     resource_context_ = new ResourceContextEfl();
+#if defined(ENABLE_NOTIFICATIONS)
+    resource_context_->set_notification_controller_efl(
+        notification_controller_efl_);
+#endif
+  }
 
   return resource_context_;
 }
@@ -135,14 +152,12 @@ base::FilePath BrowserContextEfl::GetPath() const {
   return path;
 }
 
-content::NotificationControllerEfl*
-BrowserContextEfl::GetNotificationController() const {
 #if defined(ENABLE_NOTIFICATIONS)
-  return notification_controllerefl_.get();
-#else
-  return NULL;
-#endif
+scoped_refptr<content::NotificationControllerEfl>
+    BrowserContextEfl::GetNotificationController() const {
+  return notification_controller_efl_;
 }
+#endif
 
 net::URLRequestContextGetter* BrowserContextEfl::CreateRequestContext(
     content::ProtocolHandlerMap* protocol_handlers,
index 390adfa..318c6dc 100644 (file)
@@ -57,10 +57,19 @@ class BrowserContextEfl
 
     base::WeakPtr<CookieManager> GetCookieManager() const;
 
+#if defined(ENABLE_NOTIFICATIONS)
+    scoped_refptr<NotificationControllerEfl> GetNotificationController() const;
+    void set_notification_controller_efl(
+        const scoped_refptr<NotificationControllerEfl> &controller);
+#endif
+
    private:
     scoped_refptr<URLRequestContextGetterEfl> getter_;
     HTTPCustomHeadersEflMap http_custom_headers_;
     mutable base::Lock http_custom_headers_lock_;
+#if defined(ENABLE_NOTIFICATIONS)
+    scoped_refptr<NotificationControllerEfl> notification_controller_efl_;
+#endif
 
     DISALLOW_COPY_AND_ASSIGN(ResourceContextEfl);
   };
@@ -117,7 +126,10 @@ class BrowserContextEfl
   EWebContext* WebContext() const
   { return web_context_; }
 
-  content::NotificationControllerEfl* GetNotificationController() const;
+#if defined(ENABLE_NOTIFICATIONS)
+  scoped_refptr<content::NotificationControllerEfl>
+      GetNotificationController() const;
+#endif
 
  private:
   static void ReadCertificateAndAdd(base::FilePath* file_path);
@@ -129,7 +141,7 @@ class BrowserContextEfl
   scoped_refptr<URLRequestContextGetterEfl> request_context_getter_;
   EWebContext* web_context_;
 #if defined(ENABLE_NOTIFICATIONS)
-  scoped_ptr<NotificationControllerEfl> notification_controllerefl_;
+  scoped_refptr<NotificationControllerEfl> notification_controller_efl_;
 #endif
   DownloadManagerDelegateEfl download_manager_delegate_;
   base::ScopedTempDir temp_dir_;
index 4b0710b..541b67f 100644 (file)
       'API/ewk_geolocation_private.h',
       'API/ewk_hit_test_private.cc',
       'API/ewk_hit_test_private.h',
-      'API/ewk_notification_private.cc',
-      'API/ewk_notification_private.h',
       'API/ewk_policy_decision_private.cc',
       'API/ewk_policy_decision_private.h',
       'API/ewk_security_origin_private.h',
index e05cfa6..c44f963 100755 (executable)
@@ -44,9 +44,6 @@ using tizen_webview::NotificationPermissionRequest;
 using tizen_webview::URL;
 using tizen_webview::Security_Origin;
 
-#warning "[M38] tempoary disable notification. remove below line"
-#undef ENABLE_NOTIFICATIONS
-
 namespace content {
 
 ContentBrowserClientEfl::ContentBrowserClientEfl()
@@ -111,6 +108,21 @@ void ContentBrowserClientEfl::AllowCertificateError(
          resource_type, overridable, strict_enforcement, callback, result);
 }
 
+blink::WebNotificationPermission
+    ContentBrowserClientEfl::CheckDesktopNotificationPermission(
+        const GURL& source_url,
+        ResourceContext* context,
+        int) {
+  BrowserContextEfl::ResourceContextEfl* context_efl =
+      static_cast<BrowserContextEfl::ResourceContextEfl*>(context);
+#if defined(ENABLE_NOTIFICATIONS)
+  return context_efl->GetNotificationController()->CheckPermissionForOrigin(
+      source_url.GetOrigin());
+#else
+  return blink::WebNotificationPermissionDefault;
+#endif
+}
+
 void ContentBrowserClientEfl::ShowDesktopNotification(
       const content::ShowDesktopNotificationHostMsgParams& params,
       BrowserContext* browser_context,
@@ -258,17 +270,18 @@ void ContentBrowserClientEfl::RequestPermission(
     const GURL& requesting_frame,
     bool user_gesture,
     const base::Callback<void(bool)>& result_callback) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
   int render_process_id = web_contents->GetRenderProcessHost()->GetID();
   int render_view_id = web_contents->GetRenderViewHost()->GetRoutingID();
 
-  GURL origin = requesting_frame.GetOrigin();
   BrowserContextEfl* browser_context =
       static_cast<BrowserContextEfl*>(web_contents->GetBrowserContext());
   const GeolocationPermissionContextEfl& geolocation_permission_context =
       browser_context->GetGeolocationPermissionContext();
 
   switch (permission) {
-    case content::PERMISSION_GEOLOCATION:
+    case content::PERMISSION_GEOLOCATION: {
       if (!browser_context) {
         LOG(ERROR) << "Dropping GeolocationPermission request";
         result_callback.Run(false);
@@ -280,15 +293,35 @@ void ContentBrowserClientEfl::RequestPermission(
                                                        requesting_frame,
                                                        result_callback);
       break;
+    }
+    case content::PERMISSION_NOTIFICATIONS:
+#if defined(ENABLE_NOTIFICATIONS)
+    {
+      scoped_refptr<content::NotificationControllerEfl> notification_controller
+          = browser_context->GetNotificationController();
+      DCHECK(notification_controller.get());
+      notification_controller->RequestPermission(web_contents,
+                                                 requesting_frame,
+                                                 result_callback);
+      break;
+    }
+#endif
     case content::PERMISSION_PROTECTED_MEDIA:
     case content::PERMISSION_MIDI_SYSEX:
-    case content::PERMISSION_NOTIFICATIONS:
-    case content::PERMISSION_PUSH_MESSAGING:
+    case content::PERMISSION_PUSH_MESSAGING: {
       NOTIMPLEMENTED() << "RequestPermission not implemented for "
                        << permission;
+      ContentBrowserClient::RequestPermission(permission,
+                                              web_contents,
+                                              bridge_id,
+                                              requesting_frame,
+                                              user_gesture,
+                                              result_callback);
       break;
-    default:
+    }
+    default: {
       NOTREACHED() << "Invalid RequestPermission for " << permission;
+    }
   }
 }
 
index c2299cd..ac229ba 100644 (file)
@@ -57,6 +57,12 @@ class ContentBrowserClientEfl: public ContentBrowserClient {
                                      const base::Callback<void(bool)>& callback,
                                      CertificateRequestResultType* result) override;
 
+  blink::WebNotificationPermission
+      CheckDesktopNotificationPermission(
+          const GURL& source_url,
+          ResourceContext* context,
+          int render_process_id) override;
+
   // Show a desktop notification.  If |worker| is true, the request came from an
   // HTML5 web worker, otherwise, it came from a renderer.
   virtual void ShowDesktopNotification(
index 49f4f79..c1f393f 100644 (file)
@@ -1586,6 +1586,28 @@ void EWebView::InvokeWebAppIconUrlsGetCallback(const StringMap &iconUrls, int ca
   callback->Run(iconUrls);
 }
 
+void EWebView::SetNotificationPermissionCallback(
+    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));
+}
+
+bool EWebView::IsNotificationPermissionCallbackSet() const {
+  return notification_permission_callback_;
+}
+
+bool EWebView::InvokeNotificationPermissionCallback(
+    NotificationPermissionRequest *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_)
index 53732cf..250e77b 100644 (file)
@@ -201,6 +201,26 @@ class WebApplicationCapableGetCallback {
 };
 
 class AsyncHitTestRequest;
+class NotificationPermissionCallback {
+ public:
+  NotificationPermissionCallback(
+      Evas_Object* obj,
+      tizen_webview::View_Notification_Permission_Callback func,
+      void* user_data)
+      : obj_(obj), func_(func), user_data_(user_data) {}
+  bool Run(tizen_webview::NotificationPermissionRequest* request) {
+    if (func_) {
+      return (func_)(obj_, request, user_data_) == EINA_TRUE;
+    }
+    return false;
+  }
+
+private:
+  Evas_Object* obj_;
+  tizen_webview::View_Notification_Permission_Callback func_;
+  void* user_data_;
+};
+
 class JavaScriptDialogManagerEfl;
 class WebViewGeolocationPermissionCallback;
 
@@ -372,6 +392,9 @@ class EWebView {
   void InvokeWebAppCapableGetCallback(bool capable, int callbackId);
   void InvokeWebAppIconUrlGetCallback(const std::string &iconUrl, int callbackId);
   void InvokeWebAppIconUrlsGetCallback(const std::map<std::string, std::string> &iconUrls, int callbackId);
+  void SetNotificationPermissionCallback(tizen_webview::View_Notification_Permission_Callback callback, void* user_data);
+  bool IsNotificationPermissionCallbackSet() const;
+  bool InvokeNotificationPermissionCallback(tizen_webview::NotificationPermissionRequest* request);
 
   bool GetMHTMLData(tizen_webview::View_MHTML_Data_Get_Callback callback, void* user_data);
   void OnMHTMLContentGet(const std::string& mhtml_content, int callback_id);
@@ -526,6 +549,7 @@ class EWebView {
   IDMap<WebApplicationIconUrlsGetCallback, IDMapOwnPointer> web_app_icon_urls_get_callback_map_;
   IDMap<WebApplicationCapableGetCallback, IDMapOwnPointer> web_app_capable_get_callback_map_;
   IDMap< WebAppScreenshotCapturedCallback, IDMapOwnPointer> screen_capture_cb_map_;
+  scoped_ptr<NotificationPermissionCallback> notification_permission_callback_;
   content::DevToolsDelegateEfl* inspector_server_;
 #ifdef TIZEN_EDGE_EFFECT
   scoped_refptr<EdgeEffect> edge_effect_;
index 7b73b31..18ff813 100644 (file)
@@ -102,7 +102,6 @@ enum CallbackType {
   AuthChallenge,
   NotificationShow,
   NotificationCancel,
-  NotificationPermissionRequest,
   PolicyResponseDecide,
   ContextMenuCustomize,
   ContextMenuItemSelected,
@@ -261,7 +260,6 @@ DECLARE_EWK_VIEW_CALLBACK(RequestCertificateConfirm, "request,certificate,confir
 DECLARE_EWK_VIEW_CALLBACK(AuthChallenge, "authentication,challenge", _Ewk_Auth_Challenge*);
 DECLARE_EWK_VIEW_CALLBACK(NotificationShow, "notification,show", tizen_webview::Notification*);
 DECLARE_EWK_VIEW_CALLBACK(NotificationCancel, "notification,cancel", uint64_t*);
-DECLARE_EWK_VIEW_CALLBACK(NotificationPermissionRequest, "notification,permission,request", tizen_webview::NotificationPermissionRequest*);
 DECLARE_EWK_VIEW_CALLBACK(PolicyResponseDecide, "policy,response,decide", tizen_webview::PolicyDecision*);
 DECLARE_EWK_VIEW_CALLBACK(ContextMenuCustomize, "contextmenu,customize", _Ewk_Context_Menu*);
 DECLARE_EWK_VIEW_CALLBACK(ContextMenuItemSelected, "contextmenu,selected", _Ewk_Context_Menu_Item*);
index a82ecbc..85c7ce4 100644 (file)
@@ -11,6 +11,7 @@
 namespace tizen_webview {
 class Hit_Test;
 class Security_Origin;
+class NotificationPermissionRequest;
 
 // from ewk_context.h
 typedef void (*Local_File_System_Origins_Get_Callback)(Eina_List *origins, void *user_data);
@@ -56,6 +57,15 @@ typedef void (*Web_App_Screenshot_Captured_Callback)(Evas_Object* image, void* u
 typedef void (*Web_App_Icon_URLs_Get_Callback)(Eina_List *icon_urls, void *user_data);
 
 /**
+ * Callback for ewk_view_notification_permission_callback_set
+ *
+ * @param o view object to request the notification permission
+ * @param request Ewk_Notification_Permission_Request object to get the information about notification permission request.
+ * @param user_data user data
+ */
+typedef Eina_Bool (*View_Notification_Permission_Callback)(Evas_Object *o, NotificationPermissionRequest *request, void *user_data);
+
+/**
  * Callback for ewk_view_script_execute
  *
  * @param o the view object
index 1f07e11..f7f391a 100644 (file)
@@ -5,7 +5,12 @@
 
 #include "tw_notification.h"
 
-#include "API/ewk_notification_private.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/web_contents.h"
+#include "eweb_view.h"
+#include "tw_web_context.h"
+
+using content::BrowserThread;
 
 namespace tizen_webview {
 
@@ -17,71 +22,98 @@ Notification::Notification(
     const std::string& title,
     uint64_t notificationID,
     const tizen_webview::URL& origin)
-    : impl(new Impl(body, iconURL, replaceID, title, notificationID, origin)) {
+    : body_(body)
+    , iconURL_(iconURL)
+    , replaceID_(replaceID)
+    , title_(title)
+    , notificationID_(notificationID)
+    , origin_(new Security_Origin(origin)) {
 }
 
 Notification::~Notification() {
-  delete impl;
 }
 
 const char* Notification::GetBody() const {
-  return impl->body_.c_str();
+  return body_.c_str();
 }
 
 const char* Notification::GetIconUrl() const {
-  return impl->iconURL_.c_str();
+  return iconURL_.c_str();
 }
 
 const char* Notification::GetReplaceId() const {
-  return impl->replaceID_.c_str();
+  return replaceID_.c_str();
 }
 
 const char* Notification::GetTitle() const {
-  return impl->title_.c_str();
+  return title_.c_str();
 }
 
 int Notification::GetID() const {
-  return impl->notificationID_;
+  return notificationID_;
 }
 
 const Security_Origin* Notification::GetSecurityOrigin() const {
-  return impl->securityOrigin_;
+  return origin_.get();
 }
 
 // tizen_webview::NotificationPermissionRequest -------------------------------
 
 NotificationPermissionRequest::NotificationPermissionRequest(
-    Evas_Object* webview, int callback_context, const URL& source_origin)
-    : impl(new _Ewk_Notification_Permission_Request(
-          webview, callback_context,source_origin)) {
+    Evas_Object* webview,
+    const base::Callback<void(bool)>& callback,
+    const URL& source_origin)
+    : webview_(webview)
+    , origin_(new Security_Origin(source_origin))
+    , callback_(callback)
+    , decided_(false)
+    , suspended_(false)
+{
 }
 
 NotificationPermissionRequest::~NotificationPermissionRequest() {
-  delete impl;
 }
 
 Evas_Object* NotificationPermissionRequest::GetWebviewEvasObject() const {
-  return impl->webview_;
+  return webview_;
 }
 
 const Security_Origin* NotificationPermissionRequest::GetSecurityOrigin() const {
-  return impl->origin_;
+  return origin_.get();
 }
 
 bool NotificationPermissionRequest::IsDecided() const {
-  return impl->decided_;
+  return decided_;
 }
 
 bool NotificationPermissionRequest::IsSuspended() const {
-  return impl->suspended_;
+  return suspended_;
 }
 
 void NotificationPermissionRequest::SetSuspend(bool suspend) const {
-  impl->suspended_ = suspend;
-}
-
-int NotificationPermissionRequest::GetInternalCallbackContext() const {
-  return impl->callback_context_;
+  suspended_ = suspend;
+}
+
+void NotificationPermissionRequest::Reply(bool allow) {
+#if defined(ENABLE_NOTIFICATIONS)
+  if (decided_)
+    return;
+  decided_ = true;
+  EWebView* view = EWebView::FromEvasObject(webview_);
+  if (view) {
+    view->context()->browser_context()->GetNotificationController()->
+        SetPermissionForNotification(this, allow);
+  }
+  callback_.Run(allow);
+
+  if (suspended_) {
+    // 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);
+  }
+#endif
 }
 
 } // namespace tizen_webview
index d633139..c48e17e 100644 (file)
@@ -8,18 +8,23 @@
 
 #include <Evas.h>
 #include <string>
+
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+
 #include "tizen_webview/public/tw_macro.h"
+#include "tizen_webview/public/tw_security_origin.h"
 
 struct _Ewk_Notification;
 struct _Ewk_Notification_Permission_Request;
 
 namespace content {
 class NotificationControllerEfl;
+class WebContents;
 }
 
 namespace tizen_webview {
 
-class Security_Origin;
 class URL;
 
 class Notification {
@@ -40,15 +45,20 @@ class Notification {
   const Security_Origin* GetSecurityOrigin() const;
 
  private:
-  typedef ::_Ewk_Notification Impl;
-  Impl *impl;
+  std::string body_;
+  std::string iconURL_;
+  std::string replaceID_;
+  std::string title_;
+  uint64_t notificationID_;
+  scoped_ptr<Security_Origin> origin_;
+
   DISALLOW_COPY_AND_ASSIGN(Notification);
 };
 
 class NotificationPermissionRequest {
  public:
   NotificationPermissionRequest(Evas_Object* webview,
-                                int callback_context,
+                                const base::Callback<void(bool)>& callback,
                                 const tizen_webview::URL& source_origin);
   ~NotificationPermissionRequest();
 
@@ -57,15 +67,14 @@ class NotificationPermissionRequest {
   bool IsDecided() const;
   bool IsSuspended() const;
   void SetSuspend(bool suspend) const;
+  void Reply(bool allow);
 
  private:
-  // get chromium internal callback context
-  int GetInternalCallbackContext() const;
-  friend class content::NotificationControllerEfl;
-
-  typedef ::_Ewk_Notification_Permission_Request Impl;
-  Impl *impl;
-
+  Evas_Object* webview_;
+  scoped_ptr<Security_Origin> origin_;
+  base::Callback<void(bool)> callback_;
+  bool decided_;
+  mutable bool suspended_;
 
   DISALLOW_COPY_AND_ASSIGN(NotificationPermissionRequest);
 };
index e3a11c5..72436d2 100644 (file)
@@ -4,7 +4,9 @@
 // found in the LICENSE file.
 
 #include "tw_security_origin.h"
+#include "tizen_webview/tw_misc_utility.h"
 #include "tizen_webview/public/tw_url.h"
+#include "url/gurl.h"
 
 namespace tizen_webview {
 
@@ -41,4 +43,15 @@ int Security_Origin::GetPort() const {
   return port;
 }
 
+Security_Origin* Security_Origin::CreateFromString(const char *url) {
+  if (!url)
+    return 0;
+
+  GURL gurl(url);
+  if (gurl.is_empty() || !gurl.is_valid())
+    return 0;
+
+  return new Security_Origin(tizen_webview::GetURL(gurl));
+}
+
 } // namespace tizen_webview
index f6ff1f8..5147817 100644 (file)
@@ -23,6 +23,8 @@ class Security_Origin {
   Eina_Stringshare* GetProtocol() const;
   int GetPort() const;
 
+  static Security_Origin* CreateFromString(const char* url);
+
  private:
   Eina_Stringshare* host;
   Eina_Stringshare* protocol;
index c2e51ba..a026875 100644 (file)
@@ -469,6 +469,11 @@ void WebView::InvokeWebAppIconUrlsGetCallback(const std::map<std::string, std::s
   return impl_->InvokeWebAppIconUrlsGetCallback(iconUrls, callbackId);
 }
 
+void WebView::SetNotificationPermissionCallback(
+    View_Notification_Permission_Callback callback, void* user_data) {
+  return impl_->SetNotificationPermissionCallback(callback, user_data);
+}
+
 bool WebView::SaveAsPdf(int width, int height, const std::string& file_name) {
   return impl_->SaveAsPdf(width, height, file_name);
 }
index ec17047..e7738ba 100644 (file)
@@ -199,6 +199,11 @@ class WebView {
   void InvokeWebAppIconUrlGetCallback(const std::string &iconUrl, int callbackId);
   void InvokeWebAppIconUrlsGetCallback(const std::map<std::string, std::string> &iconUrls, int callbackId);
 
+  // ---- Notification Permission Request
+  void SetNotificationPermissionCallback(
+      tizen_webview::View_Notification_Permission_Callback callback,
+      void* user_data);
+
   // ---- Misc.
   bool SaveAsPdf(int width, int height, const std::string& file_name);
   // Returns TCP port number with Inspector, or 0 if error.