[orca] Try to handle more cases of CSSed text being exposed as one char per line



commit cbd7e10aa3923331be14b6b0b3a27ee641b87b0b
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Tue Jul 23 20:18:17 2019 -0400

    Try to handle more cases of CSSed text being exposed as one char per line

 src/orca/scripts/web/script_utilities.py | 41 ++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
---
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index 7c61f7e8b..7b3995cc4 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -72,6 +72,7 @@ class Utilities(script_utilities.Utilities):
         self._isOffScreenLabel = {}
         self._isOffScreenLink = {}
         self._isOffScreenTextBlockElement = {}
+        self._elementLinesAreSingleChars= {}
         self._hasExplicitName = {}
         self._hasNoSize = {}
         self._hasLongDesc = {}
@@ -150,6 +151,7 @@ class Utilities(script_utilities.Utilities):
         self._isOffScreenLabel = {}
         self._isOffScreenLink = {}
         self._isOffScreenTextBlockElement = {}
+        self._elementLinesAreSingleChars= {}
         self._hasExplicitName = {}
         self._hasNoSize = {}
         self._hasLongDesc = {}
@@ -1261,6 +1263,16 @@ class Utilities(script_utilities.Utilities):
                 debug.println(debug.LEVEL_INFO, msg, True)
                 boundary = None
 
+            if self.elementLinesAreSingleChars(obj):
+                if obj.name:
+                    msg = "WEB: Returning name as contents for %s (single-char lines)" % obj
+                    debug.println(debug.LEVEL_INFO, msg, True)
+                    return [[obj, 0, len(obj.name), obj.name]]
+
+                msg = "WEB: Returning all text as contents for %s (single-char lines)" % obj
+                debug.println(debug.LEVEL_INFO, msg, True)
+                boundary = None
+
         role = obj.getRole()
         if role == pyatspi.ROLE_INTERNAL_FRAME and obj.childCount == 1:
             return self._getContentsForObj(obj[0], 0, boundary)
@@ -2679,6 +2691,35 @@ class Utilities(script_utilities.Utilities):
         self._isOffScreenLink[hash(obj)] = rv
         return rv
 
+    def elementLinesAreSingleChars(self, obj):
+        if not (obj and self.inDocumentContent(obj)):
+            return False
+
+        rv = self._elementLinesAreSingleChars.get(hash(obj))
+        if rv is not None:
+            return rv
+
+        text = self.queryNonEmptyText(obj)
+        if not text:
+            return False
+
+        try:
+            nChars = text.characterCount
+        except:
+            return False
+
+        boundary = pyatspi.TEXT_BOUNDARY_LINE_START
+        for i in range(nChars):
+            string, start, end = text.getTextAtOffset(i, boundary)
+            if len(string) > 1:
+                rv = False
+                break
+        else:
+            rv = True
+
+        self._elementLinesAreSingleChars[hash(obj)] = rv
+        return rv
+
     def isOffScreenLabel(self, obj):
         if not (obj and self.inDocumentContent(obj)):
             return False


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