Title: [127839] trunk/Source/WebKit/efl
Revision
127839
Author
commit-qu...@webkit.org
Date
2012-09-07 00:56:07 -0700 (Fri, 07 Sep 2012)

Log Message

[EFL] Support the permission function of the Web Notification.
https://bugs.webkit.org/show_bug.cgi?id=90603

Patch by Kihong Kwon <kihong.k...@samsung.com> on 2012-09-07
Reviewed by Gyuyoung Kim.

Implement permission related functions of Web Notifications.
checkPermission for Notification.permissionLevel().
requestPermission for Notification.requestPermission().
In addition, if the application(like a browser) has permitted domains already,
it can be cached using ewk_view_notification_permissions_store.

* WebCoreSupport/NotificationPresenterClientEfl.cpp:
(WebCore::NotificationPresenterClientEfl::NotificationPresenterClientEfl):
(WebCore::NotificationPresenterClientEfl::requestPermission):
(WebCore::NotificationPresenterClientEfl::checkPermission):
(WebCore::NotificationPresenterClientEfl::addToPermissionCache):
(WebCore):
(WebCore::NotificationPresenterClientEfl::setPermission):
* WebCoreSupport/NotificationPresenterClientEfl.h:
(WebCore):
(NotificationPresenterClientEfl):
(WebCore::NotificationPresenterClientEfl::requestPermission):
(WebCore::NotificationPresenterClientEfl::cancelRequestsForPermission):
* ewk/ewk_view.cpp:
(_ewk_view_priv_new):
(ewk_view_notification_permission_store):
(ewk_view_notification_permissions_set):
(ewk_view_notification_permission_request):
* ewk/ewk_view.h:
* ewk/ewk_view_private.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/efl/ChangeLog (127838 => 127839)


--- trunk/Source/WebKit/efl/ChangeLog	2012-09-07 07:48:18 UTC (rev 127838)
+++ trunk/Source/WebKit/efl/ChangeLog	2012-09-07 07:56:07 UTC (rev 127839)
@@ -1,3 +1,36 @@
+2012-09-07  Kihong Kwon  <kihong.k...@samsung.com>
+
+        [EFL] Support the permission function of the Web Notification.
+        https://bugs.webkit.org/show_bug.cgi?id=90603
+
+        Reviewed by Gyuyoung Kim.
+
+        Implement permission related functions of Web Notifications.
+        checkPermission for Notification.permissionLevel().
+        requestPermission for Notification.requestPermission().
+        In addition, if the application(like a browser) has permitted domains already,
+        it can be cached using ewk_view_notification_permissions_store.
+
+        * WebCoreSupport/NotificationPresenterClientEfl.cpp:
+        (WebCore::NotificationPresenterClientEfl::NotificationPresenterClientEfl):
+        (WebCore::NotificationPresenterClientEfl::requestPermission):
+        (WebCore::NotificationPresenterClientEfl::checkPermission):
+        (WebCore::NotificationPresenterClientEfl::addToPermissionCache):
+        (WebCore):
+        (WebCore::NotificationPresenterClientEfl::setPermission):
+        * WebCoreSupport/NotificationPresenterClientEfl.h:
+        (WebCore):
+        (NotificationPresenterClientEfl):
+        (WebCore::NotificationPresenterClientEfl::requestPermission):
+        (WebCore::NotificationPresenterClientEfl::cancelRequestsForPermission):
+        * ewk/ewk_view.cpp:
+        (_ewk_view_priv_new):
+        (ewk_view_notification_permission_store):
+        (ewk_view_notification_permissions_set):
+        (ewk_view_notification_permission_request):
+        * ewk/ewk_view.h:
+        * ewk/ewk_view_private.h:
+
 2012-09-05  Sam Weinig  <s...@webkit.org>
 
         Part 2 of removing PlatformString.h, remove PlatformString.h

Modified: trunk/Source/WebKit/efl/WebCoreSupport/NotificationPresenterClientEfl.cpp (127838 => 127839)


--- trunk/Source/WebKit/efl/WebCoreSupport/NotificationPresenterClientEfl.cpp	2012-09-07 07:48:18 UTC (rev 127838)
+++ trunk/Source/WebKit/efl/WebCoreSupport/NotificationPresenterClientEfl.cpp	2012-09-07 07:56:07 UTC (rev 127839)
@@ -20,13 +20,20 @@
 #include "config.h"
 #include "NotificationPresenterClientEfl.h"
 
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
+#if ENABLE(NOTIFICATIONS)
 #include "NotImplemented.h"
+#include "Notification.h"
+#include "ScriptExecutionContext.h"
+#include "SecurityOrigin.h"
+#include "ewk_security_origin_private.h"
+#include "ewk_view_private.h"
 
 namespace WebCore {
 
-NotificationPresenterClientEfl::NotificationPresenterClientEfl()
+NotificationPresenterClientEfl::NotificationPresenterClientEfl(Evas_Object* view)
+    : m_view(view)
 {
+    ASSERT(m_view);
 }
 
 NotificationPresenterClientEfl::~NotificationPresenterClientEfl()
@@ -54,21 +61,43 @@
     notImplemented();
 }
 
-void NotificationPresenterClientEfl::requestPermission(ScriptExecutionContext* context, PassRefPtr<VoidCallback> callback)
+void NotificationPresenterClientEfl::requestPermission(ScriptExecutionContext* context, PassRefPtr<NotificationPermissionCallback> callback)
 {
-    notImplemented();
+    Ewk_Security_Origin* origin = ewk_security_origin_new(context->securityOrigin());
+    m_pendingPermissionRequests.add(origin, callback);
+    ewk_view_notification_permission_request(m_view, origin);
 }
 
 NotificationClient::Permission NotificationPresenterClientEfl::checkPermission(ScriptExecutionContext* context)
 {
-    notImplemented();
+    PermissionsMap::iterator it = m_cachedPermissions.find(context->securityOrigin()->toString());
+    if (it == m_cachedPermissions.end())
+        return PermissionNotAllowed;
+    if (it->second)
+        return PermissionAllowed;
+
     return PermissionDenied;
 }
 
-void NotificationPresenterClientEfl::cancelRequestsForPermission(ScriptExecutionContext* context)
+void NotificationPresenterClientEfl::addToPermissionCache(const String& domain, const bool isPermitted)
 {
-    notImplemented();
+    PermissionsMap::iterator it = m_cachedPermissions.find(domain);
+    if (it != m_cachedPermissions.end())
+        return;
+    m_cachedPermissions.add(domain, isPermitted);
 }
 
+void NotificationPresenterClientEfl::setPermission(const Ewk_Security_Origin* origin, const bool isPermitted)
+{
+    PermissionRequestMap::iterator it = m_pendingPermissionRequests.find(origin);
+    if (it == m_pendingPermissionRequests.end())
+        return;
+
+    it->second->handleEvent(Notification::permissionString(isPermitted ? NotificationClient::PermissionAllowed : NotificationClient::PermissionDenied));
+    m_pendingPermissionRequests.remove(it);
+    m_cachedPermissions.add(String::fromUTF8(ewk_security_origin_string_get(origin)), isPermitted);
+    ewk_security_origin_free(const_cast<Ewk_Security_Origin*>(origin));
 }
+
+}
 #endif

Modified: trunk/Source/WebKit/efl/WebCoreSupport/NotificationPresenterClientEfl.h (127838 => 127839)


--- trunk/Source/WebKit/efl/WebCoreSupport/NotificationPresenterClientEfl.h	2012-09-07 07:48:18 UTC (rev 127838)
+++ trunk/Source/WebKit/efl/WebCoreSupport/NotificationPresenterClientEfl.h	2012-09-07 07:56:07 UTC (rev 127839)
@@ -20,25 +20,43 @@
 #ifndef NotificationPresenterClientEfl_h
 #define NotificationPresenterClientEfl_h
 
-#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
-#include "Notification.h"
+#if ENABLE(NOTIFICATIONS)
 #include "NotificationClient.h"
+#include "ewk_security_origin.h"
+#include <Evas.h>
+#include <wtf/HashMap.h>
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
+class Notification;
+
 class NotificationPresenterClientEfl : public NotificationClient {
-
 public:
-    NotificationPresenterClientEfl();
+    explicit NotificationPresenterClientEfl(Evas_Object* view);
     ~NotificationPresenterClientEfl();
 
     virtual bool show(Notification*);
     virtual void cancel(Notification*);
     virtual void notificationObjectDestroyed(Notification*);
     virtual void notificationControllerDestroyed();
-    virtual void requestPermission(ScriptExecutionContext*, PassRefPtr<VoidCallback>);
+#if ENABLE(LEGACY_NOTIFICATIONS)
+    virtual void requestPermission(ScriptExecutionContext*, PassRefPtr<VoidCallback>) { }
+#endif
+    virtual void requestPermission(ScriptExecutionContext*, PassRefPtr<NotificationPermissionCallback>);
     virtual NotificationClient::Permission checkPermission(ScriptExecutionContext*);
-    virtual void cancelRequestsForPermission(ScriptExecutionContext*);
+    virtual void cancelRequestsForPermission(ScriptExecutionContext*) { }
+
+    void addToPermissionCache(const String& domain, bool isPermitted);
+    void setPermission(const Ewk_Security_Origin*, bool isPermitted);
+
+private:
+    Evas_Object* m_view;
+
+    typedef HashMap<const Ewk_Security_Origin*, RefPtr<WebCore::NotificationPermissionCallback> > PermissionRequestMap;
+    PermissionRequestMap m_pendingPermissionRequests;
+    typedef HashMap<String, bool> PermissionsMap;
+    PermissionsMap m_cachedPermissions;
 };
 
 }

Modified: trunk/Source/WebKit/efl/ewk/ewk_view.cpp (127838 => 127839)


--- trunk/Source/WebKit/efl/ewk/ewk_view.cpp	2012-09-07 07:48:18 UTC (rev 127838)
+++ trunk/Source/WebKit/efl/ewk/ewk_view.cpp	2012-09-07 07:56:07 UTC (rev 127839)
@@ -109,6 +109,11 @@
 #include "NavigatorContentUtilsClientEfl.h"
 #endif
 
+#if ENABLE(NOTIFICATIONS)
+#include "NotificationController.h"
+#include "NotificationPresenterClientEfl.h"
+#endif
+
 static const float zoomMinimum = 0.05;
 static const float zoomMaximum = 4.0;
 
@@ -775,6 +780,10 @@
     WebCore::provideNavigatorContentUtilsTo(priv->page.get(), priv->navigatorContentUtilsClient.get());
 #endif
 
+#if ENABLE(NOTIFICATIONS)
+    WebCore::provideNotification(priv->page.get(), new WebCore::NotificationPresenterClientEfl(smartData->self));
+#endif
+
     priv->pageSettings = priv->page->settings();
 
     priv->viewportArguments.width = WebCore::ViewportArguments::ValueAuto;
@@ -4565,6 +4574,37 @@
     }
 }
 
+Eina_Bool ewk_view_notification_permission_store(Evas_Object* ewkView, const char* domain, Eina_Bool permitted)
+{
+#if ENABLE(NOTIFICATIONS)
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, false);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, false);
+    static_cast<WebCore::NotificationPresenterClientEfl*>(WebCore::NotificationController::clientFrom(priv->page.get()))->addToPermissionCache(String::fromUTF8(domain), permitted);
+    return true;
+#else
+    return false;
+#endif
+}
+
+Eina_Bool ewk_view_notification_permissions_set(Evas_Object* ewkView, const Ewk_Security_Origin* origin, Eina_Bool permitted)
+{
+#if ENABLE(NOTIFICATIONS)
+    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, false);
+    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, false);
+    static_cast<WebCore::NotificationPresenterClientEfl*>(WebCore::NotificationController::clientFrom(priv->page.get()))->setPermission(origin, permitted);
+    return true;
+#else
+    return false;
+#endif
+}
+
+#if ENABLE(NOTIFICATIONS)
+void ewk_view_notification_permission_request(Evas_Object* ewkView, const Ewk_Security_Origin* origin)
+{
+    evas_object_smart_callback_call(ewkView, "notification,permission,request", const_cast<Ewk_Security_Origin*>(origin));
+}
+#endif
+
 namespace EWKPrivate {
 
 WebCore::Page* corePage(const Evas_Object* ewkView)

Modified: trunk/Source/WebKit/efl/ewk/ewk_view.h (127838 => 127839)


--- trunk/Source/WebKit/efl/ewk/ewk_view.h	2012-09-07 07:48:18 UTC (rev 127838)
+++ trunk/Source/WebKit/efl/ewk/ewk_view.h	2012-09-07 07:56:07 UTC (rev 127839)
@@ -74,6 +74,7 @@
  *  - "mixedcontent,displayed", void: any of the containing frames has loaded and displayed mixed content.
  *  - "mixedcontent,run", void: any of the containing frames has loaded and run mixed content.
  *  - "navigate,with,data", Ewk_View_Navigation_Data*: reports that view did navigation and gives the navigation details.
+ *  - "notification,permission,request", const Ewk_Security_Origin*: request to confirm permission for security origin from user.
  *  - "perform,client,redirect", Ewk_View_Redirection_Data*: reports that view performed a client redirect and gives the redirection details.
  *  - "perform,server,redirect", Ewk_View_Redirection_Data*: reports that view performed a server redirect and gives the redirection details.
  *  - "protocolhandler,registration,requested", Ewk_Custom_Handler_Data: add a handler url for the given protocol.
@@ -2746,6 +2747,33 @@
  */
 EAPI void ewk_view_web_inspector_view_set(Evas_Object *o, Evas_Object *inspector_view);
 
+/**
+ * Add permitted or denied list to the permission cache for Web Notifications.
+ *
+ * If there are stored permission lists for Web Notifications,
+ * this function need to be called with permission.
+ *
+ * @param o view object to set the permission cache list.
+ * @param domain string for determine the permission.
+ * @param permitted @c EINA_TRUE to permit, @c EINA_FALSE to deny.
+ *
+ * @return @c EINA_TRUE on success or @c EINA_FALSE on failure
+ */
+Eina_Bool ewk_view_notification_permission_store(Evas_Object *o, const char *domain, Eina_Bool permitted);
+
+/**
+ * Set permitted or denied lists to the permission cache for the Web Notifications.
+ *
+ * After checking permission, this function have to be called to set permission.
+ *
+ * @param o view object to set the permission.
+ * @param origin security origin object
+ * @param permitted @c EINA_TRUE to permit, @c EINA_FALSE to deny.
+ *
+ * @return @c EINA_TRUE on success or @c EINA_FALSE on failure
+ */
+EAPI Eina_Bool ewk_view_notification_permissions_set(Evas_Object *o, const Ewk_Security_Origin *origin, Eina_Bool permitted);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/Source/WebKit/efl/ewk/ewk_view_private.h (127838 => 127839)


--- trunk/Source/WebKit/efl/ewk/ewk_view_private.h	2012-09-07 07:48:18 UTC (rev 127838)
+++ trunk/Source/WebKit/efl/ewk/ewk_view_private.h	2012-09-07 07:56:07 UTC (rev 127839)
@@ -156,6 +156,10 @@
 WebCore::GraphicsContext3D* ewk_view_accelerated_compositing_context_get(Evas_Object* ewkView);
 #endif
 
+#if ENABLE(NOTIFICATIONS)
+void ewk_view_notification_permission_request(Evas_Object* ewkView, const Ewk_Security_Origin* origin);
+#endif
+
 namespace EWKPrivate {
 WebCore::Page *corePage(const Evas_Object *ewkView);
 PlatformPageClient corePageClient(Evas_Object* ewkView);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to