[orca] Improve performance of presentation of web listboxes



commit f811cfffcc1d488e52050589078ac4cf564ad8a3
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Sun Nov 29 00:02:28 2015 -0500

    Improve performance of presentation of web listboxes

 src/orca/braille_generator.py            |    6 +++-
 src/orca/scripts/web/script_utilities.py |   38 ++++++++++++++++++++++++++++++
 src/orca/scripts/web/speech_generator.py |   19 +++++++--------
 src/orca/speech_generator.py             |    6 +++-
 4 files changed, 55 insertions(+), 14 deletions(-)
---
diff --git a/src/orca/braille_generator.py b/src/orca/braille_generator.py
index 10efc8f..f5a2376 100644
--- a/src/orca/braille_generator.py
+++ b/src/orca/braille_generator.py
@@ -324,8 +324,10 @@ class BrailleGenerator(generator.Generator):
         if role not in [pyatspi.ROLE_LIST, pyatspi.ROLE_LIST_BOX]:
             return result
 
-        items = self._script.utilities.selectedChildren(obj)
-        items = items or [self._script.utilities.focusedChild(obj)]
+        if 'Selection' in pyatspi.listInterfaces(obj):
+            items = self._script.utilities.selectedChildren(obj)
+        else:
+            items = items or [self._script.utilities.focusedChild(obj)]
         if not (items and items[0]):
             return result
 
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index ff48a07..54c19e7 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -74,6 +74,8 @@ class Utilities(script_utilities.Utilities):
         self._text = {}
         self._tag = {}
         self._treatAsDiv = {}
+        self._posinset = {}
+        self._setsize = {}
         self._currentObjectContents = None
         self._currentSentenceContents = None
         self._currentLineContents = None
@@ -119,6 +121,8 @@ class Utilities(script_utilities.Utilities):
         self._roleDescription = {}
         self._tag = {}
         self._treatAsDiv = {}
+        self._posinset = {}
+        self._setsize = {}
         self._cleanupContexts()
 
     def clearContentCache(self):
@@ -371,6 +375,40 @@ class Utilities(script_utilities.Utilities):
         self._roleDescription[hash(obj)] = rv
         return rv
 
+    def getPositionInSet(self, obj):
+        rv = self._posinset.get(hash(obj))
+        if rv is not None:
+            return rv
+
+        try:
+            attrs = dict([attr.split(':', 1) for attr in obj.getAttributes()])
+        except:
+            attrs = {}
+
+        position = attrs.get('posinset')
+        if position is not None:
+            rv = int(position)
+
+        self._posinset[hash(obj)] = rv
+        return rv
+
+    def getSetSize(self, obj):
+        rv = self._setsize.get(hash(obj))
+        if rv is not None:
+            return rv
+
+        try:
+            attrs = dict([attr.split(':', 1) for attr in obj.getAttributes()])
+        except:
+            attrs = {}
+
+        setsize = attrs.get('setsize')
+        if setsize is not None:
+            rv = int(setsize)
+
+        self._setsize[hash(obj)] = rv
+        return rv
+
     def _getID(self, obj):
         if hash(obj) in self._id:
             return self._id.get(hash(obj))
diff --git a/src/orca/scripts/web/speech_generator.py b/src/orca/scripts/web/speech_generator.py
index 38d22f3..832193f 100644
--- a/src/orca/scripts/web/speech_generator.py
+++ b/src/orca/scripts/web/speech_generator.py
@@ -194,11 +194,15 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
         if role not in [pyatspi.ROLE_LIST, pyatspi.ROLE_LIST_BOX]:
             return super()._generateNumberOfChildren(obj, **args)
 
-        children = [x for x in obj if x.getRole() == pyatspi.ROLE_LIST_ITEM]
-        if not children:
+        setsize = self._script.utilities.getSetSize(obj[0])
+        if setsize is None:
+            children = [x for x in obj if x.getRole() == pyatspi.ROLE_LIST_ITEM]
+            setsize = len(children)
+
+        if not setsize:
             return []
 
-        result = [messages.listItemCount(len(children))]
+        result = [messages.listItemCount(setsize)]
         result.extend(self.voice(speech_generator.SYSTEM))
         return result
 
@@ -404,13 +408,8 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
         if self._script.utilities.isTextBlockElement(obj):
             return []
 
-        try:
-            attrs = dict([attr.split(':', 1) for attr in obj.getAttributes()])
-        except:
-            attrs = {}
-
-        position = attrs.get("posinset")
-        total = attrs.get("setsize")
+        position = self._script.utilities.getPositionInSet(obj)
+        total = self._script.utilities.getSetSize(obj)
         if position is None or total is None:
             return super()._generatePositionInList(obj, **args)
 
diff --git a/src/orca/speech_generator.py b/src/orca/speech_generator.py
index 52576de..0a9f55b 100644
--- a/src/orca/speech_generator.py
+++ b/src/orca/speech_generator.py
@@ -1468,8 +1468,10 @@ class SpeechGenerator(generator.Generator):
         if role not in [pyatspi.ROLE_LIST, pyatspi.ROLE_LIST_BOX]:
             return result
 
-        items = self._script.utilities.selectedChildren(obj)
-        items = items or [self._script.utilities.focusedChild(obj)]
+        if 'Selection' in pyatspi.listInterfaces(obj):
+            items = self._script.utilities.selectedChildren(obj)
+        else:
+            items = items or [self._script.utilities.focusedChild(obj)]
         if not (items and items[0]):
             return result
 


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