Kaydet (Commit) f8da7757 authored tarafından Miklos Vajna's avatar Miklos Vajna

EPUB export, fixed layout: fix validation error with images

The "xlink" prefix for the "xlink:href" attribute on the "image" element
was not bound.

Change-Id: I473a0b1612b4842cf84a264960bb28a9f19600e5
Reviewed-on: https://gerrit.libreoffice.org/49612Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarJenkins <ci@libreoffice.org>
üst 22fc8c63
......@@ -2333,6 +2333,8 @@ void SVGExport::writeMtf( const GDIMetaFile& rMtf )
AddAttribute( XML_NAMESPACE_NONE, "baseProfile", "tiny" );
AddAttribute( XML_NAMESPACE_NONE, "xmlns", constSvgNamespace );
// For <image xlink:href="...">.
AddAttribute(XML_NAMESPACE_XMLNS, "xlink", "http://www.w3.org/1999/xlink");
AddAttribute( XML_NAMESPACE_NONE, "stroke-width", OUString::number( 28.222 ) );
AddAttribute( XML_NAMESPACE_NONE, "stroke-linejoin", "round" );
AddAttribute( XML_NAMESPACE_NONE, "xml:space", "preserve" );
......
......@@ -75,6 +75,11 @@ protected:
* Assert that rXPath exists, and its content equals rContent.
*/
void assertXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rContent);
/**
* Assert that rXPath exists and it has an rNSPrefix=rNSHref namespace definition.
*/
void assertXPathNSDef(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rNSPrefix,
const OUString& rNSHref);
/**
* Assert that rXPath exists, and has exactly nNumberOfChildNodes child nodes.
* Useful for checking that we do have a no child nodes to a specific node (nNumberOfChildNodes == 0).
......
......@@ -123,6 +123,33 @@ void XmlTestTools::assertXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath,
CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("In <" + OString(pXmlDoc->name) + ">, XPath contents of child does not match").getStr(), rContent, getXPathContent(pXmlDoc, rXPath));
}
void XmlTestTools::assertXPathNSDef(xmlDocPtr pXmlDoc, const OString& rXPath,
const OUString& rNSPrefix, const OUString& rNSHref)
{
xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, rXPath);
xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval;
CPPUNIT_ASSERT_MESSAGE(
OString("In <" + OString(pXmlDoc->name) + ">, XPath '" + rXPath + "' not found").getStr(),
xmlXPathNodeSetGetLength(pXmlNodes) > 0);
xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
bool bFound = false;
for (xmlNsPtr pNamespace = pXmlNode->nsDef; pNamespace; pNamespace = pNamespace->next)
{
if (!pNamespace->prefix)
continue;
CPPUNIT_ASSERT(pNamespace->href);
if (rNSPrefix == convert(pNamespace->prefix) && rNSHref == convert(pNamespace->href))
{
bFound = true;
break;
}
}
xmlXPathFreeObject(pXmlObj);
CPPUNIT_ASSERT(bFound);
}
void XmlTestTools::assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfChildNodes)
{
#if LIBXML_VERSION >= 20703 /* xmlChildElementCount is only available in libxml2 >= 2.7.3 */
......
......@@ -874,6 +874,11 @@ void EPUBExportTest::testSVG()
// one, causing a validation error.
OString aActual(static_cast<const char *>(aMemoryStream.GetBuffer()), aExpected.getLength());
CPPUNIT_ASSERT_EQUAL(aExpected, aActual);
// This failed, we used the xlink attribute namespace, but we did not
// define its URL.
mpXmlDoc = parseExport("OEBPS/images/image0001.svg");
assertXPathNSDef(mpXmlDoc, "/svg:svg", "xlink", "http://www.w3.org/1999/xlink");
}
CPPUNIT_TEST_SUITE_REGISTRATION(EPUBExportTest);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment