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

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: Allow addTrack/removeTrack when mediastream.ended is true 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
Index: Source/modules/mediastream/MediaStream.cpp
diff --git a/Source/modules/mediastream/MediaStream.cpp b/Source/modules/mediastream/MediaStream.cpp
index 7d5caddfc43eeb992c04365b18a6fafb8fda69d2..2ffdbf2c1a7a6664c5174d89bd886491aead802f 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;
@@ -191,15 +209,15 @@ void MediaStream::addTrack(MediaStreamTrack* track, ExceptionState& exceptionSta
track->registerMediaStream(this);
m_descriptor->addComponent(track->component());
MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), track->component());
perkj_chrome 2015/01/13 08:24:31 please let MediaStreamCenter::instance().didAddMed
jiajia.qin 2015/01/13 10:42:30 Done.
+
+ if (!active() && !track->ended()) {
+ m_descriptor->setActive(true);
+ scheduleDispatchEvent(Event::create(EventTypeNames::active));
+ }
}
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;
@@ -223,11 +241,12 @@ void MediaStream::removeTrack(MediaStreamTrack* track, ExceptionState& exception
return;
track->unregisterMediaStream(this);
m_descriptor->removeComponent(track->component());
-
- if (!m_audioTracks.size() && !m_videoTracks.size())
- m_descriptor->setEnded();
-
MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(), track->component());
+
+ if (active() && emptyOrOnlyEndedTracks()) {
perkj_chrome 2015/01/13 08:24:31 dito. Please call MediaStreamCenter::instance().d
jiajia.qin 2015/01/13 10:42:30 Done.
+ m_descriptor->setActive(false);
+ scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
+ }
}
MediaStreamTrack* MediaStream::getTrackById(String id)
@@ -282,10 +301,12 @@ void MediaStream::trackEnded()
void MediaStream::streamEnded()
{
- if (ended())
+ if (!active())
return;
+ m_descriptor->setActive(false);
m_descriptor->setEnded();
+ scheduleDispatchEvent(Event::create(EventTypeNames::inactive));
scheduleDispatchEvent(Event::create(EventTypeNames::ended));
}
@@ -293,6 +314,7 @@ void MediaStream::contextDestroyed()
{
ContextLifecycleObserver::contextDestroyed();
m_stopped = true;
+ m_descriptor->setActive(false);
perkj_chrome 2015/01/13 08:24:31 is this necessary?
jiajia.qin 2015/01/13 10:42:30 Done.
}
const AtomicString& MediaStream::interfaceName() const
@@ -308,8 +330,6 @@ ExecutionContext* MediaStream::executionContext() const
void MediaStream::addRemoteTrack(MediaStreamComponent* component)
{
ASSERT(component);
- if (ended())
- return;
MediaStreamTrack* track = MediaStreamTrack::create(executionContext(), component);
switch (component->source()->type()) {
@@ -328,8 +348,7 @@ void MediaStream::addRemoteTrack(MediaStreamComponent* component)
void MediaStream::removeRemoteTrack(MediaStreamComponent* component)
{
- if (m_stopped)
- return;
+ ASSERT(component);
MediaStreamTrackVector* tracks = 0;
switch (component->source()->type()) {

Powered by Google App Engine
This is Rietveld 408576698