diff --git a/addon/globalPlugins/webAccess/gui/criteriaEditor.py b/addon/globalPlugins/webAccess/gui/criteriaEditor.py index 8db970fb..7208d976 100644 --- a/addon/globalPlugins/webAccess/gui/criteriaEditor.py +++ b/addon/globalPlugins/webAccess/gui/criteriaEditor.py @@ -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) diff --git a/addon/globalPlugins/webAccess/gui/elementDescription.py b/addon/globalPlugins/webAccess/gui/elementDescription.py index 8f748e4d..084f55d3 100644 --- a/addon/globalPlugins/webAccess/gui/elementDescription.py +++ b/addon/globalPlugins/webAccess/gui/elementDescription.py @@ -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 diff --git a/addon/globalPlugins/webAccess/nodeHandler.py b/addon/globalPlugins/webAccess/nodeHandler.py index 41b780f8..6dcacef8 100644 --- a/addon/globalPlugins/webAccess/nodeHandler.py +++ b/addon/globalPlugins/webAccess/nodeHandler.py @@ -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 diff --git a/addon/globalPlugins/webAccess/ruleHandler/__init__.py b/addon/globalPlugins/webAccess/ruleHandler/__init__.py index ba24be54..b75bd58d 100644 --- a/addon/globalPlugins/webAccess/ruleHandler/__init__.py +++ b/addon/globalPlugins/webAccess/ruleHandler/__init__.py @@ -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),