Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / renderer / push_messaging_dispatcher.cc
index b2bb850..e387d39 100644 (file)
@@ -4,8 +4,11 @@
 
 #include "content/renderer/push_messaging_dispatcher.h"
 
+#include "base/strings/utf_string_conversions.h"
 #include "content/child/service_worker/web_service_worker_provider_impl.h"
 #include "content/common/push_messaging_messages.h"
+#include "content/renderer/manifest/manifest_manager.h"
+#include "content/renderer/render_frame_impl.h"
 #include "ipc/ipc_message.h"
 #include "third_party/WebKit/public/platform/WebPushError.h"
 #include "third_party/WebKit/public/platform/WebPushRegistration.h"
@@ -29,39 +32,62 @@ bool PushMessagingDispatcher::OnMessageReceived(const IPC::Message& message) {
   IPC_BEGIN_MESSAGE_MAP(PushMessagingDispatcher, message)
     IPC_MESSAGE_HANDLER(PushMessagingMsg_RegisterSuccess, OnRegisterSuccess)
     IPC_MESSAGE_HANDLER(PushMessagingMsg_RegisterError, OnRegisterError)
+    IPC_MESSAGE_HANDLER(PushMessagingMsg_PermissionStatusResult,
+                        OnPermissionStatus)
+    IPC_MESSAGE_HANDLER(PushMessagingMsg_PermissionStatusFailure,
+                        OnPermissionStatusFailure)
+
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
 }
 
 void PushMessagingDispatcher::registerPushMessaging(
-    const WebString& sender_id,
-    blink::WebPushRegistrationCallbacks* callbacks) {
-  DCHECK(callbacks);
-  scoped_ptr<blink::WebPushError> error(new blink::WebPushError(
-      blink::WebPushError::ErrorTypeAbort,
-      WebString::fromUTF8(PushMessagingStatusToString(
-          PUSH_MESSAGING_STATUS_REGISTRATION_FAILED_NO_SERVICE_WORKER))));
-  callbacks->onError(error.release());
-  delete callbacks;
+    blink::WebPushRegistrationCallbacks* callbacks,
+    blink::WebServiceWorkerProvider* service_worker_provider) {
+  RenderFrameImpl::FromRoutingID(routing_id())->manifest_manager()->GetManifest(
+      base::Bind(&PushMessagingDispatcher::DoRegister,
+                 base::Unretained(this),
+                 callbacks,
+                 service_worker_provider));
 }
 
-void PushMessagingDispatcher::registerPushMessaging(
-    const WebString& sender_id,
+void PushMessagingDispatcher::DoRegister(
     blink::WebPushRegistrationCallbacks* callbacks,
-    blink::WebServiceWorkerProvider* service_worker_provider) {
+    blink::WebServiceWorkerProvider* service_worker_provider,
+    const Manifest& manifest) {
   DCHECK(callbacks);
   int callbacks_id = registration_callbacks_.Add(callbacks);
   int service_worker_provider_id = static_cast<WebServiceWorkerProviderImpl*>(
                                        service_worker_provider)->provider_id();
+
+  std::string sender_id = manifest.gcm_sender_id.is_null()
+      ? std::string() : base::UTF16ToUTF8(manifest.gcm_sender_id.string());
+  if (sender_id.empty()) {
+    OnRegisterError(callbacks_id, PUSH_REGISTRATION_STATUS_NO_SENDER_ID);
+    return;
+  }
+
   Send(new PushMessagingHostMsg_Register(
       routing_id(),
       callbacks_id,
-      sender_id.utf8(),
+      manifest.gcm_sender_id.is_null()
+          ? std::string()
+          : base::UTF16ToUTF8(manifest.gcm_sender_id.string()),
       blink::WebUserGestureIndicator::isProcessingUserGesture(),
       service_worker_provider_id));
 }
 
+void PushMessagingDispatcher::getPermissionStatus(
+    blink::WebPushPermissionStatusCallback* callback,
+    blink::WebServiceWorkerProvider* service_worker_provider) {
+  int permission_callback_id = permission_check_callbacks_.Add(callback);
+  int service_worker_provider_id = static_cast<WebServiceWorkerProviderImpl*>(
+                                       service_worker_provider)->provider_id();
+  Send(new PushMessagingHostMsg_PermissionStatus(
+      routing_id(), service_worker_provider_id, permission_callback_id));
+}
+
 void PushMessagingDispatcher::OnRegisterSuccess(
     int32 callbacks_id,
     const GURL& endpoint,
@@ -79,16 +105,32 @@ void PushMessagingDispatcher::OnRegisterSuccess(
 }
 
 void PushMessagingDispatcher::OnRegisterError(int32 callbacks_id,
-                                              PushMessagingStatus status) {
+                                              PushRegistrationStatus status) {
   blink::WebPushRegistrationCallbacks* callbacks =
       registration_callbacks_.Lookup(callbacks_id);
   CHECK(callbacks);
 
   scoped_ptr<blink::WebPushError> error(new blink::WebPushError(
       blink::WebPushError::ErrorTypeAbort,
-      WebString::fromUTF8(PushMessagingStatusToString(status))));
+      WebString::fromUTF8(PushRegistrationStatusToString(status))));
   callbacks->onError(error.release());
   registration_callbacks_.Remove(callbacks_id);
 }
 
+void PushMessagingDispatcher::OnPermissionStatus(
+    int32 callback_id,
+    blink::WebPushPermissionStatus status) {
+  blink::WebPushPermissionStatusCallback* callback =
+      permission_check_callbacks_.Lookup(callback_id);
+  callback->onSuccess(&status);
+  permission_check_callbacks_.Remove(callback_id);
+}
+
+void PushMessagingDispatcher::OnPermissionStatusFailure(int32 callback_id) {
+  blink::WebPushPermissionStatusCallback* callback =
+      permission_check_callbacks_.Lookup(callback_id);
+  callback->onError();
+  permission_check_callbacks_.Remove(callback_id);
+}
+
 }  // namespace content