diff options
author | wolfbeast <mcwerewolf@gmail.com> | 2018-12-13 13:59:17 +0100 |
---|---|---|
committer | wolfbeast <mcwerewolf@gmail.com> | 2018-12-13 14:08:12 +0100 |
commit | a2638c7b2f9d1a04df580569d6235e0d411b56d8 (patch) | |
tree | ceba93bbdb837503e19788730ae008be04fa5585 | |
parent | d2d0044421c02c89790a17555abdd20d40902076 (diff) | |
download | UXP-a2638c7b2f9d1a04df580569d6235e0d411b56d8.tar UXP-a2638c7b2f9d1a04df580569d6235e0d411b56d8.tar.gz UXP-a2638c7b2f9d1a04df580569d6235e0d411b56d8.tar.lz UXP-a2638c7b2f9d1a04df580569d6235e0d411b56d8.tar.xz UXP-a2638c7b2f9d1a04df580569d6235e0d411b56d8.zip |
Clear CanvasShutdownObserver::mCanvas when the canvas goes away.
This is fallout from Bug 1167235 - Use a fast method of double buffering for canvas.
It is possible for the CanvasRenderingContext2D to be destroyed while we're in the
middle of the call to nsObserverService::NotifyObservers() for shutdown.
This leaves the shutdown observer with a dangling pointer to the canvas, so this
patch explicitly clears the pointer when the context goes away.
-rw-r--r-- | dom/canvas/CanvasRenderingContext2D.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp index 18af28e9f..e3406fc02 100644 --- a/dom/canvas/CanvasRenderingContext2D.cpp +++ b/dom/canvas/CanvasRenderingContext2D.cpp @@ -783,6 +783,15 @@ public: : mCanvas(aCanvas) {} + void OnShutdown() { + if(!mCanvas) { + return; + } + + mCanvas = nullptr; + nsContentUtils::UnregisterShutdownObserver(this); + } + NS_DECL_ISUPPORTS NS_DECL_NSIOBSERVER private: @@ -800,7 +809,7 @@ CanvasShutdownObserver::Observe(nsISupports* aSubject, { if (mCanvas && strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0) { mCanvas->OnShutdown(); - nsContentUtils::UnregisterShutdownObserver(this); + OnShutdown(); } return NS_OK; @@ -1218,7 +1227,7 @@ void CanvasRenderingContext2D::RemoveShutdownObserver() { if (mShutdownObserver) { - nsContentUtils::UnregisterShutdownObserver(mShutdownObserver); + mShutdownObserver->OnShutdown(); mShutdownObserver = nullptr; } } |