Modified: trunk/Source/WebKit/ChangeLog (245858 => 245859)
--- trunk/Source/WebKit/ChangeLog 2019-05-29 18:36:06 UTC (rev 245858)
+++ trunk/Source/WebKit/ChangeLog 2019-05-29 18:51:25 UTC (rev 245859)
@@ -1,5 +1,33 @@
2019-05-29 Youenn Fablet <[email protected]>
+ UserMediaCaptureManager should remove a source from its map once the source is ended
+ https://bugs.webkit.org/show_bug.cgi?id=198337
+
+ Reviewed by Eric Carlson.
+
+ When the source is stopped, for instance using MediaStreamTrack.stop,
+ remove the source from UserMediaCaptureManager sources map.
+ This makes sure the map will not grow over time.
+ Add an if check to ensure that the source is still there before processing an incoming IPC call.
+
+ When UIProcess tells us the capture is finished (typically capture failed), remove the entry on WebProcess side as well.
+
+ * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+ (WebKit::UserMediaCaptureManager::createCaptureSource):
+ (WebKit::UserMediaCaptureManager::sourceStopped):
+ (WebKit::UserMediaCaptureManager::captureFailed):
+ (WebKit::UserMediaCaptureManager::sourceMutedChanged):
+ (WebKit::UserMediaCaptureManager::sourceSettingsChanged):
+ (WebKit::UserMediaCaptureManager::storageChanged):
+ (WebKit::UserMediaCaptureManager::ringBufferFrameBoundsChanged):
+ (WebKit::UserMediaCaptureManager::audioSamplesAvailable):
+ (WebKit::UserMediaCaptureManager::remoteVideoSampleAvailable):
+ (WebKit::UserMediaCaptureManager::sourceEnded):
+ (WebKit::UserMediaCaptureManager::applyConstraintsSucceeded):
+ (WebKit::UserMediaCaptureManager::applyConstraintsFailed):
+
+2019-05-29 Youenn Fablet <[email protected]>
+
UserMediaCaptureManagerProxy::SourceProxy should directly have access to its IPC connection
https://bugs.webkit.org/show_bug.cgi?id=198335
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (245858 => 245859)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2019-05-29 18:36:06 UTC (rev 245858)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2019-05-29 18:51:25 UTC (rev 245859)
@@ -256,59 +256,63 @@
auto type = device.type() == CaptureDevice::DeviceType::Microphone ? WebCore::RealtimeMediaSource::Type::Audio : WebCore::RealtimeMediaSource::Type::Video;
auto source = adoptRef(*new Source(String::number(id), type, device.type(), String { settings.label() }, WTFMove(hashSalt), id, *this));
source->setSettings(WTFMove(settings));
- m_sources.set(id, source.copyRef());
+ m_sources.add(id, source.copyRef());
return WebCore::CaptureSourceOrError(WTFMove(source));
}
void UserMediaCaptureManager::sourceStopped(uint64_t id)
{
- ASSERT(m_sources.contains(id));
- m_sources.get(id)->stop();
+ if (auto source = m_sources.get(id)) {
+ source->stop();
+ sourceEnded(id);
+ }
}
void UserMediaCaptureManager::captureFailed(uint64_t id)
{
- ASSERT(m_sources.contains(id));
- m_sources.get(id)->captureFailed();
+ if (auto source = m_sources.get(id)) {
+ source->captureFailed();
+ sourceEnded(id);
+ }
}
void UserMediaCaptureManager::sourceMutedChanged(uint64_t id, bool muted)
{
- ASSERT(m_sources.contains(id));
- m_sources.get(id)->setMuted(muted);
+ if (auto source = m_sources.get(id))
+ source->setMuted(muted);
}
void UserMediaCaptureManager::sourceSettingsChanged(uint64_t id, const RealtimeMediaSourceSettings& settings)
{
- ASSERT(m_sources.contains(id));
- m_sources.get(id)->setSettings(RealtimeMediaSourceSettings(settings));
+ if (auto source = m_sources.get(id))
+ source->setSettings(RealtimeMediaSourceSettings(settings));
}
void UserMediaCaptureManager::storageChanged(uint64_t id, const SharedMemory::Handle& handle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames)
{
- ASSERT(m_sources.contains(id));
- m_sources.get(id)->setStorage(handle, description, numberOfFrames);
+ if (auto source = m_sources.get(id))
+ source->setStorage(handle, description, numberOfFrames);
}
void UserMediaCaptureManager::ringBufferFrameBoundsChanged(uint64_t id, uint64_t startFrame, uint64_t endFrame)
{
- ASSERT(m_sources.contains(id));
- m_sources.get(id)->setRingBufferFrameBounds(startFrame, endFrame);
+ if (auto source = m_sources.get(id))
+ source->setRingBufferFrameBounds(startFrame, endFrame);
}
void UserMediaCaptureManager::audioSamplesAvailable(uint64_t id, MediaTime time, uint64_t numberOfFrames, uint64_t startFrame, uint64_t endFrame)
{
- ASSERT(m_sources.contains(id));
- auto& source = *m_sources.get(id);
- source.setRingBufferFrameBounds(startFrame, endFrame);
- source.audioSamplesAvailable(time, numberOfFrames);
+ if (auto source = m_sources.get(id)) {
+ source->setRingBufferFrameBounds(startFrame, endFrame);
+ source->audioSamplesAvailable(time, numberOfFrames);
+ }
}
#if HAVE(IOSURFACE)
void UserMediaCaptureManager::remoteVideoSampleAvailable(uint64_t id, RemoteVideoSample&& sample)
{
- ASSERT(m_sources.contains(id));
- m_sources.get(id)->remoteVideoSampleAvailable(WTFMove(sample));
+ if (auto source = m_sources.get(id))
+ source->remoteVideoSampleAvailable(WTFMove(sample));
}
#else
NO_RETURN_DUE_TO_ASSERT void UserMediaCaptureManager::remoteVideoSampleAvailable(uint64_t, RemoteVideoSample&&)
@@ -347,20 +351,19 @@
void UserMediaCaptureManager::sourceEnded(uint64_t id)
{
m_process.send(Messages::UserMediaCaptureManagerProxy::End(id), 0);
+ m_sources.remove(id);
}
void UserMediaCaptureManager::applyConstraintsSucceeded(uint64_t id, const WebCore::RealtimeMediaSourceSettings& settings)
{
- ASSERT(m_sources.contains(id));
- auto& source = *m_sources.get(id);
- source.applyConstraintsSucceeded(settings);
+ if (auto source = m_sources.get(id))
+ source->applyConstraintsSucceeded(settings);
}
void UserMediaCaptureManager::applyConstraintsFailed(uint64_t id, String&& failedConstraint, String&& message)
{
- ASSERT(m_sources.contains(id));
- auto& source = *m_sources.get(id);
- source.applyConstraintsFailed(WTFMove(failedConstraint), WTFMove(message));
+ if (auto source = m_sources.get(id))
+ source->applyConstraintsFailed(WTFMove(failedConstraint), WTFMove(message));
}
}