Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2041)

Unified Diff: Source/modules/mediastream/MediaStream.cpp

Issue 827673002: Add MediaStream.active attribute (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/mediastream/MediaStream.h ('k') | Source/modules/mediastream/MediaStream.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/mediastream/MediaStream.cpp
diff --git a/Source/modules/mediastream/MediaStream.cpp b/Source/modules/mediastream/MediaStream.cpp
index 0d1316fce47446adaa440ece32304835305598e3..3ca7cb419c6a6a7068a5d81d084c85b3523ecf88 100644
--- a/Source/modules/mediastream/MediaStream.cpp
+++ b/Source/modules/mediastream/MediaStream.cpp
@@ -117,6 +117,10 @@ MediaStream::MediaStream(ExecutionContext* context, PassRefPtr<MediaStreamDescri
newTrack->registerMediaStream(this);
m_videoTracks.append(newTrack);
}
+
+ if (emptyOrOnlyEndedTracks()) {
+ m_descriptor->setActive(false);
+ }
}
MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector& audioTracks, const MediaStreamTrackVector& videoTracks)
@@ -143,6 +147,9 @@ MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector
m_audioTracks = audioTracks;
m_videoTracks = videoTracks;
+ if (emptyOrOnlyEndedTracks()) {
+ m_descriptor->setActive(false);
+ }
}
MediaStream::~MediaStream()
@@ -150,6 +157,22 @@ MediaStream::~MediaStream()
m_descriptor->setClient(0);
}
+bool MediaStream::emptyOrOnlyEndedTracks()
+{
+ if (!m_audioTracks.size() && !m_videoTracks.size()) {
+ return true;
+ }
+ for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) {
+ if (!iter->get()->ended())
+ return false;
+ }
+ for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) {
+ if (!iter->get()->ended())
+ return false;
+ }
+ return true;
+}
+
bool MediaStream::ended() const
{
return m_stopped || m_descriptor->ended();
@@ -167,11 +190,6 @@ MediaStreamTrackVector MediaStream::getTracks()
void MediaStream::addTrack(MediaStreamTrack* track, ExceptionState& exceptionState)
{
- if (ended()) {
- exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished.");
- return;
- }
-
if (!track) {
exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrack provided is invalid.");
return;
@@ -190,16 +208,17 @@ void MediaStream::addTrack(MediaStreamTrack* track, ExceptionState& exceptionSta
}
track->registerMediaStream(this);
m_descriptor->addComponent(track->component());
+
+ if (!active() && !track->ended()) {
+ m_descriptor->setActive(true);
+ scheduleDispatchEvent(Event::create(EventTypeNames::active));
+ }
+
MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), track->component());
}
void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exceptionState)
{
- if (ended()) {
- exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished.");
- return;
- }
-
if (!track) {
exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrack provided is invalid.");
return;
@@ -224,8 +243,10 @@ void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception
track->unregisterMediaStream(this);
m_descriptor->removeComponent(track->component());
- if (!m_audioTracks.size() && !m_videoTracks.size())
- m_descriptor->setEnded();
+ if (active() && emptyOrOnlyEndedTracks()) {
+ m_descriptor->setActive(false);
+ scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
+ }
MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component());
}
@@ -285,6 +306,10 @@ void MediaStream::streamEnded()
if (ended())
return;
+ if (active()) {
+ m_descriptor->setActive(false);
+ scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
+ }
m_descriptor->setEnded();
scheduleDispatchEvent(Event::create(EventTypeNames::ended));
}
@@ -324,10 +349,16 @@ void MediaStream::addRemoteTrack(MediaStreamComponent* component)
m_descriptor->addComponent(component);
scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack, false, false, track));
+
+ if (!active() && !track->ended()) {
+ m_descriptor->setActive(true);
+ scheduleDispatchEvent(Event::create(EventTypeNames::active));
+ }
}
void MediaStream::removeRemoteTrack(MediaStreamComponent* component)
{
+ ASSERT(component);
if (m_stopped)
return;
@@ -357,6 +388,11 @@ void MediaStream::removeRemoteTrack(MediaStreamComponent* component)
track->unregisterMediaStream(this);
tracks->remove(index);
scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetrack, false, false, track));
+
+ if (active() && emptyOrOnlyEndedTracks()) {
+ m_descriptor->setActive(false);
+ scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
+ }
}
void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event)
« no previous file with comments | « Source/modules/mediastream/MediaStream.h ('k') | Source/modules/mediastream/MediaStream.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698