Diff
Modified: branches/safari-611-branch/LayoutTests/ChangeLog (273346 => 273347)
--- branches/safari-611-branch/LayoutTests/ChangeLog 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/LayoutTests/ChangeLog 2021-02-23 22:51:16 UTC (rev 273347)
@@ -1,5 +1,96 @@
2021-02-17 Ruben Turcios <rubent...@apple.com>
+ Cherry-pick r272165. rdar://problem/74032536
+
+ Use user media permission prompt for speech recognition
+ https://bugs.webkit.org/show_bug.cgi?id=221082
+ rdar://problem/73372499
+
+ Patch by Sihui Liu <sihui_...@appe.com> 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:
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@272165 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2021-02-01 Sihui Liu <sihui_...@appe.com>
+
+ 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-17 Ruben Turcios <rubent...@apple.com>
+
Cherry-pick r272490. rdar://problem/74409784
Add support for aria-sort change notifications.
Modified: branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error.html (273346 => 273347)
--- branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error.html 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/LayoutTests/fast/speechrecognition/permission-error.html 2021-02-23 22:51:16 UTC (rev 273347)
@@ -7,7 +7,7 @@
if (window.testRunner) {
jsTestIsAsync = true;
- testRunner.setIsSpeechRecognitionPermissionGranted(false);
+ testRunner.setUserMediaPermission(false);
}
shouldNotThrow("recognition = new webkitSpeechRecognition()");
Modified: branches/safari-611-branch/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt (273346 => 273347)
--- branches/safari-611-branch/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html (273346 => 273347)
--- branches/safari-611-branch/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html 2021-02-23 22:51:16 UTC (rev 273347)
@@ -12,7 +12,7 @@
function test()
{
iframe = document.getElementsByTagName('iframe')[0];
- shouldNotThrow("iframe.contentWindow.startRecognition()");
+ shouldThrow("iframe.contentWindow.startRecognition()");
}
function removeFrame()
Modified: branches/safari-611-branch/Source/WebCore/ChangeLog (273346 => 273347)
--- branches/safari-611-branch/Source/WebCore/ChangeLog 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebCore/ChangeLog 2021-02-23 22:51:16 UTC (rev 273347)
@@ -1,5 +1,106 @@
2021-02-17 Ruben Turcios <rubent...@apple.com>
+ Cherry-pick r272165. rdar://problem/74032536
+
+ Use user media permission prompt for speech recognition
+ https://bugs.webkit.org/show_bug.cgi?id=221082
+ rdar://problem/73372499
+
+ Patch by Sihui Liu <sihui_...@appe.com> 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:
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@272165 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2021-02-01 Sihui Liu <sihui_...@appe.com>
+
+ 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-17 Ruben Turcios <rubent...@apple.com>
+
Cherry-pick r271636. rdar://problem/74452635
Update media state for active speech recognition as it uses audio capture
Modified: branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognition.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognition.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognition.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionConnection.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionConnection.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionConnection.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionRequest.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionRequest.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionRequest.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionRequestInfo.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionRequestInfo.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebCore/Modules/speech/SpeechRecognitionRequestInfo.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebCore/page/DummySpeechRecognitionProvider.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebCore/page/DummySpeechRecognitionProvider.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebCore/page/DummySpeechRecognitionProvider.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/ChangeLog (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/ChangeLog 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/ChangeLog 2021-02-23 22:51:16 UTC (rev 273347)
@@ -1,5 +1,129 @@
2021-02-17 Ruben Turcios <rubent...@apple.com>
+ Cherry-pick r272165. rdar://problem/74032536
+
+ Use user media permission prompt for speech recognition
+ https://bugs.webkit.org/show_bug.cgi?id=221082
+ rdar://problem/73372499
+
+ Patch by Sihui Liu <sihui_...@appe.com> 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:
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@272165 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2021-02-01 Sihui Liu <sihui_...@appe.com>
+
+ 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-17 Ruben Turcios <rubent...@apple.com>
+
Cherry-pick r271636. rdar://problem/74452635
Update media state for active speech recognition as it uses audio capture
Modified: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -75,9 +75,9 @@
request->complete(SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Permission manager has exited"_s });
}
-void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<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(SpeechRecognitionError { 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: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.messages.in (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.messages.in 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/SpeechRecognitionServer.messages.in 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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 {
@@ -597,6 +608,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: branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -96,6 +96,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: branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -10295,12 +10295,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)
@@ -10313,8 +10313,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: branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/WebPageProxy.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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"
@@ -1812,8 +1813,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: branches/safari-611-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -1728,13 +1728,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: branches/safari-611-branch/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h (273346 => 273347)
--- branches/safari-611-branch/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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: branches/safari-611-branch/Tools/ChangeLog (273346 => 273347)
--- branches/safari-611-branch/Tools/ChangeLog 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Tools/ChangeLog 2021-02-23 22:51:16 UTC (rev 273347)
@@ -1,5 +1,95 @@
2021-02-17 Ruben Turcios <rubent...@apple.com>
+ Cherry-pick r272165. rdar://problem/74032536
+
+ Use user media permission prompt for speech recognition
+ https://bugs.webkit.org/show_bug.cgi?id=221082
+ rdar://problem/73372499
+
+ Patch by Sihui Liu <sihui_...@appe.com> 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:
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@272165 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2021-02-01 Sihui Liu <sihui_...@appe.com>
+
+ 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-17 Ruben Turcios <rubent...@apple.com>
+
Cherry-pick r271636. rdar://problem/74452635
Update media state for active speech recognition as it uses audio capture
Modified: branches/safari-611-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm (273346 => 273347)
--- branches/safari-611-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm 2021-02-23 22:51:08 UTC (rev 273346)
+++ branches/safari-611-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm 2021-02-23 22:51:16 UTC (rev 273347)
@@ -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