https://bugs.webkit.org/show_bug.cgi?id=250135
Reviewed by Timothy Hatcher.
This patch implements the permissions.request() API. This includes delegating the action of requesting
permissions from the users to the browsers. Once that action has been fulfilled and the user grants
all requested permissions, we add them to the extension's granted permissions and match pattern sets.
* Source/WebKit/Platform/cocoa/CocoaHelpers.h:
* Source/WebKit/Platform/cocoa/CocoaHelpers.mm:
(WebKit::toAPI): Helper method to convert from HashSet<String> to NSSet<String>.
(WebKit::toAPIArray):Helper method to convert from HashSet<String> to NSArray<String>.
* Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionControllerDelegate.h:
Define the delegate methods used to prompt users to grant permissions.
* Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIEventCocoa.mm:
Remove unnecessary file import.
* Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIPermissionsCocoa.mm:
(WebKit::WebExtensionContext::permissionsContains):
(WebKit::WebExtensionContext::permissionsRequest):
Call delegate methods to determine if permissions should be granted.
(WebKit::WebExtensionContext::permissionsRemove):
(WebKit::WebExtensionContext::firePermissionsEventListenerIfNecessary):
Fire permissions onAdded or onRemoved events if permissions are granted or removed.
(WebKit::WebExtensionContext::parseMatchPatterns): Deleted.
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:
(WebKit::WebExtensionContext::postAsyncNotification):
Call firePermissionsEventListenerIfNecessary whenever a notification is posted for a change in an
extension's permissions.
(WebKit::WebExtensionContext::hasPermissions):
(WebKit::WebExtensionContext::wakeUpBackgroundContentIfNecessaryToFireEvents):
`fireEvents` isn’t an accurate name for this method since it doesn’t actually fire any events.
We should rename this to better describe what’s happening in this method
(WebKit::WebExtensionContext::fireEvents): Deleted.
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionControllerCocoa.mm:
(WebKit::WebExtensionController::didStartProvisionalLoadForFrame):
(WebKit::WebExtensionController::didCommitLoadForFrame):
(WebKit::WebExtensionController::didFinishLoadForFrame):
(WebKit::WebExtensionController::didFailLoadForFrame):
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionMatchPatternCocoa.mm:
(WebKit::WebExtensionMatchPattern::matchPatternStrings):
(WebKit::WebExtensionMatchPattern::matchPatternsForOrigins):
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.h:
* Source/WebKit/UIProcess/Extensions/WebExtensionMatchPattern.h:
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIPermissionsCocoa.mm:
Validate permissions details for these APIs.
(WebKit::WebExtensionAPIPermissions::contains):
(WebKit::WebExtensionAPIPermissions::request):
(WebKit::WebExtensionAPIPermissions::remove):
(WebKit::WebExtensionAPIPermissions::verifyRequestedPermissions):
(WebKit::WebExtensionAPIPermissions::onAdded):
(WebKit::WebExtensionAPIPermissions::onRemoved):
Pass in the WebExtensionEventListenerType when creating these events.
* Source/WebKit/WebProcess/Extensions/Cocoa/WebExtensionContextProxyCocoa.mm:
(WebKit::WebExtensionContextProxy::dispatchPermissionsEvent):
Enumerate through the namespace objects and invoke the listeners for the event listener.
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h:
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.messages.in:
* Tools/TestWebKitAPI/SourcesCocoa.txt:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPIPermissions.mm: Added.
(TestWebKitAPI::runScriptWithUserGesture):
(TestWebKitAPI::TEST):
Add WebKit tests for Permissions API.
* Tools/TestWebKitAPI/cocoa/TestWebExtensionsDelegate.h:
Copied from Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionControllerDelegate.h.
* Tools/TestWebKitAPI/cocoa/TestWebExtensionsDelegate.mm:
Copied from Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.messages.in.
(-[TestWebExtensionsDelegate
webExtensionController:promptForPermissions:inTab:forExtensionContext:completionHandler:]):
(-[TestWebExtensionsDelegate
webExtensionController:promptForPermissionMatchPatterns:inTab:forExtensionContext:completionHandler:]):
Canonical link: https://commits.webkit.org/260370@main