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);