summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-02-24 09:03:22 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-02-24 09:14:46 +0100
commit0cf6f241e40b8be3c9d809c528b367df32f3f2ee (patch)
tree70c3726d89cb89683eb14d41b599765062066672
parent83aa6d8180f289e5ae4034560dbd95ab160b1ac2 (diff)
abi#11739 DOCX export: fix validation error, wrong order of some elements
Change-Id: Ic1c0174718ba6853fcc8795324a99b2a332b865e
-rwxr-xr-xsw/qa/extras/ooxmlexport/data/abi11739.docxbin0 -> 11635 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport.cxx36
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx24
-rw-r--r--sw/source/filter/ww8/docxtablestyleexport.cxx4
4 files changed, 50 insertions, 14 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/abi11739.docx b/sw/qa/extras/ooxmlexport/data/abi11739.docx
new file mode 100755
index 000000000000..8eb6999da28d
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/abi11739.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
index 850c11141f42..c1d81ca39c24 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx
@@ -97,6 +97,12 @@ protected:
void assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfChildNodes);
/**
+ * Get the position of the child named rName of the parent node specified by rXPath.
+ * Useful for checking relative order of elements.
+ */
+ int getXPathPosition(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rName);
+
+ /**
* Same as the assertXPath(), but don't assert: return the string instead.
*/
OUString getXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute);
@@ -189,6 +195,23 @@ void Test::assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNu
nNumberOfChildNodes, (int)xmlChildElementCount(pXmlNode));
}
+int Test::getXPathPosition(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rChildName)
+{
+ xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of nodes is incorrect").getStr(),
+ 1,
+ xmlXPathNodeSetGetLength(pXmlNodes));
+ xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
+ int nRet = 0;
+ for (xmlNodePtr pChild = pXmlNode->children; pChild; pChild = pChild->next)
+ {
+ if (OUString::createFromAscii((const char*)pChild->name) == rChildName)
+ break;
+ ++nRet;
+ }
+ return nRet;
+}
+
OUString Test::getXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute)
{
xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
@@ -3431,6 +3454,19 @@ DECLARE_OOXMLEXPORT_TEST(testW14TextEffects, "TextEffects.docx")
CPPUNIT_ASSERT(getXPath(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:rPr/w14:glow", "rad").match("228600"));
}
+DECLARE_OOXMLEXPORT_TEST(testAbi11739, "abi11739.docx")
+{
+ // Validation test: order of elements were wrong.
+ xmlDocPtr pXmlDoc = parseExport("word/styles.xml");
+ if (!pXmlDoc)
+ return;
+ // Order was: uiPriority, link, basedOn.
+ CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "basedOn") < getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "link"));
+ CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "link") < getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "uiPriority"));
+ // Order was: qFormat, unhideWhenUsed.
+ CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[11]", "unhideWhenUsed") < getXPathPosition(pXmlDoc, "/w:styles/w:style[11]", "qFormat"));
+}
+
#endif
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index d37fe60a4ec3..9dd8cd52706b 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -3739,7 +3739,18 @@ void DocxAttributeOutput::StartStyle( const OUString& rName, StyleType eType,
FSNS( XML_w, XML_val ), OUStringToOString( OUString( rName ), RTL_TEXTENCODING_UTF8 ).getStr(),
FSEND );
- // Output properties from grab-bag.
+ if ( nBase != 0x0FFF && eType != STYLE_TYPE_LIST)
+ {
+ m_pSerializer->singleElementNS( XML_w, XML_basedOn,
+ FSNS( XML_w, XML_val ), m_rExport.pStyles->GetStyleId(nBase).getStr(),
+ FSEND );
+ }
+
+ if (!aLink.isEmpty())
+ m_pSerializer->singleElementNS(XML_w, XML_link,
+ FSNS(XML_w, XML_val), OUStringToOString(aLink, RTL_TEXTENCODING_UTF8).getStr(),
+ FSEND);
+
if (!aUiPriority.isEmpty())
m_pSerializer->singleElementNS(XML_w, XML_uiPriority,
FSNS(XML_w, XML_val), OUStringToOString(aUiPriority, RTL_TEXTENCODING_UTF8).getStr(),
@@ -3750,10 +3761,6 @@ void DocxAttributeOutput::StartStyle( const OUString& rName, StyleType eType,
m_pSerializer->singleElementNS(XML_w, XML_semiHidden, FSEND);
if (bUnhideWhenUsed)
m_pSerializer->singleElementNS(XML_w, XML_unhideWhenUsed, FSEND);
- if (!aLink.isEmpty())
- m_pSerializer->singleElementNS(XML_w, XML_link,
- FSNS(XML_w, XML_val), OUStringToOString(aLink, RTL_TEXTENCODING_UTF8).getStr(),
- FSEND);
if (bLocked)
m_pSerializer->singleElementNS(XML_w, XML_locked, FSEND);
if (!aRsid.isEmpty())
@@ -3761,13 +3768,6 @@ void DocxAttributeOutput::StartStyle( const OUString& rName, StyleType eType,
FSNS(XML_w, XML_val), OUStringToOString(aRsid, RTL_TEXTENCODING_UTF8).getStr(),
FSEND);
- if ( nBase != 0x0FFF && eType != STYLE_TYPE_LIST)
- {
- m_pSerializer->singleElementNS( XML_w, XML_basedOn,
- FSNS( XML_w, XML_val ), m_rExport.pStyles->GetStyleId(nBase).getStr(),
- FSEND );
- }
-
if ( nNext != nId && eType != STYLE_TYPE_LIST)
{
m_pSerializer->singleElementNS( XML_w, XML_next,
diff --git a/sw/source/filter/ww8/docxtablestyleexport.cxx b/sw/source/filter/ww8/docxtablestyleexport.cxx
index dc0297a7eec8..5cd154c354de 100644
--- a/sw/source/filter/ww8/docxtablestyleexport.cxx
+++ b/sw/source/filter/ww8/docxtablestyleexport.cxx
@@ -618,12 +618,12 @@ void DocxTableStyleExport::Impl::TableStyle(uno::Sequence<beans::PropertyValue>&
m_pSerializer->singleElementNS(XML_w, XML_uiPriority,
FSNS(XML_w, XML_val), OUStringToOString(aUiPriority, RTL_TEXTENCODING_UTF8).getStr(),
FSEND);
- if (bQFormat)
- m_pSerializer->singleElementNS(XML_w, XML_qFormat, FSEND);
if (bSemiHidden)
m_pSerializer->singleElementNS(XML_w, XML_semiHidden, FSEND);
if (bUnhideWhenUsed)
m_pSerializer->singleElementNS(XML_w, XML_unhideWhenUsed, FSEND);
+ if (bQFormat)
+ m_pSerializer->singleElementNS(XML_w, XML_qFormat, FSEND);
if (!aRsid.isEmpty())
m_pSerializer->singleElementNS(XML_w, XML_rsid,
FSNS(XML_w, XML_val), OUStringToOString(aRsid, RTL_TEXTENCODING_UTF8).getStr(),