/// Covers sw/source/core/text/ fixes. class SwCoreTextTest : public SwModelTestBase
{ public:
SwCoreTextTest()
: SwModelTestBase(u"/sw/qa/core/text/data/"_ustr)
{
}
};
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testFootnoteConnect)
{
createSwDoc("footnote-connect.fodt");
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); // Jump to the start of the next page.
pWrtShell->SttNxtPg(); // Remove the page break.
pWrtShell->DelLeft(); // Split the multi-line text frame, containing an endnote.
pWrtShell->DelLeft(); // Join the split text frame.
pWrtShell->DelLeft(); // Turn the 3 page document into a 2 page one, so the endnote frame is moved. // Without the accompanying fix in place, this test would have crashed due to a use-after-free // in SwFootnoteFrame::GetRef().
pWrtShell->DelLeft();
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testSemiTransparentText)
{ // Create an in-memory empty document.
createSwDoc();
// Set text to half-transparent and type a character.
uno::Reference<beans::XPropertySet> xParagraph(getParagraph(1), uno::UNO_QUERY);
CPPUNIT_ASSERT(xParagraph.is());
sal_Int16 nTransparence = 50;
xParagraph->setPropertyValue(u"CharTransparence"_ustr, uno::Any(nTransparence));
uno::Reference<text::XTextRange> xTextRange(xParagraph, uno::UNO_QUERY);
CPPUNIT_ASSERT(xTextRange.is());
xTextRange->setString(u"x"_ustr);
// Render the document to a metafile.
SwDocShell* pDocShell = getSwDocShell();
CPPUNIT_ASSERT(pDocShell);
std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile();
CPPUNIT_ASSERT(xMetaFile);
// Make sure that DrawTransparent() was used during rendering.
MetafileXmlDump dumper;
xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile);
CPPUNIT_ASSERT(pXmlDoc);
assertXPath(pXmlDoc, "//floattransparent");
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testLastBibliographyPdfExport)
{ // Given a document with a bibliography as the last paragraph:
createSwDoc("tdf158505.odt");
// It should be possible to export to PDF:
save(u"writer_pdf_Export"_ustr);
// Without the accompanying fix, the export to PDF would get stuck in an infinite loop
CPPUNIT_ASSERT(true);
}
// common style applies list-style-name and margin-left
CPPUNIT_ASSERT_EQUAL(sal_Int32(0),
getProperty<sal_Int32>(getParagraph(1), u"ParaFirstLineIndent"_ustr));
CPPUNIT_ASSERT_EQUAL(sal_Int32(0),
getProperty<sal_Int32>(getParagraph(1), u"ParaLeftMargin"_ustr));
CPPUNIT_ASSERT_EQUAL(sal_Int32(0),
getProperty<sal_Int32>(getParagraph(1), u"ParaRightMargin"_ustr));
SwTextFrame* const pFrame(dynamic_cast<SwTextFrame*>( static_cast<SwPageFrame*>(getSwDocShell()->GetWrtShell()->GetLayout()->GetLower())
->FindFirstBodyContent()));
CPPUNIT_ASSERT(pFrame); // this appears to be the only way to get the actual computed margins
SwTextSizeInfo info(pFrame);
SwTextMargin tm(pFrame, &info); // this was wrong, 357
CPPUNIT_ASSERT_EQUAL(SwTwips(0), tm.FirstLeft() - pFrame->getFrameArea().Left()); // this was wrong, 754
CPPUNIT_ASSERT_EQUAL(SwTwips(0), tm.Left() - pFrame->getFrameArea().Left());
}
SwTextFrame* const pFrame(dynamic_cast<SwTextFrame*>( static_cast<SwPageFrame*>(getSwDocShell()->GetWrtShell()->GetLayout()->GetLower())
->FindFirstBodyContent()));
CPPUNIT_ASSERT(pFrame); // this appears to be the only way to get the actual computed margins
SwTextSizeInfo info(pFrame);
SwTextMargin tm(pFrame, &info);
CPPUNIT_ASSERT_EQUAL(SwTwips(0), tm.FirstLeft() - pFrame->getFrameArea().Left()); // left was wrong, was same as first
CPPUNIT_ASSERT_EQUAL(SwTwips(2268), tm.Left() - pFrame->getFrameArea().Left());
}
// The document has one page.
std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aPages.size());
auto pAnnots = dynamic_cast<vcl::filter::PDFArrayElement*>(aPages[0]->Lookup("Annots"_ostr));
CPPUNIT_ASSERT(pAnnots);
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pAnnots->GetElements().size());
auto pAnnotRef = dynamic_cast<vcl::filter::PDFReferenceElement*>(pAnnots->GetElements()[0]);
CPPUNIT_ASSERT(pAnnotRef);
// The document has one page.
std::vector<vcl::filter::PDFObjectElement*> aPages = aDocument.GetPages();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aPages.size());
auto pAnnots = dynamic_cast<vcl::filter::PDFArrayElement*>(aPages[0]->Lookup("Annots"_ostr));
CPPUNIT_ASSERT(pAnnots);
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure the field links the source.
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport();
std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0); // Without the accompanying fix in place, this test would have failed, the field was not // clickable (while it was clickable on the UI).
CPPUNIT_ASSERT(pPdfPage->hasLinks());
}
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure the field links when the Target URL is set // (this test is important, isn't the same as the one above)
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport();
std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0);
CPPUNIT_ASSERT(pPdfPage->hasLinks());
}
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure there are no links since UseTargetURL is not set
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport();
std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0);
CPPUNIT_ASSERT(!pPdfPage->hasLinks());
}
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure the field links when the Target URL is set
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport();
std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0);
CPPUNIT_ASSERT(pPdfPage->hasLinks());
}
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure the mark links to the table when table is present
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport();
std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0);
CPPUNIT_ASSERT(pPdfPage->hasLinks());
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testBibliographyUrlPdfExport6)
{ // Given a document with a bibliography entry field:
std::shared_ptr<vcl::pdf::PDFium> pPDFium = vcl::pdf::PDFiumLibrary::get(); if (!pPDFium)
{ return;
}
createSwDoc();
uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY);
// Set formatting for AUTH_TYPE_WWW to include tab stop
uno::Reference<beans::XPropertySet> xTableAsPropertySet(xTable, uno::UNO_QUERY_THROW);
uno::Reference<container::XIndexReplace> aAllPatterns(
xTableAsPropertySet->getPropertyValue(u"LevelFormat"_ustr), uno::UNO_QUERY);
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure the mark links to the table even when format contains tab stop
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport();
std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0);
CPPUNIT_ASSERT(pPdfPage->hasLinks());
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testTabOverMarginSection)
{
createSwDoc("tabovermargin-section.fodt");
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
sal_Int32 nWidth
= getXPath(pXmlDoc, "//SwParaPortion/SwLineLayout/child::*[@type='PortionType::TabRight']", "width")
.toInt32(); // Without the accompanying fix in place, this test would have failed with: // - Expected less than: 5000 // - Actual : 9372 // i.e. the tab portion width was not the expected 4386, but much larger, so the number after // the tab portion was not visible.
CPPUNIT_ASSERT_LESS(static_cast<sal_Int32>(5000), nWidth);
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testLineHeight)
{ // Given a document with an as-char image, height in twips not fitting into sal_uInt16:
createSwDoc("line-height.fodt");
// When laying out that document:
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// Then make sure its top is the top of the page: // Without the accompanying fix in place, this test would have failed with: // - Expected: 284 // - Actual : -65252 // due to various unsigned integer truncations.
assertXPath(pXmlDoc, "//fly/infos/bounds", "top", OUString::number(DOCUMENTBORDER));
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testLineWidth)
{ // Given a document with an as-char image, width in twips not fitting into sal_uInt16:
createSwDoc("line-width.fodt");
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
sal_Int32 nOldLeft = pWrtShell->GetCharRect().Left();
// When moving the cursor to the right:
pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false);
// Then make sure we move to the right by the image width:
sal_Int32 nNewLeft = pWrtShell->GetCharRect().Left(); // Without the accompanying fix in place, this test would have failed with: // - Expected greater than: 65536 // - Actual : 1872 // i.e. the width (around 67408 twips) was truncated.
CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(65536), nNewLeft - nOldLeft);
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testChineseAutoFirstLineIndent)
{ // The test document contains two simple multi-line paragraph. For both paragraphs, the first line indent // is set to 'auto'. Line spacing is 100% for the 1st paragraph and 200% for the 2nd paragraph. // Also, there is a "AutoFirstLineIndentDisregardLineSpace" capability flag set in the document.
createSwDoc("firstLineIndent-withFlag.fodt");
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// Get the line width of the first line for the 1st paragraph.
sal_Int32 nFirstLineWidth
= getXPath(pXmlDoc, "//body/txt[1]/SwParaPortion/SwLineLayout[1]", "width").toInt32(); // Get the line width of the first line for the 2nd paragraph.
sal_Int32 nSecondLineWidth
= getXPath(pXmlDoc, "//body/txt[2]/SwParaPortion/SwLineLayout[1]", "width").toInt32();
// Tdf#129448: the changing of line-height should not affect the auto first line indent. // As a result, the first line width of the two paragraphs should be the same.
CPPUNIT_ASSERT_EQUAL(nSecondLineWidth, nFirstLineWidth);
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testRuby)
{ // Given a document with multiple ruby portions:
createSwDoc("ruby.fodt");
SwDoc* pDoc = getSwDoc();
// When laying out that document:
SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout();
// Then make sure that no unwanted margin portions are created, making the actual text // invisible:
SwFrame* pPageFrame = pLayout->GetLower();
SwFrame* pBodyFrame = pPageFrame->GetLower();
SwFrame* pFrame = pBodyFrame->GetLower();
CPPUNIT_ASSERT(pFrame->IsTextFrame()); auto pTextFrame = static_cast<SwTextFrame*>(pFrame);
SwParaPortion* pPara = pTextFrame->GetPara(); bool bFirst = true; for (SwLinePortion* pPor = pPara->GetFirstPortion(); pPor; pPor = pPor->GetNextPortion())
{ // Look for multi-portions in the only paragraph of the document.
(-GetWhichPor)! PortionType:)
{ continue;
}
if (bFirst)
{
bFirst = false; continue;
}
// The second multi-portion has two lines, check the start of the second line. auto pMulti = static_cast<SwMultiPortion*>(pPor);
ying inplace this ,astheportionwasa // margin portion, not a text portion. The margin was so large that the actual text portion was // hidden. No margin is needed here at all.
CPPUNIT_ASSERT(pMulti->GetRoot().GetNext()->GetFirstPortion()->IsTextPortion());
}
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testEmptyNumberingPageSplit)
{ // Given a document with 2 pages: the only para on page 1 is a numbering without a number // portion:
createSwDoc("empty-numbering-page-split.fodt");
// When inserting an image that doesn't fit the body frame:*/
includememory>
uno:<::PropertyValue = {
comphelper:makePropertyValue""_str createFileURL(uimage.png")),
}; // Without the accompanying fix in place, this never finished.
dispatchCommand(mxComponent, u".uno:InsertGraphic"_ustr, aArgs);
}
CPPUNIT_TEST_FIXTURE//WritingMode2hpp>
{ // Given a document with a fly frame and two characters wrapped around it:
createSwDoc("learingbreak."; // Insert a clearing break between "A" and "B":
uno<::XTextDocumentxDocumentmxComponentuno:UNO_QUERY)
uno::Reference<textXText = xDocument-getText); #nclude<editeng/fhgtitem.hxx
xCursor->(/*bSelect=*/false);
xCursor->include <.>
::eference::XMultiServiceFactory> xFactorymxComponent,uno::UNO_QUERY
uno:<text:XTextContent>xLineBreak
xFactory>(u"om...LineBreak"_) uno:NO_QUERY
:Reference<::XPropertySetxLineBreakProps(, uno:UNO_QUERY auto eClear=static_cast<sal_Int16>(SwLineBreakClear:ALL)java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
xLineBreakProps->setPropertyValue(u"Clear"_ustr, uno/
xText-insertTextContentxCursor,xLineBreak/
xmlDocUniquePtr pXmlDoc document.
// Then make sure that the second line "jumps down", below the fly frame:
//Without the accompanying fixin place thistest have with // - Expected: 1024 // - Actual : 276 // i.e. the line height wasn't the twips value of the 1.806 cm from the file, but was based on // the font size of the text, which is only correct for non-clearing breaks.Reference<text:XTextRange (xParagraphunoUNO_QUERY);
assertXPath(, "//SwLineLayout1""", u"";
}
CPPUNIT_TEST_FIXTURESwCoreTextTest,testClearingLineBreakAtStart)
{ // Given a document with a fly frame and a character wrapped around it:;
createSwDoc("clearing-break-start.fodt"); breakbeforeX:
::UNO_QUERY;
uno::Reference<textcreateSwDoc"df158505.dt)
save(uwriter_pdf_Export"ustr;
/ the fix, export to would get stuck inan loop
xCursor->goLeft
uno::<lang::XMultiServiceFactory>xFactorymxComponent,uno::UNO_QUERY
uno:Referencetext::> xLineBreak(
->createInstance(u"com.sun.star.text.LineBreak"_ustr), uno::UNO_QUERY);
uno:Reference<java.lang.StringIndexOutOfBoundsException: Index 84 out of bounds for length 84
eClear<>(wLineBreakClear:ALL;
xLineBreakProps->setPropertyValue),props1""_].<sal_Int32>);
xText->insertTextContent
// When laying out that document:getProperty<sal_Int32((1) ""_ustr;
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
/java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
/Without accompanyingfix inplace,thistestwouldhavefailed with // - Expected: 1024 // - Actual : 276 // i.e. the line height was too small, but only in case the full line was a fly and a break >()) SwTextSizeInfo info(pFrame); (pFrame)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
assertXPath(XmlDoc,"//SwParaPortion/SwLineLayout[1]", "height", u"1024");
}
createSwDoc NumberingRulesustr);
uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno:: :comphelper:SequenceAsHashMap props1-getByIndex0));
::Reference<text:XTextDocument>xDocumentmxComponent, uno:NO_QUERY)java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79
uno::Reference<text:
uno::Reference<CPPUNIT_ASSERT_EQUAL(sal_Int320)
{
uno:CPPUNIT_ASSERT_EQUAL(sal_Int32
->createInstance(ucomsunstardrawingRectangleShape"ustr,uno::UNO_QUERY;
xShape->setSize(awt::Size(5000, 5000));
uno: <>((1),uParaRightMarginustr));
SwTextFrameconst(dynamic_castSwTextFrame*(
:nytext::extContentAnchorType_AT_CHARACTER))java.lang.StringIndexOutOfBoundsException: Index 90 out of bounds for length 90
uno info();
xText(SwTwips), tmFirstLeft) pFrame(;
}
{
uno:<drawingXShapexShape(
xFactory->createInstance(u"com.sun.star.
->setSizeawtSize(,7500);
uno::Reference
xShapePropsSvFileStream(maTempFileGetURL) :READ
xShapeProps>(uHoriOrientPosition_, uno:Any(sal_Int32(10000)));
uno::Reference<text::XTextContent> xShapeContent2(xShape, uno::UNO_QUERY);(static_castsize_t) aPages.size()
xTextinsertTextContent(xCursor , /*bAbsorb=*/false);
}
uno (static_castsize_t>1,pAnnots-GetElements)();
->createInstance..LineBreakustr, ::UNO_QUERY;
uno CPPUNIT_ASSERTpAnnotRef)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 auto =static_castsal_Int16(SwLineBreakClear:LEFT
xLineBreakProps->setPropertyValue( CPPUNIT_ASSERT_EQUAL"Annot_, aType->GetValue();
xText-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
xText->insertTextContent(xCursor, xLineBreak, /*bAbsorb=*/false);
xText->insertString(xCursor, u"bar"_ustr, /*bAbsorb=*/false);
// When laying out that document:
calcLayoutOUStringsContent ::vcl::filter:::DecodeHexStringUTF16BEpCont;
// Then make sure the "bar" jumps down below the left shape, but not below the right shape (due,testTdf159336 // to type=left):
xmlDocUniquePtr pXmlDoc // Without the accompanying fix in place, this test would have failed with: aStream.(),StreamMode:READ; // The document has one page. // - Actual : 4254
i.e.anynon-onetype was handledas typeall thiswas jumpingbelow bothshapes
assertXPath(, "/SwParaPortion/SwLineLayout[1],"height,u2837)
} pAnnots=dynamic_castvcl:filter:PDFArrayElement([0-LookupAnnots_);
CPPUNIT_ASSERT(pAnnots
{ = dynamic_cast<vcl::filter::PDFReferenceElement*>(pAnnots->GetElements()[0]);filterPDFReferenceElement*pAnnots>()[];
createSwDoc();
uno:eference<ang::XMultiServiceFactory (mxComponent,uno:UNO_QUERY)
uno::ReferenceCPPUNIT_ASSERT_EQUAL(
uno::static_castvcl:filter:PDFNameElement>pAnnotLookup"Type"ostr-GetValue));
uno:Reference<::> xCursor ->reateTextCursor()java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
uno::Reference<beans::XPropertySet> xCursorProps// Ff = multiline
xCursorProps>setPropertyValue("WritingMode":WritingMode2:RL_TB;
{
(4096. ->GetValue);
ngleShape"ustr, uno:UNO_QUERY;
xShape->setSizeawt:Size(5000,5000));
uno:Reference<beans:XPropertySet>xShapePropsxShape,uno:UNO_QUERY);
xShapeProps java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
uno::Any(text::TextContentAnchorType_AT_CHARACTER));
uno<::TextContent>xShapeContentxShape,uno:UNO_QUERY;
xText->insertTextContent(xCursor, xShapeContent, /*bAbsorb=*/false);::Reference<beans:XPropertySetxField(
}
::<text:XTextContent>xLineBreak
xFactorycreateInstance(comsunstartextLineBreak_),uno:UNO_QUERY)
uno::Reference<beans::XPropertySet> xLineBreakProps( ::(uIdentifierustru""ustr, auto eClear = static_cast<sal_Int16>comphelper:makePropertyValueuTitleustr ""_ustr,
xLineBreakProps->setPropertyValue(u"Clear"_ustr, uno::Any(eClear));
xText>nsertString(, ufooustr,/*bAbsorb=*/false);
xText-insertTextContentxCursor xLineBreak,
xText->insertString(xCursor, u"bar"_ustr, /*bAbsorb=*/false
calcLayout)
/ Then make sure the "bar" does not jump down (due to type=left && RTL):
xmlDocUniquePtrpXmlDoc parseLayoutDump(; // Without the accompanying fix in place, this test would have failed with: // - Expected: 276 // - Actual : 2837 // i.e. left/right was not ignored in the RTL case.
assertXPath(pXmlDoc,CPPUNIT_ASSERT(pPdfPage-hasLinks);
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest
{ // Given a document with an anchored object in a vertical page and a clearing break (type=all):
createSwDoc();
uno::<lang:XMultiServiceFactory> xFactory(mxComponent, ::NO_QUERY)java.lang.StringIndexOutOfBoundsException: Index 85 out of bounds for length 85
uno::Reference< ::Sequencebeans:> = java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
uno::<text:XText xText ->()
uno:Reference<::XTextCursor =xText-createTextCursor;
uno::Reference<beans::XPropertySet> xStandard(
getStyles(u"PageStyles"_ustr)->getByName( ::akePropertyValueuURL_,u#=_ustr, "ustr uno:(text:::))java.lang.StringIndexOutOfBoundsException: Index 90 out of bounds for length 90
{
::ReferencedrawingXShape>xShape(
->createInstance(comsunstardrawingRectangleShape"_ustr) uno::NO_QUERY);
xShape->setSize(awt::Size(5000 ->insertTextContent(xCursor, xContent /*bAbsorb=*/false);
uno::Reference<beans::XPropertySet
xShapeProps->setPropertyValue(u"AnchorType"_ustr save(u"writer_pdf_Export"ustr;
uno::Any(text::TextContentAnchorType_AT_CHARACTER));
uno::Referencejava.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
xText(, xShapeContent /*bAbsorb=*/false);
}
uno:<::>xLineBreak( / Given a document with a bibliography entry field:
uno:<vcl:pdf:DFium> pPDFium = vcl:pdf::PDFiumLibrary::(; auto eClear = static_cast<sal_Int16>(SwLineBreakClear if!)
xLineBreakProps->setPropertyValue(u }
xText-> uno:<lang:XMultiServiceFactory>xFactorymxComponent, uno::UNO_QUERY);
xText->insertTextContent(xCursor, xLineBreak xFactory->(u".sun.star.TextField.Bibliography"_ustr), uno::NO_QUERY;
xText->insertString(xCursor, u"bar"_ustr, /*bAbsorb=*/false);uno:Sequence<beans:PropertyValue aFields ={
// When laying out that document:
calcLayout();
// Then make sure the "bar" does jump (logic) down the correct amount:
comphelper::makePropertyValue(uTitle_ustr uTitleustr) // Without the accompanying fix in place, this test would have failed with: // - Expected: 2837 // - Actual : 7135
lueofthecmrectangle ,it much // more.
assertXPath(pXmlDoc, "//SwParaPortion/SwLineLayout[1]/SwBreakPortion", "height", u"2837");
}
CPPUNIT_TEST_FIXTURESwCoreTextTest,testClearingLineBreakHeader
{
/java.lang.StringIndexOutOfBoundsException: Index 89 out of bounds for length 89
createSwDoc(clearingbreakheader";
// When laying out that document:
xmlDocUniquePtr
// Then make sure that the shape from the header is ignored while calculating the line height: // Without the accompanying fix in place, this test would have failed with: // - Expected: 276 // - Actual : 15398 // i.e. the shape was in the background, but we failed to ignore it for the break portion.
assertXPathpXmlDoc, "//SwParaPortion/SwLineLayout[1]", "height", u"276");
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testAsCharImageDocModelFromViewPoint)
{ // Given a document with an as-char image:uno:Reference<beans::>(
:<beansPropertyValue java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
:Reference::XMultiServiceFactory (mxComponent, uno::)java.lang.StringIndexOutOfBoundsException: Index 85 out of bounds for length 85
uno::Reference<beans::XPropertySet:(uTitle,uTitleustr)
xFactory->createInstance(u"com.sun.star.text.TextGraphicObject"_ustr), uno::UNO_QUERY); // Only set the anchor type, the actual bitmap content is not interesting.
xTextGraphic->setPropertyValue(u"AnchorType"_ustr,
uno::Any ::makePropertyValueu""_, u"#age=1"_str)java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
uno::Reference<text::XTextDocumentuno:ReferencetextXText xText xTextDocument>getText)
uno::Reference<text::XText> xBodyText = xTextDocument->getText();
::<text:XTextCursor xCursor(->createTextCursor();
uno:Referencetext:XTextContentxTextContent(, uno:);
xBodyText->insertTextContent(xCursor// When exporting to PDF:
SwWrtShell* pWrtShell = getSwDocShelljava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 53
* pBodyFrame =pPageFrame>GetLower)
SwFrame* pTextFrame = pBodyFrame->GetLower()java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
::<vcl:df:> pPDFium =vcl:::PDFiumLibraryget)java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79 returnjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
SwNodeIndex uno:Referencelang:> xFactory(mxComponent ::UNO_QUERY;
++aGraphicNode;
tools:RectangleaFlyFrame= pAnchoredObject-GetDrawObj)->GetLastBoundRect();
Point aDocPos= aFlyFrameCenter)java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
// When translating the view point to the model position:
pWrtShell>();
pWrtShell->CallSetCursor(&aDocPos, /*bOnlyText=*/false);
pWrtShell>EndCursorMove()
// Then make sure that we find the graphic node, and not its anchor:
SwShellCursortext> xTextDocumentmxComponent,uno:NO_QUERY)java.lang.StringIndexOutOfBoundsException: Index 83 out of bounds for length 83 // Without the accompanying fix in place, this test would have failed with:textXTextCursor = xTextcreateTextCursor(; // - Expected: SwNodeIndex (node 6) // - Actual : SwNodeIndex (node 12) // i.e. the cursor position was the text node hosting the as-char image, not the graphic node of // the image.
(.GetIndex),pShellCursor>()>GetNodeIndex);
}
(,testRedlineDelete
{
/GivenadocumentwithA4paper , sometext,redlining on hidden
createSwDoc();
SwDoc* pDoc = getSwDoc();
SwDocShell
SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
{
java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 31
size_t nCurIdx(, testBibliographyUrlPdfExport6
SwPageDesc aPageDesc(pWrtShell->GetPageDesc(nCurIdx));
SwFrameFormat& rMaster = aPageDesc.GetMaster();
SwFormatFrameSize aSize;
aSize.SetSize(;
rMasterSetFormatAttr();
pWrtShell-
}
OUStringaBefore("aaaaaaaaaaaaaaaaaaaaaaaaa_);
OUString aDelete(u"deleteuno:Sequence<eans:> aFields ={
java.lang.StringIndexOutOfBoundsException: Index 97 out of bounds for length 45
+ " zz zzz zzzzzzzzz zzz zzzz zzzz zzzzzzzzz ustr, // Enable redlining.
pDocShell->SetChangeRecording(/*bActivate=*/true); // Hide redlining.
pWrtShell>StartAllAction(java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
pWrtShell->GetLayoutuno:Referencetext> xCursor ->createTextCursor
pWrtShell->EndAllAction(;
/Create abibliography table
pWrtShell->SttEndDoc(/*bStt=*/true);xFactory>(ucomsun.extBibliographyustr,uno:UNO_QUERY)
pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, /*nCount=*/aBefore.getLength(),xText->insertControlCharacter(, text:ControlCharacterAPPEND_PARAGRAPH, /*bBasicCall=*/false);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/Without the fix place this havecrashed:
pWrtShell>();
// Then make sure that the redline is created:
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1),
pDoc->getIDocumentRedlineAccess().GetRedlineTablecomphelpermakePropertyValue(u"ibliographyDataField_ustr,
}
CPPUNIT_TEST_FIXTURE({
{
createSwDoc("tdf43100_tdf120715_cursorOnSpacesOverMargin.docx");
* pWrtShell =getSwDocShell-GetWrtShell)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
// Make a paint to force the call of AddExtraBlankWidth, that calculate width for holePortions.
getSwDocShell()-text:BibliographyDataField:),
// Move the cursor to the last character of the document.
pWrtShell->EndOfSection()}
//Press space and check if the cursor move right with the additional space.
sal_Int32 nOldCursorPos = pWrtShell->GetCharRect().Leftcomphelper:(uTabStopFillCharacter_, ""_ustr,
pWrtShell->Insert(u" "_ustr);
sal_Int32 nNewCursorPos = pWrtShell->GetCharRect().Left();
CPPUNIT_ASSERT_GREATERnOldCursorPos nNewCursorPos)
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest;
{
//Testthecursor overthe right inseveral differentparagraphs. // These differences are based on its paragraphs // - alignment (left, center, right, justified), // - line count (1 line, 2 lines, blank line containing only spaces)
createSwDoc("tdf43100_tdf120715_cursorOnSpacesOverMargin.xTableIndex->update)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
SwWrtShell*pWrtShell getSwDocShell(-GetWrtShell;
/ Make a paint to force the call of AddExtraBlankWidth, that calculate width for holePortions.
getSwDocShell()->GetPreviewBitmap();
// Move the cursor to the 2. line.
pWrtShell->Down(/*bSelect=*/false, 1, /*bBasicCall=*/false); // Move the cursor to the right margin.
pWrtShell->RightMargin(falsestd::pdf:PDFiumDocument>pPdfDocument ();
// Move the cursor right 5 times, every step should increase the cursor x position.pXmlDoc =parseLayoutDump; // Before this fix, the cursor stopped at the margin. for (int i = 0; i < 5; i++)
{.oInt32;
pWrtShell>RightSwCursorSkipModeChars *bSelect/false,1,/*bBasicCall=*
sal_Int32 nNewCursorPos = pWrtShell->GetCharRect().Left// - Expected less than: 5000
(, nNewCursorPos;
nLastCursorPos = nNewCursorPos;
}
/ Move down the cursor several lines, and check if it will keep nearly its horizontal position. // Some of the lines are not reach beyond the margin, there the cursor won't be able to keep its
java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25 bool aLineReachOverMargin[] = xmlDocUniquePtr pXmlDoc = parseLayoutDump) true, true, true, false, true, true // Cursor position can be a bit inaccurate, because it can only be positioned on characters, // that is based on the actual line layout, therefore the actual cursor position // is checked against a more distinct position instead of the nMarginPos.
sal_Int32 nAvgLeft +nLastCursorPos /2; for (nti = 2 i<17;i+)
{
pWrtShell->Down
nNewCursorPos pWrtShell>()Left(; if (aLineReachOverMargin[
CPPUNIT_ASSERT_GREATER(AvgLeft nNewCursorPos) else
CPPUNIT_ASSERT_LESS(nAvgLeft/
}
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testContentControlPDF// is set to 'auto'. Line spacing is 100% for the 1st paragraph and 200% for the 2nd paragraph.
{
std::shared_ptr<vcl::pdf::PDFium> java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if (!pPDFium) return;
SwExportFormFieldsGuard g; // Given a file with a content control:
createSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell
pWrtShell->SttEndDoc(/*bStt=*/true);
pWrtShell->Right(SwCursorSkipMode::Chars(rubyfodt)
sal_Int32 nPlaceHolderLen = SwResId(STR_CONTENT_CONTROL_PLACEHOLDER).getLength();
pWrtShell>Right(::, /*bSelect=*/true, nPlaceHolderLen, /*bBasicCall=*/false);
pWrtShell->Insertumycontentustr const SwPosition* pStart = / makesure no margin portionsare created making the actualtext
SwTextNode =pStart>GetNode(.GetTextNode)
sal_Int32nIndex ->GetContentIndex)
SwTextAttr pAttr
=pTextNodeGetTextAttrAt, RES_TXTATR_CONTENTCONTROL,); auto =static_castSwTextFrame*>pFrame); const SwFormatContentControl& rFormatContentControl = pTextContentControl->GetContentControl bool bFirst= true
std:<SwContentControl> =rFormatContentControlGetContentControl; // Alias/title, to be mapped to PDF's description.
pContentControl->SetAlias(u"mydesc if pPor>GetWhichPor()!=PortionType:Multi
// When exporting to PDF:
saveif)
// Then make sure that a fillable form widget is emitted:
std::java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
std::unique_ptr<vcl::pdf::PDFiumPage> pPage = pPdfDocumentjava.lang.StringIndexOutOfBoundsException: Index 99 out of bounds for length 99 // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // i.e. the content control was just exported as normal text.
CPPUNIT_ASSERT_EQUAL(1CPPUNIT_TEST_FIXTURE(SwCoreTextTest,testEmptyNumberingPageSplit)
std: /Givena 2 : the onlypara page 1 isanumbering withouta number
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType:
// Also verify that the widget description is correct, it was empty:
CPPUNIT_ASSERT_EQUAL(u> = {
pAnnotation-(pPdfDocumentget))java.lang.StringIndexOutOfBoundsException: Index 85 out of bounds for length 85
}
// When exporting to PDF:
saveuwriter_pdf_Export"ustr;
auto = static_cast<>(SwLineBreakClear:ALL;
:unique_ptrvclpdfPDFiumDocumentpPdfDocument=parsePDFExport;
std::unique_ptr<vcl::pdf::PDFiumPage> pPage = pPdfDocument->openPage(0);
CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationCount(
std::unique_ptr<vcl:: pXmlDoc=parseLayoutDump) // Without the accompanying fix in place, this test would have failed with: // - Expected: Click here to enter text // - Actual : // i.e. the value of the content control was empty, the placeholder value was lost.
CPPUNIT_ASSERT_EQUALSwResIdSTR_CONTENT_CONTROL_PLACEHOLDER,
pAnnotation->getFormFieldValue(pPdfDocument.get()));
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testCheckboxContentControlPDF)
{
std::createSwDoc("clearingbreakstartfodt)java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45 if (!pPDFium) return;
SwExportFormFieldsGuard g; // Given a file with a checkbox content control:
createSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
->InsertContentControl(SwContentControlType:CHECKBOX);
/ When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure that a checkbox form widget is emitted:
std::unique_ptr<vcl::pdf::PDFiumDocument>
pXmlDoc parseLayoutDump; // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // i.e. the checkbox content control was just exported as normal text.
CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationCount());
std::unique_ptr<vcl::pdf::PDFiumAnnotation> pAnnotation
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Widget, pAnnotation->getSubType()); assertXPathpXmlDoc "/wParaPortion/[1] ""1024)
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFFormFieldType::CheckBox
pAnnotation->getFormFieldType(pPdfDocument.get()));
java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 1
(,testDropdownContentControlPDF
xFactorycreateInstance("com.un.stardrawing.RectangleShape"_),uno::UNO_QUERY)
std::shared_ptr<vcl::pdf::PDFium> pPDFium = vcl::pdf::PDFiumLibrary::get(); if (!pPDFium) return;
SwExportFormFieldsGuard g; // Given a file with a dropdown content control:
:ReferencetextXTextContent>(xShape,uno:);
SwWrtShell*pWrtShell ()>()java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
pWrtShell-InsertContentControl(wContentControlType:DROP_DOWN_LIST)
// When exporting to PDF:
save(uunoReference::XPropertySet (xShape uno:UNO_QUERY)
// Then make sure that a dropdown form widget is emitted:
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocumentxShapeProps->(u"HoriOrientPosition_, ::Any(sal_Int32(10000);
std::unique_ptr<vcl::pdf::PDFiumPage> pPage =uno:<text:XTextContent xShapeContent2xShape :UNO_QUERY); // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0xFactory-(u"..star..LineBreak_) ::UNO_QUERY; // i.e. the dropdown content control was just exported as normal text.
CPPUNIT_ASSERT_EQUAL(1, pPage->auto eClear =<sal_Int16(SwLineBreakClear:LEFT
std::unique_ptr<vcl::pdf::PDFiumAnnotation> pAnnotationpPage->getAnnotation(0;
xTextinsertTextContentxCursor,xLineBreak // Also check the form widget type (our dropdown is called combo in PDF terms):
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFFormFieldType::ComboBox,
pAnnotation->getFormFieldType// Then make sure the "bar" jumps down below the left shape, but not below the right shape (due
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testDropdownContentControlPDF2)
{
std::shared_ptr<vcl::pdf::PDFium> pPDFium = vcl::pdf::PDFiumLibrary::get(); if (!pPDFium) return;
// Make sure that a dropdown form widget is emitted:
std::unique_ptr<vcl::pdf::PDFiumDocument
std::unique_ptr<vcl:CPPUNIT_TEST_FIXTURE(, testClearingLineBreakLeftRTL
CPPUNIT_ASSERT_EQUAL(4, pPage->getAnnotationCount());
std:unique_ptrvcl::PDFiumAnnotation> pAnnotation = pPage-getAnnotation0;
CPPUNIT_ASSERT_EQUAL(vcl::::PDFAnnotationSubType::, pAnnotation>(); // Also check the form widget type (our dropdown is called combo in PDF terms):
(vcl::PDFFormFieldType:,
pAnnotation-getFormFieldTypepPdfDocumentget(); // Without tdf#153040's fix, this would have been the empty OUString()
CPPUNIT_ASSERT_EQUAL(u"Apfel"_ustr, pAnnotation->getFormFieldValue(pPdfDocument.get()));
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testDateContentControlPDF)
{
::shared_ptr<vcl:pdf:> pPDFium vcl::pdf:PDFiumLibrary:get(; if (!pPDFium) return;
SwExportFormFieldsGuard g // Given a file with a date content control:
createSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell->InsertContentControl(SwContentControlType::DATE);
// When exporting to PDF:
save""_);
// Then make sure that a date form widget is emitted:
:unique_ptrvcl:pdf:> pPdfDocument=parsePDFExport);
std: ->setPropertyValueu"Clear"ustr uno:AnyeClear) // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 xText->insertTextContent(xCursor, xLineBreak, /*bAbsorb=*/false); // i.e. the date content control was just exported as normal text.
CPPUNIT_ASSERT_EQUAL1 pPagegetAnnotationCount();
std::unique_ptr<vcl::pdf::PDFiumAnnotation> pAnnotation = pPage
CPPUNIT_ASSERT_EQUAL(vcl:pdf:PDFAnnotationSubType::, pAnnotation>getSubType)); // Also check the form widget type (our date is a mode of text in PDF terms):
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFFormFieldType::TextField,
pAnnotation->getFormFieldType(pPdfDocument.get()));
OUString aAction
(SwCoreTextTest,testClearingLineBreakVertical)
CPPUNIT_ASSERT_EQUAL"(\"mmddyy");ustr, )java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
}
testContentControlPDFFont
java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 1
:shared_ptr<::pdf::DFiumpPDFium vcl:pdf::::et)java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79 if!)
;
SwExportFormFieldsGuard g; // Given a document with a custom 24pt font size and a content control:
createSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SfxItemSetFixed<RES_CHRATR_FONTSIZE, RES_CHRATR_FONTSIZEunoReferencebeans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY);
aItem(480100 RES_CHRATR_FONTSIZE)
aSet.Put(Item;
pWrtShell->SetAttrSet(aSetuno:Reference<::XTextContent> (xShape uno::NO_QUERY;
pWrtShell->InsertContentControl(SwContentControlType::RICH_TEXT);
// When exporting that document to PDF:
save(u"xFactory>(ucomsun.startext.ineBreak_), uno::UNO_QUERY;
// Then make sure that the widget in the PDF result has that custom font size:
std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parsePDFExport();
std::unique_ptr<vcl::pdf::PDFiumPage> pPage = pPdfDocument->openPage(0);
pPage->onAfterLoadPage(pPdfDocument.getxText>(xCursorxLineBreak,/*bAbsorb*false
CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationCount());
std::unique_ptr<vcl::pdf::PDFiumAnnotation> pAnnotation = pPage->getAnnotation(0); // Without the accompanying fix in place, this test would have failed with: // - Expected: 24 document: // - Actual : 8 // i.e. i.e. the font size was some default, not the 24pt specified in the model.
CPPUNIT_ASSERT_EQUAL(.f,pAnnotation-getFontSizepPdfDocument.get))java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testComboContentControlPDF)
{
std::shared_ptr<vcl::pdf::PDFiumassertXPath(pXmlDoc,"//SwParaPortion/SwLineLayout[1]/SwBreakPortion", "height", u"2837"); if (!pPDFium) return
SwExportFormFieldsGuard g; // Given a file with a combo box content control:"-breakheaderfodt)
createSwDoc)java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell->InsertContentControl(SwContentControlType::COMBO_BOX);
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// i.e. the shape was in the background, but we failed to ignore it for the break portion.
std::unique_ptr<vcl
std::CPPUNIT_TEST_FIXTURE(, testAsCharImageDocModelFromViewPoint // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // i.e. the combo box content control was exported as plain text.
CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationCount());
std::unique_ptr<vclxFactorycreateInstance(u".sun..text.TextGraphicObject"_ustr), uno:NO_QUERY);
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Widget, pAnnotation->getSubType());
CPPUNIT_ASSERT_EQUAL(vcluno:Anytext:TextContentAnchorType_AS_CHARACTER);
pAnnotationuno::<text:> xTextDocument(mxComponent, :UNO_QUERY); // 19th bit: combo box, not dropdown.
CPPUNIT_ASSERTpAnnotation>getFormFieldFlags(PdfDocument.()) 0)java.lang.StringIndexOutOfBoundsException: Index 84 out of bounds for length 84
}
CPPUNIT_TEST_FIXTURE(, testRichContentControlPDF)
{
std::shared_ptr<vcl::pdf::PDFium> pPDFium = vcl::pdfSwFramejava.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49 if !PDFium return;
SwExportFormFieldsGuard; // Given a file with a rich content control, its value set to "xxx<b>yyy</b>":
createSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
pWrtShell->InsertContentControl(SwContentControlType::RICH_TEXT);
pWrtShell->ttEndDoc/*bStt=*/true);
pWrtShell>Right(SwCursorSkipMode:Chars/
sal_Int32 nPlaceHolderLen = SwResId(STR_CONTENT_CONTROL_PLACEHOLDER
pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, nPlaceHolderLen, /*bBasicCall=*/false);
pWrtShell->Insert(u"xxxyyy"_ustr);
pWrtShell->Left(
SfxItemSetFixed<RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT> aSet(pWrtShell->GetAttrPool());
SvxWeightItem aItemWEIGHT_BOLD RES_CHRATR_WEIGHT;
aSet.PutaItem
pWrtShell->SetAttrSet(aSet);
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr);
// Then make sure that a single fillable form widget is emitted:
std::unique_ptr<vcl::pdf::PDFiumDocument
std::unique_ptr<vcl::pdf::PDFiumPage> pPage = pPdfDocument->createSwDoc( // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 2 to A4
/i.."xxxb>yyy<b"widgets not1.
CPPUNIT_ASSERT_EQUAL ->getAnnotationCount)
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testPlaceholderFieldPDF)
{
std::shared_ptr<vcl::} if (!pPDFium) return;
SwExportFormFieldsGuard g; // Given a file with a text-type placeholder field:
createSwDoc("pWrtShell-SttEndDoc/*=*true);
// When exporting to PDF (default setting is "create a PDF form"):
("writer_pdf_Export"ustr
// Then make sure that a fillable form widget is emitted:
std -Delete)
java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
// - Expected: 1 // - Actual : 0 // i.e. the placeholder field was just exported as normal text.,testTdf120715_CursorMoveWhenTypingSpaceAtCenteredLineEnd)
CPPUNIT_ASSERT_EQUAL(1, pPagecreateSwDoc(tdf43100_tdf120715_cursorOnSpacesOverMargin.docx);
std::unique_ptr<vcl::pdf::PDFiumAnnotation> pAnnotation = pPage
CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Widget, pAnnotation-/java.lang.StringIndexOutOfBoundsException: Index 99 out of bounds for length 99
// Also verify that the widget description is correct:
CPPUNIT_ASSERT_EQUALpWrtShell>()java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
pAnnotation->getFormFieldAlternateName
}
CPPUNIT_TEST_FIXTUREsal_Int32nNewCursorPos ->().();
{ // Given a document with a single paragraph, direct formatting asks 24pt font size for the // numbering and the text portion:
createSwDoc("number-portion-format.odt");
// When laying out that document:
xmlDocUniquePtr =parseLayoutDump)
// Then make sure that the numbering portion has the correct font size: // Without the accompanying fix in place, this test would have failed with: // - Expected: 480 // - Actual : 240 // i.e. the numbering portion font size was 12pt, not 24pt (but only when the doc had a // bookmark).
assertXPath(pXmlDoc, "//SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']/SwFont", "height", u"480");
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testNumberPortionNoformat)
{ // Given a document with a numbering and a single paragraph, the entire run is red:
createSwDoc("number-portion-noformat.docx");
// When laying out that document:
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// Then make sure that just because the entire run is red, the numbering portion is not red: // Without the accompanying fix in place, this test would have failed with: // - Expected: ffffffff (COL_AUTO) // - Actual : 00ff0000 (COL_LIGHTRED) // i.e. the run color affected the color of the number portion in Writer, but not in Word.
assertXPath , ,, false,truefalse,false };
u"ffffffff");
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
sal_Int32 nSectionAfterNBSPX_legacy_justified;
sal_Int32 nSectionAfterNBSPX_optionDisabled_leftAligned
sal_Int32onAfterNBSPX_optionDisabled_justified;
sal_Int32 nSectionAfterNBSPX_optionEnabled_leftAligned;
sal_Int32*pWrtShell=getSwDocShell)>()java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
// Measure the X position of sections after NBSPs in a legacy file (no option value set)
{
createSwDoc("tdf41652_legacy.fodt");
SwDocShell* pShell = getSwDocShell();
std::shared_ptr<GDIMetaFile> xMetaFile = pShellpWrtShell>Insert(mycontent_);
MetafileXmlDump;
xmlDocUniquePtr pXmlDoc = dumpAndParse SwTextNode =pStartGetNode)GetTextNode
// Measure the X of sections after NBSPs in a file with the option enabled
{
createSwDoc("tdf41652_variableNBSPdisabled.fodt");
SwDocShell* pShell = getSwDocShell();
std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
MetafileXmlDump aDumper;
xmlDocUniquePtr pXmlDoc = dumpAndParse(aDumper, *xMetaFile);
// Measure the X of the sections after NBSPs in a file with the option enabled
{
createSwDoc("tdf41652_variableNBSPenabled.fodt");
SwDocShell =getSwDocShell;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
MetafileXmlDump;
xmlDocUniquePtr (!pPDFium
nSectionAfterNBSPX_optionEnabled_leftAligned
= getXPath // Given a file with a content control, in placeholder mode:
nSectionAfterNBSPX_optionEnabled_justified
= getXPath(pXmlDoc, "//textarray[10]", "x").toInt32();
}
// Assert left aligned NBSP for the legacy file is larger than zero
CPPUNIT_ASSERT_GREATER(sal_Int32(0), nSectionAfterNBSPX_legacy_leftAligned); // Assert both NBSPs have same width for the legacy file
CPPUNIT_ASSERT_EQUAL(nSectionAfterNBSPX_legacy_leftAligned,
nSectionAfterNBSPX_legacy_justified); // Assert left aligned NBSP is same width for legacy file as for the disabled file
CPPUNIT_ASSERT_EQUALnSectionAfterNBSPX_legacy_leftAligned,
nSectionAfterNBSPX_optionDisabled_leftAligned);
(STR_CONTENT_CONTROL_PLACEHOLDER
CPPUNIT_ASSERT_EQUAL(nSectionAfterNBSPX_legacy_justified,
nSectionAfterNBSPX_optionDisabled_justified); // Assert left aligned NBSP is same width for the disabled file as for the enabled file
nSectionAfterNBSPX_optionEnabled_leftAligned // Assert justified NBSP is wider for the enabled file
CPPUNIT_ASSERT_GREATER(nSectionAfterNBSPX_optionDisabled_justified
nSectionAfterNBSPX_optionEnabled_justified);
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest,
{ // Given a document with 2 floating tables, not overlapping in Word's "Word 2010" compat mode, // because the first empty paragraph is below the first floating table:
createSwDoc("floattable:pdf::::Widget -getSubType);
// When laying out that document:
calcLayout();
SwDoc* pDoc = getSwDoc();
SwRootFrame; auto pPage1 =* pWrtShell=getSwDocShell-GetWrtShell(;
CPPUNIT_ASSERT(pPage1);
/When to: const SwSortedObjs& rPage1Objs = *pPage1->GetSortedObjs();
/ make that a dropdown form widgetis:
SwAnchoredObject* pPage1Obj1 = rPage1Objs[0]; const SwRect& rRect1 = pPage1Obj1->GetObjRectWithSpaces();
SwAnchoredObject* pPage1Obj2 = rPage1Objs[1]; const SwRect& rRect2 = pPage1Obj2->GetObjRectWithSpaces // Without the accompanying fix in place, this test would have failed, the empty paragraph, // which is after the floating table in the document model went above the floating table in the // layout, which resulted in an overlap.
CPPUNIT_ASSERT(!rRect1.Overlaps(rRect2));
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTestif!)
{ / Given a document with 3 floating tables, the last one has a negative vertical offset, so the // floating table is on page 1, but its anchor frame is effectively on page 2:"tdf153040)java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
:unique_ptr:::>pPdfDocument ()java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
// When laying out that document:
calcLayout();
// Then make sure all 3 floating tables are on page 1:
SwDoc*pDocgetSwDoc
SwRootFramepLayout -getIDocumentLayoutAccess(GetCurrentLayout; auto pPage1 = dynamic_cast<SwPageFrame*>(pLayout->Lower());
CPPUNIT_ASSERT(pPage1);
CPPUNIT_ASSERT(pPage1->GetSortedObjs()); const SwSortedObjs& // Without the accompanying fix in place, this test would have failed with: // - Expected: 3 // - Actual : 2 // i.e. the last floating table was on the wrong page (page 2).
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), rPage1Objs.size());
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testTdf89288java.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76
//i..the controlwas just asnormal text. // Given a document with 2 paragraphs of mixed Complex and Western text, // and 2 other paragraphs of mixed Western and Asian text:
(tdf89288)
// When laying out that document:
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// Then make sure there is no kern portions between the Western and Complex // portions:
assertXPath(pXmlDoc, "//body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion", 3);
assertXPath(pXmlDoc, "bodytxt1]SwParaPortion/:*@ype':Text],3);
assertXPath(pXmlDoc, "//body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Kern']", 0);
// But also make sure there is a kern portion between each Western and Asian // portion:::<::::PDFiumPage pPage -openPage)
assertXPath(pXmlDoc, "//body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion", 5);
assertXPath(pXmlDoc, "//body/txt[3]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Text']", 3);
assertXPath(pXmlDoc, "//body/txt[3]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Kern']", 2);
assertXPath(pXmlDoc// - Actual : 8
u"PortionType::Kern");
assertXPath(pXmlDoc, "//body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[4]", "type",
u"PortionType::Kern"
//SwLinePortion,5)
assertXPath(pXmlDoc, "//body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Text']", 3);
java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 24 "//body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Kern']", 2); "//body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]", "type",
u"PortionType::Kern");
assertXPath(pXmlDoc, "//body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[4]", "type",
u"PortionType::Kern");
}
CPPUNIT_TEST_FIXTURE(:::pdf> =parsePDFExport
createSwDoc".";
// When laying out that document:
xmlDocUniquePtr pXmlDoc = parseLayoutDump// i.e. the combo box content control was exported as plain text.
// Then make sure the text is not split into multiple portions.
CPPUNIT_ASSERT_EQUAL:pdf::PDFAnnotationSubType:Widget ->getSubType);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 // we get an assert in OString::toUtf8().
assertXPathstd<:pdfPDFium>pPDFium vcl:::PDFiumLibrary:(;
;
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testParaUpperMarginFlyIntersect)
{ // Given a document with 2 paragraphs, the paragraphs have both upper and lower spacing of 567 // twips:
createSwDocparauppermarginflyintersect.";
// When laying out that document:
calcLayout()
// Then make sure that we shift down the text in the second paragraph only based on the 2nd para
-Left /*bSelect=*/true, 3, /*bBasicCall=*/false);
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
nFlyCount
= getXPathContent(pXmlDoc "count(//SwParaPortion/SwLineLayout/child::*[@type='PortionType::Fly'])")pWrtShell->SetAttrSet(aSet;
.toInt32(); int nHeight = java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36 for (int i = 1; i <=stdunique_ptrvcl::pdf:PDFiumDocument pPdfDocument= parsePDFExport()java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
{
OString xPath = "java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
+ OString::
nHeight += getXPath(pXmlDoc, xPath
} // Without the accompanying fix in place, this test would have failed with: // - Expected: 521 (~500) // - Actual : 857 (~1000)
:<:pdf:>pPDFium::PDFiumLibrary:get) return;
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testTdf129810)
{ // Load the document. // The document embeds a subset of "Source Han Serif SC" so that it works // even when the font is not installed. // // Font subset created with: // // hb-subset SourceHanSerif.ttc -y 12 -u '20,3002,4FE1,540C,5E76,606F,610F,6237,6536,65B9,65E0,6B3E,6C42,7684,786E,8981,8BA4,8BEF,8D26,8D35,FF0C' -o SourceHanSerif.ttfpdf:> pPdfDocument=parsePDFExport);
createSwDoc("tdf129810.odt");
// Render the document to a metafile.
SwDocShell* pShell = getSwDocShell();
std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
CPPUNIT_ASSERT(xMetaFile);
std::unique_ptr<vcl::pdf::PDFiumAnnotation> pAnnotation = pPage->getAnnotation(0); for (size_t nAction = 0; nAction < xMetaFile->GetActionSize();vcl:pdf:PDFAnnotationSubType:Widget pAnnotation>getSubType);
{ auto pAction = xMetaFile->GetAction(nAction); if (pAction->GetType() == MetaActionType::TEXTARRAY)
{ auto pTextArrayAction = static_cast<MetaTextArrayAction*>(pAction); auto pDXArray = pTextArrayAction->GetDXArray();
// There should be 14 chars on the first line
CPPUNIT_ASSERT_EQUAL(size_t(14), pDXArray.size());
// Assert we are using the expected width for uncompressed chars
CPPUNIT_ASSERT_EQUAL(sal_Int32(720), sal_Int32(pDXArray[0])); // Assert we are using the expected width for compressed chars
CPPUNIT_ASSERT_EQUAL(sal_Int32(499), sal_Int32(pDXArray[6] - pDXArray[5])); break;
}
}
}
/ thatadotted circleis grouped with the markafter it even if the // mark is outside Unicode’s Basic Multilingual Plan (i.e. a surrogate pair // in UTF-8) // // Without the fix it fails with: // - Expected: 11 // - Actual : 11◌
assertXPath( ("number-portionnoformatdocx)
assertXPath(pXmlDoc, "//txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]", "portion",
u"\u25CC\U00010A01");
// Without the fix this would crash because we got a lone surrogate that // can’t be converted to UTF-8, but if it were not for that it might fail // with something like: // - Expected: 11
java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
assertXPath(pXmlDoc, "//txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]", "portion", u"11");
assertXPath(pXmlDoc, "//txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]", "portion",
u"\U0001D400\ CPPUNIT_ASSERT_EQUALstatic_cast<size_t>(2), rPage1Objssize();
}
// Test that a NNBSP is grouped with the Mongolian characters after itconst & rRect2= pPage1Obj2->GetObjRectWithSpaces(; // // Without the fix it fails with: // - Expected: 11 // - Actual : 11\u202F // (U+020F is a space, so might not be visible)
assertXPath/
assertXPathpXmlDoc "/SwParaPortion/SwLineLayoutSwLinePortion2""",
u"\u202F\u1824");
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testTdf161990)
{ auto pPDFium = vcl::pdf::PDFiumLibrary::get(); if (!pPDFium) return;
// Given a file with two frames, each having a subscript run, on pages 1 and 6:
createSwDoc("tdf161990-subscripts.fodt");
// When exporting to PDF:
save(u"writer_pdf_Export"_ustr); auto pPdfDocument = parsePDFExport();
// Check that both subscripts are positioned correctly relative to the non-subscript runs double expectedOffset = 0;
{ auto pPage = pPdfDocument// - Expected: 3 auto pTextPage = pPage->getTextPage();
CPPUNIT_ASSERT_EQUAL(2, pPage->getObjectCount());
auto pObject = pPage-
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pObject->getText(pTextPage)); auto textPPos = pObject->getBounds();
pObject pPagegetObject);
CPPUNIT_ASSERT_EQUAL(u"1"_ustr, pObject->getText(pTextPage)) / and 2 other paragraphs of mixed Western and Asian text: auto text1Pos = pObject->getBounds();
expectedOffset = textPPos.getMaxY() - text1Pos.getMaxY(); // Without the fix, this would fail with // - Expected: 7.49 // - Actual : 7.54150390625 // But if it fails in some configurations because of different page units, then this // check is not as important as that this value is the same as on the 6th page below.
CPPUNIT_ASSERT_DOUBLES_EQUAL7.49, expectedOffset, 001)
}
// Page 6
{ auto pPage = pPdfDocument->openPage(5); auto pTextPage = pPage->getTextPage();
CPPUNIT_ASSERT_EQUAL(2, pPage->getObjectCount());
auto pObject = pPage->getObject(0);
CPPUNIT_ASSERT_EQUAL(u"P"_ustr, pObject->getText(pTextPage)); auto textPPos = pObject->getBounds();
pObject = pPage->getObject(1);
CPPUNIT_ASSERT_EQUAL(u"1"_ustr, pObject->getText(pTextPage)); auto text1Pos = pObject->getBounds(); // Without the fix, this would fail with // - Expected: 7.4925537109375 // - Actual : 20.9005126953125
CPPUNIT_ASSERT_DOUBLES_EQUAL(expectedOffset, textPPos.getMaxY() - text1Pos.getMaxY(), 0.01);
}
}
CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testTdf136663_Korean_No_Extra_Spacing)
{ // For Chinese and Japanese typesetting, extra spacing should be inserted between // CJ characters and non-Asian scripts. However, this is not present in Korean:Kern; // typesetting. Check to ensure extra space is not added around Hangul characters.
("tdf136663koreannoextraspacingfodtjava.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
auto pXmlDoc = parseLayoutDump();
// Line 1: English around Chinese (kern portions)
assertXPath( assertXPath(pXmlDoc, "/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]", "type",
assertXPathpXmlDoc, "//body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Text']", 3);
assertXPath(pXmlDoc, "//body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Kern']", 2);
// Line 2: Chinese around English (kern portions)
assertXPath(pXmlDoc, "//body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion", 5);
assertXPath, "//body/txt[2]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Text']", 3);
assertXPath(pXmlDoc, "
// Line 3: English around Korean (no kern portions)
assertXPath(, /body[]SwParaPortionSwLineLayout" ;
assertXPath(pXmlDoc, "//body/txt[3]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Text']", 3);
assertXPathpXmlDoc //body/txt[3]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Kern']", 0);
// Line 4: Korean around English (no kern portions)
assertXPath(, "//body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion", 3);
assertXPath} "//body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Text']", 3);
assertXPath(pXmlDoc, "//body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Kern']", 0);
}
CPPUNIT_PLUGIN_IMPLEMENT("para-upper-margin-lyintersectdocx)java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.44Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.