OSDN Git Service

flash vbuf: __contains__: The Flash root object has two different object IDs, but...
authorJames Teh <jamie@jantrid.net>
Fri, 15 Feb 2013 01:32:29 +0000 (11:32 +1000)
committerJames Teh <jamie@jantrid.net>
Fri, 15 Feb 2013 01:32:29 +0000 (11:32 +1000)
Also, in getIdentifierFromNVDAObject (which __contains__ now uses), never use event parameters if they aren't valid.
Fixes recreation of Flash buffers every time you move out and back into Flash content.

source/virtualBuffers/adobeFlash.py

index ebb9f23..4358837 100644 (file)
@@ -39,14 +39,17 @@ class AdobeFlash(VirtualBuffer):
 \r
        def __contains__(self,obj):\r
                if self.isWindowless:\r
-                       if obj.windowHandle != self.rootNVDAObject.windowHandle:\r
+                       if not isinstance(obj, NVDAObjects.IAccessible.IAccessible):\r
+                               return False\r
+                       docHandle, ID = self.getIdentifierFromNVDAObject(obj)\r
+                       if docHandle != self.rootDocHandle:\r
                                return False\r
                        try:\r
-                               self.rootNVDAObject.IAccessibleObject.accChild(obj.event_objectID)\r
+                               self.rootNVDAObject.IAccessibleObject.accChild(ID)\r
                                return True\r
                        except COMError:\r
                                return False\r
-               return winUser.isDescendantWindow(self.rootNVDAObject.windowHandle, obj.windowHandle)\r
+               return winUser.isDescendantWindow(self.rootDocHandle, obj.windowHandle)\r
 \r
        def _get_isAlive(self):\r
                if self.isLoading:\r
@@ -73,7 +76,12 @@ class AdobeFlash(VirtualBuffer):
                        # Trust IAccIdentity over the event parameters.\r
                        accId = info["objectID"]\r
                else:\r
-                       accId = obj.event_objectID if obj.event_objectID > 0 else obj.event_childID\r
+                       accId = obj.event_objectID\r
+                       if accId is None:\r
+                               # We don't have event parameters, so we can't get an ID.\r
+                               raise LookupError\r
+                       if accId <= 0:\r
+                               accId = obj.event_childID\r
                return obj.windowHandle, accId\r
 \r
        def _searchableAttribsForNodeType(self,nodeType):\r