aurum: support xpath creation when processes name are same. 36/308336/1
authorHosang Kim <hosang12.kim@samsung.com>
Thu, 21 Mar 2024 10:42:29 +0000 (19:42 +0900)
committerHosang Kim <hosang12.kim@samsung.com>
Thu, 21 Mar 2024 10:42:29 +0000 (19:42 +0900)
Use name and process id as key value.

Change-Id: If237b63840c0bfd1157f9f622d931e5c244fa7bb

libaurum/inc/Accessibility/AccessibleWatcher.h
libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h
libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h
libaurum/src/Comparer.cc
libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc
libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc
libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc

index e25bde061c08f41aff1536257cb270ef567fb84f..a4aed59e6eafe7e8f7604197470b23dbed674dd2 100644 (file)
@@ -90,17 +90,17 @@ public:
      * @return map (package std::string, @AurumXML)
      * @since_tizen 7.0
      */
-    virtual std::map<std::string, std::shared_ptr<AurumXML>> getXMLDocMap(void) = 0;
+    virtual std::map<std::pair<std::string, int>, std::shared_ptr<AurumXML>> getXMLDocMap(void) = 0;
 
     /**
      * @brief Gets AurumXML pointer of a specific package name.
      *
-     * @param[in] pkgName name of package.
+     * @param[in] process
      *
      * @return pointer of AurumXML the package if exist, else null pointer
      * @since_tizen 7.5
      */
-    virtual std::shared_ptr<AurumXML> getXMLDoc(std::string pkgName) = 0;
+    virtual std::shared_ptr<AurumXML> getXMLDoc(std::pair<std::string, int> process) = 0;
 
     /**
      * @brief Register atspi event callback.
index 5ffbc04ed1304a711f1915e59549187d3db6369e..ad6e7452dbf395e60d2cfcc2c667b473b76f9f83 100644 (file)
@@ -110,12 +110,12 @@ public:
     /**
      * @copydoc @AccessibleWatcher::getXMLDocMap()
      */
-    virtual std::map<std::string, std::shared_ptr<AurumXML>> getXMLDocMap(void) override;
+    virtual std::map<std::pair<std::string, int>, std::shared_ptr<AurumXML>> getXMLDocMap(void) override;
 
     /**
      * @copydoc @AccessibleWatcher::getXMLDoc()
      */
-    virtual std::shared_ptr<AurumXML> getXMLDoc(std::string pkgName) override;
+    virtual std::shared_ptr<AurumXML> getXMLDoc(std::pair<std::string, int> process) override;
 
     /**
      * @copydoc @AccessibleWatcher::registerCallback()
@@ -160,8 +160,8 @@ private:
     bool addToWindowSet(AtspiAccessible *node);
     static gpointer eventThreadLoop(gpointer data);
     static gpointer timerThread(gpointer data);
-    void appendApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg);
-    void removeApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg);
+    void appendApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg, int pid);
+    void removeApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg, int pid);
     void setXMLsync();
     void processCallback(char *type, char *name, char *pkg);
 
@@ -170,7 +170,7 @@ private:
     std::list<AtspiAccessible *> mActivatedWindowList;
     std::list<AtspiAccessible *> mActivatedApplicationList;
     std::set<AtspiAccessible *> mWindowSet;
-    std::map<std::string, std::shared_ptr<AurumXML>> mXMLDocMap;
+    std::map<std::pair<std::string, int>, std::shared_ptr<AurumXML>> mXMLDocMap;
     static GThread *mEventThread;
     static std::vector<std::shared_ptr<A11yEventInfo>> mEventQueue;
     static std::mutex mMutex;
index a00ad64b97dcb7edd2163243b94ed65a9b49a013..296b409787fec13fc9c285118d4cb92e69763fd4 100644 (file)
@@ -57,9 +57,9 @@ public:
 
     virtual bool registerCallback(const A11yEvent type, EventHandler cb, void *data) override;
 
-    std::map<std::string, std::shared_ptr<AurumXML>> getXMLDocMap(void);
+    std::map<std::pair<std::string, int>, std::shared_ptr<AurumXML>> getXMLDocMap(void);
 
-    std::shared_ptr<AurumXML> getXMLDoc(std::string pkgName);
+    std::shared_ptr<AurumXML> getXMLDoc(std::pair<std::string, int> process);
 
     void setXMLsync(bool sync);
 
@@ -68,7 +68,7 @@ public:
 private:
 
     std::map<AtspiAccessible *, std::shared_ptr<AccessibleApplication>> mActiveAppMap;
-    std::map<std::string, std::shared_ptr<AurumXML>> mXMLDocMap;
+    std::map<std::pair<std::string, int>, std::shared_ptr<AurumXML>> mXMLDocMap;
 };
 
 }
index d9b6312a51a5fb889295b56227ce1f06c84ce6cf..a3707729e1702717430ff8ae77332bd3eaa4e47b 100644 (file)
@@ -64,7 +64,8 @@ void Comparer::findObjects(std::vector<std::shared_ptr<AccessibleNode>> &ret,
 
     if (selector->mMatchXPath) {
         std::string pkg = root->getPkg();
-        auto XMLDoc = AccessibleWatcher::getInstance()->getXMLDoc(pkg);
+        int pid = root->getPid();
+        auto XMLDoc = AccessibleWatcher::getInstance()->getXMLDoc({pkg, pid});
 
         if (XMLDoc.get() == nullptr) return;
 
index 84f88fd68d5991f26f325b2fd6dcd6c860166c1d..b9071bd7c74ed00d2145439d218d92fb27afbe5d 100644 (file)
@@ -263,7 +263,8 @@ void AtspiAccessibleNode::updateExtents()
 
 void AtspiAccessibleNode::updateXPath()
 {
-    auto XMLDoc = AccessibleWatcher::getInstance()->getXMLDoc(mPkg);
+    updatePid();
+    auto XMLDoc = AccessibleWatcher::getInstance()->getXMLDoc({mPkg, mPid});
     if (XMLDoc.get() == nullptr) return;
 
     mXPath = XMLDoc->getXPath(shared_from_this());
index b77c65f1a2dba468b42442c177011f038bc3c1ee..44fb227008f35effb5cc1abfbc5b8b6583e98fd9 100644 (file)
@@ -195,36 +195,37 @@ AtspiAccessibleWatcher::~AtspiAccessibleWatcher()
     atspi_exit();
 }
 
-void AtspiAccessibleWatcher::appendApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg)
+void AtspiAccessibleWatcher::appendApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg, int pid)
 {
-    LOGI("window activated in app(%s)", pkg);
+    LOGI("window activated in app(%s:%d)", pkg, pid);
     if (mXMLSync)
     {
         std::string package(pkg);
         if (!package.empty()) {
 
-            if (instance->mXMLDocMap.count(package)) {
+            if (instance->mXMLDocMap.count({package, pid})) {
                 mAppCount--;
                 mAppXMLLoadedCount--;
-                instance->mXMLDocMap.erase(package);
+                instance->mXMLDocMap.erase({package, pid});
             }
 
             mAppCount++;
-            instance->mXMLDocMap.insert(std::pair<std::string, std::shared_ptr<AurumXML>>(package,
-                    std::make_shared<AurumXML>(std::make_shared<AtspiAccessibleNode>(app), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar)));
+            instance->mXMLDocMap.insert({{package, pid},
+                    std::make_shared<AurumXML>(std::make_shared<AtspiAccessibleNode>(app), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar)});
         }
     }
 }
 
-void AtspiAccessibleWatcher::removeApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg)
+void AtspiAccessibleWatcher::removeApp(AtspiAccessibleWatcher *instance, AtspiAccessible *app, char *pkg, int pid)
 {
-    LOGI("window deactivate in app(%s)", pkg);
+    LOGI("window deactivate in app(%s:%d)", pkg, pid);
     if (mXMLSync)
     {
-        if (instance->mXMLDocMap.count(std::string(pkg))) {
+        std::string package(pkg);
+        if (instance->mXMLDocMap.count({package, pid})) {
             mAppCount--;
             mAppXMLLoadedCount--;
-            instance->mXMLDocMap.erase(std::string(pkg));
+            instance->mXMLDocMap.erase({package, pid});
         }
     }
 
@@ -291,6 +292,7 @@ void AtspiAccessibleWatcher::onAtspiEvents(AtspiEvent *event, void *watcher)
         isWindowEventEmitted = true;
 
     char *name = NULL, *pkg = NULL;
+    int pid = 0;
     AtspiAccessibleWatcher *instance = (AtspiAccessibleWatcher *)watcher;
     name = AtspiWrapper::Atspi_accessible_get_name(event->source, NULL);
 
@@ -326,16 +328,17 @@ void AtspiAccessibleWatcher::onAtspiEvents(AtspiEvent *event, void *watcher)
     if (name && app)
     {
         pkg = AtspiWrapper::Atspi_accessible_get_name(app, NULL);
-        if (!strncmp(event->type, "window:create", 13)) instance->appendApp(instance, app, pkg);
-        else if (!strncmp(event->type, "window:activate", 15) && instance->mXMLDocMap.count(pkg) == 0) instance->appendApp(instance, app, pkg);
-        else if (!strncmp(event->type, "window:destroy", 14)) instance->removeApp(instance, app, pkg);
+        pid = AtspiWrapper::Atspi_accessible_get_process_id(app, NULL);
+        if (!strncmp(event->type, "window:create", 13)) instance->appendApp(instance, app, pkg, pid);
+        else if (!strncmp(event->type, "window:activate", 15) && instance->mXMLDocMap.count({pkg, pid}) == 0) instance->appendApp(instance, app, pkg, pid);
+        else if (!strncmp(event->type, "window:destroy", 14)) instance->removeApp(instance, app, pkg, pid);
 
         // To support focus skipped window
         if (instance->isTv) {
             if (!strncmp(event->type, "window:restore", 14) && (!strncmp(name, "volume-app", 10) || !strncmp(name, "tv-viewer", 9)))
-                instance->appendApp(instance, app, pkg);
+                instance->appendApp(instance, app, pkg, pid);
             else if (!strncmp(event->type, "window:minimize", 15) && (!strncmp(name, "volume-app", 10) || !strncmp(name, "tv-viewer", 9)))
-                instance->removeApp(instance, app, pkg);
+                instance->removeApp(instance, app, pkg, pid);
         }
     }
     else
@@ -428,7 +431,7 @@ bool AtspiAccessibleWatcher::executeAndWaitForEvents(const Runnable *cmd, const
     return false;
 }
 
-std::map<std::string, std::shared_ptr<AurumXML>> AtspiAccessibleWatcher::getXMLDocMap(void)
+std::map<std::pair<std::string, int>, std::shared_ptr<AurumXML>> AtspiAccessibleWatcher::getXMLDocMap(void)
 {
     if(mXMLSync)
     {
@@ -443,7 +446,7 @@ std::map<std::string, std::shared_ptr<AurumXML>> AtspiAccessibleWatcher::getXMLD
     return mXMLDocMap;
 }
 
-std::shared_ptr<AurumXML> AtspiAccessibleWatcher::getXMLDoc(std::string pkgName)
+std::shared_ptr<AurumXML> AtspiAccessibleWatcher::getXMLDoc(std::pair<std::string, int> process)
 {
     if(mXMLSync)
     {
@@ -455,8 +458,8 @@ std::shared_ptr<AurumXML> AtspiAccessibleWatcher::getXMLDoc(std::string pkgName)
         lk.unlock();
     }
 
-    if (mXMLDocMap.count(pkgName) > 0)
-        return mXMLDocMap[pkgName];
+    if (mXMLDocMap.count(process) > 0)
+        return mXMLDocMap[process];
     else
         return std::shared_ptr<AurumXML>(nullptr);
 
@@ -535,19 +538,19 @@ void AtspiAccessibleWatcher::setXMLsync(bool sync)
 {
     LOGI("setXMLSync: %s", (sync ? "TRUE" : "FALSE"));
     mXMLSync = sync;
+    mXMLDocMap.clear();
+    mAppCount = 0;
+    mAppXMLLoadedCount = 0;
 
-    if(!sync) {
-        mXMLDocMap.clear();
-        mAppCount = 0;
-        mAppXMLLoadedCount = 0;
-    } else {
+    if (sync) {
         auto apps = AccessibleAppManager::getInstance()->getApplications();
         for (auto &app : apps)
         {
             app->getAccessibleNode()->updateName();
+            app->getAccessibleNode()->updatePid();
             mAppCount++;
-            mXMLDocMap.insert(std::pair<std::string, std::shared_ptr<AurumXML>>(app->getPackageName(),
-                    std::make_shared<AurumXML>(app->getAccessibleNode(), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar)));
+            mXMLDocMap.insert({{app->getPackageName(), app->getAccessibleNode()->getPid()},
+                    std::make_shared<AurumXML>(app->getAccessibleNode(), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar)});
         }
     }
 }
index eb661a6fcff97fb7315acdbda16133b44088a26c..57e949150c0bd53cd4d9a499f5589fe688899af1 100644 (file)
@@ -28,12 +28,12 @@ MockAccessibleWatcher::~MockAccessibleWatcher()
 {
 }
 
-std::map<std::string, std::shared_ptr<AurumXML>> MockAccessibleWatcher::getXMLDocMap(void)
+std::map<std::pair<std::string, int>, std::shared_ptr<AurumXML>> MockAccessibleWatcher::getXMLDocMap(void)
 {
     return mXMLDocMap;
 }
 
-std::shared_ptr<AurumXML> MockAccessibleWatcher::getXMLDoc(std::string pkgName)
+std::shared_ptr<AurumXML> MockAccessibleWatcher::getXMLDoc(std::pair<std::string, int> process)
 {
     return std::shared_ptr<AurumXML>();
 }