sw/qa/core/data/html/pass/ofz40593-1.html |binary sw/source/filter/html/htmltab.cxx | 32 +++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-)
New commits: commit 2f01faaf88b6d172d7293f0c9e2a061d99b8ceb5 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Nov 1 17:34:23 2021 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Tue Nov 2 17:41:51 2021 +0100 ofz#40593 remove Objects from m_xResizeDrawObjects if deleted during parse Change-Id: I11fa665175ef067a36f4822676c02d4df1e1e250 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124563 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/qa/core/data/html/pass/ofz40593-1.html b/sw/qa/core/data/html/pass/ofz40593-1.html new file mode 100644 index 000000000000..43510d5d00b2 Binary files /dev/null and b/sw/qa/core/data/html/pass/ofz40593-1.html differ diff --git a/sw/source/filter/html/htmltab.cxx b/sw/source/filter/html/htmltab.cxx index 7f39463b0fd6..7407988ce640 100644 --- a/sw/source/filter/html/htmltab.cxx +++ b/sw/source/filter/html/htmltab.cxx @@ -34,6 +34,7 @@ #include <svtools/htmlkywd.hxx> #include <svl/numformat.hxx> #include <svl/urihelper.hxx> +#include <svx/sdrobjectuser.hxx> #include <sal/log.hxx> #include <osl/diagnose.h> @@ -380,7 +381,7 @@ public: // HTML table typedef std::vector<SdrObject *> SdrObjects; -class HTMLTable +class HTMLTable : public sdr::ObjectUser { OUString m_aId; OUString m_aStyle; @@ -528,6 +529,8 @@ private: sal_uInt16 GetBorderWidth( const SvxBorderLine& rBLine, bool bWithDistance=false ) const; + virtual void ObjectInDestruction(const SdrObject& rObject) override; + public: bool m_bFirstCell; // is there a cell created already? @@ -537,7 +540,7 @@ public: bool bHasToFly, const HTMLTableOptions& rOptions); - ~HTMLTable(); + virtual ~HTMLTable(); // Identifying of a cell const HTMLTableCell& GetCell(sal_uInt16 nRow, sal_uInt16 nCell) const; @@ -1071,11 +1074,33 @@ bool SwHTMLParser::IsReqIF() const return m_bReqIF; } +// if any m_xResizeDrawObjects members are deleted during parse, remove them +// from m_xResizeDrawObjects and m_xDrawObjectPercentWidths +void HTMLTable::ObjectInDestruction(const SdrObject& rObject) +{ + auto it = std::find(m_xResizeDrawObjects->begin(), m_xResizeDrawObjects->end(), &rObject); + assert(it != m_xResizeDrawObjects->end()); + auto nIndex = std::distance(m_xResizeDrawObjects->begin(), it); + m_xResizeDrawObjects->erase(it); + auto otherit = m_xDrawObjectPercentWidths->begin() + nIndex * 3; + m_xDrawObjectPercentWidths->erase(otherit, otherit + 3); +} + HTMLTable::~HTMLTable() { m_pParser->DeregisterHTMLTable(this); - m_xResizeDrawObjects.reset(); + if (m_xResizeDrawObjects) + { + size_t nCount = m_xResizeDrawObjects->size(); + for (size_t i = 0; i < nCount; ++i) + { + SdrObject *pObj = (*m_xResizeDrawObjects)[i]; + pObj->RemoveObjectUser(*this); + m_xResizeDrawObjects.reset(); + } + } + m_xDrawObjectPercentWidths.reset(); m_pContext.reset(); @@ -2477,6 +2502,7 @@ void HTMLTable::RegisterDrawObject( SdrObject *pObj, sal_uInt8 nPercentWidth ) if( !m_xResizeDrawObjects ) m_xResizeDrawObjects.emplace(); m_xResizeDrawObjects->push_back( pObj ); + pObj->AddObjectUser(*this); if( !m_xDrawObjectPercentWidths ) m_xDrawObjectPercentWidths.emplace();