sw/CppunitTest_sw_core_layout.mk | 1 sw/qa/core/layout/data/sorted-objs-insert.docx |binary sw/qa/core/layout/sortedobjs.cxx | 35 +++++++++++++++++++++++++ sw/source/core/layout/sortedobjs.cxx | 6 ++++ 4 files changed, 42 insertions(+)
New commits: commit d530651e4e70febb1046727e85a8edcda610d722 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Mon Oct 9 08:59:48 2023 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Mon Oct 9 10:35:10 2023 +0200 crashtesting: fix PDF export of fdo45193-1.docx This started with commit 1d3d2a995239c3c71432006cb795324c56a0412a (tdf#148687 tdf#149173 tdf#149546 sw: fix crash with textboxes, 2022-06-20), the trouble is that once anchored objects are inserted to the anchored object list of a layout frame, the list has to be re-sorted if something that influences the sort key changes. Normally the way to do this is similar to commit 0a6a151c4b7c78a363fb64598fbda39db4f42d07 (Related: tdf#70062 keep drawing anchor objects sorted, 2015-02-11), but here the problematic call is SetFormatAttr(SwFormatAnchor(...)) in SwTextBoxHelper::changeAnchor(), and we don't have a layout by the time that happens, so using UpdateObjInSortedList() is not something we can do. In any case looks like no proper fix is coming for this soon, so at least fix it up so we don't try to do binary search on a vector that's not yet sorted. This also seems to help 3 other documents from crashtesting, and also the tdf#157571 bugdoc (related to sw floattable), which is why I started looking at this in the first place. Change-Id: I9b532a39f6c28604304fa9bbecf9faf9842739a1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157691 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins diff --git a/sw/CppunitTest_sw_core_layout.mk b/sw/CppunitTest_sw_core_layout.mk index 82f7dc87e695..8cc670abf64d 100644 --- a/sw/CppunitTest_sw_core_layout.mk +++ b/sw/CppunitTest_sw_core_layout.mk @@ -19,6 +19,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,sw_core_layout, \ sw/qa/core/layout/layact \ sw/qa/core/layout/layout \ sw/qa/core/layout/paintfrm \ + sw/qa/core/layout/sortedobjs \ sw/qa/core/layout/tabfrm \ )) diff --git a/sw/qa/core/layout/data/sorted-objs-insert.docx b/sw/qa/core/layout/data/sorted-objs-insert.docx new file mode 100644 index 000000000000..4041ab986891 Binary files /dev/null and b/sw/qa/core/layout/data/sorted-objs-insert.docx differ diff --git a/sw/qa/core/layout/sortedobjs.cxx b/sw/qa/core/layout/sortedobjs.cxx new file mode 100644 index 000000000000..471dd48a8b0c --- /dev/null +++ b/sw/qa/core/layout/sortedobjs.cxx @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <swmodeltestbase.hxx> + +namespace +{ +/// Covers sw/source/core/layout/sortedobjs.cxx fixes. +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/core/layout/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testSortedObjsInsert) +{ + // Given a document with two anchored objects, one is a fly frame in the header and the other is + // a group shape where one inner shape has an associated fly frame: + // When importing that document: + // Then make sure that we don't try to do binary search on an unsorted container that leads to a + // crash in debug builds: + createSwDoc("sorted-objs-insert.docx"); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/layout/sortedobjs.cxx b/sw/source/core/layout/sortedobjs.cxx index da388bd3cbc9..ce581bb663ef 100644 --- a/sw/source/core/layout/sortedobjs.cxx +++ b/sw/source/core/layout/sortedobjs.cxx @@ -207,6 +207,12 @@ bool SwSortedObjs::is_sorted() const bool SwSortedObjs::Insert( SwAnchoredObject& _rAnchoredObj ) { + if (!is_sorted()) + { + SAL_WARN("sw.core", "SwSortedObjs::Insert: object list is not sorted"); + UpdateAll(); + } + // #i51941# if ( Contains( _rAnchoredObj ) ) {