desktop/source/lib/init.cxx | 2 +- include/vcl/uitest/uiobject.hxx | 2 ++ vcl/source/uitest/uiobject.cxx | 33 ++++++++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 6 deletions(-)
New commits: commit 7b922966bf6bcf16f34cc22f60f0f962deb5f24a Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Thu Sep 17 10:18:23 2020 +0200 Commit: Szymon Kłos <szymon.k...@collabora.com> CommitDate: Thu Sep 17 13:33:34 2020 +0200 jsdialog: use window only if visible When there is a name conflict we should take currently visible window. Change-Id: Iaccf03a78b083ecaca0ee6aa538674a6de093a4b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102903 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Szymon Kłos <szymon.k...@collabora.com> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index ca825da01637..a2cf174ba599 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -3742,7 +3742,7 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* /*pThis*/, unsigned nWin if (!bIsWeldedDialog || bContinueWithLOKWindow) { WindowUIObject aUIObject(pWindow); - std::unique_ptr<UIObject> pUIWindow(aUIObject.get_child(aMap["id"])); + std::unique_ptr<UIObject> pUIWindow(aUIObject.get_visible_child(aMap["id"])); if (pUIWindow) { bool bIsClickAction = false; diff --git a/include/vcl/uitest/uiobject.hxx b/include/vcl/uitest/uiobject.hxx index c7ab3d51af93..4d4f98478adc 100644 --- a/include/vcl/uitest/uiobject.hxx +++ b/include/vcl/uitest/uiobject.hxx @@ -117,6 +117,8 @@ public: virtual std::unique_ptr<UIObject> get_child(const OUString& rID) override; + virtual std::unique_ptr<UIObject> get_visible_child(const OUString& rID); + virtual std::set<OUString> get_children() const override; virtual OUString dumpState() const override; diff --git a/vcl/source/uitest/uiobject.cxx b/vcl/source/uitest/uiobject.cxx index efbf8e06dcf4..77f4014eea7c 100644 --- a/vcl/source/uitest/uiobject.cxx +++ b/vcl/source/uitest/uiobject.cxx @@ -374,7 +374,7 @@ OUString WindowUIObject::get_type() const namespace { -vcl::Window* findChild(vcl::Window* pParent, const OUString& rID) +vcl::Window* findChild(vcl::Window* pParent, const OUString& rID, bool bRequireVisible = false) { if (!pParent) return nullptr; @@ -386,12 +386,16 @@ vcl::Window* findChild(vcl::Window* pParent, const OUString& rID) for (size_t i = 0; i < nCount; ++i) { vcl::Window* pChild = pParent->GetChild(i); - if (pChild && pChild->get_id() == rID) + if (pChild && pChild->get_id() == rID + && (!bRequireVisible || pChild->IsVisible())) return pChild; - vcl::Window* pResult = findChild(pChild, rID); - if (pResult) - return pResult; + if (!bRequireVisible || pChild->IsVisible()) + { + vcl::Window* pResult = findChild(pChild, rID); + if (pResult) + return pResult; + } } return nullptr; @@ -441,6 +445,25 @@ std::unique_ptr<UIObject> WindowUIObject::get_child(const OUString& rID) return aFunction(pWindow); } +std::unique_ptr<UIObject> WindowUIObject::get_visible_child(const OUString& rID) +{ + // in a first step try the real children before moving to the top level parent + // This makes it easier to handle cases with the same ID as there is a way + // to resolve conflicts + vcl::Window* pWindow = findChild(mxWindow.get(), rID, true); + if (!pWindow) + { + vcl::Window* pDialogParent = get_top_parent(mxWindow.get()); + pWindow = findChild(pDialogParent, rID, true); + } + + if (!pWindow) + throw css::uno::RuntimeException("Could not find child with id: " + rID); + + FactoryFunction aFunction = pWindow->GetUITestFactory(); + return aFunction(pWindow); +} + std::set<OUString> WindowUIObject::get_children() const { vcl::Window* pDialogParent = get_top_parent(mxWindow.get()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits