#include "config.h"
#include "modules/mediastream/MediaStreamTrack.h"
-#include "bindings/v8/ExceptionMessages.h"
+#include "bindings/core/v8/ExceptionMessages.h"
+#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
#include "core/dom/ExecutionContext.h"
#include "core/events/Event.h"
+#include "modules/mediastream/MediaStream.h"
#include "modules/mediastream/MediaStreamTrackSourcesCallback.h"
#include "modules/mediastream/MediaStreamTrackSourcesRequestImpl.h"
+#include "modules/mediastream/UserMediaController.h"
#include "platform/mediastream/MediaStreamCenter.h"
#include "platform/mediastream/MediaStreamComponent.h"
#include "public/platform/WebSourceInfo.h"
-namespace WebCore {
+namespace blink {
-PassRefPtr<MediaStreamTrack> MediaStreamTrack::create(ExecutionContext* context, MediaStreamComponent* component)
+MediaStreamTrack* MediaStreamTrack::create(ExecutionContext* context, MediaStreamComponent* component)
{
- RefPtr<MediaStreamTrack> track = adoptRef(new MediaStreamTrack(context, component));
+ MediaStreamTrack* track = new MediaStreamTrack(context, component);
track->suspendIfNeeded();
- return track.release();
+ return track;
}
MediaStreamTrack::MediaStreamTrack(ExecutionContext* context, MediaStreamComponent* component)
: ActiveDOMObject(context)
, m_readyState(MediaStreamSource::ReadyStateLive)
- , m_isIteratingObservers(false)
+ , m_isIteratingRegisteredMediaStreams(false)
, m_stopped(false)
, m_component(component)
{
- ScriptWrappable::init(this);
m_component->source()->addObserver(this);
}
MediaStreamCenter::instance().didSetMediaStreamTrackEnabled(m_component.get());
}
+bool MediaStreamTrack::muted() const
+{
+ return m_component->muted();
+}
+
+bool MediaStreamTrack::remote() const
+{
+ return m_component->source()->remote();
+}
+
+bool MediaStreamTrack::readonly() const
+{
+ return m_component->source()->readonly();
+}
+
String MediaStreamTrack::readyState() const
{
if (ended())
return String();
}
-void MediaStreamTrack::getSources(ExecutionContext* context, PassOwnPtr<MediaStreamTrackSourcesCallback> callback, ExceptionState& exceptionState)
+void MediaStreamTrack::getSources(ExecutionContext* context, MediaStreamTrackSourcesCallback* callback, ExceptionState& exceptionState)
{
- RefPtr<MediaStreamTrackSourcesRequest> request = MediaStreamTrackSourcesRequestImpl::create(context->securityOrigin()->toString(), callback);
- if (!MediaStreamCenter::instance().getMediaStreamTrackSources(request.release()))
- exceptionState.throwDOMException(NotSupportedError, ExceptionMessages::failedToExecute("getSources", "MediaStreamTrack", "Functionality not implemented yet"));
+ LocalFrame* frame = toDocument(context)->frame();
+ UserMediaController* userMedia = UserMediaController::from(frame);
+ if (!userMedia) {
+ exceptionState.throwDOMException(NotSupportedError, "No sources controller available; is this a detached window?");
+ return;
+ }
+ MediaStreamTrackSourcesRequest* request = MediaStreamTrackSourcesRequestImpl::create(*context, callback);
+ userMedia->requestSources(request);
}
void MediaStreamTrack::stopTrack(ExceptionState& exceptionState)
propagateTrackEnded();
}
-PassRefPtr<MediaStreamTrack> MediaStreamTrack::clone(ExecutionContext* context)
+MediaStreamTrack* MediaStreamTrack::clone(ExecutionContext* context)
{
RefPtr<MediaStreamComponent> clonedComponent = MediaStreamComponent::create(component()->source());
- RefPtr<MediaStreamTrack> clonedTrack = MediaStreamTrack::create(context, clonedComponent.get());
+ MediaStreamTrack* clonedTrack = MediaStreamTrack::create(context, clonedComponent.get());
MediaStreamCenter::instance().didCreateMediaStreamTrack(clonedComponent.get());
- return clonedTrack.release();
+ return clonedTrack;
}
bool MediaStreamTrack::ended() const
m_readyState = m_component->source()->readyState();
switch (m_readyState) {
case MediaStreamSource::ReadyStateLive:
+ m_component->setMuted(false);
dispatchEvent(Event::create(EventTypeNames::unmute));
break;
case MediaStreamSource::ReadyStateMuted:
+ m_component->setMuted(true);
dispatchEvent(Event::create(EventTypeNames::mute));
break;
case MediaStreamSource::ReadyStateEnded:
void MediaStreamTrack::propagateTrackEnded()
{
- RELEASE_ASSERT(!m_isIteratingObservers);
- m_isIteratingObservers = true;
- for (Vector<Observer*>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter)
+ RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams);
+ m_isIteratingRegisteredMediaStreams = true;
+ for (HeapHashSet<Member<MediaStream> >::iterator iter = m_registeredMediaStreams.begin(); iter != m_registeredMediaStreams.end(); ++iter)
(*iter)->trackEnded();
- m_isIteratingObservers = false;
+ m_isIteratingRegisteredMediaStreams = false;
}
MediaStreamComponent* MediaStreamTrack::component()
return MediaStreamCenter::instance().createWebAudioSourceFromMediaStreamTrack(component());
}
-void MediaStreamTrack::addObserver(MediaStreamTrack::Observer* observer)
+void MediaStreamTrack::registerMediaStream(MediaStream* mediaStream)
{
- RELEASE_ASSERT(!m_isIteratingObservers);
- m_observers.append(observer);
+ RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams);
+ RELEASE_ASSERT(!m_registeredMediaStreams.contains(mediaStream));
+ m_registeredMediaStreams.add(mediaStream);
}
-void MediaStreamTrack::removeObserver(MediaStreamTrack::Observer* observer)
+void MediaStreamTrack::unregisterMediaStream(MediaStream* mediaStream)
{
- RELEASE_ASSERT(!m_isIteratingObservers);
- size_t pos = m_observers.find(observer);
- RELEASE_ASSERT(pos != kNotFound);
- m_observers.remove(pos);
+ RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams);
+ HeapHashSet<Member<MediaStream> >::iterator iter = m_registeredMediaStreams.find(mediaStream);
+ RELEASE_ASSERT(iter != m_registeredMediaStreams.end());
+ m_registeredMediaStreams.remove(iter);
}
const AtomicString& MediaStreamTrack::interfaceName() const
return ActiveDOMObject::executionContext();
}
-} // namespace WebCore
+void MediaStreamTrack::trace(Visitor* visitor)
+{
+ visitor->trace(m_registeredMediaStreams);
+ EventTargetWithInlineData::trace(visitor);
+}
+
+} // namespace blink