* it finds focused window then start to find object as it root.
* Finds all objects to the end of tree.
*
+ * @param[in] ret vector where found objects stored
* @param[in] device @UiDevice
* @param[in] selector @UiSelector
* @param[in] root @AccessibleNode root object(focused window on current state)
* @param[in] earlyReturn find all object or not (default = false)
*
- * @return AccessibleNode if found, else nullptr
*
* @since_tizen 6.5
*/
- static std::vector<std::shared_ptr<AccessibleNode>> findObjects(
+ static void findObjects(std::vector<std::shared_ptr<AccessibleNode>> &ret,
const std::shared_ptr<UiDevice>& device, const std::shared_ptr<UiSelector>& selector,
const std::shared_ptr<AccessibleNode>& root, bool earlyReturn = false);
*
* @brief Starts find object from root.
*
+ * @param[in] ret vector where found objects stored
* @param[in] root @AccessibleNode
*
* @since_tizen 6.5
*/
- std::vector<std::shared_ptr<AccessibleNode>> findObjects(const std::shared_ptr<AccessibleNode>& root);
+ void findObjects(std::vector<std::shared_ptr<AccessibleNode>> &ret,
+ const std::shared_ptr<AccessibleNode>& root);
/**
* @internal
*
* @brief It updates all partialMatches and traverse tree till given depth to find objects
*
+ * @param[in] ret vector where found objects stored
* @param[in] root @AccessibleNode
* @param[in] index node index
* @param[in] depth tree depth
*
* @since_tizen 6.5
*/
- std::vector<std::shared_ptr<AccessibleNode>> findObjects(
+ void findObjects(
+ std::vector<std::shared_ptr<AccessibleNode>> &ret,
const std::shared_ptr<AccessibleNode>& root, const int &index, const int &depth,
std::list<std::shared_ptr<PartialMatch>> &partialMatches);
const std::shared_ptr<UiSelector>& selector,
const std::shared_ptr<AccessibleNode>& root)
{
- std::vector<std::shared_ptr<AccessibleNode>> ret = findObjects(device, selector, root, true);
+ std::vector<std::shared_ptr<AccessibleNode>> ret;
+ findObjects(ret, device, selector, root, true);
if (ret.size() > 0)
return std::move(ret[0]);
else
return nullptr;
}
-std::vector<std::shared_ptr<AccessibleNode>> Comparer::findObjects(const std::shared_ptr<UiDevice>& device,
+void Comparer::findObjects(std::vector<std::shared_ptr<AccessibleNode>> &ret,
+ const std::shared_ptr<UiDevice>& device,
const std::shared_ptr<UiSelector>& selector,
const std::shared_ptr<AccessibleNode>& root, bool earlyReturn)
{
LOGI("findObjects selector(%s) from (type:%s style:%s, role:%s, text:%s) earlyReturn:%d", selector->description().c_str(), root->getType().c_str(), root->getStyle().c_str(), root->getRole().c_str(), root->getText().c_str(), earlyReturn);
if (selector->mParent) {
- auto ret = Comparer::findObjects(device, selector->mParent, root);
- std::vector<std::shared_ptr<AccessibleNode>> merged{};
+
+ // TODO: Optimize findObjects() when selector has a parent
+ std::vector<std::shared_ptr<AccessibleNode>> ret;
+ Comparer::findObjects(ret, device, selector->mParent, root);
for (const auto &node : ret) {
- auto tmp = comparer.findObjects(node);
- std::move(std::begin(tmp), std::end(tmp), std::back_inserter(merged));
+ comparer.findObjects(ret, node);
}
- return merged;
+
+ return;
}
if (selector->mMatchXPath) {
- std::vector<std::shared_ptr<AccessibleNode>> merged{};
-
std::string pkg = root->getPkg();
auto XMLDoc = AccessibleWatcher::getInstance()->getXMLDoc(pkg);
- if (XMLDoc.get() == nullptr) return merged;
+ if (XMLDoc.get() == nullptr) return;
- auto tmp = XMLDoc->findObjects(selector->mXPath, earlyReturn);
- std::move(std::begin(tmp), std::end(tmp), std::back_inserter(merged));
+ XMLDoc->findObjects(ret, selector->mXPath, earlyReturn);
- return merged;
+ return;
}
- return comparer.findObjects(root);
+ comparer.findObjects(ret, root);
}
-std::vector<std::shared_ptr<AccessibleNode>> Comparer::findObjects(const std::shared_ptr<AccessibleNode>& root)
+void Comparer::findObjects(std::vector<std::shared_ptr<AccessibleNode>> &ret,
+ const std::shared_ptr<AccessibleNode>& root)
{
std::list<std::shared_ptr<PartialMatch>> partialList{};
- std::vector<std::shared_ptr<AccessibleNode>> ret = findObjects(root, 0, 1, partialList);
+ findObjects(ret, root, 0, 1, partialList);
LOGI("%d object(s) found", (int)ret.size());
- return ret;
}
-std::vector<std::shared_ptr<AccessibleNode>> Comparer::findObjects(
+void Comparer::findObjects(std::vector<std::shared_ptr<AccessibleNode>> &ret,
const std::shared_ptr<AccessibleNode>& root, const int &index, const int &depth,
std::list<std::shared_ptr<PartialMatch>> &partialMatches)
{
- std::vector<std::shared_ptr<AccessibleNode>> ret;
- if (mSelector->mMatchShowing && !root->isShowing()) return ret;
+ if (mSelector->mMatchShowing && !root->isShowing()) return;
for (auto &match : partialMatches)
match->update(root, index, depth, partialMatches);
auto child = children[i];
if (child->getRawHandler() == nullptr) continue;
- std::vector<std::shared_ptr<AccessibleNode>> childret =
- findObjects(child, i, depth + 1, partialMatches);
- std::move(std::begin(childret), std::end(childret), std::back_inserter(ret));
+ findObjects(ret, child, i, depth + 1, partialMatches);
if (!ret.empty() && mEarlyReturn) {
LOGI("Object found and earlyReturn");
- return ret;
+ return;
}
}
} else {
LOGI("Found matched = %s with criteria %s", root->description().c_str(), currentMatch->debugPrint().c_str());
ret.push_back(root);
}
-
- return ret;
}