Diff
Modified: trunk/Source/WebKit/CMakeLists.txt (221893 => 221894)
--- trunk/Source/WebKit/CMakeLists.txt 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/CMakeLists.txt 2017-09-11 23:54:05 UTC (rev 221894)
@@ -422,7 +422,6 @@
UIProcess/Network/NetworkProcessProxy.cpp
- UIProcess/Notifications/NotificationPermissionRequest.cpp
UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp
UIProcess/Notifications/WebNotification.cpp
UIProcess/Notifications/WebNotificationManagerProxy.cpp
Modified: trunk/Source/WebKit/ChangeLog (221893 => 221894)
--- trunk/Source/WebKit/ChangeLog 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/ChangeLog 2017-09-11 23:54:05 UTC (rev 221894)
@@ -1,5 +1,38 @@
2017-09-11 Alex Christensen <[email protected]>
+ 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:
+
+2017-09-11 Alex Christensen <[email protected]>
+
Modernize and make API::UIClient more asynchronous
https://bugs.webkit.org/show_bug.cgi?id=176583
Modified: trunk/Source/WebKit/UIProcess/API/APIUIClient.h (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/API/APIUIClient.h 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/API/APIUIClient.h 2017-09-11 23:54:05 UTC (rev 221894)
@@ -129,7 +129,7 @@
virtual void decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, Function<void(bool)>&) { }
virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; }
virtual bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) { return false; }
- virtual bool decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy*, SecurityOrigin*, WebKit::NotificationPermissionRequest*) { return false; }
+ virtual void decidePolicyForNotificationPermissionRequest(WebKit::WebPageProxy&, SecurityOrigin&, Function<void(bool)>&& completionHandler) { completionHandler(false); }
// Printing.
virtual float headerHeight(WebKit::WebPageProxy&, WebKit::WebFrameProxy&) { return 0; }
Modified: trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp 2017-09-11 23:54:05 UTC (rev 221894)
@@ -1979,13 +1979,12 @@
return true;
}
- bool decidePolicyForNotificationPermissionRequest(WebPageProxy* page, API::SecurityOrigin* origin, NotificationPermissionRequest* permissionRequest) final
+ void decidePolicyForNotificationPermissionRequest(WebPageProxy& page, API::SecurityOrigin& origin, Function<void(bool)>&& completionHandler) final
{
if (!m_client.decidePolicyForNotificationPermissionRequest)
- return false;
+ return completionHandler(false);
- m_client.decidePolicyForNotificationPermissionRequest(toAPI(page), toAPI(origin), toAPI(permissionRequest), m_client.base.clientInfo);
- return true;
+ m_client.decidePolicyForNotificationPermissionRequest(toAPI(&page), toAPI(&origin), toAPI(NotificationPermissionRequest::create(WTFMove(completionHandler)).ptr()), m_client.base.clientInfo);
}
// Printing.
Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp 2017-09-11 23:54:05 UTC (rev 221894)
@@ -195,11 +195,10 @@
return true;
}
- bool decidePolicyForNotificationPermissionRequest(WebPageProxy*, API::SecurityOrigin*, NotificationPermissionRequest* permissionRequest) final
+ void decidePolicyForNotificationPermissionRequest(WebPageProxy&, API::SecurityOrigin&, Function<void(bool)>&& completionHandler) final
{
- GRefPtr<WebKitNotificationPermissionRequest> notificationPermissionRequest = adoptGRef(webkitNotificationPermissionRequestCreate(permissionRequest));
+ GRefPtr<WebKitNotificationPermissionRequest> notificationPermissionRequest = adoptGRef(webkitNotificationPermissionRequestCreate(NotificationPermissionRequest::create(WTFMove(completionHandler)).ptr()));
webkitWebViewMakePermissionRequest(m_webView, WEBKIT_PERMISSION_REQUEST(notificationPermissionRequest.get()));
- return true;
}
#if PLATFORM(GTK)
Deleted: trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.cpp (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.cpp 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.cpp 2017-09-11 23:54:05 UTC (rev 221894)
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2011 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "NotificationPermissionRequest.h"
-
-#include "NotificationPermissionRequestManagerProxy.h"
-
-namespace WebKit {
-
-Ref<NotificationPermissionRequest> NotificationPermissionRequest::create(WebKit::NotificationPermissionRequestManagerProxy *manager, uint64_t notificationID)
-{
- return adoptRef(*new NotificationPermissionRequest(manager, notificationID));
-}
-
-NotificationPermissionRequest::NotificationPermissionRequest(NotificationPermissionRequestManagerProxy* manager, uint64_t notificationID)
- : m_manager(manager)
- , m_notificationID(notificationID)
-{
-}
-
-void NotificationPermissionRequest::allow()
-{
- if (!m_manager)
- return;
-
- m_manager->didReceiveNotificationPermissionDecision(m_notificationID, true);
- m_manager = 0;
-}
-
-void NotificationPermissionRequest::deny()
-{
- if (!m_manager)
- return;
-
- m_manager->didReceiveNotificationPermissionDecision(m_notificationID, false);
- m_manager = 0;
-}
-
-void NotificationPermissionRequest::invalidate()
-{
- m_manager = 0;
-}
-
-} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.h (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.h 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequest.h 2017-09-11 23:54:05 UTC (rev 221894)
@@ -23,10 +23,10 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef NotificationPermissionRequest_h
-#define NotificationPermissionRequest_h
+#pragma once
#include "APIObject.h"
+#include <wtf/Function.h>
namespace WebKit {
@@ -34,20 +34,29 @@
class NotificationPermissionRequest : public API::ObjectImpl<API::Object::Type::NotificationPermissionRequest> {
public:
- static Ref<NotificationPermissionRequest> create(NotificationPermissionRequestManagerProxy*, uint64_t notificationID);
+ static Ref<NotificationPermissionRequest> create(Function<void(bool)>&& completionHandler)
+ {
+ return adoptRef(*new NotificationPermissionRequest(WTFMove(completionHandler)));
+ }
+
+ void allow()
+ {
+ if (auto completionHandler = std::exchange(m_completionHandler, nullptr))
+ completionHandler(true);
+ }
- void allow();
- void deny();
+ void deny()
+ {
+ if (auto completionHandler = std::exchange(m_completionHandler, nullptr))
+ completionHandler(false);
+ }
- void invalidate();
-
private:
- NotificationPermissionRequest(NotificationPermissionRequestManagerProxy*, uint64_t notificationID);
-
- NotificationPermissionRequestManagerProxy* m_manager;
- uint64_t m_notificationID;
+ NotificationPermissionRequest(Function<void(bool)>&& completionHandler)
+ : m_completionHandler(WTFMove(completionHandler))
+ { }
+
+ Function<void(bool)> m_completionHandler;
};
} // namespace WebKit
-
-#endif // NotificationPermissionRequestProxy_h
Modified: trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.cpp 2017-09-11 23:54:05 UTC (rev 221894)
@@ -41,7 +41,7 @@
void NotificationPermissionRequestManagerProxy::invalidateRequests()
{
for (auto& request : m_pendingRequests.values())
- request->invalidate();
+ request->deny();
m_pendingRequests.clear();
}
@@ -48,21 +48,11 @@
Ref<NotificationPermissionRequest> NotificationPermissionRequestManagerProxy::createRequest(uint64_t notificationID)
{
- auto request = NotificationPermissionRequest::create(this, notificationID);
+ auto request = NotificationPermissionRequest::create([notificationID, page = makeRef(m_page)](bool allowed) {
+ page->process().send(Messages::WebPage::DidReceiveNotificationPermissionDecision(notificationID, allowed), page->pageID());
+ });
m_pendingRequests.add(notificationID, request.ptr());
return request;
}
-void NotificationPermissionRequestManagerProxy::didReceiveNotificationPermissionDecision(uint64_t notificationID, bool allow)
-{
- if (!m_page.isValid())
- return;
-
- RefPtr<NotificationPermissionRequest> request = m_pendingRequests.take(notificationID);
- if (!request)
- return;
-
- m_page.process().send(Messages::WebPage::DidReceiveNotificationPermissionDecision(notificationID, allow), m_page.pageID());
-}
-
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.h (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.h 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/Notifications/NotificationPermissionRequestManagerProxy.h 2017-09-11 23:54:05 UTC (rev 221894)
@@ -23,8 +23,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef NotificationPermissionRequestManagerProxy_h
-#define NotificationPermissionRequestManagerProxy_h
+#pragma once
#include "NotificationPermissionRequest.h"
#include <wtf/HashMap.h>
@@ -37,15 +36,12 @@
class NotificationPermissionRequestManagerProxy {
public:
explicit NotificationPermissionRequestManagerProxy(WebPageProxy&);
-
+
void invalidateRequests();
-
+
// Create a request to be presented to the user.
Ref<NotificationPermissionRequest> createRequest(uint64_t notificationID);
-
- // Called by NotificationPermissionRequest when a decision is made by the user.
- void didReceiveNotificationPermissionDecision(uint64_t notificationID, bool allow);
-
+
private:
HashMap<uint64_t, RefPtr<NotificationPermissionRequest>> m_pendingRequests;
WebPageProxy& m_page;
@@ -52,5 +48,3 @@
};
} // namespace WebKit
-
-#endif // NotificationPermissionRequestManagerProxy_h
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (221893 => 221894)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2017-09-11 23:54:05 UTC (rev 221894)
@@ -5903,8 +5903,12 @@
auto origin = API::SecurityOrigin::createFromString(originString);
auto request = m_notificationPermissionRequestManager.createRequest(requestID);
- if (!m_uiClient->decidePolicyForNotificationPermissionRequest(this, origin.ptr(), request.ptr()))
- request->deny();
+ m_uiClient->decidePolicyForNotificationPermissionRequest(*this, origin.get(), [request = WTFMove(request)](bool allowed) {
+ if (allowed)
+ request->allow();
+ else
+ request->deny();
+ });
}
void WebPageProxy::showNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, WebCore::NotificationDirection dir, const String& originString, uint64_t notificationID)
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (221893 => 221894)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2017-09-11 23:34:03 UTC (rev 221893)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2017-09-11 23:54:05 UTC (rev 221894)
@@ -748,7 +748,6 @@
31A2EC4E148997C200810D71 /* WebNotificationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC47148997C100810D71 /* WebNotificationProvider.h */; };
31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31A2EC4F1489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp */; };
31A2EC521489981900810D71 /* NotificationPermissionRequestManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC511489981500810D71 /* NotificationPermissionRequestManagerProxy.h */; };
- 31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */; };
31A2EC5614899C0900810D71 /* NotificationPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC531489982500810D71 /* NotificationPermissionRequest.h */; };
31A2EC74148D59CA00810D71 /* WKNotificationPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 31A2EC72148D59BB00810D71 /* WKNotificationPermissionRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
31A2EC77148D662E00810D71 /* WKNotificationPermissionRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31A2EC75148D65BB00810D71 /* WKNotificationPermissionRequest.cpp */; };
@@ -3027,7 +3026,6 @@
31A2EC4F1489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotificationPermissionRequestManagerProxy.cpp; sourceTree = "<group>"; };
31A2EC511489981500810D71 /* NotificationPermissionRequestManagerProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationPermissionRequestManagerProxy.h; sourceTree = "<group>"; };
31A2EC531489982500810D71 /* NotificationPermissionRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationPermissionRequest.h; sourceTree = "<group>"; };
- 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NotificationPermissionRequest.cpp; sourceTree = "<group>"; };
31A2EC72148D59BB00810D71 /* WKNotificationPermissionRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKNotificationPermissionRequest.h; sourceTree = "<group>"; };
31A2EC75148D65BB00810D71 /* WKNotificationPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKNotificationPermissionRequest.cpp; sourceTree = "<group>"; };
31A505F71680025500A930EB /* WebContextClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebContextClient.cpp; sourceTree = "<group>"; };
@@ -5611,7 +5609,6 @@
31A2EC401489973700810D71 /* Notifications */ = {
isa = PBXGroup;
children = (
- 31A2EC541489982E00810D71 /* NotificationPermissionRequest.cpp */,
31A2EC531489982500810D71 /* NotificationPermissionRequest.h */,
31A2EC4F1489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp */,
31A2EC511489981500810D71 /* NotificationPermissionRequestManagerProxy.h */,
@@ -10204,7 +10201,6 @@
5C20CB9D1BB0DCFA00895BB1 /* NetworkSessionCocoa.mm in Sources */,
5C0B17811E7C8C2600E9123C /* NetworkSocketStream.cpp in Sources */,
5C0B17781E7C880E00E9123C /* NetworkSocketStreamMessageReceiver.cpp in Sources */,
- 31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */,
3131261E148FF82C00BA2A39 /* NotificationPermissionRequestManager.cpp in Sources */,
31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */,
1A2D848C127F6A49001EB962 /* NPIdentifierData.cpp in Sources */,