summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshod Nakashian <ashod.nakashian@collabora.co.uk>2024-01-31 05:53:56 -0500
committerMiklos Vajna <vmiklos@collabora.com>2024-02-02 13:26:16 +0100
commit7a3e9c66baff8554d1267bc98c9c69e763bc8bdc (patch)
tree1062a37ee38786293051c7693ccc8617e7b2c0f7
parent332faa63407305852f5044e4bbc41302ccfe46cd (diff)
sw: do not redline ContentControl items
When we redline the ContentControl item itself, we break docx XML. Instead, we only need to redline the placeholder, which we already do. This simply disables redlining when inserting the ContentControl item while leaving it otherwise enabled while inserting the placeholder. Before: <w:body> <w:p> <w:pPr> <w:pStyle w:val="Normal"/> <w:rPr></w:rPr> </w:pPr> ==> <w:ins w:id="-1" w:author="Unknown Author" w:date="2024-01-24T19:43:08Z"> <w:sdt> <w:sdtPr> <w12:checkbox> <w12:checked w14:val="0"/> <w12:checkedState w14:val="2612"/> <w12:uncheckedState w14:val="2610"/> </w12:checkbox> </w:sdtPr> <w:sdtContent> <w:r> <w:rPr></w:rPr> </w:r> ==> </w:ins> ==> <w:ins w:id="0" w:author="Unknown Author" w:date="2024-01-24T19:43:08Z"> <w:r> <w:rPr></w:rPr> <w:t>☐</w:t> </w:r> ==> </w:ins> <w:r> <w:rPr></w:rPr> </w:r> </w:sdtContent> </w:sdt> </w:p> </w:body> The first <w:ins> and its closing tag is not seen in the reference docx file, and we can see that it's invalid XML here. After: <w:body> <w:p> <w:pPr> <w:pStyle w:val="Normal"/> <w:rPr></w:rPr> </w:pPr> <w:sdt> <w:sdtPr> <w12:checkbox> <w12:checked w14:val="0"/> <w12:checkedState w14:val="2612"/> <w12:uncheckedState w14:val="2610"/> </w12:checkbox> </w:sdtPr> <w:sdtContent> <w:r> <w:rPr></w:rPr> </w:r> ==> <w:ins w:id="0" w:author="Unknown Author" w:date="2024-01-24T19:43:08Z"> <w:r> <w:rPr></w:rPr> <w:t>☐</w:t> </w:r> ==> </w:ins> <w:r> <w:rPr></w:rPr> </w:r> </w:sdtContent> </w:sdt> </w:p> </w:body> Only the valid <w:ins> around the placeholder exists. Signed-off-by: Ashod Nakashian <ashod.nakashian@collabora.co.uk> Change-Id: I1404e41aec3b5efdc2e4115236102ffa2733b15c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162802 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r--oox/qa/unit/export.cxx39
-rw-r--r--sw/source/uibase/wrtsh/wrtsh1.cxx5
2 files changed, 44 insertions, 0 deletions
diff --git a/oox/qa/unit/export.cxx b/oox/qa/unit/export.cxx
index aa9690efdb4a..4ad6dce4e288 100644
--- a/oox/qa/unit/export.cxx
+++ b/oox/qa/unit/export.cxx
@@ -70,6 +70,45 @@ CPPUNIT_TEST_FIXTURE(Test, testRotatedShapePosition)
assertXPath(pXmlDoc, "//wpg:wgp/wps:wsp[1]/wps:spPr/a:xfrm/a:off"_ostr, "y"_ostr, "469440");
}
+CPPUNIT_TEST_FIXTURE(Test, testInsertCheckboxContentControlOdt)
+{
+ loadFromFile(u"tdf141786_RotatedShapeInGroup.odt");
+
+ dispatchCommand(mxComponent, ".uno:TrackChanges", {});
+ dispatchCommand(mxComponent, ".uno:InsertCheckboxContentControl", {});
+
+ save("Office Open XML Text");
+ // validate(maTempFile.GetFileName(), test::OOXML); // Enable when unrelated errors are fixed.
+}
+
+CPPUNIT_TEST_FIXTURE(Test, testInsertCheckboxContentControlDocx)
+{
+ {
+ loadFromFile(u"dml-groupshape-polygon.docx");
+
+ // Without TrackChanges, inserting the Checkbox works just fine
+ // when exporting to docx.
+ dispatchCommand(mxComponent, ".uno:InsertCheckboxContentControl", {});
+
+ save("Office Open XML Text");
+ // validate(maTempFile.GetFileName(), test::OOXML); // Enable when unrelated errors are fixed.
+ }
+
+ {
+ loadFromFile(u"dml-groupshape-polygon.docx");
+
+ // With TrackChanges, the Checkbox causes an assertion in the sax serializer,
+ // in void sax_fastparser::FastSaxSerializer::endFastElement(sal_Int32).
+ // Element == maMarkStack.top()->m_DebugStartedElements.back()
+ // sax/source/tools/fastserializer.cxx#402
+ dispatchCommand(mxComponent, ".uno:TrackChanges", {});
+ dispatchCommand(mxComponent, ".uno:InsertCheckboxContentControl", {});
+
+ save("Office Open XML Text");
+ // validate(maTempFile.GetFileName(), test::OOXML); // Enable when unrelated errors are fixed.
+ }
+}
+
CPPUNIT_TEST_FIXTURE(Test, testDmlGroupshapePolygon)
{
// Given a document with a group shape, containing a single polygon child shape:
diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx
index 4b2402fc93c8..0054eca4cb34 100644
--- a/sw/source/uibase/wrtsh/wrtsh1.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh1.cxx
@@ -115,6 +115,7 @@
#include <frmtool.hxx>
#include <viewopt.hxx>
+#include <IDocumentRedlineAccess.hxx>
#include <IDocumentUndoRedo.hxx>
#include <UndoInsert.hxx>
#include <UndoCore.hxx>
@@ -1177,8 +1178,12 @@ void SwWrtShell::InsertContentControl(SwContentControlType eType)
Left(SwCursorSkipMode::Chars, /*bSelect=*/true, aPlaceholder.getLength(),
/*bBasicCall=*/false);
}
+
+ const RedlineFlags oldRedlineFlags = getIDocumentRedlineAccess().GetRedlineFlags();
+ getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::Ignore);
SwFormatContentControl aContentControl(pContentControl, RES_TXTATR_CONTENTCONTROL);
SetAttrItem(aContentControl);
+ getIDocumentRedlineAccess().SetRedlineFlags(oldRedlineFlags);
}
// Insert footnote