[Libreoffice-commits] core.git: sw/qa sw/source

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Thu Nov 7 17:29:44 UTC 2019


 sw/qa/extras/htmlexport/htmlexport.cxx |   42 ++++++++++++++++++++++++++++-----
 sw/source/filter/html/htmlatr.cxx      |    3 +-
 2 files changed, 38 insertions(+), 7 deletions(-)

New commits:
commit f2eae41e9a85cd1df4190160b7453d3e12b8ccbd
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Thu Nov 7 17:17:35 2019 +0100
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Thu Nov 7 18:28:52 2019 +0100

    sw XHTML export: <blockquote> can't have character children
    
    Fixes the following reqif-xhtml validation error:
    
    ERROR at 214: [XSD] cvc-complex-type.2.3: Element 'reqif-xhtml:blockquote' cannot have character [children], because the type's content type is element-only.
    
    But this is probably useful in the general xhtml case as well.
    
    [ Also add a way to not load a document when we want to cover "store"
    behavior in a test. ]
    
    Change-Id: I88795271475863b9560ac1cb99636c507746f1e9
    Reviewed-on: https://gerrit.libreoffice.org/82239
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
    Tested-by: Jenkins

diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx
index cfc97d393fc6..fadd91b728fb 100644
--- a/sw/qa/extras/htmlexport/htmlexport.cxx
+++ b/sw/qa/extras/htmlexport/htmlexport.cxx
@@ -38,11 +38,11 @@ public:
      * Wraps a reqif-xhtml fragment into an XHTML file, so an XML parser can
      * parse it.
      */
-    void wrapFragment(SvMemoryStream& rStream)
+    static void wrapFragment(const utl::TempFile& rTempFile, SvMemoryStream& rStream)
     {
         rStream.WriteCharPtr(
             "<reqif-xhtml:html xmlns:reqif-xhtml=\"http://www.w3.org/1999/xhtml\">\n");
-        SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ);
+        SvFileStream aFileStream(rTempFile.GetURL(), StreamMode::READ);
         rStream.WriteStream(aFileStream);
         rStream.WriteCharPtr("</reqif-xhtml:html>\n");
         rStream.Seek(0);
@@ -102,6 +102,11 @@ private:
 
 #define DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(TestName, filename) DECLARE_SW_ROUNDTRIP_TEST(TestName, filename, nullptr, HtmlExportTest)
 
+/// HTML export of the sw doc model tests.
+class SwHtmlDomExportTest : public SwModelTestBase, public HtmlTestTools
+{
+};
+
 DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(testFdo81276, "fdo81276.html")
 {
     uno::Reference<container::XNameAccess> xPageStyles(getStyles("PageStyles"));
@@ -563,7 +568,7 @@ DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(testReqIfOle2, "reqif-ole2.xhtml")
     {
         // Check that the replacement graphic is exported at RTF level.
         SvMemoryStream aStream;
-        wrapFragment(aStream);
+        wrapFragment(maTempFile, aStream);
         xmlDocPtr pDoc = parseXmlStream(&aStream);
         CPPUNIT_ASSERT(pDoc);
         // Get the path of the RTF data.
@@ -626,7 +631,7 @@ DECLARE_HTMLEXPORT_TEST(testTransparentImage, "transparent-image.odt")
 DECLARE_HTMLEXPORT_TEST(testTransparentImageReqIf, "transparent-image.odt")
 {
     SvMemoryStream aStream;
-    wrapFragment(aStream);
+    wrapFragment(maTempFile, aStream);
     xmlDocPtr pDoc = parseXmlStream(&aStream);
     CPPUNIT_ASSERT(pDoc);
 
@@ -643,7 +648,7 @@ DECLARE_HTMLEXPORT_TEST(testOleNodataReqIf, "reqif-ole-nodata.odt")
 {
     // This failed, io::IOException was thrown during the filter() call.
     SvMemoryStream aStream;
-    wrapFragment(aStream);
+    wrapFragment(maTempFile, aStream);
     xmlDocPtr pDoc = parseXmlStream(&aStream);
     CPPUNIT_ASSERT(pDoc);
 
@@ -658,7 +663,7 @@ DECLARE_HTMLEXPORT_TEST(testOleNodataReqIf, "reqif-ole-nodata.odt")
 DECLARE_HTMLEXPORT_TEST(testNoLangReqIf, "reqif-no-lang.odt")
 {
     SvMemoryStream aStream;
-    wrapFragment(aStream);
+    wrapFragment(maTempFile, aStream);
     xmlDocPtr pDoc = parseXmlStream(&aStream);
     CPPUNIT_ASSERT(pDoc);
 
@@ -696,6 +701,31 @@ DECLARE_HTMLEXPORT_TEST(testFieldShadeReqIf, "field-shade-reqif.odt")
     assertXPath(pDoc, "/html/body/div/p[1]/sdfield", 0);
 }
 
+CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testBlockQuoteReqIf)
+{
+    // Build a document model that uses the Quotations paragraph style.
+    loadURL("private:factory/swriter", nullptr);
+    uno::Reference<beans::XPropertySet> xParagraph(getParagraph(1), uno::UNO_QUERY);
+    xParagraph->setPropertyValue("ParaStyleName", uno::makeAny(OUString("Quotations")));
+
+    // Export it.
+    uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
+    utl::MediaDescriptor aMediaDescriptor;
+    aMediaDescriptor["FilterName"] <<= OUString("HTML (StarWriter)");
+    aMediaDescriptor["FilterOptions"] <<= OUString("xhtmlns=reqif-xhtml");
+    xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
+    SvMemoryStream aStream;
+    HtmlExportTest::wrapFragment(maTempFile, aStream);
+    xmlDocPtr pDoc = parseXmlStream(&aStream);
+    CPPUNIT_ASSERT(pDoc);
+
+    // Without the accompanying fix in place, this test would have failed with:
+    // - Expected: 1
+    // - Actual  : 0
+    // i.e. <blackquote> had character (direct) children, which is invalid xhtml.
+    assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:blockquote/reqif-xhtml:p", 1);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/html/htmlatr.cxx b/sw/source/filter/html/htmlatr.cxx
index 64b2100b52f3..c54d31149d50 100644
--- a/sw/source/filter/html/htmlatr.cxx
+++ b/sw/source/filter/html/htmlatr.cxx
@@ -800,8 +800,9 @@ static void OutHTML_SwFormat( Writer& rWrt, const SwFormat& rFormat,
     // for BLOCKQUOTE, ADDRESS and DD we output another paragraph token, if
     // - no styles are written and
     // - a lower spacing or a paragraph alignment exists
+    // Also, XHTML does not allow character children in this context.
     OString aToken = rInfo.aToken;
-    if( !rHWrt.m_bCfgOutStyles && rInfo.bParaPossible && !bPara &&
+    if( (!rHWrt.m_bCfgOutStyles || rHWrt.mbXHTML) && rInfo.bParaPossible && !bPara &&
         (bHasParSpace || pAdjItem) )
     {
         HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), rHWrt.GetNamespace() + rInfo.aToken );


More information about the Libreoffice-commits mailing list