Changeset 238181 in webkit
- Timestamp:
- Nov 14, 2018 9:50:36 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r238180 r238181 1 2018-11-14 Youenn Fablet <youenn@apple.com> 2 3 Allow to remove MediaStreamPrivate observers when iterating over observers 4 https://bugs.webkit.org/show_bug.cgi?id=187256 5 6 Reviewed by Eric Carlson. 7 8 Migrate the observer list from a Vector to a HashSet. 9 This is more robust to multiple observing and keeping of order of observers is not required. 10 Copy the set of observers to a vector before iterating over it. 11 This allows to remove an observer while iterating, which is now used in UserMediaRequest. 12 13 Covered by existing tests. 14 15 * Modules/mediastream/UserMediaRequest.cpp: 16 (WebCore::UserMediaRequest::mediaStreamIsReady): 17 * platform/mediastream/MediaStreamPrivate.cpp: 18 (WebCore::MediaStreamPrivate::addObserver): 19 (WebCore::MediaStreamPrivate::removeObserver): 20 (WebCore::MediaStreamPrivate::forEachObserver const): 21 (WebCore::MediaStreamPrivate::updateActiveState): 22 (WebCore::MediaStreamPrivate::addTrack): 23 (WebCore::MediaStreamPrivate::removeTrack): 24 (WebCore::MediaStreamPrivate::characteristicsChanged): 25 * platform/mediastream/MediaStreamPrivate.h: 26 1 27 2018-11-14 Youenn Fablet <youenn@apple.com> 2 28 -
trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
r238091 r238181 366 366 stream->document()->setHasCaptureMediaStreamTrack(); 367 367 m_promise.resolve(WTFMove(stream)); 368 // We are in an observer iterator loop, we do not want to change the observers within this loop. 369 callOnMainThread([stream = WTFMove(m_pendingActivationMediaStream)] { }); 368 m_pendingActivationMediaStream = nullptr; 370 369 } 371 370 -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp
r233829 r238181 85 85 void MediaStreamPrivate::addObserver(MediaStreamPrivate::Observer& observer) 86 86 { 87 m_observers.a ppend(&observer);87 m_observers.add(&observer); 88 88 } 89 89 90 90 void MediaStreamPrivate::removeObserver(MediaStreamPrivate::Observer& observer) 91 91 { 92 size_t pos = m_observers.find(&observer); 93 if (pos != notFound) 94 m_observers.remove(pos); 92 m_observers.remove(&observer); 93 } 94 95 void MediaStreamPrivate::forEachObserver(const WTF::Function<void(Observer&)>& apply) const 96 { 97 for (auto* observer : copyToVector(m_observers)) { 98 if (!m_observers.contains(observer)) 99 continue; 100 apply(*observer); 101 } 95 102 } 96 103 … … 119 126 120 127 if (notifyClientOption == NotifyClientOption::Notify) { 121 for (auto& observer : m_observers) 122 observer->activeStatusChanged(); 128 forEachObserver([](auto& observer) { 129 observer.activeStatusChanged(); 130 }); 123 131 } 124 132 } … … 133 141 134 142 if (notifyClientOption == NotifyClientOption::Notify) { 135 for (auto& observer : m_observers) 136 observer->didAddTrack(*track.get()); 143 forEachObserver([&track](auto& observer) { 144 observer.didAddTrack(*track.get()); 145 }); 137 146 } 138 147 … … 149 158 150 159 if (notifyClientOption == NotifyClientOption::Notify) { 151 for (auto& observer : m_observers) 152 observer->didRemoveTrack(track); 160 forEachObserver([&track](auto& observer) { 161 observer.didRemoveTrack(track); 162 }); 153 163 } 154 164 … … 257 267 void MediaStreamPrivate::characteristicsChanged() 258 268 { 259 for (auto& observer : m_observers) 260 observer->characteristicsChanged(); 269 forEachObserver([](auto& observer) { 270 observer.characteristicsChanged(); 271 }); 261 272 } 262 273 -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h
r233829 r238181 118 118 119 119 void scheduleDeferredTask(Function<void ()>&&); 120 void forEachObserver(const WTF::Function<void(Observer&)>&) const; 120 121 121 Vector<Observer*> m_observers;122 HashSet<Observer*> m_observers; 122 123 String m_id; 123 124 MediaStreamTrackPrivate* m_activeVideoTrack { nullptr };
Note: See TracChangeset
for help on using the changeset viewer.