summaryrefslogtreecommitdiff
path: root/sw/source/filter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-05-19 14:32:58 +0200
committerMiklos Vajna <vmiklos@collabora.com>2020-05-19 18:59:01 +0200
commit0b725c38e01de528b3102975a842a700f4188087 (patch)
tree47c0565b62ccc1d2cb239beff1458ba6cb802254 /sw/source/filter
parent581f7ae64de2a865c4a888248c374a89719f0f03 (diff)
sw HTML import: ignore hidden text frames
Use-case: HTML-copy 2 lines from a browser from a mattermost chat, paste it into Writer. The content is not visible at all, because there are 5 invisible full-page textframes covering the actual content. The browser has no problem with showing the content as these divs are all invisible. Writer does not support hiding textframes, so just ignore them on import for now. Change-Id: I36a807d46f5f8348239e4693ec85da49a2205854 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94500 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'sw/source/filter')
-rw-r--r--sw/source/filter/html/css1kywd.cxx1
-rw-r--r--sw/source/filter/html/css1kywd.hxx1
-rw-r--r--sw/source/filter/html/htmlcss1.cxx6
-rw-r--r--sw/source/filter/html/htmlsect.cxx13
-rw-r--r--sw/source/filter/html/svxcss1.cxx10
-rw-r--r--sw/source/filter/html/svxcss1.hxx2
-rw-r--r--sw/source/filter/html/swhtml.hxx5
7 files changed, 38 insertions, 0 deletions
diff --git a/sw/source/filter/html/css1kywd.cxx b/sw/source/filter/html/css1kywd.cxx
index a99b5929a5ed..f8914dedb274 100644
--- a/sw/source/filter/html/css1kywd.cxx
+++ b/sw/source/filter/html/css1kywd.cxx
@@ -217,6 +217,7 @@ const char* const sCSS1_P_page_break_after = "page-break-after";
const char* const sCSS1_P_page_break_inside = "page-break-inside";
const char* const sCSS1_P_size = "size";
const char* const sCSS1_P_widows = "widows";
+const char* const sCSS1_P_visibility = "visibility";
const char* const sCSS1_P_orphans = "orphans";
//const char* const sCSS1_P_marks = "marks";
diff --git a/sw/source/filter/html/css1kywd.hxx b/sw/source/filter/html/css1kywd.hxx
index 00de608c0af9..7c0e326fd86a 100644
--- a/sw/source/filter/html/css1kywd.hxx
+++ b/sw/source/filter/html/css1kywd.hxx
@@ -220,6 +220,7 @@ extern const char* const sCSS1_P_page_break_after;
extern const char* const sCSS1_P_page_break_inside;
extern const char* const sCSS1_P_size;
extern const char* const sCSS1_P_widows;
+extern const char* const sCSS1_P_visibility;
extern const char* const sCSS1_P_orphans;
//extern const char* const sCSS1_P_marks;
diff --git a/sw/source/filter/html/htmlcss1.cxx b/sw/source/filter/html/htmlcss1.cxx
index d314b2caa7dd..ce608edc98f2 100644
--- a/sw/source/filter/html/htmlcss1.cxx
+++ b/sw/source/filter/html/htmlcss1.cxx
@@ -1425,6 +1425,12 @@ const SwPageDesc *SwCSS1Parser::GetPageDesc( sal_uInt16 nPoolId, bool bCreate )
bool SwCSS1Parser::MayBePositioned( const SvxCSS1PropertyInfo& rPropInfo,
bool bAutoWidth )
{
+ if (!rPropInfo.m_bVisible)
+ {
+ // Don't create a textframe for this div if it's hidden.
+ return false;
+ }
+
// abs-pos
// left/top none auto twip perc
diff --git a/sw/source/filter/html/htmlsect.cxx b/sw/source/filter/html/htmlsect.cxx
index 8fdee86e4bed..024464355ac0 100644
--- a/sw/source/filter/html/htmlsect.cxx
+++ b/sw/source/filter/html/htmlsect.cxx
@@ -131,7 +131,19 @@ void SwHTMLParser::NewDivision( HtmlTokenId nToken )
CreateContainer(aClass, aItemSet, aPropInfo,
xCntxt.get());
if( !bPositioned )
+ {
+ if (aPropInfo.m_bVisible && m_aContexts.size())
+ {
+ const std::unique_ptr<HTMLAttrContext>& pParent
+ = m_aContexts[m_aContexts.size() - 1];
+ if (!pParent->IsVisible())
+ {
+ // If the parent context is hidden, we are not visible, either.
+ aPropInfo.m_bVisible = false;
+ }
+ }
bPositioned = DoPositioning(aItemSet, aPropInfo, xCntxt.get());
+ }
}
}
@@ -378,6 +390,7 @@ void SwHTMLParser::NewDivision( HtmlTokenId nToken )
if( bStyleParsed )
InsertAttrs( aItemSet, aPropInfo, xCntxt.get(), true );
+ xCntxt->SetVisible(aPropInfo.m_bVisible);
PushContext(xCntxt);
}
diff --git a/sw/source/filter/html/svxcss1.cxx b/sw/source/filter/html/svxcss1.cxx
index 4045c8ca3a82..f64acdb4daab 100644
--- a/sw/source/filter/html/svxcss1.cxx
+++ b/sw/source/filter/html/svxcss1.cxx
@@ -3065,6 +3065,15 @@ static void ParseCSS1_so_language( const CSS1Expression *pExpr,
}
}
+static void ParseCSS1_visibility(const CSS1Expression* pExpr, SfxItemSet& /*rItemSet*/,
+ SvxCSS1PropertyInfo& rPropInfo, const SvxCSS1Parser& /*rParser*/)
+{
+ if (pExpr->GetType() != CSS1_IDENT)
+ return;
+
+ rPropInfo.m_bVisible = pExpr->GetString() != "hidden";
+}
+
namespace {
// the assignment of property to parsing function
@@ -3133,6 +3142,7 @@ static CSS1PropEntry const aCSS1PropFnTab[] =
CSS1_PROP_ENTRY(text_indent),
CSS1_PROP_ENTRY(text_transform),
CSS1_PROP_ENTRY(top),
+ CSS1_PROP_ENTRY(visibility),
CSS1_PROP_ENTRY(widows),
CSS1_PROP_ENTRY(width),
};
diff --git a/sw/source/filter/html/svxcss1.hxx b/sw/source/filter/html/svxcss1.hxx
index 677fe19bf57c..8bc1f47b380a 100644
--- a/sw/source/filter/html/svxcss1.hxx
+++ b/sw/source/filter/html/svxcss1.hxx
@@ -142,6 +142,8 @@ public:
SvxCSS1PageBreak m_ePageBreakBefore;
SvxCSS1PageBreak m_ePageBreakAfter;
+ bool m_bVisible = true;
+
SvxCSS1PropertyInfo();
SvxCSS1PropertyInfo( const SvxCSS1PropertyInfo& rProp );
~SvxCSS1PropertyInfo();
diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx
index f1e5b99eba9f..59b7db28c467 100644
--- a/sw/source/filter/html/swhtml.hxx
+++ b/sw/source/filter/html/swhtml.hxx
@@ -233,6 +233,8 @@ class HTMLAttrContext
bool m_bRestartListing : 1;
bool m_bHeaderOrFooter : 1;
+ bool m_bVisible = true;
+
public:
void ClearSaveDocContext();
@@ -291,6 +293,9 @@ public:
void SetAppendMode( SwHTMLAppendMode eMode ) { m_eAppend = eMode; }
SwHTMLAppendMode GetAppendMode() const { return m_eAppend; }
+
+ void SetVisible(bool bVisible) { m_bVisible = bVisible; }
+ bool IsVisible() const { return m_bVisible; }
};
typedef std::vector<std::unique_ptr<HTMLAttrContext>> HTMLAttrContexts;