Diff
Modified: trunk/Source/WebCore/ChangeLog (197928 => 197929)
--- trunk/Source/WebCore/ChangeLog 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebCore/ChangeLog 2016-03-10 12:05:59 UTC (rev 197929)
@@ -1,3 +1,33 @@
+2016-03-10 Eric Carlson <[email protected]>
+
+ [MediaStream] push media stream state to the UI process
+ https://bugs.webkit.org/show_bug.cgi?id=155281
+
+ Reviewed by Darin Adler.
+
+ * Modules/mediastream/MediaStream.cpp:
+ (WebCore::MediaStream::MediaStream): Register with the document as an audio producer.
+ (WebCore::MediaStream::~MediaStream): Unregister.
+ (WebCore::MediaStream::setIsActive): Update document status.
+ (WebCore::MediaStream::pageMutedStateDidChange): Mute/unmute according to the page mute setting.
+ (WebCore::MediaStream::mediaState): Return state.
+ (WebCore::MediaStream::statusDidChange): Call document.updateIsPlayingMedia.
+ (WebCore::MediaStream::characteristicsChanged): Track stream mute state.
+ (WebCore::MediaStream::scheduleActiveStateChange): m_isActive -> m_active.
+ * Modules/mediastream/MediaStream.h:
+
+ * page/MediaProducer.h: Add HasActiveMediaCaptureDevice.
+
+ * platform/mediastream/MediaStreamPrivate.cpp:
+ (WebCore::MediaStreamPrivate::hasVideo): Make const.
+ (WebCore::MediaStreamPrivate::hasAudio): Ditto.
+ (WebCore::MediaStreamPrivate::muted): New.
+ * platform/mediastream/MediaStreamPrivate.h:
+
+ * platform/mediastream/mac/AVMediaCaptureSource.mm:
+ (WebCore::AVMediaCaptureSource::AVMediaCaptureSource): Initialize muted to true.
+ (WebCore::AVMediaCaptureSource::captureSessionIsRunningDidChange): Set muted.
+
2016-03-09 Ryosuke Niwa <[email protected]>
Extract EventPath.h/cpp out of EventDispatcher.cpp
Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (197928 => 197929)
--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp 2016-03-10 12:05:59 UTC (rev 197929)
@@ -35,6 +35,7 @@
#include "ExceptionCode.h"
#include "MediaStreamRegistry.h"
#include "MediaStreamTrackEvent.h"
+#include "Page.h"
#include "RealtimeMediaSource.h"
#include "URL.h"
#include <wtf/NeverDestroyed.h>
@@ -82,6 +83,7 @@
setIsActive(m_private->active());
m_private->addObserver(*this);
MediaStreamRegistry::shared().registerStream(*this);
+ document()->addAudioProducer(this);
}
MediaStream::MediaStream(ScriptExecutionContext& context, RefPtr<MediaStreamPrivate>&& streamPrivate)
@@ -99,14 +101,20 @@
track->addObserver(this);
m_trackSet.add(track->id(), WTFMove(track));
}
+ document()->addAudioProducer(this);
}
MediaStream::~MediaStream()
{
+ // Set isActive to false immediately so an callbacks triggered by shutting down, e.g.
+ // mediaState(), are short circuited.
+ m_isActive = false;
MediaStreamRegistry::shared().unregisterStream(*this);
m_private->removeObserver(*this);
for (auto& track : m_trackSet.values())
track->removeObserver(this);
+ if (Document* document = this->document())
+ document->removeAudioProducer(this);
}
RefPtr<MediaStream> MediaStream::clone()
@@ -233,14 +241,67 @@
void MediaStream::setIsActive(bool active)
{
+ if (m_isActive == active)
+ return;
+
m_isActive = active;
- if (!active)
+ statusDidChange();
+}
+
+void MediaStream::pageMutedStateDidChange()
+{
+ if (!m_isActive)
return;
- if (Document* document = downcast<Document>(scriptExecutionContext()))
- document->setHasActiveMediaStreamTrack();
+ Document* document = this->document();
+ if (!document)
+ return;
+
+ bool pageMuted = document->page()->isMuted();
+ if (m_externallyMuted == pageMuted)
+ return;
+
+ m_externallyMuted = pageMuted;
+ if (pageMuted)
+ m_private->stopProducingData();
+ else
+ m_private->startProducingData();
}
+MediaProducer::MediaStateFlags MediaStream::mediaState() const
+{
+ MediaStateFlags state = IsNotPlaying;
+
+ if (!m_isActive)
+ return state;
+
+ if (m_externallyMuted || m_private->isProducingData())
+ state |= HasActiveMediaCaptureDevice;
+
+ if (m_private->hasAudio() || m_private->hasVideo())
+ state |= HasAudioOrVideo;
+
+ return state;
+}
+
+void MediaStream::statusDidChange()
+{
+ if (Document* document = this->document()) {
+ if (m_isActive)
+ document->setHasActiveMediaStreamTrack();
+ document->updateIsPlayingMedia();
+ }
+}
+
+void MediaStream::characteristicsChanged()
+{
+ bool muted = m_private->muted();
+ if (m_isMuted != muted) {
+ m_isMuted = muted;
+ statusDidChange();
+ }
+}
+
void MediaStream::scheduleActiveStateChange()
{
bool active = false;
@@ -301,6 +362,11 @@
m_observers.remove(pos);
}
+Document* MediaStream::document() const
+{
+ return downcast<Document>(scriptExecutionContext());
+}
+
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.h (197928 => 197929)
--- trunk/Source/WebCore/Modules/mediastream/MediaStream.h 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.h 2016-03-10 12:05:59 UTC (rev 197929)
@@ -33,6 +33,7 @@
#include "ContextDestructionObserver.h"
#include "EventTarget.h"
#include "ExceptionBase.h"
+#include "MediaProducer.h"
#include "MediaStreamPrivate.h"
#include "MediaStreamTrack.h"
#include "ScriptWrappable.h"
@@ -44,7 +45,9 @@
namespace WebCore {
-class MediaStream final : public URLRegistrable, public EventTargetWithInlineData, public ContextDestructionObserver, public MediaStreamTrack::Observer, public MediaStreamPrivate::Observer, public RefCounted<MediaStream> {
+class Document;
+
+class MediaStream final : public URLRegistrable, public EventTargetWithInlineData, public ContextDestructionObserver, public MediaStreamTrack::Observer, public MediaStreamPrivate::Observer, private MediaProducer, public RefCounted<MediaStream> {
public:
class Observer {
public:
@@ -71,6 +74,7 @@
RefPtr<MediaStream> clone();
bool active() const { return m_isActive; }
+ bool muted() const { return m_isMuted; }
MediaStreamPrivate* privateStream() const { return m_private.get(); }
@@ -108,25 +112,36 @@
void activeStatusChanged() final;
void didAddTrack(MediaStreamTrackPrivate&) final;
void didRemoveTrack(MediaStreamTrackPrivate&) final;
+ void characteristicsChanged() final;
+ // MediaProducer
+ void pageMutedStateDidChange() final;
+ MediaProducer::MediaStateFlags mediaState() const final;
+
bool internalAddTrack(RefPtr<MediaStreamTrack>&&, StreamModifier);
bool internalRemoveTrack(RefPtr<MediaStreamTrack>&&, StreamModifier);
void scheduleActiveStateChange();
void activityEventTimerFired();
void setIsActive(bool);
+ void statusDidChange();
+ Document* document() const;
+
MediaStreamTrackVector trackVectorForType(RealtimeMediaSource::Type) const;
RefPtr<MediaStreamPrivate> m_private;
- bool m_isActive;
HashMap<String, RefPtr<MediaStreamTrack>> m_trackSet;
Timer m_activityEventTimer;
Vector<Ref<Event>> m_scheduledActivityEvents;
Vector<Observer*> m_observers;
+
+ bool m_isActive { false };
+ bool m_isMuted { true };
+ bool m_externallyMuted { false };
};
} // namespace WebCore
Modified: trunk/Source/WebCore/page/MediaProducer.h (197928 => 197929)
--- trunk/Source/WebCore/page/MediaProducer.h 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebCore/page/MediaProducer.h 2016-03-10 12:05:59 UTC (rev 197929)
@@ -43,6 +43,7 @@
IsPreviousTrackControlEnabled = 1 << 8,
HasPlaybackTargetAvailabilityListener = 1 << 9,
HasAudioOrVideo = 1 << 10,
+ HasActiveMediaCaptureDevice = 1 << 11,
};
typedef unsigned MediaStateFlags;
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (197928 => 197929)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp 2016-03-10 12:05:59 UTC (rev 197929)
@@ -181,7 +181,7 @@
return false;
}
-bool MediaStreamPrivate::hasVideo()
+bool MediaStreamPrivate::hasVideo() const
{
for (auto& track : m_trackSet.values()) {
if (track->type() == RealtimeMediaSource::Type::Video && track->enabled() && !track->ended())
@@ -190,7 +190,7 @@
return false;
}
-bool MediaStreamPrivate::hasAudio()
+bool MediaStreamPrivate::hasAudio() const
{
for (auto& track : m_trackSet.values()) {
if (track->type() == RealtimeMediaSource::Type::Audio && track->enabled() && !track->ended())
@@ -199,6 +199,15 @@
return false;
}
+bool MediaStreamPrivate::muted() const
+{
+ for (auto& track : m_trackSet.values()) {
+ if (!track->muted())
+ return false;
+ }
+ return true;
+}
+
FloatSize MediaStreamPrivate::intrinsicSize() const
{
FloatSize size;
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (197928 => 197929)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h 2016-03-10 12:05:59 UTC (rev 197929)
@@ -91,8 +91,9 @@
RefPtr<Image> currentFrameImage();
void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&);
- bool hasVideo();
- bool hasAudio();
+ bool hasVideo() const;
+ bool hasAudio() const;
+ bool muted() const;
FloatSize intrinsicSize() const;
Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm (197928 => 197929)
--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm 2016-03-10 12:05:59 UTC (rev 197929)
@@ -132,6 +132,7 @@
{
setName(device.localizedName);
setPersistentID(device.uniqueID);
+ setMuted(true);
}
AVMediaCaptureSource::~AVMediaCaptureSource()
@@ -225,6 +226,7 @@
return;
m_isRunning = state;
+ setMuted(!m_isRunning);
});
}
Modified: trunk/Source/WebKit2/ChangeLog (197928 => 197929)
--- trunk/Source/WebKit2/ChangeLog 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebKit2/ChangeLog 2016-03-10 12:05:59 UTC (rev 197929)
@@ -1,3 +1,22 @@
+2016-03-10 Eric Carlson <[email protected]>
+
+ [MediaStream] push media stream state to the UI process
+ https://bugs.webkit.org/show_bug.cgi?id=155281
+
+ Reviewed by Darin Adler.
+
+ * UIProcess/API/C/WKPage.cpp:
+ (WKPageGetMediaState): New.
+ * UIProcess/API/C/WKPagePrivate.h:
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::didCommitLoadForFrame): Clear m_mediaState.
+ (WebKit::WebPageProxy::isPlayingMediaDidChange): Call m_pageClient.isPlayingMediaDidChange when
+ audio or video state changes, call m_uiClient->isPlayingAudioDidChange when audio, vidoe,
+ or media stream state changes.
+ * UIProcess/WebPageProxy.h:
+ (WebKit::WebPageProxy::mediaStateFlags): New.
+
2016-03-09 Carlos Garcia Campos <[email protected]>
[GTK] Artifacts when using web view background color
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (197928 => 197929)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2016-03-10 12:05:59 UTC (rev 197929)
@@ -2697,6 +2697,21 @@
return toImpl(page)->isPlayingAudio();
}
+WKMediaState WKPageGetMediaState(WKPageRef page)
+{
+ WebCore::MediaProducer::MediaStateFlags coreState = toImpl(page)->mediaStateFlags();
+ WKMediaState state = kWKMediaIsNotPlaying;
+
+ if (coreState & WebCore::MediaProducer::IsPlayingAudio)
+ state |= kWKMediaIsPlayingAudio;
+ if (coreState & WebCore::MediaProducer::IsPlayingVideo)
+ state |= kWKMediaIsPlayingVideo;
+ if (coreState & WebCore::MediaProducer::HasActiveMediaCaptureDevice)
+ state |= kWKMediaHasActiveCaptureDevice;
+
+ return state;
+}
+
void WKPageClearWheelEventTestTrigger(WKPageRef pageRef)
{
toImpl(pageRef)->clearWheelEventTestTrigger();
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPagePrivate.h (197928 => 197929)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPagePrivate.h 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPagePrivate.h 2016-03-10 12:05:59 UTC (rev 197929)
@@ -118,6 +118,16 @@
WK_EXPORT void WKPageSetMuted(WKPageRef page, bool muted);
enum {
+ kWKMediaIsNotPlaying = 0,
+ kWKMediaIsPlayingAudio = 1 << 0,
+ kWKMediaIsPlayingVideo = 1 << 1,
+ kWKMediaHasActiveCaptureDevice = 1 << 2,
+};
+typedef uint32_t WKMediaState;
+
+WK_EXPORT WKMediaState WKPageGetMediaState(WKPageRef page);
+
+enum {
kWKMediaEventTypePlayPause,
kWKMediaEventTypeTrackNext,
kWKMediaEventTypeTrackPrevious
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (197928 => 197929)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2016-03-10 12:05:59 UTC (rev 197929)
@@ -3088,6 +3088,7 @@
}
m_pageLoadState.commitChanges();
+ m_mediaState = MediaProducer::IsNotPlaying;
if (m_navigationClient) {
if (frame->isMainFrame())
m_navigationClient->didCommitNavigation(*this, navigation.get(), m_process->transformHandlesToObjects(userData.object()).get());
@@ -6000,16 +6001,18 @@
if (state == m_mediaState)
return;
+ MediaProducer::MediaStateFlags playingMediaMask = MediaProducer::IsPlayingAudio | MediaProducer::IsPlayingVideo;
MediaProducer::MediaStateFlags oldState = m_mediaState;
m_mediaState = state;
- if ((oldState & MediaProducer::IsPlayingAudio) == (m_mediaState & MediaProducer::IsPlayingAudio))
- return;
-
#if PLATFORM(MAC)
- m_pageClient.isPlayingMediaDidChange();
+ if ((oldState & playingMediaMask) != (m_mediaState & playingMediaMask))
+ m_pageClient.isPlayingMediaDidChange();
#endif
- m_uiClient->isPlayingAudioDidChange(*this);
+
+ playingMediaMask |= MediaProducer::HasActiveMediaCaptureDevice;
+ if ((oldState & playingMediaMask) != (m_mediaState & playingMediaMask))
+ m_uiClient->isPlayingAudioDidChange(*this);
}
bool WebPageProxy::isPlayingVideoWithAudio() const
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (197928 => 197929)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2016-03-10 12:05:59 UTC (rev 197929)
@@ -1019,6 +1019,7 @@
bool isPlayingAudio() const { return !!(m_mediaState & WebCore::MediaProducer::IsPlayingAudio); }
void isPlayingMediaDidChange(WebCore::MediaProducer::MediaStateFlags, uint64_t);
+ WebCore::MediaProducer::MediaStateFlags mediaStateFlags() const { return m_mediaState; }
bool isPlayingVideoWithAudio() const;
Modified: trunk/Source/WebKit2/WebProcess/com.apple.WebProcess.sb.in (197928 => 197929)
--- trunk/Source/WebKit2/WebProcess/com.apple.WebProcess.sb.in 2016-03-10 08:19:42 UTC (rev 197928)
+++ trunk/Source/WebKit2/WebProcess/com.apple.WebProcess.sb.in 2016-03-10 12:05:59 UTC (rev 197929)
@@ -308,3 +308,29 @@
(global-name "com.apple.coremedia.endpointstream.xpc")
(global-name "com.apple.coremedia.endpointplaybacksession.xpc")
(global-name "com.apple.coremedia.endpointpicker.xpc"))
+
+
+
+
+
+;; Camera access
+(allow device-camera)
+(allow file-read*
+ (literal "/Library/Preferences/com.apple.coremedia")
+ (home-literal "/Library/Preferences/com.apple.coremedia"))
+(allow mach-lookup (extension "com.apple.app-sandbox.mach"))
+(allow mach-lookup
+ (global-name "com.apple.cmio.AppleCameraAssistant")
+ ;; Apple DAL assistants
+ (global-name "com.apple.cmio.VDCAssistant")
+ (global-name "com.apple.cmio.AVCAssistant")
+ (global-name "com.apple.cmio.IIDCVideoAssistant")
+ ;; QuickTimeIIDCDigitizer assistant
+ (global-name "com.apple.IIDCAssistant"))
+(allow iokit-open
+ ;; QuickTimeUSBVDCDigitizer
+ (iokit-user-client-class "IOUSBDeviceUserClientV2")
+ (iokit-user-client-class "IOUSBInterfaceUserClientV2"))
+
+;; Microphone
+(allow device-microphone)