Title: [272165] trunk
Revision
272165
Author
[email protected]
Date
2021-02-01 12:30:42 -0800 (Mon, 01 Feb 2021)

Log Message

Use user media permission prompt for speech recognition
https://bugs.webkit.org/show_bug.cgi?id=221082
rdar://problem/73372499

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

Source/WebCore:

Add frame identifier to SpeechRecognitionRequest as it is needed for checking user media permission.

Updated existing tests for changed behavior.

* Modules/speech/SpeechRecognition.cpp:
(WebCore::SpeechRecognition::startRecognition):
* Modules/speech/SpeechRecognitionConnection.h:
* Modules/speech/SpeechRecognitionRequest.h:
(WebCore::SpeechRecognitionRequest::frameIdentifier const):
* Modules/speech/SpeechRecognitionRequestInfo.h:
(WebCore::SpeechRecognitionRequestInfo::encode const):
(WebCore::SpeechRecognitionRequestInfo::decode):
* page/DummySpeechRecognitionProvider.h:

Source/WebKit:

Make SpeechRecognitionPermissionManager ask UserMediaPermissionRequestManagerProxy for user permission on
microphone.

* UIProcess/SpeechRecognitionPermissionManager.cpp:
(WebKit::SpeechRecognitionPermissionManager::request):
(WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
(WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
* UIProcess/SpeechRecognitionPermissionManager.h:
* UIProcess/SpeechRecognitionPermissionRequest.h:
(WebKit::SpeechRecognitionPermissionRequest::create):
(WebKit::SpeechRecognitionPermissionRequest::frameIdentifier const):
(WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
* UIProcess/SpeechRecognitionServer.cpp:
(WebKit::SpeechRecognitionServer::start):
(WebKit::SpeechRecognitionServer::requestPermissionForRequest):
* UIProcess/SpeechRecognitionServer.h:
* UIProcess/SpeechRecognitionServer.messages.in:
* UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
(WebKit::UserMediaPermissionRequestManagerProxy::denyRequest):
(WebKit::UserMediaPermissionRequestManagerProxy::grantRequest):
(WebKit::UserMediaPermissionRequestManagerProxy::checkUserMediaPermissionForSpeechRecognition):
* UIProcess/UserMediaPermissionRequestManagerProxy.h:
* UIProcess/UserMediaPermissionRequestProxy.cpp:
(WebKit::UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy):
* UIProcess/UserMediaPermissionRequestProxy.h:
(WebKit::UserMediaPermissionRequestProxy::create):
(WebKit::UserMediaPermissionRequestProxy::decisionCompletionHandler):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::requestSpeechRecognitionPermission):
(WebKit::WebPageProxy::requestUserMediaPermissionForSpeechRecognition):
* UIProcess/WebPageProxy.h:
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::createSpeechRecognitionServer):
* WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp:
(WebKit::WebSpeechRecognitionConnection::start):
* WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h:

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
(-[SpeechRecognitionUIDelegate _webView:requestMediaCaptureAuthorization:decisionHandler:]):

LayoutTests:

* fast/speechrecognition/permission-error.html:
* fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt:
* fast/speechrecognition/start-recognition-in-removed-iframe.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (272164 => 272165)


--- trunk/LayoutTests/ChangeLog	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/LayoutTests/ChangeLog	2021-02-01 20:30:42 UTC (rev 272165)
@@ -1,3 +1,15 @@
+2021-02-01  Sihui Liu  <[email protected]>
+
+        Use user media permission prompt for speech recognition
+        https://bugs.webkit.org/show_bug.cgi?id=221082
+        rdar://problem/73372499
+
+        Reviewed by Youenn Fablet.
+
+        * fast/speechrecognition/permission-error.html:
+        * fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt:
+        * fast/speechrecognition/start-recognition-in-removed-iframe.html:
+
 2021-02-01  Rini Patel  <[email protected]>
 
         [GPU Process] Layout tests TestExpectation file rewriting

Modified: trunk/LayoutTests/fast/speechrecognition/permission-error.html (272164 => 272165)


--- trunk/LayoutTests/fast/speechrecognition/permission-error.html	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/LayoutTests/fast/speechrecognition/permission-error.html	2021-02-01 20:30:42 UTC (rev 272165)
@@ -7,7 +7,7 @@
 
 if (window.testRunner) {
     jsTestIsAsync = true;
-    testRunner.setIsSpeechRecognitionPermissionGranted(false);
+    testRunner.setUserMediaPermission(false);
 }
 
 shouldNotThrow("recognition = new webkitSpeechRecognition()");

Modified: trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt (272164 => 272165)


--- trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt	2021-02-01 20:30:42 UTC (rev 272165)
@@ -4,7 +4,7 @@
 
 
 PASS iframe.parentNode.removeChild(iframe) did not throw exception.
-PASS iframe.contentWindow.startRecognition() did not throw exception.
+PASS iframe.contentWindow.startRecognition() threw exception UnknownError: Recognition is not in a valid frame.
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html (272164 => 272165)


--- trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html	2021-02-01 20:30:42 UTC (rev 272165)
@@ -12,7 +12,7 @@
 function test()
 {
     iframe = document.getElementsByTagName('iframe')[0];
-    shouldNotThrow("iframe.contentWindow.startRecognition()");
+    shouldThrow("iframe.contentWindow.startRecognition()");
 }
 
 function removeFrame()

Modified: trunk/Source/WebCore/ChangeLog (272164 => 272165)


--- trunk/Source/WebCore/ChangeLog	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebCore/ChangeLog	2021-02-01 20:30:42 UTC (rev 272165)
@@ -1,3 +1,25 @@
+2021-02-01  Sihui Liu  <[email protected]>
+
+        Use user media permission prompt for speech recognition
+        https://bugs.webkit.org/show_bug.cgi?id=221082
+        rdar://problem/73372499
+
+        Reviewed by Youenn Fablet.
+
+        Add frame identifier to SpeechRecognitionRequest as it is needed for checking user media permission.
+
+        Updated existing tests for changed behavior.
+
+        * Modules/speech/SpeechRecognition.cpp:
+        (WebCore::SpeechRecognition::startRecognition):
+        * Modules/speech/SpeechRecognitionConnection.h:
+        * Modules/speech/SpeechRecognitionRequest.h:
+        (WebCore::SpeechRecognitionRequest::frameIdentifier const):
+        * Modules/speech/SpeechRecognitionRequestInfo.h:
+        (WebCore::SpeechRecognitionRequestInfo::encode const):
+        (WebCore::SpeechRecognitionRequestInfo::decode):
+        * page/DummySpeechRecognitionProvider.h:
+
 2021-02-01  Wenson Hsieh  <[email protected]>
 
         Add some new data structures to represent image extraction results

Modified: trunk/Source/WebCore/Modules/speech/SpeechRecognition.cpp (272164 => 272165)


--- trunk/Source/WebCore/Modules/speech/SpeechRecognition.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebCore/Modules/speech/SpeechRecognition.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -71,7 +71,13 @@
         return Exception { UnknownError, "Recognition does not have a valid connection"_s };
 
     auto& document = downcast<Document>(*scriptExecutionContext());
-    m_connection->start(identifier(), m_lang, m_continuous, m_interimResults, m_maxAlternatives, ClientOrigin { document.topOrigin().data(), document.securityOrigin().data() });
+    auto* frame = document.frame();
+    if (!frame)
+        return Exception { UnknownError, "Recognition is not in a valid frame"_s };
+
+    auto optionalFrameIdentifier = document.frameID();
+    auto frameIdentifier = optionalFrameIdentifier ? *optionalFrameIdentifier : FrameIdentifier { };
+    m_connection->start(identifier(), m_lang, m_continuous, m_interimResults, m_maxAlternatives, ClientOrigin { document.topOrigin().data(), document.securityOrigin().data() }, frameIdentifier);
     m_state = State::Starting;
     return { };
 }

Modified: trunk/Source/WebCore/Modules/speech/SpeechRecognitionConnection.h (272164 => 272165)


--- trunk/Source/WebCore/Modules/speech/SpeechRecognitionConnection.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebCore/Modules/speech/SpeechRecognitionConnection.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "FrameIdentifier.h"
 #include "SpeechRecognitionConnectionClientIdentifier.h"
 
 namespace WebCore {
@@ -38,7 +39,7 @@
     virtual ~SpeechRecognitionConnection() { }
     virtual void registerClient(SpeechRecognitionConnectionClient&) = 0;
     virtual void unregisterClient(SpeechRecognitionConnectionClient&) = 0;
-    virtual void start(SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, ClientOrigin&&) = 0;
+    virtual void start(SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, ClientOrigin&&, FrameIdentifier) = 0;
     virtual void stop(SpeechRecognitionConnectionClientIdentifier) = 0;
     virtual void abort(SpeechRecognitionConnectionClientIdentifier) = 0;
     virtual void didReceiveUpdate(SpeechRecognitionUpdate&&) = 0;

Modified: trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequest.h (272164 => 272165)


--- trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequest.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequest.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -41,6 +41,7 @@
     bool interimResults() const { return m_info.interimResults; }
     uint64_t maxAlternatives() const { return m_info.maxAlternatives; }
     const ClientOrigin clientOrigin() const { return m_info.clientOrigin; }
+    FrameIdentifier frameIdentifier() const { return m_info.frameIdentifier; }
 
 private:
     SpeechRecognitionRequestInfo m_info;

Modified: trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequestInfo.h (272164 => 272165)


--- trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequestInfo.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequestInfo.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "ClientOrigin.h"
+#include "FrameIdentifier.h"
 #include "SpeechRecognitionConnectionClientIdentifier.h"
 
 namespace WebCore {
@@ -37,6 +38,7 @@
     bool interimResults { false };
     uint64_t maxAlternatives { 1 };
     ClientOrigin clientOrigin;
+    FrameIdentifier frameIdentifier;
 
     template<class Encoder> void encode(Encoder&) const;
     template<class Decoder> static Optional<SpeechRecognitionRequestInfo> decode(Decoder&);
@@ -45,7 +47,7 @@
 template<class Encoder>
 void SpeechRecognitionRequestInfo::encode(Encoder& encoder) const
 {
-    encoder << clientIdentifier << lang << continuous << interimResults << maxAlternatives << clientOrigin;
+    encoder << clientIdentifier << lang << continuous << interimResults << maxAlternatives << clientOrigin << frameIdentifier;
 }
 
 template<class Decoder>
@@ -81,6 +83,11 @@
     if (!clientOrigin)
         return WTF::nullopt;
 
+    Optional<FrameIdentifier> frameIdentifier;
+    decoder >> frameIdentifier;
+    if (!frameIdentifier)
+        return WTF::nullopt;
+
     return {{
         WTFMove(*clientIdentifier),
         WTFMove(*lang),
@@ -87,7 +94,8 @@
         WTFMove(*continuous),
         WTFMove(*interimResults),
         WTFMove(*maxAlternatives),
-        WTFMove(*clientOrigin)
+        WTFMove(*clientOrigin),
+        WTFMove(*frameIdentifier)
     }};
 }
 

Modified: trunk/Source/WebCore/page/DummySpeechRecognitionProvider.h (272164 => 272165)


--- trunk/Source/WebCore/page/DummySpeechRecognitionProvider.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebCore/page/DummySpeechRecognitionProvider.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -40,7 +40,7 @@
         }
         void registerClient(SpeechRecognitionConnectionClient&) final { }
         void unregisterClient(SpeechRecognitionConnectionClient&) final { }
-        void start(SpeechRecognitionConnectionClientIdentifier, const String&, bool, bool, uint64_t, ClientOrigin&&) final { }
+        void start(SpeechRecognitionConnectionClientIdentifier, const String&, bool, bool, uint64_t, ClientOrigin&&, FrameIdentifier) final { }
         void stop(SpeechRecognitionConnectionClientIdentifier) final { }
         void abort(SpeechRecognitionConnectionClientIdentifier) final { }
         void didReceiveUpdate(SpeechRecognitionUpdate&&) final { }

Modified: trunk/Source/WebKit/ChangeLog (272164 => 272165)


--- trunk/Source/WebKit/ChangeLog	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/ChangeLog	2021-02-01 20:30:42 UTC (rev 272165)
@@ -1,3 +1,48 @@
+2021-02-01  Sihui Liu  <[email protected]>
+
+        Use user media permission prompt for speech recognition
+        https://bugs.webkit.org/show_bug.cgi?id=221082
+        rdar://problem/73372499
+
+        Reviewed by Youenn Fablet.
+
+        Make SpeechRecognitionPermissionManager ask UserMediaPermissionRequestManagerProxy for user permission on 
+        microphone.
+
+        * UIProcess/SpeechRecognitionPermissionManager.cpp:
+        (WebKit::SpeechRecognitionPermissionManager::request):
+        (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest):
+        (WebKit::SpeechRecognitionPermissionManager::requestUserPermission):
+        * UIProcess/SpeechRecognitionPermissionManager.h:
+        * UIProcess/SpeechRecognitionPermissionRequest.h:
+        (WebKit::SpeechRecognitionPermissionRequest::create):
+        (WebKit::SpeechRecognitionPermissionRequest::frameIdentifier const):
+        (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest):
+        * UIProcess/SpeechRecognitionServer.cpp:
+        (WebKit::SpeechRecognitionServer::start):
+        (WebKit::SpeechRecognitionServer::requestPermissionForRequest):
+        * UIProcess/SpeechRecognitionServer.h:
+        * UIProcess/SpeechRecognitionServer.messages.in:
+        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+        (WebKit::UserMediaPermissionRequestManagerProxy::denyRequest):
+        (WebKit::UserMediaPermissionRequestManagerProxy::grantRequest):
+        (WebKit::UserMediaPermissionRequestManagerProxy::checkUserMediaPermissionForSpeechRecognition):
+        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
+        * UIProcess/UserMediaPermissionRequestProxy.cpp:
+        (WebKit::UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy):
+        * UIProcess/UserMediaPermissionRequestProxy.h:
+        (WebKit::UserMediaPermissionRequestProxy::create):
+        (WebKit::UserMediaPermissionRequestProxy::decisionCompletionHandler):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::requestSpeechRecognitionPermission):
+        (WebKit::WebPageProxy::requestUserMediaPermissionForSpeechRecognition):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::createSpeechRecognitionServer):
+        * WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp:
+        (WebKit::WebSpeechRecognitionConnection::start):
+        * WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h:
+
 2021-02-01  Wenson Hsieh  <[email protected]>
 
         Add some new data structures to represent image extraction results

Modified: trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -75,9 +75,9 @@
         request->complete(WebCore::SpeechRecognitionError { WebCore::SpeechRecognitionErrorType::NotAllowed, "Permission manager has exited"_s });
 }
     
-void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completiontHandler)
+void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, WebCore::FrameIdentifier frameIdentifier, SpeechRecognitionPermissionRequestCallback&& completiontHandler)
 {
-    m_requests.append(SpeechRecognitionPermissionRequest::create(lang, origin, WTFMove(completiontHandler)));
+    m_requests.append(SpeechRecognitionPermissionRequest::create(lang, origin, frameIdentifier, WTFMove(completiontHandler)));
     if (m_requests.size() == 1)
         startNextRequest();
 }
@@ -125,15 +125,6 @@
 #endif
     }
 
-    // We currently don't allow third-party access.
-    if (m_userPermissionCheck == CheckResult::Unknown) {
-        auto clientOrigin = m_requests.first()->origin();
-        auto requestingOrigin = clientOrigin.clientOrigin.securityOrigin();
-        auto topOrigin = clientOrigin.topOrigin.securityOrigin();
-        if (!requestingOrigin->isSameOriginAs(topOrigin))
-            m_userPermissionCheck = CheckResult::Denied;
-    }
-
     if (m_userPermissionCheck == CheckResult::Denied) {
         completeCurrentRequest(WebCore::SpeechRecognitionError { WebCore::SpeechRecognitionErrorType::NotAllowed, "User permission check has failed"_s });
         return;
@@ -225,6 +216,7 @@
 
     auto& currentRequest = m_requests.first();
     auto clientOrigin = currentRequest->origin();
+    auto requestingOrigin = clientOrigin.clientOrigin.securityOrigin();
     auto topOrigin = clientOrigin.topOrigin.securityOrigin();
     auto decisionHandler = [this, weakThis = makeWeakPtr(*this)](bool granted) {
         if (!weakThis)
@@ -238,7 +230,7 @@
 
         continueProcessingRequest();
     };
-    m_page.uiClient().decidePolicyForSpeechRecognitionPermissionRequest(m_page, API::SecurityOrigin::create(topOrigin.get()).get(), WTFMove(decisionHandler));
+    m_page.requestUserMediaPermissionForSpeechRecognition(currentRequest->frameIdentifier(), requestingOrigin, topOrigin, WTFMove(decisionHandler));
 }
 
 void SpeechRecognitionPermissionManager::decideByDefaultAction(const WebCore::SecurityOrigin& origin, CompletionHandler<void(bool)>&& completionHandler)

Modified: trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -39,7 +39,7 @@
     enum class CheckResult { Denied, Granted, Unknown };
     explicit SpeechRecognitionPermissionManager(WebPageProxy&);
     ~SpeechRecognitionPermissionManager();
-    void request(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&);
+    void request(const String& lang, const WebCore::ClientOrigin&, WebCore::FrameIdentifier, SpeechRecognitionPermissionRequestCallback&&);
 
     void decideByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&);
     WebPageProxy& page() { return m_page; }

Modified: trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -27,16 +27,19 @@
 
 #include "APIObject.h"
 #include <WebCore/ClientOrigin.h>
+#include <WebCore/FrameIdentifier.h>
 #include <WebCore/SpeechRecognitionError.h>
 #include <wtf/CompletionHandler.h>
 
 namespace WebKit {
 
+using SpeechRecognitionPermissionRequestCallback = CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>;
+
 class SpeechRecognitionPermissionRequest : public RefCounted<SpeechRecognitionPermissionRequest> {
 public:
-    static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler)
+    static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, WebCore::FrameIdentifier frameIdentifier, SpeechRecognitionPermissionRequestCallback&& completionHandler)
     {
-        return adoptRef(*new SpeechRecognitionPermissionRequest(lang, origin, WTFMove(completionHandler)));
+        return adoptRef(*new SpeechRecognitionPermissionRequest(lang, origin, frameIdentifier, WTFMove(completionHandler)));
     }
 
     void complete(Optional<WebCore::SpeechRecognitionError>&& error)
@@ -47,17 +50,20 @@
 
     const WebCore::ClientOrigin& origin() const { return m_origin; }
     const String& lang() const { return m_lang; }
+    WebCore::FrameIdentifier frameIdentifier() const { return m_frameIdentifier; }
 
 private:
-    SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler)
+    SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, WebCore::FrameIdentifier frameIdentifier, SpeechRecognitionPermissionRequestCallback&& completionHandler)
         : m_lang(lang)
         , m_origin(origin)
+        , m_frameIdentifier(frameIdentifier)
         , m_completionHandler(WTFMove(completionHandler))
     { }
 
     String m_lang;
     WebCore::ClientOrigin m_origin;
-    CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)> m_completionHandler;
+    WebCore::FrameIdentifier m_frameIdentifier;
+    SpeechRecognitionPermissionRequestCallback m_completionHandler;
 };
 
 class SpeechRecognitionPermissionCallback : public API::ObjectImpl<API::Object::Type::SpeechRecognitionPermissionCallback> {

Modified: trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -26,7 +26,6 @@
 #include "config.h"
 #include "SpeechRecognitionServer.h"
 
-#include "SpeechRecognitionPermissionRequest.h"
 #include "UserMediaProcessManager.h"
 #include "WebProcessProxy.h"
 #include "WebSpeechRecognitionConnectionMessages.h"
@@ -52,11 +51,11 @@
 {
 }
 
-void SpeechRecognitionServer::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& origin)
+void SpeechRecognitionServer::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& origin, WebCore::FrameIdentifier frameIdentifier)
 {
     MESSAGE_CHECK(clientIdentifier);
     ASSERT(!m_requests.contains(clientIdentifier));
-    auto requestInfo = WebCore::SpeechRecognitionRequestInfo { clientIdentifier, WTFMove(lang), continuous, interimResults, maxAlternatives, WTFMove(origin) };
+    auto requestInfo = WebCore::SpeechRecognitionRequestInfo { clientIdentifier, WTFMove(lang), continuous, interimResults, maxAlternatives, WTFMove(origin), frameIdentifier };
     auto& newRequest = m_requests.add(clientIdentifier, makeUnique<WebCore::SpeechRecognitionRequest>(WTFMove(requestInfo))).iterator->value;
 
     requestPermissionForRequest(*newRequest);
@@ -64,7 +63,7 @@
 
 void SpeechRecognitionServer::requestPermissionForRequest(WebCore::SpeechRecognitionRequest& request)
 {
-    m_permissionChecker(request.lang(), request.clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto error) mutable {
+    m_permissionChecker(request.lang(), request.clientOrigin(), request.frameIdentifier(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto error) mutable {
         if (!weakThis)
             return;
 

Modified: trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.h (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -27,6 +27,7 @@
 
 #include "MessageReceiver.h"
 #include "MessageSender.h"
+#include "SpeechRecognitionPermissionRequest.h"
 #include <WebCore/PageIdentifier.h>
 #include <WebCore/SpeechRecognitionError.h>
 #include <WebCore/SpeechRecognitionRequest.h>
@@ -45,7 +46,7 @@
 class WebProcessProxy;
 
 using SpeechRecognitionServerIdentifier = WebCore::PageIdentifier;
-using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&)>;
+using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, WebCore::FrameIdentifier, SpeechRecognitionPermissionRequestCallback&&)>;
 using SpeechRecognitionCheckIfMockSpeechRecognitionEnabled = Function<bool()>;
 
 class SpeechRecognitionServer : public CanMakeWeakPtr<SpeechRecognitionServer>, public IPC::MessageReceiver, private IPC::MessageSender {
@@ -58,7 +59,7 @@
     SpeechRecognitionServer(Ref<IPC::Connection>&&, SpeechRecognitionServerIdentifier, SpeechRecognitionPermissionChecker&&, SpeechRecognitionCheckIfMockSpeechRecognitionEnabled&&);
 #endif
 
-    void start(WebCore::SpeechRecognitionConnectionClientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&&);
+    void start(WebCore::SpeechRecognitionConnectionClientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&&, WebCore::FrameIdentifier);
     void stop(WebCore::SpeechRecognitionConnectionClientIdentifier);
     void abort(WebCore::SpeechRecognitionConnectionClientIdentifier);
     void invalidate(WebCore::SpeechRecognitionConnectionClientIdentifier);

Modified: trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.messages.in (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.messages.in	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.messages.in	2021-02-01 20:30:42 UTC (rev 272165)
@@ -24,7 +24,7 @@
  */
  
  messages -> SpeechRecognitionServer NotRefCounted {
-    Start(WebCore::SpeechRecognitionConnectionClientIdentifier identifier, String lang, bool continuous, bool interimResults, uint64_t maxAlternatives, struct WebCore::ClientOrigin origin)
+    Start(WebCore::SpeechRecognitionConnectionClientIdentifier identifier, String lang, bool continuous, bool interimResults, uint64_t maxAlternatives, struct WebCore::ClientOrigin origin, WebCore::FrameIdentifier frameIdentifier)
     Stop(WebCore::SpeechRecognitionConnectionClientIdentifier identifier)
     Abort(WebCore::SpeechRecognitionConnectionClientIdentifier identifier)
     Invalidate(WebCore::SpeechRecognitionConnectionClientIdentifier identifier)

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -213,6 +213,11 @@
     if (reason == UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::PermissionDenied)
         m_deniedRequests.append(DeniedRequest { request.mainFrameID(), request.userMediaDocumentSecurityOrigin(), request.topLevelDocumentSecurityOrigin(), request.requiresAudioCapture(), request.requiresVideoCapture(), request.requiresDisplayCapture() });
 
+    if (auto callback = request.decisionCompletionHandler()) {
+        callback(false);
+        return;
+    }
+
 #if ENABLE(MEDIA_STREAM)
     if (m_pregrantedRequests.isEmpty() && request.userRequest().audioConstraints.isValid)
         RealtimeMediaSourceCenter::singleton().audioCaptureFactory().removeExtensiveObserver(*this);
@@ -234,6 +239,12 @@
 #if ENABLE(MEDIA_STREAM)
     ALWAYS_LOG(LOGIDENTIFIER, request.userMediaID(), ", video: ", request.videoDevice().label(), ", audio: ", request.audioDevice().label());
 
+    if (auto callback = request.decisionCompletionHandler()) {
+        m_grantedRequests.append(makeRef(request));
+        callback(true);
+        return;
+    }
+
     auto& userMediaDocumentSecurityOrigin = request.userMediaDocumentSecurityOrigin();
     auto& topLevelDocumentSecurityOrigin = request.topLevelDocumentSecurityOrigin();
     m_page.websiteDataStore().deviceIdHashSaltStorage().deviceIdHashSaltForOrigin(userMediaDocumentSecurityOrigin, topLevelDocumentSecurityOrigin, [this, weakThis = makeWeakPtr(*this), request = makeRef(request)](String&&) mutable {
@@ -602,6 +613,33 @@
     m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *webFrame, WTFMove(userMediaOrigin), WTFMove(topLevelOrigin), *m_currentUserMediaRequest);
 }
 
+void UserMediaPermissionRequestManagerProxy::checkUserMediaPermissionForSpeechRecognition(WebCore::FrameIdentifier frameIdentifier, const WebCore::SecurityOrigin& requestingOrigin, const WebCore::SecurityOrigin& topOrigin, const WebCore::CaptureDevice& device, CompletionHandler<void(bool)>&& completionHandler)
+{
+    auto* frame = m_page.process().webFrame(frameIdentifier);
+    if (!frame || !SecurityOrigin::createFromString(m_page.pageLoadState().activeURL())->isSameSchemeHostPort(topOrigin)) {
+        completionHandler(false);
+        return;
+    }
+
+    auto request = UserMediaPermissionRequestProxy::create(*this, 0, frameIdentifier, frameIdentifier, requestingOrigin.isolatedCopy(), topOrigin.isolatedCopy(), Vector<WebCore::CaptureDevice> { device }, { }, { }, WTFMove(completionHandler));
+
+    auto action = ""
+    if (action == RequestAction::Deny) {
+        completionHandler(false);
+        return;
+    }
+    
+    if (action == RequestAction::Grant) {
+        completionHandler(true);
+        return;
+    }
+
+    auto apiRequestingOrigin = API::SecurityOrigin::create(requestingOrigin);
+    auto apiTopOrigin = API::SecurityOrigin::create(topOrigin);
+    m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *frame, WTFMove(apiRequestingOrigin), WTFMove(apiTopOrigin), request.get());
+}
+
+
 #if !PLATFORM(COCOA)
 void UserMediaPermissionRequestManagerProxy::requestSystemValidation(const WebPageProxy&, UserMediaPermissionRequestProxy&, CompletionHandler<void(bool)>&& callback)
 {

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -97,6 +97,8 @@
     void setMockCaptureDevicesEnabledOverride(Optional<bool>);
     bool hasPendingCapture() const { return m_hasPendingCapture; }
 
+    void checkUserMediaPermissionForSpeechRecognition(WebCore::FrameIdentifier, const WebCore::SecurityOrigin&, const WebCore::SecurityOrigin&, const WebCore::CaptureDevice&, CompletionHandler<void(bool)>&&);
+
 private:
 #if !RELEASE_LOG_DISABLED
     const Logger& logger() const final;

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -31,7 +31,7 @@
 namespace WebKit {
 using namespace WebCore;
 
-UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, FrameIdentifier mainFrameID, FrameIdentifier frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, WebCore::MediaStreamRequest&& request)
+UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, FrameIdentifier mainFrameID, FrameIdentifier frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, WebCore::MediaStreamRequest&& request, CompletionHandler<void(bool)>&& decisionCompletionHandler)
     : m_manager(&manager)
     , m_userMediaID(userMediaID)
     , m_mainFrameID(mainFrameID)
@@ -41,6 +41,7 @@
     , m_eligibleVideoDevices(WTFMove(videoDevices))
     , m_eligibleAudioDevices(WTFMove(audioDevices))
     , m_request(WTFMove(request))
+    , m_decisionCompletionHandler(WTFMove(decisionCompletionHandler))
 {
 }
 
@@ -99,6 +100,8 @@
 void UserMediaPermissionRequestProxy::invalidate()
 {
     m_manager = nullptr;
+    if (m_decisionCompletionHandler)
+        m_decisionCompletionHandler(false);
 }
 
 Vector<String> UserMediaPermissionRequestProxy::videoDeviceUIDs() const

Modified: trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -23,6 +23,7 @@
 #include <WebCore/CaptureDevice.h>
 #include <WebCore/FrameIdentifier.h>
 #include <WebCore/MediaStreamRequest.h>
+#include <wtf/CompletionHandler.h>
 #include <wtf/Vector.h>
 #include <wtf/text/WTFString.h>
 
@@ -36,9 +37,9 @@
 
 class UserMediaPermissionRequestProxy : public API::ObjectImpl<API::Object::Type::UserMediaPermissionRequest> {
 public:
-    static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, WebCore::FrameIdentifier mainFrameID, WebCore::FrameIdentifier frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, WebCore::MediaStreamRequest&& request)
+    static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, WebCore::FrameIdentifier mainFrameID, WebCore::FrameIdentifier frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, WebCore::MediaStreamRequest&& request, CompletionHandler<void(bool)>&& decisionCompletionHandler = { })
     {
-        return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(request)));
+        return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(request), WTFMove(decisionCompletionHandler)));
     }
 
     void allow(const String& audioDeviceUID, const String& videoDeviceUID);
@@ -89,8 +90,10 @@
 #endif
     void doDefaultAction();
 
+    CompletionHandler<void(bool)> decisionCompletionHandler() { return std::exchange(m_decisionCompletionHandler, { }); }
+
 private:
-    UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, WebCore::FrameIdentifier mainFrameID, WebCore::FrameIdentifier, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, WebCore::MediaStreamRequest&&);
+    UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, WebCore::FrameIdentifier mainFrameID, WebCore::FrameIdentifier, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<WebCore::CaptureDevice>&& audioDevices, Vector<WebCore::CaptureDevice>&& videoDevices, WebCore::MediaStreamRequest&&, CompletionHandler<void(bool)>&&);
 
     UserMediaPermissionRequestManagerProxy* m_manager;
     uint64_t m_userMediaID;
@@ -103,6 +106,7 @@
     WebCore::MediaStreamRequest m_request;
     bool m_hasPersistentAccess { false };
     String m_deviceIdentifierHashSalt;
+    CompletionHandler<void(bool)> m_decisionCompletionHandler;
 };
 
 String convertEnumerationToString(UserMediaPermissionRequestProxy::UserMediaAccessDenialReason);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -10397,12 +10397,12 @@
     });
 }
 
-void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completionHandler)
+void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, WebCore::FrameIdentifier frameIdentifier, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completionHandler)
 {
     if (!m_speechRecognitionPermissionManager)
         m_speechRecognitionPermissionManager = makeUnique<SpeechRecognitionPermissionManager>(*this);
 
-    m_speechRecognitionPermissionManager->request(lang, clientOrigin, WTFMove(completionHandler));
+    m_speechRecognitionPermissionManager->request(lang, clientOrigin, frameIdentifier, WTFMove(completionHandler));
 }
 
 void WebPageProxy::requestSpeechRecognitionPermissionByDefaultAction(const WebCore::SecurityOrigin& origin, CompletionHandler<void(bool)>&& completionHandler)
@@ -10415,8 +10415,21 @@
     m_speechRecognitionPermissionManager->decideByDefaultAction(origin, WTFMove(completionHandler));
 }
 
+void WebPageProxy::requestUserMediaPermissionForSpeechRecognition(FrameIdentifier frameIdentifier, const WebCore::SecurityOrigin& requestingOrigin, const WebCore::SecurityOrigin& topOrigin, CompletionHandler<void(bool)>&& completionHandler)
+{
 #if ENABLE(MEDIA_STREAM)
+    auto captureDevice = SpeechRecognitionCaptureSource::findCaptureDevice();
+    if (!captureDevice)
+        completionHandler(false);
 
+    userMediaPermissionRequestManager().checkUserMediaPermissionForSpeechRecognition(frameIdentifier, requestingOrigin, topOrigin, *captureDevice, WTFMove(completionHandler));
+#else
+    completionHandler(false);
+#endif
+}
+
+#if ENABLE(MEDIA_STREAM)
+
 WebCore::CaptureSourceOrError WebPageProxy::createRealtimeMediaSourceForSpeechRecognition()
 {
     if (preferences().captureAudioInGPUProcessEnabled())

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -52,6 +52,7 @@
 #include "SandboxExtension.h"
 #include "ShareableBitmap.h"
 #include "ShareableResource.h"
+#include "SpeechRecognitionPermissionRequest.h"
 #include "SuspendedPageProxy.h"
 #include "SyntheticEditingCommandType.h"
 #include "SystemPreviewController.h"
@@ -1816,8 +1817,9 @@
     void setMediaCaptureReportingDelay(Seconds captureReportingDelay) { m_mediaCaptureReportingDelay = captureReportingDelay; }
     size_t suspendMediaPlaybackCounter() { return m_suspendMediaPlaybackCounter; }
 
-    void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&);
+    void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, WebCore::FrameIdentifier, SpeechRecognitionPermissionRequestCallback&&);
     void requestSpeechRecognitionPermissionByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&);
+    void requestUserMediaPermissionForSpeechRecognition(WebCore::FrameIdentifier, const WebCore::SecurityOrigin&, const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&);
 
     void syncIfMockDevicesEnabledChanged();
 

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (272164 => 272165)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -1722,13 +1722,13 @@
 
     ASSERT(!m_speechRecognitionServerMap.contains(identifier));
     auto& speechRecognitionServer = m_speechRecognitionServerMap.add(identifier, nullptr).iterator->value;
-    auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& lang, auto& origin, auto&& completionHandler) mutable {
+    auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& lang, auto& origin, auto frameIdentifier, auto&& completionHandler) mutable {
         if (!weakPage) {
             completionHandler(WebCore::SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Page no longer exists"_s });
             return;
         }
 
-        weakPage->requestSpeechRecognitionPermission(lang, origin, WTFMove(completionHandler));
+        weakPage->requestSpeechRecognitionPermission(lang, origin, frameIdentifier, WTFMove(completionHandler));
     };
     auto checkIfMockCaptureDevicesEnabled = [weakPage = makeWeakPtr(targetPage)]() {
         return weakPage && weakPage->preferences().mockCaptureDevicesEnabled();

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp (272164 => 272165)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp	2021-02-01 20:30:42 UTC (rev 272165)
@@ -27,6 +27,7 @@
 #include "WebSpeechRecognitionConnection.h"
 
 #include "SpeechRecognitionServerMessages.h"
+#include "WebFrame.h"
 #include "WebProcess.h"
 #include "WebProcessProxyMessages.h"
 #include "WebSpeechRecognitionConnectionMessages.h"
@@ -68,9 +69,9 @@
     m_clientMap.remove(client.identifier());
 }
 
-void WebSpeechRecognitionConnection::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& clientOrigin)
+void WebSpeechRecognitionConnection::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& clientOrigin, WebCore::FrameIdentifier frameIdentifier)
 {
-    send(Messages::SpeechRecognitionServer::Start(clientIdentifier, lang, continuous, interimResults, maxAlternatives, WTFMove(clientOrigin)));
+    send(Messages::SpeechRecognitionServer::Start(clientIdentifier, lang, continuous, interimResults, maxAlternatives, WTFMove(clientOrigin), frameIdentifier));
 }
 
 void WebSpeechRecognitionConnection::stop(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier)

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h (272164 => 272165)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h	2021-02-01 20:30:42 UTC (rev 272165)
@@ -47,7 +47,7 @@
 public:
     static Ref<WebSpeechRecognitionConnection> create(SpeechRecognitionConnectionIdentifier);
 
-    void start(WebCore::SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&&) final;
+    void start(WebCore::SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&&, WebCore::FrameIdentifier) final;
     void stop(WebCore::SpeechRecognitionConnectionClientIdentifier) final;
     void abort(WebCore::SpeechRecognitionConnectionClientIdentifier) final;
 

Modified: trunk/Tools/ChangeLog (272164 => 272165)


--- trunk/Tools/ChangeLog	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Tools/ChangeLog	2021-02-01 20:30:42 UTC (rev 272165)
@@ -1,3 +1,14 @@
+2021-02-01  Sihui Liu  <[email protected]>
+
+        Use user media permission prompt for speech recognition
+        https://bugs.webkit.org/show_bug.cgi?id=221082
+        rdar://problem/73372499
+
+        Reviewed by Youenn Fablet.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
+        (-[SpeechRecognitionUIDelegate _webView:requestMediaCaptureAuthorization:decisionHandler:]):
+
 2021-02-01  Aakash Jain  <[email protected]>
 
         [build.webkit.org] is_test_mode_enabled should default to True

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm (272164 => 272165)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-02-01 20:22:05 UTC (rev 272164)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-02-01 20:30:42 UTC (rev 272165)
@@ -60,7 +60,8 @@
 
 - (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorization: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler
 {
-    decisionHandler(YES);
+    permissionRequested = true;
+    decisionHandler(shouldGrantPermissionRequest);
 }
 
 - (void)_webView:(WKWebView *)webView checkUserMediaPermissionForURL:(NSURL *)url mainFrameURL:(NSURL *)mainFrameURL frameIdentifier:(NSUInteger)frameIdentifier decisionHandler:(void (^)(NSString *salt, BOOL authorized))decisionHandler
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to