Index: Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp |
diff --git a/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp b/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp |
index ce61ae67fc88484b98092d2f13fd1d3ecfdeda2f..f4a3d5a36cc7e18c7580d475786e32363e4c7728 100644 |
--- a/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp |
+++ b/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp |
@@ -5,28 +5,58 @@ |
#include "config.h" |
#include "modules/notifications/ServiceWorkerRegistrationNotifications.h" |
+#include "bindings/core/v8/CallbackPromiseAdapter.h" |
+#include "bindings/core/v8/ScriptPromiseResolver.h" |
+#include "bindings/core/v8/V8ThrowException.h" |
#include "core/dom/DOMException.h" |
#include "core/dom/ExceptionCode.h" |
#include "core/dom/ExecutionContext.h" |
+#include "modules/notifications/Notification.h" |
#include "modules/notifications/NotificationOptions.h" |
#include "platform/weborigin/KURL.h" |
+#include "public/platform/Platform.h" |
#include "public/platform/WebNotificationData.h" |
+#include "public/platform/WebNotificationManager.h" |
+#include "public/platform/WebSerializedOrigin.h" |
namespace blink { |
ScriptPromise ServiceWorkerRegistrationNotifications::showNotification(ScriptState* scriptState, ServiceWorkerRegistration& serviceWorkerRegistration, const String& title, const NotificationOptions& options) |
{ |
+ ExecutionContext* executionContext = scriptState->executionContext(); |
+ |
+ // If context object's active worker is null, reject promise with a TypeError exception. |
+ if (!serviceWorkerRegistration.active()) |
+ return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "No active registration available on the ServiceWorkerRegistration.")); |
+ |
+ // If permission for notification's origin is not "granted", reject promise with a TypeError exception, and terminate these substeps. |
+ if (Notification::checkPermission(executionContext) != WebNotificationPermissionAllowed) |
+ return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "No notification permission has been granted for this origin.")); |
+ |
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ |
+ // FIXME: Do the appropriate CORS checks on the icon URL. |
+ // FIXME: Determine the text direction based on the options dictionary. |
+ |
KURL iconUrl; |
if (options.hasIcon() && !options.icon().isEmpty()) { |
- iconUrl = scriptState->executionContext()->completeURL(options.icon()); |
+ iconUrl = executionContext->completeURL(options.icon()); |
if (!iconUrl.isValid()) |
iconUrl = KURL(); |
} |
WebNotificationData notification(title, WebNotificationData::DirectionLeftToRight, options.lang(), options.body(), options.tag(), iconUrl); |
+ WebNotificationShowCallbacks* callbacks = new CallbackPromiseAdapter<void, void>(resolver); |
+ |
+ SecurityOrigin* origin = executionContext->securityOrigin(); |
+ ASSERT(origin); |
+ |
+ WebNotificationManager* notificationManager = Platform::current()->notificationManager(); |
+ ASSERT(notificationManager); |
- // FIXME: Hook this up with the Blink API once it's been implemented. |
- return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "showNotification is not implemented yet.")); |
+ notificationManager->showPersistent(WebSerializedOrigin(*origin), notification, serviceWorkerRegistration.webRegistration(), callbacks); |
+ return promise; |
} |
} // namespace blink |