Title: [277420] trunk
Revision
277420
Author
[email protected]
Date
2021-05-12 22:02:45 -0700 (Wed, 12 May 2021)

Log Message

Notification.requestPermission() should return a Promise
https://bugs.webkit.org/show_bug.cgi?id=225712

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

Drop manual test that should not have been imported from WPT. The test happened to be using Notification.requestPermission()
internally.

* web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https-expected.txt: Removed.
* web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https.html: Removed.

Source/WebCore:

Notification.requestPermission() should return a Promise as per the specification:
- https://notifications.spec.whatwg.org/#notification

Both Firefox and Chrome already support this.

Test: http/tests/notifications/request-with-promise.html

* Modules/notifications/Notification.cpp:
(WebCore::Notification::requestPermission):
* Modules/notifications/Notification.h:
* Modules/notifications/Notification.idl:
* Modules/notifications/NotificationClient.h:

Source/WebKit:

Update code now that WebCore passes a CompletionHandler instead of a
NotificationPermissionCallback.

* WebProcess/Notifications/NotificationPermissionRequestManager.cpp:
(WebKit::NotificationPermissionRequestManager::~NotificationPermissionRequestManager):
(WebKit::NotificationPermissionRequestManager::startRequest):
* WebProcess/Notifications/NotificationPermissionRequestManager.h:
* WebProcess/WebCoreSupport/WebNotificationClient.cpp:
(WebKit::WebNotificationClient::requestPermission):
* WebProcess/WebCoreSupport/WebNotificationClient.h:

Source/WebKitLegacy/mac:

Update code now that WebCore passes a CompletionHandler instead of a
NotificationPermissionCallback.

* WebCoreSupport/WebNotificationClient.h:
* WebCoreSupport/WebNotificationClient.mm:
(WebNotificationClient::requestPermission):
(-[WebNotificationPolicyListener initWithCompletionHandler:]):
(-[WebNotificationPolicyListener allow]):
(-[WebNotificationPolicyListener deny]):

Source/WebKitLegacy/win:

Update code now that WebCore passes a CompletionHandler instead of a
NotificationPermissionCallback.

* WebCoreSupport/WebDesktopNotificationsDelegate.cpp:
(WebDesktopNotificationsDelegate::requestPermission):
* WebCoreSupport/WebDesktopNotificationsDelegate.h:

LayoutTests:

* http/tests/notifications/notification-in-non-secure-context-expected.txt:
Rebaseline test now that we log an error message in the JS console when trying to call
Notification.requestPermission() in a non-secure context.

* http/tests/notifications/request-with-promise-expected.txt: Added.
* http/tests/notifications/request-with-promise.html: Added.
Add layout test coverage.

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (277419 => 277420)


--- trunk/LayoutTests/ChangeLog	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/LayoutTests/ChangeLog	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,3 +1,18 @@
+2021-05-12  Chris Dumez  <[email protected]>
+
+        Notification.requestPermission() should return a Promise
+        https://bugs.webkit.org/show_bug.cgi?id=225712
+
+        Reviewed by Darin Adler.
+
+        * http/tests/notifications/notification-in-non-secure-context-expected.txt:
+        Rebaseline test now that we log an error message in the JS console when trying to call
+        Notification.requestPermission() in a non-secure context.
+
+        * http/tests/notifications/request-with-promise-expected.txt: Added.
+        * http/tests/notifications/request-with-promise.html: Added.
+        Add layout test coverage.
+
 2021-05-12  Diego Pino Garcia  <[email protected]>
 
         [GLIB] http/tests/security/contentSecurityPolicy/report-only-from-header.py is a flaky text failure

Modified: trunk/LayoutTests/http/tests/notifications/notification-in-non-secure-context-expected.txt (277419 => 277420)


--- trunk/LayoutTests/http/tests/notifications/notification-in-non-secure-context-expected.txt	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/LayoutTests/http/tests/notifications/notification-in-non-secure-context-expected.txt	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,3 +1,5 @@
+CONSOLE MESSAGE: The Notification permission may only be requested in a secure context.
+CONSOLE MESSAGE: The Notification permission may only be requested in a secure context.
 
 PASS Notification permission in insecure context
 

Added: trunk/LayoutTests/http/tests/notifications/request-with-promise-expected.txt (0 => 277420)


--- trunk/LayoutTests/http/tests/notifications/request-with-promise-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/notifications/request-with-promise-expected.txt	2021-05-13 05:02:45 UTC (rev 277420)
@@ -0,0 +1,16 @@
+This tests Notification.permission's returned Promise
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Requesting permission with default permission
+PASS Notification.permission is "default"
+PASS permission is granted
+PASS Notification.permission is "granted"
+Requesting permission with non-default permission
+PASS permission is denied
+PASS Notification.permission is "denied"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/http/tests/notifications/request-with-promise.html (0 => 277420)


--- trunk/LayoutTests/http/tests/notifications/request-with-promise.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/notifications/request-with-promise.html	2021-05-13 05:02:45 UTC (rev 277420)
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<script src=""
+<script>
+description("This tests Notification.permission's returned Promise");
+jsTestIsAsync = true;
+
+function step1() {
+    debug("Requesting permission with default permission");
+    shouldBeEqualToString("Notification.permission", "default");
+    Notification.requestPermission().then((permission) => {
+        if (permission == 'granted')
+            testPassed("permission is granted");
+        else
+            testFailed("permission should be granted, but is " + permission);
+        shouldBeEqualToString("Notification.permission", "granted");
+        setTimeout(step2, 0);
+    });
+}
+
+function step2() {
+    debug("Requesting permission with non-default permission");
+    testRunner.denyWebNotificationPermission(self.origin);
+    Notification.requestPermission().then((permission) => {
+        if (permission == 'denied')
+            testPassed("permission is denied");
+        else
+            testFailed("permission should be denied, but is " + permission);
+        shouldBeEqualToString("Notification.permission", "denied");
+        finishJSTest();
+    });
+}
+
+step1();
+</script>

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (277419 => 277420)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,3 +1,16 @@
+2021-05-12  Chris Dumez  <[email protected]>
+
+        Notification.requestPermission() should return a Promise
+        https://bugs.webkit.org/show_bug.cgi?id=225712
+
+        Reviewed by Darin Adler.
+
+        Drop manual test that should not have been imported from WPT. The test happened to be using Notification.requestPermission()
+        internally.
+
+        * web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https-expected.txt: Removed.
+        * web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https.html: Removed.
+
 2021-05-12  Ziran Sun  <[email protected]>
 
         Wrong position for orthogonal positioned element with writing-mode: vertical-rl

Deleted: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https-expected.txt (277419 => 277420)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https-expected.txt	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https-expected.txt	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,3 +0,0 @@
-
-FAIL Notification requests intercepted both from window and SW undefined is not an object (evaluating 'Notification.requestPermission().then')
-

Deleted: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https.html (277419 => 277420)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https.html	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https.html	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,122 +0,0 @@
-<!DOCTYPE html>
-<script src=""
-<script src=""
-<script src=""
-<script src=""
-<body>
-<script>
-const worker = 'resources/fetch-event-within-sw-worker.js';
-
-function wait(ms) {
-  return new Promise(r => setTimeout(r, ms));
-}
-
-function reset() {
-  for (const iframe of [...document.querySelectorAll('.test-iframe')]) {
-    iframe.remove();
-  }
-  return navigator.serviceWorker.getRegistrations().then(registrations => {
-    return Promise.all(registrations.map(r => r.unregister()));
-  }).then(() => caches.keys()).then(cacheKeys => {
-    return Promise.all(cacheKeys.map(c => caches.delete(c)));
-  });
-}
-
-add_completion_callback(reset);
-
-function regReady(reg) {
-  return new Promise((resolve, reject) => {
-    if (reg.active) {
-      resolve();
-      return;
-    }
-    const nextWorker = reg.waiting || reg.installing;
-
-    nextWorker.addEventListener('statechange', () => {
-      if (nextWorker.state == 'redundant') {
-        reject(Error(`Service worker failed to install`));
-        return;
-      }
-      if (nextWorker.state == 'activated') {
-        resolve();
-      }
-    });
-  });
-}
-
-function getCookies() {
-  return new Map(
-    document.cookie
-      .split(/;/g)
-      .map(c => c.trim().split('=').map(s => s.trim()))
-  );
-}
-
-function registerSwAndOpenFrame() {
-  return reset().then(() => navigator.serviceWorker.register(worker, {scope: 'resources/'}))
-    .then(reg => regReady(reg))
-    .then(() => with_iframe('resources/simple.html'));
-}
-
-function raceBroadcastAndCookie(channel, cookie) {
-  const initialCookie = getCookies().get(cookie);
-  let done = false;
-
-  return Promise.race([
-    new Promise(resolve => {
-      const bc = new BroadcastChannel(channel);
-      bc._onmessage_ = () => {
-        bc.close();
-        resolve('broadcast');
-      };
-    }),
-    (function checkCookie() {
-      // Stop polling if the broadcast channel won
-      if (done == true) return;
-      if (getCookies().get(cookie) != initialCookie) return 'cookie';
-
-      return wait(200).then(checkCookie);
-    }())
-  ]).then(val => {
-    done = true;
-    return val;
-  });
-}
-
-promise_test(() => {
-  return Notification.requestPermission().then(permission => {
-    if (permission != "granted") {
-      throw Error('You must allow notifications for this origin before running this test.');
-    }
-    return registerSwAndOpenFrame();
-  }).then(iframe => {
-    return Promise.resolve().then(() => {
-      // In this test, the service worker will ping the 'icon-request' channel
-      // if it intercepts a request for 'notification_icon.py'. If the request
-      // reaches the server it sets the 'notification' cookie to the value given
-      // in the URL. "raceBroadcastAndCookie" monitors both and returns which
-      // happens first.
-      const race = raceBroadcastAndCookie('icon-request', 'notification');
-      const notification = new iframe.contentWindow.Notification('test', {
-        icon: `notification_icon.py?set-cookie-notification=${Math.random()}`
-      });
-      notification.close();
-
-      return race.then(winner => {
-        assert_equals(winner, 'broadcast', 'The service worker intercepted the from-window notification icon request');
-      });
-    }).then(() => {
-      // Similar race to above, but this time the service worker requests the
-      // notification.
-      const race = raceBroadcastAndCookie('icon-request', 'notification');
-      iframe.contentWindow.fetch(`show-notification?set-cookie-notification=${Math.random()}`);
-
-      return race.then(winner => {
-        assert_equals(winner, 'broadcast', 'The service worker intercepted the from-service-worker notification icon request');
-      });
-    })
-  });
-}, `Notification requests intercepted both from window and SW`);
-
-</script>
-</body>

Modified: trunk/Source/WebCore/ChangeLog (277419 => 277420)


--- trunk/Source/WebCore/ChangeLog	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebCore/ChangeLog	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,3 +1,23 @@
+2021-05-12  Chris Dumez  <[email protected]>
+
+        Notification.requestPermission() should return a Promise
+        https://bugs.webkit.org/show_bug.cgi?id=225712
+
+        Reviewed by Darin Adler.
+
+        Notification.requestPermission() should return a Promise as per the specification:
+        - https://notifications.spec.whatwg.org/#notification
+
+        Both Firefox and Chrome already support this.
+
+        Test: http/tests/notifications/request-with-promise.html
+
+        * Modules/notifications/Notification.cpp:
+        (WebCore::Notification::requestPermission):
+        * Modules/notifications/Notification.h:
+        * Modules/notifications/Notification.idl:
+        * Modules/notifications/NotificationClient.h:
+
 2021-05-12  Fujii Hironori  <[email protected]>
 
         Some webgl/2.0.0/conformance/textures/image_bitmap_from_image_data tests are failing after r277369 if !USE(ACCELERATE)

Modified: trunk/Source/WebCore/Modules/notifications/Notification.cpp (277419 => 277420)


--- trunk/Source/WebCore/Modules/notifications/Notification.cpp	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebCore/Modules/notifications/Notification.cpp	2021-05-13 05:02:45 UTC (rev 277420)
@@ -38,11 +38,13 @@
 #include "Document.h"
 #include "Event.h"
 #include "EventNames.h"
+#include "JSDOMPromiseDeferred.h"
 #include "NotificationClient.h"
 #include "NotificationController.h"
 #include "NotificationPermissionCallback.h"
 #include "WindowEventLoop.h"
 #include "WindowFocusAllowedIndicator.h"
+#include <wtf/CompletionHandler.h>
 #include <wtf/IsoMallocInlines.h>
 
 namespace WebCore {
@@ -184,22 +186,26 @@
     return NotificationController::from(document.page())->client().checkPermission(&document);
 }
 
-void Notification::requestPermission(Document& document, RefPtr<NotificationPermissionCallback>&& callback)
+void Notification::requestPermission(Document& document, RefPtr<NotificationPermissionCallback>&& callback, Ref<DeferredPromise>&& promise)
 {
+    auto resolvePromiseAndCallback = [document = makeRef(document), callback = WTFMove(callback), promise = WTFMove(promise)](Permission permission) mutable {
+        document->eventLoop().queueTask(TaskSource::DOMManipulation, [callback = WTFMove(callback), promise = WTFMove(promise), permission]() mutable {
+            if (callback)
+                callback->handleEvent(permission);
+            promise->resolve<IDLEnumeration<NotificationPermission>>(permission);
+        });
+    };
+
     auto* page = document.page();
     if (!page)
-        return;
+        return resolvePromiseAndCallback(Permission::Denied);
 
     if (!document.isSecureContext()) {
-        if (callback) {
-            document.eventLoop().queueTask(TaskSource::DOMManipulation, [callback = WTFMove(callback)]() mutable {
-                callback->handleEvent(Permission::Denied);
-            });
-        }
-        return;
+        document.addConsoleMessage(MessageSource::Security, MessageLevel::Error, "The Notification permission may only be requested in a secure context."_s);
+        return resolvePromiseAndCallback(Permission::Denied);
     }
 
-    NotificationController::from(page)->client().requestPermission(&document, WTFMove(callback));
+    NotificationController::from(page)->client().requestPermission(document, WTFMove(resolvePromiseAndCallback));
 }
 
 void Notification::eventListenersDidChange()

Modified: trunk/Source/WebCore/Modules/notifications/Notification.h (277419 => 277420)


--- trunk/Source/WebCore/Modules/notifications/Notification.h	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebCore/Modules/notifications/Notification.h	2021-05-13 05:02:45 UTC (rev 277420)
@@ -42,6 +42,7 @@
 
 namespace WebCore {
 
+class DeferredPromise;
 class Document;
 class NotificationPermissionCallback;
 
@@ -82,7 +83,7 @@
     WEBCORE_EXPORT void finalize();
 
     static Permission permission(Document&);
-    static void requestPermission(Document&, RefPtr<NotificationPermissionCallback>&&);
+    static void requestPermission(Document&, RefPtr<NotificationPermissionCallback>&&, Ref<DeferredPromise>&&);
 
     ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
 

Modified: trunk/Source/WebCore/Modules/notifications/Notification.idl (277419 => 277420)


--- trunk/Source/WebCore/Modules/notifications/Notification.idl	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebCore/Modules/notifications/Notification.idl	2021-05-13 05:02:45 UTC (rev 277420)
@@ -40,7 +40,7 @@
     [CallWith=Document] constructor(DOMString title, optional NotificationOptions options);
 
     [CallWith=Document] static readonly attribute NotificationPermission permission;
-    [CallWith=Document] static undefined requestPermission(optional NotificationPermissionCallback? deprecatedCallback); // FIXME: This should return a Promise<NotificationPermission>.
+    [CallWith=Document] static Promise<NotificationPermission> requestPermission(optional NotificationPermissionCallback? deprecatedCallback);
 
     // static readonly attribute unsigned long maxActions;
 

Modified: trunk/Source/WebCore/Modules/notifications/NotificationClient.h (277419 => 277420)


--- trunk/Source/WebCore/Modules/notifications/NotificationClient.h	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebCore/Modules/notifications/NotificationClient.h	2021-05-13 05:02:45 UTC (rev 277420)
@@ -44,6 +44,7 @@
 class NotificationClient {
 public:
     using Permission = NotificationPermission;
+    using PermissionHandler = CompletionHandler<void(Permission)>;
 
     // Requests that a notification be shown.
     virtual bool show(Notification*) = 0;
@@ -66,7 +67,7 @@
     // Requests user permission to show desktop notifications from a particular
     // script context. The callback parameter should be run when the user has
     // made a decision.
-    virtual void requestPermission(ScriptExecutionContext*, RefPtr<NotificationPermissionCallback>&&) = 0;
+    virtual void requestPermission(ScriptExecutionContext&, PermissionHandler&&) = 0;
 
     // Checks the current level of permission.
     virtual Permission checkPermission(ScriptExecutionContext*) = 0;

Modified: trunk/Source/WebKit/ChangeLog (277419 => 277420)


--- trunk/Source/WebKit/ChangeLog	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKit/ChangeLog	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,3 +1,21 @@
+2021-05-12  Chris Dumez  <[email protected]>
+
+        Notification.requestPermission() should return a Promise
+        https://bugs.webkit.org/show_bug.cgi?id=225712
+
+        Reviewed by Darin Adler.
+
+        Update code now that WebCore passes a CompletionHandler instead of a
+        NotificationPermissionCallback.
+
+        * WebProcess/Notifications/NotificationPermissionRequestManager.cpp:
+        (WebKit::NotificationPermissionRequestManager::~NotificationPermissionRequestManager):
+        (WebKit::NotificationPermissionRequestManager::startRequest):
+        * WebProcess/Notifications/NotificationPermissionRequestManager.h:
+        * WebProcess/WebCoreSupport/WebNotificationClient.cpp:
+        (WebKit::WebNotificationClient::requestPermission):
+        * WebProcess/WebCoreSupport/WebNotificationClient.h:
+
 2021-05-12  Fujii Hironori  <[email protected]>
 
         [WinCairo] Failed to open WebInspector UI since r277231

Modified: trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.cpp (277419 => 277420)


--- trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.cpp	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.cpp	2021-05-13 05:02:45 UTC (rev 277420)
@@ -59,43 +59,52 @@
 }
 #endif
 
+NotificationPermissionRequestManager::~NotificationPermissionRequestManager()
+{
 #if ENABLE(NOTIFICATIONS)
-void NotificationPermissionRequestManager::startRequest(const SecurityOriginData& securityOrigin, RefPtr<NotificationPermissionCallback>&& callback)
+    auto requestsPerOrigin = std::exchange(m_requestsPerOrigin, { });
+    for (auto& permissionHandlers : requestsPerOrigin.values())
+        callPermissionHandlersWith(permissionHandlers, Permission::Denied);
+#endif
+}
+
+#if ENABLE(NOTIFICATIONS)
+void NotificationPermissionRequestManager::startRequest(const SecurityOriginData& securityOrigin, PermissionHandler&& permissionHandler)
 {
     auto permission = permissionLevel(securityOrigin);
-    if (permission != NotificationClient::Permission::Default) {
-        if (callback)
-            callback->handleEvent(permission);
-        return;
-    }
+    if (permission != Permission::Default)
+        return permissionHandler(permission);
 
-    auto addResult = m_requestsPerOrigin.add(securityOrigin, Vector<RefPtr<WebCore::NotificationPermissionCallback>> { });
-    addResult.iterator->value.append(WTFMove(callback));
+    auto addResult = m_requestsPerOrigin.add(securityOrigin, PermissionHandlers { });
+    addResult.iterator->value.append(WTFMove(permissionHandler));
     if (!addResult.isNewEntry)
         return;
 
-    m_page->sendWithAsyncReply(Messages::WebPageProxy::RequestNotificationPermission(securityOrigin.toString()), [this, protectedThis = makeRef(*this), callback = WTFMove(callback), securityOrigin](bool allowed) mutable {
+    m_page->sendWithAsyncReply(Messages::WebPageProxy::RequestNotificationPermission(securityOrigin.toString()), [this, protectedThis = makeRef(*this), permissionHandler = WTFMove(permissionHandler), securityOrigin](bool allowed) mutable {
         WebProcess::singleton().supplement<WebNotificationManager>()->didUpdateNotificationDecision(securityOrigin.toString(), allowed);
 
-        auto callbacks = m_requestsPerOrigin.take(securityOrigin);
-        for (auto& callback : callbacks) {
-            if (callback)
-                callback->handleEvent(allowed ? NotificationClient::Permission::Granted : NotificationClient::Permission::Denied);
-        }
+        auto permissionHandlers = m_requestsPerOrigin.take(securityOrigin);
+        callPermissionHandlersWith(permissionHandlers, allowed ? Permission::Granted : Permission::Denied);
     });
 }
+
+void NotificationPermissionRequestManager::callPermissionHandlersWith(PermissionHandlers& permissionHandlers, Permission permission)
+{
+    for (auto& permissionHandler : permissionHandlers)
+        permissionHandler(permission);
+}
 #endif
 
-NotificationClient::Permission NotificationPermissionRequestManager::permissionLevel(const SecurityOriginData& securityOrigin)
+auto NotificationPermissionRequestManager::permissionLevel(const SecurityOriginData& securityOrigin) -> Permission
 {
 #if ENABLE(NOTIFICATIONS)
     if (!m_page->corePage()->settings().notificationsEnabled())
-        return NotificationClient::Permission::Denied;
+        return Permission::Denied;
     
     return WebProcess::singleton().supplement<WebNotificationManager>()->policyForOrigin(securityOrigin.toString());
 #else
     UNUSED_PARAM(securityOrigin);
-    return NotificationClient::Permission::Denied;
+    return Permission::Denied;
 #endif
 }
 

Modified: trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.h (277419 => 277420)


--- trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.h	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.h	2021-05-13 05:02:45 UTC (rev 277420)
@@ -46,12 +46,16 @@
 class NotificationPermissionRequestManager : public RefCounted<NotificationPermissionRequestManager> {
 public:
     static Ref<NotificationPermissionRequestManager> create(WebPage*);
+    ~NotificationPermissionRequestManager();
 
+    using Permission = WebCore::NotificationClient::Permission;
+    using PermissionHandler = WebCore::NotificationClient::PermissionHandler;
+
 #if ENABLE(NOTIFICATIONS)
-    void startRequest(const WebCore::SecurityOriginData&, RefPtr<WebCore::NotificationPermissionCallback>&&);
+    void startRequest(const WebCore::SecurityOriginData&, PermissionHandler&&);
 #endif
     
-    WebCore::NotificationClient::Permission permissionLevel(const WebCore::SecurityOriginData&);
+    Permission permissionLevel(const WebCore::SecurityOriginData&);
 
     // For testing purposes only.
     void setPermissionLevelForTesting(const String& originString, bool allowed);
@@ -61,7 +65,10 @@
     NotificationPermissionRequestManager(WebPage*);
 
 #if ENABLE(NOTIFICATIONS)
-    HashMap<WebCore::SecurityOriginData, Vector<RefPtr<WebCore::NotificationPermissionCallback>>> m_requestsPerOrigin;
+    using PermissionHandlers = Vector<PermissionHandler>;
+    static void callPermissionHandlersWith(PermissionHandlers&, Permission);
+
+    HashMap<WebCore::SecurityOriginData, PermissionHandlers> m_requestsPerOrigin;
     WebPage* m_page;
 #endif
 };

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.cpp (277419 => 277420)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.cpp	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.cpp	2021-05-13 05:02:45 UTC (rev 277420)
@@ -71,15 +71,12 @@
     delete this;
 }
 
-void WebNotificationClient::requestPermission(ScriptExecutionContext* context, RefPtr<NotificationPermissionCallback>&& callback)
+void WebNotificationClient::requestPermission(ScriptExecutionContext& context, PermissionHandler&& permissionHandler)
 {
-    auto* securityOrigin = context->securityOrigin();
-    if (!securityOrigin) {
-        if (callback)
-            callback->handleEvent(NotificationClient::Permission::Denied);
-        return;
-    }
-    m_page->notificationPermissionRequestManager()->startRequest(securityOrigin->data(), WTFMove(callback));
+    auto* securityOrigin = context.securityOrigin();
+    if (!securityOrigin)
+        return permissionHandler(NotificationClient::Permission::Denied);
+    m_page->notificationPermissionRequestManager()->startRequest(securityOrigin->data(), WTFMove(permissionHandler));
 }
 
 NotificationClient::Permission WebNotificationClient::checkPermission(ScriptExecutionContext* context)

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.h (277419 => 277420)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.h	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.h	2021-05-13 05:02:45 UTC (rev 277420)
@@ -31,7 +31,6 @@
 #include <WebCore/NotificationClient.h>
 
 namespace WebCore {
-class NotificationPermissionCallback;
 class ScriptExecutionContext;
 } // namespace WebCore
 
@@ -51,7 +50,7 @@
     void clearNotifications(WebCore::ScriptExecutionContext*) override;
     void notificationObjectDestroyed(WebCore::Notification*) override;
     void notificationControllerDestroyed() override;
-    void requestPermission(WebCore::ScriptExecutionContext*, RefPtr<WebCore::NotificationPermissionCallback>&&) override;
+    void requestPermission(WebCore::ScriptExecutionContext&, PermissionHandler&&) override;
     WebCore::NotificationClient::Permission checkPermission(WebCore::ScriptExecutionContext*) override;
     
     WebPage* m_page;

Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (277419 => 277420)


--- trunk/Source/WebKitLegacy/mac/ChangeLog	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,5 +1,22 @@
 2021-05-12  Chris Dumez  <[email protected]>
 
+        Notification.requestPermission() should return a Promise
+        https://bugs.webkit.org/show_bug.cgi?id=225712
+
+        Reviewed by Darin Adler.
+
+        Update code now that WebCore passes a CompletionHandler instead of a
+        NotificationPermissionCallback.
+
+        * WebCoreSupport/WebNotificationClient.h:
+        * WebCoreSupport/WebNotificationClient.mm:
+        (WebNotificationClient::requestPermission):
+        (-[WebNotificationPolicyListener initWithCompletionHandler:]):
+        (-[WebNotificationPolicyListener allow]):
+        (-[WebNotificationPolicyListener deny]):
+
+2021-05-12  Chris Dumez  <[email protected]>
+
         Queue notification permission requests for the same origin on WebKit side
         https://bugs.webkit.org/show_bug.cgi?id=225701
         <rdar://76804977>

Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.h (277419 => 277420)


--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.h	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.h	2021-05-13 05:02:45 UTC (rev 277420)
@@ -50,10 +50,10 @@
     void clearNotifications(WebCore::ScriptExecutionContext*) override;
     void notificationObjectDestroyed(WebCore::Notification*) override;
     void notificationControllerDestroyed() override;
-    void requestPermission(WebCore::ScriptExecutionContext*, RefPtr<WebCore::NotificationPermissionCallback>&&) override;
+    void requestPermission(WebCore::ScriptExecutionContext&, PermissionHandler&&) override;
     WebCore::NotificationClient::Permission checkPermission(WebCore::ScriptExecutionContext*) override;
 
-    void requestPermission(WebCore::ScriptExecutionContext*, WebNotificationPolicyListener *);
+    void requestPermission(WebCore::ScriptExecutionContext&, WebNotificationPolicyListener *);
 
     WebView *m_webView;
     HashMap<RefPtr<WebCore::Notification>, RetainPtr<WebNotification>> m_notificationMap;

Modified: trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.mm (277419 => 277420)


--- trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.mm	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.mm	2021-05-13 05:02:45 UTC (rev 277420)
@@ -33,9 +33,9 @@
 #import "WebSecurityOriginInternal.h"
 #import "WebUIDelegatePrivate.h"
 #import "WebViewInternal.h"
-#import <WebCore/NotificationPermissionCallback.h>
 #import <WebCore/ScriptExecutionContext.h>
 #import <wtf/BlockObjCExceptions.h>
+#import <wtf/CompletionHandler.h>
 #import <wtf/cocoa/VectorCocoa.h>
 
 using namespace WebCore;
@@ -42,9 +42,9 @@
 
 @interface WebNotificationPolicyListener : NSObject <WebAllowDenyPolicyListener>
 {
-    RefPtr<NotificationPermissionCallback> _callback;
+    NotificationClient::PermissionHandler _permissionHandler;
 }
-- (id)initWithCallback:(RefPtr<NotificationPermissionCallback>&&)callback;
+- (id)initWithPermissionHandler:(NotificationClient::PermissionHandler&&)permissionHandler;
 @end
 
 static uint64_t generateNotificationID()
@@ -122,7 +122,7 @@
     delete this;
 }
 
-void WebNotificationClient::requestPermission(ScriptExecutionContext* context, WebNotificationPolicyListener *listener)
+void WebNotificationClient::requestPermission(ScriptExecutionContext& context, WebNotificationPolicyListener *listener)
 {
     SEL selector = @selector(webView:decidePolicyForNotificationRequestFromOrigin:listener:);
     if (![[m_webView UIDelegate] respondsToSelector:selector])
@@ -130,15 +130,15 @@
 
     m_everRequestedPermission = true;
 
-    auto webOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:context->securityOrigin()]);
+    auto webOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:context.securityOrigin()]);
     
     CallUIDelegate(m_webView, selector, webOrigin.get(), listener);
 }
 
-void WebNotificationClient::requestPermission(ScriptExecutionContext* context, RefPtr<NotificationPermissionCallback>&& callback)
+void WebNotificationClient::requestPermission(ScriptExecutionContext& context, PermissionHandler&& permissionHandler)
 {
     BEGIN_BLOCK_OBJC_EXCEPTIONS
-    auto listener = adoptNS([[WebNotificationPolicyListener alloc] initWithCallback:WTFMove(callback)]);
+    auto listener = adoptNS([[WebNotificationPolicyListener alloc] initWithPermissionHandler:WTFMove(permissionHandler)]);
     requestPermission(context, listener.get());
     END_BLOCK_OBJC_EXCEPTIONS
 }
@@ -170,25 +170,25 @@
 
 @implementation WebNotificationPolicyListener
 
-- (id)initWithCallback:(RefPtr<NotificationPermissionCallback>&&)callback
+- (id)initWithPermissionHandler:(NotificationClient::PermissionHandler&&)permissionHandler
 {
     if (!(self = [super init]))
         return nil;
 
-    _callback = WTFMove(callback);
+    _permissionHandler = WTFMove(permissionHandler);
     return self;
 }
 
 - (void)allow
 {
-    if (_callback)
-        _callback->handleEvent(NotificationClient::Permission::Granted);
+    if (_permissionHandler)
+        _permissionHandler(NotificationClient::Permission::Granted);
 }
 
 - (void)deny
 {
-    if (_callback)
-        _callback->handleEvent(NotificationClient::Permission::Denied);
+    if (_permissionHandler)
+        _permissionHandler(NotificationClient::Permission::Denied);
 }
 
 #if PLATFORM(IOS_FAMILY)

Modified: trunk/Source/WebKitLegacy/win/ChangeLog (277419 => 277420)


--- trunk/Source/WebKitLegacy/win/ChangeLog	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKitLegacy/win/ChangeLog	2021-05-13 05:02:45 UTC (rev 277420)
@@ -1,5 +1,19 @@
 2021-05-12  Chris Dumez  <[email protected]>
 
+        Notification.requestPermission() should return a Promise
+        https://bugs.webkit.org/show_bug.cgi?id=225712
+
+        Reviewed by Darin Adler.
+
+        Update code now that WebCore passes a CompletionHandler instead of a
+        NotificationPermissionCallback.
+
+        * WebCoreSupport/WebDesktopNotificationsDelegate.cpp:
+        (WebDesktopNotificationsDelegate::requestPermission):
+        * WebCoreSupport/WebDesktopNotificationsDelegate.h:
+
+2021-05-12  Chris Dumez  <[email protected]>
+
         Queue notification permission requests for the same origin on WebKit side
         https://bugs.webkit.org/show_bug.cgi?id=225701
         <rdar://76804977>

Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.cpp (277419 => 277420)


--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.cpp	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.cpp	2021-05-13 05:02:45 UTC (rev 277420)
@@ -177,8 +177,9 @@
         notificationDelegate()->requestNotificationPermission(org);
 }
 
-void WebDesktopNotificationsDelegate::requestPermission(SecurityOrigin*, RefPtr<NotificationPermissionCallback>&&)
+void WebDesktopNotificationsDelegate::requestPermission(SecurityOrigin&, PermissionHandler&& permissionHandler)
 {
+    permissionHandler(Permission::Denied);
 }
 
 NotificationClient::Permission WebDesktopNotificationsDelegate::checkPermission(const URL& url)

Modified: trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.h (277419 => 277420)


--- trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.h	2021-05-13 03:46:57 UTC (rev 277419)
+++ trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.h	2021-05-13 05:02:45 UTC (rev 277420)
@@ -53,7 +53,7 @@
     virtual void cancel(WebCore::Notification* object);
     virtual void notificationObjectDestroyed(WebCore::Notification* object);
     virtual void notificationControllerDestroyed();
-    virtual void requestPermission(WebCore::SecurityOrigin*, RefPtr<WebCore::NotificationPermissionCallback>&&);
+    virtual void requestPermission(WebCore::SecurityOrigin&, PermissionHandler&&);
     virtual WebCore::NotificationClient::Permission checkPermission(const URL&);
 
 private:
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to