Changeset 221894 in webkit


Ignore:
Timestamp:
Sep 11, 2017 4:54:05 PM (7 years ago)
Author:
achristensen@apple.com
Message:

Make NotificationPermissionRequest work with completion handlers
https://bugs.webkit.org/show_bug.cgi?id=176753

Reviewed by Andy Estes.

API::UIClient::decidePolicyForNotificationPermissionRequest should take a completion handler
which it will eventually call with a bool representing whether notifications are allowed.
To do this, I make NotificationPermissionRequest just a wrapper for a lambda.
One subtle change in behavior is when invalidating all outstanding requests, we deny them instead
of just dropping them. This results in a deny message sent where there wasn't one before,
resulting in better cleanup in NotificationPermissionRequestManager::didReceiveNotificationPermissionDecision.

  • UIProcess/API/APIUIClient.h:

(API::UIClient::decidePolicyForNotificationPermissionRequest):

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageUIClient):

  • UIProcess/Notifications/NotificationPermissionRequest.cpp: Removed.
  • UIProcess/Notifications/NotificationPermissionRequest.h:

(WebKit::NotificationPermissionRequest::create):
(WebKit::NotificationPermissionRequest::allow):
(WebKit::NotificationPermissionRequest::deny):
(WebKit::NotificationPermissionRequest::NotificationPermissionRequest):

  • UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp:

(WebKit::NotificationPermissionRequestManagerProxy::invalidateRequests):
(WebKit::NotificationPermissionRequestManagerProxy::createRequest):
(WebKit::NotificationPermissionRequestManagerProxy::didReceiveNotificationPermissionDecision): Deleted.

  • UIProcess/Notifications/NotificationPermissionRequestManagerProxy.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::requestNotificationPermission):

  • WebKit.xcodeproj/project.pbxproj:
Location:
trunk/Source/WebKit
Files:
1 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/CMakeLists.txt

    r221447 r221894  
    423423    UIProcess/Network/NetworkProcessProxy.cpp
    424424
    425     UIProcess/Notifications/NotificationPermissionRequest.cpp
    426425    UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp
    427426    UIProcess/Notifications/WebNotification.cpp
  • trunk/Source/WebKit/ChangeLog

    r221887 r221894  
     12017-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
    1342017-09-11  Alex Christensen  <achristensen@webkit.org>
    235
  • trunk/Source/WebKit/UIProcess/API/APIUIClient.h

    r221887 r221894  
    130130    virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; }
    131131    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); }
    133133
    134134    // Printing.
  • trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp

    r221887 r221894  
    19801980        }
    19811981       
    1982         bool decidePolicyForNotificationPermissionRequest(WebPageProxy* page, API::SecurityOrigin* origin, NotificationPermissionRequest* permissionRequest) final
     1982        void decidePolicyForNotificationPermissionRequest(WebPageProxy& page, API::SecurityOrigin& origin, Function<void(bool)>&& completionHandler) final
    19831983        {
    19841984            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);
    19891988        }
    19901989
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp

    r221887 r221894  
    196196    }
    197197
    198     bool decidePolicyForNotificationPermissionRequest(WebPageProxy*, API::SecurityOrigin*, NotificationPermissionRequest* permissionRequest) final
    199     {
    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()));
    201201        webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(notificationPermissionRequest.get()));
    202         return true;
    203202    }
    204203
  • trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.h

    r204466 r221894  
    2424 */
    2525
    26 #ifndef NotificationPermissionRequest_h
    27 #define NotificationPermissionRequest_h
     26#pragma once
    2827
    2928#include "APIObject.h"
     29#include <wtf/Function.h>
    3030
    3131namespace WebKit {
     
    3535class NotificationPermissionRequest : public API::ObjectImpl<API::Object::Type::NotificationPermissionRequest> {
    3636public:
    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    }
    3847
    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    }
    4353
    4454private:
    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;
    4960};
    5061
    5162} // namespace WebKit
    52 
    53 #endif // NotificationPermissionRequestProxy_h
  • trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp

    r216794 r221894  
    4242{
    4343    for (auto& request : m_pendingRequests.values())
    44         request->invalidate();
     44        request->deny();
    4545
    4646    m_pendingRequests.clear();
     
    4949Ref<NotificationPermissionRequest> NotificationPermissionRequestManagerProxy::createRequest(uint64_t notificationID)
    5050{
    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    });
    5254    m_pendingRequests.add(notificationID, request.ptr());
    5355    return request;
    5456}
    5557
    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 
    6858} // namespace WebKit
  • trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.h

    r216794 r221894  
    2424 */
    2525
    26 #ifndef NotificationPermissionRequestManagerProxy_h
    27 #define NotificationPermissionRequestManagerProxy_h
     26#pragma once
    2827
    2928#include "NotificationPermissionRequest.h"
     
    3837public:
    3938    explicit NotificationPermissionRequestManagerProxy(WebPageProxy&);
    40    
     39
    4140    void invalidateRequests();
    42    
     41
    4342    // Create a request to be presented to the user.
    4443    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
    4945private:
    5046    HashMap<uint64_t, RefPtr<NotificationPermissionRequest>> m_pendingRequests;
     
    5349
    5450} // namespace WebKit
    55 
    56 #endif // NotificationPermissionRequestManagerProxy_h
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r221887 r221894  
    59045904    auto request = m_notificationPermissionRequestManager.createRequest(requestID);
    59055905   
    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    });
    59085912}
    59095913
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r221669 r221894  
    749749                31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31A2EC4F1489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp */; };
    750750                31A2EC521489981900810D71 /* NotificationPermissionRequestManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC511489981500810D71 /* NotificationPermissionRequestManagerProxy.h */; };
    751                 31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */; };
    752751                31A2EC5614899C0900810D71 /* NotificationPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC531489982500810D71 /* NotificationPermissionRequest.h */; };
    753752                31A2EC74148D59CA00810D71 /* WKNotificationPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC72148D59BB00810D71 /* WKNotificationPermissionRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    30283027                31A2EC511489981500810D71 /* NotificationPermissionRequestManagerProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationPermissionRequestManagerProxy.h; sourceTree = "<group>"; };
    30293028                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>"; };
    30313029                31A2EC72148D59BB00810D71 /* WKNotificationPermissionRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKNotificationPermissionRequest.h; sourceTree = "<group>"; };
    30323030                31A2EC75148D65BB00810D71 /* WKNotificationPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKNotificationPermissionRequest.cpp; sourceTree = "<group>"; };
     
    56125610                        isa = PBXGroup;
    56135611                        children = (
    5614                                 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */,
    56155612                                31A2EC531489982500810D71 /* NotificationPermissionRequest.h */,
    56165613                                31A2EC4F1489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp */,
     
    1020510202                                5C0B17811E7C8C2600E9123C /* NetworkSocketStream.cpp in Sources */,
    1020610203                                5C0B17781E7C880E00E9123C /* NetworkSocketStreamMessageReceiver.cpp in Sources */,
    10207                                 31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */,
    1020810204                                3131261E148FF82C00BA2A39 /* NotificationPermissionRequestManager.cpp in Sources */,
    1020910205                                31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.