summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2018-03-09 15:14:36 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2018-03-09 16:08:33 +0100
commit68c542cfa888f1aa03a08bfc13163c0f2f0c3a75 (patch)
treebfa1be24619c29a4ceed4a60c6b7617aa308b9f1
parentc5dd01c426c4a46d7fd00aaa85fe05414bb0ba2b (diff)
sw XHTML import: PNG <object> is an image
The previous scheme was: <object data="..." type="..."> <object data="..." type="image/png">alternate text</object> </object> Support also the case when the inner <object> is standalone, like: <object data="..." type="image/png">alternate text</object> Change-Id: I2dec2770ee3c1c538bcf26f6ff12c6e8f5969563 Reviewed-on: https://gerrit.libreoffice.org/51003 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--sw/qa/extras/htmlexport/data/reqif-png-img.xhtml4
-rw-r--r--sw/qa/extras/htmlexport/htmlexport.cxx9
-rw-r--r--sw/source/filter/html/htmlgrin.cxx13
-rw-r--r--sw/source/filter/html/htmlplug.cxx20
-rw-r--r--sw/source/filter/html/swhtml.cxx3
-rw-r--r--sw/source/filter/html/swhtml.hxx2
6 files changed, 41 insertions, 10 deletions
diff --git a/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml b/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml
new file mode 100644
index 000000000000..f31795e35224
--- /dev/null
+++ b/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml
@@ -0,0 +1,4 @@
+<reqif-xhtml:div><reqif-xhtml:br/>
+ <reqif-xhtml:object data="reqif-ole-img.png" type="image/png">OLE Object</reqif-xhtml:object>
+</reqif-xhtml:div>
+
diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx
index f65b0014e799..1fcb66d5e4b7 100644
--- a/sw/qa/extras/htmlexport/htmlexport.cxx
+++ b/sw/qa/extras/htmlexport/htmlexport.cxx
@@ -402,6 +402,15 @@ DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(testReqIfOleImg, "reqif-ole-img.xhtml")
CPPUNIT_ASSERT_EQUAL(OUString("OLE Object"), getProperty<OUString>(xObject, "Title").trim());
}
+DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(testReqIfPngImg, "reqif-png-img.xhtml")
+{
+ uno::Reference<container::XNamed> xShape(getShape(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT(xShape.is());
+
+ // This was Object1, PNG without fallback was imported as OLE object.
+ CPPUNIT_ASSERT_EQUAL(OUString("Image1"), xShape->getName());
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/html/htmlgrin.cxx b/sw/source/filter/html/htmlgrin.cxx
index 3c6d5022bfc0..dfa5f63976a4 100644
--- a/sw/source/filter/html/htmlgrin.cxx
+++ b/sw/source/filter/html/htmlgrin.cxx
@@ -306,6 +306,7 @@ void SwHTMLParser::InsertImage()
// and now analyze
OUString sAltNm, aId, aClass, aStyle, aMap, sHTMLGrfName;
OUString sGrfNm;
+ OUString aGraphicData;
sal_Int16 eVertOri = text::VertOrientation::TOP;
sal_Int16 eHoriOri = text::HoriOrientation::NONE;
bool bWidthProvided=false, bHeightProvided=false;
@@ -344,6 +345,11 @@ void SwHTMLParser::InsertImage()
if( !InternalImgToPrivateURL(sGrfNm) )
sGrfNm = INetURLObject::GetAbsURL( m_sBaseURL, sGrfNm );
break;
+ case HtmlOptionId::DATA:
+ aGraphicData = rOption.GetString();
+ if (!InternalImgToPrivateURL(aGraphicData))
+ aGraphicData = INetURLObject::GetAbsURL(m_sBaseURL, aGraphicData);
+ break;
case HtmlOptionId::ALIGN:
eVertOri =
rOption.GetEnum( aHTMLImgVAlignTable,
@@ -427,6 +433,9 @@ IMAGE_SETEVENT:
}
}
+ if (sGrfNm.isEmpty() && !aGraphicData.isEmpty())
+ sGrfNm = aGraphicData;
+
if( sGrfNm.isEmpty() )
return;
@@ -469,8 +478,10 @@ IMAGE_SETEVENT:
sGrfNm.clear();
}
}
- else if (m_sBaseURL.isEmpty()) // sBaseURL is empty if the source is clipboard
+ else if (m_sBaseURL.isEmpty() || !aGraphicData.isEmpty())
{
+ // sBaseURL is empty if the source is clipboard
+ // aGraphicData is non-empty for <object data="..."> -> not a linked graphic.
if (ERRCODE_NONE == GraphicFilter::GetGraphicFilter().ImportGraphic(aGraphic, aGraphicURL))
sGrfNm.clear();
}
diff --git a/sw/source/filter/html/htmlplug.cxx b/sw/source/filter/html/htmlplug.cxx
index 7ad6b589e2b3..8f39db95bbb4 100644
--- a/sw/source/filter/html/htmlplug.cxx
+++ b/sw/source/filter/html/htmlplug.cxx
@@ -293,7 +293,7 @@ void SwHTMLParser::SetSpace( const Size& rPixSpace,
}
}
-void SwHTMLParser::InsertEmbed()
+bool SwHTMLParser::InsertEmbed()
{
OUString aURL, aType, aName, aAlt, aId, aStyle, aClass;
OUString aData;
@@ -382,6 +382,10 @@ void SwHTMLParser::InsertEmbed()
aCmdLst.Append( rOption.GetTokenString(), rOption.GetString() );
}
+ if (aType == "image/png" && m_aEmbeds.empty())
+ // Toplevel <object> for PNG -> that's an image, not an OLE object.
+ return false;
+
SfxItemSet aItemSet( m_xDoc->GetAttrPool(), m_pCSS1Parser->GetWhichMap() );
SvxCSS1PropertyInfo aPropInfo;
if( HasStyleOptions( aStyle, aId, aClass ) )
@@ -422,7 +426,7 @@ void SwHTMLParser::InsertEmbed()
// do not insert plugin if it has neither URL nor type
bool bHasType = !aType.isEmpty();
if( !bHasURL && !bHasType && !bHasData )
- return;
+ return true;
if (!m_aEmbeds.empty())
{
@@ -431,7 +435,7 @@ void SwHTMLParser::InsertEmbed()
svt::EmbeddedObjectRef& rObj = pOLENode->GetOLEObj().GetObject();
Graphic aGraphic;
if (GraphicFilter::GetGraphicFilter().ImportGraphic(aGraphic, aURLObj) != ERRCODE_NONE)
- return;
+ return true;
rObj.SetGraphic(aGraphic, aType);
@@ -448,7 +452,7 @@ void SwHTMLParser::InsertEmbed()
SwFrameFormat* pFormat = pOLENode->GetFlyFormat();
if (!pFormat)
- return;
+ return true;
SwAttrSet aAttrSet(pFormat->GetAttrSet());
aAttrSet.ClearItem(RES_CNTNT);
@@ -456,7 +460,7 @@ void SwHTMLParser::InsertEmbed()
SwFormatFrameSize aFrameSize(ATT_FIX_SIZE, aTwipSize.Width(), aTwipSize.Height());
aAttrSet.Put(aFrameSize);
pOLENode->GetDoc()->SetFlyFrameAttr(*pFormat, aAttrSet);
- return;
+ return true;
}
// create the plug-in
@@ -559,13 +563,15 @@ void SwHTMLParser::InsertEmbed()
}
if (!bHasData)
- return;
+ return true;
SwOLENode* pOLENode = pNoTextNd->GetOLENode();
if (!pOLENode)
- return;
+ return true;
m_aEmbeds.push(pOLENode);
+
+ return true;
}
#if HAVE_FEATURE_JAVA
diff --git a/sw/source/filter/html/swhtml.cxx b/sw/source/filter/html/swhtml.cxx
index d196c718921e..0b0cecace0f0 100644
--- a/sw/source/filter/html/swhtml.cxx
+++ b/sw/source/filter/html/swhtml.cxx
@@ -1418,7 +1418,8 @@ void SwHTMLParser::NextToken( HtmlTokenId nToken )
case HtmlTokenId::OBJECT_ON:
if (m_bXHTML)
{
- InsertEmbed();
+ if (!InsertEmbed())
+ InsertImage();
break;
}
#if HAVE_FEATURE_JAVA
diff --git a/sw/source/filter/html/swhtml.hxx b/sw/source/filter/html/swhtml.hxx
index 911042defa20..8b9c9505d366 100644
--- a/sw/source/filter/html/swhtml.hxx
+++ b/sw/source/filter/html/swhtml.hxx
@@ -735,7 +735,7 @@ private:
// the actual insert methods for <IMG>, <EMBED>, <APPLET> and <PARAM>
void InsertImage(); // htmlgrin.cxx
- void InsertEmbed(); // htmlplug.cxx
+ bool InsertEmbed(); // htmlplug.cxx
#if HAVE_FEATURE_JAVA
void NewObject(); // htmlplug.cxx