From 33b246b9daeb3e6435d694cc97931306e29b1544 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 11 Jun 2025 17:26:12 +0300 Subject: [PATCH] Fix bug 75176 --- DesktopEditor/doctrenderer/docbuilder_p.cpp | 1 + .../doctrenderer/embed/NativeBuilderDocumentEmbed.h | 2 +- .../doctrenderer/embed/NativeBuilderEmbed.cpp | 1 + DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h | 2 +- DesktopEditor/doctrenderer/js_internal/js_base.cpp | 11 +++++++++++ DesktopEditor/doctrenderer/js_internal/js_base.h | 8 ++++++++ 6 files changed, 23 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder_p.cpp b/DesktopEditor/doctrenderer/docbuilder_p.cpp index 326b7feb2e..5839d377b8 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.cpp +++ b/DesktopEditor/doctrenderer/docbuilder_p.cpp @@ -74,6 +74,7 @@ CV8RealTimeWorker::CV8RealTimeWorker(NSDoctRenderer::CDocBuilder* pBuilder, cons global->set("native", oNativeCtrl); CBuilderEmbed* pBuilderJSNative = static_cast(oBuilderJS->getNative()); + pBuilderJSNative->SetExternalize(true); pBuilderJSNative->m_pBuilder = pBuilder; } CV8RealTimeWorker::~CV8RealTimeWorker() diff --git a/DesktopEditor/doctrenderer/embed/NativeBuilderDocumentEmbed.h b/DesktopEditor/doctrenderer/embed/NativeBuilderDocumentEmbed.h index ab06cada81..f547004a31 100644 --- a/DesktopEditor/doctrenderer/embed/NativeBuilderDocumentEmbed.h +++ b/DesktopEditor/doctrenderer/embed/NativeBuilderDocumentEmbed.h @@ -45,7 +45,7 @@ public: public: CBuilderDocumentEmbed() : m_pBuilder(NULL), m_bIsValid(false) {} - ~CBuilderDocumentEmbed() { if(m_pBuilder) RELEASEOBJECT(m_pBuilder); } + ~CBuilderDocumentEmbed() { if(m_pBuilder && !m_isExternalize) RELEASEOBJECT(m_pBuilder); } virtual void* getObject() { return (void*)m_pBuilder; } NSDoctRenderer::CDocBuilder_Private* GetPrivate(NSDoctRenderer::CDocBuilder* pBuilder) { return pBuilder->GetPrivate(); } diff --git a/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.cpp b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.cpp index dcdeab51ae..9041f8ffd2 100644 --- a/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.cpp @@ -88,6 +88,7 @@ JSSmart CBuilderEmbed::OpenTmpFile(JSSmart path, JSSmart oBuilderTmpDoc = CJSContext::createEmbedObject("CBuilderDocumentEmbed"); CBuilderDocumentEmbed* pBuilderTmpDocNative = static_cast(oBuilderTmpDoc->getNative()); pBuilderTmpDocNative->m_pBuilder = m_pBuilder; + pBuilderTmpDocNative->SetExternalize(true); pBuilderTmpDocNative->_OpenFile(sPath, sParams); return oBuilderTmpDoc->toValue(); } diff --git a/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h index 62625747d9..445a8278c4 100644 --- a/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h +++ b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h @@ -47,7 +47,7 @@ public: NSDoctRenderer::CDocBuilder* m_pBuilder; CBuilderEmbed() : m_pBuilder(NULL) {} - ~CBuilderEmbed() { if(m_pBuilder) RELEASEOBJECT(m_pBuilder); } + ~CBuilderEmbed() { if(m_pBuilder && !m_isExternalize) RELEASEOBJECT(m_pBuilder); } virtual void* getObject() { return (void*)m_pBuilder; } NSDoctRenderer::CDocBuilder_Private* GetPrivate() { return m_pBuilder->GetPrivate(); } diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.cpp b/DesktopEditor/doctrenderer/js_internal/js_base.cpp index 7df327b703..53bf200722 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base.cpp +++ b/DesktopEditor/doctrenderer/js_internal/js_base.cpp @@ -31,6 +31,7 @@ namespace NSJSBase { { embed_native_internal = nullptr; m_pAdapter = nullptr; + m_isExternalize = false; } CJSEmbedObject::~CJSEmbedObject() @@ -44,6 +45,16 @@ namespace NSJSBase { return nullptr; } + void CJSEmbedObject::SetExternalize(const bool& isExternalize) + { + m_isExternalize = isExternalize; + } + + bool CJSEmbedObject::GetExternalize() + { + return m_isExternalize; + } + CJSEmbedObjectAdapterBase* CJSEmbedObject::getAdapter() { return nullptr; diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.h b/DesktopEditor/doctrenderer/js_internal/js_base.h index 85bb23b6ae..c9d3fc7ead 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base.h +++ b/DesktopEditor/doctrenderer/js_internal/js_base.h @@ -194,10 +194,18 @@ namespace NSJSBase */ virtual CJSEmbedObjectAdapterBase* getAdapter(); + /** + * Use the externalize flag if you are monitoring the object's destruction yourself. + */ + virtual void SetExternalize(const bool& isExternalize = true); + virtual bool GetExternalize(); + protected: CJSEmbedObjectPrivateBase* embed_native_internal; CJSEmbedObjectAdapterBase* m_pAdapter; + bool m_isExternalize; + friend class CJSEmbedObjectPrivateBase; friend class CJSEmbedObjectPrivate; };