summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/test/a11y/accessibletestbase.hxx5
-rw-r--r--sw/qa/extras/accessibility/dialogs.cxx28
-rw-r--r--test/qa/cppunit/dialog.cxx8
-rw-r--r--test/source/a11y/accessibletestbase.cxx43
4 files changed, 51 insertions, 33 deletions
diff --git a/include/test/a11y/accessibletestbase.hxx b/include/test/a11y/accessibletestbase.hxx
index 0048edcd8589..5f5fb54aff4b 100644
--- a/include/test/a11y/accessibletestbase.hxx
+++ b/include/test/a11y/accessibletestbase.hxx
@@ -183,14 +183,11 @@ protected:
/* Dialog handling */
class Dialog : public test::EventPosterHelper
{
- friend class AccessibleTestBase;
-
private:
bool mbAutoClose;
- Dialog(vcl::Window* pWindow, bool bAutoClose = true);
-
public:
+ Dialog(vcl::Window* pWindow, bool bAutoClose = true);
virtual ~Dialog();
void setAutoClose(bool bAutoClose) { mbAutoClose = bAutoClose; }
diff --git a/sw/qa/extras/accessibility/dialogs.cxx b/sw/qa/extras/accessibility/dialogs.cxx
index 13c2fd0cb750..e6e3ac84c068 100644
--- a/sw/qa/extras/accessibility/dialogs.cxx
+++ b/sw/qa/extras/accessibility/dialogs.cxx
@@ -17,8 +17,8 @@
using namespace css;
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(_WIN32) && !defined(MACOSX)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestSpecialCharactersDialog)
{
load(u"private:factory/swriter");
@@ -64,8 +64,8 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestSpecialCharactersDialo
}
#endif
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(_WIN32) && !defined(MACOSX)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
/* checks for the fix from https://gerrit.libreoffice.org/c/core/+/147660 */
CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestSpecialCharactersDialogFocus)
{
@@ -98,8 +98,8 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestSpecialCharactersDialogFocu
}
#endif
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(_WIN32) && !defined(MACOSX)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestHyperlinkDialog)
{
load(u"private:factory/swriter");
@@ -125,8 +125,8 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestHyperlinkDialog)
}
#endif
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(_WIN32) && !defined(MACOSX)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestBookmarkDialog)
{
load(u"private:factory/swriter");
@@ -152,8 +152,8 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestBookmarkDialog)
}
#endif
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(_WIN32) && !defined(MACOSX)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestSectionDialog)
{
load(u"private:factory/swriter");
@@ -173,8 +173,8 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestSectionDialog)
}
#endif
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(_WIN32) && !defined(MACOSX)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFontworkDialog)
{
load(u"private:factory/swriter");
@@ -197,8 +197,8 @@ CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFontworkDialog)
}
#endif
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(_WIN32) && !defined(MACOSX)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFrameDialog)
{
load(u"private:factory/swriter");
diff --git a/test/qa/cppunit/dialog.cxx b/test/qa/cppunit/dialog.cxx
index c3f68a8f0e4e..0e188d52aa85 100644
--- a/test/qa/cppunit/dialog.cxx
+++ b/test/qa/cppunit/dialog.cxx
@@ -9,8 +9,8 @@
#include <test/a11y/accessibletestbase.hxx>
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(MACOSX) && !defined(_WIN32)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
/* Checks an unexpected dialog opening (instead of the expected one) is properly caught, as it would
* otherwise block the test potentially indefinitely */
CPPUNIT_TEST_FIXTURE(test::AccessibleTestBase, SelfTestIncorrectDialog)
@@ -29,8 +29,8 @@ CPPUNIT_TEST_FIXTURE(test::AccessibleTestBase, SelfTestIncorrectDialog)
}
#endif
-// FIXME: dialog doesn't pop up on macos and doesn't close on win32...
-#if !defined(MACOSX) && !defined(_WIN32)
+// FIXME: dialog doesn't pop up on macos...
+#if !defined(MACOSX)
/* Checks that an exception in the dialog callback code is properly handled and won't disturb
* subsequent tests if caught -- especially that DialogWaiter::waitEndDialog() won't timeout. */
CPPUNIT_TEST_FIXTURE(test::AccessibleTestBase, SelfTestThrowInDialogCallback)
diff --git a/test/source/a11y/accessibletestbase.cxx b/test/source/a11y/accessibletestbase.cxx
index 579d4ba2bfd4..bcfdcc89db1d 100644
--- a/test/source/a11y/accessibletestbase.cxx
+++ b/test/source/a11y/accessibletestbase.cxx
@@ -27,6 +27,7 @@
#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/util/XCloseable.hpp>
+#include <vcl/idle.hxx>
#include <vcl/scheduler.hxx>
#include <vcl/svapp.hxx>
#include <vcl/window.hxx>
@@ -393,6 +394,9 @@ test::AccessibleTestBase::awaitDialog(const std::u16string_view name,
std::function<void(Dialog&)> mCallback;
bool mbAutoClose;
Timer maTimeoutTimer;
+ Idle maIdleHandler;
+
+ std::unique_ptr<Dialog> mxDialog;
public:
virtual ~ListenerHelper()
@@ -400,6 +404,7 @@ test::AccessibleTestBase::awaitDialog(const std::u16string_view name,
Application::SetDialogCancelMode(miPreviousDialogCancelMode);
Application::RemoveEventListener(mLink);
maTimeoutTimer.Stop();
+ maIdleHandler.Stop();
}
ListenerHelper(const std::u16string_view& name, std::function<void(Dialog&)> callback,
@@ -409,6 +414,7 @@ test::AccessibleTestBase::awaitDialog(const std::u16string_view name,
, mCallback(callback)
, mbAutoClose(bAutoClose)
, maTimeoutTimer("workaround timer if we don't catch WindowActivate")
+ , maIdleHandler("runs user callback in idle time")
{
mLink = LINK(this, ListenerHelper, eventListener);
Application::AddEventListener(mLink);
@@ -417,6 +423,9 @@ test::AccessibleTestBase::awaitDialog(const std::u16string_view name,
maTimeoutTimer.SetTimeout(60000);
maTimeoutTimer.Start();
+ maIdleHandler.SetInvokeHandler(LINK(this, ListenerHelper, idleHandler));
+ maIdleHandler.SetPriority(TaskPriority::DEFAULT_IDLE);
+
miPreviousDialogCancelMode = Application::GetDialogCancelMode();
Application::SetDialogCancelMode(DialogCancelMode::Off);
}
@@ -458,42 +467,54 @@ test::AccessibleTestBase::awaitDialog(const std::u16string_view name,
if (!pWin->IsDialog())
return;
- mbWaitingForDialog = false;
-
// remove ourselves, we don't want to run again
Application::RemoveEventListener(mLink);
+
+ mxDialog = std::make_unique<Dialog>(pWin, true);
+
+ maIdleHandler.Start();
+ }
+
+ // mimic IMPL_LINK inline
+ static void LinkStubidleHandler(void* instance, Timer* idle)
+ {
+ static_cast<ListenerHelper*>(instance)->idleHandler(idle);
+ }
+
+ void idleHandler(Timer*)
+ {
+ mbWaitingForDialog = false;
+
maTimeoutTimer.ClearInvokeHandler();
maTimeoutTimer.Stop();
- /* bind the dialog before checking its name so auto-close can kick in if anything
- * fails/throws */
- Dialog dialog(pWin, true);
-
/* The popping up dialog ought to be the right one, or something's fishy and
* we're bound to failure (e.g. waiting on a dialog that either will never come, or
* that will not run after the current one -- deadlock style) */
- if (msName != pWin->GetText())
+ if (msName != mxDialog->getWindow()->GetText())
{
mpException = std::make_exception_ptr(css::uno::RuntimeException(
- "Unexpected dialog '" + pWin->GetText() + "' opened instead of the expected '"
- + msName + "'"));
+ "Unexpected dialog '" + mxDialog->getWindow()->GetText()
+ + "' opened instead of the expected '" + msName + "'"));
}
else
{
std::cout << "found dialog, calling user callback" << std::endl;
// set the real requested auto close now we're just calling the user callback
- dialog.setAutoClose(mbAutoClose);
+ mxDialog->setAutoClose(mbAutoClose);
try
{
- mCallback(dialog);
+ mCallback(*mxDialog);
}
catch (...)
{
mpException = std::current_exception();
}
}
+
+ mxDialog.reset();
}
public: