diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-03-08 09:03:39 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-03-08 10:01:00 +0100 |
commit | 078c00e3a3c971ac83154948d5f08462532b9dc6 (patch) | |
tree | 684b2621c33ec8ef7c410bc48f5b40237786d10e /sw | |
parent | fcd8844cb01722fbc09a9947440912bf57b1b6c7 (diff) |
tdf#97601 sw: don't mark an already modified chart as modified
Regression from commit e2b260fc98e833d4e64426b90992094f2da0498c (sw: let
layout not mark embedded object as modified, 2014-06-03), an infinite
loop was caused by:
1) SwDoc::SetOLEObjModified() triggering the maOLEModifiedIdle Idle
2) which at the end called SwWrtShell::CalcAndSetScale()
3) which at the end called chart::ChartModel::setModified()
4) where chart code called back into SwDoc::SetOLEObjModified() via the
modification listener, and this happened again and again.
The original fix wanted to avoid marking the document as modified
without a user interaction, so fix the bug by only calling setModified()
if it prevents a not-modified -> modified transition. This keeps the
original bug fixed, but prevents the infinite loop, that is always a
modified -> modified transition.
Change-Id: I3b56a91afaacd3e0b7cb646a492fd15f1b5168ee
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/uiwriter/data/tdf97601.odt | bin | 0 -> 14942 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter.cxx | 28 | ||||
-rw-r--r-- | sw/source/uibase/wrtsh/wrtsh1.cxx | 4 |
3 files changed, 30 insertions, 2 deletions
diff --git a/sw/qa/extras/uiwriter/data/tdf97601.odt b/sw/qa/extras/uiwriter/data/tdf97601.odt Binary files differnew file mode 100644 index 000000000000..d3995f261284 --- /dev/null +++ b/sw/qa/extras/uiwriter/data/tdf97601.odt diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index a7e925370552..96e8cd597a9f 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -81,6 +81,8 @@ #include "com/sun/star/beans/PropertyAttribute.hpp" #include "com/sun/star/text/XTextField.hpp" #include "com/sun/star/text/TextMarkupType.hpp" +#include <com/sun/star/chart2/data/XDataSource.hpp> +#include <com/sun/star/document/XEmbeddedObjectSupplier2.hpp> #include <osl/file.hxx> #include <paratr.hxx> #include <drawfont.hxx> @@ -154,6 +156,7 @@ public: void testTdf80663(); void testTdf57197(); void testTdf90808(); + void testTdf97601(); void testTdf75137(); void testTdf83798(); void testTdf89714(); @@ -243,6 +246,7 @@ public: CPPUNIT_TEST(testTdf80663); CPPUNIT_TEST(testTdf57197); CPPUNIT_TEST(testTdf90808); + CPPUNIT_TEST(testTdf97601); CPPUNIT_TEST(testTdf75137); CPPUNIT_TEST(testTdf83798); CPPUNIT_TEST(testTdf89714); @@ -2387,6 +2391,30 @@ void SwUiWriterTest::testTdf90808() CPPUNIT_ASSERT_THROW(xText->insertTextContent(xCursor, xNumBookmark2, true), css::lang::IllegalArgumentException); } +void SwUiWriterTest::testTdf97601() +{ + // Instructions from the bugreport to trigger an infinite loop. + createDoc("tdf97601.odt"); + uno::Reference<text::XTextEmbeddedObjectsSupplier> xEmbeddedObjectsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xEmbeddedObjects = xEmbeddedObjectsSupplier->getEmbeddedObjects(); + uno::Reference<beans::XPropertySet> xChart; + xEmbeddedObjects->getByName("myChart") >>= xChart; + uno::Reference<chart2::data::XDataSource> xChartComponent; + xChart->getPropertyValue("Component") >>= xChartComponent; + uno::Sequence< uno::Reference<chart2::data::XLabeledDataSequence> > aDataSequences = xChartComponent->getDataSequences(); + uno::Reference<document::XEmbeddedObjectSupplier2> xChartState(xChart, uno::UNO_QUERY); + xChartState->getExtendedControlOverEmbeddedObject()->changeState(1); + uno::Reference<util::XModifiable> xDataSequenceModifiable(aDataSequences[2]->getValues(), uno::UNO_QUERY); + xDataSequenceModifiable->setModified(true); + + // Make sure that the chart is marked as modified. + uno::Reference<util::XModifiable> xModifiable(xChartComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xModifiable->isModified())); + calcLayout(); + // This never returned. + Scheduler::ProcessEventsToIdle(); +} + void SwUiWriterTest::testTdf75137() { SwDoc* pDoc = createDoc(); diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx b/sw/source/uibase/wrtsh/wrtsh1.cxx index 6a089eccc51f..675a4609cbca 100644 --- a/sw/source/uibase/wrtsh/wrtsh1.cxx +++ b/sw/source/uibase/wrtsh/wrtsh1.cxx @@ -656,7 +656,7 @@ void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj, aSz.Width = aSize.Width(); aSz.Height = aSize.Height(); - // Action 'setVisualAreaSize' doesn't have to change the + // Action 'setVisualAreaSize' doesn't have to turn on the // modified state of the document, either. bool bModified = false; uno::Reference<util::XModifiable> xModifiable(xObj->getComponent(), uno::UNO_QUERY); @@ -664,7 +664,7 @@ void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj, bModified = xModifiable->isModified(); xObj->setVisualAreaSize( nAspect, aSz ); xModifiable.set(xObj->getComponent(), uno::UNO_QUERY); - if (xModifiable.is()) + if (xModifiable.is() && xModifiable->isModified() && !bModified) xModifiable->setModified(bModified); // #i48419# - action 'UpdateReplacement' doesn't |