OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * Copyright (C) 2011 Ericsson AB. All rights reserved. | 3 * Copyright (C) 2011 Ericsson AB. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 25 matching lines...) Expand all Loading... |
36 #include "modules/mediastream/MediaStreamTrackSourcesRequestImpl.h" | 36 #include "modules/mediastream/MediaStreamTrackSourcesRequestImpl.h" |
37 #include "modules/mediastream/UserMediaController.h" | 37 #include "modules/mediastream/UserMediaController.h" |
38 #include "platform/mediastream/MediaStreamCenter.h" | 38 #include "platform/mediastream/MediaStreamCenter.h" |
39 #include "platform/mediastream/MediaStreamComponent.h" | 39 #include "platform/mediastream/MediaStreamComponent.h" |
40 #include "public/platform/WebSourceInfo.h" | 40 #include "public/platform/WebSourceInfo.h" |
41 | 41 |
42 namespace blink { | 42 namespace blink { |
43 | 43 |
44 MediaStreamTrack* MediaStreamTrack::create(ExecutionContext* context, MediaStrea
mComponent* component) | 44 MediaStreamTrack* MediaStreamTrack::create(ExecutionContext* context, MediaStrea
mComponent* component) |
45 { | 45 { |
46 return new MediaStreamTrack(context, component); | 46 MediaStreamTrack* track = new MediaStreamTrack(context, component); |
| 47 track->suspendIfNeeded(); |
| 48 return track; |
47 } | 49 } |
48 | 50 |
49 MediaStreamTrack::MediaStreamTrack(ExecutionContext* context, MediaStreamCompone
nt* component) | 51 MediaStreamTrack::MediaStreamTrack(ExecutionContext* context, MediaStreamCompone
nt* component) |
50 : ContextLifecycleObserver(context) | 52 : ActiveDOMObject(context) |
51 , m_readyState(MediaStreamSource::ReadyStateLive) | 53 , m_readyState(MediaStreamSource::ReadyStateLive) |
52 , m_isIteratingRegisteredMediaStreams(false) | 54 , m_isIteratingRegisteredMediaStreams(false) |
| 55 , m_stopped(false) |
53 , m_component(component) | 56 , m_component(component) |
54 { | 57 { |
55 m_component->source()->addObserver(this); | 58 m_component->source()->addObserver(this); |
56 } | 59 } |
57 | 60 |
58 MediaStreamTrack::~MediaStreamTrack() | 61 MediaStreamTrack::~MediaStreamTrack() |
59 { | 62 { |
60 } | 63 } |
61 | 64 |
62 String MediaStreamTrack::kind() const | 65 String MediaStreamTrack::kind() const |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 MediaStreamTrack* MediaStreamTrack::clone(ExecutionContext* context) | 164 MediaStreamTrack* MediaStreamTrack::clone(ExecutionContext* context) |
162 { | 165 { |
163 MediaStreamComponent* clonedComponent = MediaStreamComponent::create(compone
nt()->source()); | 166 MediaStreamComponent* clonedComponent = MediaStreamComponent::create(compone
nt()->source()); |
164 MediaStreamTrack* clonedTrack = MediaStreamTrack::create(context, clonedComp
onent); | 167 MediaStreamTrack* clonedTrack = MediaStreamTrack::create(context, clonedComp
onent); |
165 MediaStreamCenter::instance().didCreateMediaStreamTrack(clonedComponent); | 168 MediaStreamCenter::instance().didCreateMediaStreamTrack(clonedComponent); |
166 return clonedTrack; | 169 return clonedTrack; |
167 } | 170 } |
168 | 171 |
169 bool MediaStreamTrack::ended() const | 172 bool MediaStreamTrack::ended() const |
170 { | 173 { |
171 return !executionContext() || (m_readyState == MediaStreamSource::ReadyState
Ended); | 174 return m_stopped || (m_readyState == MediaStreamSource::ReadyStateEnded); |
172 } | 175 } |
173 | 176 |
174 void MediaStreamTrack::sourceChangedState() | 177 void MediaStreamTrack::sourceChangedState() |
175 { | 178 { |
176 if (ended()) | 179 if (ended()) |
177 return; | 180 return; |
178 | 181 |
179 m_readyState = m_component->source()->readyState(); | 182 m_readyState = m_component->source()->readyState(); |
180 switch (m_readyState) { | 183 switch (m_readyState) { |
181 case MediaStreamSource::ReadyStateLive: | 184 case MediaStreamSource::ReadyStateLive: |
(...skipping 13 matching lines...) Expand all Loading... |
195 | 198 |
196 void MediaStreamTrack::propagateTrackEnded() | 199 void MediaStreamTrack::propagateTrackEnded() |
197 { | 200 { |
198 RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams); | 201 RELEASE_ASSERT(!m_isIteratingRegisteredMediaStreams); |
199 m_isIteratingRegisteredMediaStreams = true; | 202 m_isIteratingRegisteredMediaStreams = true; |
200 for (HeapHashSet<Member<MediaStream>>::iterator iter = m_registeredMediaStre
ams.begin(); iter != m_registeredMediaStreams.end(); ++iter) | 203 for (HeapHashSet<Member<MediaStream>>::iterator iter = m_registeredMediaStre
ams.begin(); iter != m_registeredMediaStreams.end(); ++iter) |
201 (*iter)->trackEnded(); | 204 (*iter)->trackEnded(); |
202 m_isIteratingRegisteredMediaStreams = false; | 205 m_isIteratingRegisteredMediaStreams = false; |
203 } | 206 } |
204 | 207 |
| 208 void MediaStreamTrack::stop() |
| 209 { |
| 210 m_stopped = true; |
| 211 } |
| 212 |
205 bool MediaStreamTrack::hasPendingActivity() const | 213 bool MediaStreamTrack::hasPendingActivity() const |
206 { | 214 { |
207 // If 'ended' listeners exist and the object hasn't yet reached | 215 // If 'ended' listeners exist and the object hasn't yet reached |
208 // that state, keep the object alive. | 216 // that state, keep the object alive. |
209 // | 217 // |
210 // An otherwise unreachable MediaStreamTrack object in an non-ended | 218 // An otherwise unreachable MediaStreamTrack object in an non-ended |
211 // state will otherwise indirectly be transitioned to the 'ended' state | 219 // state will otherwise indirectly be transitioned to the 'ended' state |
212 // while finalizing m_component. Which dispatches an 'ended' event, | 220 // while finalizing m_component. Which dispatches an 'ended' event, |
213 // referring to this object as the target. If this object is then GCed | 221 // referring to this object as the target. If this object is then GCed |
214 // at the same time, v8 objects will retain (wrapper) references to | 222 // at the same time, v8 objects will retain (wrapper) references to |
(...skipping 24 matching lines...) Expand all Loading... |
239 m_registeredMediaStreams.remove(iter); | 247 m_registeredMediaStreams.remove(iter); |
240 } | 248 } |
241 | 249 |
242 const AtomicString& MediaStreamTrack::interfaceName() const | 250 const AtomicString& MediaStreamTrack::interfaceName() const |
243 { | 251 { |
244 return EventTargetNames::MediaStreamTrack; | 252 return EventTargetNames::MediaStreamTrack; |
245 } | 253 } |
246 | 254 |
247 ExecutionContext* MediaStreamTrack::executionContext() const | 255 ExecutionContext* MediaStreamTrack::executionContext() const |
248 { | 256 { |
249 return ContextLifecycleObserver::executionContext(); | 257 return ActiveDOMObject::executionContext(); |
250 } | 258 } |
251 | 259 |
252 DEFINE_TRACE(MediaStreamTrack) | 260 DEFINE_TRACE(MediaStreamTrack) |
253 { | 261 { |
254 visitor->trace(m_registeredMediaStreams); | 262 visitor->trace(m_registeredMediaStreams); |
255 visitor->trace(m_component); | 263 visitor->trace(m_component); |
256 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStreamTrack>::trace
(visitor); | 264 RefCountedGarbageCollectedEventTargetWithInlineData<MediaStreamTrack>::trace
(visitor); |
257 ContextLifecycleObserver::trace(visitor); | 265 ActiveDOMObject::trace(visitor); |
258 } | 266 } |
259 | 267 |
260 } // namespace blink | 268 } // namespace blink |
OLD | NEW |