summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-02-03 12:06:23 +0000
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2020-02-12 22:23:02 +0100
commitc9605cc66bcc655f3d7c8f3264efa691de42aed5 (patch)
treedd69e920ef22391275b75fcb01294d093fa642e0
parenttdf#130054: consider all row/col bars in ScTabView::EnableRefInput (diff)
downloadcore-c9605cc66bcc655f3d7c8f3264efa691de42aed5.tar.gz
core-c9605cc66bcc655f3d7c8f3264efa691de42aed5.zip
ofz#20455 sw: HTML import: fix invalid table in footer
The obvious problem was that a bookmark failed to be copied to the correct node, it was created on a SwStartNode, which failed in makeMark() and caused a null-pointer. The target position was off by 1 node because there was a spurious StartNode/EndNode pair directly below the table: [ 41] 0x5b13430 TableNode , [ 42] 0x5b1d010 StartNode , [ 43] 0x5b12a50 StartNode , [ 44] 0x5b135f0 TextNode "", This was created by a special case in SwTableNode::MakeCopy() because .GetTabSortBoxes().size() == 1. But the table had actually quite a bunch more cells in the nodes-array, just they were not yet in the SwTable. In an exciting twist of events, it turns out the table was copied while it was not yet finished parsing: the problem was that in the middle of the table, some CSS set some page attributes, and this caused a first-page page style to be created in SwCSS1Parser::ParseStyleSheet(), by copying the master page style. Unfortunately the table was in the <div title="footer">, so it was copied in this incomplete and inconsistent state. It might be possible to get rid of the special case in SwTableNode::MakeCopy() by restricting the special case skipping of StartNodes at the start in SwNodes::CopyNodes() a bit so that StartNodes whose EndNodes are copied aren't skipped; at least that's the most reasonable explanation for the special case. But for now just fix the HTML import. Additionally, only on MacOSX, using libc++, this triggered an assert: Assertion failed: (!pImpl->mpStaticDefaults || typeid(rItem) == typeid(GetDefaultItem(nWhich))), function PutImpl, file /Users/tdf/lode/jenkins/workspace/lo_gerrit/Config/macosx_clang_dbgutil/svl/source/items/itempool.cxx, line 611. Probably because SdrTextAniCountItem is not marked DLLPUBLIC. Change-Id: Ia167265e7540eea649801eaac2b89f9e18b685cd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87859 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@cib.de> (cherry picked from commit 086e43148059a7ebc6caa416fa82bb60fd2cc92f) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88494 Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--include/svx/sdtacitm.hxx2
-rw-r--r--sw/qa/core/data/html/pass/ofz20455.htmlbin0 -> 5639 bytes
-rw-r--r--sw/source/filter/html/htmlcss1.cxx18
-rw-r--r--sw/source/filter/html/swcss1.hxx5
-rw-r--r--sw/source/filter/html/swhtml.cxx2
-rw-r--r--sw/source/filter/html/swhtml.hxx2
6 files changed, 21 insertions, 8 deletions
diff --git a/include/svx/sdtacitm.hxx b/include/svx/sdtacitm.hxx
index bf145c8b6b6c..f34e5589ed53 100644
--- a/include/svx/sdtacitm.hxx
+++ b/include/svx/sdtacitm.hxx
@@ -23,7 +23,7 @@
#include <svx/svddef.hxx>
// Number of loops. 0=infinite.
-class SdrTextAniCountItem final : public SfxUInt16Item {
+class SAL_DLLPUBLIC_RTTI SdrTextAniCountItem final : public SfxUInt16Item {
public:
SdrTextAniCountItem(sal_uInt16 nVal=0): SfxUInt16Item(SDRATTR_TEXT_ANICOUNT,nVal) {}
diff --git a/sw/qa/core/data/html/pass/ofz20455.html b/sw/qa/core/data/html/pass/ofz20455.html
new file mode 100644
index 000000000000..6e5ca0aa7e85
--- /dev/null
+++ b/sw/qa/core/data/html/pass/ofz20455.html
Binary files differ
diff --git a/sw/source/filter/html/htmlcss1.cxx b/sw/source/filter/html/htmlcss1.cxx
index e7a1827543a6..4f8d8bbe7d03 100644
--- a/sw/source/filter/html/htmlcss1.cxx
+++ b/sw/source/filter/html/htmlcss1.cxx
@@ -90,11 +90,13 @@ void SwCSS1Parser::ChgPageDesc( const SwPageDesc *pPageDesc,
m_pDoc->ChgPageDesc( pos, rNewPageDesc );
}
-SwCSS1Parser::SwCSS1Parser( SwDoc *pD, const sal_uInt32 aFHeights[7], const OUString& rBaseURL, bool bNewDoc ) :
- SvxCSS1Parser( pD->GetAttrPool(), rBaseURL,
- aItemIds, SAL_N_ELEMENTS(aItemIds)),
- m_pDoc( pD ),
- m_nDropCapCnt( 0 ),
+SwCSS1Parser::SwCSS1Parser(SwDoc *const pDoc, SwHTMLParser const& rParser,
+ const sal_uInt32 aFHeights[7], const OUString& rBaseURL, bool const bNewDoc)
+ : SvxCSS1Parser(pDoc->GetAttrPool(), rBaseURL,
+ aItemIds, SAL_N_ELEMENTS(aItemIds))
+ , m_pDoc( pDoc )
+ , m_rHTMLParser(rParser)
+ , m_nDropCapCnt( 0 ),
m_bIsNewDoc( bNewDoc ),
m_bBodyBGColorSet( false ),
m_bBodyBackgroundSet( false ),
@@ -1344,6 +1346,12 @@ const SwPageDesc *SwCSS1Parser::GetPageDesc( sal_uInt16 nPoolId, bool bCreate )
const SwPageDesc *pPageDesc = FindPageDesc(m_pDoc, nPoolId);
if( !pPageDesc && bCreate )
{
+ if (m_rHTMLParser.IsReadingHeaderOrFooter())
+ { // (there should be only one definition of header/footer in HTML)
+ SAL_WARN("sw.html", "no creating PageDesc while reading header/footer");
+ return nullptr;
+ }
+
// The first page is created from the right page, if there is one.
SwPageDesc *pMasterPageDesc = nullptr;
if( RES_POOLPAGE_FIRST == nPoolId )
diff --git a/sw/source/filter/html/swcss1.hxx b/sw/source/filter/html/swcss1.hxx
index c6a3e6bdb8fd..54d03edb5892 100644
--- a/sw/source/filter/html/swcss1.hxx
+++ b/sw/source/filter/html/swcss1.hxx
@@ -33,6 +33,7 @@ class SwTextFormatColl;
class SvxBrushItem;
class SwFormatDrop;
class SwPageDesc;
+class SwHTMLParser;
// This header looks harmless, but includes still quite
// inconspicuous one or the other! On the other hand this class
@@ -41,6 +42,7 @@ class SwPageDesc;
class SwCSS1Parser : public SvxCSS1Parser
{
SwDoc *m_pDoc;
+ SwHTMLParser const& m_rHTMLParser;
sal_uLong m_aFontHeights[7];
@@ -75,7 +77,8 @@ protected:
using CSS1Parser::ParseStyleSheet;
public:
- SwCSS1Parser( SwDoc *pDoc, sal_uInt32 const aFHeight[7], const OUString& rBaseURL, bool bNewDoc );
+ SwCSS1Parser( SwDoc *pDoc, SwHTMLParser const& rParser,
+ sal_uInt32 const aFHeight[7], const OUString& rBaseURL, bool bNewDoc);
virtual ~SwCSS1Parser() override;
virtual bool ParseStyleSheet( const OUString& rIn ) override;
diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx
index 4a5003c0dd7c..aaa6c2e7dd35 100644
--- a/sw/source/filter/html/swhtml.cxx
+++ b/sw/source/filter/html/swhtml.cxx
@@ -359,7 +359,7 @@ SwHTMLParser::SwHTMLParser( SwDoc* pD, SwPaM& rCursor, SvStream& rIn,
m_bOldIsHTMLMode = m_xDoc->getIDocumentSettingAccess().get(DocumentSettingId::HTML_MODE);
m_xDoc->getIDocumentSettingAccess().set(DocumentSettingId::HTML_MODE, true);
- m_pCSS1Parser.reset( new SwCSS1Parser( m_xDoc.get(), m_aFontHeights, m_sBaseURL, IsNewDoc() ) );
+ m_pCSS1Parser.reset(new SwCSS1Parser(m_xDoc.get(), *this, m_aFontHeights, m_sBaseURL, IsNewDoc()));
m_pCSS1Parser->SetIgnoreFontFamily( rHtmlOptions.IsIgnoreFontFamily() );
if( bReadUTF8 )
diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx
index b9173c6271ab..58eaaaab715e 100644
--- a/sw/source/filter/html/swhtml.hxx
+++ b/sw/source/filter/html/swhtml.hxx
@@ -923,6 +923,8 @@ public:
bool IsReqIF() const;
+ bool IsReadingHeaderOrFooter() const { return m_bReadingHeaderOrFooter; }
+
void NotifyMacroEventRead();
/// Strips query and fragment from a URL path if base URL is a file:// one.