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 49667a6950709856b9a1a5d59ca78fdf682a53f4
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: Fri Sep 18 13:22:46 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>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102983
    Tested-by: Jenkins

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 681ac3b12488..a5c2b7c4ea8b 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -3736,7 +3736,7 @@ static void doc_sendDialogEvent(LibreOfficeKitDocument* 
/*pThis*/, unsigned long
         if (!bIsWeldedDialog)
         {
             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 7d709a342eb4..750226d20be0 100644
--- a/include/vcl/uitest/uiobject.hxx
+++ b/include/vcl/uitest/uiobject.hxx
@@ -125,6 +125,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 8e3097d7d702..b768a80622d0 100644
--- a/vcl/source/uitest/uiobject.cxx
+++ b/vcl/source/uitest/uiobject.cxx
@@ -391,7 +391,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;
@@ -403,12 +403,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;
@@ -458,6 +462,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

Reply via email to