include/svx/srchdlg.hxx | 6 +++++- svx/source/dialog/srchdlg.cxx | 19 ++++++++++++++----- sw/qa/uitest/findReplace/findReplace.py | 5 +++++ 3 files changed, 24 insertions(+), 6 deletions(-)
New commits: commit ac51f1dfb3c63f1d0a3e2577ba5a56c25bc0b94b Author: Stephan Bergmann <[email protected]> AuthorDate: Sun Oct 28 23:28:10 2018 +0100 Commit: Stephan Bergmann <[email protected]> CommitDate: Mon Oct 29 07:56:55 2018 +0100 Avoid SvxSearchController::StateChanged during SvxSearchDialog sub-dialog UITest_findReplace occasionally fails (esp. in slowly-executing builds like the ASan+UBSan one, e.g., <https://ci.libreoffice.org/job/lo_ubsan/1084/>) because the "Find" edit is re-filled with old content while the "Format..." sub-dialog is executing: The SfxBindings::NextJob timer fires from the main thread's Application::Yield, calls SvxSearchController::StateChanged -> SvxSearchDialog::SetItem_Impl -> SvxSearchDialog::Init_Impl, which goes into the > else if (!aSearchStrings.empty()) > { > bool bAttributes = > ( ( pSearchList && pSearchList->Count() ) || > ( pReplaceList && pReplaceList->Count() ) ); > > if ( bSetSearch && !bAttributes ) > m_pSearchLB->SetText(aSearchStrings[0]); code re-filling the "Find" edit (despite it having been cleared programatically), because bAttributes is false because the "Format..." sub- dialog has not yet completed, so pSearchList has not yet been filled (as is done by the handle_format_dlg code in test_find_writer in sw/qa/uitest/findReplace/findReplace.py). (This issue can be triggered rather reliably by adding a sleep > @@ -94,6 +94,7 @@ class findReplace(UITestCase): > xSizeFont.executeAction("BACKSPACE", tuple()) > xSizeFont.executeAction("TYPE", mkPropertyValues({"TEXT":"16"})) #set font size 16 > xOkBtn = dialog.getChild("ok") > + time.sleep(1) > self.ui_test.close_dialog_through_button(xOkBtn) > > self.ui_test.execute_blocking_action(format.executeAction, args=('CLICK', ()), to sw/qa/uitest/findReplace/findReplace.py.) So suppress executing SvxSearchController::StateChanged -> SvxSearchDialog::SetItem_Impl while an SvxSearchDialog sub-dialog is in progress. The open TODO question is whether those state changes should be saved and executed once the sub-dialog has been executed, or whether it is OK to just throw them away (as happens now). Change-Id: I20fb8c8d88c3d3fe8b604718bb289a7421471aa7 Reviewed-on: https://gerrit.libreoffice.org/62489 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <[email protected]> diff --git a/include/svx/srchdlg.hxx b/include/svx/srchdlg.hxx index 440a824c8a55..4b82db88fe7c 100644 --- a/include/svx/srchdlg.hxx +++ b/include/svx/srchdlg.hxx @@ -38,11 +38,11 @@ class SvxSearchItem; class SfxStyleSheetBasePool; class SvxJSearchOptionsPage; class SvxSearchController; +class VclAbstractDialog; struct SearchDlg_Impl; enum class ModifyFlags; enum class TransliterationFlags; - struct SearchAttrItem { sal_uInt16 nSlot; @@ -230,6 +230,8 @@ private: mutable TransliterationFlags nTransliterationFlags; + bool m_executingSubDialog = false; + DECL_LINK( ModifyHdl_Impl, Edit&, void ); DECL_LINK( FlagHdl_Impl, Button*, void ); DECL_LINK( CommandHdl_Impl, Button*, void ); @@ -263,6 +265,8 @@ private: void ApplyTransliterationFlags_Impl( TransliterationFlags nSettings ); bool IsOtherOptionsExpanded(); + + short executeSubDialog(VclAbstractDialog * dialog); }; #endif diff --git a/svx/source/dialog/srchdlg.cxx b/svx/source/dialog/srchdlg.cxx index 18b0ebd47d1f..795df4e6c1b9 100644 --- a/svx/source/dialog/srchdlg.cxx +++ b/svx/source/dialog/srchdlg.cxx @@ -44,6 +44,7 @@ #include <com/sun/star/frame/ModuleManager.hpp> #include <com/sun/star/ui/XUIElement.hpp> #include <comphelper/processfactory.hxx> +#include <comphelper/scopeguard.hxx> #include <svl/itempool.hxx> #include <svl/intitem.hxx> @@ -1423,7 +1424,7 @@ IMPL_LINK( SvxSearchDialog, CommandHdl_Impl, Button *, pBtn, void ) pSearchItem->GetLEVOther(), pSearchItem->GetLEVShorter(), pSearchItem->GetLEVLonger() )); - if ( pDlg->Execute() == RET_OK ) + if ( executeSubDialog(pDlg.get()) == RET_OK ) { pSearchItem->SetLEVRelaxed( pDlg->IsRelaxed() ); pSearchItem->SetLEVOther( pDlg->GetOther() ); @@ -1439,7 +1440,7 @@ IMPL_LINK( SvxSearchDialog, CommandHdl_Impl, Button *, pBtn, void ) SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); ScopedVclPtr<AbstractSvxJSearchOptionsDialog> aDlg(pFact->CreateSvxJSearchOptionsDialog(GetFrameWeld(), aSet, pSearchItem->GetTransliterationFlags() )); - int nRet = aDlg->Execute(); + int nRet = executeSubDialog(aDlg.get()); if (RET_OK == nRet) //! true only if FillItemSet of SvxJSearchOptionsPage returns true { TransliterationFlags nFlags = aDlg->GetTransliterationFlags(); @@ -1917,7 +1918,8 @@ void SvxSearchDialog::EnableControl_Impl( Control const * pCtrl ) void SvxSearchDialog::SetItem_Impl( const SvxSearchItem* pItem ) { - if ( pItem ) + //TODO: save pItem and process later if m_executingSubDialog? + if ( pItem && !m_executingSubDialog ) { pSearchItem.reset(static_cast<SvxSearchItem*>(pItem->Clone())); Init_Impl( pSearchItem->GetPattern() && @@ -2041,7 +2043,7 @@ IMPL_LINK_NOARG(SvxSearchDialog, FormatHdl_Impl, Button*, void) ScopedVclPtr<SfxAbstractTabDialog> pDlg(pFact->CreateTabItemDialog(GetFrameWeld(), aSet)); pDlg->SetText( aTxt ); - if ( pDlg->Execute() == RET_OK ) + if ( executeSubDialog(pDlg.get()) == RET_OK ) { DBG_ASSERT( pDlg->GetOutputItemSet(), "invalid Output-Set" ); SfxItemSet aOutSet( *pDlg->GetOutputItemSet() ); @@ -2132,7 +2134,7 @@ IMPL_LINK_NOARG(SvxSearchDialog, AttributeHdl_Impl, Button*, void) SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateSvxSearchAttributeDialog( this, *pSearchList, pImpl->pRanges.get() )); - pDlg->Execute(); + executeSubDialog(pDlg.get()); PaintAttrText_Impl(); } @@ -2376,6 +2378,13 @@ css::uno::Reference< css::awt::XWindowPeer > return xPeer; } +short SvxSearchDialog::executeSubDialog(VclAbstractDialog * dialog) { + assert(!m_executingSubDialog); + comphelper::ScopeGuard g([this] { m_executingSubDialog = false; }); + m_executingSubDialog = true; + return dialog->Execute(); +} + SFX_IMPL_CHILDWINDOW_WITHID(SvxSearchDialogWrapper, SID_SEARCH_DLG); diff --git a/sw/qa/uitest/findReplace/findReplace.py b/sw/qa/uitest/findReplace/findReplace.py index 87a1ae17f147..213e47d6c372 100644 --- a/sw/qa/uitest/findReplace/findReplace.py +++ b/sw/qa/uitest/findReplace/findReplace.py @@ -99,6 +99,11 @@ class findReplace(UITestCase): self.ui_test.execute_blocking_action(format.executeAction, args=('CLICK', ()), dialog_handler=handle_format_dlg) + # Verify these didn't get set again through SvxSearchController::StateChanged, timer- + # triggered from SfxBindings::NextJob while executing the Format dialog above: + self.assertEqual(get_state_as_dict(searchterm)["Text"], "") + self.assertEqual(get_state_as_dict(replaceterm)["Text"], "") + xsearch = xDialog.getChild("search") xsearch.executeAction("CLICK", tuple()) #verify _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
