Changeset 277420 in webkit
- Timestamp:
- May 12, 2021, 10:02:45 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 2 deleted
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r277419 r277420 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Notification.requestPermission() should return a Promise 4 https://bugs.webkit.org/show_bug.cgi?id=225712 5 6 Reviewed by Darin Adler. 7 8 * http/tests/notifications/notification-in-non-secure-context-expected.txt: 9 Rebaseline test now that we log an error message in the JS console when trying to call 10 Notification.requestPermission() in a non-secure context. 11 12 * http/tests/notifications/request-with-promise-expected.txt: Added. 13 * http/tests/notifications/request-with-promise.html: Added. 14 Add layout test coverage. 15 1 16 2021-05-12 Diego Pino Garcia <dpino@igalia.com> 2 17 -
trunk/LayoutTests/http/tests/notifications/notification-in-non-secure-context-expected.txt
r267644 r277420 1 CONSOLE MESSAGE: The Notification permission may only be requested in a secure context. 2 CONSOLE MESSAGE: The Notification permission may only be requested in a secure context. 1 3 2 4 PASS Notification permission in insecure context -
trunk/LayoutTests/imported/w3c/ChangeLog
r277391 r277420 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Notification.requestPermission() should return a Promise 4 https://bugs.webkit.org/show_bug.cgi?id=225712 5 6 Reviewed by Darin Adler. 7 8 Drop manual test that should not have been imported from WPT. The test happened to be using Notification.requestPermission() 9 internally. 10 11 * web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https-expected.txt: Removed. 12 * web-platform-tests/service-workers/service-worker/fetch-event-within-sw-manual.https.html: Removed. 13 1 14 2021-05-12 Ziran Sun <zsun@igalia.com> 2 15 -
trunk/Source/WebCore/ChangeLog
r277418 r277420 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Notification.requestPermission() should return a Promise 4 https://bugs.webkit.org/show_bug.cgi?id=225712 5 6 Reviewed by Darin Adler. 7 8 Notification.requestPermission() should return a Promise as per the specification: 9 - https://notifications.spec.whatwg.org/#notification 10 11 Both Firefox and Chrome already support this. 12 13 Test: http/tests/notifications/request-with-promise.html 14 15 * Modules/notifications/Notification.cpp: 16 (WebCore::Notification::requestPermission): 17 * Modules/notifications/Notification.h: 18 * Modules/notifications/Notification.idl: 19 * Modules/notifications/NotificationClient.h: 20 1 21 2021-05-12 Fujii Hironori <Hironori.Fujii@sony.com> 2 22 -
trunk/Source/WebCore/Modules/notifications/Notification.cpp
r260576 r277420 39 39 #include "Event.h" 40 40 #include "EventNames.h" 41 #include "JSDOMPromiseDeferred.h" 41 42 #include "NotificationClient.h" 42 43 #include "NotificationController.h" … … 44 45 #include "WindowEventLoop.h" 45 46 #include "WindowFocusAllowedIndicator.h" 47 #include <wtf/CompletionHandler.h> 46 48 #include <wtf/IsoMallocInlines.h> 47 49 … … 185 187 } 186 188 187 void Notification::requestPermission(Document& document, RefPtr<NotificationPermissionCallback>&& callback) 188 { 189 void Notification::requestPermission(Document& document, RefPtr<NotificationPermissionCallback>&& callback, Ref<DeferredPromise>&& promise) 190 { 191 auto resolvePromiseAndCallback = [document = makeRef(document), callback = WTFMove(callback), promise = WTFMove(promise)](Permission permission) mutable { 192 document->eventLoop().queueTask(TaskSource::DOMManipulation, [callback = WTFMove(callback), promise = WTFMove(promise), permission]() mutable { 193 if (callback) 194 callback->handleEvent(permission); 195 promise->resolve<IDLEnumeration<NotificationPermission>>(permission); 196 }); 197 }; 198 189 199 auto* page = document.page(); 190 200 if (!page) 191 return ;201 return resolvePromiseAndCallback(Permission::Denied); 192 202 193 203 if (!document.isSecureContext()) { 194 if (callback) { 195 document.eventLoop().queueTask(TaskSource::DOMManipulation, [callback = WTFMove(callback)]() mutable { 196 callback->handleEvent(Permission::Denied); 197 }); 198 } 199 return; 200 } 201 202 NotificationController::from(page)->client().requestPermission(&document, WTFMove(callback)); 204 document.addConsoleMessage(MessageSource::Security, MessageLevel::Error, "The Notification permission may only be requested in a secure context."_s); 205 return resolvePromiseAndCallback(Permission::Denied); 206 } 207 208 NotificationController::from(page)->client().requestPermission(document, WTFMove(resolvePromiseAndCallback)); 203 209 } 204 210 -
trunk/Source/WebCore/Modules/notifications/Notification.h
r260576 r277420 43 43 namespace WebCore { 44 44 45 class DeferredPromise; 45 46 class Document; 46 47 class NotificationPermissionCallback; … … 83 84 84 85 static Permission permission(Document&); 85 static void requestPermission(Document&, RefPtr<NotificationPermissionCallback>&& );86 static void requestPermission(Document&, RefPtr<NotificationPermissionCallback>&&, Ref<DeferredPromise>&&); 86 87 87 88 ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); } -
trunk/Source/WebCore/Modules/notifications/Notification.idl
r267813 r277420 41 41 42 42 [CallWith=Document] static readonly attribute NotificationPermission permission; 43 [CallWith=Document] static undefined requestPermission(optional NotificationPermissionCallback? deprecatedCallback); // FIXME: This should return a Promise<NotificationPermission>.43 [CallWith=Document] static Promise<NotificationPermission> requestPermission(optional NotificationPermissionCallback? deprecatedCallback); 44 44 45 45 // static readonly attribute unsigned long maxActions; -
trunk/Source/WebCore/Modules/notifications/NotificationClient.h
r277376 r277420 45 45 public: 46 46 using Permission = NotificationPermission; 47 using PermissionHandler = CompletionHandler<void(Permission)>; 47 48 48 49 // Requests that a notification be shown. … … 67 68 // script context. The callback parameter should be run when the user has 68 69 // made a decision. 69 virtual void requestPermission(ScriptExecutionContext *, RefPtr<NotificationPermissionCallback>&&) = 0;70 virtual void requestPermission(ScriptExecutionContext&, PermissionHandler&&) = 0; 70 71 71 72 // Checks the current level of permission. -
trunk/Source/WebKit/ChangeLog
r277417 r277420 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Notification.requestPermission() should return a Promise 4 https://bugs.webkit.org/show_bug.cgi?id=225712 5 6 Reviewed by Darin Adler. 7 8 Update code now that WebCore passes a CompletionHandler instead of a 9 NotificationPermissionCallback. 10 11 * WebProcess/Notifications/NotificationPermissionRequestManager.cpp: 12 (WebKit::NotificationPermissionRequestManager::~NotificationPermissionRequestManager): 13 (WebKit::NotificationPermissionRequestManager::startRequest): 14 * WebProcess/Notifications/NotificationPermissionRequestManager.h: 15 * WebProcess/WebCoreSupport/WebNotificationClient.cpp: 16 (WebKit::WebNotificationClient::requestPermission): 17 * WebProcess/WebCoreSupport/WebNotificationClient.h: 18 1 19 2021-05-12 Fujii Hironori <Hironori.Fujii@sony.com> 2 20 -
trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.cpp
r277414 r277420 60 60 #endif 61 61 62 NotificationPermissionRequestManager::~NotificationPermissionRequestManager() 63 { 62 64 #if ENABLE(NOTIFICATIONS) 63 void NotificationPermissionRequestManager::startRequest(const SecurityOriginData& securityOrigin, RefPtr<NotificationPermissionCallback>&& callback) 65 auto requestsPerOrigin = std::exchange(m_requestsPerOrigin, { }); 66 for (auto& permissionHandlers : requestsPerOrigin.values()) 67 callPermissionHandlersWith(permissionHandlers, Permission::Denied); 68 #endif 69 } 70 71 #if ENABLE(NOTIFICATIONS) 72 void NotificationPermissionRequestManager::startRequest(const SecurityOriginData& securityOrigin, PermissionHandler&& permissionHandler) 64 73 { 65 74 auto permission = permissionLevel(securityOrigin); 66 if (permission != NotificationClient::Permission::Default) { 67 if (callback) 68 callback->handleEvent(permission); 69 return; 70 } 75 if (permission != Permission::Default) 76 return permissionHandler(permission); 71 77 72 auto addResult = m_requestsPerOrigin.add(securityOrigin, Vector<RefPtr<WebCore::NotificationPermissionCallback>>{ });73 addResult.iterator->value.append(WTFMove( callback));78 auto addResult = m_requestsPerOrigin.add(securityOrigin, PermissionHandlers { }); 79 addResult.iterator->value.append(WTFMove(permissionHandler)); 74 80 if (!addResult.isNewEntry) 75 81 return; 76 82 77 m_page->sendWithAsyncReply(Messages::WebPageProxy::RequestNotificationPermission(securityOrigin.toString()), [this, protectedThis = makeRef(*this), callback = WTFMove(callback), securityOrigin](bool allowed) mutable {83 m_page->sendWithAsyncReply(Messages::WebPageProxy::RequestNotificationPermission(securityOrigin.toString()), [this, protectedThis = makeRef(*this), permissionHandler = WTFMove(permissionHandler), securityOrigin](bool allowed) mutable { 78 84 WebProcess::singleton().supplement<WebNotificationManager>()->didUpdateNotificationDecision(securityOrigin.toString(), allowed); 79 85 80 auto callbacks = m_requestsPerOrigin.take(securityOrigin); 81 for (auto& callback : callbacks) { 82 if (callback) 83 callback->handleEvent(allowed ? NotificationClient::Permission::Granted : NotificationClient::Permission::Denied); 84 } 86 auto permissionHandlers = m_requestsPerOrigin.take(securityOrigin); 87 callPermissionHandlersWith(permissionHandlers, allowed ? Permission::Granted : Permission::Denied); 85 88 }); 89 } 90 91 void NotificationPermissionRequestManager::callPermissionHandlersWith(PermissionHandlers& permissionHandlers, Permission permission) 92 { 93 for (auto& permissionHandler : permissionHandlers) 94 permissionHandler(permission); 86 95 } 87 96 #endif 88 97 89 NotificationClient::Permission NotificationPermissionRequestManager::permissionLevel(const SecurityOriginData& securityOrigin) 98 auto NotificationPermissionRequestManager::permissionLevel(const SecurityOriginData& securityOrigin) -> Permission 90 99 { 91 100 #if ENABLE(NOTIFICATIONS) 92 101 if (!m_page->corePage()->settings().notificationsEnabled()) 93 return NotificationClient::Permission::Denied;102 return Permission::Denied; 94 103 95 104 return WebProcess::singleton().supplement<WebNotificationManager>()->policyForOrigin(securityOrigin.toString()); 96 105 #else 97 106 UNUSED_PARAM(securityOrigin); 98 return NotificationClient::Permission::Denied;107 return Permission::Denied; 99 108 #endif 100 109 } -
trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.h
r277414 r277420 47 47 public: 48 48 static Ref<NotificationPermissionRequestManager> create(WebPage*); 49 ~NotificationPermissionRequestManager(); 50 51 using Permission = WebCore::NotificationClient::Permission; 52 using PermissionHandler = WebCore::NotificationClient::PermissionHandler; 49 53 50 54 #if ENABLE(NOTIFICATIONS) 51 void startRequest(const WebCore::SecurityOriginData&, RefPtr<WebCore::NotificationPermissionCallback>&&);55 void startRequest(const WebCore::SecurityOriginData&, PermissionHandler&&); 52 56 #endif 53 57 54 WebCore::NotificationClient::Permission permissionLevel(const WebCore::SecurityOriginData&);58 Permission permissionLevel(const WebCore::SecurityOriginData&); 55 59 56 60 // For testing purposes only. … … 62 66 63 67 #if ENABLE(NOTIFICATIONS) 64 HashMap<WebCore::SecurityOriginData, Vector<RefPtr<WebCore::NotificationPermissionCallback>>> m_requestsPerOrigin; 68 using PermissionHandlers = Vector<PermissionHandler>; 69 static void callPermissionHandlersWith(PermissionHandlers&, Permission); 70 71 HashMap<WebCore::SecurityOriginData, PermissionHandlers> m_requestsPerOrigin; 65 72 WebPage* m_page; 66 73 #endif -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.cpp
r277376 r277420 72 72 } 73 73 74 void WebNotificationClient::requestPermission(ScriptExecutionContext * context, RefPtr<NotificationPermissionCallback>&& callback)74 void WebNotificationClient::requestPermission(ScriptExecutionContext& context, PermissionHandler&& permissionHandler) 75 75 { 76 auto* securityOrigin = context->securityOrigin(); 77 if (!securityOrigin) { 78 if (callback) 79 callback->handleEvent(NotificationClient::Permission::Denied); 80 return; 81 } 82 m_page->notificationPermissionRequestManager()->startRequest(securityOrigin->data(), WTFMove(callback)); 76 auto* securityOrigin = context.securityOrigin(); 77 if (!securityOrigin) 78 return permissionHandler(NotificationClient::Permission::Denied); 79 m_page->notificationPermissionRequestManager()->startRequest(securityOrigin->data(), WTFMove(permissionHandler)); 83 80 } 84 81 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.h
r277376 r277420 32 32 33 33 namespace WebCore { 34 class NotificationPermissionCallback;35 34 class ScriptExecutionContext; 36 35 } // namespace WebCore … … 52 51 void notificationObjectDestroyed(WebCore::Notification*) override; 53 52 void notificationControllerDestroyed() override; 54 void requestPermission(WebCore::ScriptExecutionContext *, RefPtr<WebCore::NotificationPermissionCallback>&&) override;53 void requestPermission(WebCore::ScriptExecutionContext&, PermissionHandler&&) override; 55 54 WebCore::NotificationClient::Permission checkPermission(WebCore::ScriptExecutionContext*) override; 56 55 -
trunk/Source/WebKitLegacy/mac/ChangeLog
r277376 r277420 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Notification.requestPermission() should return a Promise 4 https://bugs.webkit.org/show_bug.cgi?id=225712 5 6 Reviewed by Darin Adler. 7 8 Update code now that WebCore passes a CompletionHandler instead of a 9 NotificationPermissionCallback. 10 11 * WebCoreSupport/WebNotificationClient.h: 12 * WebCoreSupport/WebNotificationClient.mm: 13 (WebNotificationClient::requestPermission): 14 (-[WebNotificationPolicyListener initWithCompletionHandler:]): 15 (-[WebNotificationPolicyListener allow]): 16 (-[WebNotificationPolicyListener deny]): 17 1 18 2021-05-12 Chris Dumez <cdumez@apple.com> 2 19 -
trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.h
r277376 r277420 51 51 void notificationObjectDestroyed(WebCore::Notification*) override; 52 52 void notificationControllerDestroyed() override; 53 void requestPermission(WebCore::ScriptExecutionContext *, RefPtr<WebCore::NotificationPermissionCallback>&&) override;53 void requestPermission(WebCore::ScriptExecutionContext&, PermissionHandler&&) override; 54 54 WebCore::NotificationClient::Permission checkPermission(WebCore::ScriptExecutionContext*) override; 55 55 56 void requestPermission(WebCore::ScriptExecutionContext *, WebNotificationPolicyListener *);56 void requestPermission(WebCore::ScriptExecutionContext&, WebNotificationPolicyListener *); 57 57 58 58 WebView *m_webView; -
trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.mm
r277376 r277420 34 34 #import "WebUIDelegatePrivate.h" 35 35 #import "WebViewInternal.h" 36 #import <WebCore/NotificationPermissionCallback.h>37 36 #import <WebCore/ScriptExecutionContext.h> 38 37 #import <wtf/BlockObjCExceptions.h> 38 #import <wtf/CompletionHandler.h> 39 39 #import <wtf/cocoa/VectorCocoa.h> 40 40 … … 43 43 @interface WebNotificationPolicyListener : NSObject <WebAllowDenyPolicyListener> 44 44 { 45 RefPtr<NotificationPermissionCallback> _callback;46 } 47 - (id)initWith Callback:(RefPtr<NotificationPermissionCallback>&&)callback;45 NotificationClient::PermissionHandler _permissionHandler; 46 } 47 - (id)initWithPermissionHandler:(NotificationClient::PermissionHandler&&)permissionHandler; 48 48 @end 49 49 … … 123 123 } 124 124 125 void WebNotificationClient::requestPermission(ScriptExecutionContext *context, WebNotificationPolicyListener *listener)125 void WebNotificationClient::requestPermission(ScriptExecutionContext& context, WebNotificationPolicyListener *listener) 126 126 { 127 127 SEL selector = @selector(webView:decidePolicyForNotificationRequestFromOrigin:listener:); … … 131 131 m_everRequestedPermission = true; 132 132 133 auto webOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:context ->securityOrigin()]);133 auto webOrigin = adoptNS([[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:context.securityOrigin()]); 134 134 135 135 CallUIDelegate(m_webView, selector, webOrigin.get(), listener); 136 136 } 137 137 138 void WebNotificationClient::requestPermission(ScriptExecutionContext * context, RefPtr<NotificationPermissionCallback>&& callback)138 void WebNotificationClient::requestPermission(ScriptExecutionContext& context, PermissionHandler&& permissionHandler) 139 139 { 140 140 BEGIN_BLOCK_OBJC_EXCEPTIONS 141 auto listener = adoptNS([[WebNotificationPolicyListener alloc] initWith Callback:WTFMove(callback)]);141 auto listener = adoptNS([[WebNotificationPolicyListener alloc] initWithPermissionHandler:WTFMove(permissionHandler)]); 142 142 requestPermission(context, listener.get()); 143 143 END_BLOCK_OBJC_EXCEPTIONS … … 171 171 @implementation WebNotificationPolicyListener 172 172 173 - (id)initWith Callback:(RefPtr<NotificationPermissionCallback>&&)callback173 - (id)initWithPermissionHandler:(NotificationClient::PermissionHandler&&)permissionHandler 174 174 { 175 175 if (!(self = [super init])) 176 176 return nil; 177 177 178 _ callback = WTFMove(callback);178 _permissionHandler = WTFMove(permissionHandler); 179 179 return self; 180 180 } … … 182 182 - (void)allow 183 183 { 184 if (_ callback)185 _ callback->handleEvent(NotificationClient::Permission::Granted);184 if (_permissionHandler) 185 _permissionHandler(NotificationClient::Permission::Granted); 186 186 } 187 187 188 188 - (void)deny 189 189 { 190 if (_ callback)191 _ callback->handleEvent(NotificationClient::Permission::Denied);190 if (_permissionHandler) 191 _permissionHandler(NotificationClient::Permission::Denied); 192 192 } 193 193 -
trunk/Source/WebKitLegacy/win/ChangeLog
r277376 r277420 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Notification.requestPermission() should return a Promise 4 https://bugs.webkit.org/show_bug.cgi?id=225712 5 6 Reviewed by Darin Adler. 7 8 Update code now that WebCore passes a CompletionHandler instead of a 9 NotificationPermissionCallback. 10 11 * WebCoreSupport/WebDesktopNotificationsDelegate.cpp: 12 (WebDesktopNotificationsDelegate::requestPermission): 13 * WebCoreSupport/WebDesktopNotificationsDelegate.h: 14 1 15 2021-05-12 Chris Dumez <cdumez@apple.com> 2 16 -
trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.cpp
r277376 r277420 178 178 } 179 179 180 void WebDesktopNotificationsDelegate::requestPermission(SecurityOrigin*, RefPtr<NotificationPermissionCallback>&&) 181 { 180 void WebDesktopNotificationsDelegate::requestPermission(SecurityOrigin&, PermissionHandler&& permissionHandler) 181 { 182 permissionHandler(Permission::Denied); 182 183 } 183 184 -
trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.h
r277376 r277420 54 54 virtual void notificationObjectDestroyed(WebCore::Notification* object); 55 55 virtual void notificationControllerDestroyed(); 56 virtual void requestPermission(WebCore::SecurityOrigin *, RefPtr<WebCore::NotificationPermissionCallback>&&);56 virtual void requestPermission(WebCore::SecurityOrigin&, PermissionHandler&&); 57 57 virtual WebCore::NotificationClient::Permission checkPermission(const URL&); 58 58
Note:
See TracChangeset
for help on using the changeset viewer.