From 718c1c97fe12f101bcc025e4de4a9f1b0644dfb2 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 6 Nov 2016 18:50:15 -0800 Subject: [PATCH] Don't attach shadowable layers if IPDL fails to construct an actor. (bug 1314349, r=mattwoodrow) --- gfx/layers/ipc/ShadowLayerChild.cpp | 13 ++++++++++--- gfx/layers/ipc/ShadowLayerChild.h | 3 ++- gfx/layers/ipc/ShadowLayers.cpp | 9 ++++++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/gfx/layers/ipc/ShadowLayerChild.cpp b/gfx/layers/ipc/ShadowLayerChild.cpp index b52c229af35e..62d260838f4d 100644 --- a/gfx/layers/ipc/ShadowLayerChild.cpp +++ b/gfx/layers/ipc/ShadowLayerChild.cpp @@ -12,20 +12,27 @@ namespace mozilla { namespace layers { -ShadowLayerChild::ShadowLayerChild(ShadowableLayer* aLayer) - : mLayer(aLayer) +ShadowLayerChild::ShadowLayerChild() + : mLayer(nullptr) { } ShadowLayerChild::~ShadowLayerChild() { } +void +ShadowLayerChild::SetShadowableLayer(ShadowableLayer* aLayer) +{ + MOZ_ASSERT(!mLayer); + mLayer = aLayer; +} + void ShadowLayerChild::ActorDestroy(ActorDestroyReason why) { MOZ_ASSERT(AncestorDeletion != why, "shadowable layer should have been cleaned up by now"); - if (AbnormalShutdown == why) { + if (AbnormalShutdown == why && mLayer) { // This is last-ditch emergency shutdown. Just have the layer // forget its IPDL resources; IPDL-generated code will clean up // automatically in this case. diff --git a/gfx/layers/ipc/ShadowLayerChild.h b/gfx/layers/ipc/ShadowLayerChild.h index e51813c636dd..38a7f95009c2 100644 --- a/gfx/layers/ipc/ShadowLayerChild.h +++ b/gfx/layers/ipc/ShadowLayerChild.h @@ -20,9 +20,10 @@ class ShadowableLayer; class ShadowLayerChild : public PLayerChild { public: - explicit ShadowLayerChild(ShadowableLayer* aLayer); + ShadowLayerChild(); virtual ~ShadowLayerChild(); + void SetShadowableLayer(ShadowableLayer* aLayer); ShadowableLayer* layer() const { return mLayer; } protected: diff --git a/gfx/layers/ipc/ShadowLayers.cpp b/gfx/layers/ipc/ShadowLayers.cpp index 75986621d0ff..983e3cd875ee 100644 --- a/gfx/layers/ipc/ShadowLayers.cpp +++ b/gfx/layers/ipc/ShadowLayers.cpp @@ -749,7 +749,14 @@ ShadowLayerForwarder::ConstructShadowFor(ShadowableLayer* aLayer) if (!IPCOpen()) { return nullptr; } - return mShadowManager->SendPLayerConstructor(new ShadowLayerChild(aLayer)); + + ShadowLayerChild* child = new ShadowLayerChild(); + if (!mShadowManager->SendPLayerConstructor(child)) { + return nullptr; + } + + child->SetShadowableLayer(aLayer); + return child; } #if !defined(MOZ_HAVE_PLATFORM_SPECIFIC_LAYER_BUFFERS)