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: