[orca] Prevent double-presentation of live-region events



commit 6fb5e4b00b22aadebcd3652dcb756a4fb63efddc
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Mon May 6 14:26:53 2019 -0400

    Prevent double-presentation of live-region events

 src/orca/scripts/toolkits/Chromium/script.py |  5 +++++
 src/orca/scripts/web/script.py               |  5 +++++
 src/orca/scripts/web/script_utilities.py     | 23 ++++++++++++++++++++++-
 3 files changed, 32 insertions(+), 1 deletion(-)
---
diff --git a/src/orca/scripts/toolkits/Chromium/script.py b/src/orca/scripts/toolkits/Chromium/script.py
index 63cd5eb1f..b391f3449 100644
--- a/src/orca/scripts/toolkits/Chromium/script.py
+++ b/src/orca/scripts/toolkits/Chromium/script.py
@@ -193,6 +193,11 @@ class Script(web.Script):
     def onChildrenChanged(self, event):
         """Callback for object:children-changed accessibility events."""
 
+        if self.utilities.isStaticTextLeaf(event.any_data):
+            msg = "CHROMIUM: Ignoring because child is static text leaf"
+            debug.println(debug.LEVEL_INFO, msg, True)
+            return
+
         if super().onChildrenChanged(event):
             return
 
diff --git a/src/orca/scripts/web/script.py b/src/orca/scripts/web/script.py
index 61688ccb4..50f1c7146 100644
--- a/src/orca/scripts/web/script.py
+++ b/src/orca/scripts/web/script.py
@@ -1645,6 +1645,11 @@ class Script(default.Script):
 
         childRole = event.any_data.getRole()
         if childRole == pyatspi.ROLE_ALERT:
+            if event.any_data == self.utilities.lastQueuedLiveRegion():
+                msg = "WEB: Ignoring %s (is last queued live region)" % event.any_data
+                debug.println(debug.LEVEL_INFO, msg, True)
+                return True
+
             msg = "WEB: Presenting event.any_data"
             debug.println(debug.LEVEL_INFO, msg, True)
             self.presentObject(event.any_data)
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index 5df6b5077..e74e1d832 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -113,6 +113,7 @@ class Utilities(script_utilities.Utilities):
         self._currentLineContents = None
         self._currentWordContents = None
         self._currentCharacterContents = None
+        self._lastQueuedLiveRegionEvent = None
 
         self._validChildRoles = {pyatspi.ROLE_LIST: [pyatspi.ROLE_LIST_ITEM]}
 
@@ -185,6 +186,7 @@ class Utilities(script_utilities.Utilities):
         self._contextPathsRolesAndNames = {}
         self._cleanupContexts()
         self._priorContexts = {}
+        self._lastQueuedLiveRegionEvent = None
 
     def clearContentCache(self):
         self._currentObjectContents = None
@@ -4021,6 +4023,18 @@ class Utilities(script_utilities.Utilities):
 
         return None, -1
 
+    def lastQueuedLiveRegion(self):
+        if self._lastQueuedLiveRegionEvent is None:
+            return None
+
+        if self._lastQueuedLiveRegionEvent.type.startswith("object:text-changed:insert"):
+            return self._lastQueuedLiveRegionEvent.source
+
+        if self._lastQueuedLiveRegionEvent.type.startswith("object:children-changed:add"):
+            return self._lastQueuedLiveRegionEvent.any_data
+
+        return None
+
     def handleAsLiveRegion(self, event):
         if not _settingsManager.getSetting('inferLiveRegions'):
             return False
@@ -4034,7 +4048,7 @@ class Utilities(script_utilities.Utilities):
             except:
                 msg = "WEB: Exception getting role for %s" % event.any_data
                 debug.println(debug.LEVEL_INFO, msg, True)
-                return True
+                return False
 
             if role in [pyatspi.ROLE_UNKNOWN, pyatspi.ROLE_REDUNDANT_OBJECT] \
                and not self._getTag(event.any_data):
@@ -4042,6 +4056,13 @@ class Utilities(script_utilities.Utilities):
                 debug.println(debug.LEVEL_INFO, msg, True)
                 return False
 
+            if self.lastQueuedLiveRegion() == event.any_data \
+               and self._lastQueuedLiveRegionEvent.type != event.type:
+                msg = "WEB: Event is believed to be redundant live region notification"
+                debug.println(debug.LEVEL_INFO, msg, True)
+                return False
+
+        self._lastQueuedLiveRegionEvent = event
         return True
 
     def getPageObjectCount(self, obj):


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