Accepting request 347006 from LibreOffice:5.0

sync with LibreOffice:5.0 (fix of bnc#954345)

OBS-URL: https://build.opensuse.org/request/show/347006
OBS-URL: https://build.opensuse.org/package/show/LibreOffice:Factory/libreoffice?expand=0&rev=347
This commit is contained in:
Tomáš Chvátal 2015-12-01 13:58:15 +00:00 committed by Git OBS Bridge
parent 48ba5a8218
commit 8bff711798
3 changed files with 167 additions and 2 deletions

156
bnc-954345.diff Normal file
View File

@ -0,0 +1,156 @@
From 611be3d78d45c46c942b88e1149dfc428070fc71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?=
<laszlo.nemeth@collabora.com>
Date: Fri, 27 Nov 2015 21:59:30 +0100
Subject: [PATCH] tdf#95614 fix freezing with linked graphic
When an unloaded linked picture comes into the visible view
(including repainting a page), SwNoTextFrm::PaintPicture()
starts a thread to load it in the background using the
TriggerAsyncRetrieveInputStream() method of the graphic node.
To avoid to start a second thread on the same graphic node,
TriggerAsyncRetrieveInputStream() checks mpThreadConsumer,
the graphic node member variable for the possible thread object.
The problem is that when the thread finished and
SwGrfNode::UpdateLinkWithInputStream() reset mpThreadConsumer,
the graphic object of the graphic node is still in unloaded
state (its type is GRAPHIC_DEFAULT or GRAPHIC_NONE instead of
GRAPHIC_BITMAP or GRAPHIC_GDIMETAFILE) for a while, because
its modification is solved asynchronously after several
SvFileObject::GetData() calls. In the intermediate state
of the graphic object, with the high priority repaints of
the new scheduler, PaintPicture() could start new thread
to load the image again.
Using the new member variable SwGrfNode::mbUpdateLinkInProgress,
this patch will prevent the graphic node to start newer thread
unnecessarily.
Change-Id: I9433f0fa4613294103a00a3955fc2f35d8863b59
---
sw/inc/ndgrf.hxx | 3 +++
sw/source/core/doc/notxtfrm.cxx | 15 ++++++++++-----
sw/source/core/graphic/ndgrf.cxx | 7 +++++--
3 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/sw/inc/ndgrf.hxx b/sw/inc/ndgrf.hxx
index 668c5f5..e7b2261 100644
--- a/sw/inc/ndgrf.hxx
+++ b/sw/inc/ndgrf.hxx
@@ -51,6 +51,7 @@ class SW_DLLPUBLIC SwGrfNode: public SwNoTextNode
boost::shared_ptr< SwAsyncRetrieveInputStreamThreadConsumer > mpThreadConsumer;
bool mbLinkedInputStreamReady;
+ bool mbUpdateLinkInProgress;
com::sun::star::uno::Reference<com::sun::star::io::XInputStream> mxInputStream;
bool mbIsStreamReadOnly;
@@ -198,6 +199,8 @@ public:
boost::weak_ptr< SwAsyncRetrieveInputStreamThreadConsumer > GetThreadConsumer() { return mpThreadConsumer;}
bool IsLinkedInputStreamReady() const { return mbLinkedInputStreamReady;}
+ bool IsUpdateLinkInProgress() const { return mbUpdateLinkInProgress;}
+ void SetUpdateLinkInProgress(bool b) { mbUpdateLinkInProgress = b; }
void TriggerAsyncRetrieveInputStream();
void ApplyInputStream(
com::sun::star::uno::Reference<com::sun::star::io::XInputStream> xInputStream,
diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index 02a815b..d943e6d 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -897,10 +897,11 @@ void SwNoTextFrm::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfArea
{
Size aTmpSz;
::sfx2::SvLinkSource* pGrfObj = pGrfNd->GetLink()->GetObj();
- if( !pGrfObj ||
- !pGrfObj->IsDataComplete() ||
- !(aTmpSz = pGrfNd->GetTwipSize()).Width() ||
- !aTmpSz.Height() || !pGrfNd->GetAutoFormatLvl() )
+ if ( ( !pGrfObj ||
+ !pGrfObj->IsDataComplete() ||
+ !(aTmpSz = pGrfNd->GetTwipSize()).Width() ||
+ !aTmpSz.Height() || !pGrfNd->GetAutoFormatLvl() ) &&
+ !pGrfNd->IsUpdateLinkInProgress() )
{
pGrfNd->TriggerAsyncRetrieveInputStream(); // #i73788#
}
@@ -909,9 +910,13 @@ void SwNoTextFrm::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfArea
GetRealURL( *pGrfNd, aText );
::lcl_PaintReplacement( aAlignedGrfArea, aText, *pShell, this, false );
bContinue = false;
+ } else if ( rGrfObj.GetType() != GRAPHIC_DEFAULT &&
+ rGrfObj.GetType() != GRAPHIC_NONE &&
+ pGrfNd->IsUpdateLinkInProgress() )
+ {
+ pGrfNd->SetUpdateLinkInProgress( false );
}
}
-
if( bContinue )
{
if( rGrfObj.GetGraphic().IsSupportedGraphic())
diff --git a/sw/source/core/graphic/ndgrf.cxx b/sw/source/core/graphic/ndgrf.cxx
index 5c2867e..dbbe379 100644
--- a/sw/source/core/graphic/ndgrf.cxx
+++ b/sw/source/core/graphic/ndgrf.cxx
@@ -71,6 +71,7 @@ SwGrfNode::SwGrfNode(
mpReplacementGraphic(0),
// #i73788#
mbLinkedInputStreamReady( false ),
+ mbUpdateLinkInProgress( false ),
mbIsStreamReadOnly( false )
{
maGrfObj.SetSwapStreamHdl( LINK(this, SwGrfNode, SwapGraphic) );
@@ -89,6 +90,7 @@ SwGrfNode::SwGrfNode( const SwNodeIndex & rWhere,
mpReplacementGraphic(0),
// #i73788#
mbLinkedInputStreamReady( false ),
+ mbUpdateLinkInProgress( false ),
mbIsStreamReadOnly( false )
{
maGrfObj.SetSwapStreamHdl( LINK(this, SwGrfNode, SwapGraphic) );
@@ -112,6 +114,7 @@ SwGrfNode::SwGrfNode( const SwNodeIndex & rWhere,
mpReplacementGraphic(0),
// #i73788#
mbLinkedInputStreamReady( false ),
+ mbUpdateLinkInProgress( false ),
mbIsStreamReadOnly( false )
{
maGrfObj.SetSwapStreamHdl( LINK(this, SwGrfNode, SwapGraphic) );
@@ -521,7 +524,6 @@ bool SwGrfNode::SwapIn( bool bWaitForData )
bool bRet = false;
bInSwapIn = true;
SwBaseLink* pLink = static_cast<SwBaseLink*>((::sfx2::SvBaseLink*) refLink);
-
if( pLink )
{
if( GRAPHIC_NONE == maGrfObj.GetType() ||
@@ -1089,7 +1091,6 @@ void SwGrfNode::TriggerAsyncRetrieveInputStream()
OSL_FAIL( "<SwGrfNode::TriggerAsyncLoad()> - Method is misused. Method call is only valid for graphic nodes, which refer a linked graphic file" );
return;
}
-
if ( mpThreadConsumer.get() == 0 )
{
mpThreadConsumer.reset( new SwAsyncRetrieveInputStreamThreadConsumer( *this ) );
@@ -1104,6 +1105,7 @@ void SwGrfNode::TriggerAsyncRetrieveInputStream()
}
mpThreadConsumer->CreateThread( sGrfNm, sReferer );
}
+
}
@@ -1137,6 +1139,7 @@ void SwGrfNode::UpdateLinkWithInputStream()
// #i88291#
mxInputStream.clear();
GetLink()->clearStreamToLoadFrom();
+ mbUpdateLinkInProgress = true;
mbLinkedInputStreamReady = false;
mpThreadConsumer.reset();
}
--
2.1.4

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Tue Dec 1 13:25:35 UTC 2015 - andras.timar@collabora.com
- bnc#954345 - LO-L3: Insert-->Image-->Insert as Link hangs writer
* bnc-954345.diff
-------------------------------------------------------------------
Mon Nov 9 09:12:03 UTC 2015 - tchvatal@suse.com
@ -74,7 +80,7 @@ Mon Sep 21 08:55:05 UTC 2015 - tchvatal@suse.com
bnc#936188 CVE-2015-5212, bnc#934423 CVE-2015-45513,
bnc#934423 CVE-2015-4551, bnc#910805 CVE-2014-8146,
bnc#940838 CVE-2015-5214, bnc#936190 CVE-2015-5213,
bnc#936188 CVE-2015-5212, bnc#934423 CVE-2015-4551
bnc#936188 CVE-2015-5212, bnc#934423 CVE-2015-4551
-------------------------------------------------------------------
Thu Sep 17 13:27:07 UTC 2015 - tchvatal@suse.com
@ -342,7 +348,7 @@ Wed Apr 15 11:42:37 UTC 2015 - tchvatal@suse.com
-------------------------------------------------------------------
Tue Apr 14 13:49:22 UTC 2015 - tchvatal@suse.com
- Hopefully fix bnc#913042.Redo check phase that sometimes broke
- Hopefully fix bnc#913042.Redo check phase that sometimes broke
.jar generating
-------------------------------------------------------------------

View File

@ -175,6 +175,8 @@ Patch10: bnc-889755.diff
Patch11: bnc-679938.diff
# PATCH-FIX-UPSTREAM: taken from Master to fix flaky test
Patch12: use-long-for-test-comparsion.patch
# bnc#954345 - LO-L3: Insert-->Image-->Insert as Link hangs writer
Patch13: bnc-954345.diff
# try to save space by using hardlinks
Patch990: install-with-hardlinks.diff
BuildRequires: %{name}-share-linker
@ -1005,6 +1007,7 @@ Provides additional %{langname} translations and resources for %{project}. \
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch990 -p1
# 256x256 icons
tar -xjf %{SOURCE20}