From 42f60e67e53c75d8a2eee9586d6ae8245ea984da Mon Sep 17 00:00:00 2001 From: Ashod Nakashian Date: Tue, 23 Jul 2019 19:11:36 -0400 Subject: [PATCH] desktop: unit-test to check SpellDialog works in multiple views Unfortunately, this isn't fully functional, but didn't want to lose the effort. The problem is that there is no proper config for languages in the unit-tests. So even when we set the language explicitly, it still doesn't apply to the SpellCheckerDispatcher, which is where it matters. This seems to be because the config is not properly propagated and broadcast. Below is the stacktrace as works on desktop. During the unittest the Broadcaster has no change listener for LngSvcMgr, so SpellCheckerDispatcher::SetServiceList doesn't get called. #0 0x00007f47f3fed7e6 in SpellCheckerDispatcher::SetServiceList(com::sun::star::lang::Locale const&, com::sun::star::uno::Sequence const&) (this=0x5589de40e7a0, rLocale=..., rSvcImplNames=uno::Sequence of length 1 = {...}) at /home/ash/prj/master/linguistic/source/spelldsp.cxx:795 #1 0x00007f47f3fcc0ad in LngSvcMgr::Notify(com::sun::star::uno::Sequence const&) (this=0x5589de43b4e0, rPropertyNames=uno::Sequence of length 4 = {...}) at /home/ash/prj/master/linguistic/source/lngsvcmgr.cxx:826 #2 0x00007f47fa2d3c8d in utl::ConfigItem::CallNotify(com::sun::star::uno::Sequence const&) (this=0x5589de43b530, rPropertyNames=uno::Sequence of length 4 = {...}) at /home/ash/prj/master/unotools/source/config/configitem.cxx:181 #3 0x00007f47fa2d3946 in utl::ConfigChangeListener_Impl::changesOccurred(com::sun::star::util::ChangesEvent const&) (this=0x5589de464b90, rEvent=...) at /home/ash/prj/master/unotools/source/config/configitem.cxx:143 #4 0x00007f47e273bb61 in configmgr::Broadcaster::send() (this=0x7ffcc604c5b0) at /home/ash/prj/master/configmgr/source/broadcaster.cxx:182 #5 0x00007f47e277f002 in configmgr::RootAccess::commitChanges() (this=0x5589dd557400) at /home/ash/prj/master/configmgr/source/rootaccess.cxx:171 #6 0x00007f47fa2d80e3 in utl::ConfigItem::ReplaceSetProperties(rtl::OUString const&, com::sun::star::uno::Sequence const&) (this=0x5589dd5571b0, rNode="ServiceManager/SpellCheckerList", rValues=uno::Sequence of length 4 = {...}) at /home/ash/prj/master/unotools/source/config/configitem.cxx:1025 #7 0x00007f47fa339983 in SvtLinguConfig::ReplaceSetProperties(rtl::OUString const&, com::sun::star::uno::Sequence const&) (this=0x7ffcc604cb40, rNode="ServiceManager/SpellCheckerList", rValues=uno::Sequence of length 4 = {...}) at /home/ash/prj/master/unotools/source/config/lingucfg.cxx:847 #8 0x00007f47f3fcb88f in LngSvcMgr::UpdateAll() (this=0x5589de43b4e0) at /home/ash/prj/master/linguistic/source/lngsvcmgr.cxx:765 #9 0x00007f47f3fc9caa in LngSvcMgr::LngSvcMgr() (this=0x5589de43b4e0) at /home/ash/prj/master/linguistic/source/lngsvcmgr.cxx:438 #10 0x00007f47f3fd3baf in LngSvcMgr_CreateInstance(com::sun::star::uno::Reference const&) () at /home/ash/prj/master/linguistic/source/lngsvcmgr.cxx:1967 #11 0x00007f4800e9656b in cppu::OSingleFactoryHelper::createInstanceEveryTime(com::sun::star::uno::Reference const&) (this=0x5589de3ccfc8, xContext= uno::Reference to (cppu::ComponentContext *) 0x5589dbcca630) at /home/ash/prj/master/cppuhelper/source/factory.cxx:149 #12 0x00007f4800e96790 in cppu::OSingleFactoryHelper::createInstanceWithContext(com::sun::star::uno::Reference const&) (this=0x5589de3ccfc8, xContext=uno::Reference to (cppu::ComponentContext *) 0x5589dbcca630) at /home/ash/prj/master/cppuhelper/source/factory.cxx:175 #13 0x00007f4800e97107 in cppu::OFactoryComponentHelper::createInstanceWithContext(com::sun::star::uno::Reference const&) (this=0x5589de3ccf60, xContext=uno::Reference to (cppu::ComponentContext *) 0x5589dbcca630) at /home/ash/prj/master/cppuhelper/source/factory.cxx:374 #14 0x00007f4800eebc8f in cppuhelper::ServiceManager::Data::Implementation::createInstance(com::sun::star::uno::Reference const&, bool) (this=0x5589dbd2f030, context=uno::Reference to (cppu::ComponentContext *) 0x5589dbcca630, singletonRequest=false) at /home/ash/prj/master/cppuhelper/source/servicemanager.cxx:667 #15 0x00007f4800eee587 in cppuhelper::ServiceManager::createInstanceWithContext(rtl::OUString const&, com::sun::star::uno::Reference const&) (this=0x5589dbcbaaf0, aServiceSpecifier="com.sun.star.linguistic2.LinguServiceManager", Context=uno::Reference to (cppu::ComponentContext *) 0x5589dbcca630) at /home/ash/prj/master/cppuhelper/source/servicemanager.cxx:991 #16 0x00007f4800776778 in com::sun::star::linguistic2::LinguServiceManager::create(com::sun::star::uno::Reference const&) (the_context=uno::Reference to (cppu::ComponentContext *) 0x5589dbcca630) at /home/ash/prj/master/workdir/UnoApiHeadersTarget/offapi/normal/com/sun/star/linguistic2/LinguServiceManager.hpp:38 #17 0x00007f4800772d51 in GetLngSvcMgr_Impl() () at /home/ash/prj/master/editeng/source/misc/unolingu.cxx:66 #18 0x00007f4800773449 in SpellDummy_Impl::GetSpell_Impl() (this=0x5589dd82f420) at /home/ash/prj/master/editeng/source/misc/unolingu.cxx:217 #19 0x00007f4800773614 in SpellDummy_Impl::isValid(rtl::OUString const&, short, com::sun::star::uno::Sequence const&) (this=0x5589dd82f420, rWord="a", nLanguage=1033, rProperties=empty uno::Sequence) at /home/ash/prj/master/editeng/source/misc/unolingu.cxx:249 #20 0x00007f48006ae4c2 in ImpEditEngine::DoOnlineSpelling(ContentNode*, bool, bool) (this=0x5589de195060, pThisNodeOnly=0x0, bSpellAtCursorPos=false, bInterruptible=true) at /home/ash/prj/master/editeng/source/editeng/impedit4.cxx:2306 #21 0x00007f480067d0d2 in ImpEditEngine::OnlineSpellHdl(Timer*) (this=0x5589de195060) at /home/ash/prj/master/editeng/source/editeng/impedit3.cxx:322 Change-Id: Iffef03502c78311427aa8883739678120cc84931 (cherry picked from commit 4f77bd94028a140133814d735c0425bbd0de4839) Reviewed-on: https://gerrit.libreoffice.org/85007 Tested-by: Jenkins CollaboraOffice Reviewed-by: Michael Meeks (cherry picked from commit 66c1f6bee6f463786540b2e73d52f35461063589) Reviewed-on: https://gerrit.libreoffice.org/85683 Tested-by: Jenkins Reviewed-by: Ashod Nakashian --- comphelper/source/misc/lok.cxx | 5 ++ desktop/qa/data/sheet_with_image.ods | Bin 9980 -> 10491 bytes desktop/qa/desktop_lib/test_desktop_lib.cxx | 76 ++++++++++++++++++++ include/comphelper/lok.hxx | 2 + include/vcl/settings.hxx | 1 + vcl/source/app/settings.cxx | 5 ++ 6 files changed, 89 insertions(+) diff --git a/comphelper/source/misc/lok.cxx b/comphelper/source/misc/lok.cxx index 4c1337dd927e..2cab40dfa8f9 100644 --- a/comphelper/source/misc/lok.cxx +++ b/comphelper/source/misc/lok.cxx @@ -156,6 +156,11 @@ void setCompatFlag(Compat flag) { g_eCompatFlags = static_cast(g_eCompat bool isCompatFlagSet(Compat flag) { return (g_eCompatFlags & flag) == flag; } +void setLanguageTag(const OUString& lang, bool bCanonicalize) +{ + g_aLanguageTag = LanguageTag(lang, bCanonicalize); +} + void setLanguageTag(const LanguageTag& languageTag) { if (g_aLanguageTag != languageTag) diff --git a/desktop/qa/data/sheet_with_image.ods b/desktop/qa/data/sheet_with_image.ods index 94dbb37858da89118f8f0b192219b8396790c9ff..00c0019cb80ca3fbbd3163fc65fda0ba66c98b53 100644 GIT binary patch delta 8705 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 diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index 2649c0cb0d40..e04ad53559aa 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,30 @@ using namespace desktop; class DesktopLOKTest : public UnoApiTest { + class Resetter + { + private: + std::function m_Func; + + public: + Resetter(std::function const& rFunc) + : m_Func(rFunc) + { + } + ~Resetter() + { + try + { + m_Func(); + } + catch (...) // has to be reliable + { + fprintf(stderr, "resetter failed with exception\n"); + abort(); + } + } + }; + public: DesktopLOKTest() : UnoApiTest("/desktop/qa/data/"), m_nSelectionBeforeSearchResult(0), @@ -145,6 +170,7 @@ public: void testSignDocument_PEM_PDF(); void testTextSelectionHandles(); void testComplexSelection(); + void testSpellcheckerMultiView(); void testDialogPaste(); void testShowHideDialog(); void testDialogInput(); @@ -203,6 +229,7 @@ public: #endif CPPUNIT_TEST(testTextSelectionHandles); CPPUNIT_TEST(testComplexSelection); + CPPUNIT_TEST(testSpellcheckerMultiView); CPPUNIT_TEST(testDialogPaste); CPPUNIT_TEST(testShowHideDialog); CPPUNIT_TEST(testDialogInput); @@ -2736,6 +2763,55 @@ void DesktopLOKTest::testCalcSaveAs() CPPUNIT_ASSERT_EQUAL(OString("X"), aView.m_aCellFormula); } +void DesktopLOKTest::testSpellcheckerMultiView() +{ + static const OUString aLangISO("en-US"); + SvtSysLocaleOptions aSysLocaleOptions; + aSysLocaleOptions.SetLocaleConfigString(aLangISO); + aSysLocaleOptions.SetUILocaleConfigString(aLangISO); + comphelper::LibreOfficeKit::setLanguageTag(aLangISO, true); + + auto aSavedSettings = Application::GetSettings(); + std::unique_ptr pResetter( + new Resetter([&]() { Application::SetSettings(aSavedSettings); })); + AllSettings aSettings(aSavedSettings); + aSettings.SetLanguageTag(aLangISO, true); + Application::SetSettings(aSettings); + + LibLODocument_Impl* pDocument = loadDoc("sheet_with_image.ods", LOK_DOCTYPE_SPREADSHEET); + pDocument->pClass->setViewLanguage(pDocument, 0, "en-US"); // For spellchecking. + pDocument->pClass->initializeForRendering(pDocument, nullptr); + pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); + + pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 'a', 0); + pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 'a', 0); + pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 'a', 0); + pDocument->pClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 0, com::sun::star::awt::Key::ESCAPE); + + // Start spellchecking. + pDocument->pClass->postUnoCommand(pDocument, ".uno:SpellDialog", nullptr, false); + + // Uncommenting this will result in a deadlock. + // Because the language configuration above is not effective, and no + // language is actually set, the spell-dialog finds no misspelled + // words, and displays a message box, which must be dismissed to + // continue. + // Need to fix the language configuration issue to enable this. + // Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(1, pDocument->m_pDocumentClass->getViewsCount(pDocument)); + + // Now create another view. + const int nViewId = pDocument->m_pDocumentClass->createView(pDocument); + CPPUNIT_ASSERT_EQUAL(2, pDocument->m_pDocumentClass->getViewsCount(pDocument)); + + // And destroy it. + pDocument->m_pDocumentClass->destroyView(pDocument, nViewId); + + // We should survive the destroyed view. + CPPUNIT_ASSERT_EQUAL(1, pDocument->m_pDocumentClass->getViewsCount(pDocument)); +} + namespace { constexpr size_t classOffset(int i) diff --git a/include/comphelper/lok.hxx b/include/comphelper/lok.hxx index b4658913f0d1..53ee43f498db 100644 --- a/include/comphelper/lok.hxx +++ b/include/comphelper/lok.hxx @@ -94,6 +94,8 @@ COMPHELPER_DLLPUBLIC bool isViewIdForVisCursorInvalidation(); /// Set whether clients want viewId in visible cursor invalidation payload. COMPHELPER_DLLPUBLIC void setViewIdForVisCursorInvalidation(bool bViewIdForVisCursorInvalidation); +/// Update the current LOK's language. +COMPHELPER_DLLPUBLIC void setLanguageTag(const OUString& lang, bool bCanonicalize = false); /// Update the current LOK's language. COMPHELPER_DLLPUBLIC void setLanguageTag(const LanguageTag& languageTag); /// Get the current LOK's language. diff --git a/include/vcl/settings.hxx b/include/vcl/settings.hxx index a45e0e685633..dafae8735682 100644 --- a/include/vcl/settings.hxx +++ b/include/vcl/settings.hxx @@ -672,6 +672,7 @@ public: void SetHelpSettings( const HelpSettings& rSet ); const HelpSettings& GetHelpSettings() const; + void SetLanguageTag(const OUString& rLanguage, bool bCanonicalize); void SetLanguageTag( const LanguageTag& rLanguageTag ); const LanguageTag& GetLanguageTag() const; const LanguageTag& GetUILanguageTag() const; diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx index 900dd98d34ff..30e9616740a3 100644 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -2708,6 +2708,11 @@ bool AllSettings::operator ==( const AllSettings& rSet ) const return false; } +void AllSettings::SetLanguageTag(const OUString& rLanguage, bool bCanonicalize) +{ + SetLanguageTag(LanguageTag(rLanguage, bCanonicalize)); +} + void AllSettings::SetLanguageTag( const LanguageTag& rLanguageTag ) { if (mxData->maLocale != rLanguageTag)