Changeset 271031 in webkit
- Timestamp:
- Dec 21, 2020 11:35:24 AM (19 months ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 11 edited
-
ChangeLog (modified) (1 diff)
-
UIProcess/Cocoa/MediaPermissionUtilities.mm (modified) (3 diffs)
-
UIProcess/MediaPermissionUtilities.h (modified) (1 diff)
-
UIProcess/SpeechRecognitionPermissionManager.cpp (modified) (3 diffs)
-
UIProcess/SpeechRecognitionPermissionManager.h (modified) (1 diff)
-
UIProcess/SpeechRecognitionPermissionRequest.h (modified) (2 diffs)
-
UIProcess/SpeechRecognitionServer.cpp (modified) (2 diffs)
-
UIProcess/SpeechRecognitionServer.h (modified) (1 diff)
-
UIProcess/WebPageProxy.cpp (modified) (1 diff)
-
UIProcess/WebPageProxy.h (modified) (1 diff)
-
UIProcess/WebProcessProxy.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r271024 r271031 1 2020-12-21 Sihui Liu <sihui_liu@apple.com> 2 3 Check availability of speech recognition service before requesting permissions 4 https://bugs.webkit.org/show_bug.cgi?id=220033 5 6 Reviewed by Youenn Fablet. 7 8 If speech recognition service is not available for target language (maybe the language is not supported, user 9 turns off dictation in system settings, etc), let's just fail the speech recognition request without prompting. 10 11 Manually tested with MiniBrowser. 12 13 * UIProcess/Cocoa/MediaPermissionUtilities.mm: 14 (WebKit::requestSpeechRecognitionAccess): 15 (WebKit::checkSpeechRecognitionServiceAccess): 16 (WebKit::checkSpeechRecognitionServiceAvailability): 17 * UIProcess/MediaPermissionUtilities.h: 18 * UIProcess/SpeechRecognitionPermissionManager.cpp: 19 (WebKit::SpeechRecognitionPermissionManager::request): 20 (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest): 21 * UIProcess/SpeechRecognitionPermissionManager.h: 22 * UIProcess/SpeechRecognitionPermissionRequest.h: 23 (WebKit::SpeechRecognitionPermissionRequest::create): 24 (WebKit::SpeechRecognitionPermissionRequest::lang const): 25 (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest): 26 * UIProcess/SpeechRecognitionServer.cpp: 27 (WebKit::SpeechRecognitionServer::requestPermissionForRequest): 28 * UIProcess/SpeechRecognitionServer.h: 29 * UIProcess/WebPageProxy.cpp: 30 (WebKit::WebPageProxy::requestSpeechRecognitionPermission): 31 * UIProcess/WebPageProxy.h: 32 * UIProcess/WebProcessProxy.cpp: 33 (WebKit::WebProcessProxy::createSpeechRecognitionServer): 34 1 35 2020-12-21 Alicia Boya García <aboya@igalia.com> 2 36 -
trunk/Source/WebKit/UIProcess/Cocoa/MediaPermissionUtilities.mm
r270844 r271031 39 39 #import <wtf/spi/darwin/SandboxSPI.h> 40 40 41 #if HAVE(SPEECHRECOGNIZER)42 #import <Speech/Speech.h>43 44 SOFT_LINK_FRAMEWORK(Speech)45 SOFT_LINK_CLASS(Speech, SFSpeechRecognizer)46 #endif47 48 41 #import <pal/cocoa/AVFoundationSoftLink.h> 42 #import <pal/cocoa/SpeechSoftLink.h> 49 43 50 44 SOFT_LINK_PRIVATE_FRAMEWORK(TCC) … … 255 249 completionHandler(authorized); 256 250 }); 257 [ getSFSpeechRecognizerClass() requestAuthorization:decisionHandler.get()];251 [PAL::getSFSpeechRecognizerClass() requestAuthorization:decisionHandler.get()]; 258 252 } 259 253 260 254 MediaPermissionResult checkSpeechRecognitionServiceAccess() 261 255 { 262 auto authorizationStatus = [ getSFSpeechRecognizerClass() authorizationStatus];256 auto authorizationStatus = [PAL::getSFSpeechRecognizerClass() authorizationStatus]; 263 257 if (authorizationStatus == SFSpeechRecognizerAuthorizationStatusDenied || authorizationStatus == SFSpeechRecognizerAuthorizationStatusRestricted) 264 258 return MediaPermissionResult::Denied; … … 268 262 } 269 263 264 bool checkSpeechRecognitionServiceAvailability(const String& localeIdentifier) 265 { 266 auto recognizer = localeIdentifier.isEmpty() ? adoptNS([PAL::allocSFSpeechRecognizerInstance() init]) : adoptNS([PAL::allocSFSpeechRecognizerInstance() initWithLocale:[NSLocale localeWithLocaleIdentifier:localeIdentifier]]); 267 return recognizer && [recognizer isAvailable]; 268 } 269 270 270 #endif // HAVE(SPEECHRECOGNIZER) 271 271 -
trunk/Source/WebKit/UIProcess/MediaPermissionUtilities.h
r269918 r271031 69 69 void requestSpeechRecognitionAccess(CompletionHandler<void(bool authorized)>&&); 70 70 MediaPermissionResult checkSpeechRecognitionServiceAccess(); 71 bool checkSpeechRecognitionServiceAvailability(const String& localeIdentifier); 71 72 #endif 72 73 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp
r270986 r271031 76 76 } 77 77 78 void SpeechRecognitionPermissionManager::request(const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completiontHandler)79 { 80 m_requests.append(SpeechRecognitionPermissionRequest::create( origin, WTFMove(completiontHandler)));78 void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completiontHandler) 79 { 80 m_requests.append(SpeechRecognitionPermissionRequest::create(lang, origin, WTFMove(completiontHandler))); 81 81 if (m_requests.size() == 1) 82 82 startNextRequest(); … … 105 105 106 106 m_page.syncIfMockDevicesEnabledChanged(); 107 if (m_page.preferences().mockCaptureDevicesEnabled()) { 107 bool mockCaptureDevicesEnabled = m_page.preferences().mockCaptureDevicesEnabled(); 108 if (mockCaptureDevicesEnabled) { 108 109 m_microphoneCheck = CheckResult::Granted; 109 110 m_speechRecognitionServiceCheck = CheckResult::Granted; 111 } 112 113 #if HAVE(SPEECHRECOGNIZER) 114 if (!mockCaptureDevicesEnabled && m_speechRecognitionServiceCheck != CheckResult::Denied) { 115 // Speech recognition service can be unavailable when user does not enable dictation in system settings. 116 // Let's avoid prompting user in that case. 117 if (!checkSpeechRecognitionServiceAvailability(m_requests.first()->lang())) 118 m_speechRecognitionServiceCheck = CheckResult::Denied; 119 } 120 #endif 121 122 if (m_microphoneCheck == CheckResult::Denied || m_speechRecognitionServiceCheck == CheckResult::Denied) { 123 completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny); 124 return; 110 125 } 111 126 … … 119 134 } 120 135 121 if (m_ microphoneCheck == CheckResult::Denied || m_speechRecognitionServiceCheck == CheckResult::Denied || m_userPermissionCheck == CheckResult::Denied) {136 if (m_userPermissionCheck == CheckResult::Denied) { 122 137 completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny); 123 138 return; -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h
r269918 r271031 40 40 explicit SpeechRecognitionPermissionManager(WebPageProxy&); 41 41 ~SpeechRecognitionPermissionManager(); 42 void request(const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&);42 void request(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&); 43 43 44 44 void decideByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h
r269810 r271031 36 36 class SpeechRecognitionPermissionRequest : public RefCounted<SpeechRecognitionPermissionRequest> { 37 37 public: 38 static Ref<SpeechRecognitionPermissionRequest> create(const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler)38 static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler) 39 39 { 40 return adoptRef(*new SpeechRecognitionPermissionRequest( origin, WTFMove(completionHandler)));40 return adoptRef(*new SpeechRecognitionPermissionRequest(lang, origin, WTFMove(completionHandler))); 41 41 } 42 42 … … 48 48 49 49 const WebCore::ClientOrigin& origin() const { return m_origin; } 50 const String& lang() const { return m_lang; } 50 51 51 52 private: 52 SpeechRecognitionPermissionRequest(const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler) 53 : m_origin(origin) 53 SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler) 54 : m_lang(lang) 55 , m_origin(origin) 54 56 , m_completionHandler(WTFMove(completionHandler)) 55 57 { } 56 58 59 String m_lang; 57 60 WebCore::ClientOrigin m_origin; 58 61 CompletionHandler<void(SpeechRecognitionPermissionDecision)> m_completionHandler; -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp
r270986 r271031 37 37 namespace WebKit { 38 38 39 40 39 SpeechRecognitionServer::SpeechRecognitionServer(Ref<IPC::Connection>&& connection, SpeechRecognitionServerIdentifier identifier, SpeechRecognitionPermissionChecker&& permissionChecker, SpeechRecognitionCheckIfMockSpeechRecognitionEnabled&& checkIfEnabled 41 40 #if ENABLE(MEDIA_STREAM) … … 65 64 void SpeechRecognitionServer::requestPermissionForRequest(WebCore::SpeechRecognitionRequest& request) 66 65 { 67 m_permissionChecker(request. clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](SpeechRecognitionPermissionDecisiondecision) mutable {66 m_permissionChecker(request.lang(), request.clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto decision) mutable { 68 67 if (!weakThis) 69 68 return; -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.h
r270986 r271031 47 47 48 48 using SpeechRecognitionServerIdentifier = WebCore::PageIdentifier; 49 using SpeechRecognitionPermissionChecker = Function<void(const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&)>;49 using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&)>; 50 50 using SpeechRecognitionCheckIfMockSpeechRecognitionEnabled = Function<bool()>; 51 51 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r270962 r271031 10344 10344 } 10345 10345 10346 void WebPageProxy::requestSpeechRecognitionPermission(const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler)10346 void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler) 10347 10347 { 10348 10348 if (!m_speechRecognitionPermissionManager) 10349 10349 m_speechRecognitionPermissionManager = makeUnique<SpeechRecognitionPermissionManager>(*this); 10350 10350 10351 m_speechRecognitionPermissionManager->request( clientOrigin, WTFMove(completionHandler));10351 m_speechRecognitionPermissionManager->request(lang, clientOrigin, WTFMove(completionHandler)); 10352 10352 } 10353 10353 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r270946 r271031 1830 1830 size_t suspendMediaPlaybackCounter() { return m_suspendMediaPlaybackCounter; } 1831 1831 1832 void requestSpeechRecognitionPermission(const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&);1832 void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&); 1833 1833 void requestSpeechRecognitionPermissionByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); 1834 1834 -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r270793 r271031 1723 1723 ASSERT(!m_speechRecognitionServerMap.contains(identifier)); 1724 1724 auto& speechRecognitionServer = m_speechRecognitionServerMap.add(identifier, nullptr).iterator->value; 1725 auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& origin, auto&& completionHandler) mutable {1725 auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& lang, auto& origin, auto&& completionHandler) mutable { 1726 1726 if (!weakPage) { 1727 1727 completionHandler(SpeechRecognitionPermissionDecision::Deny); … … 1729 1729 } 1730 1730 1731 weakPage->requestSpeechRecognitionPermission( origin, WTFMove(completionHandler));1731 weakPage->requestSpeechRecognitionPermission(lang, origin, WTFMove(completionHandler)); 1732 1732 }; 1733 1733 auto checkIfMockCaptureDevicesEnabled = [weakPage = makeWeakPtr(targetPage)]() {
Note: See TracChangeset
for help on using the changeset viewer.