[orca] Filter out selection event spam from browser chrome autocompletes



commit ca1c7103df879606d2edf34c0e555f4e4bd5cead
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Wed Oct 7 17:26:42 2015 -0400

    Filter out selection event spam from browser chrome autocompletes

 src/orca/scripts/toolkits/Gecko/script.py |   10 +++++++++
 src/orca/scripts/web/script.py            |   25 ++++++++++++++++++++++
 src/orca/scripts/web/script_utilities.py  |   32 +++++++++++++++++++++++++++++
 3 files changed, 67 insertions(+), 0 deletions(-)
---
diff --git a/src/orca/scripts/toolkits/Gecko/script.py b/src/orca/scripts/toolkits/Gecko/script.py
index 6497a18..a9f75cf 100644
--- a/src/orca/scripts/toolkits/Gecko/script.py
+++ b/src/orca/scripts/toolkits/Gecko/script.py
@@ -218,6 +218,16 @@ class Script(web.Script):
         debug.println(debug.LEVEL_INFO, msg)
         default.Script.onNameChanged(self, event)
 
+    def onSelectedChanged(self, event):
+        """Callback for object:state-changed:selected accessibility events."""
+
+        if super().onSelectedChanged(event):
+            return
+
+        msg = "GECKO: Passing along event to default script"
+        debug.println(debug.LEVEL_INFO, msg)
+        default.Script.onSelectedChanged(self, event)
+
     def onSelectionChanged(self, event):
         """Callback for object:selection-changed accessibility events."""
 
diff --git a/src/orca/scripts/web/script.py b/src/orca/scripts/web/script.py
index 7cc444f..04e2b0f 100644
--- a/src/orca/scripts/web/script.py
+++ b/src/orca/scripts/web/script.py
@@ -1444,9 +1444,34 @@ class Script(default.Script):
 
         return True
 
+    def onSelectedChanged(self, event):
+        """Callback for object:state-changed:selected accessibility events."""
+
+        if self.utilities.eventIsChromeAutocompleteNoise(event):
+            msg = "WEB: Ignoring event believed to be chrome autocomplete noise"
+            debug.println(debug.LEVEL_INFO, msg)
+            return True
+
+        if not self.utilities.inDocumentContent(event.source):
+            msg = "WEB: Event source is not in document content"
+            debug.println(debug.LEVEL_INFO, msg)
+            return False
+
+        if orca_state.locusOfFocus != event.source:
+            msg = "WEB: Ignoring because event source is not locusOfFocus"
+            debug.println(debug.LEVEL_INFO, msg)
+            return True
+
+        return False
+
     def onSelectionChanged(self, event):
         """Callback for object:selection-changed accessibility events."""
 
+        if self.utilities.eventIsChromeAutocompleteNoise(event):
+            msg = "WEB: Ignoring event believed to be chrome autocomplete noise"
+            debug.println(debug.LEVEL_INFO, msg)
+            return True
+
         if not self.utilities.inDocumentContent(event.source):
             msg = "WEB: Event source is not in document content"
             debug.println(debug.LEVEL_INFO, msg)
diff --git a/src/orca/scripts/web/script_utilities.py b/src/orca/scripts/web/script_utilities.py
index 42fbd7e..3b1989c 100644
--- a/src/orca/scripts/web/script_utilities.py
+++ b/src/orca/scripts/web/script_utilities.py
@@ -2169,6 +2169,38 @@ class Utilities(script_utilities.Utilities):
 
         return False
 
+    def eventIsChromeAutocompleteNoise(self, event):
+        if self.inDocumentContent(event.source):
+            return False
+
+        selection = ["object:selection-changed", "object:state-changed:selected"]
+        if not event.type in selection:
+            return False
+
+        try:
+            focusRole = orca_state.locusOfFocus.getRole()
+            focusState = orca_state.locusOfFocus.getState()
+        except:
+            msg = "WEB: Exception getting role and state for %s" % orca_state.locusOfFocus
+            debug.println(debug.LEVEL_INFO, msg)
+            return False
+
+        try:
+            role = event.source.getRole()
+        except:
+            msg = "WEB: Exception getting role for %s" % event.source
+            debug.println(debug.LEVEL_INFO, msg)
+            return False
+
+        if role in [pyatspi.ROLE_MENU, pyatspi.ROLE_MENU_ITEM] \
+           and focusRole == pyatspi.ROLE_ENTRY \
+           and focusState.contains(pyatspi.STATE_FOCUSED):
+            lastKey, mods = self.lastKeyAndModifiers()
+            if lastKey not in ["Down", "Up"]:
+                return True
+
+        return False
+
     def textEventIsDueToInsertion(self, event):
         if not event.type.startswith("object:text-"):
             return False


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