From: Hosang Kim Date: Thu, 21 Mar 2024 10:42:29 +0000 (+0900) Subject: aurum: support xpath creation when processes name are same. X-Git-Tag: accepted/tizen/8.0/unified/20240328.135126~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=004d0c37412d142b86bcf29d2ee7855fc77c0df8;p=platform%2Fcore%2Fuifw%2Faurum.git aurum: support xpath creation when processes name are same. Use name and process id as key value. Change-Id: If237b63840c0bfd1157f9f622d931e5c244fa7bb --- diff --git a/libaurum/inc/Accessibility/AccessibleWatcher.h b/libaurum/inc/Accessibility/AccessibleWatcher.h index e25bde0..a4aed59 100644 --- a/libaurum/inc/Accessibility/AccessibleWatcher.h +++ b/libaurum/inc/Accessibility/AccessibleWatcher.h @@ -90,17 +90,17 @@ public: * @return map (package std::string, @AurumXML) * @since_tizen 7.0 */ - virtual std::map> getXMLDocMap(void) = 0; + virtual std::map, std::shared_ptr> 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 getXMLDoc(std::string pkgName) = 0; + virtual std::shared_ptr getXMLDoc(std::pair process) = 0; /** * @brief Register atspi event callback. diff --git a/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h b/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h index 5ffbc04..ad6e745 100644 --- a/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h +++ b/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h @@ -110,12 +110,12 @@ public: /** * @copydoc @AccessibleWatcher::getXMLDocMap() */ - virtual std::map> getXMLDocMap(void) override; + virtual std::map, std::shared_ptr> getXMLDocMap(void) override; /** * @copydoc @AccessibleWatcher::getXMLDoc() */ - virtual std::shared_ptr getXMLDoc(std::string pkgName) override; + virtual std::shared_ptr getXMLDoc(std::pair 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 mActivatedWindowList; std::list mActivatedApplicationList; std::set mWindowSet; - std::map> mXMLDocMap; + std::map, std::shared_ptr> mXMLDocMap; static GThread *mEventThread; static std::vector> mEventQueue; static std::mutex mMutex; diff --git a/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h b/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h index a00ad64..296b409 100644 --- a/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h +++ b/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h @@ -57,9 +57,9 @@ public: virtual bool registerCallback(const A11yEvent type, EventHandler cb, void *data) override; - std::map> getXMLDocMap(void); + std::map, std::shared_ptr> getXMLDocMap(void); - std::shared_ptr getXMLDoc(std::string pkgName); + std::shared_ptr getXMLDoc(std::pair process); void setXMLsync(bool sync); @@ -68,7 +68,7 @@ public: private: std::map> mActiveAppMap; - std::map> mXMLDocMap; + std::map, std::shared_ptr> mXMLDocMap; }; } diff --git a/libaurum/src/Comparer.cc b/libaurum/src/Comparer.cc index d9b6312..a370772 100644 --- a/libaurum/src/Comparer.cc +++ b/libaurum/src/Comparer.cc @@ -64,7 +64,8 @@ void Comparer::findObjects(std::vector> &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; diff --git a/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc b/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc index 84f88fd..b9071bd 100644 --- a/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc +++ b/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc @@ -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()); diff --git a/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc b/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc index b77c65f..44fb227 100644 --- a/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc +++ b/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc @@ -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>(package, - std::make_shared(std::make_shared(app), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar))); + instance->mXMLDocMap.insert({{package, pid}, + std::make_shared(std::make_shared(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> AtspiAccessibleWatcher::getXMLDocMap(void) +std::map, std::shared_ptr> AtspiAccessibleWatcher::getXMLDocMap(void) { if(mXMLSync) { @@ -443,7 +446,7 @@ std::map> AtspiAccessibleWatcher::getXMLD return mXMLDocMap; } -std::shared_ptr AtspiAccessibleWatcher::getXMLDoc(std::string pkgName) +std::shared_ptr AtspiAccessibleWatcher::getXMLDoc(std::pair process) { if(mXMLSync) { @@ -455,8 +458,8 @@ std::shared_ptr 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(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>(app->getPackageName(), - std::make_shared(app->getAccessibleNode(), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar))); + mXMLDocMap.insert({{app->getPackageName(), app->getAccessibleNode()->getPid()}, + std::make_shared(app->getAccessibleNode(), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar)}); } } } diff --git a/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc b/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc index eb661a6..57e9491 100644 --- a/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc +++ b/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc @@ -28,12 +28,12 @@ MockAccessibleWatcher::~MockAccessibleWatcher() { } -std::map> MockAccessibleWatcher::getXMLDocMap(void) +std::map, std::shared_ptr> MockAccessibleWatcher::getXMLDocMap(void) { return mXMLDocMap; } -std::shared_ptr MockAccessibleWatcher::getXMLDoc(std::string pkgName) +std::shared_ptr MockAccessibleWatcher::getXMLDoc(std::pair process) { return std::shared_ptr(); }