[orca] Chromium: Hack around missing hyperlink implementation for non-links



commit d0fab641a7c09b671317f388023e3e1b525f0301
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Sat Jul 13 15:04:58 2019 -0400

    Chromium: Hack around missing hyperlink implementation for non-links

 src/orca/script_utilities.py                       | 17 ++++++++++------
 .../scripts/toolkits/Chromium/script_utilities.py  | 23 ++++++++++++++++++++++
 src/orca/scripts/web/script_utilities.py           | 16 ---------------
 3 files changed, 34 insertions(+), 22 deletions(-)
---
diff --git a/src/orca/script_utilities.py b/src/orca/script_utilities.py
index 8d9e34d93..60407f7ac 100644
--- a/src/orca/script_utilities.py
+++ b/src/orca/script_utilities.py
@@ -3602,17 +3602,22 @@ class Utilities:
 
         return root, offset
 
-    @staticmethod
-    def getHyperlinkRange(obj):
-        """Returns the start and end indices associated with the embedded
-        object, obj."""
+    def getHyperlinkRange(self, obj):
+        """Returns the text range in parent associated with obj."""
 
         try:
             hyperlink = obj.queryHyperlink()
+            start, end = hyperlink.startIndex, hyperlink.endIndex
         except NotImplementedError:
-            return 0, 0
+            msg = "INFO: %s does not implement the hyperlink interface" % obj
+            debug.println(debug.LEVEL_INFO, msg, True)
+            return -1, -1
+        except:
+            msg = "INFO: Exception getting hyperlink indices for %s" % obj
+            debug.println(debug.LEVEL_INFO, msg, True)
+            return -1, -1
 
-        return hyperlink.startIndex, hyperlink.endIndex
+        return start, end
 
     def selectedChildren(self, obj):
         try:
diff --git a/src/orca/scripts/toolkits/Chromium/script_utilities.py 
b/src/orca/scripts/toolkits/Chromium/script_utilities.py
index 38c2ff008..11fea1a94 100644
--- a/src/orca/scripts/toolkits/Chromium/script_utilities.py
+++ b/src/orca/scripts/toolkits/Chromium/script_utilities.py
@@ -32,6 +32,7 @@ __copyright__ = "Copyright (c) 2018 Igalia, S.L."
 __license__   = "LGPL"
 
 import pyatspi
+import re
 import time
 
 from orca import debug
@@ -332,3 +333,25 @@ class Utilities(web.Utilities):
             msg = "CHROMIUM: HACK: Grabbing focus on %s's ancestor %s" % (obj, link)
             debug.println(debug.LEVEL_INFO, msg, True)
             self.grabFocus(link)
+
+    def getHyperlinkRange(self, obj):
+        """Returns the text range in parent associated with obj."""
+
+        start, end = super().getHyperlinkRange(obj)
+        if (start, end) != (-1, -1):
+            return start, end
+
+        if not (obj.parent and "Text" in pyatspi.listInterfaces(obj.parent)):
+            return start, end
+
+        # At the present time, Chromium is only implementing the hyperlink interface
+        # for actual links. We need that fixed. This hack may or may not be reliable.
+        parentText = obj.parent.queryText().getText(0, -1)
+        eocs = [x.span() for x in re.finditer("\ufffc", parentText)]
+        index = obj.getIndexInParent()
+        if 0 <= index < len(eocs):
+            start, end = eocs[index]
+            msg = "CHROMIUM: HACK: Hyperlink range of %s is (%i,%i)" % (obj, start, end)
+            debug.println(debug.LEVEL_INFO, msg, True)
+
+        return start, end
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index 12fdd8ecb..c1f38841c 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -3686,22 +3686,6 @@ class Utilities(script_utilities.Utilities):
         self._isContentEditableWithEmbeddedObjects[hash(obj)] = rv
         return rv
 
-    @staticmethod
-    def getHyperlinkRange(obj):
-        try:
-            hyperlink = obj.queryHyperlink()
-            start, end = hyperlink.startIndex, hyperlink.endIndex
-        except NotImplementedError:
-            msg = "WEB: %s does not implement the hyperlink interface" % obj
-            debug.println(debug.LEVEL_INFO, msg, True)
-            return -1, -1
-        except:
-            msg = "WEB: Exception getting hyperlink indices for %s" % obj
-            debug.println(debug.LEVEL_INFO, msg, True)
-            return -1, -1
-
-        return start, end
-
     def characterOffsetInParent(self, obj):
         start, end, length = self._rangeInParentWithLength(obj)
         return start


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