Title: [273251] branches/safari-611-branch
Revision
273251
Author
[email protected]
Date
2021-02-22 09:54:38 -0800 (Mon, 22 Feb 2021)

Log Message

Cherry-pick r271381. rdar://problem/74451875

    Make SpeechRecognition permission error more informative
    https://bugs.webkit.org/show_bug.cgi?id=220436

    Patch by Sihui Liu <[email protected]> on 2021-01-11
    Reviewed by Youenn Fablet.

    Source/WebKit:

    Make SpeechRecognitionPermissionManager complete requests with an optional SpeechRecognitionError instead of a
    boolean value.

    * UIProcess/SpeechRecognitionPermissionManager.cpp:
    (WebKit::SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager):
    (WebKit::SpeechRecognitionPermissionManager::request):
    (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
    (WebKit::SpeechRecognitionPermissionManager::continueProcessingRequest):
    (WebKit::SpeechRecognitionPermissionManager::completeCurrentRequest):
    (WebKit::SpeechRecognitionPermissionManager::requestSpeechRecognitionServiceAccess):
    (WebKit::SpeechRecognitionPermissionManager::requestMicrophoneAccess):
    (WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
    * UIProcess/SpeechRecognitionPermissionManager.h:
    * UIProcess/SpeechRecognitionPermissionRequest.h:
    (WebKit::SpeechRecognitionPermissionRequest::create):
    (WebKit::SpeechRecognitionPermissionRequest::complete):
    (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
    * UIProcess/SpeechRecognitionServer.cpp:
    (WebKit::SpeechRecognitionServer::requestPermissionForRequest):
    * UIProcess/SpeechRecognitionServer.h:
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::requestSpeechRecognitionPermission):
    * UIProcess/WebPageProxy.h:
    * UIProcess/WebProcessProxy.cpp:
    (WebKit::WebProcessProxy::createSpeechRecognitionServer):

    Tools:

    * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
    (TestWebKitAPI::TEST):

    LayoutTests:

    * fast/speechrecognition/permission-error-expected.txt:
    * fast/speechrecognition/permission-error.html:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@271381 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-611-branch/LayoutTests/ChangeLog (273250 => 273251)


--- branches/safari-611-branch/LayoutTests/ChangeLog	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/LayoutTests/ChangeLog	2021-02-22 17:54:38 UTC (rev 273251)
@@ -1,5 +1,65 @@
 2021-02-17  Ruben Turcios  <[email protected]>
 
+        Cherry-pick r271381. rdar://problem/74451875
+
+    Make SpeechRecognition permission error more informative
+    https://bugs.webkit.org/show_bug.cgi?id=220436
+    
+    Patch by Sihui Liu <[email protected]> on 2021-01-11
+    Reviewed by Youenn Fablet.
+    
+    Source/WebKit:
+    
+    Make SpeechRecognitionPermissionManager complete requests with an optional SpeechRecognitionError instead of a
+    boolean value.
+    
+    * UIProcess/SpeechRecognitionPermissionManager.cpp:
+    (WebKit::SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager):
+    (WebKit::SpeechRecognitionPermissionManager::request):
+    (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
+    (WebKit::SpeechRecognitionPermissionManager::continueProcessingRequest):
+    (WebKit::SpeechRecognitionPermissionManager::completeCurrentRequest):
+    (WebKit::SpeechRecognitionPermissionManager::requestSpeechRecognitionServiceAccess):
+    (WebKit::SpeechRecognitionPermissionManager::requestMicrophoneAccess):
+    (WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
+    * UIProcess/SpeechRecognitionPermissionManager.h:
+    * UIProcess/SpeechRecognitionPermissionRequest.h:
+    (WebKit::SpeechRecognitionPermissionRequest::create):
+    (WebKit::SpeechRecognitionPermissionRequest::complete):
+    (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
+    * UIProcess/SpeechRecognitionServer.cpp:
+    (WebKit::SpeechRecognitionServer::requestPermissionForRequest):
+    * UIProcess/SpeechRecognitionServer.h:
+    * UIProcess/WebPageProxy.cpp:
+    (WebKit::WebPageProxy::requestSpeechRecognitionPermission):
+    * UIProcess/WebPageProxy.h:
+    * UIProcess/WebProcessProxy.cpp:
+    (WebKit::WebProcessProxy::createSpeechRecognitionServer):
+    
+    Tools:
+    
+    * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
+    (TestWebKitAPI::TEST):
+    
+    LayoutTests:
+    
+    * fast/speechrecognition/permission-error-expected.txt:
+    * fast/speechrecognition/permission-error.html:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@271381 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-01-11  Sihui Liu  <[email protected]>
+
+            Make SpeechRecognition permission error more informative
+            https://bugs.webkit.org/show_bug.cgi?id=220436
+
+            Reviewed by Youenn Fablet.
+
+            * fast/speechrecognition/permission-error-expected.txt:
+            * fast/speechrecognition/permission-error.html:
+
+2021-02-17  Ruben Turcios  <[email protected]>
+
         Cherry-pick r272067. rdar://problem/74444347
 
     Support for aria-current state changed notifications.

Modified: branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error-expected.txt (273250 => 273251)


--- branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error-expected.txt	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error-expected.txt	2021-02-22 17:54:38 UTC (rev 273251)
@@ -6,7 +6,7 @@
 PASS recognition = new webkitSpeechRecognition() did not throw exception.
 PASS recognition.start() did not throw exception.
 PASS event.error is "not-allowed"
-PASS event.message is "Permission check failed"
+PASS event.message is "User permission check has failed"
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error.html (273250 => 273251)


--- branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error.html	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error.html	2021-02-22 17:54:38 UTC (rev 273251)
@@ -14,7 +14,7 @@
 shouldNotThrow("recognition.start()");
 recognition._onerror_ = (event) => {
     shouldBeEqualToString("event.error", "not-allowed");
-    shouldBeEqualToString("event.message", "Permission check failed");
+    shouldBeEqualToString("event.message", "User permission check has failed");
 
     finishJSTest();
 }

Modified: branches/safari-611-branch/Source/WebKit/ChangeLog (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/ChangeLog	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/ChangeLog	2021-02-22 17:54:38 UTC (rev 273251)
@@ -1,5 +1,88 @@
 2021-02-17  Ruben Turcios  <[email protected]>
 
+        Cherry-pick r271381. rdar://problem/74451875
+
+    Make SpeechRecognition permission error more informative
+    https://bugs.webkit.org/show_bug.cgi?id=220436
+    
+    Patch by Sihui Liu <[email protected]> on 2021-01-11
+    Reviewed by Youenn Fablet.
+    
+    Source/WebKit:
+    
+    Make SpeechRecognitionPermissionManager complete requests with an optional SpeechRecognitionError instead of a
+    boolean value.
+    
+    * UIProcess/SpeechRecognitionPermissionManager.cpp:
+    (WebKit::SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager):
+    (WebKit::SpeechRecognitionPermissionManager::request):
+    (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
+    (WebKit::SpeechRecognitionPermissionManager::continueProcessingRequest):
+    (WebKit::SpeechRecognitionPermissionManager::completeCurrentRequest):
+    (WebKit::SpeechRecognitionPermissionManager::requestSpeechRecognitionServiceAccess):
+    (WebKit::SpeechRecognitionPermissionManager::requestMicrophoneAccess):
+    (WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
+    * UIProcess/SpeechRecognitionPermissionManager.h:
+    * UIProcess/SpeechRecognitionPermissionRequest.h:
+    (WebKit::SpeechRecognitionPermissionRequest::create):
+    (WebKit::SpeechRecognitionPermissionRequest::complete):
+    (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
+    * UIProcess/SpeechRecognitionServer.cpp:
+    (WebKit::SpeechRecognitionServer::requestPermissionForRequest):
+    * UIProcess/SpeechRecognitionServer.h:
+    * UIProcess/WebPageProxy.cpp:
+    (WebKit::WebPageProxy::requestSpeechRecognitionPermission):
+    * UIProcess/WebPageProxy.h:
+    * UIProcess/WebProcessProxy.cpp:
+    (WebKit::WebProcessProxy::createSpeechRecognitionServer):
+    
+    Tools:
+    
+    * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
+    (TestWebKitAPI::TEST):
+    
+    LayoutTests:
+    
+    * fast/speechrecognition/permission-error-expected.txt:
+    * fast/speechrecognition/permission-error.html:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@271381 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-01-11  Sihui Liu  <[email protected]>
+
+            Make SpeechRecognition permission error more informative
+            https://bugs.webkit.org/show_bug.cgi?id=220436
+
+            Reviewed by Youenn Fablet.
+
+            Make SpeechRecognitionPermissionManager complete requests with an optional SpeechRecognitionError instead of a
+            boolean value.
+
+            * UIProcess/SpeechRecognitionPermissionManager.cpp:
+            (WebKit::SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager):
+            (WebKit::SpeechRecognitionPermissionManager::request):
+            (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
+            (WebKit::SpeechRecognitionPermissionManager::continueProcessingRequest):
+            (WebKit::SpeechRecognitionPermissionManager::completeCurrentRequest):
+            (WebKit::SpeechRecognitionPermissionManager::requestSpeechRecognitionServiceAccess):
+            (WebKit::SpeechRecognitionPermissionManager::requestMicrophoneAccess):
+            (WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
+            * UIProcess/SpeechRecognitionPermissionManager.h:
+            * UIProcess/SpeechRecognitionPermissionRequest.h:
+            (WebKit::SpeechRecognitionPermissionRequest::create):
+            (WebKit::SpeechRecognitionPermissionRequest::complete):
+            (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
+            * UIProcess/SpeechRecognitionServer.cpp:
+            (WebKit::SpeechRecognitionServer::requestPermissionForRequest):
+            * UIProcess/SpeechRecognitionServer.h:
+            * UIProcess/WebPageProxy.cpp:
+            (WebKit::WebPageProxy::requestSpeechRecognitionPermission):
+            * UIProcess/WebPageProxy.h:
+            * UIProcess/WebProcessProxy.cpp:
+            (WebKit::WebProcessProxy::createSpeechRecognitionServer):
+
+2021-02-17  Ruben Turcios  <[email protected]>
+
         Cherry-pick r272504. rdar://problem/74409474
 
     NetworkRTCSocketCocoa extractDataMessages should not read too much data

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp	2021-02-22 17:54:38 UTC (rev 273251)
@@ -72,10 +72,10 @@
 SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager()
 {
     for (auto& request : m_requests)
-        request->complete(SpeechRecognitionPermissionDecision::Deny);
+        request->complete(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Permission manager has exited"_s });
 }
     
-void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completiontHandler)
+void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completiontHandler)
 {
     m_requests.append(SpeechRecognitionPermissionRequest::create(lang, origin, WTFMove(completiontHandler)));
     if (m_requests.size() == 1)
@@ -94,34 +94,35 @@
 {
 #if PLATFORM(COOCA)
     if (!checkSandboxRequirementForType(MediaPermissionType::Audio)) {
-        completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny);
+        completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Sandbox check has failed"_s });
         return;
     }
 #endif
 
-    // TCC status may have changed between requests.
-    m_microphoneCheck = computeMicrophoneAccess();
-    m_speechRecognitionServiceCheck = computeSpeechRecognitionServiceAccess();
-
     m_page.syncIfMockDevicesEnabledChanged();
-    bool mockCaptureDevicesEnabled = m_page.preferences().mockCaptureDevicesEnabled();
-    if (mockCaptureDevicesEnabled) {
+    if (m_page.preferences().mockCaptureDevicesEnabled()) {
         m_microphoneCheck = CheckResult::Granted;
         m_speechRecognitionServiceCheck = CheckResult::Granted;
-    }
+    } else {
+        // TCC status may have changed between requests.
+        m_microphoneCheck = computeMicrophoneAccess();
+        if (m_microphoneCheck == CheckResult::Denied) {
+            completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Microphone permission check has failed"_s });
+            return;
+        }
 
+        m_speechRecognitionServiceCheck = computeSpeechRecognitionServiceAccess();
+        if (m_speechRecognitionServiceCheck == CheckResult::Denied) {
+            completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::ServiceNotAllowed, "Speech recognition service permission check has failed"_s });
+            return;
+        }
+
 #if HAVE(SPEECHRECOGNIZER)
-    if (!mockCaptureDevicesEnabled && m_speechRecognitionServiceCheck != CheckResult::Denied) {
-        // Speech recognition service can be unavailable when user does not enable dictation in system settings.
-        // Let's avoid prompting user in that case.
-        if (!checkSpeechRecognitionServiceAvailability(m_requests.first()->lang()))
-            m_speechRecognitionServiceCheck = CheckResult::Denied;
-    }
+        if (!checkSpeechRecognitionServiceAvailability(m_requests.first()->lang())) {
+            completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::ServiceNotAllowed, "Speech recognition service is not available"_s });
+            return;
+        }
 #endif
-
-    if (m_microphoneCheck == CheckResult::Denied || m_speechRecognitionServiceCheck == CheckResult::Denied) {
-        completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny);
-        return;
     }
 
     // We currently don't allow third-party access.
@@ -134,7 +135,7 @@
     }
 
     if (m_userPermissionCheck == CheckResult::Denied) {
-        completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny);
+        completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "User permission check has failed"_s });
         return;
     }
 
@@ -162,18 +163,18 @@
     ASSERT(m_userPermissionCheck == CheckResult::Granted);
 
     if (!m_page.isViewVisible()) {
-        completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny);
+        completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Page is not visible to user" });
         return;
     }
 
-    completeCurrentRequest(SpeechRecognitionPermissionDecision::Grant);
+    completeCurrentRequest();
 }
 
-void SpeechRecognitionPermissionManager::completeCurrentRequest(SpeechRecognitionPermissionDecision decision)
+void SpeechRecognitionPermissionManager::completeCurrentRequest(Optional<SpeechRecognitionError>&& error)
 {
     ASSERT(!m_requests.isEmpty());
     auto currentRequest = m_requests.takeFirst();
-    currentRequest->complete(decision);
+    currentRequest->complete(WTFMove(error));
 
     startNextRequest();
 }
@@ -189,7 +190,7 @@
 
         m_speechRecognitionServiceCheck = authorized ? CheckResult::Granted : CheckResult::Denied;
         if (m_speechRecognitionServiceCheck == CheckResult::Denied) {
-            completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny);
+            completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::ServiceNotAllowed, "Speech recognition service permission check has failed"_s });
             return;
         }
 
@@ -209,7 +210,7 @@
 
         m_microphoneCheck = authorized ? CheckResult::Granted : CheckResult::Denied;
         if (m_microphoneCheck == CheckResult::Denied) {
-            completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny);
+            completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Microphone permission check has failed"_s });
             return;
         }
 
@@ -231,7 +232,7 @@
 
         m_userPermissionCheck = granted ? CheckResult::Granted : CheckResult::Denied;
         if (m_userPermissionCheck == CheckResult::Denied) {
-            completeCurrentRequest(SpeechRecognitionPermissionDecision::Deny);
+            completeCurrentRequest(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "User permission check has failed"_s });
             return;
         }
 
@@ -240,8 +241,6 @@
     m_page.uiClient().decidePolicyForSpeechRecognitionPermissionRequest(m_page, API::SecurityOrigin::create(topOrigin.get()).get(), WTFMove(decisionHandler));
 }
 
-
-
 void SpeechRecognitionPermissionManager::decideByDefaultAction(const WebCore::SecurityOrigin& origin, CompletionHandler<void(bool)>&& completionHandler)
 {
 #if PLATFORM(COCOA)

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h	2021-02-22 17:54:38 UTC (rev 273251)
@@ -39,7 +39,7 @@
     enum class CheckResult { Denied, Granted, Unknown };
     explicit SpeechRecognitionPermissionManager(WebPageProxy&);
     ~SpeechRecognitionPermissionManager();
-    void request(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&);
+    void request(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&);
 
     void decideByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&);
     WebPageProxy& page() { return m_page; }
@@ -48,7 +48,7 @@
     void startNextRequest();
     void startProcessingRequest();
     void continueProcessingRequest();
-    void completeCurrentRequest(SpeechRecognitionPermissionDecision);
+    void completeCurrentRequest(Optional<WebCore::SpeechRecognitionError>&& = WTF::nullopt);
     void requestMicrophoneAccess();
     void requestSpeechRecognitionServiceAccess();
     void requestUserPermission();

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h	2021-02-22 17:54:38 UTC (rev 273251)
@@ -27,23 +27,22 @@
 
 #include "APIObject.h"
 #include <WebCore/ClientOrigin.h>
+#include <WebCore/SpeechRecognitionError.h>
 #include <wtf/CompletionHandler.h>
 
 namespace WebKit {
 
-enum class SpeechRecognitionPermissionDecision : bool { Deny, Grant };
-
 class SpeechRecognitionPermissionRequest : public RefCounted<SpeechRecognitionPermissionRequest> {
 public:
-    static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler)
+    static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler)
     {
         return adoptRef(*new SpeechRecognitionPermissionRequest(lang, origin, WTFMove(completionHandler)));
     }
 
-    void complete(SpeechRecognitionPermissionDecision decision)
+    void complete(Optional<WebCore::SpeechRecognitionError>&& error)
     {
         auto completionHandler = std::exchange(m_completionHandler, { });
-        completionHandler(decision);
+        completionHandler(WTFMove(error));
     }
 
     const WebCore::ClientOrigin& origin() const { return m_origin; }
@@ -50,7 +49,7 @@
     const String& lang() const { return m_lang; }
 
 private:
-    SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler)
+    SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler)
         : m_lang(lang)
         , m_origin(origin)
         , m_completionHandler(WTFMove(completionHandler))
@@ -58,7 +57,7 @@
 
     String m_lang;
     WebCore::ClientOrigin m_origin;
-    CompletionHandler<void(SpeechRecognitionPermissionDecision)> m_completionHandler;
+    CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)> m_completionHandler;
 };
 
 class SpeechRecognitionPermissionCallback : public API::ObjectImpl<API::Object::Type::SpeechRecognitionPermissionCallback> {

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp	2021-02-22 17:54:38 UTC (rev 273251)
@@ -64,7 +64,7 @@
 
 void SpeechRecognitionServer::requestPermissionForRequest(WebCore::SpeechRecognitionRequest& request)
 {
-    m_permissionChecker(request.lang(), request.clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto decision) mutable {
+    m_permissionChecker(request.lang(), request.clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto error) mutable {
         if (!weakThis)
             return;
 
@@ -72,10 +72,9 @@
             return;
 
         auto identifier = weakRequest->clientIdentifier();
-        if (decision == SpeechRecognitionPermissionDecision::Deny) {
+        if (error) {
             m_requests.remove(identifier);
-            auto error = WebCore::SpeechRecognitionError { WebCore::SpeechRecognitionErrorType::NotAllowed, "Permission check failed"_s };
-            sendUpdate(identifier, WebCore::SpeechRecognitionUpdateType::Error, error);
+            sendUpdate(identifier, WebCore::SpeechRecognitionUpdateType::Error, WTFMove(error));
             return;
         }
 

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.h (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.h	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.h	2021-02-22 17:54:38 UTC (rev 273251)
@@ -43,10 +43,9 @@
 namespace WebKit {
 
 class WebProcessProxy;
-enum class SpeechRecognitionPermissionDecision : bool;
 
 using SpeechRecognitionServerIdentifier = WebCore::PageIdentifier;
-using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&)>;
+using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&)>;
 using SpeechRecognitionCheckIfMockSpeechRecognitionEnabled = Function<bool()>;
 
 class SpeechRecognitionServer : public CanMakeWeakPtr<SpeechRecognitionServer>, public IPC::MessageReceiver, private IPC::MessageSender {

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.cpp (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-02-22 17:54:38 UTC (rev 273251)
@@ -10295,7 +10295,7 @@
     });
 }
 
-void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&& completionHandler)
+void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completionHandler)
 {
     if (!m_speechRecognitionPermissionManager)
         m_speechRecognitionPermissionManager = makeUnique<SpeechRecognitionPermissionManager>(*this);

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.h (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.h	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.h	2021-02-22 17:54:38 UTC (rev 273251)
@@ -264,6 +264,7 @@
 struct PrewarmInformation;
 struct SecurityOriginData;
 struct ShareData;
+struct SpeechRecognitionError;
 struct TextAlternativeWithRange;
 struct TextCheckingResult;
 struct ViewportAttributes;
@@ -367,7 +368,6 @@
 enum class CreateNewGroupForHighlight : bool;
 enum class NegotiatedLegacyTLS : bool;
 enum class ProcessSwapRequestedByClient : bool;
-enum class SpeechRecognitionPermissionDecision : bool;
 enum class UndoOrRedo : bool;
 enum class WebContentMode : uint8_t;
 
@@ -1812,7 +1812,7 @@
     void setMediaCaptureReportingDelay(Seconds captureReportingDelay) { m_mediaCaptureReportingDelay = captureReportingDelay; }
     size_t suspendMediaPlaybackCounter() { return m_suspendMediaPlaybackCounter; }
 
-    void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(SpeechRecognitionPermissionDecision)>&&);
+    void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&);
     void requestSpeechRecognitionPermissionByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&);
 
     void syncIfMockDevicesEnabledChanged();

Modified: branches/safari-611-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp (273250 => 273251)


--- branches/safari-611-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-02-22 17:54:38 UTC (rev 273251)
@@ -1730,7 +1730,7 @@
     auto& speechRecognitionServer = m_speechRecognitionServerMap.add(identifier, nullptr).iterator->value;
     auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& lang, auto& origin, auto&& completionHandler) mutable {
         if (!weakPage) {
-            completionHandler(SpeechRecognitionPermissionDecision::Deny);
+            completionHandler(WebCore::SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Page no longer exists"_s });
             return;
         }
 

Modified: branches/safari-611-branch/Tools/ChangeLog (273250 => 273251)


--- branches/safari-611-branch/Tools/ChangeLog	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Tools/ChangeLog	2021-02-22 17:54:38 UTC (rev 273251)
@@ -1,5 +1,65 @@
 2021-02-17  Ruben Turcios  <[email protected]>
 
+        Cherry-pick r271381. rdar://problem/74451875
+
+    Make SpeechRecognition permission error more informative
+    https://bugs.webkit.org/show_bug.cgi?id=220436
+    
+    Patch by Sihui Liu <[email protected]> on 2021-01-11
+    Reviewed by Youenn Fablet.
+    
+    Source/WebKit:
+    
+    Make SpeechRecognitionPermissionManager complete requests with an optional SpeechRecognitionError instead of a
+    boolean value.
+    
+    * UIProcess/SpeechRecognitionPermissionManager.cpp:
+    (WebKit::SpeechRecognitionPermissionManager::~SpeechRecognitionPermissionManager):
+    (WebKit::SpeechRecognitionPermissionManager::request):
+    (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
+    (WebKit::SpeechRecognitionPermissionManager::continueProcessingRequest):
+    (WebKit::SpeechRecognitionPermissionManager::completeCurrentRequest):
+    (WebKit::SpeechRecognitionPermissionManager::requestSpeechRecognitionServiceAccess):
+    (WebKit::SpeechRecognitionPermissionManager::requestMicrophoneAccess):
+    (WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
+    * UIProcess/SpeechRecognitionPermissionManager.h:
+    * UIProcess/SpeechRecognitionPermissionRequest.h:
+    (WebKit::SpeechRecognitionPermissionRequest::create):
+    (WebKit::SpeechRecognitionPermissionRequest::complete):
+    (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
+    * UIProcess/SpeechRecognitionServer.cpp:
+    (WebKit::SpeechRecognitionServer::requestPermissionForRequest):
+    * UIProcess/SpeechRecognitionServer.h:
+    * UIProcess/WebPageProxy.cpp:
+    (WebKit::WebPageProxy::requestSpeechRecognitionPermission):
+    * UIProcess/WebPageProxy.h:
+    * UIProcess/WebProcessProxy.cpp:
+    (WebKit::WebProcessProxy::createSpeechRecognitionServer):
+    
+    Tools:
+    
+    * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
+    (TestWebKitAPI::TEST):
+    
+    LayoutTests:
+    
+    * fast/speechrecognition/permission-error-expected.txt:
+    * fast/speechrecognition/permission-error.html:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@271381 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-01-11  Sihui Liu  <[email protected]>
+
+            Make SpeechRecognition permission error more informative
+            https://bugs.webkit.org/show_bug.cgi?id=220436
+
+            Reviewed by Youenn Fablet.
+
+            * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
+            (TestWebKitAPI::TEST):
+
+2021-02-17  Ruben Turcios  <[email protected]>
+
         Cherry-pick r272067. rdar://problem/74444347
 
     Support for aria-current state changed notifications.

Modified: branches/safari-611-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm (273250 => 273251)


--- branches/safari-611-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-02-22 17:54:32 UTC (rev 273250)
+++ branches/safari-611-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-02-22 17:54:38 UTC (rev 273251)
@@ -119,7 +119,7 @@
     receivedScriptMessage = false;
     [webView loadTestPageNamed:@"speechrecognition-user-permission-persistence"];
     TestWebKitAPI::Util::run(&receivedScriptMessage);
-    EXPECT_WK_STREQ(@"Error: not-allowed - Permission check failed", [lastScriptMessage body]);
+    EXPECT_WK_STREQ(@"Error: not-allowed - User permission check has failed", [lastScriptMessage body]);
     EXPECT_TRUE(permissionRequested);
 
     // Permission result is remembered.
@@ -127,7 +127,7 @@
     receivedScriptMessage = false;
     [webView stringByEvaluatingJavaScript:@"start()"];
     TestWebKitAPI::Util::run(&receivedScriptMessage);
-    EXPECT_WK_STREQ(@"Error: not-allowed - Permission check failed", [lastScriptMessage body]);
+    EXPECT_WK_STREQ(@"Error: not-allowed - User permission check has failed", [lastScriptMessage body]);
     EXPECT_FALSE(permissionRequested);
 
     // Permission result will be cleared after document changes.
@@ -231,7 +231,7 @@
     receivedScriptMessage = false;
     [webView evaluateJavaScript:@"start()" completionHandler:nil];
     TestWebKitAPI::Util::run(&receivedScriptMessage);
-    EXPECT_WK_STREQ(@"Error: not-allowed - Permission check failed", [lastScriptMessage body]);
+    EXPECT_WK_STREQ(@"Error: not-allowed - Page is not visible to user", [lastScriptMessage body]);
 }
 
 TEST(WebKit2, SpeechRecognitionPageIsDestroyed)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to