Implement Notification Permission callback
authorSeungkeun Lee <sngn.lee@samsung.com>
Wed, 29 Apr 2015 06:25:57 +0000 (15:25 +0900)
committerSeungkeun Lee <sngn.lee@samsung.com>
Thu, 30 Apr 2015 04:19:16 +0000 (13:19 +0900)
Change-Id: I6e963e5afdbf42fe4de69942ce8d9dab12ba87b8

src/runtime/web_application.cc
src/runtime/web_application.h
src/runtime/web_view.h
src/runtime/web_view_impl.cc
src/runtime/web_view_impl.h

index 039db04..4b3e252 100755 (executable)
@@ -56,9 +56,10 @@ namespace {
         "for (var i=0; i < window.frames.length; i++)\n"
         "{ window.frames[i].document.dispatchEvent(__event); }"
         "})()";
-
   const char* kFullscreenPrivilege = "http://tizen.org/privilege/fullscreen";
   const char* kFullscreenFeature = "fullscreen";
+  const char* kNotificationPrivilege =
+      "http://tizen.org/privilege/notification";
 
 bool FindPrivilege(wrt::ApplicationData* app_data,
                    const std::string& privilege) {
@@ -72,7 +73,6 @@ bool FindPrivilege(wrt::ApplicationData* app_data,
   }
   return false;
 }
-
 }  // namespace
 
 namespace wrt {
@@ -437,5 +437,26 @@ bool WebApplication::OnDidNavigation(WebView* view, const std::string& url) {
   return true;
 }
 
+void WebApplication::OnNotificationPermissionRequest(
+    WebView* view,
+    const std::string& url,
+    std::function<void(bool)> result_handler) {
+  // TODO(sngn.lee): check from DB url was already allowed
+  // if(check already allow or denied) {
+  //   result_handler(true);
+  //   return;
+  // }
+  // Local Domain: Grant permission if defined, otherwise Popup user prompt.
+  // Remote Domain: Popup user prompt.
+  if (utils::StartsWith(url, "file://") &&
+      FindPrivilege(app_data_.get(), kNotificationPrivilege)) {
+    result_handler(true);
+    return;
+  }
+
+  // TODO(sngn.lee): create popup and show
+}
+
+
 
 }  // namespace wrt
index 32e13cf..89a458e 100755 (executable)
@@ -55,6 +55,11 @@ class WebApplication : public WebView::EventListener {
   virtual bool OnContextMenuDisabled(WebView* view);
   virtual bool OnDidNavigation(WebView* view, const std::string& url);
 
+  virtual void OnNotificationPermissionRequest(
+      WebView* view,
+      const std::string& url,
+      std::function<void(bool)> result_handler);
+
 
   std::string uuid() const { return uuid_; }
 
index 4399deb..2bad6c5 100755 (executable)
@@ -8,6 +8,7 @@
 #include <Elementary.h>
 #include <ewk_ipc_message.h>
 #include <string>
+#include <functional>
 
 class Ewk_Context;
 
@@ -41,6 +42,11 @@ class WebView {
         int /*preferred_rotation*/) {}
     virtual void OnConsoleMessage(const std::string& /*msg*/, int /*level*/) {}
     virtual bool OnContextMenuDisabled(WebView* /*view*/) { return false; }
+
+    virtual void OnNotificationPermissionRequest(
+        WebView* /*view*/,
+        const std::string& /*url*/,
+        std::function<void(bool)> /*result_handler*/) {}
   };
 
   WebView(wrt::NativeWindow* window, Ewk_Context* context);
index a722b83..d51e0b7 100755 (executable)
@@ -9,6 +9,7 @@
 #include <sstream>
 
 #include "runtime/native_window.h"
+#include "common/logger.h"
 
 namespace wrt {
 
@@ -97,13 +98,11 @@ void WebViewImpl::Initialize() {
   InitRotationCallback();
   InitWindowCreateCallback();
   InitFullscreenCallback();
+  InitNotificationPermissionCallback();
 
   // TODO(sngn.lee): "request,certificate,confirm" certification popup
-  // TODO(sngn.lee): ewk_view_notification_permission_callback_set
   // TODO(sngn.lee): "notification,show"
   // TODO(sngn.lee): "notification,cancel"
-  // TODO(sngn.lee): "create,window"
-  // TODO(sngn.lee): "close,window"
   // TODO(sngn.lee): "protocolhandler,registration,requested"
   //                  custom protocol handler
   // TODO(sngn.lee): ewk_view_geolocation_permission_callback_set
@@ -140,6 +139,10 @@ void WebViewImpl::Deinitialize() {
       ewk_view_,
       NULL,
       NULL);
+  ewk_view_notification_permission_callback_set(
+      ewk_view_,
+      NULL,
+      NULL);
   window_->RemoveRotationHandler(rotation_handler_id_);
 }
 
@@ -510,6 +513,42 @@ void WebViewImpl::InitFullscreenCallback() {
   smart_callbacks_["fullscreen,exitfullscreen"] = exit_callback;
 }
 
+void WebViewImpl::InitNotificationPermissionCallback() {
+  auto request_callback = [](Evas_Object*,
+                             Ewk_Notification_Permission_Request* request,
+                             void* user_data) {
+    LoggerD("Notification Permission Request");
+    WebViewImpl* self = static_cast<WebViewImpl*>(user_data);
+    if (!self->listener_) {
+      ewk_notification_permission_reply(request, EINA_FALSE);
+      return EINA_TRUE;
+    }
+
+    ewk_notification_permission_request_suspend(request);
+    auto result_handler = [request](bool result) {
+      LoggerD("Notification Permission Result : %d", result);
+      ewk_notification_permission_reply(request, result);
+    };
+    const Ewk_Security_Origin* ewk_origin =
+        ewk_notification_permission_request_origin_get(request);
+
+    std::stringstream url;
+    url << ewk_security_origin_protocol_get(ewk_origin)
+        << "://"
+        << ewk_security_origin_host_get(ewk_origin)
+        << ":"
+        << ewk_security_origin_port_get(ewk_origin);
+    self->listener_->OnNotificationPermissionRequest(
+        self->view_,
+        url.str(),
+        result_handler);
+    return EINA_TRUE;
+  };
+  ewk_view_notification_permission_callback_set(ewk_view_,
+                                                request_callback,
+                                                this);
+}
+
 
 std::string WebViewImpl::GetUrl() {
   return std::string(ewk_view_url_get(ewk_view_));
index ed6e304..43893ca 100755 (executable)
@@ -53,6 +53,7 @@ class WebViewImpl {
   void InitRotationCallback();
   void InitWindowCreateCallback();
   void InitFullscreenCallback();
+  void InitNotificationPermissionCallback();
 
   NativeWindow* window_;
   Ewk_Context* context_;