Changeset 271381 in webkit
- Timestamp:
- Jan 11, 2021 2:29:21 PM (18 months ago)
- Location:
- trunk
- Files:
-
- 14 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/speechrecognition/permission-error-expected.txt (modified) (1 diff)
-
LayoutTests/fast/speechrecognition/permission-error.html (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp (modified) (8 diffs)
-
Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h (modified) (2 diffs)
-
Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h (modified) (3 diffs)
-
Source/WebKit/UIProcess/SpeechRecognitionServer.cpp (modified) (2 diffs)
-
Source/WebKit/UIProcess/SpeechRecognitionServer.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.h (modified) (3 diffs)
-
Source/WebKit/UIProcess/WebProcessProxy.cpp (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r271379 r271381 1 2021-01-11 Sihui Liu <sihui_liu@appe.com> 2 3 Make SpeechRecognition permission error more informative 4 https://bugs.webkit.org/show_bug.cgi?id=220436 5 6 Reviewed by Youenn Fablet. 7 8 * fast/speechrecognition/permission-error-expected.txt: 9 * fast/speechrecognition/permission-error.html: 10 1 11 2021-01-11 Sihui Liu <sihui_liu@appe.com> 2 12 -
trunk/LayoutTests/fast/speechrecognition/permission-error-expected.txt
r270868 r271381 7 7 PASS recognition.start() did not throw exception. 8 8 PASS event.error is "not-allowed" 9 PASS event.message is " Permission checkfailed"9 PASS event.message is "User permission check has failed" 10 10 PASS successfullyParsed is true 11 11 -
trunk/LayoutTests/fast/speechrecognition/permission-error.html
r270868 r271381 15 15 recognition.onerror = (event) => { 16 16 shouldBeEqualToString("event.error", "not-allowed"); 17 shouldBeEqualToString("event.message", " Permission checkfailed");17 shouldBeEqualToString("event.message", "User permission check has failed"); 18 18 19 19 finishJSTest(); -
trunk/Source/WebKit/ChangeLog
r271378 r271381 1 2021-01-11 Sihui Liu <sihui_liu@appe.com> 2 3 Make SpeechRecognition permission error more informative 4 https://bugs.webkit.org/show_bug.cgi?id=220436 5 6 Reviewed by Youenn Fablet. 7 8 Make SpeechRecognitionPermissionManager complete requests with an optional SpeechRecognitionError instead of a 9 boolean value. 10 11 * UIProcess/SpeechRecognitionPermissionManager.cpp: 12 (WebKit::SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager): 13 (WebKit::SpeechRecognitionPermissionManager::request): 14 (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest): 15 (WebKit::SpeechRecognitionPermissionManager::continueProcessingRequest): 16 (WebKit::SpeechRecognitionPermissionManager::completeCurrentRequest): 17 (WebKit::SpeechRecognitionPermissionManager::requestSpeechRecognitionServiceAccess): 18 (WebKit::SpeechRecognitionPermissionManager::requestMicrophoneAccess): 19 (WebKit::SpeechRecognitionPermissionManager::requestUserPermission): 20 * UIProcess/SpeechRecognitionPermissionManager.h: 21 * UIProcess/SpeechRecognitionPermissionRequest.h: 22 (WebKit::SpeechRecognitionPermissionRequest::create): 23 (WebKit::SpeechRecognitionPermissionRequest::complete): 24 (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest): 25 * UIProcess/SpeechRecognitionServer.cpp: 26 (WebKit::SpeechRecognitionServer::requestPermissionForRequest): 27 * UIProcess/SpeechRecognitionServer.h: 28 * UIProcess/WebPageProxy.cpp: 29 (WebKit::WebPageProxy::requestSpeechRecognitionPermission): 30 * UIProcess/WebPageProxy.h: 31 * UIProcess/WebProcessProxy.cpp: 32 (WebKit::WebProcessProxy::createSpeechRecognitionServer): 33 1 34 2021-01-11 Alex Christensen <achristensen@webkit.org> 2 35 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp
r271205 r271381 73 73 { 74 74 for (auto& request : m_requests) 75 request->complete(SpeechRecognition PermissionDecision::Deny);75 request->complete(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Permission manager has exited"_s }); 76 76 } 77 77 78 void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void( SpeechRecognitionPermissionDecision)>&& completiontHandler)78 void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completiontHandler) 79 79 { 80 80 m_requests.append(SpeechRecognitionPermissionRequest::create(lang, origin, WTFMove(completiontHandler))); … … 95 95 #if PLATFORM(COOCA) 96 96 if (!checkSandboxRequirementForType(MediaPermissionType::Audio)) { 97 completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny); 98 return; 99 } 100 #endif 101 102 // TCC status may have changed between requests. 103 m_microphoneCheck = computeMicrophoneAccess(); 104 m_speechRecognitionServiceCheck = computeSpeechRecognitionServiceAccess(); 97 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Sandbox check has failed"_s }); 98 return; 99 } 100 #endif 105 101 106 102 m_page.syncIfMockDevicesEnabledChanged(); 107 bool mockCaptureDevicesEnabled = m_page.preferences().mockCaptureDevicesEnabled(); 108 if (mockCaptureDevicesEnabled) { 103 if (m_page.preferences().mockCaptureDevicesEnabled()) { 109 104 m_microphoneCheck = CheckResult::Granted; 110 105 m_speechRecognitionServiceCheck = CheckResult::Granted; 111 } 106 } else { 107 // TCC status may have changed between requests. 108 m_microphoneCheck = computeMicrophoneAccess(); 109 if (m_microphoneCheck == CheckResult::Denied) { 110 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Microphone permission check has failed"_s }); 111 return; 112 } 113 114 m_speechRecognitionServiceCheck = computeSpeechRecognitionServiceAccess(); 115 if (m_speechRecognitionServiceCheck == CheckResult::Denied) { 116 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::ServiceNotAllowed, "Speech recognition service permission check has failed"_s }); 117 return; 118 } 112 119 113 120 #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; 121 if (!checkSpeechRecognitionServiceAvailability(m_requests.first()->lang())) { 122 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::ServiceNotAllowed, "Speech recognition service is not available"_s }); 123 return; 124 } 125 #endif 125 126 } 126 127 … … 135 136 136 137 if (m_userPermissionCheck == CheckResult::Denied) { 137 completeCurrentRequest(SpeechRecognition PermissionDecision::Deny);138 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "User permission check has failed"_s }); 138 139 return; 139 140 } … … 163 164 164 165 if (!m_page.isViewVisible()) { 165 completeCurrentRequest(SpeechRecognition PermissionDecision::Deny);166 return; 167 } 168 169 completeCurrentRequest( SpeechRecognitionPermissionDecision::Grant);170 } 171 172 void SpeechRecognitionPermissionManager::completeCurrentRequest( SpeechRecognitionPermissionDecision decision)166 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Page is not visible to user" }); 167 return; 168 } 169 170 completeCurrentRequest(); 171 } 172 173 void SpeechRecognitionPermissionManager::completeCurrentRequest(Optional<SpeechRecognitionError>&& error) 173 174 { 174 175 ASSERT(!m_requests.isEmpty()); 175 176 auto currentRequest = m_requests.takeFirst(); 176 currentRequest->complete( decision);177 currentRequest->complete(WTFMove(error)); 177 178 178 179 startNextRequest(); … … 190 191 m_speechRecognitionServiceCheck = authorized ? CheckResult::Granted : CheckResult::Denied; 191 192 if (m_speechRecognitionServiceCheck == CheckResult::Denied) { 192 completeCurrentRequest(SpeechRecognition PermissionDecision::Deny);193 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::ServiceNotAllowed, "Speech recognition service permission check has failed"_s }); 193 194 return; 194 195 } … … 210 211 m_microphoneCheck = authorized ? CheckResult::Granted : CheckResult::Denied; 211 212 if (m_microphoneCheck == CheckResult::Denied) { 212 completeCurrentRequest(SpeechRecognition PermissionDecision::Deny);213 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Microphone permission check has failed"_s }); 213 214 return; 214 215 } … … 232 233 m_userPermissionCheck = granted ? CheckResult::Granted : CheckResult::Denied; 233 234 if (m_userPermissionCheck == CheckResult::Denied) { 234 completeCurrentRequest(SpeechRecognition PermissionDecision::Deny);235 completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "User permission check has failed"_s }); 235 236 return; 236 237 } … … 240 241 m_page.uiClient().decidePolicyForSpeechRecognitionPermissionRequest(m_page, API::SecurityOrigin::create(topOrigin.get()).get(), WTFMove(decisionHandler)); 241 242 } 242 243 244 243 245 244 void SpeechRecognitionPermissionManager::decideByDefaultAction(const WebCore::SecurityOrigin& origin, CompletionHandler<void(bool)>&& completionHandler) -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h
r271154 r271381 40 40 explicit SpeechRecognitionPermissionManager(WebPageProxy&); 41 41 ~SpeechRecognitionPermissionManager(); 42 void request(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void( SpeechRecognitionPermissionDecision)>&&);42 void request(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&); 43 43 44 44 void decideByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); … … 49 49 void startProcessingRequest(); 50 50 void continueProcessingRequest(); 51 void completeCurrentRequest( SpeechRecognitionPermissionDecision);51 void completeCurrentRequest(Optional<WebCore::SpeechRecognitionError>&& = WTF::nullopt); 52 52 void requestMicrophoneAccess(); 53 53 void requestSpeechRecognitionServiceAccess(); -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h
r271031 r271381 28 28 #include "APIObject.h" 29 29 #include <WebCore/ClientOrigin.h> 30 #include <WebCore/SpeechRecognitionError.h> 30 31 #include <wtf/CompletionHandler.h> 31 32 32 33 namespace WebKit { 33 34 34 enum class SpeechRecognitionPermissionDecision : bool { Deny, Grant };35 36 35 class SpeechRecognitionPermissionRequest : public RefCounted<SpeechRecognitionPermissionRequest> { 37 36 public: 38 static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void( SpeechRecognitionPermissionDecision)>&& completionHandler)37 static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler) 39 38 { 40 39 return adoptRef(*new SpeechRecognitionPermissionRequest(lang, origin, WTFMove(completionHandler))); 41 40 } 42 41 43 void complete( SpeechRecognitionPermissionDecision decision)42 void complete(Optional<WebCore::SpeechRecognitionError>&& error) 44 43 { 45 44 auto completionHandler = std::exchange(m_completionHandler, { }); 46 completionHandler( decision);45 completionHandler(WTFMove(error)); 47 46 } 48 47 … … 51 50 52 51 private: 53 SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void( SpeechRecognitionPermissionDecision)>&& completionHandler)52 SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler) 54 53 : m_lang(lang) 55 54 , m_origin(origin) … … 59 58 String m_lang; 60 59 WebCore::ClientOrigin m_origin; 61 CompletionHandler<void( SpeechRecognitionPermissionDecision)> m_completionHandler;60 CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)> m_completionHandler; 62 61 }; 63 62 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp
r271205 r271381 65 65 void SpeechRecognitionServer::requestPermissionForRequest(WebCore::SpeechRecognitionRequest& request) 66 66 { 67 m_permissionChecker(request.lang(), request.clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto decision) mutable {67 m_permissionChecker(request.lang(), request.clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto error) mutable { 68 68 if (!weakThis) 69 69 return; … … 73 73 74 74 auto identifier = weakRequest->clientIdentifier(); 75 if ( decision == SpeechRecognitionPermissionDecision::Deny) {75 if (error) { 76 76 m_requests.remove(identifier); 77 auto error = WebCore::SpeechRecognitionError { WebCore::SpeechRecognitionErrorType::NotAllowed, "Permission check failed"_s }; 78 sendUpdate(identifier, WebCore::SpeechRecognitionUpdateType::Error, error); 77 sendUpdate(identifier, WebCore::SpeechRecognitionUpdateType::Error, WTFMove(error)); 79 78 return; 80 79 } -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.h
r271205 r271381 44 44 45 45 class WebProcessProxy; 46 enum class SpeechRecognitionPermissionDecision : bool;47 46 48 47 using SpeechRecognitionServerIdentifier = WebCore::PageIdentifier; 49 using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, CompletionHandler<void( SpeechRecognitionPermissionDecision)>&&)>;48 using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&)>; 50 49 using SpeechRecognitionCheckIfMockSpeechRecognitionEnabled = Function<bool()>; 51 50 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r271378 r271381 10302 10302 } 10303 10303 10304 void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void( SpeechRecognitionPermissionDecision)>&& completionHandler)10304 void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completionHandler) 10305 10305 { 10306 10306 if (!m_speechRecognitionPermissionManager) -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r271378 r271381 265 265 struct SecurityOriginData; 266 266 struct ShareData; 267 struct SpeechRecognitionError; 267 268 struct TextAlternativeWithRange; 268 269 struct TextCheckingResult; … … 368 369 enum class NegotiatedLegacyTLS : bool; 369 370 enum class ProcessSwapRequestedByClient : bool; 370 enum class SpeechRecognitionPermissionDecision : bool;371 371 enum class UndoOrRedo : bool; 372 372 enum class WebContentMode : uint8_t; … … 1811 1811 size_t suspendMediaPlaybackCounter() { return m_suspendMediaPlaybackCounter; } 1812 1812 1813 void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void( SpeechRecognitionPermissionDecision)>&&);1813 void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&); 1814 1814 void requestSpeechRecognitionPermissionByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); 1815 1815 -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r271238 r271381 1725 1725 auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& lang, auto& origin, auto&& completionHandler) mutable { 1726 1726 if (!weakPage) { 1727 completionHandler( SpeechRecognitionPermissionDecision::Deny);1727 completionHandler(WebCore::SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Page no longer exists"_s }); 1728 1728 return; 1729 1729 } -
trunk/Tools/ChangeLog
r271380 r271381 1 2021-01-11 Sihui Liu <sihui_liu@appe.com> 2 3 Make SpeechRecognition permission error more informative 4 https://bugs.webkit.org/show_bug.cgi?id=220436 5 6 Reviewed by Youenn Fablet. 7 8 * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm: 9 (TestWebKitAPI::TEST): 10 1 11 2021-01-11 Wenson Hsieh <wenson_hsieh@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm
r271311 r271381 120 120 [webView loadTestPageNamed:@"speechrecognition-user-permission-persistence"]; 121 121 TestWebKitAPI::Util::run(&receivedScriptMessage); 122 EXPECT_WK_STREQ(@"Error: not-allowed - Permission checkfailed", [lastScriptMessage body]);122 EXPECT_WK_STREQ(@"Error: not-allowed - User permission check has failed", [lastScriptMessage body]); 123 123 EXPECT_TRUE(permissionRequested); 124 124 … … 128 128 [webView stringByEvaluatingJavaScript:@"start()"]; 129 129 TestWebKitAPI::Util::run(&receivedScriptMessage); 130 EXPECT_WK_STREQ(@"Error: not-allowed - Permission checkfailed", [lastScriptMessage body]);130 EXPECT_WK_STREQ(@"Error: not-allowed - User permission check has failed", [lastScriptMessage body]); 131 131 EXPECT_FALSE(permissionRequested); 132 132 … … 232 232 [webView evaluateJavaScript:@"start()" completionHandler:nil]; 233 233 TestWebKitAPI::Util::run(&receivedScriptMessage); 234 EXPECT_WK_STREQ(@"Error: not-allowed - P ermission check failed", [lastScriptMessage body]);234 EXPECT_WK_STREQ(@"Error: not-allowed - Page is not visible to user", [lastScriptMessage body]); 235 235 } 236 236
Note: See TracChangeset
for help on using the changeset viewer.