Kaydet (Commit) 966dc7f2 authored tarafından Mark Hung's avatar Mark Hung Kaydeden (comit) Miklos Vajna

EPUB export: fix not properly paired openPageSpan

Fix the test case converting abi11105.abw to EPUB file.
( the attachment at
  <https://bugzilla.abisource.com/show_bug.cgi?id=11105#c1> )

soffice.bin: .../sax/source/expatwrap/saxwriter.cxx:1184: virtual void
(anonymous namespace)::SAXWriter::endElement(const rtl::OUString &):
	Assertion `aName ==
	m_pSaxWriterHelper->m_DebugStartedElements.top()' failed.

We used to invoke handlePageSpan when starting a paragraph
or a table element that has master-page-name defined in the referred
style, and invoke closePageSpan when XMLBodyContentContext.

Limit the handling of page span to top-level paragraph or tables
so that it doesn't messed up in the nested ( paragraph that changed
it's page style in a table cell ) case.

Change-Id: Ic8637663aaa7506ced9758bd7ccd7233309e8557
Reviewed-on: https://gerrit.libreoffice.org/73214
Tested-by: Jenkins
Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.com>
üst 92418d94
......@@ -877,6 +877,13 @@ CPPUNIT_TEST_FIXTURE(EPUBExportTest, testSimpleRuby)
assertXPathContent(mpXmlDoc, "//xhtml:body/xhtml:p/xhtml:ruby/xhtml:span", "base text");
assertXPathContent(mpXmlDoc, "//xhtml:body/xhtml:p/xhtml:ruby/xhtml:rt", "ruby text");
}
CPPUNIT_TEST_FIXTURE(EPUBExportTest, testAbi11105)
{
// This crashed because the paragraph style "P5" which had a master-page-name
// appeared in a table cell messed up page spans.
createDoc("abi11105.abw", {});
}
}
CPPUNIT_PLUGIN_IMPLEMENT();
......
......@@ -503,8 +503,9 @@ void XMLHyperlinkContext::characters(const OUString& rChars)
GetImport().GetGenerator().closeSpan();
}
XMLParaContext::XMLParaContext(XMLImport& rImport)
XMLParaContext::XMLParaContext(XMLImport& rImport, bool bTopLevel)
: XMLImportContext(rImport)
, m_bTopLevel(bTopLevel)
{
}
......@@ -535,7 +536,8 @@ void XMLParaContext::startElement(
GetImport().GetParagraphStyles(), aPropertyList);
FillStyles(m_aStyleName, GetImport().GetAutomaticTextStyles(),
GetImport().GetTextStyles(), m_aTextPropertyList);
GetImport().HandlePageSpan(aPropertyList);
if (m_bTopLevel)
GetImport().HandlePageSpan(aPropertyList);
}
else
{
......
......@@ -24,7 +24,7 @@ namespace exp
class XMLParaContext : public XMLImportContext
{
public:
XMLParaContext(XMLImport& rImport);
XMLParaContext(XMLImport& rImport, bool bTopLevel = false);
rtl::Reference<XMLImportContext> CreateChildContext(
const OUString& rName,
......@@ -40,6 +40,9 @@ private:
OUString m_aStyleName;
/// List of properties spans should inherit from this paragraph.
librevenge::RVNGPropertyList m_aTextPropertyList;
/// If the context is a direct child of XMLBodyContentContext.
/// Only direct child of XMLBodyContentContext has to handle page span.
bool m_bTopLevel;
};
/// Shared child context factory for paragraph and span contexts.
......
......@@ -184,8 +184,9 @@ int XMLTableRowContext::GetColumn() const { return m_nColumn; }
void XMLTableRowContext::SetColumn(int nColumn) { m_nColumn = nColumn; }
XMLTableContext::XMLTableContext(XMLImport& rImport)
XMLTableContext::XMLTableContext(XMLImport& rImport, bool bTopLevel)
: XMLImportContext(rImport)
, m_bTopLevel(bTopLevel)
{
}
......@@ -224,7 +225,8 @@ void XMLTableContext::startElement(
{
FillStyles(rAttributeValue, GetImport().GetAutomaticTableStyles(),
GetImport().GetTableStyles(), m_aPropertyList);
GetImport().HandlePageSpan(m_aPropertyList);
if (m_bTopLevel)
GetImport().HandlePageSpan(m_aPropertyList);
}
else
{
......
......@@ -22,7 +22,7 @@ namespace exp
class XMLTableContext : public XMLImportContext
{
public:
XMLTableContext(XMLImport& rImport);
XMLTableContext(XMLImport& rImport, bool bTopLevel = false);
rtl::Reference<XMLImportContext>
CreateChildContext(const OUString& rName,
......@@ -35,6 +35,9 @@ public:
private:
bool m_bTableOpened = false;
/// If the context is a direct child of XMLBodyContentContext.
/// Only direct child of XMLBodyContentContext has to handle page span.
bool m_bTopLevel;
librevenge::RVNGPropertyList m_aPropertyList;
librevenge::RVNGPropertyListVector m_aColumns;
};
......
......@@ -35,17 +35,18 @@ void XMLBodyContentContext::endElement(const OUString& /*rName*/)
rtl::Reference<XMLImportContext> XMLBodyContentContext::CreateChildContext(
const OUString& rName, const css::uno::Reference<css::xml::sax::XAttributeList>& /*xAttribs*/)
{
return CreateTextChildContext(GetImport(), rName);
return CreateTextChildContext(GetImport(), rName, true);
}
rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName)
rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName,
bool bTopLevel)
{
if (rName == "text:p" || rName == "text:h")
return new XMLParaContext(rImport);
return new XMLParaContext(rImport, bTopLevel);
if (rName == "text:section")
return new XMLSectionContext(rImport);
if (rName == "table:table")
return new XMLTableContext(rImport);
return new XMLTableContext(rImport, bTopLevel);
if (rName == "text:list")
return new XMLTextListContext(rImport);
return nullptr;
......
......@@ -29,7 +29,8 @@ public:
};
/// Context factory for body text, section, table cell, etc.
rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName);
rtl::Reference<XMLImportContext> CreateTextChildContext(XMLImport& rImport, const OUString& rName,
bool bTopLevel = false);
} // namespace exp
} // namespace writerperfect
......
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