Kaydet (Commit) a0ef7474 authored tarafından Kohei Yoshida's avatar Kohei Yoshida Kaydeden (comit) Kohei Yoshida

tdf#71409: Use weak reference to avoid potential circular references.

AtkListener shouldn't be holding a reference back to the context /
broadcaster it listens to, as the latter also holds a reference to
the former.

Change-Id: Ie75cc4667f614752db710c20acbb83b93783654f
Reviewed-on: https://gerrit.libreoffice.org/31063Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarKohei Yoshida <libreoffice@kohei.us>
üst e010834d
......@@ -48,14 +48,11 @@ static css::uno::Reference<css::accessibility::XAccessibleAction>
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( action );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpAction.is() )
{
pWrap->mpAction.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpAction;
uno::Reference<accessibility::XAccessibleAction> xAction(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAction;
}
return css::uno::Reference<css::accessibility::XAccessibleAction>();
......
......@@ -27,14 +27,11 @@ static css::uno::Reference<css::accessibility::XAccessibleComponent>
getComponent( AtkComponent *pComponent ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pComponent );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpComponent.is() )
{
pWrap->mpComponent.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpComponent;
uno::Reference<accessibility::XAccessibleComponent> xComp(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xComp;
}
return css::uno::Reference<css::accessibility::XAccessibleComponent>();
......
......@@ -31,14 +31,11 @@ static css::uno::Reference<css::accessibility::XAccessibleEditableText>
getEditableText( AtkEditableText *pEditableText ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pEditableText );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpEditableText.is() )
{
pWrap->mpEditableText.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpEditableText;
uno::Reference<accessibility::XAccessibleEditableText> xET(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xET;
}
return css::uno::Reference<css::accessibility::XAccessibleEditableText>();
......
......@@ -193,14 +193,11 @@ static css::uno::Reference<css::accessibility::XAccessibleHypertext>
getHypertext( AtkHypertext *pHypertext ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pHypertext );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpHypertext.is() )
{
pWrap->mpHypertext.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpHypertext;
uno::Reference<accessibility::XAccessibleHypertext> xAH(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAH;
}
return css::uno::Reference<css::accessibility::XAccessibleHypertext>();
......
......@@ -39,14 +39,11 @@ static css::uno::Reference<css::accessibility::XAccessibleImage>
getImage( AtkImage *pImage ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pImage );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpImage.is() )
{
pWrap->mpImage.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpImage;
uno::Reference<accessibility::XAccessibleImage> xAI(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAI;
}
return css::uno::Reference<css::accessibility::XAccessibleImage>();
......
......@@ -27,14 +27,11 @@ static css::uno::Reference<css::accessibility::XAccessibleSelection>
getSelection( AtkSelection *pSelection ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pSelection );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpSelection.is() )
{
pWrap->mpSelection.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpSelection;
uno::Reference<accessibility::XAccessibleSelection> xAS(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAS;
}
return css::uno::Reference<css::accessibility::XAccessibleSelection>();
......
......@@ -52,14 +52,11 @@ static css::uno::Reference<css::accessibility::XAccessibleTable>
getTable( AtkTable *pTable ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pTable );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpTable.is() )
{
pWrap->mpTable.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpTable;
uno::Reference<accessibility::XAccessibleTable> xAT(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAT;
}
return css::uno::Reference<css::accessibility::XAccessibleTable>();
......
......@@ -137,14 +137,11 @@ static css::uno::Reference<css::accessibility::XAccessibleText>
getText( AtkText *pText ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpText.is() )
{
pWrap->mpText.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpText;
uno::Reference<accessibility::XAccessibleText> xAT(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAT;
}
return css::uno::Reference<css::accessibility::XAccessibleText>();
......@@ -156,14 +153,11 @@ static css::uno::Reference<css::accessibility::XAccessibleTextMarkup>
getTextMarkup( AtkText *pText ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpTextMarkup.is() )
{
pWrap->mpTextMarkup.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpTextMarkup;
uno::Reference<accessibility::XAccessibleTextMarkup> xATM(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xATM;
}
return css::uno::Reference<css::accessibility::XAccessibleTextMarkup>();
......@@ -175,14 +169,11 @@ static css::uno::Reference<css::accessibility::XAccessibleTextAttributes>
getTextAttributes( AtkText *pText ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpTextAttributes.is() )
{
pWrap->mpTextAttributes.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpTextAttributes;
uno::Reference<accessibility::XAccessibleTextAttributes> xATA(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xATA;
}
return css::uno::Reference<css::accessibility::XAccessibleTextAttributes>();
......@@ -194,14 +185,11 @@ static css::uno::Reference<css::accessibility::XAccessibleMultiLineText>
getMultiLineText( AtkText *pText ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpMultiLineText.is() )
{
pWrap->mpMultiLineText.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpMultiLineText;
uno::Reference<accessibility::XAccessibleMultiLineText> xAML(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAML;
}
return css::uno::Reference<css::accessibility::XAccessibleMultiLineText>();
......
......@@ -211,14 +211,11 @@ static css::uno::Reference<css::accessibility::XAccessibleComponent>
getComponent( AtkText *pText ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpComponent.is() )
{
pWrap->mpComponent.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpComponent;
uno::Reference<accessibility::XAccessibleComponent> xAC(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAC;
}
return css::uno::Reference<css::accessibility::XAccessibleComponent>();
......
......@@ -86,12 +86,15 @@ atk_wrapper_focus_idle_handler (gpointer data)
// also emit state-changed:focused event under the same condition.
{
AtkObjectWrapper* wrapper_obj = ATK_OBJECT_WRAPPER (atk_obj);
if( wrapper_obj && !wrapper_obj->mpText.is() )
if (wrapper_obj)
{
wrapper_obj->mpText.set(wrapper_obj->mpContext, css::uno::UNO_QUERY);
if ( wrapper_obj->mpText.is() )
uno::Reference<accessibility::XAccessibleText> xText(
wrapper_obj->mpContext.get(), uno::UNO_QUERY);
if (xText.is())
{
gint caretPos = wrapper_obj->mpText->getCaretPosition();
gint caretPos = xText->getCaretPosition();
if ( caretPos != -1 )
{
......
......@@ -29,14 +29,11 @@ static css::uno::Reference<css::accessibility::XAccessibleValue>
getValue( AtkValue *pValue ) throw (uno::RuntimeException)
{
AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pValue );
if( pWrap )
if (pWrap)
{
if( !pWrap->mpValue.is() )
{
pWrap->mpValue.set(pWrap->mpContext, css::uno::UNO_QUERY);
}
return pWrap->mpValue;
uno::Reference<accessibility::XAccessibleValue> xAV(
pWrap->mpContext.get(), uno::UNO_QUERY);
return xAV;
}
return css::uno::Reference<css::accessibility::XAccessibleValue>();
......
This diff is collapsed.
......@@ -22,49 +22,19 @@
#include <atk/atk.h>
#include <com/sun/star/accessibility/XAccessible.hpp>
#include <cppuhelper/weakref.hxx>
extern "C" {
namespace com { namespace sun { namespace star { namespace accessibility {
class XAccessibleAction;
class XAccessibleComponent;
class XAccessibleEditableText;
class XAccessibleHypertext;
class XAccessibleImage;
class XAccessibleMultiLineText;
class XAccessibleSelection;
class XAccessibleTable;
class XAccessibleText;
class XAccessibleTextMarkup;
class XAccessibleTextAttributes;
class XAccessibleValue;
} } } }
struct AtkObjectWrapper
{
AtkObject aParent;
css::uno::Reference<css::accessibility::XAccessible> mpAccessible;
css::uno::Reference<css::accessibility::XAccessibleContext> mpContext;
css::uno::Reference<css::accessibility::XAccessibleAction> mpAction;
css::uno::Reference<css::accessibility::XAccessibleComponent> mpComponent;
css::uno::Reference<css::accessibility::XAccessibleEditableText>
mpEditableText;
css::uno::Reference<css::accessibility::XAccessibleHypertext> mpHypertext;
css::uno::Reference<css::accessibility::XAccessibleImage> mpImage;
css::uno::Reference<css::accessibility::XAccessibleMultiLineText>
mpMultiLineText;
css::uno::Reference<css::accessibility::XAccessibleSelection> mpSelection;
css::uno::Reference<css::accessibility::XAccessibleTable> mpTable;
css::uno::Reference<css::accessibility::XAccessibleText> mpText;
css::uno::Reference<css::accessibility::XAccessibleTextMarkup> mpTextMarkup;
css::uno::Reference<css::accessibility::XAccessibleTextAttributes>
mpTextAttributes;
css::uno::Reference<css::accessibility::XAccessibleValue> mpValue;
css::uno::WeakReference<css::accessibility::XAccessibleContext> mpContext;
AtkObject *child_about_to_be_removed;
gint index_of_child_about_to_be_removed;
// OString * m_pKeyBindings
};
struct AtkObjectWrapperClass
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment