Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / push_messaging / PushManager.cpp
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "modules/push_messaging/PushManager.h"
7
8 #include "bindings/core/v8/CallbackPromiseAdapter.h"
9 #include "bindings/core/v8/ScriptPromise.h"
10 #include "bindings/core/v8/ScriptPromiseResolver.h"
11 #include "bindings/core/v8/ScriptState.h"
12 #include "core/dom/DOMException.h"
13 #include "core/dom/Document.h"
14 #include "core/dom/ExceptionCode.h"
15 #include "core/dom/ExecutionContext.h"
16 #include "core/frame/LocalDOMWindow.h"
17 #include "modules/push_messaging/PushController.h"
18 #include "modules/push_messaging/PushError.h"
19 #include "modules/push_messaging/PushPermissionClient.h"
20 #include "modules/push_messaging/PushPermissionRequestCallback.h"
21 #include "modules/push_messaging/PushPermissionStatusCallback.h"
22 #include "modules/push_messaging/PushRegistration.h"
23 #include "modules/serviceworkers/NavigatorServiceWorker.h"
24 #include "modules/serviceworkers/ServiceWorkerContainer.h"
25 #include "public/platform/WebPushClient.h"
26 #include "wtf/RefPtr.h"
27
28 namespace blink {
29
30 PushManager::PushManager()
31 {
32 }
33
34 // FIXME: This call should be available from workers which will not have a Document object available.
35 // See crbug.com/389194
36 ScriptPromise PushManager::registerPushMessaging(ScriptState* scriptState)
37 {
38     ASSERT(scriptState->executionContext()->isDocument());
39
40     Document* document = toDocument(scriptState->executionContext());
41     if (!document->domWindow() || !document->page())
42         return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Document is detached from window."));
43
44     WebServiceWorkerProvider* serviceWorkerProvider = NavigatorServiceWorker::serviceWorker(*document->domWindow()->navigator())->provider();
45     if (!serviceWorkerProvider)
46         return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "No Service Worker installed for this document."));
47
48     // FIXME: Once everything except permission request goes through platform,
49     // delete WebPushClient and usage such as this one.
50     // See crbug.com/389194
51     WebPushClient* client = PushController::clientFrom(document->page());
52     ASSERT(client);
53
54     RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
55     ScriptPromise promise = resolver->promise();
56
57     PushPermissionClient* permissionClient = PushPermissionClient::from(scriptState->executionContext());
58     if (permissionClient)
59         permissionClient->requestPermission(scriptState->executionContext(), new PushPermissionRequestCallback(this, client, resolver, serviceWorkerProvider));
60     else
61         doRegister(client, resolver, serviceWorkerProvider);
62
63     return promise;
64 }
65
66 // FIXME: This call should be available from workers which will not have a Document object available.
67 // See crbug.com/389194
68 ScriptPromise PushManager::hasPermission(ScriptState* scriptState)
69 {
70     ASSERT(scriptState->executionContext()->isDocument());
71
72     Document* document = toDocument(scriptState->executionContext());
73     if (!document->domWindow() || !document->page())
74         return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "Document is detached from window."));
75     blink::WebPushClient* client = PushController::clientFrom(document->page());
76     ASSERT(client);
77
78     // The currently implemented specification does not require a Service Worker to be present for the
79     // hasPermission() call to work, but it will become a requirement soon.
80     WebServiceWorkerProvider* serviceWorkerProvider = NavigatorServiceWorker::serviceWorker(*document->domWindow()->navigator())->provider();
81     if (!serviceWorkerProvider)
82         return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "No Service Worker installed for this document."));
83
84     RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
85
86     client->getPermissionStatus(new PushPermissionStatusCallback(resolver), serviceWorkerProvider);
87     return resolver->promise();
88 }
89
90 void PushManager::doRegister(WebPushClient* client, PassRefPtr<ScriptPromiseResolver> resolver, WebServiceWorkerProvider* serviceWorkerProvider)
91 {
92     client->registerPushMessaging(new CallbackPromiseAdapter<PushRegistration, PushError>(resolver), serviceWorkerProvider);
93 }
94
95 } // namespace blink