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