[orca] Don't present labels whose target is a context element



commit 479cb1faff8b86565a7253fec9d46fd30d3f8494
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Mon Jan 23 19:53:09 2017 +0100

    Don't present labels whose target is a context element

 src/orca/scripts/web/script_utilities.py |   50 +++++++++++++++++++----------
 src/orca/scripts/web/speech_generator.py |    9 +++--
 2 files changed, 39 insertions(+), 20 deletions(-)
---
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index a4903bb..f29473d 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -81,6 +81,7 @@ class Utilities(script_utilities.Utilities):
         self._isParentOfNullChild = {}
         self._inferredLabels = {}
         self._actualLabels = {}
+        self._labelTargets = {}
         self._displayedLabelText = {}
         self._roleDescription = {}
         self._shouldFilter = {}
@@ -140,6 +141,7 @@ class Utilities(script_utilities.Utilities):
         self._isParentOfNullChild = {}
         self._inferredLabels = {}
         self._actualLabels = {}
+        self._labelTargets = {}
         self._displayedLabelText = {}
         self._roleDescription = {}
         self._shouldFilter = {}
@@ -1992,7 +1994,7 @@ class Utilities(script_utilities.Utilities):
                or self.isHidden(obj) \
                or self.isOffScreenLabel(obj) \
                or self.isUselessImage(obj) \
-               or self.isLabellingContents(x, contents):
+               or self.isLabellingContents(obj, contents):
                 rv = False
 
             widget = self.isInferredLabelForContents(x, contents)
@@ -2183,6 +2185,28 @@ class Utilities(script_utilities.Utilities):
 
         return False
 
+    def labelTargets(self, obj):
+        if not (obj and self.inDocumentContent(obj)):
+            return False
+
+        rv = self._labelTargets.get(hash(obj))
+        if rv is not None:
+            return rv
+
+        rv = False
+
+        isLabel = lambda r: r.getRelationType() == pyatspi.RELATION_LABEL_FOR
+        relations = list(filter(isLabel, obj.getRelationSet()))
+        if not relations:
+            return []
+
+        r = relations[0]
+        rv = [r.getTarget(i) for i in range(r.getNTargets())]
+        rv = [hash(x) for x in rv if x is not None]
+
+        self._labelTargets[hash(obj)] = rv
+        return rv
+
     def isInferredLabelForContents(self, content, contents):
         obj, start, end, string = content
         objs = list(filter(self.shouldInferLabelFor, [x[0] for x in contents]))
@@ -2196,24 +2220,16 @@ class Utilities(script_utilities.Utilities):
 
         return None
 
-    def isLabellingContents(self, content, contents):
-        obj, start, end, string = content
-        if obj.getRole() != pyatspi.ROLE_LABEL:
-            return None
-
-        relationSet = obj.getRelationSet()
-        if not relationSet:
-            return None
+    def isLabellingContents(self, obj, contents=[]):
+        targets = self.labelTargets(obj)
+        if not contents:
+            return bool(targets)
 
-        for relation in relationSet:
-            if relation.getRelationType() == pyatspi.RELATION_LABEL_FOR:
-                for i in range(0, relation.getNTargets()):
-                    target = relation.getTarget(i)
-                    for content in contents:
-                        if content[0] == target:
-                            return target
+        for acc, start, end, string in contents:
+            if hash(acc) in targets:
+                return True
 
-        return None
+        return False
 
     def isAnchor(self, obj):
         if not (obj and self.inDocumentContent(obj)):
diff --git a/src/orca/scripts/web/speech_generator.py b/src/orca/scripts/web/speech_generator.py
index 58bb78d..c7b7cc0 100644
--- a/src/orca/scripts/web/speech_generator.py
+++ b/src/orca/scripts/web/speech_generator.py
@@ -476,10 +476,13 @@ class SpeechGenerator(speech_generator.SpeechGenerator):
         if not 'priorObj' in args:
             args['priorObj'] = self._script.utilities.getPriorContext()[0]
 
-        result.extend(super().generateSpeech(obj, **args))
-        result = list(filter(lambda x: x, result))
-        self._restoreRole(oldRole, args)
+        if self._script.utilities.isLabellingContents(obj):
+            result = list(filter(lambda x: x, self.generateContext(obj, **args)))
+
+        if not result:
+            result = list(filter(lambda x: x, super().generateSpeech(obj, **args)))
 
+        self._restoreRole(oldRole, args)
         msg = "WEB: Speech generation for document object %s complete:" % obj
         debug.println(debug.LEVEL_INFO, msg)
         for element in result:


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