Changeset 181805 in webkit
- Timestamp:
- Mar 20, 2015 10:53:31 AM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r181804 r181805 1 2015-03-20 Per Arne Vollan <peavo@outlook.com> 2 3 [WinCairo] Crash when leaving page while video is playing. 4 https://bugs.webkit.org/show_bug.cgi?id=142578 5 6 Reviewed by Alex Christensen. 7 8 This can happen when there is an asynchronous event invoked from a video worker 9 thread, accessing the media player object after it has been deleted. 10 This is solved by resetting the media player pointer in the event object, 11 when the media player is deleted. 12 13 * platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp: 14 (WebCore::MediaPlayerPrivateMediaFoundation::~MediaPlayerPrivateMediaFoundation): 15 (WebCore::MediaPlayerPrivateMediaFoundation::addListener): 16 (WebCore::MediaPlayerPrivateMediaFoundation::removeListener): 17 (WebCore::MediaPlayerPrivateMediaFoundation::notifyDeleted): 18 (WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::AsyncCallback): 19 (WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::~AsyncCallback): 20 (WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::Invoke): 21 (WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::onMediaPlayerDeleted): 22 * platform/graphics/win/MediaPlayerPrivateMediaFoundation.h: 23 (WebCore::MediaPlayerPrivateMediaFoundation::MediaPlayerListener::MediaPlayerListener): 24 (WebCore::MediaPlayerPrivateMediaFoundation::MediaPlayerListener::~MediaPlayerListener): 25 (WebCore::MediaPlayerPrivateMediaFoundation::MediaPlayerListener::onMediaPlayerDeleted): 26 1 27 2015-03-20 Chris Dumez <cdumez@apple.com> 2 28 -
trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp
r181694 r181805 76 76 MediaPlayerPrivateMediaFoundation::~MediaPlayerPrivateMediaFoundation() 77 77 { 78 notifyDeleted(); 78 79 destroyVideoWindow(); 79 80 endSession(); … … 479 480 m_hwndVideo = nullptr; 480 481 } 482 } 483 484 void MediaPlayerPrivateMediaFoundation::addListener(MediaPlayerListener* listener) 485 { 486 MutexLocker locker(m_mutexListeners); 487 488 m_listeners.add(listener); 489 } 490 491 void MediaPlayerPrivateMediaFoundation::removeListener(MediaPlayerListener* listener) 492 { 493 MutexLocker locker(m_mutexListeners); 494 495 m_listeners.remove(listener); 496 } 497 498 void MediaPlayerPrivateMediaFoundation::notifyDeleted() 499 { 500 MutexLocker locker(m_mutexListeners); 501 502 for (HashSet<MediaPlayerListener*>::const_iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) 503 (*it)->onMediaPlayerDeleted(); 481 504 } 482 505 … … 597 620 , m_event(event) 598 621 { 622 if (m_mediaPlayer) 623 m_mediaPlayer->addListener(this); 599 624 } 600 625 601 626 MediaPlayerPrivateMediaFoundation::AsyncCallback::~AsyncCallback() 602 627 { 628 if (m_mediaPlayer) 629 m_mediaPlayer->removeListener(this); 603 630 } 604 631 … … 637 664 HRESULT STDMETHODCALLTYPE MediaPlayerPrivateMediaFoundation::AsyncCallback::Invoke(__RPC__in_opt IMFAsyncResult *pAsyncResult) 638 665 { 666 MutexLocker locker(m_mutex); 667 668 if (!m_mediaPlayer) 669 return S_OK; 670 639 671 if (m_event) 640 672 m_mediaPlayer->endGetEvent(pAsyncResult); … … 645 677 } 646 678 679 void MediaPlayerPrivateMediaFoundation::AsyncCallback::onMediaPlayerDeleted() 680 { 681 MutexLocker locker(m_mutex); 682 683 m_mediaPlayer = nullptr; 684 } 685 647 686 } 648 687 -
trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.h
r180839 r181805 31 31 #include <Mfidl.h> 32 32 #include <evr.h> 33 34 #include <wtf/ThreadingPrimitives.h> 33 35 34 36 namespace WebCore { … … 84 86 FloatRect m_lastPaintRect; 85 87 88 class MediaPlayerListener; 89 HashSet<MediaPlayerListener*> m_listeners; 90 Mutex m_mutexListeners; 91 86 92 COMPtr<IMFMediaSession> m_mediaSession; 87 93 COMPtr<IMFSourceResolver> m_sourceResolver; … … 108 114 void destroyVideoWindow(); 109 115 116 void addListener(MediaPlayerListener*); 117 void removeListener(MediaPlayerListener*); 118 void notifyDeleted(); 119 110 120 static LRESULT CALLBACK VideoViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 111 121 112 class AsyncCallback : public IMFAsyncCallback { 122 class MediaPlayerListener { 123 public: 124 MediaPlayerListener() { } 125 virtual ~MediaPlayerListener() { } 126 127 virtual void onMediaPlayerDeleted() { } 128 }; 129 130 class AsyncCallback : public IMFAsyncCallback, public MediaPlayerListener { 113 131 public: 114 132 AsyncCallback(MediaPlayerPrivateMediaFoundation*, bool event); … … 122 140 virtual HRESULT STDMETHODCALLTYPE Invoke(__RPC__in_opt IMFAsyncResult *pAsyncResult) override; 123 141 142 virtual void onMediaPlayerDeleted() override; 143 124 144 private: 125 145 ULONG m_refCount; 126 146 MediaPlayerPrivateMediaFoundation* m_mediaPlayer; 127 147 bool m_event; 148 Mutex m_mutex; 128 149 }; 129 150
Note: See TracChangeset
for help on using the changeset viewer.