Changeset 277376 in webkit
- Timestamp:
- May 12, 2021, 10:52:38 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 17 edited
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/notifications/NotificationClient.h (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.cpp (modified) (4 diffs)
-
Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.h (modified) (4 diffs)
-
Source/WebKit/WebProcess/Notifications/WebNotificationManager.cpp (modified) (2 diffs)
-
Source/WebKit/WebProcess/Notifications/WebNotificationManager.h (modified) (1 diff)
-
Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.h (modified) (1 diff)
-
Source/WebKitLegacy/mac/ChangeLog (modified) (1 diff)
-
Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.h (modified) (1 diff)
-
Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.mm (modified) (1 diff)
-
Source/WebKitLegacy/win/ChangeLog (modified) (1 diff)
-
Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.cpp (modified) (1 diff)
-
Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.h (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (modified) (4 diffs)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/NotificationAPI.mm (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r277373 r277376 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Queue notification permission requests for the same origin on WebKit side 4 https://bugs.webkit.org/show_bug.cgi?id=225701 5 <rdar://76804977> 6 7 Reviewed by Geoffrey Garen. 8 9 Remove some dead code. 10 11 * Modules/notifications/NotificationClient.h: 12 1 13 2021-05-12 Ryosuke Niwa <rniwa@webkit.org> 2 14 -
trunk/Source/WebCore/Modules/notifications/NotificationClient.h
r223728 r277376 69 69 virtual void requestPermission(ScriptExecutionContext*, RefPtr<NotificationPermissionCallback>&&) = 0; 70 70 71 virtual bool hasPendingPermissionRequests(ScriptExecutionContext*) const = 0;72 73 // Cancel all outstanding requests for the ScriptExecutionContext74 virtual void cancelRequestsForPermission(ScriptExecutionContext*) = 0;75 76 71 // Checks the current level of permission. 77 72 virtual Permission checkPermission(ScriptExecutionContext*) = 0; -
trunk/Source/WebKit/ChangeLog
r277375 r277376 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Queue notification permission requests for the same origin on WebKit side 4 https://bugs.webkit.org/show_bug.cgi?id=225701 5 <rdar://76804977> 6 7 Reviewed by Geoffrey Garen. 8 9 If there are parallel notification permission requests for the same origin, we now queue them on WebKit 10 side and only ask the client once for the origin. Once we've received the permission from the client, 11 we respond to all JS requests at this point. 12 13 This patch also removes some dead code to facilitate refactoring the code to support this. 14 In a follow-up I am planning to use sendWithAsyncReply() and refactor this code further. 15 16 * WebProcess/Notifications/NotificationPermissionRequestManager.cpp: 17 (WebKit::NotificationPermissionRequestManager::startRequest): 18 (WebKit::NotificationPermissionRequestManager::permissionLevel): 19 (WebKit::NotificationPermissionRequestManager::didReceiveNotificationPermissionDecision): 20 * WebProcess/Notifications/NotificationPermissionRequestManager.h: 21 * WebProcess/Notifications/WebNotificationManager.cpp: 22 (WebKit::WebNotificationManager::policyForOrigin const): 23 * WebProcess/Notifications/WebNotificationManager.h: 24 * WebProcess/WebCoreSupport/WebNotificationClient.cpp: 25 (WebKit::WebNotificationClient::requestPermission): 26 (WebKit::WebNotificationClient::checkPermission): 27 * WebProcess/WebCoreSupport/WebNotificationClient.h: 28 1 29 2021-05-12 Julian Gonzalez <julian_a_gonzalez@apple.com> 2 30 -
trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.cpp
r235205 r277376 69 69 70 70 #if ENABLE(NOTIFICATIONS) 71 void NotificationPermissionRequestManager::startRequest( SecurityOrigin* origin, RefPtr<NotificationPermissionCallback>&& callback)71 void NotificationPermissionRequestManager::startRequest(const SecurityOriginData& securityOrigin, RefPtr<NotificationPermissionCallback>&& callback) 72 72 { 73 auto permission = permissionLevel( origin);73 auto permission = permissionLevel(securityOrigin); 74 74 if (permission != NotificationClient::Permission::Default) { 75 75 if (callback) … … 78 78 } 79 79 80 auto addResult = m_requestsPerOrigin.add(securityOrigin, Vector<RefPtr<WebCore::NotificationPermissionCallback>> { }); 81 addResult.iterator->value.append(WTFMove(callback)); 82 if (!addResult.isNewEntry) 83 return; 84 80 85 uint64_t requestID = generateRequestID(); 81 m_ originToIDMap.set(origin, requestID);82 m_idToOriginMap.set(requestID, origin); 83 m_idToCallbackMap.set(requestID, WTFMove(callback));84 m_page->send(Messages::WebPageProxy::RequestNotificationPermission(requestID, origin->toString()));86 m_idToOriginMap.set(requestID, securityOrigin); 87 88 // FIXME: This should use sendWithAsyncReply(). 89 m_page->send(Messages::WebPageProxy::RequestNotificationPermission(requestID, securityOrigin.toString())); 85 90 } 86 91 #endif 87 92 88 void NotificationPermissionRequestManager::cancelRequest(SecurityOrigin* origin) 89 { 90 #if ENABLE(NOTIFICATIONS) 91 uint64_t id = m_originToIDMap.take(origin); 92 if (!id) 93 return; 94 95 m_idToOriginMap.remove(id); 96 m_idToCallbackMap.remove(id); 97 #else 98 UNUSED_PARAM(origin); 99 #endif 100 } 101 102 bool NotificationPermissionRequestManager::hasPendingPermissionRequests(SecurityOrigin* origin) const 103 { 104 #if ENABLE(NOTIFICATIONS) 105 return m_originToIDMap.contains(origin); 106 #else 107 UNUSED_PARAM(origin); 108 return false; 109 #endif 110 } 111 112 NotificationClient::Permission NotificationPermissionRequestManager::permissionLevel(SecurityOrigin* securityOrigin) 93 NotificationClient::Permission NotificationPermissionRequestManager::permissionLevel(const SecurityOriginData& securityOrigin) 113 94 { 114 95 #if ENABLE(NOTIFICATIONS) … … 116 97 return NotificationClient::Permission::Denied; 117 98 118 return WebProcess::singleton().supplement<WebNotificationManager>()->policyForOrigin(securityOrigin );99 return WebProcess::singleton().supplement<WebNotificationManager>()->policyForOrigin(securityOrigin.toString()); 119 100 #else 120 101 UNUSED_PARAM(securityOrigin); … … 146 127 return; 147 128 148 RefPtr<WebCore::SecurityOrigin>origin = m_idToOriginMap.take(requestID);149 if ( !origin)129 auto origin = m_idToOriginMap.take(requestID); 130 if (origin.isEmpty()) 150 131 return; 151 132 152 m_originToIDMap.remove(origin);133 WebProcess::singleton().supplement<WebNotificationManager>()->didUpdateNotificationDecision(origin.toString(), allowed); 153 134 154 WebProcess::singleton().supplement<WebNotificationManager>()->didUpdateNotificationDecision(origin->toString(), allowed); 155 156 RefPtr<NotificationPermissionCallback> callback = m_idToCallbackMap.take(requestID); 157 if (!callback) 158 return; 159 160 callback->handleEvent(allowed ? NotificationClient::Permission::Granted : NotificationClient::Permission::Denied); 135 auto callbacks = m_requestsPerOrigin.take(origin); 136 for (auto& callback : callbacks) { 137 if (!callback) 138 return; 139 callback->handleEvent(allowed ? NotificationClient::Permission::Granted : NotificationClient::Permission::Denied); 140 } 161 141 #else 162 142 UNUSED_PARAM(requestID); -
trunk/Source/WebKit/WebProcess/Notifications/NotificationPermissionRequestManager.h
r272784 r277376 29 29 #include <WebCore/NotificationClient.h> 30 30 #include <WebCore/NotificationPermissionCallback.h> 31 #include <WebCore/SecurityOrigin Hash.h>31 #include <WebCore/SecurityOriginData.h> 32 32 #include <wtf/HashMap.h> 33 33 #include <wtf/RefCounted.h> … … 36 36 37 37 namespace WebCore { 38 class Notification; 39 class SecurityOrigin; 38 class Notification; 40 39 } 41 40 … … 50 49 51 50 #if ENABLE(NOTIFICATIONS) 52 void startRequest( WebCore::SecurityOrigin*, RefPtr<WebCore::NotificationPermissionCallback>&&);51 void startRequest(const WebCore::SecurityOriginData&, RefPtr<WebCore::NotificationPermissionCallback>&&); 53 52 #endif 54 void cancelRequest(WebCore::SecurityOrigin*);55 bool hasPendingPermissionRequests(WebCore::SecurityOrigin*) const;56 53 57 WebCore::NotificationClient::Permission permissionLevel( WebCore::SecurityOrigin*);54 WebCore::NotificationClient::Permission permissionLevel(const WebCore::SecurityOriginData&); 58 55 59 56 // For testing purposes only. … … 67 64 68 65 #if ENABLE(NOTIFICATIONS) 69 HashMap<uint64_t, RefPtr<WebCore::NotificationPermissionCallback>> m_idToCallbackMap; 70 #endif 71 HashMap<RefPtr<WebCore::SecurityOrigin>, uint64_t> m_originToIDMap; 72 HashMap<uint64_t, RefPtr<WebCore::SecurityOrigin>> m_idToOriginMap; 73 74 #if ENABLE(NOTIFICATIONS) 66 HashMap<WebCore::SecurityOriginData, Vector<RefPtr<WebCore::NotificationPermissionCallback>>> m_requestsPerOrigin; 67 HashMap<uint64_t, WebCore::SecurityOriginData> m_idToOriginMap; 75 68 WebPage* m_page; 76 69 #endif -
trunk/Source/WebKit/WebProcess/Notifications/WebNotificationManager.cpp
r276108 r277376 102 102 } 103 103 104 NotificationClient::Permission WebNotificationManager::policyForOrigin(WebCore::SecurityOrigin* origin) const 105 { 106 #if ENABLE(NOTIFICATIONS) 107 if (!origin) 108 return NotificationClient::Permission::Default; 109 110 ASSERT(!origin->isUnique()); 111 112 auto originString = origin->toRawString(); 113 if (!decltype(m_permissionsMap)::isValidKey(originString)) 104 NotificationClient::Permission WebNotificationManager::policyForOrigin(const String& originString) const 105 { 106 #if ENABLE(NOTIFICATIONS) 107 if (!originString) 114 108 return NotificationClient::Permission::Default; 115 109 … … 118 112 return it->value ? NotificationClient::Permission::Granted : NotificationClient::Permission::Denied; 119 113 #else 120 UNUSED_PARAM(origin );114 UNUSED_PARAM(originString); 121 115 #endif 122 116 -
trunk/Source/WebKit/WebProcess/Notifications/WebNotificationManager.h
r248762 r277376 63 63 64 64 // Looks in local cache for permission. If not found, returns DefaultDenied. 65 WebCore::NotificationClient::Permission policyForOrigin( WebCore::SecurityOrigin*) const;65 WebCore::NotificationClient::Permission policyForOrigin(const String& originString) const; 66 66 67 67 void removeAllPermissionsForTesting(); -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.cpp
r235205 r277376 74 74 void WebNotificationClient::requestPermission(ScriptExecutionContext* context, RefPtr<NotificationPermissionCallback>&& callback) 75 75 { 76 m_page->notificationPermissionRequestManager()->startRequest(context->securityOrigin(), WTFMove(callback)); 77 } 78 79 bool WebNotificationClient::hasPendingPermissionRequests(ScriptExecutionContext* context) const 80 { 81 return m_page->notificationPermissionRequestManager()->hasPendingPermissionRequests(context->securityOrigin()); 82 } 83 84 void WebNotificationClient::cancelRequestsForPermission(ScriptExecutionContext* context) 85 { 86 m_page->notificationPermissionRequestManager()->cancelRequest(context->securityOrigin()); 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)); 87 83 } 88 84 89 85 NotificationClient::Permission WebNotificationClient::checkPermission(ScriptExecutionContext* context) 90 86 { 91 if (!context || !context->isDocument() )87 if (!context || !context->isDocument() || !context->securityOrigin()) 92 88 return NotificationClient::Permission::Denied; 93 return m_page->notificationPermissionRequestManager()->permissionLevel(context->securityOrigin() );89 return m_page->notificationPermissionRequestManager()->permissionLevel(context->securityOrigin()->data()); 94 90 } 95 91 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebNotificationClient.h
r272784 r277376 53 53 void notificationControllerDestroyed() override; 54 54 void requestPermission(WebCore::ScriptExecutionContext*, RefPtr<WebCore::NotificationPermissionCallback>&&) override; 55 void cancelRequestsForPermission(WebCore::ScriptExecutionContext*) override;56 bool hasPendingPermissionRequests(WebCore::ScriptExecutionContext*) const override;57 55 WebCore::NotificationClient::Permission checkPermission(WebCore::ScriptExecutionContext*) override; 58 56 -
trunk/Source/WebKitLegacy/mac/ChangeLog
r277295 r277376 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Queue notification permission requests for the same origin on WebKit side 4 https://bugs.webkit.org/show_bug.cgi?id=225701 5 <rdar://76804977> 6 7 Reviewed by Geoffrey Garen. 8 9 Remove some dead code. 10 11 * WebCoreSupport/WebNotificationClient.h: 12 * WebCoreSupport/WebNotificationClient.mm: 13 1 14 2021-05-10 Wenson Hsieh <wenson_hsieh@apple.com> 2 15 -
trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.h
r248762 r277376 52 52 void notificationControllerDestroyed() override; 53 53 void requestPermission(WebCore::ScriptExecutionContext*, RefPtr<WebCore::NotificationPermissionCallback>&&) override; 54 void cancelRequestsForPermission(WebCore::ScriptExecutionContext*) override { }55 bool hasPendingPermissionRequests(WebCore::ScriptExecutionContext*) const override;56 54 WebCore::NotificationClient::Permission checkPermission(WebCore::ScriptExecutionContext*) override; 57 55 -
trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebNotificationClient.mm
r272789 r277376 136 136 } 137 137 138 bool WebNotificationClient::hasPendingPermissionRequests(ScriptExecutionContext*) const139 {140 // We know permission was requested but we don't know if the client responded. In this case, we play it141 // safe and presume there is one pending so that ActiveDOMObjects don't get suspended.142 return m_everRequestedPermission;143 }144 145 138 void WebNotificationClient::requestPermission(ScriptExecutionContext* context, RefPtr<NotificationPermissionCallback>&& callback) 146 139 { -
trunk/Source/WebKitLegacy/win/ChangeLog
r277357 r277376 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Queue notification permission requests for the same origin on WebKit side 4 https://bugs.webkit.org/show_bug.cgi?id=225701 5 <rdar://76804977> 6 7 Reviewed by Geoffrey Garen. 8 9 Remove some dead code. 10 11 * WebCoreSupport/WebDesktopNotificationsDelegate.cpp: 12 * WebCoreSupport/WebDesktopNotificationsDelegate.h: 13 1 14 2021-05-11 Chris Dumez <cdumez@apple.com> 2 15 -
trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.cpp
r238771 r277376 182 182 } 183 183 184 void WebDesktopNotificationsDelegate::cancelRequestsForPermission(ScriptExecutionContext* context)185 {186 }187 188 bool hasPendingPermissionRequests(ScriptExecutionContext*) const189 {190 // We can safely return false here because our implementation for requestPermission() never calls191 // the completion callback.192 return false;193 }194 195 184 NotificationClient::Permission WebDesktopNotificationsDelegate::checkPermission(const URL& url) 196 185 { -
trunk/Source/WebKitLegacy/win/WebCoreSupport/WebDesktopNotificationsDelegate.h
r254836 r277376 55 55 virtual void notificationControllerDestroyed(); 56 56 virtual void requestPermission(WebCore::SecurityOrigin*, RefPtr<WebCore::NotificationPermissionCallback>&&); 57 bool hasPendingPermissionRequests(WebCore::ScriptExecutionContext*) const override;58 virtual void cancelRequestsForPermission(WebCore::ScriptExecutionContext*);59 57 virtual WebCore::NotificationClient::Permission checkPermission(const URL&); 60 58 -
trunk/Tools/ChangeLog
r277357 r277376 1 2021-05-12 Chris Dumez <cdumez@apple.com> 2 3 Queue notification permission requests for the same origin on WebKit side 4 https://bugs.webkit.org/show_bug.cgi?id=225701 5 <rdar://76804977> 6 7 Reviewed by Geoffrey Garen. 8 9 Add API test coverage. 10 11 * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: 12 * TestWebKitAPI/Tests/WebKitCocoa/NotificationAPI.mm: Added. 13 (-[NotificationPermissionMessageHandler userContentController:didReceiveScriptMessage:]): 14 (-[NotificationPermissionUIDelegate initWithHandler:]): 15 (-[NotificationPermissionUIDelegate _webView:requestNotificationPermissionForSecurityOrigin:decisionHandler:]): 16 (TestWebKitAPI::runRequestPermissionTest): 17 (TestWebKitAPI::TEST): 18 (TestWebKitAPI::runParallelPermissionRequestsTest): 19 1 20 2021-05-11 Chris Dumez <cdumez@apple.com> 2 21 -
trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r277356 r277376 273 273 46A44A5425A7830300F61E16 /* webaudio-createMediaElementSource.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 46A44A5325A782DD00F61E16 /* webaudio-createMediaElementSource.html */; }; 274 274 46A46A1A2575645600A1B118 /* SessionStorage.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46A46A192575645600A1B118 /* SessionStorage.mm */; }; 275 46A80F26264C29D400EEF20D /* NotificationAPI.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46A80F25264C29D400EEF20D /* NotificationAPI.mm */; }; 275 276 46A911592108E6780078D40D /* CustomUserAgent.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46A911582108E66B0078D40D /* CustomUserAgent.mm */; }; 276 277 46BBEA1B25F9835700D4987A /* WorkQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7AA6A1511AAC0B31002B2ED3 /* WorkQueue.cpp */; }; … … 2081 2082 46A44A5325A782DD00F61E16 /* webaudio-createMediaElementSource.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "webaudio-createMediaElementSource.html"; sourceTree = "<group>"; }; 2082 2083 46A46A192575645600A1B118 /* SessionStorage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SessionStorage.mm; sourceTree = "<group>"; }; 2084 46A80F25264C29D400EEF20D /* NotificationAPI.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NotificationAPI.mm; sourceTree = "<group>"; }; 2083 2085 46A911582108E66B0078D40D /* CustomUserAgent.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CustomUserAgent.mm; sourceTree = "<group>"; }; 2084 2086 46C1EA9725758805005E409E /* alert.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = alert.html; sourceTree = "<group>"; }; … … 3482 3484 5C8BC798218CF3E900813886 /* NetworkProcess.mm */, 3483 3485 5CAE4637201937CD0051610F /* NetworkProcessCrashNonPersistentDataStore.mm */, 3486 46A80F25264C29D400EEF20D /* NotificationAPI.mm */, 3484 3487 CDCFFEC022E268D500DF4223 /* NoPauseWhenSwitchingTabs.mm */, 3485 3488 CD2D0D19213465560018C784 /* NowPlaying.mm */, … … 5450 5453 CDE77D2525A6591C00D4115E /* FullscreenPointerLeave.mm in Sources */, 5451 5454 CDDC7C6925FFF6D000224278 /* FullscreenRemoveNodeBeforeEnter.mm in Sources */, 5455 46A80F26264C29D400EEF20D /* NotificationAPI.mm in Sources */, 5452 5456 CDBFCC451A9FF45300A7B691 /* FullscreenZoomInitialFrame.mm in Sources */, 5453 5457 83DB79691EF63B3C00BFA5E5 /* Function.cpp in Sources */,
Note:
See TracChangeset
for help on using the changeset viewer.