Changeset 245335 in webkit
- Timestamp:
- May 15, 2019 11:44:36 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r245321 r245335 1 2019-05-15 Youenn Fablet <youenn@apple.com> 2 3 getUserMedia sandbox extensions should not be revoked when a getUserMedia allowed request is being processed 4 https://bugs.webkit.org/show_bug.cgi?id=197851 5 6 Reviewed by Alex Christensen. 7 8 * fast/mediastream/gum-stop-track-expected.txt: Added. 9 * fast/mediastream/gum-stop-track.html: Added. 10 1 11 2019-05-15 Fujii Hironori <Hironori.Fujii@sony.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r245326 r245335 1 2019-05-15 Youenn Fablet <youenn@apple.com> 2 3 getUserMedia sandbox extensions should not be revoked when a getUserMedia allowed request is being processed 4 https://bugs.webkit.org/show_bug.cgi?id=197851 5 6 Reviewed by Alex Christensen. 7 8 Add a completion handler to create a new capture stream. 9 This is used by WK2 layer to acknowledge the pending capture request is completed. 10 Just after the completion handler, make sure to update the document media state. 11 This is done to ensure that, should capture failing, the UIProcess 12 knows about it and can manage proper sandbox extension revocation. 13 14 Test: fast/mediastream/gum-stop-track.html 15 16 * Modules/mediastream/UserMediaRequest.cpp: 17 (WebCore::UserMediaRequest::allow): 18 (WebCore::UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream): 19 (WebCore::UserMediaRequest::PendingActivationMediaStream::~PendingActivationMediaStream): 20 * Modules/mediastream/UserMediaRequest.h: 21 (WebCore::UserMediaRequest::PendingActivationMediaStream::create): 22 * platform/mock/MockRealtimeMediaSourceCenter.cpp: 23 (WebCore::MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled): 24 * platform/mock/MockRealtimeMediaSourceCenter.h: 25 1 26 2019-05-15 Simon Fraser <simon.fraser@apple.com> 2 27 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
r241281 r245335 48 48 #include "Settings.h" 49 49 #include "UserMediaController.h" 50 #include <wtf/Scope.h> 50 51 51 52 namespace WebCore { … … 215 216 } 216 217 217 void UserMediaRequest::allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt )218 void UserMediaRequest::allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&& completionHandler) 218 219 { 219 220 RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDevice ? audioDevice.persistentId().utf8().data() : "", videoDevice ? videoDevice.persistentId().utf8().data() : ""); 220 221 221 auto callback = [this, protector = makePendingActivity(*this)](RefPtr<MediaStreamPrivate>&& privateStream) mutable { 222 auto callback = [this, protector = makePendingActivity(*this), completionHandler = WTFMove(completionHandler)](RefPtr<MediaStreamPrivate>&& privateStream) mutable { 223 auto scopeExit = makeScopeExit([&] { 224 completionHandler(); 225 }); 222 226 if (!m_scriptExecutionContext) 223 227 return; … … 236 240 } 237 241 238 m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protector), *this, WTFMove(stream)); 242 scopeExit.release(); 243 m_pendingActivationMediaStream = PendingActivationMediaStream::create(WTFMove(protector), *this, WTFMove(stream), WTFMove(completionHandler)); 239 244 }; 240 245 … … 331 336 } 332 337 333 UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream )338 UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream, CompletionHandler<void()>&& completionHandler) 334 339 : m_protectingUserMediaRequest(WTFMove(protectingUserMediaRequest)) 335 340 , m_userMediaRequest(userMediaRequest) 336 341 , m_mediaStream(WTFMove(stream)) 342 , m_completionHandler(WTFMove(completionHandler)) 337 343 { 338 344 m_mediaStream->privateStream().addObserver(*this); … … 343 349 { 344 350 m_mediaStream->privateStream().removeObserver(*this); 351 m_completionHandler(); 352 if (auto* document = m_mediaStream->document()) 353 document->updateIsPlayingMedia(); 345 354 } 346 355 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h
r239535 r245335 41 41 #include "MediaStreamPrivate.h" 42 42 #include "MediaStreamRequest.h" 43 #include <wtf/CompletionHandler.h> 43 44 44 45 namespace WebCore { … … 55 56 56 57 WEBCORE_EXPORT void setAllowedMediaDeviceUIDs(const String& audioDeviceUID, const String& videoDeviceUID); 57 WEBCORE_EXPORT void allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt );58 WEBCORE_EXPORT void allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&&); 58 59 59 60 enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, InvalidAccess, IllegalConstraint, OtherFailure }; … … 84 85 class PendingActivationMediaStream : public RefCounted<PendingActivationMediaStream>, private MediaStreamPrivate::Observer { 85 86 public: 86 static Ref<PendingActivationMediaStream> create(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream )87 static Ref<PendingActivationMediaStream> create(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream, CompletionHandler<void()>&& completionHandler) 87 88 { 88 return adoptRef(*new PendingActivationMediaStream { WTFMove(protectingUserMediaRequest), userMediaRequest, WTFMove(stream) });89 return adoptRef(*new PendingActivationMediaStream { WTFMove(protectingUserMediaRequest), userMediaRequest, WTFMove(stream), WTFMove(completionHandler) }); 89 90 } 90 91 ~PendingActivationMediaStream(); 91 92 92 93 private: 93 PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&& );94 PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&&, CompletionHandler<void()>&&); 94 95 95 96 void characteristicsChanged() final; … … 98 99 UserMediaRequest& m_userMediaRequest; 99 100 Ref<MediaStream> m_mediaStream; 101 CompletionHandler<void()> m_completionHandler; 100 102 }; 101 103 -
trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp
r243163 r245335 209 209 } 210 210 211 bool MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled() 212 { 213 MockRealtimeMediaSourceCenter& mock = singleton(); 214 RealtimeMediaSourceCenter& center = RealtimeMediaSourceCenter::singleton(); 215 216 return ¢er.audioCaptureFactory() == &mock.audioCaptureFactory() || ¢er.videoCaptureFactory() == &mock.videoCaptureFactory() || ¢er.displayCaptureFactory() == &mock.displayCaptureFactory(); 217 } 218 211 219 static void createCaptureDevice(const MockMediaDevice& device) 212 220 { -
trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.h
r239427 r245335 42 42 43 43 WEBCORE_EXPORT static void setMockRealtimeMediaSourceCenterEnabled(bool); 44 WEBCORE_EXPORT static bool mockRealtimeMediaSourceCenterEnabled(); 44 45 45 46 WEBCORE_EXPORT static void setDevices(Vector<MockMediaDevice>&&); -
trunk/Source/WebKit/ChangeLog
r245334 r245335 1 2019-05-15 Youenn Fablet <youenn@apple.com> 2 3 getUserMedia sandbox extensions should not be revoked when a getUserMedia allowed request is being processed 4 https://bugs.webkit.org/show_bug.cgi?id=197851 5 6 Reviewed by Alex Christensen. 7 8 Before the patch, stopping capture in a document and quickly triggering a new capture 9 might fail as the UIProcess would grant access and revoke sandbox access based on the fact 10 the page is no longer capturing. 11 To fix that issue, keep a state in the UIProcess to not revoke sandbox extensions in case of 12 capture being started. 13 Add an IPC message back to tell UIProcess when an allowed capture is finished. 14 Just after doing that, make sure the document is updating the media state to UIProcess, which will trigger proper sandbox extension handling. 15 16 This should also trigger the case of an allowed getUserMedia call that fails to start for some reason. 17 In that case, the patch will automatically trigger a document media state refresh which will trigger a sandbox revokation. 18 19 Covered by added test that exercise a newly added debug assertion. 20 This assertion ensures that we revoke extensions while a document is not capturing. 21 22 * UIProcess/UserMediaPermissionRequestManagerProxy.cpp: 23 (WebKit::UserMediaPermissionRequestManagerProxy::~UserMediaPermissionRequestManagerProxy): 24 (WebKit::UserMediaPermissionRequestManagerProxy::grantAccess): 25 (WebKit::UserMediaPermissionRequestManagerProxy::captureStateChanged): 26 * UIProcess/UserMediaPermissionRequestManagerProxy.h: 27 * UIProcess/UserMediaProcessManager.cpp: 28 (WebKit::UserMediaProcessManager::willCreateMediaStream): 29 (WebKit::UserMediaProcessManager::revokeSandboxExtensionsIfNeeded): 30 * UIProcess/UserMediaProcessManager.h: 31 * UIProcess/WebPageProxy.h: 32 (WebKit::WebPageProxy::isCapturingAudio const): 33 (WebKit::WebPageProxy::isCapturingVideo const): 34 * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: 35 (WebKit::UserMediaPermissionRequestManager::userMediaAccessWasGranted): 36 * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: 37 * WebProcess/WebPage/WebPage.cpp: 38 (WebKit::WebPage::userMediaAccessWasGranted): 39 * WebProcess/WebPage/WebPage.h: 40 * WebProcess/WebPage/WebPage.messages.in: 41 * WebProcess/WebProcess.cpp: 42 (WebKit::checkDocumentsCaptureStateConsistency): 43 (WebKit::WebProcess::revokeUserMediaDeviceSandboxExtensions): 44 1 45 2019-05-15 Chris Dumez <cdumez@apple.com> 2 46 -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.cpp
r244935 r245335 84 84 { 85 85 #if ENABLE(MEDIA_STREAM) 86 UserMediaProcessManager::singleton(). endedCaptureSession(*this);86 UserMediaProcessManager::singleton().revokeSandboxExtensionsIfNeeded(page().process()); 87 87 proxies().remove(this); 88 88 #endif … … 296 296 } 297 297 298 m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(request.userMediaID(), request.audioDevice(), request.videoDevice(), request.deviceIdentifierHashSalt()), m_page.pageID()); 298 ++m_hasPendingCapture; 299 m_page.process().connection()->sendWithAsyncReply(Messages::WebPage::UserMediaAccessWasGranted { request.userMediaID(), request.audioDevice(), request.videoDevice(), request.deviceIdentifierHashSalt() }, [this, weakThis = makeWeakPtr(this)] { 300 if (!weakThis) 301 return; 302 --m_hasPendingCapture; 303 }, m_page.pageID()); 299 304 return true; 300 305 } … … 633 638 634 639 #if ENABLE(MEDIA_STREAM) 635 bool wasCapturingAudio = oldState & MediaProducer::AudioCaptureMask; 636 bool wasCapturingVideo = oldState & MediaProducer::VideoCaptureMask; 637 bool isCapturingAudio = newState & MediaProducer::AudioCaptureMask; 638 bool isCapturingVideo = newState & MediaProducer::VideoCaptureMask; 639 640 if ((wasCapturingAudio && !isCapturingAudio) || (wasCapturingVideo && !isCapturingVideo)) 641 UserMediaProcessManager::singleton().endedCaptureSession(*this); 640 if (!m_hasPendingCapture) 641 UserMediaProcessManager::singleton().revokeSandboxExtensionsIfNeeded(page().process()); 642 642 643 643 if (m_captureState == (newState & activeCaptureMask)) -
trunk/Source/WebKit/UIProcess/UserMediaPermissionRequestManagerProxy.h
r243328 r245335 145 145 #endif 146 146 bool m_hasFilteredDeviceList { false }; 147 uint64_t m_hasPendingCapture { 0 }; 147 148 }; 148 149 -
trunk/Source/WebKit/UIProcess/UserMediaProcessManager.cpp
r242142 r245335 73 73 74 74 #if ENABLE(SANDBOX_EXTENSIONS) && USE(APPLE_INTERNAL_SDK) 75 if (!proxy.page().preferences().mockCaptureDevicesEnabled()) { 76 auto& process = proxy.page().process(); 77 size_t extensionCount = 0; 78 79 if (withAudio && !process.hasAudioCaptureExtension()) 80 extensionCount++; 81 else 82 withAudio = false; 83 84 if (withVideo && !process.hasVideoCaptureExtension()) 85 extensionCount++; 86 else 87 withVideo = false; 88 89 if (extensionCount) { 90 SandboxExtension::HandleArray handles; 75 auto& process = proxy.page().process(); 76 size_t extensionCount = 0; 77 78 if (withAudio && !process.hasAudioCaptureExtension()) 79 extensionCount++; 80 else 81 withAudio = false; 82 83 if (withVideo && !process.hasVideoCaptureExtension()) 84 extensionCount++; 85 else 86 withVideo = false; 87 88 if (extensionCount) { 89 SandboxExtension::HandleArray handles; 90 Vector<String> ids; 91 92 if (!proxy.page().preferences().mockCaptureDevicesEnabled()) { 91 93 handles.allocate(extensionCount); 92 93 Vector<String> ids; 94 ids.reserveCapacity(extensionCount); 94 ids.reserveInitialCapacity(extensionCount); 95 95 96 96 if (withAudio && SandboxExtension::createHandleForGenericExtension(audioExtensionPath, handles[--extensionCount])) … … 104 104 return false; 105 105 } 106 107 for (const auto& id : ids)108 RELEASE_LOG(WebRTC, "UserMediaProcessManager::willCreateMediaStream - granting extension %s", id.utf8().data());109 110 if (withAudio)111 process.grantAudioCaptureExtension();112 if (withVideo)113 process.grantVideoCaptureExtension();114 process.send(Messages::WebProcess::GrantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions(ids, WTFMove(handles))), proxy.page().pageID());115 106 } 107 108 for (const auto& id : ids) 109 RELEASE_LOG(WebRTC, "UserMediaProcessManager::willCreateMediaStream - granting extension %s", id.utf8().data()); 110 111 if (withAudio) 112 process.grantAudioCaptureExtension(); 113 if (withVideo) 114 process.grantVideoCaptureExtension(); 115 process.send(Messages::WebProcess::GrantUserMediaDeviceSandboxExtensions(MediaDeviceSandboxExtensions(ids, WTFMove(handles))), 0); 116 116 } 117 117 #else … … 126 126 } 127 127 128 void UserMediaProcessManager:: endedCaptureSession(UserMediaPermissionRequestManagerProxy& proxy)128 void UserMediaProcessManager::revokeSandboxExtensionsIfNeeded(WebProcessProxy& process) 129 129 { 130 130 #if ENABLE(SANDBOX_EXTENSIONS) … … 132 132 bool hasVideoCapture = false; 133 133 134 auto& process = proxy.page().process(); 135 UserMediaPermissionRequestManagerProxy::forEach([&hasAudioCapture, &hasVideoCapture, &proxy, &process](auto& managerProxy) { 136 if (&proxy == &managerProxy || &process != &managerProxy.page().process()) 134 UserMediaPermissionRequestManagerProxy::forEach([&hasAudioCapture, &hasVideoCapture, &process](auto& managerProxy) { 135 if (&process != &managerProxy.page().process()) 137 136 return; 138 if (managerProxy.page().hasActiveAudioStream()) 139 hasAudioCapture = true; 140 if (managerProxy.page().hasActiveVideoStream()) 141 hasVideoCapture = true; 137 hasAudioCapture |= managerProxy.page().isCapturingAudio(); 138 hasVideoCapture |= managerProxy.page().isCapturingVideo(); 142 139 }); 143 140 … … 161 158 RELEASE_LOG(WebRTC, "UserMediaProcessManager::endedCaptureSession - revoking extension %s", id.utf8().data()); 162 159 163 process.send(Messages::WebProcess::RevokeUserMediaDeviceSandboxExtensions(params), proxy.page().pageID());160 process.send(Messages::WebProcess::RevokeUserMediaDeviceSandboxExtensions(params), 0); 164 161 #endif 165 162 } -
trunk/Source/WebKit/UIProcess/UserMediaProcessManager.h
r242142 r245335 39 39 void muteCaptureMediaStreamsExceptIn(WebPageProxy&); 40 40 41 void endedCaptureSession(UserMediaPermissionRequestManagerProxy&);41 void revokeSandboxExtensionsIfNeeded(WebProcessProxy&); 42 42 43 43 void setCaptureEnabled(bool); -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r245328 r245335 1298 1298 void isPlayingMediaDidChange(WebCore::MediaProducer::MediaStateFlags, uint64_t); 1299 1299 void updatePlayingMediaDidChange(WebCore::MediaProducer::MediaStateFlags); 1300 bool isCapturingAudio() const { return m_mediaState & WebCore::MediaProducer::AudioCaptureMask; } 1301 bool isCapturingVideo() const { return m_mediaState & WebCore::MediaProducer::VideoCaptureMask; } 1300 1302 bool hasActiveAudioStream() const { return m_mediaState & WebCore::MediaProducer::HasActiveAudioCaptureDevice; } 1301 1303 bool hasActiveVideoStream() const { return m_mediaState & WebCore::MediaProducer::HasActiveVideoCaptureDevice; } -
trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp
r242142 r245335 138 138 } 139 139 140 void UserMediaPermissionRequestManager::userMediaAccessWasGranted(uint64_t requestID, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt )140 void UserMediaPermissionRequestManager::userMediaAccessWasGranted(uint64_t requestID, CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&& completionHandler) 141 141 { 142 142 auto request = m_idToUserMediaRequestMap.take(requestID); … … 145 145 removeMediaRequestFromMaps(*request); 146 146 147 request->allow(WTFMove(audioDevice), WTFMove(videoDevice), WTFMove(deviceIdentifierHashSalt) );147 request->allow(WTFMove(audioDevice), WTFMove(videoDevice), WTFMove(deviceIdentifierHashSalt), WTFMove(completionHandler)); 148 148 } 149 149 -
trunk/Source/WebKit/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
r242142 r245335 43 43 void startUserMediaRequest(WebCore::UserMediaRequest&); 44 44 void cancelUserMediaRequest(WebCore::UserMediaRequest&); 45 void userMediaAccessWasGranted(uint64_t, WebCore::CaptureDevice&& audioDevice, WebCore::CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt );45 void userMediaAccessWasGranted(uint64_t, WebCore::CaptureDevice&& audioDevice, WebCore::CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&&); 46 46 void userMediaAccessWasDenied(uint64_t, WebCore::UserMediaRequest::MediaAccessDenialReason, String&&); 47 47 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r245327 r245335 4154 4154 #if ENABLE(MEDIA_STREAM) 4155 4155 4156 void WebPage::userMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice&& audioDevice, WebCore::CaptureDevice&& videoDevice, String&& mediaDeviceIdentifierHashSalt )4157 { 4158 m_userMediaPermissionRequestManager->userMediaAccessWasGranted(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), WTFMove(mediaDeviceIdentifierHashSalt) );4156 void WebPage::userMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice&& audioDevice, WebCore::CaptureDevice&& videoDevice, String&& mediaDeviceIdentifierHashSalt, CompletionHandler<void()>&& completionHandler) 4157 { 4158 m_userMediaPermissionRequestManager->userMediaAccessWasGranted(userMediaID, WTFMove(audioDevice), WTFMove(videoDevice), WTFMove(mediaDeviceIdentifierHashSalt), WTFMove(completionHandler)); 4159 4159 } 4160 4160 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r245299 r245335 1446 1446 1447 1447 #if ENABLE(MEDIA_STREAM) 1448 void userMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice&& audioDeviceUID, WebCore::CaptureDevice&& videoDeviceUID, String&& mediaDeviceIdentifierHashSalt );1448 void userMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice&& audioDeviceUID, WebCore::CaptureDevice&& videoDeviceUID, String&& mediaDeviceIdentifierHashSalt, CompletionHandler<void()>&&); 1449 1449 void userMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String&& invalidConstraint); 1450 1450 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
r245079 r245335 352 352 #if ENABLE(MEDIA_STREAM) 353 353 # MediaSteam 354 UserMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice audioDevice, WebCore::CaptureDevice videoDevice, String mediaDeviceIdentifierHashSalt) 354 UserMediaAccessWasGranted(uint64_t userMediaID, WebCore::CaptureDevice audioDevice, WebCore::CaptureDevice videoDevice, String mediaDeviceIdentifierHashSalt) -> () Async 355 355 UserMediaAccessWasDenied(uint64_t userMediaID, uint64_t reason, String invalidConstraint) 356 356 DidCompleteMediaDeviceEnumeration(uint64_t userMediaID, Vector<WebCore::CaptureDevice> devices, String mediaDeviceIdentifierHashSalt, bool hasPersistentAccess) -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r245334 r245335 1858 1858 } 1859 1859 1860 static inline void checkDocumentsCaptureStateConsistency(const Vector<String>& extensionIDs) 1861 { 1862 #if !ASSERT_DISABLED 1863 bool isCapturingAudio = WTF::anyOf(Document::allDocumentsMap().values(), [](auto* document) { 1864 return document->mediaState() & MediaProducer::AudioCaptureMask; 1865 }); 1866 bool isCapturingVideo = WTF::anyOf(Document::allDocumentsMap().values(), [](auto* document) { 1867 return document->mediaState() & MediaProducer::VideoCaptureMask; 1868 }); 1869 1870 if (isCapturingAudio) 1871 ASSERT(extensionIDs.findMatching([](auto& id) { return id.contains("microphone"); }) == notFound); 1872 if (isCapturingVideo) 1873 ASSERT(extensionIDs.findMatching([](auto& id) { return id.contains("camera"); }) == notFound); 1874 #endif 1875 } 1876 1860 1877 void WebProcess::revokeUserMediaDeviceSandboxExtensions(const Vector<String>& extensionIDs) 1861 1878 { 1879 checkDocumentsCaptureStateConsistency(extensionIDs); 1880 1862 1881 for (const auto& extensionID : extensionIDs) { 1863 1882 auto extension = m_mediaCaptureSandboxExtensions.take(extensionID); 1864 ASSERT(extension );1883 ASSERT(extension || MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled()); 1865 1884 if (extension) { 1866 1885 extension->revoke();
Note: See TracChangeset
for help on using the changeset viewer.