Changeset 272165 in webkit
- Timestamp:
- Feb 1, 2021 12:30:42 PM (3 years ago)
- Location:
- trunk
- Files:
-
- 28 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r272153 r272165 1 2021-02-01 Sihui Liu <sihui_liu@appe.com> 2 3 Use user media permission prompt for speech recognition 4 https://bugs.webkit.org/show_bug.cgi?id=221082 5 rdar://problem/73372499 6 7 Reviewed by Youenn Fablet. 8 9 * fast/speechrecognition/permission-error.html: 10 * fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt: 11 * fast/speechrecognition/start-recognition-in-removed-iframe.html: 12 1 13 2021-02-01 Rini Patel <rini_patel@apple.com> 2 14 -
trunk/LayoutTests/fast/speechrecognition/permission-error.html
r271381 r272165 8 8 if (window.testRunner) { 9 9 jsTestIsAsync = true; 10 testRunner.set IsSpeechRecognitionPermissionGranted(false);10 testRunner.setUserMediaPermission(false); 11 11 } 12 12 -
trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe-expected.txt
r269810 r272165 5 5 6 6 PASS iframe.parentNode.removeChild(iframe) did not throw exception. 7 PASS iframe.contentWindow.startRecognition() did not throw exception.7 PASS iframe.contentWindow.startRecognition() threw exception UnknownError: Recognition is not in a valid frame. 8 8 PASS successfullyParsed is true 9 9 -
trunk/LayoutTests/fast/speechrecognition/start-recognition-in-removed-iframe.html
r270158 r272165 13 13 { 14 14 iframe = document.getElementsByTagName('iframe')[0]; 15 should NotThrow("iframe.contentWindow.startRecognition()");15 shouldThrow("iframe.contentWindow.startRecognition()"); 16 16 } 17 17 -
trunk/Source/WebCore/ChangeLog
r272164 r272165 1 2021-02-01 Sihui Liu <sihui_liu@appe.com> 2 3 Use user media permission prompt for speech recognition 4 https://bugs.webkit.org/show_bug.cgi?id=221082 5 rdar://problem/73372499 6 7 Reviewed by Youenn Fablet. 8 9 Add frame identifier to SpeechRecognitionRequest as it is needed for checking user media permission. 10 11 Updated existing tests for changed behavior. 12 13 * Modules/speech/SpeechRecognition.cpp: 14 (WebCore::SpeechRecognition::startRecognition): 15 * Modules/speech/SpeechRecognitionConnection.h: 16 * Modules/speech/SpeechRecognitionRequest.h: 17 (WebCore::SpeechRecognitionRequest::frameIdentifier const): 18 * Modules/speech/SpeechRecognitionRequestInfo.h: 19 (WebCore::SpeechRecognitionRequestInfo::encode const): 20 (WebCore::SpeechRecognitionRequestInfo::decode): 21 * page/DummySpeechRecognitionProvider.h: 22 1 23 2021-02-01 Wenson Hsieh <wenson_hsieh@apple.com> 2 24 -
trunk/Source/WebCore/Modules/speech/SpeechRecognition.cpp
r271791 r272165 72 72 73 73 auto& document = downcast<Document>(*scriptExecutionContext()); 74 m_connection->start(identifier(), m_lang, m_continuous, m_interimResults, m_maxAlternatives, ClientOrigin { document.topOrigin().data(), document.securityOrigin().data() }); 74 auto* frame = document.frame(); 75 if (!frame) 76 return Exception { UnknownError, "Recognition is not in a valid frame"_s }; 77 78 auto optionalFrameIdentifier = document.frameID(); 79 auto frameIdentifier = optionalFrameIdentifier ? *optionalFrameIdentifier : FrameIdentifier { }; 80 m_connection->start(identifier(), m_lang, m_continuous, m_interimResults, m_maxAlternatives, ClientOrigin { document.topOrigin().data(), document.securityOrigin().data() }, frameIdentifier); 75 81 m_state = State::Starting; 76 82 return { }; -
trunk/Source/WebCore/Modules/speech/SpeechRecognitionConnection.h
r271636 r272165 26 26 #pragma once 27 27 28 #include "FrameIdentifier.h" 28 29 #include "SpeechRecognitionConnectionClientIdentifier.h" 29 30 … … 39 40 virtual void registerClient(SpeechRecognitionConnectionClient&) = 0; 40 41 virtual void unregisterClient(SpeechRecognitionConnectionClient&) = 0; 41 virtual void start(SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, ClientOrigin&& ) = 0;42 virtual void start(SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, ClientOrigin&&, FrameIdentifier) = 0; 42 43 virtual void stop(SpeechRecognitionConnectionClientIdentifier) = 0; 43 44 virtual void abort(SpeechRecognitionConnectionClientIdentifier) = 0; -
trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequest.h
r269810 r272165 42 42 uint64_t maxAlternatives() const { return m_info.maxAlternatives; } 43 43 const ClientOrigin clientOrigin() const { return m_info.clientOrigin; } 44 FrameIdentifier frameIdentifier() const { return m_info.frameIdentifier; } 44 45 45 46 private: -
trunk/Source/WebCore/Modules/speech/SpeechRecognitionRequestInfo.h
r269810 r272165 27 27 28 28 #include "ClientOrigin.h" 29 #include "FrameIdentifier.h" 29 30 #include "SpeechRecognitionConnectionClientIdentifier.h" 30 31 … … 38 39 uint64_t maxAlternatives { 1 }; 39 40 ClientOrigin clientOrigin; 41 FrameIdentifier frameIdentifier; 40 42 41 43 template<class Encoder> void encode(Encoder&) const; … … 46 48 void SpeechRecognitionRequestInfo::encode(Encoder& encoder) const 47 49 { 48 encoder << clientIdentifier << lang << continuous << interimResults << maxAlternatives << clientOrigin ;50 encoder << clientIdentifier << lang << continuous << interimResults << maxAlternatives << clientOrigin << frameIdentifier; 49 51 } 50 52 … … 82 84 return WTF::nullopt; 83 85 86 Optional<FrameIdentifier> frameIdentifier; 87 decoder >> frameIdentifier; 88 if (!frameIdentifier) 89 return WTF::nullopt; 90 84 91 return {{ 85 92 WTFMove(*clientIdentifier), … … 88 95 WTFMove(*interimResults), 89 96 WTFMove(*maxAlternatives), 90 WTFMove(*clientOrigin) 97 WTFMove(*clientOrigin), 98 WTFMove(*frameIdentifier) 91 99 }}; 92 100 } -
trunk/Source/WebCore/page/DummySpeechRecognitionProvider.h
r271636 r272165 41 41 void registerClient(SpeechRecognitionConnectionClient&) final { } 42 42 void unregisterClient(SpeechRecognitionConnectionClient&) final { } 43 void start(SpeechRecognitionConnectionClientIdentifier, const String&, bool, bool, uint64_t, ClientOrigin&& ) final { }43 void start(SpeechRecognitionConnectionClientIdentifier, const String&, bool, bool, uint64_t, ClientOrigin&&, FrameIdentifier) final { } 44 44 void stop(SpeechRecognitionConnectionClientIdentifier) final { } 45 45 void abort(SpeechRecognitionConnectionClientIdentifier) final { } -
trunk/Source/WebKit/ChangeLog
r272164 r272165 1 2021-02-01 Sihui Liu <sihui_liu@appe.com> 2 3 Use user media permission prompt for speech recognition 4 https://bugs.webkit.org/show_bug.cgi?id=221082 5 rdar://problem/73372499 6 7 Reviewed by Youenn Fablet. 8 9 Make SpeechRecognitionPermissionManager ask UserMediaPermissionRequestManagerProxy for user permission on 10 microphone. 11 12 * UIProcess/SpeechRecognitionPermissionManager.cpp: 13 (WebKit::SpeechRecognitionPermissionManager::request): 14 (WebKit::SpeechRecognitionPermissionManager::startProcessingRequest): 15 (WebKit::SpeechRecognitionPermissionManager::requestUserPermission): 16 * UIProcess/SpeechRecognitionPermissionManager.h: 17 * UIProcess/SpeechRecognitionPermissionRequest.h: 18 (WebKit::SpeechRecognitionPermissionRequest::create): 19 (WebKit::SpeechRecognitionPermissionRequest::frameIdentifier const): 20 (WebKit::SpeechRecognitionPermissionRequest::SpeechRecognitionPermissionRequest): 21 * UIProcess/SpeechRecognitionServer.cpp: 22 (WebKit::SpeechRecognitionServer::start): 23 (WebKit::SpeechRecognitionServer::requestPermissionForRequest): 24 * UIProcess/SpeechRecognitionServer.h: 25 * UIProcess/SpeechRecognitionServer.messages.in: 26 * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: 27 (WebKit::UserMediaPermissionRequestManagerProxy::denyRequest): 28 (WebKit::UserMediaPermissionRequestManagerProxy::grantRequest): 29 (WebKit::UserMediaPermissionRequestManagerProxy::checkUserMediaPermissionForSpeechRecognition): 30 * UIProcess/UserMediaPermissionRequestManagerProxy.h: 31 * UIProcess/UserMediaPermissionRequestProxy.cpp: 32 (WebKit::UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy): 33 * UIProcess/UserMediaPermissionRequestProxy.h: 34 (WebKit::UserMediaPermissionRequestProxy::create): 35 (WebKit::UserMediaPermissionRequestProxy::decisionCompletionHandler): 36 * UIProcess/WebPageProxy.cpp: 37 (WebKit::WebPageProxy::requestSpeechRecognitionPermission): 38 (WebKit::WebPageProxy::requestUserMediaPermissionForSpeechRecognition): 39 * UIProcess/WebPageProxy.h: 40 * UIProcess/WebProcessProxy.cpp: 41 (WebKit::WebProcessProxy::createSpeechRecognitionServer): 42 * WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp: 43 (WebKit::WebSpeechRecognitionConnection::start): 44 * WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h: 45 1 46 2021-02-01 Wenson Hsieh <wenson_hsieh@apple.com> 2 47 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.cpp
r271415 r272165 76 76 } 77 77 78 void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completiontHandler)79 { 80 m_requests.append(SpeechRecognitionPermissionRequest::create(lang, origin, WTFMove(completiontHandler)));78 void SpeechRecognitionPermissionManager::request(const String& lang, const WebCore::ClientOrigin& origin, WebCore::FrameIdentifier frameIdentifier, SpeechRecognitionPermissionRequestCallback&& completiontHandler) 79 { 80 m_requests.append(SpeechRecognitionPermissionRequest::create(lang, origin, frameIdentifier, WTFMove(completiontHandler))); 81 81 if (m_requests.size() == 1) 82 82 startNextRequest(); … … 126 126 } 127 127 128 // We currently don't allow third-party access.129 if (m_userPermissionCheck == CheckResult::Unknown) {130 auto clientOrigin = m_requests.first()->origin();131 auto requestingOrigin = clientOrigin.clientOrigin.securityOrigin();132 auto topOrigin = clientOrigin.topOrigin.securityOrigin();133 if (!requestingOrigin->isSameOriginAs(topOrigin))134 m_userPermissionCheck = CheckResult::Denied;135 }136 137 128 if (m_userPermissionCheck == CheckResult::Denied) { 138 129 completeCurrentRequest(WebCore::SpeechRecognitionError { WebCore::SpeechRecognitionErrorType::NotAllowed, "User permission check has failed"_s }); … … 226 217 auto& currentRequest = m_requests.first(); 227 218 auto clientOrigin = currentRequest->origin(); 219 auto requestingOrigin = clientOrigin.clientOrigin.securityOrigin(); 228 220 auto topOrigin = clientOrigin.topOrigin.securityOrigin(); 229 221 auto decisionHandler = [this, weakThis = makeWeakPtr(*this)](bool granted) { … … 239 231 continueProcessingRequest(); 240 232 }; 241 m_page. uiClient().decidePolicyForSpeechRecognitionPermissionRequest(m_page, API::SecurityOrigin::create(topOrigin.get()).get(), WTFMove(decisionHandler));233 m_page.requestUserMediaPermissionForSpeechRecognition(currentRequest->frameIdentifier(), requestingOrigin, topOrigin, WTFMove(decisionHandler)); 242 234 } 243 235 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionManager.h
r271381 r272165 40 40 explicit SpeechRecognitionPermissionManager(WebPageProxy&); 41 41 ~SpeechRecognitionPermissionManager(); 42 void request(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&);42 void request(const String& lang, const WebCore::ClientOrigin&, WebCore::FrameIdentifier, SpeechRecognitionPermissionRequestCallback&&); 43 43 44 44 void decideByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); -
trunk/Source/WebKit/UIProcess/SpeechRecognitionPermissionRequest.h
r271381 r272165 28 28 #include "APIObject.h" 29 29 #include <WebCore/ClientOrigin.h> 30 #include <WebCore/FrameIdentifier.h> 30 31 #include <WebCore/SpeechRecognitionError.h> 31 32 #include <wtf/CompletionHandler.h> … … 33 34 namespace WebKit { 34 35 36 using SpeechRecognitionPermissionRequestCallback = CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>; 37 35 38 class SpeechRecognitionPermissionRequest : public RefCounted<SpeechRecognitionPermissionRequest> { 36 39 public: 37 static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler)40 static Ref<SpeechRecognitionPermissionRequest> create(const String& lang, const WebCore::ClientOrigin& origin, WebCore::FrameIdentifier frameIdentifier, SpeechRecognitionPermissionRequestCallback&& completionHandler) 38 41 { 39 return adoptRef(*new SpeechRecognitionPermissionRequest(lang, origin, WTFMove(completionHandler)));42 return adoptRef(*new SpeechRecognitionPermissionRequest(lang, origin, frameIdentifier, WTFMove(completionHandler))); 40 43 } 41 44 … … 48 51 const WebCore::ClientOrigin& origin() const { return m_origin; } 49 52 const String& lang() const { return m_lang; } 53 WebCore::FrameIdentifier frameIdentifier() const { return m_frameIdentifier; } 50 54 51 55 private: 52 SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&& completionHandler)56 SpeechRecognitionPermissionRequest(const String& lang, const WebCore::ClientOrigin& origin, WebCore::FrameIdentifier frameIdentifier, SpeechRecognitionPermissionRequestCallback&& completionHandler) 53 57 : m_lang(lang) 54 58 , m_origin(origin) 59 , m_frameIdentifier(frameIdentifier) 55 60 , m_completionHandler(WTFMove(completionHandler)) 56 61 { } … … 58 63 String m_lang; 59 64 WebCore::ClientOrigin m_origin; 60 CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)> m_completionHandler; 65 WebCore::FrameIdentifier m_frameIdentifier; 66 SpeechRecognitionPermissionRequestCallback m_completionHandler; 61 67 }; 62 68 -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp
r271935 r272165 27 27 #include "SpeechRecognitionServer.h" 28 28 29 #include "SpeechRecognitionPermissionRequest.h"30 29 #include "UserMediaProcessManager.h" 31 30 #include "WebProcessProxy.h" … … 53 52 } 54 53 55 void SpeechRecognitionServer::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& origin )54 void SpeechRecognitionServer::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& origin, WebCore::FrameIdentifier frameIdentifier) 56 55 { 57 56 MESSAGE_CHECK(clientIdentifier); 58 57 ASSERT(!m_requests.contains(clientIdentifier)); 59 auto requestInfo = WebCore::SpeechRecognitionRequestInfo { clientIdentifier, WTFMove(lang), continuous, interimResults, maxAlternatives, WTFMove(origin) };58 auto requestInfo = WebCore::SpeechRecognitionRequestInfo { clientIdentifier, WTFMove(lang), continuous, interimResults, maxAlternatives, WTFMove(origin), frameIdentifier }; 60 59 auto& newRequest = m_requests.add(clientIdentifier, makeUnique<WebCore::SpeechRecognitionRequest>(WTFMove(requestInfo))).iterator->value; 61 60 … … 65 64 void SpeechRecognitionServer::requestPermissionForRequest(WebCore::SpeechRecognitionRequest& request) 66 65 { 67 m_permissionChecker(request.lang(), request.clientOrigin(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto error) mutable {66 m_permissionChecker(request.lang(), request.clientOrigin(), request.frameIdentifier(), [this, weakThis = makeWeakPtr(this), weakRequest = makeWeakPtr(request)](auto error) mutable { 68 67 if (!weakThis) 69 68 return; -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.h
r271935 r272165 28 28 #include "MessageReceiver.h" 29 29 #include "MessageSender.h" 30 #include "SpeechRecognitionPermissionRequest.h" 30 31 #include <WebCore/PageIdentifier.h> 31 32 #include <WebCore/SpeechRecognitionError.h> … … 46 47 47 48 using SpeechRecognitionServerIdentifier = WebCore::PageIdentifier; 48 using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&)>;49 using SpeechRecognitionPermissionChecker = Function<void(const String&, const WebCore::ClientOrigin&, WebCore::FrameIdentifier, SpeechRecognitionPermissionRequestCallback&&)>; 49 50 using SpeechRecognitionCheckIfMockSpeechRecognitionEnabled = Function<bool()>; 50 51 … … 59 60 #endif 60 61 61 void start(WebCore::SpeechRecognitionConnectionClientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& );62 void start(WebCore::SpeechRecognitionConnectionClientIdentifier, String&& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&&, WebCore::FrameIdentifier); 62 63 void stop(WebCore::SpeechRecognitionConnectionClientIdentifier); 63 64 void abort(WebCore::SpeechRecognitionConnectionClientIdentifier); -
trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.messages.in
r269810 r272165 25 25 26 26 messages -> SpeechRecognitionServer NotRefCounted { 27 Start(WebCore::SpeechRecognitionConnectionClientIdentifier identifier, String lang, bool continuous, bool interimResults, uint64_t maxAlternatives, struct WebCore::ClientOrigin origin )27 Start(WebCore::SpeechRecognitionConnectionClientIdentifier identifier, String lang, bool continuous, bool interimResults, uint64_t maxAlternatives, struct WebCore::ClientOrigin origin, WebCore::FrameIdentifier frameIdentifier) 28 28 Stop(WebCore::SpeechRecognitionConnectionClientIdentifier identifier) 29 29 Abort(WebCore::SpeechRecognitionConnectionClientIdentifier identifier) -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
r271513 r272165 214 214 m_deniedRequests.append(DeniedRequest { request.mainFrameID(), request.userMediaDocumentSecurityOrigin(), request.topLevelDocumentSecurityOrigin(), request.requiresAudioCapture(), request.requiresVideoCapture(), request.requiresDisplayCapture() }); 215 215 216 if (auto callback = request.decisionCompletionHandler()) { 217 callback(false); 218 return; 219 } 220 216 221 #if ENABLE(MEDIA_STREAM) 217 222 if (m_pregrantedRequests.isEmpty() && request.userRequest().audioConstraints.isValid) … … 234 239 #if ENABLE(MEDIA_STREAM) 235 240 ALWAYS_LOG(LOGIDENTIFIER, request.userMediaID(), ", video: ", request.videoDevice().label(), ", audio: ", request.audioDevice().label()); 241 242 if (auto callback = request.decisionCompletionHandler()) { 243 m_grantedRequests.append(makeRef(request)); 244 callback(true); 245 return; 246 } 236 247 237 248 auto& userMediaDocumentSecurityOrigin = request.userMediaDocumentSecurityOrigin(); … … 602 613 m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *webFrame, WTFMove(userMediaOrigin), WTFMove(topLevelOrigin), *m_currentUserMediaRequest); 603 614 } 615 616 void UserMediaPermissionRequestManagerProxy::checkUserMediaPermissionForSpeechRecognition(WebCore::FrameIdentifier frameIdentifier, const WebCore::SecurityOrigin& requestingOrigin, const WebCore::SecurityOrigin& topOrigin, const WebCore::CaptureDevice& device, CompletionHandler<void(bool)>&& completionHandler) 617 { 618 auto* frame = m_page.process().webFrame(frameIdentifier); 619 if (!frame || !SecurityOrigin::createFromString(m_page.pageLoadState().activeURL())->isSameSchemeHostPort(topOrigin)) { 620 completionHandler(false); 621 return; 622 } 623 624 auto request = UserMediaPermissionRequestProxy::create(*this, 0, frameIdentifier, frameIdentifier, requestingOrigin.isolatedCopy(), topOrigin.isolatedCopy(), Vector<WebCore::CaptureDevice> { device }, { }, { }, WTFMove(completionHandler)); 625 626 auto action = getRequestAction(request.get()); 627 if (action == RequestAction::Deny) { 628 completionHandler(false); 629 return; 630 } 631 632 if (action == RequestAction::Grant) { 633 completionHandler(true); 634 return; 635 } 636 637 auto apiRequestingOrigin = API::SecurityOrigin::create(requestingOrigin); 638 auto apiTopOrigin = API::SecurityOrigin::create(topOrigin); 639 m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *frame, WTFMove(apiRequestingOrigin), WTFMove(apiTopOrigin), request.get()); 640 } 641 604 642 605 643 #if !PLATFORM(COCOA) -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h
r271513 r272165 98 98 bool hasPendingCapture() const { return m_hasPendingCapture; } 99 99 100 void checkUserMediaPermissionForSpeechRecognition(WebCore::FrameIdentifier, const WebCore::SecurityOrigin&, const WebCore::SecurityOrigin&, const WebCore::CaptureDevice&, CompletionHandler<void(bool)>&&); 101 100 102 private: 101 103 #if !RELEASE_LOG_DISABLED -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.cpp
r269918 r272165 32 32 using namespace WebCore; 33 33 34 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 )34 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) 35 35 : m_manager(&manager) 36 36 , m_userMediaID(userMediaID) … … 42 42 , m_eligibleAudioDevices(WTFMove(audioDevices)) 43 43 , m_request(WTFMove(request)) 44 , m_decisionCompletionHandler(WTFMove(decisionCompletionHandler)) 44 45 { 45 46 } … … 100 101 { 101 102 m_manager = nullptr; 103 if (m_decisionCompletionHandler) 104 m_decisionCompletionHandler(false); 102 105 } 103 106 -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestProxy.h
r269918 r272165 24 24 #include <WebCore/FrameIdentifier.h> 25 25 #include <WebCore/MediaStreamRequest.h> 26 #include <wtf/CompletionHandler.h> 26 27 #include <wtf/Vector.h> 27 28 #include <wtf/text/WTFString.h> … … 37 38 class UserMediaPermissionRequestProxy : public API::ObjectImpl<API::Object::Type::UserMediaPermissionRequest> { 38 39 public: 39 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 )40 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 = { }) 40 41 { 41 return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(request) ));42 return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDevices), WTFMove(videoDevices), WTFMove(request), WTFMove(decisionCompletionHandler))); 42 43 } 43 44 … … 90 91 void doDefaultAction(); 91 92 93 CompletionHandler<void(bool)> decisionCompletionHandler() { return std::exchange(m_decisionCompletionHandler, { }); } 94 92 95 private: 93 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&& );96 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)>&&); 94 97 95 98 UserMediaPermissionRequestManagerProxy* m_manager; … … 104 107 bool m_hasPersistentAccess { false }; 105 108 String m_deviceIdentifierHashSalt; 109 CompletionHandler<void(bool)> m_decisionCompletionHandler; 106 110 }; 107 111 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r272069 r272165 10398 10398 } 10399 10399 10400 void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completionHandler)10400 void WebPageProxy::requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin& clientOrigin, WebCore::FrameIdentifier frameIdentifier, CompletionHandler<void(Optional<SpeechRecognitionError>&&)>&& completionHandler) 10401 10401 { 10402 10402 if (!m_speechRecognitionPermissionManager) 10403 10403 m_speechRecognitionPermissionManager = makeUnique<SpeechRecognitionPermissionManager>(*this); 10404 10404 10405 m_speechRecognitionPermissionManager->request(lang, clientOrigin, WTFMove(completionHandler));10405 m_speechRecognitionPermissionManager->request(lang, clientOrigin, frameIdentifier, WTFMove(completionHandler)); 10406 10406 } 10407 10407 … … 10414 10414 10415 10415 m_speechRecognitionPermissionManager->decideByDefaultAction(origin, WTFMove(completionHandler)); 10416 } 10417 10418 void WebPageProxy::requestUserMediaPermissionForSpeechRecognition(FrameIdentifier frameIdentifier, const WebCore::SecurityOrigin& requestingOrigin, const WebCore::SecurityOrigin& topOrigin, CompletionHandler<void(bool)>&& completionHandler) 10419 { 10420 #if ENABLE(MEDIA_STREAM) 10421 auto captureDevice = SpeechRecognitionCaptureSource::findCaptureDevice(); 10422 if (!captureDevice) 10423 completionHandler(false); 10424 10425 userMediaPermissionRequestManager().checkUserMediaPermissionForSpeechRecognition(frameIdentifier, requestingOrigin, topOrigin, *captureDevice, WTFMove(completionHandler)); 10426 #else 10427 completionHandler(false); 10428 #endif 10416 10429 } 10417 10430 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r272096 r272165 53 53 #include "ShareableBitmap.h" 54 54 #include "ShareableResource.h" 55 #include "SpeechRecognitionPermissionRequest.h" 55 56 #include "SuspendedPageProxy.h" 56 57 #include "SyntheticEditingCommandType.h" … … 1817 1818 size_t suspendMediaPlaybackCounter() { return m_suspendMediaPlaybackCounter; } 1818 1819 1819 void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, CompletionHandler<void(Optional<WebCore::SpeechRecognitionError>&&)>&&);1820 void requestSpeechRecognitionPermission(const String& lang, const WebCore::ClientOrigin&, WebCore::FrameIdentifier, SpeechRecognitionPermissionRequestCallback&&); 1820 1821 void requestSpeechRecognitionPermissionByDefaultAction(const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); 1822 void requestUserMediaPermissionForSpeechRecognition(WebCore::FrameIdentifier, const WebCore::SecurityOrigin&, const WebCore::SecurityOrigin&, CompletionHandler<void(bool)>&&); 1821 1823 1822 1824 void syncIfMockDevicesEnabledChanged(); -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r271935 r272165 1723 1723 ASSERT(!m_speechRecognitionServerMap.contains(identifier)); 1724 1724 auto& speechRecognitionServer = m_speechRecognitionServerMap.add(identifier, nullptr).iterator->value; 1725 auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& lang, auto& origin, auto && completionHandler) mutable {1725 auto permissionChecker = [weakPage = makeWeakPtr(targetPage)](auto& lang, auto& origin, auto frameIdentifier, auto&& completionHandler) mutable { 1726 1726 if (!weakPage) { 1727 1727 completionHandler(WebCore::SpeechRecognitionError { SpeechRecognitionErrorType::NotAllowed, "Page no longer exists"_s }); … … 1729 1729 } 1730 1730 1731 weakPage->requestSpeechRecognitionPermission(lang, origin, WTFMove(completionHandler));1731 weakPage->requestSpeechRecognitionPermission(lang, origin, frameIdentifier, WTFMove(completionHandler)); 1732 1732 }; 1733 1733 auto checkIfMockCaptureDevicesEnabled = [weakPage = makeWeakPtr(targetPage)]() { -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp
r271636 r272165 28 28 29 29 #include "SpeechRecognitionServerMessages.h" 30 #include "WebFrame.h" 30 31 #include "WebProcess.h" 31 32 #include "WebProcessProxyMessages.h" … … 69 70 } 70 71 71 void WebSpeechRecognitionConnection::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& clientOrigin )72 void WebSpeechRecognitionConnection::start(WebCore::SpeechRecognitionConnectionClientIdentifier clientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& clientOrigin, WebCore::FrameIdentifier frameIdentifier) 72 73 { 73 send(Messages::SpeechRecognitionServer::Start(clientIdentifier, lang, continuous, interimResults, maxAlternatives, WTFMove(clientOrigin) ));74 send(Messages::SpeechRecognitionServer::Start(clientIdentifier, lang, continuous, interimResults, maxAlternatives, WTFMove(clientOrigin), frameIdentifier)); 74 75 } 75 76 -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h
r271636 r272165 48 48 static Ref<WebSpeechRecognitionConnection> create(SpeechRecognitionConnectionIdentifier); 49 49 50 void start(WebCore::SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&& ) final;50 void start(WebCore::SpeechRecognitionConnectionClientIdentifier, const String& lang, bool continuous, bool interimResults, uint64_t maxAlternatives, WebCore::ClientOrigin&&, WebCore::FrameIdentifier) final; 51 51 void stop(WebCore::SpeechRecognitionConnectionClientIdentifier) final; 52 52 void abort(WebCore::SpeechRecognitionConnectionClientIdentifier) final; -
trunk/Tools/ChangeLog
r272144 r272165 1 2021-02-01 Sihui Liu <sihui_liu@appe.com> 2 3 Use user media permission prompt for speech recognition 4 https://bugs.webkit.org/show_bug.cgi?id=221082 5 rdar://problem/73372499 6 7 Reviewed by Youenn Fablet. 8 9 * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm: 10 (-[SpeechRecognitionUIDelegate _webView:requestMediaCaptureAuthorization:decisionHandler:]): 11 1 12 2021-02-01 Aakash Jain <aakash_jain@apple.com> 2 13 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm
r271935 r272165 61 61 - (void)_webView:(WKWebView *)webView requestMediaCaptureAuthorization: (_WKCaptureDevices)devices decisionHandler:(void (^)(BOOL))decisionHandler 62 62 { 63 decisionHandler(YES); 63 permissionRequested = true; 64 decisionHandler(shouldGrantPermissionRequest); 64 65 } 65 66
Note: See TracChangeset
for help on using the changeset viewer.