Kaydet (Commit) 6f1e77fc authored tarafından Stephan Bergmann's avatar Stephan Bergmann Kaydeden (comit) Eike Rathke

rhbz#1264753: Avoid this being release()ed to 0 in ScAccessibleDocument ctor

...where the most plausible explanation for the bug's crash from within
ScGridWindow::CreateAccessible appears to be that the call to

  xAcc = new ScAccessibleEditObject(this, ...)

which stores "this" as a css::uno::Reference in the ScAccessibleEditObject, can
cause xAcc to be deleted synchronously from within the ScAccessibleDocument
ctor, causing the ScAccessibleDocument instance itself to also be deleted.

So re-use the existing ScAccessibleDocument::Init (already properly called at
the only place that instantiates ScAccessibleDocument, in
ScGridWindow::CreateAccessible) to defer any initialization that uses "this",
and hope that the resulting slight re-ordering of when certain initialization
code is executed does not cause problems.

Change-Id: I524a1659394e8900b7d33de358fdd4baf647c083
Reviewed-on: https://gerrit.libreoffice.org/18750Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
Tested-by: 's avatarEike Rathke <erack@redhat.com>
üst 62b39a7c
...@@ -1412,10 +1412,15 @@ ScAccessibleDocument::ScAccessibleDocument( ...@@ -1412,10 +1412,15 @@ ScAccessibleDocument::ScAccessibleDocument(
mpTempAccEdit(NULL), mpTempAccEdit(NULL),
mbCompleteSheetSelected(false) mbCompleteSheetSelected(false)
{ {
if (pViewShell) maVisArea = GetVisibleArea_Impl();
}
void ScAccessibleDocument::Init()
{
if (mpViewShell)
{ {
pViewShell->AddAccessibilityObject(*this); mpViewShell->AddAccessibilityObject(*this);
vcl::Window *pWin = pViewShell->GetWindowByPos(eSplitPos); vcl::Window *pWin = mpViewShell->GetWindowByPos(meSplitPos);
if( pWin ) if( pWin )
{ {
pWin->AddChildEventListener( LINK( this, ScAccessibleDocument, WindowChildEventListener )); pWin->AddChildEventListener( LINK( this, ScAccessibleDocument, WindowChildEventListener ));
...@@ -1428,20 +1433,15 @@ ScAccessibleDocument::ScAccessibleDocument( ...@@ -1428,20 +1433,15 @@ ScAccessibleDocument::ScAccessibleDocument(
AddChild( pChildWin->GetAccessible(), false ); AddChild( pChildWin->GetAccessible(), false );
} }
} }
ScViewData& rViewData = pViewShell->GetViewData(); ScViewData& rViewData = mpViewShell->GetViewData();
if (rViewData.HasEditView(eSplitPos)) if (rViewData.HasEditView(meSplitPos))
{ {
uno::Reference<XAccessible> xAcc = new ScAccessibleEditObject(this, rViewData.GetEditView(eSplitPos), uno::Reference<XAccessible> xAcc = new ScAccessibleEditObject(this, rViewData.GetEditView(meSplitPos),
pViewShell->GetWindowByPos(eSplitPos), GetCurrentCellName(), GetCurrentCellDescription(), mpViewShell->GetWindowByPos(meSplitPos), GetCurrentCellName(), GetCurrentCellDescription(),
ScAccessibleEditObject::CellInEditMode); ScAccessibleEditObject::CellInEditMode);
AddChild(xAcc, false); AddChild(xAcc, false);
} }
} }
maVisArea = GetVisibleArea_Impl();
}
void ScAccessibleDocument::Init()
{
if(!mpChildrenShapes) if(!mpChildrenShapes)
mpChildrenShapes = new ScChildrenShapes(this, mpViewShell, meSplitPos); mpChildrenShapes = new ScChildrenShapes(this, mpViewShell, meSplitPos);
} }
......
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