Changeset 88341 in webkit
- Timestamp:
- Jun 8, 2011 6:08:11 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r88338 r88341 1 2011-06-08 Tommy Widenflycht <tommyw@google.com> 2 3 Reviewed by Tony Gentilcore. 4 5 Media Stream API: integrate the Track List objects into the existing code. 6 https://bugs.webkit.org/show_bug.cgi?id=60205 7 8 Tests for the Media Stream API will be provided by the bug 56587. 9 10 * dom/ExclusiveTrackList.cpp: 11 (WebCore::ExclusiveTrackList::select): 12 (WebCore::ExclusiveTrackList::trackFailed): 13 * dom/ExclusiveTrackList.h: 14 * dom/GeneratedStream.cpp: 15 (WebCore::GeneratedStream::create): 16 (WebCore::GeneratedStream::GeneratedStream): 17 (WebCore::GeneratedStream::streamEnded): 18 (WebCore::GeneratedStream::audioTracks): 19 (WebCore::GeneratedStream::videoTracks): 20 (WebCore::GeneratedStream::stop): 21 * dom/GeneratedStream.h: 22 * dom/GeneratedStream.idl: 23 * dom/MultipleTrackList.cpp: 24 (WebCore::MultipleTrackList::trackFailed): 25 (WebCore::MultipleTrackList::enable): 26 (WebCore::MultipleTrackList::disable): 27 * dom/MultipleTrackList.h: 28 * dom/Stream.h: 29 * dom/TrackList.cpp: 30 (WebCore::TrackList::clear): 31 (WebCore::TrackList::associateStream): 32 (WebCore::TrackList::associatedStreamLabel): 33 (WebCore::TrackList::trackFailed): 34 (WebCore::TrackList::scriptExecutionContext): 35 * dom/TrackList.h: 36 * page/MediaStreamClient.h: 37 * page/MediaStreamController.cpp: 38 (WebCore::MediaStreamController::enableAudioTrack): 39 (WebCore::MediaStreamController::disableAudioTrack): 40 (WebCore::MediaStreamController::selectVideoTrack): 41 (WebCore::MediaStreamController::streamGenerated): 42 (WebCore::MediaStreamController::audioTrackFailed): 43 (WebCore::MediaStreamController::videoTrackFailed): 44 * page/MediaStreamController.h: 45 * page/MediaStreamFrameController.cpp: 46 (WebCore::MediaStreamFrameController::unregister): 47 (WebCore::MediaStreamFrameController::enterDetachedState): 48 (WebCore::MediaStreamFrameController::disconnectFrame): 49 (WebCore::MediaStreamFrameController::enableAudioTrack): 50 (WebCore::MediaStreamFrameController::disableAudioTrack): 51 (WebCore::MediaStreamFrameController::selectVideoTrack): 52 (WebCore::MediaStreamFrameController::streamGenerated): 53 (WebCore::MediaStreamFrameController::audioTrackFailed): 54 (WebCore::MediaStreamFrameController::videoTrackFailed): 55 * page/MediaStreamFrameController.h: 56 (WebCore::MediaStreamFrameController::ClientBase::isGenericClient): 57 (WebCore::MediaStreamFrameController::GenericClient::GenericClient): 58 (WebCore::MediaStreamFrameController::GenericClient::~GenericClient): 59 (WebCore::MediaStreamFrameController::GenericClient::isGenericClient): 60 (WebCore::MediaStreamFrameController::GenericClient::unregister): 61 1 62 2011-06-08 Pavel Podivilov <podivilov@chromium.org> 2 63 -
trunk/Source/WebCore/dom/ExclusiveTrackList.cpp
r87293 r88341 61 61 62 62 m_selectedIndex = index; 63 64 #if ENABLE(MEDIA_STREAM) 65 if (mediaStreamFrameController()) 66 mediaStreamFrameController()->selectVideoTrack(associatedStreamLabel(), index); 67 #endif 68 63 69 postChangeEvent(); 64 70 } 71 72 #if ENABLE(MEDIA_STREAM) 73 void ExclusiveTrackList::trackFailed(unsigned long index) 74 { 75 if (m_selectedIndex == static_cast<long>(index)) 76 m_selectedIndex = NoSelection; 77 78 TrackList::trackFailed(index); 79 } 80 #endif 65 81 66 82 ExclusiveTrackList* ExclusiveTrackList::toExclusiveTrackList() -
trunk/Source/WebCore/dom/ExclusiveTrackList.h
r87293 r88341 45 45 virtual void clear(); 46 46 47 #if ENABLE(MEDIA_STREAM) 48 virtual void trackFailed(unsigned long index); 49 #endif 50 47 51 // EventTarget implementation. 48 52 virtual ExclusiveTrackList* toExclusiveTrackList(); -
trunk/Source/WebCore/dom/GeneratedStream.cpp
r87150 r88341 30 30 #include "Event.h" 31 31 #include "EventNames.h" 32 #include "ExclusiveTrackList.h" 32 33 #include "MediaStreamFrameController.h" 34 #include "MultipleTrackList.h" 33 35 #include "ScriptExecutionContext.h" 34 36 … … 58 60 }; 59 61 60 PassRefPtr<GeneratedStream> GeneratedStream::create(MediaStreamFrameController* frameController, const String& label )62 PassRefPtr<GeneratedStream> GeneratedStream::create(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks) 61 63 { 62 return adoptRef(new GeneratedStream(frameController, label ));64 return adoptRef(new GeneratedStream(frameController, label, audioTracks, videoTracks)); 63 65 } 64 66 65 GeneratedStream::GeneratedStream(MediaStreamFrameController* frameController, const String& label )67 GeneratedStream::GeneratedStream(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks) 66 68 : Stream(frameController, label, true) 69 , m_audioTracks(audioTracks) 70 , m_videoTracks(videoTracks) 67 71 { 72 ASSERT(m_audioTracks); 73 ASSERT(m_videoTracks); 74 m_audioTracks->associateStream(label); 75 m_videoTracks->associateStream(label); 68 76 } 69 77 … … 85 93 } 86 94 95 void GeneratedStream::streamEnded() 96 { 97 m_audioTracks->clear(); 98 m_videoTracks->clear(); 99 100 Stream::streamEnded(); 101 } 102 103 PassRefPtr<MultipleTrackList> GeneratedStream::audioTracks() const 104 { 105 return m_audioTracks; 106 } 107 108 PassRefPtr<ExclusiveTrackList> GeneratedStream::videoTracks() const 109 { 110 return m_videoTracks; 111 } 112 87 113 void GeneratedStream::stop() 88 114 { … … 91 117 92 118 mediaStreamFrameController()->stopGeneratedStream(label()); 119 m_audioTracks->clear(); 120 m_videoTracks->clear(); 93 121 94 122 m_readyState = ENDED; -
trunk/Source/WebCore/dom/GeneratedStream.h
r87150 r88341 33 33 namespace WebCore { 34 34 35 class ExclusiveTrackList; 36 class MultipleTrackList; 37 35 38 class GeneratedStream : public Stream { 36 39 public: 37 // FIXME: add audio and video tracks when available. 38 static PassRefPtr<GeneratedStream> create(MediaStreamFrameController*, const String& label); 40 static PassRefPtr<GeneratedStream> create(MediaStreamFrameController*, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks); 39 41 virtual ~GeneratedStream(); 40 42 41 43 void stop(); 42 44 45 PassRefPtr<MultipleTrackList> audioTracks() const; 46 PassRefPtr<ExclusiveTrackList> videoTracks() const; 47 43 48 // MediaStreamFrameController::StreamClient implementation. 44 49 virtual void detachEmbedder(); 50 virtual void streamEnded(); 45 51 46 52 // EventTarget. … … 48 54 49 55 private: 50 GeneratedStream(MediaStreamFrameController*, const String& label );56 GeneratedStream(MediaStreamFrameController*, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks); 51 57 class DispatchUpdateTask; 52 58 friend class DispatchUpdateTask; 53 59 54 60 void onStop(); 61 62 RefPtr<MultipleTrackList> m_audioTracks; 63 RefPtr<ExclusiveTrackList> m_videoTracks; 55 64 }; 56 65 -
trunk/Source/WebCore/dom/GeneratedStream.idl
r87150 r88341 31 31 void stop(); 32 32 33 // FIXME: implement audio and video tracks when available. 33 // Track control. 34 readonly attribute MultipleTrackList audioTracks; 35 readonly attribute ExclusiveTrackList videoTracks; 34 36 }; 35 37 -
trunk/Source/WebCore/dom/MultipleTrackList.cpp
r87293 r88341 55 55 } 56 56 57 #if ENABLE(MEDIA_STREAM) 58 void MultipleTrackList::trackFailed(unsigned long index) 59 { 60 TrackList::trackFailed(index); 61 m_isEnabled.remove(index); 62 } 63 #endif 64 57 65 bool MultipleTrackList::isEnabled(unsigned long index, ExceptionCode& ec) const 58 66 { … … 66 74 67 75 m_isEnabled[index] = true; 76 77 #if ENABLE(MEDIA_STREAM) 78 if (mediaStreamFrameController()) 79 mediaStreamFrameController()->enableAudioTrack(associatedStreamLabel(), index); 80 #endif 81 68 82 postChangeEvent(); 69 83 } … … 75 89 76 90 m_isEnabled[index] = false; 91 92 #if ENABLE(MEDIA_STREAM) 93 if (mediaStreamFrameController()) 94 mediaStreamFrameController()->disableAudioTrack(associatedStreamLabel(), index); 95 #endif 96 77 97 postChangeEvent(); 78 98 } -
trunk/Source/WebCore/dom/MultipleTrackList.h
r87293 r88341 46 46 virtual void clear(); 47 47 48 #if ENABLE(MEDIA_STREAM) 49 virtual void trackFailed(unsigned long index); 50 #endif 51 48 52 // EventTarget implementation. 49 53 virtual MultipleTrackList* toMultipleTrackList(); -
trunk/Source/WebCore/dom/Stream.h
r87150 r88341 53 53 // FIXME: implement the record method when StreamRecorder is available. 54 54 55 DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);56 55 DEFINE_ATTRIBUTE_EVENT_LISTENER(ended); 57 56 -
trunk/Source/WebCore/dom/TrackList.cpp
r87293 r88341 104 104 void TrackList::clear() 105 105 { 106 #if ENABLE(MEDIA_STREAM) 107 m_associatedStreamLabel = String(); 108 #endif 109 110 if (m_tracks.isEmpty()) 111 return; 112 106 113 m_tracks.clear(); 114 107 115 postChangeEvent(); 108 116 } … … 124 132 } 125 133 134 #if ENABLE(MEDIA_STREAM) 135 void TrackList::associateStream(const String& label) 136 { 137 ASSERT(m_associatedStreamLabel.isNull()); 138 m_associatedStreamLabel = label; 139 } 140 141 const String& TrackList::associatedStreamLabel() const 142 { 143 return m_associatedStreamLabel; 144 } 145 146 void TrackList::trackFailed(unsigned long index) 147 { 148 ASSERT(index < length()); 149 m_tracks.remove(index); 150 postChangeEvent(); 151 } 152 #endif 153 126 154 TrackList* TrackList::toTrackList() 127 155 { … … 131 159 ScriptExecutionContext* TrackList::scriptExecutionContext() const 132 160 { 133 // FIXME: provide an script execution context for HTML Media Element and MediaStream API use cases. 134 // For the MediaStream API: https://bugs.webkit.org/show_bug.cgi?id=60205 135 // For the HTML Media Element: https://bugs.webkit.org/show_bug.cgi?id=61127 161 #if ENABLE(MEDIA_STREAM) 162 if (mediaStreamFrameController()) 163 return mediaStreamFrameController()->scriptExecutionContext(); 164 #endif 165 166 // FIXME: provide an script execution context for HTML Media Element use case. 167 // https://bugs.webkit.org/show_bug.cgi?id=61127 136 168 return 0; 137 169 } -
trunk/Source/WebCore/dom/TrackList.h
r87293 r88341 59 59 60 60 class TrackList : public RefCounted<TrackList>, 61 #if ENABLE(MEDIA_STREAM) 62 public MediaStreamFrameController::GenericClient, 63 #endif 61 64 public EventTarget { 62 65 public: … … 73 76 74 77 virtual void clear(); 78 79 #if ENABLE(MEDIA_STREAM) 80 void associateStream(const String& streamLabel); 81 const String& associatedStreamLabel() const; 82 virtual void trackFailed(unsigned long index); 83 #endif 75 84 76 85 // EventTarget implementation. … … 125 134 EventTargetData m_eventTargetData; 126 135 TrackVector m_tracks; 136 137 #if ENABLE(MEDIA_STREAM) 138 String m_associatedStreamLabel; 139 #endif 127 140 }; 128 141 -
trunk/Source/WebCore/page/MediaStreamClient.h
r87150 r88341 53 53 virtual void stopGeneratedStream(const String& streamLabel) = 0; 54 54 55 // Enable/disable an audio track in a generated stream. 56 virtual void enableAudioTrack(const String& streamLabel, unsigned long index) = 0; 57 virtual void disableAudioTrack(const String& streamLabel, unsigned long index) = 0; 58 59 // Select a video track in a generated stream. 60 virtual void selectVideoTrack(const String& streamLabel, long index) = 0; 61 55 62 protected: 56 63 virtual ~MediaStreamClient() { } -
trunk/Source/WebCore/page/MediaStreamController.cpp
r87150 r88341 28 28 #if ENABLE(MEDIA_STREAM) 29 29 30 #include "ExclusiveTrackList.h" 30 31 #include "MediaStreamFrameController.h" 32 #include "MultipleTrackList.h" 31 33 #include "SecurityOrigin.h" 32 34 #include <wtf/Vector.h> … … 118 120 } 119 121 120 void MediaStreamController::streamGenerated(int controllerRequestId, const String& streamLabel) 122 void MediaStreamController::enableAudioTrack(const String& streamLabel, unsigned long index) 123 { 124 m_client->enableAudioTrack(streamLabel, index); 125 } 126 127 void MediaStreamController::disableAudioTrack(const String& streamLabel, unsigned long index) 128 { 129 m_client->disableAudioTrack(streamLabel, index); 130 } 131 132 void MediaStreamController::selectVideoTrack(const String& streamLabel, long index) 133 { 134 m_client->selectVideoTrack(streamLabel, index); 135 } 136 137 void MediaStreamController::streamGenerated(int controllerRequestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks) 121 138 { 122 139 // Don't assert since the frame controller can have been destroyed while the request reply was coming back. … … 126 143 m_requests.remove(controllerRequestId); 127 144 ASSERT(request.frameController()); 128 request.frameController()->streamGenerated(request.localId(), streamLabel );145 request.frameController()->streamGenerated(request.localId(), streamLabel, audioTracks, videoTracks); 129 146 } 130 147 } … … 147 164 } 148 165 166 void MediaStreamController::audioTrackFailed(const String& streamLabel, unsigned long index) 167 { 168 // Don't assert since the frame controller can have been destroyed by the time this is called. 169 if (m_streams.contains(streamLabel)) 170 m_streams.get(streamLabel)->audioTrackFailed(streamLabel, index); 171 } 172 173 void MediaStreamController::videoTrackFailed(const String& streamLabel, unsigned long index) 174 { 175 // Don't assert since the frame controller can have been destroyed by the time this is called. 176 if (m_streams.contains(streamLabel)) 177 m_streams.get(streamLabel)->videoTrackFailed(streamLabel, index); 178 } 179 149 180 } // namespace WebCore 150 181 -
trunk/Source/WebCore/page/MediaStreamController.h
r87150 r88341 37 37 namespace WebCore { 38 38 39 class ExclusiveTrackList; 39 40 class MediaStreamClient; 40 41 class MediaStreamFrameController; 42 class MultipleTrackList; 41 43 class SecurityOrigin; 42 44 … … 52 54 void generateStream(MediaStreamFrameController*, int requestId, GenerateStreamOptionFlags, PassRefPtr<SecurityOrigin>); 53 55 void stopGeneratedStream(const String& streamLabel); 56 void enableAudioTrack(const String& streamLabel, unsigned long index); 57 void disableAudioTrack(const String& streamLabel, unsigned long index); 58 void selectVideoTrack(const String& streamLabel, long index); 54 59 55 void streamGenerated(int requestId, const String& streamLabel );60 void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks); 56 61 void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode); 57 62 void streamFailed(const String& streamLabel); 63 void audioTrackFailed(const String& streamLabel, unsigned long index); 64 void videoTrackFailed(const String& streamLabel, unsigned long index); 58 65 59 66 private: -
trunk/Source/WebCore/page/MediaStreamFrameController.cpp
r87150 r88341 30 30 #include "DOMWindow.h" 31 31 #include "Document.h" 32 #include "ExclusiveTrackList.h" 32 33 #include "Frame.h" 33 34 #include "GeneratedStream.h" 34 35 #include "MediaStreamController.h" 36 #include "MultipleTrackList.h" 35 37 #include "NavigatorUserMediaErrorCallback.h" 36 38 #include "NavigatorUserMediaSuccessCallback.h" … … 173 175 } 174 176 177 void MediaStreamFrameController::unregister(GenericClient* client) 178 { 179 ASSERT(m_clients.contains(client->clientId())); 180 m_clients.remove(client->clientId()); 181 } 182 175 183 Stream* MediaStreamFrameController::getStreamFromLabel(const String& label) const 176 184 { … … 189 197 m_requests.abortAll(); 190 198 m_streams.detachEmbedder(); 199 m_clients.detachEmbedder(); 191 200 m_isInDetachedState = true; 192 201 } … … 217 226 ASSERT(m_requests.isEmpty()); 218 227 m_streams.unregisterAll(); 228 m_clients.unregisterAll(); 219 229 220 230 m_frame = 0; … … 298 308 } 299 309 300 void MediaStreamFrameController::streamGenerated(int requestId, const String& label) 310 void MediaStreamFrameController::enableAudioTrack(const String& streamLabel, unsigned long index) 311 { 312 // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object. 313 if (!m_streams.contains(streamLabel)) 314 return; 315 316 if (isClientAvailable()) 317 pageController()->enableAudioTrack(streamLabel, index); 318 } 319 320 void MediaStreamFrameController::disableAudioTrack(const String& streamLabel, unsigned long index) 321 { 322 // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object. 323 if (!m_streams.contains(streamLabel)) 324 return; 325 326 if (isClientAvailable()) 327 pageController()->disableAudioTrack(streamLabel, index); 328 } 329 330 void MediaStreamFrameController::selectVideoTrack(const String& streamLabel, long index) 331 { 332 // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object. 333 if (!m_streams.contains(streamLabel)) 334 return; 335 336 if (isClientAvailable()) 337 pageController()->selectVideoTrack(streamLabel, index); 338 } 339 340 void MediaStreamFrameController::streamGenerated(int requestId, const String& label, PassRefPtr<MultipleTrackList> audioTracksParam, PassRefPtr<ExclusiveTrackList> videoTracksParam) 301 341 { 302 342 // Don't assert since the request can have been aborted as a result of embedder detachment. … … 306 346 ASSERT(m_requests.get(requestId)->isGenerateStreamRequest()); 307 347 ASSERT(!label.isNull()); 348 ASSERT(audioTracksParam); 349 ASSERT(videoTracksParam); 350 351 RefPtr<MultipleTrackList> audioTracks = audioTracksParam; 352 RefPtr<ExclusiveTrackList> videoTracks = videoTracksParam; 353 354 int audioTracksClientId = m_clients.getNextId(); 355 audioTracks->associateFrameController(this, audioTracksClientId); 356 m_clients.add(audioTracksClientId, audioTracks.get()); 357 358 int videoTracksClientId = m_clients.getNextId(); 359 videoTracks->associateFrameController(this, videoTracksClientId); 360 m_clients.add(videoTracksClientId, videoTracks.get()); 308 361 309 362 RefPtr<GenerateStreamRequest> streamRequest = static_cast<GenerateStreamRequest*>(m_requests.get(requestId).get()); 310 RefPtr<GeneratedStream> generatedStream = GeneratedStream::create(this, label );363 RefPtr<GeneratedStream> generatedStream = GeneratedStream::create(this, label, audioTracks.release(), videoTracks.release()); 311 364 m_streams.add(label, generatedStream.get()); 312 365 m_requests.remove(requestId); … … 336 389 } 337 390 391 void MediaStreamFrameController::audioTrackFailed(const String& label, unsigned long index) 392 { 393 Stream* stream = getStreamFromLabel(label); 394 ASSERT(stream->isGeneratedStream()); 395 static_cast<GeneratedStream*>(stream)->audioTracks()->trackFailed(index); 396 } 397 398 void MediaStreamFrameController::videoTrackFailed(const String& label, unsigned long index) 399 { 400 Stream* stream = getStreamFromLabel(label); 401 ASSERT(stream->isGeneratedStream()); 402 static_cast<GeneratedStream*>(stream)->videoTracks()->trackFailed(index); 403 } 338 404 339 405 } // namespace WebCore -
trunk/Source/WebCore/page/MediaStreamFrameController.h
r87150 r88341 38 38 namespace WebCore { 39 39 40 class ExclusiveTrackList; 40 41 class Frame; 41 42 class GeneratedStream; 42 43 class MediaStreamController; 44 class MultipleTrackList; 43 45 class NavigatorUserMediaErrorCallback; 44 46 class NavigatorUserMediaSuccessCallback; … … 68 70 virtual bool isStream() const { return false; } 69 71 virtual bool isGeneratedStream() const { return false; } 72 virtual bool isGenericClient() const { return false; } 70 73 71 74 // Called when the frame controller is being disconnected to the MediaStreamClient embedder. … … 123 126 }; 124 127 128 // Generic clients are objects that require access to the frame controller but don't have a global id (like streams do) 129 // or need to receive any messages from the embedder client. 130 class GenericClient : public ClientBase<int> { 131 public: 132 GenericClient() { } 133 GenericClient(MediaStreamFrameController* frameController, int id) : ClientBase<int>(frameController, id) { } 134 virtual ~GenericClient() { unregister(); } 135 virtual bool isGenericClient() { return true; } 136 137 private: 138 virtual void unregister() { unregisterClient(this); } 139 }; 140 125 141 MediaStreamFrameController(Frame*); 126 142 virtual ~MediaStreamFrameController(); … … 143 159 void stopGeneratedStream(const String& streamLabel); 144 160 161 // Enable/disable an audio track in a generated stream. 162 void enableAudioTrack(const String& streamLabel, unsigned long index); 163 void disableAudioTrack(const String& streamLabel, unsigned long index); 164 165 // Select a video track in a generated stream. 166 void selectVideoTrack(const String& streamLabel, long index); 167 145 168 // --- Calls coming back from the controller. --- // 146 169 147 170 // Report the generation of a new local stream. 148 void streamGenerated(int requestId, const String& streamLabel );171 void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks); 149 172 150 173 // Report a failure in the generation of a new stream. … … 153 176 // Report the end of a stream for external reasons. 154 177 void streamFailed(const String& streamLabel); 178 179 // Report the unexpected unavailability of a live media track. 180 void audioTrackFailed(const String& streamLabel, unsigned long index); 181 void videoTrackFailed(const String& streamLabel, unsigned long index); 155 182 156 183 private: … … 188 215 typedef ClientMapBase<String> StreamMap; 189 216 217 // All other types of clients use autogenerated integer ids. 218 class ClientMap : public IdGenerator, public ClientMapBase<int> { }; 219 190 220 // Detached from a page, and hence from a embedder client. 191 221 void enterDetachedState(); 192 222 193 223 void unregister(StreamClient*); 224 void unregister(GenericClient*); 194 225 MediaStreamController* pageController() const; 195 226 Stream* getStreamFromLabel(const String&) const; 196 227 197 228 RequestMap m_requests; 229 ClientMap m_clients; 198 230 StreamMap m_streams; 199 231
Note: See TracChangeset
for help on using the changeset viewer.