Chromium Code Reviews| Index: Source/modules/mediastream/MediaStream.cpp |
| diff --git a/Source/modules/mediastream/MediaStream.cpp b/Source/modules/mediastream/MediaStream.cpp |
| index 7d5caddfc43eeb992c04365b18a6fafb8fda69d2..96ffe70b29f044306fdd34c1737c5dea7fdb001f 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()); |
| } |
| @@ -282,10 +303,12 @@ void MediaStream::trackEnded() |
| void MediaStream::streamEnded() |
| { |
| - if (ended()) |
| + if (!active()) |
|
hta - Chromium
2015/01/14 14:12:02
Wrong test. Ended streams (as previously defined)
|
| return; |
| + m_descriptor->setActive(false); |
| m_descriptor->setEnded(); |
| + scheduleDispatchEvent(Event::create(EventTypeNames::inactive)); |
| scheduleDispatchEvent(Event::create(EventTypeNames::ended)); |
| } |
| @@ -308,8 +331,6 @@ ExecutionContext* MediaStream::executionContext() const |
| void MediaStream::addRemoteTrack(MediaStreamComponent* component) |
| { |
| ASSERT(component); |
| - if (ended()) |
| - return; |
|
hta - Chromium
2015/01/14 14:12:02
Until we delete the ended code altogether, keep th
|
| MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), component); |
| switch (component->source()->type()) { |
| @@ -324,12 +345,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) |
| { |
| - if (m_stopped) |
| - return; |
|
hta - Chromium
2015/01/14 14:12:02
m_stopped is not relevant to either active or ende
|
| + ASSERT(component); |
| MediaStreamTrackVector* tracks = 0; |
| switch (component->source()->type()) { |
| @@ -357,6 +382,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) |