From be23668ca85b17bbeaaa16abd2c620f478897c35 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 28 Oct 2016 14:25:15 -0700 Subject: [PATCH] delete websurfaces on shutdown --- interface/src/Application.h | 2 +- .../entities-renderer/src/RenderableWebEntityItem.cpp | 9 ++++++++- libraries/render-utils/src/AbstractViewStateInterface.h | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index 1a0041223e..23cb58c19b 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -229,7 +229,7 @@ public: qint64 getCurrentSessionRuntime() const { return _sessionRunTimer.elapsed(); } - bool isAboutToQuit() const { return _aboutToQuit; } + bool isAboutToQuit() const override { return _aboutToQuit; } bool isPhysicsEnabled() const { return _physicsEnabled; } // the isHMDMode is true whenever we use the interface from an HMD and not a standard flat display diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index e3b86b0ea0..3fa730d5bf 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -95,7 +95,13 @@ bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { auto deleter = [](OffscreenQmlSurface* webSurface) { AbstractViewStateInterface::instance()->postLambdaEvent([webSurface] { - webSurface->deleteLater(); + if (AbstractViewStateInterface::instance()->isAboutToQuit()) { + // WebEngineView may run other threads (wasapi), so they must be deleted for a clean shutdown + // if the application has already stopped its event loop, delete must be explicit + delete webSurface; + } else { + webSurface->deleteLater(); + } }); }; _webSurface = QSharedPointer(new OffscreenQmlSurface(), deleter); @@ -331,6 +337,7 @@ void RenderableWebEntityItem::destroyWebSurface() { if (rootItem) { QObject* obj = rootItem->findChild("webEngineView"); if (obj) { + // stop loading QMetaObject::invokeMethod(obj, "stop"); } } diff --git a/libraries/render-utils/src/AbstractViewStateInterface.h b/libraries/render-utils/src/AbstractViewStateInterface.h index 362c0cc1bf..4570ead9e1 100644 --- a/libraries/render-utils/src/AbstractViewStateInterface.h +++ b/libraries/render-utils/src/AbstractViewStateInterface.h @@ -40,7 +40,9 @@ public: virtual glm::vec3 getAvatarPosition() const = 0; + virtual bool isAboutToQuit() const = 0; virtual void postLambdaEvent(std::function f) = 0; + virtual qreal getDevicePixelRatio() = 0; virtual render::ScenePointer getMain3DScene() = 0;