Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
SubModules: Node search: Implement url criterion
Browse files Browse the repository at this point in the history
The URL is lazily fetched and cached as this can be an expensive lookup.

Bump API version to 0.5
JulienCochuyt committed Oct 15, 2024
1 parent d0a5b41 commit 427a6b5
Showing 4 changed files with 44 additions and 25 deletions.
12 changes: 1 addition & 11 deletions addon/globalPlugins/webAccess/gui/criteriaEditor.py
Original file line number Diff line number Diff line change
@@ -645,17 +645,7 @@ def initData(self, context):
classChoices.append(node.className or "")
statesChoices.append(getStatesLblExprForSet(node.states) or "")
srcChoices.append(node.src or "")
url = ""
if node.role == controlTypes.ROLE_DOCUMENT:
obj = node.getNVDAObject()
while obj.role != node.role:
try:
obj = obj.parent
except Exception:
break
if obj.role == node.role:
url = obj.IAccessibleObject.accValue(obj.IAccessibleChildID)
urlChoices.append(url)
urlChoices.append(node.url or "")
node = node.parent

self.textCombo.Set(textChoices)
8 changes: 2 additions & 6 deletions addon/globalPlugins/webAccess/gui/elementDescription.py
Original file line number Diff line number Diff line change
@@ -130,12 +130,8 @@ def getNodeDescription():
)))))
if node.src:
parts.append(" src %s" % node.src)
if node.role == controlTypes.ROLE_DOCUMENT:
obj = node.getNVDAObject()
while obj.role != node.role:
obj = obj.parent
url = obj.IAccessibleObject.accValue(obj.IAccessibleChildID)
parts.append(" url %s" % url)
if node.url:
parts.append(" url %s" % node.url)
parts.append(" text %s" % truncText(node))
branch.append("\n".join(parts))
node = node.parent
20 changes: 19 additions & 1 deletion addon/globalPlugins/webAccess/nodeHandler.py
Original file line number Diff line number Diff line change
@@ -525,7 +525,25 @@ def parent(self):
@property
def previousTextNode(self):
return self._previousTextNode and self._previousTextNode()


@property
def url(self):
if hasattr(self, "_url"):
return self._url
if self.role != controlTypes.ROLE_DOCUMENT:
return None
url = None
obj = self.getNVDAObject()
while obj.role != self.role:
try:
obj = obj.parent
except Exception:
break
else:
url = obj.IAccessibleObject.accValue(obj.IAccessibleChildID)
self._url = url
return url

def isReady(self):
return self.nodeManager and self.nodeManager.isReady

29 changes: 22 additions & 7 deletions addon/globalPlugins/webAccess/ruleHandler/__init__.py
Original file line number Diff line number Diff line change
@@ -1404,6 +1404,7 @@ def getSimpleSearchKwargs(criteria, raiseOnUnsupported=False):
"states",
"tag",
"text",
"url",
]:
if raiseOnUnsupported:
raise ValueError(
@@ -1424,8 +1425,10 @@ def getSimpleSearchKwargs(criteria, raiseOnUnsupported=False):
kwargs["in_text"] = expr[1:]
continue
if prop == "className":
# For "className", both space and ampersand are treated as "and" operator
expr = expr.replace(" ", "&")
for andIndex, expr in enumerate(expr.split("&")):
# For "url", only space is treated as "and" operator
for andIndex, expr in enumerate(expr.split("&" if prop != "url" else " ")):
expr = expr.strip()
eq = []
notEq = []
@@ -1437,15 +1440,27 @@ def getSimpleSearchKwargs(criteria, raiseOnUnsupported=False):
continue
if expr[0] == "!":
expr = expr[1:].strip()
if "*" in (expr[0], expr[-1]):
notIn.append(expr.strip("*").strip())
if prop == "url":
if expr[0] == "=":
notEq.append(expr[1:].strip())
else:
notIn.append(expr)
else:
notEq.append(expr)
if "*" in (expr[0], expr[-1]):
notIn.append(expr.strip("*").strip())
else:
notEq.append(expr)
else:
if "*" in (expr[0], expr[-1]):
in_.append(expr.strip("*").strip())
if prop == "url":
if expr[0] == "=":
eq.append(expr[1:].strip())
else:
in_.append(expr)
else:
eq.append(expr)
if "*" in (expr[0], expr[-1]):
in_.append(expr.strip("*").strip())
else:
eq.append(expr)
for test, values in (
("eq", eq),
("notEq", notEq),

0 comments on commit 427a6b5

Please sign in to comment.