summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsw/qa/extras/ooxmlexport/data/n789482.docxbin0 -> 12916 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport.cxx20
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx13
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.hxx2
4 files changed, 29 insertions, 6 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/n789482.docx b/sw/qa/extras/ooxmlexport/data/n789482.docx
new file mode 100755
index 000000000000..493e8ee04b11
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/n789482.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 1a1c15791b16..8fe19859258f 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -66,6 +66,7 @@ public:
void testFdo47669();
void testTableBorders();
void testFdo51550();
+ void testN789482();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -103,6 +104,7 @@ void Test::run()
{"fdo47669.docx", &Test::testFdo47669},
{"table-borders.docx", &Test::testTableBorders},
{"fdo51550.odt", &Test::testFdo51550},
+ {"n789482.docx", &Test::testN789482},
};
// Don't test the first import of these, for some reason those tests fail
const char* aBlacklist[] = {
@@ -482,6 +484,24 @@ void Test::testFdo51550()
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount());
}
+void Test::testN789482()
+{
+ // The problem was that w:del was exported before w:hyperlink, resulting in an invalid XML.
+ uno::Reference<text::XTextRange> xParagraph = getParagraph(1);
+ getRun(xParagraph, 1, "Before. ");
+
+ CPPUNIT_ASSERT_EQUAL(OUString("Delete"), getProperty<OUString>(getRun(xParagraph, 2), "RedlineType"));
+ CPPUNIT_ASSERT_EQUAL(sal_True, getProperty<sal_Bool>(getRun(xParagraph, 2), "IsStart"));
+
+ getRun(xParagraph, 3, "www.test.com");
+ CPPUNIT_ASSERT_EQUAL(OUString("http://www.test.com/"), getProperty<OUString>(getRun(xParagraph, 3), "HyperLinkURL"));
+
+ CPPUNIT_ASSERT_EQUAL(OUString("Delete"), getProperty<OUString>(getRun(xParagraph, 4), "RedlineType"));
+ CPPUNIT_ASSERT_EQUAL(sal_False, getProperty<sal_Bool>(getRun(xParagraph, 4), "IsStart"));
+
+ getRun(xParagraph, 5, " After.");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 45abbf61e6ca..d69e2ccbb776 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -461,8 +461,9 @@ void DocxAttributeOutput::EndParagraphProperties()
void DocxAttributeOutput::StartRun( const SwRedlineData* pRedlineData, bool /*bSingleEmptyRun*/ )
{
- // if there is some redlining in the document, output it
- StartRedline( pRedlineData );
+ // Don't start redline data here, possibly there is a hyperlink later, and
+ // that has to be started first.
+ m_pRedlineData = pRedlineData;
// postpone the output of the start of a run (there are elements that need
// to be written before the start of the run, but we learn which they are
@@ -539,6 +540,9 @@ void DocxAttributeOutput::EndRun()
m_startedHyperlink = true;
}
+ // if there is some redlining in the document, output it
+ StartRedline();
+
DoWriteBookmarks( );
WriteCommentRanges();
@@ -1237,12 +1241,11 @@ void DocxAttributeOutput::Redline( const SwRedlineData* /*pRedline*/ )
OSL_TRACE( "TODO DocxAttributeOutput::Redline( const SwRedlineData* pRedline )" );
}
-void DocxAttributeOutput::StartRedline( const SwRedlineData* pRedlineData )
+void DocxAttributeOutput::StartRedline()
{
- m_pRedlineData = pRedlineData;
-
if ( !m_pRedlineData )
return;
+ const SwRedlineData* pRedlineData = m_pRedlineData;
// FIXME check if it's necessary to travel over the Next()'s in pRedlineData
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index b1302b69fd30..f42ffdf71ee1 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -132,7 +132,7 @@ public:
///
/// Start of the tag that encloses the run, fills the info according to
/// the value of m_pRedlineData.
- void StartRedline( const SwRedlineData* pRedlineData );
+ void StartRedline();
/// Output redlining.
///