[orca] Improve performance of presentation of web listboxes
- From: Joanmarie Diggs <joanied src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [orca] Improve performance of presentation of web listboxes
- Date: Sun, 29 Nov 2015 05:07:15 +0000 (UTC)
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]