[orca] Chromium: Present treeitem node level



commit 262dcb5295abc7cd3e14e7470b88445aad1cc085
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Sat Jul 13 16:55:59 2019 -0400

    Chromium: Present treeitem node level

 .../scripts/toolkits/Gecko/script_utilities.py     | 20 -------------------
 src/orca/scripts/web/script_utilities.py           | 23 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 20 deletions(-)
---
diff --git a/src/orca/scripts/toolkits/Gecko/script_utilities.py 
b/src/orca/scripts/toolkits/Gecko/script_utilities.py
index e93fa25cb..7bc286105 100644
--- a/src/orca/scripts/toolkits/Gecko/script_utilities.py
+++ b/src/orca/scripts/toolkits/Gecko/script_utilities.py
@@ -72,26 +72,6 @@ class Utilities(web.Utilities):
 
         return True
 
-    def nodeLevel(self, obj):
-        """Determines the level of at which this object is at by using
-        the object attribute 'level'.  To be consistent with the default
-        nodeLevel() this value is 0-based (Gecko return is 1-based) """
-
-        if obj is None or self.isDead(obj) or obj.getRole() == pyatspi.ROLE_HEADING \
-           or (obj.parent and obj.parent.getRole() == pyatspi.ROLE_MENU):
-            return -1
-
-        try:
-            attrs = obj.getAttributes()
-        except:
-            msg = "GECKO: Exception getting attributes for %s" % obj
-            debug.println(debug.LEVEL_INFO, msg, True)
-            return -1
-        for attr in attrs:
-            if attr.startswith("level:"):
-                return int(attr[6:]) - 1
-        return -1
-
     def isLayoutOnly(self, obj):
         if super().isLayoutOnly(obj):
             return True
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index c1f38841c..2080f913e 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -108,6 +108,7 @@ class Utilities(script_utilities.Utilities):
         self._tag = {}
         self._xmlRoles = {}
         self._treatAsDiv = {}
+        self._nodeLevel = {}
         self._posinset = {}
         self._setsize = {}
         self._currentObjectContents = None
@@ -184,6 +185,7 @@ class Utilities(script_utilities.Utilities):
         self._tag = {}
         self._xmlRoles = {}
         self._treatAsDiv = {}
+        self._nodeLevel = {}
         self._posinset = {}
         self._setsize = {}
         self._paths = {}
@@ -516,6 +518,27 @@ class Utilities(script_utilities.Utilities):
         self._roleDescription[hash(obj)] = rv
         return rv
 
+    def nodeLevel(self, obj):
+        if not (obj and self.inDocumentContent(obj)):
+            return super().nodeLevel(obj)
+
+        rv = self._nodeLevel.get(hash(obj))
+        if rv is not None:
+            return rv
+
+        rv = -1
+        if not (self.inMenu(obj) or obj.getRole() == pyatspi.ROLE_HEADING):
+            try:
+                attrs = dict([attr.split(':', 1) for attr in obj.getAttributes()])
+            except:
+                attrs = {}
+
+            # ARIA levels are 1-based; non-web content is 0-based. Be consistent.
+            rv = int(attrs.get('level', 0)) -1
+
+        self._nodeLevel[hash(obj)] = rv
+        return rv
+
     def getPositionInSet(self, obj):
         rv = self._posinset.get(hash(obj))
         if rv is not None:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]