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) |