Changeset 181805 in webkit


Ignore:
Timestamp:
Mar 20, 2015 10:53:31 AM (9 years ago)
Author:
peavo@outlook.com
Message:

[WinCairo] Crash when leaving page while video is playing.
https://bugs.webkit.org/show_bug.cgi?id=142578

Reviewed by Alex Christensen.

This can happen when there is an asynchronous event invoked from a video worker
thread, accessing the media player object after it has been deleted.
This is solved by resetting the media player pointer in the event object,
when the media player is deleted.

  • platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp:

(WebCore::MediaPlayerPrivateMediaFoundation::~MediaPlayerPrivateMediaFoundation):
(WebCore::MediaPlayerPrivateMediaFoundation::addListener):
(WebCore::MediaPlayerPrivateMediaFoundation::removeListener):
(WebCore::MediaPlayerPrivateMediaFoundation::notifyDeleted):
(WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::AsyncCallback):
(WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::~AsyncCallback):
(WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::Invoke):
(WebCore::MediaPlayerPrivateMediaFoundation::AsyncCallback::onMediaPlayerDeleted):

  • platform/graphics/win/MediaPlayerPrivateMediaFoundation.h:

(WebCore::MediaPlayerPrivateMediaFoundation::MediaPlayerListener::MediaPlayerListener):
(WebCore::MediaPlayerPrivateMediaFoundation::MediaPlayerListener::~MediaPlayerListener):
(WebCore::MediaPlayerPrivateMediaFoundation::MediaPlayerListener::onMediaPlayerDeleted):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r181804 r181805  
     12015-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
    1272015-03-20  Chris Dumez  <cdumez@apple.com>
    228
  • trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp

    r181694 r181805  
    7676MediaPlayerPrivateMediaFoundation::~MediaPlayerPrivateMediaFoundation()
    7777{
     78    notifyDeleted();
    7879    destroyVideoWindow();
    7980    endSession();
     
    479480        m_hwndVideo = nullptr;
    480481    }
     482}
     483
     484void MediaPlayerPrivateMediaFoundation::addListener(MediaPlayerListener* listener)
     485{
     486    MutexLocker locker(m_mutexListeners);
     487
     488    m_listeners.add(listener);
     489}
     490
     491void MediaPlayerPrivateMediaFoundation::removeListener(MediaPlayerListener* listener)
     492{
     493    MutexLocker locker(m_mutexListeners);
     494
     495    m_listeners.remove(listener);
     496}
     497
     498void 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();
    481504}
    482505
     
    597620    , m_event(event)
    598621{
     622    if (m_mediaPlayer)
     623        m_mediaPlayer->addListener(this);
    599624}
    600625
    601626MediaPlayerPrivateMediaFoundation::AsyncCallback::~AsyncCallback()
    602627{
     628    if (m_mediaPlayer)
     629        m_mediaPlayer->removeListener(this);
    603630}
    604631
     
    637664HRESULT STDMETHODCALLTYPE MediaPlayerPrivateMediaFoundation::AsyncCallback::Invoke(__RPC__in_opt IMFAsyncResult *pAsyncResult)
    638665{
     666    MutexLocker locker(m_mutex);
     667
     668    if (!m_mediaPlayer)
     669        return S_OK;
     670
    639671    if (m_event)
    640672        m_mediaPlayer->endGetEvent(pAsyncResult);
     
    645677}
    646678
     679void MediaPlayerPrivateMediaFoundation::AsyncCallback::onMediaPlayerDeleted()
     680{
     681    MutexLocker locker(m_mutex);
     682
     683    m_mediaPlayer = nullptr;
     684}
     685
    647686}
    648687
  • trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.h

    r180839 r181805  
    3131#include <Mfidl.h>
    3232#include <evr.h>
     33
     34#include <wtf/ThreadingPrimitives.h>
    3335
    3436namespace WebCore {
     
    8486    FloatRect m_lastPaintRect;
    8587
     88    class MediaPlayerListener;
     89    HashSet<MediaPlayerListener*> m_listeners;
     90    Mutex m_mutexListeners;
     91
    8692    COMPtr<IMFMediaSession> m_mediaSession;
    8793    COMPtr<IMFSourceResolver> m_sourceResolver;
     
    108114    void destroyVideoWindow();
    109115
     116    void addListener(MediaPlayerListener*);
     117    void removeListener(MediaPlayerListener*);
     118    void notifyDeleted();
     119
    110120    static LRESULT CALLBACK VideoViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    111121
    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 {
    113131    public:
    114132        AsyncCallback(MediaPlayerPrivateMediaFoundation*, bool event);
     
    122140        virtual HRESULT STDMETHODCALLTYPE Invoke(__RPC__in_opt IMFAsyncResult *pAsyncResult) override;
    123141
     142        virtual void onMediaPlayerDeleted() override;
     143
    124144    private:
    125145        ULONG m_refCount;
    126146        MediaPlayerPrivateMediaFoundation* m_mediaPlayer;
    127147        bool m_event;
     148        Mutex m_mutex;
    128149    };
    129150
Note: See TracChangeset for help on using the changeset viewer.