summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-12-13 13:59:17 +0100
committerwolfbeast <mcwerewolf@gmail.com>2018-12-13 14:08:12 +0100
commita2638c7b2f9d1a04df580569d6235e0d411b56d8 (patch)
treeceba93bbdb837503e19788730ae008be04fa5585
parentd2d0044421c02c89790a17555abdd20d40902076 (diff)
downloadUXP-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.cpp13
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;
}
}