diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2017-01-04 11:58:19 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2017-01-04 12:11:20 +0100 |
commit | 1677faabbf7ae56e233205251b78b77d28937c35 (patch) | |
tree | 9ae0df17a5d43edbc471c0167c0116e84423cc42 /qadevOOo/tests/java/mod | |
parent | 49f3dc55dd4a425a45fdd2b86d285e616559f366 (diff) |
SwXAutoTextEntry needs a disposal protocol
SwXAutoTextEntry::GetBodyText calls SwGlossaries::EditGroupDoc to create a
Sw[Web]GlosDocShell (which it then stores in xDocSh), and there must be a call
to that shell's DoClose to clean up its resources. However, if a reference to
the SwXAutoTextEntry is still held during XDesktop::terminate (as can happen in
JunitTest_sw_unoapi_1, where such a reference is held from Java, thus
arbitrarily delaying destruction of the SwXAutoTextEntry until the JVM does GC),
SwXAutoTextEntry::Notify's PrepareCloseDoc case will release xDocSh without
calling DoClose, so an eventual ~SwXAutoTextEntry will not call DoClose either.
(And calling DoClose from withing SwXAutoTextEntry::Notify would cause a crash,
as it would destroy the SwGlosDocShell recursively from within its
SfxBroadcaster::Broadcast call.)
So introduce a disposal protocol for XAutoTextEntry and call it at least in the
place that caused the resource leak in JunitTest_sw_unoapi_1. For lack of a
better inerface, reuse css.lang.XComponent for that protocol, even though this
scenario doesn't involve breaking cyclic references among UNO objects caused by
listener patterns.
Change-Id: Id6501b84e562950e40b83e0b1afd1b3184807856
Diffstat (limited to 'qadevOOo/tests/java/mod')
-rw-r--r-- | qadevOOo/tests/java/mod/_sw/SwXAutoTextEntry.java | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/qadevOOo/tests/java/mod/_sw/SwXAutoTextEntry.java b/qadevOOo/tests/java/mod/_sw/SwXAutoTextEntry.java index 188307e83ed6..30a7ada714c1 100644 --- a/qadevOOo/tests/java/mod/_sw/SwXAutoTextEntry.java +++ b/qadevOOo/tests/java/mod/_sw/SwXAutoTextEntry.java @@ -87,11 +87,17 @@ public class SwXAutoTextEntry extends TestCase { try { if ( oGroup.hasByName("NewEntryName") ) { log.println("Removing 'NewEntryName' element"); + ((com.sun.star.lang.XComponent) AnyConverter.toObject( + new Type(com.sun.star.lang.XComponent.class), + oGroup.getByName("NewEntryName"))).dispose(); oGroup.removeByName("NewEntryName"); } } catch ( com.sun.star.container.NoSuchElementException e ) { log.println("Cannot remove TextEntry from group..."); e.printStackTrace(log); + } catch ( com.sun.star.lang.WrappedTargetException e ) { + log.println("Cannot remove TextEntry from group..."); + e.printStackTrace(log); } log.println( "disposing xTextDoc " ); util.DesktopTools.closeDoc(xTextDoc); |