diff --git a/gfx/vr/VRDisplayPresentation.cpp b/gfx/vr/VRDisplayPresentation.cpp index bbdea615b558..abdd001619c6 100644 --- a/gfx/vr/VRDisplayPresentation.cpp +++ b/gfx/vr/VRDisplayPresentation.cpp @@ -96,7 +96,9 @@ void VRDisplayPresentation::DestroyLayers() { for (VRLayerChild* layer : mLayers) { - Unused << layer->SendDestroy(); + if (layer->IsIPCOpen()) { + Unused << layer->SendDestroy(); + } } mLayers.Clear(); } diff --git a/gfx/vr/ipc/VRLayerChild.cpp b/gfx/vr/ipc/VRLayerChild.cpp index 31840de5a4bf..3bea3d26ff1a 100644 --- a/gfx/vr/ipc/VRLayerChild.cpp +++ b/gfx/vr/ipc/VRLayerChild.cpp @@ -20,6 +20,7 @@ VRLayerChild::VRLayerChild(uint32_t aVRDisplayID, VRManagerChild* aVRManagerChil , mCanvasElement(nullptr) , mShSurfClient(nullptr) , mFront(nullptr) + , mIPCOpen(true) { } @@ -74,6 +75,12 @@ VRLayerChild::SubmitFrame() SendSubmitFrame(mFront->GetIPDLActor()); } +bool +VRLayerChild::IsIPCOpen() +{ + return mIPCOpen; +} + void VRLayerChild::ClearSurfaces() { @@ -81,5 +88,11 @@ VRLayerChild::ClearSurfaces() mShSurfClient = nullptr; } +void +VRLayerChild::ActorDestroy(ActorDestroyReason aWhy) +{ + mIPCOpen = false; +} + } // namespace gfx } // namespace mozilla diff --git a/gfx/vr/ipc/VRLayerChild.h b/gfx/vr/ipc/VRLayerChild.h index 3533d3969082..fa7cbbc9392b 100644 --- a/gfx/vr/ipc/VRLayerChild.h +++ b/gfx/vr/ipc/VRLayerChild.h @@ -35,16 +35,19 @@ public: VRLayerChild(uint32_t aVRDisplayID, VRManagerChild* aVRManagerChild); void Initialize(dom::HTMLCanvasElement* aCanvasElement); void SubmitFrame(); + bool IsIPCOpen(); protected: virtual ~VRLayerChild(); void ClearSurfaces(); + virtual void ActorDestroy(ActorDestroyReason aWhy) override; uint32_t mVRDisplayID; RefPtr mCanvasElement; RefPtr mShSurfClient; RefPtr mFront; + bool mIPCOpen; }; } // namespace gfx