haikuwebkit/Tools/MobileMiniBrowser/MobileMiniBrowser
Sihui Liu 6b4f73913e Implement basic permission check for SpeechRecognition
https://bugs.webkit.org/show_bug.cgi?id=218476
<rdar://problem/71222638>

Reviewed by Youenn Fablet.

Source/WebCore:

Tests: fast/speechrecognition/permission-error.html
       fast/speechrecognition/start-recognition-in-removed-iframe.html

* Modules/speech/SpeechRecognition.cpp:
(WebCore::SpeechRecognition::startRecognition):
* Modules/speech/SpeechRecognitionConnection.h:
* Modules/speech/SpeechRecognitionRequest.cpp:
(WebCore::SpeechRecognitionRequest::create): Deleted.
* Modules/speech/SpeechRecognitionRequest.h:
(WebCore::SpeechRecognitionRequest::clientOrigin const):
* Modules/speech/SpeechRecognitionRequestInfo.h:
(WebCore::SpeechRecognitionRequestInfo::encode const):
(WebCore::SpeechRecognitionRequestInfo::decode):
* Modules/speech/SpeechRecognitionUpdate.cpp:
(WebCore::SpeechRecognitionUpdate::create):
(WebCore::SpeechRecognitionUpdate::error const):
(WebCore::SpeechRecognitionUpdate::result const):
* Modules/speech/SpeechRecognitionUpdate.h:
* page/DummySpeechRecognitionProvider.h:

Source/WebKit:

Introduce SpeechRecognitionPermissionManager, which checks and requests speech recognition permissions before
we actually start capturing audio and perform recognition. SpeechRecognitionPermissionManager is per-page, like
SpeechRecognitionServer. The checks include:
1. Sandbox requirement for microphone
2. TCC check for microphone
3. TCC check for SFSpeechRecognizer
4. User permission on speech recognition for origin

Add a delegate function for requesting user permission. By default, user permission is not granted.

API test: WebKit2.SpeechRecognitionUserPermissionPersistence

* Headers.cmake:
* Shared/API/APIObject.h:
* Shared/API/c/WKBase.h:
* Sources.txt:
* SourcesCocoa.txt:
* UIProcess/API/APIUIClient.h:
(API::UIClient::decidePolicyForSpeechRecognitionPermissionRequest):
* UIProcess/API/C/WKAPICast.h:
* UIProcess/API/C/WKPage.cpp:
(WKPageSetPageUIClient):
* UIProcess/API/C/WKPageUIClient.h:
* UIProcess/API/C/WKSpeechRecognitionPermissionCallback.cpp: Added.
(WKSpeechRecognitionPermissionCallbackGetTypeID):
(WKSpeechRecognitionPermissionCallbackComplete):
* UIProcess/API/C/WKSpeechRecognitionPermissionCallback.h: Added.
* UIProcess/API/Cocoa/WKPreferences.mm:
(-[WKPreferences _speechRecognitionEnabled]):
(-[WKPreferences _setSpeechRecognitionEnabled:]):
* UIProcess/API/Cocoa/WKPreferencesPrivate.h:
* UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
* UIProcess/Cocoa/MediaPermissionUtilities.mm: Added.
(WebKit::checkSandboxRequirementForType):
(WebKit::checkUsageDescriptionStringForType):
(WebKit::checkUsageDescriptionStringForSpeechRecognition):
(WebKit::requestAVCaptureAccessForType):
(WebKit::checkAVCaptureAccessForType):
(WebKit::requestSpeechRecognitionAccess):
(WebKit::checkSpeechRecognitionServiceAccess):
* UIProcess/Cocoa/UIDelegate.h:
* UIProcess/Cocoa/UIDelegate.mm:
(WebKit::UIDelegate::UIClient::decidePolicyForSpeechRecognitionPermissionRequest):
* UIProcess/Cocoa/UserMediaPermissionRequestManagerProxy.mm:
(WebKit::UserMediaPermissionRequestManagerProxy::permittedToCaptureAudio):
(WebKit::UserMediaPermissionRequestManagerProxy::permittedToCaptureVideo):
(WebKit::UserMediaPermissionRequestManagerProxy::requestSystemValidation):
(WebKit::requestAVCaptureAccessForMediaType): Deleted.
* UIProcess/Cocoa/WebProcessProxyCocoa.mm:
* UIProcess/MediaPermissionUtilities.h: Copied from Added.
* UIProcess/SpeechRecognitionPermissionManager.cpp: Added.
(WebKit::computeMicrophoneAccess):
(WebKit::computeSpeechRecognitionServiceAccess):
(WebKit::SpeechRecognitionPermissionManager::SpeechRecognitionPermissionManager):
(WebKit::SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager):
(WebKit::SpeechRecognitionPermissionManager::request):
(WebKit::SpeechRecognitionPermissionManager::startNextRequest):
(WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
(WebKit::SpeechRecognitionPermissionManager::continueProcessingRequest):
(WebKit::SpeechRecognitionPermissionManager::completeCurrentRequest):
(WebKit::SpeechRecognitionPermissionManager::requestSpeechRecognitionServiceAccess):
(WebKit::SpeechRecognitionPermissionManager::requestMicrophoneAccess):
(WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
* UIProcess/SpeechRecognitionPermissionManager.h: Added.
* UIProcess/SpeechRecognitionPermissionRequest.h: Added.
(WebKit::SpeechRecognitionPermissionRequest::create):
(WebKit::SpeechRecognitionPermissionRequest::complete):
(WebKit::SpeechRecognitionPermissionRequest::origin const):
(WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
(WebKit::SpeechRecognitionPermissionCallback::create):
(WebKit::SpeechRecognitionPermissionCallback::complete):
(WebKit::SpeechRecognitionPermissionCallback::SpeechRecognitionPermissionCallback):
* UIProcess/SpeechRecognitionServer.cpp:
(WebKit::SpeechRecognitionServer::SpeechRecognitionServer):
(WebKit::SpeechRecognitionServer::start):
(WebKit::SpeechRecognitionServer::requestPermissionForRequest):
(WebKit::SpeechRecognitionServer::stop):
(WebKit::SpeechRecognitionServer::abort):
(WebKit::SpeechRecognitionServer::invalidate):
(WebKit::SpeechRecognitionServer::handleRequest):
(WebKit::SpeechRecognitionServer::stopRequest):
(WebKit::SpeechRecognitionServer::abortRequest):
(WebKit::SpeechRecognitionServer::sendUpdate):
(WebKit::SpeechRecognitionServer::processNextPendingRequestIfNeeded): Deleted.
(WebKit::SpeechRecognitionServer::removePendingRequest): Deleted.
(WebKit::SpeechRecognitionServer::startPocessingRequest): Deleted.
(WebKit::SpeechRecognitionServer::stopProcessingRequest): Deleted.
* UIProcess/SpeechRecognitionServer.h:
* UIProcess/SpeechRecognitionServer.messages.in:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didChangeMainDocument):
(WebKit::WebPageProxy::resetState):
(WebKit::WebPageProxy::requestSpeechRecognitionPermission):
* UIProcess/WebPageProxy.h:
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::createSpeechRecognitionServer):
* WebKit.xcodeproj/project.pbxproj:
* WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp:
(WebKit::WebSpeechRecognitionConnection::start):
(WebKit::WebSpeechRecognitionConnection::didReceiveUpdate):
* WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h:

Source/WTF:

* wtf/PlatformHave.h:

Tools:

* MiniBrowser/mac/Info.plist:
* MobileMiniBrowser/MobileMiniBrowser/Info.plist:
* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm: Added.
(-[SpeechRecognitionPermissionUIDelegate _webView:requestSpeechRecognitionPermissionForOrigin:decisionHandler:]):
(-[SpeechRecognitionMessageHandler userContentController:didReceiveScriptMessage:]):
(TestWebKitAPI::TEST):
* TestWebKitAPI/Tests/WebKitCocoa/speechrecognition-user-permission-persistence.html: Added.
* WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
* WebKitTestRunner/InjectedBundle/TestRunner.cpp:
(WTR::TestRunner::setIsSpeechRecognitionPermissionGranted):
* WebKitTestRunner/InjectedBundle/TestRunner.h:
* WebKitTestRunner/TestController.cpp:
(WTR::decidePolicyForSpeechRecognitionPermissionRequest):
(WTR::TestController::completeSpeechRecognitionPermissionCheck):
(WTR::TestController::setIsSpeechRecognitionPermissionGranted):
(WTR::TestController::createWebViewWithOptions):
(WTR::TestController::resetStateToConsistentValues):
* WebKitTestRunner/TestController.h:
* WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):

LayoutTests:

* TestExpectations:
* fast/speechrecognition/permission-error-expected.txt: Added.
* fast/speechrecognition/permission-error.html: Added.
* fast/speechrecognition/resources/removed-iframe.html: Added.
* fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt: Added.
* fast/speechrecognition/start-recognition-in-removed-iframe.html: Added.
* platform/wk2/TestExpectations:


Canonical link: https://commits.webkit.org/231575@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@269810 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-11-14 02:16:49 +00:00
..
Base.lproj
Info.plist Implement basic permission check for SpeechRecognition 2020-11-14 02:16:49 +00:00
main.m