Diff
Modified: trunk/Source/WebCore/ChangeLog (241131 => 241132)
--- trunk/Source/WebCore/ChangeLog 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebCore/ChangeLog 2019-02-07 19:20:15 UTC (rev 241132)
@@ -1,3 +1,17 @@
+2019-02-07 Youenn Fablet <[email protected]>
+
+ Make to clear sources from UserMediaCaptureManagerProxy and UserMediaCaptureManager when no longer needed
+ https://bugs.webkit.org/show_bug.cgi?id=194312
+
+ Reviewed by Eric Carlson.
+
+ Add a way for sources to know when they are ended, i.e. that they will never be started again.
+ No observable change of behavior.
+
+ * platform/mediastream/RealtimeMediaSource.cpp:
+ (WebCore::RealtimeMediaSource::requestStop):
+ * platform/mediastream/RealtimeMediaSource.h:
+
2019-02-07 Jer Noble <[email protected]>
HTMLMediaElement registers wrong ScriptExecutionContext with its ActiveDOMObject parent class
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp (241131 => 241132)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp 2019-02-07 19:20:15 UTC (rev 241132)
@@ -137,7 +137,7 @@
m_isEnded = true;
updateReadyState();
- m_source->requestStop(this);
+ m_source->requestToEnd(*this);
forEachObserver([this](auto& observer) {
observer.trackEnded(*this);
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (241131 => 241132)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2019-02-07 19:20:15 UTC (rev 241132)
@@ -172,7 +172,7 @@
void RealtimeMediaSource::start()
{
- if (m_isProducingData)
+ if (m_isProducingData || m_isEnded)
return;
m_isProducingData = true;
@@ -195,7 +195,7 @@
stopProducingData();
}
-void RealtimeMediaSource::requestStop(Observer* callingObserver)
+void RealtimeMediaSource::requestToEnd(Observer& callingObserver)
{
if (!m_isProducingData)
return;
@@ -208,10 +208,14 @@
if (hasObserverPreventingStopping)
return;
+ auto protectedThis = makeRef(*this);
+
stop();
+ m_isEnded = true;
+ hasEnded();
forEachObserver([callingObserver](auto& observer) {
- if (&observer != callingObserver)
+ if (&observer != &callingObserver)
observer.sourceStopped();
});
}
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (241131 => 241132)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h 2019-02-07 19:20:15 UTC (rev 241132)
@@ -100,7 +100,7 @@
bool isProducingData() const { return m_isProducingData; }
void start();
void stop();
- void requestStop(Observer* callingObserver = nullptr);
+ void requestToEnd(Observer& callingObserver);
bool muted() const { return m_muted; }
void setMuted(bool);
@@ -211,6 +211,8 @@
virtual void stopProducingData() { }
virtual void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) { }
+ virtual void hasEnded() { }
+
void forEachObserver(const WTF::Function<void(Observer&)>&) const;
bool m_muted { false };
@@ -238,6 +240,7 @@
bool m_interrupted { false };
bool m_captureDidFailed { false };
bool m_isRemote { false };
+ bool m_isEnded { false };
};
struct CaptureSourceOrError {
Modified: trunk/Source/WebKit/ChangeLog (241131 => 241132)
--- trunk/Source/WebKit/ChangeLog 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebKit/ChangeLog 2019-02-07 19:20:15 UTC (rev 241132)
@@ -1,3 +1,27 @@
+2019-02-07 Youenn Fablet <[email protected]>
+
+ Make to clear sources from UserMediaCaptureManagerProxy and UserMediaCaptureManager when no longer needed
+ https://bugs.webkit.org/show_bug.cgi?id=194312
+
+ Reviewed by Eric Carlson.
+
+ Sources in UserMediaCaptureManager and Proxy are never removed once added to their HashMap.
+ Use the 'ended' mechanism to do the clean-up on WebProcess side.
+ As part of this clean-up, send IPC to UIProcess to do clean-up on proxy side.
+ On WebProcess crash case, clean-up the proxy as well.
+
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+ (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
+ (WebKit::UserMediaCaptureManagerProxy::end):
+ (WebKit::UserMediaCaptureManagerProxy::clear):
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.h:
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in:
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::processDidTerminateOrFailedToLaunch):
+ * WebProcess/cocoa/UserMediaCaptureManager.cpp:
+ (WebKit::UserMediaCaptureManager::sourceEnded):
+ * WebProcess/cocoa/UserMediaCaptureManager.h:
+
2019-02-07 Alex Christensen <[email protected]>
Print backgrounds preference should be honored instead of WKWebViewConfiguration value
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (241131 => 241132)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2019-02-07 19:20:15 UTC (rev 241132)
@@ -161,7 +161,8 @@
auto source = sourceOrError.source();
source->setIsRemote(true);
settings = source->settings();
- m_proxies.set(id, std::make_unique<SourceProxy>(id, *this, WTFMove(source)));
+ ASSERT(!m_proxies.contains(id));
+ m_proxies.add(id, std::make_unique<SourceProxy>(id, *this, WTFMove(source)));
} else
invalidConstraints = WTFMove(sourceOrError.errorMessage);
}
@@ -180,6 +181,11 @@
iter->value->source().stop();
}
+void UserMediaCaptureManagerProxy::end(uint64_t id)
+{
+ m_proxies.remove(id);
+}
+
void UserMediaCaptureManagerProxy::capabilities(uint64_t id, WebCore::RealtimeMediaSourceCapabilities& capabilities)
{
auto iter = m_proxies.find(id);
@@ -208,6 +214,11 @@
m_process.send(Messages::UserMediaCaptureManager::ApplyConstraintsFailed(id, result.value().first, result.value().second), 0);
}
+void UserMediaCaptureManagerProxy::clear()
+{
+ m_proxies.clear();
}
+}
+
#endif
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h (241131 => 241132)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.h 2019-02-07 19:20:15 UTC (rev 241132)
@@ -40,10 +40,11 @@
class UserMediaCaptureManagerProxy : private IPC::MessageReceiver {
public:
- UserMediaCaptureManagerProxy(WebProcessProxy&);
+ explicit UserMediaCaptureManagerProxy(WebProcessProxy&);
~UserMediaCaptureManagerProxy();
WebProcessProxy& process() const { return m_process; }
+ void clear();
private:
// IPC::MessageReceiver
@@ -53,6 +54,7 @@
void createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const WebCore::CaptureDevice& deviceID, String&&, const WebCore::MediaConstraints&, bool& succeeded, String& invalidConstraints, WebCore::RealtimeMediaSourceSettings&);
void startProducingData(uint64_t);
void stopProducingData(uint64_t);
+ void end(uint64_t);
void capabilities(uint64_t, WebCore::RealtimeMediaSourceCapabilities&);
void setMuted(uint64_t, bool);
void applyConstraints(uint64_t, const WebCore::MediaConstraints&);
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in (241131 => 241132)
--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.messages.in 2019-02-07 19:20:15 UTC (rev 241132)
@@ -27,6 +27,7 @@
CreateMediaSourceForCaptureDeviceWithConstraints(uint64_t id, WebCore::CaptureDevice device, String hashSalt, struct WebCore::MediaConstraints constraints) -> (bool success, String invalidConstraints, WebCore::RealtimeMediaSourceSettings settings) LegacySync
StartProducingData(uint64_t id)
StopProducingData(uint64_t id)
+ End(uint64_t id)
Capabilities(uint64_t id) -> (WebCore::RealtimeMediaSourceCapabilities capabilities) LegacySync
SetMuted(uint64_t id, bool muted)
ApplyConstraints(uint64_t id, struct WebCore::MediaConstraints constraints)
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (241131 => 241132)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2019-02-07 19:20:15 UTC (rev 241132)
@@ -571,6 +571,10 @@
// to be deleted before we can finish our work.
Ref<WebProcessProxy> protect(*this);
+#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
+ m_userMediaCaptureManagerProxy->clear();
+#endif
+
if (auto* webConnection = this->webConnection())
webConnection->didClose();
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (241131 => 241132)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp 2019-02-07 19:20:15 UTC (rev 241132)
@@ -185,6 +185,7 @@
// RealtimeMediaSource
void beginConfiguration() final { }
void commitConfiguration() final { }
+ void hasEnded() final { m_manager.sourceEnded(m_id); }
void applyConstraints(const WebCore::MediaConstraints& constraints, SuccessHandler&& successHandler, FailureHandler&& failureHandler) final {
m_manager.applyConstraints(m_id, constraints);
@@ -345,6 +346,11 @@
m_process.send(Messages::UserMediaCaptureManagerProxy::ApplyConstraints(id, constraints), 0);
}
+void UserMediaCaptureManager::sourceEnded(uint64_t id)
+{
+ m_process.send(Messages::UserMediaCaptureManagerProxy::End(id), 0);
+}
+
void UserMediaCaptureManager::applyConstraintsSucceeded(uint64_t id, const WebCore::RealtimeMediaSourceSettings& settings)
{
ASSERT(m_sources.contains(id));
Modified: trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h (241131 => 241132)
--- trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2019-02-07 19:01:23 UTC (rev 241131)
+++ trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.h 2019-02-07 19:20:15 UTC (rev 241132)
@@ -85,6 +85,7 @@
// Messages::UserMediaCaptureManager
void captureFailed(uint64_t id);
void sourceStopped(uint64_t id);
+ void sourceEnded(uint64_t id);
void sourceMutedChanged(uint64_t id, bool muted);
void sourceSettingsChanged(uint64_t id, const WebCore::RealtimeMediaSourceSettings&);
void storageChanged(uint64_t id, const SharedMemory::Handle&, const WebCore::CAAudioStreamDescription&, uint64_t numberOfFrames);