Changeset 221894 in webkit
- Timestamp:
- Sep 11, 2017, 4:54:05 PM (8 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 1 deleted
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/CMakeLists.txt
r221447 r221894 423 423 UIProcess/Network/NetworkProcessProxy.cpp 424 424 425 UIProcess/Notifications/NotificationPermissionRequest.cpp426 425 UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp 427 426 UIProcess/Notifications/WebNotification.cpp -
trunk/Source/WebKit/ChangeLog
r221887 r221894 1 2017-09-11 Alex Christensen <achristensen@webkit.org> 2 3 Make NotificationPermissionRequest work with completion handlers 4 https://bugs.webkit.org/show_bug.cgi?id=176753 5 6 Reviewed by Andy Estes. 7 8 API::UIClient::decidePolicyForNotificationPermissionRequest should take a completion handler 9 which it will eventually call with a bool representing whether notifications are allowed. 10 To do this, I make NotificationPermissionRequest just a wrapper for a lambda. 11 One subtle change in behavior is when invalidating all outstanding requests, we deny them instead 12 of just dropping them. This results in a deny message sent where there wasn't one before, 13 resulting in better cleanup in NotificationPermissionRequestManager::didReceiveNotificationPermissionDecision. 14 15 * UIProcess/API/APIUIClient.h: 16 (API::UIClient::decidePolicyForNotificationPermissionRequest): 17 * UIProcess/API/C/WKPage.cpp: 18 (WKPageSetPageUIClient): 19 * UIProcess/Notifications/NotificationPermissionRequest.cpp: Removed. 20 * UIProcess/Notifications/NotificationPermissionRequest.h: 21 (WebKit::NotificationPermissionRequest::create): 22 (WebKit::NotificationPermissionRequest::allow): 23 (WebKit::NotificationPermissionRequest::deny): 24 (WebKit::NotificationPermissionRequest::NotificationPermissionRequest): 25 * UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp: 26 (WebKit::NotificationPermissionRequestManagerProxy::invalidateRequests): 27 (WebKit::NotificationPermissionRequestManagerProxy::createRequest): 28 (WebKit::NotificationPermissionRequestManagerProxy::didReceiveNotificationPermissionDecision): Deleted. 29 * UIProcess/Notifications/NotificationPermissionRequestManagerProxy.h: 30 * UIProcess/WebPageProxy.cpp: 31 (WebKit::WebPageProxy::requestNotificationPermission): 32 * WebKit.xcodeproj/project.pbxproj: 33 1 34 2017-09-11 Alex Christensen <achristensen@webkit.org> 2 35 -
trunk/Source/WebKit/UIProcess/API/APIUIClient.h
r221887 r221894 130 130 virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; } 131 131 virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { return false; } 132 virtual bool decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy*, SecurityOrigin*, WebKit::NotificationPermissionRequest*) { return false; }132 virtual void decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy&, SecurityOrigin&, Function<void(bool)>&& completionHandler) { completionHandler(false); } 133 133 134 134 // Printing. -
trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp
r221887 r221894 1980 1980 } 1981 1981 1982 bool decidePolicyForNotificationPermissionRequest(WebPageProxy* page, API::SecurityOrigin* origin, NotificationPermissionRequest* permissionRequest) final1982 void decidePolicyForNotificationPermissionRequest(WebPageProxy& page, API::SecurityOrigin& origin, Function<void(bool)>&& completionHandler) final 1983 1983 { 1984 1984 if (!m_client.decidePolicyForNotificationPermissionRequest) 1985 return false; 1986 1987 m_client.decidePolicyForNotificationPermissionRequest(toAPI(page), toAPI(origin), toAPI(permissionRequest), m_client.base.clientInfo); 1988 return true; 1985 return completionHandler(false); 1986 1987 m_client.decidePolicyForNotificationPermissionRequest(toAPI(&page), toAPI(&origin), toAPI(NotificationPermissionRequest::create(WTFMove(completionHandler)).ptr()), m_client.base.clientInfo); 1989 1988 } 1990 1989 -
trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp
r221887 r221894 196 196 } 197 197 198 bool decidePolicyForNotificationPermissionRequest(WebPageProxy*, API::SecurityOrigin*, NotificationPermissionRequest* permissionRequest) final199 { 200 GRefPtr<WebKitNotificationPermissionRequest> notificationPermissionRequest = adoptGRef(webkitNotificationPermissionRequestCreate( permissionRequest));198 void decidePolicyForNotificationPermissionRequest(WebPageProxy&, API::SecurityOrigin&, Function<void(bool)>&& completionHandler) final 199 { 200 GRefPtr<WebKitNotificationPermissionRequest> notificationPermissionRequest = adoptGRef(webkitNotificationPermissionRequestCreate(NotificationPermissionRequest::create(WTFMove(completionHandler)).ptr())); 201 201 webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(notificationPermissionRequest.get())); 202 return true;203 202 } 204 203 -
trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.h
r204466 r221894 24 24 */ 25 25 26 #ifndef NotificationPermissionRequest_h 27 #define NotificationPermissionRequest_h 26 #pragma once 28 27 29 28 #include "APIObject.h" 29 #include <wtf/Function.h> 30 30 31 31 namespace WebKit { … … 35 35 class NotificationPermissionRequest : public API::ObjectImpl<API::Object::Type::NotificationPermissionRequest> { 36 36 public: 37 static Ref<NotificationPermissionRequest> create(NotificationPermissionRequestManagerProxy*, uint64_t notificationID); 37 static Ref<NotificationPermissionRequest> create(Function<void(bool)>&& completionHandler) 38 { 39 return adoptRef(*new NotificationPermissionRequest(WTFMove(completionHandler))); 40 } 41 42 void allow() 43 { 44 if (auto completionHandler = std::exchange(m_completionHandler, nullptr)) 45 completionHandler(true); 46 } 38 47 39 void allow(); 40 void deny(); 41 42 void invalidate(); 48 void deny() 49 { 50 if (auto completionHandler = std::exchange(m_completionHandler, nullptr)) 51 completionHandler(false); 52 } 43 53 44 54 private: 45 NotificationPermissionRequest(NotificationPermissionRequestManagerProxy*, uint64_t notificationID); 46 47 NotificationPermissionRequestManagerProxy* m_manager; 48 uint64_t m_notificationID; 55 NotificationPermissionRequest(Function<void(bool)>&& completionHandler) 56 : m_completionHandler(WTFMove(completionHandler)) 57 { } 58 59 Function<void(bool)> m_completionHandler; 49 60 }; 50 61 51 62 } // namespace WebKit 52 53 #endif // NotificationPermissionRequestProxy_h -
trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp
r216794 r221894 42 42 { 43 43 for (auto& request : m_pendingRequests.values()) 44 request-> invalidate();44 request->deny(); 45 45 46 46 m_pendingRequests.clear(); … … 49 49 Ref<NotificationPermissionRequest> NotificationPermissionRequestManagerProxy::createRequest(uint64_t notificationID) 50 50 { 51 auto request = NotificationPermissionRequest::create(this, notificationID); 51 auto request = NotificationPermissionRequest::create([notificationID, page = makeRef(m_page)](bool allowed) { 52 page->process().send(Messages::WebPage::DidReceiveNotificationPermissionDecision(notificationID, allowed), page->pageID()); 53 }); 52 54 m_pendingRequests.add(notificationID, request.ptr()); 53 55 return request; 54 56 } 55 57 56 void NotificationPermissionRequestManagerProxy::didReceiveNotificationPermissionDecision(uint64_t notificationID, bool allow)57 {58 if (!m_page.isValid())59 return;60 61 RefPtr<NotificationPermissionRequest> request = m_pendingRequests.take(notificationID);62 if (!request)63 return;64 65 m_page.process().send(Messages::WebPage::DidReceiveNotificationPermissionDecision(notificationID, allow), m_page.pageID());66 }67 68 58 } // namespace WebKit -
trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.h
r216794 r221894 24 24 */ 25 25 26 #ifndef NotificationPermissionRequestManagerProxy_h 27 #define NotificationPermissionRequestManagerProxy_h 26 #pragma once 28 27 29 28 #include "NotificationPermissionRequest.h" … … 38 37 public: 39 38 explicit NotificationPermissionRequestManagerProxy(WebPageProxy&); 40 39 41 40 void invalidateRequests(); 42 41 43 42 // Create a request to be presented to the user. 44 43 Ref<NotificationPermissionRequest> createRequest(uint64_t notificationID); 45 46 // Called by NotificationPermissionRequest when a decision is made by the user. 47 void didReceiveNotificationPermissionDecision(uint64_t notificationID, bool allow); 48 44 49 45 private: 50 46 HashMap<uint64_t, RefPtr<NotificationPermissionRequest>> m_pendingRequests; … … 53 49 54 50 } // namespace WebKit 55 56 #endif // NotificationPermissionRequestManagerProxy_h -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r221887 r221894 5904 5904 auto request = m_notificationPermissionRequestManager.createRequest(requestID); 5905 5905 5906 if (!m_uiClient->decidePolicyForNotificationPermissionRequest(this, origin.ptr(), request.ptr())) 5907 request->deny(); 5906 m_uiClient->decidePolicyForNotificationPermissionRequest(*this, origin.get(), [request = WTFMove(request)](bool allowed) { 5907 if (allowed) 5908 request->allow(); 5909 else 5910 request->deny(); 5911 }); 5908 5912 } 5909 5913 -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r221669 r221894 749 749 31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31A2EC4F1489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp */; }; 750 750 31A2EC521489981900810D71 /* NotificationPermissionRequestManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC511489981500810D71 /* NotificationPermissionRequestManagerProxy.h */; }; 751 31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */; };752 751 31A2EC5614899C0900810D71 /* NotificationPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC531489982500810D71 /* NotificationPermissionRequest.h */; }; 753 752 31A2EC74148D59CA00810D71 /* WKNotificationPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC72148D59BB00810D71 /* WKNotificationPermissionRequest.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 3028 3027 31A2EC511489981500810D71 /* NotificationPermissionRequestManagerProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationPermissionRequestManagerProxy.h; sourceTree = "<group>"; }; 3029 3028 31A2EC531489982500810D71 /* NotificationPermissionRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationPermissionRequest.h; sourceTree = "<group>"; }; 3030 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotificationPermissionRequest.cpp; sourceTree = "<group>"; };3031 3029 31A2EC72148D59BB00810D71 /* WKNotificationPermissionRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKNotificationPermissionRequest.h; sourceTree = "<group>"; }; 3032 3030 31A2EC75148D65BB00810D71 /* WKNotificationPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKNotificationPermissionRequest.cpp; sourceTree = "<group>"; }; … … 5612 5610 isa = PBXGroup; 5613 5611 children = ( 5614 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */,5615 5612 31A2EC531489982500810D71 /* NotificationPermissionRequest.h */, 5616 5613 31A2EC4F1489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp */, … … 10205 10202 5C0B17811E7C8C2600E9123C /* NetworkSocketStream.cpp in Sources */, 10206 10203 5C0B17781E7C880E00E9123C /* NetworkSocketStreamMessageReceiver.cpp in Sources */, 10207 31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */,10208 10204 3131261E148FF82C00BA2A39 /* NotificationPermissionRequestManager.cpp in Sources */, 10209 10205 31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */,
Note:
See TracChangeset
for help on using the changeset viewer.