diff --git a/source/IAccessibleHandler/__init__.py b/source/IAccessibleHandler/__init__.py index beba0bab96d..9a32972a1bd 100644 --- a/source/IAccessibleHandler/__init__.py +++ b/source/IAccessibleHandler/__init__.py @@ -1,4 +1,3 @@ -# IAccessibleHandler.py # A part of NonVisual Desktop Access (NVDA) # Copyright (C) 2006-2007 NVDA Contributors # This file is covered by the GNU General Public License. @@ -7,8 +6,6 @@ from typing import Tuple import struct import weakref -# Kept for backwards compatibility -from ctypes import * # noqa: F401, F403 from ctypes import ( wintypes, windll, @@ -26,80 +23,9 @@ import oleacc import UIAHandler -# Kept for backwards compatibility -from comInterfaces.Accessibility import * # noqa: F401, F403 -# Specific imports for items we know we use, hopefully in the future we can remove the import for this module. -from comInterfaces.Accessibility import ( - IAccessible, - IAccIdentity, - CAccPropServices, -) -# Kept for backwards compatibility -from comInterfaces.IAccessible2Lib import * # noqa: F401, F403 -# Specific imports for items we know we use, hopefully in the future we can remove the import for this module. -from comInterfaces.IAccessible2Lib import ( - IAccessibleText, - IAccessibleHypertext, - IAccessible2, - IA2_STATE_REQUIRED, - IA2_STATE_INVALID_ENTRY, - IA2_STATE_MODAL, - IA2_STATE_DEFUNCT, - IA2_STATE_SUPPORTS_AUTOCOMPLETION, - IA2_STATE_MULTI_LINE, - IA2_STATE_ICONIFIED, - IA2_STATE_EDITABLE, - IA2_STATE_PINNED, - IA2_STATE_CHECKABLE, - IA2_ROLE_UNKNOWN, - IA2_ROLE_CANVAS, - IA2_ROLE_CAPTION, - IA2_ROLE_CHECK_MENU_ITEM, - IA2_ROLE_COLOR_CHOOSER, - IA2_ROLE_DATE_EDITOR, - IA2_ROLE_DIRECTORY_PANE, - IA2_ROLE_DESKTOP_PANE, - IA2_ROLE_EDITBAR, - IA2_ROLE_EMBEDDED_OBJECT, - IA2_ROLE_ENDNOTE, - IA2_ROLE_FILE_CHOOSER, - IA2_ROLE_FONT_CHOOSER, - IA2_ROLE_FRAME, - IA2_ROLE_FOOTNOTE, - IA2_ROLE_FORM, - IA2_ROLE_GLASS_PANE, - IA2_ROLE_HEADER, - IA2_ROLE_HEADING, - IA2_ROLE_ICON, - IA2_ROLE_IMAGE_MAP, - IA2_ROLE_INPUT_METHOD_WINDOW, - IA2_ROLE_INTERNAL_FRAME, - IA2_ROLE_LABEL, - IA2_ROLE_LAYERED_PANE, - IA2_ROLE_NOTE, - IA2_ROLE_OPTION_PANE, - IA2_ROLE_PAGE, - IA2_ROLE_PARAGRAPH, - IA2_ROLE_RADIO_MENU_ITEM, - IA2_ROLE_REDUNDANT_OBJECT, - IA2_ROLE_ROOT_PANE, - IA2_ROLE_RULER, - IA2_ROLE_SCROLL_PANE, - IA2_ROLE_SECTION, - IA2_ROLE_SHAPE, - IA2_ROLE_SPLIT_PANE, - IA2_ROLE_TEAR_OFF_MENU, - IA2_ROLE_TERMINAL, - IA2_ROLE_TEXT_FRAME, - IA2_ROLE_TOGGLE_BUTTON, - IA2_ROLE_VIEW_PORT, - IA2_ROLE_CONTENT_DELETION, - IA2_ROLE_CONTENT_INSERTION, - IA2_ROLE_BLOCK_QUOTE, - IA2_ROLE_DESKTOP_ICON, - IA2_ROLE_FOOTER, - IA2_ROLE_MARK, -) +from comInterfaces import Accessibility as IA + +from comInterfaces import IAccessible2Lib as IA2 import config @@ -170,15 +96,7 @@ def isMSAADebugLoggingEnabled(): ] from . import internalWinEventHandler -# Imported for backwards compat -from .internalWinEventHandler import ( # noqa: F401 - winEventHookIDs, - winEventLimiter, - winEventIDsToNVDAEventNames, - _shouldGetEvents, -) -from comInterfaces import IAccessible2Lib as IA2 from logHandler import log import JABHandler import eventHandler @@ -276,55 +194,55 @@ def isMSAADebugLoggingEnabled(): oleacc.ROLE_SYSTEM_OUTLINEBUTTON: controlTypes.ROLE_TREEVIEWBUTTON, oleacc.ROLE_SYSTEM_CLOCK: controlTypes.ROLE_CLOCK, # IAccessible2 roles - IA2_ROLE_UNKNOWN: controlTypes.ROLE_UNKNOWN, - IA2_ROLE_CANVAS: controlTypes.ROLE_CANVAS, - IA2_ROLE_CAPTION: controlTypes.ROLE_CAPTION, - IA2_ROLE_CHECK_MENU_ITEM: controlTypes.ROLE_CHECKMENUITEM, - IA2_ROLE_COLOR_CHOOSER: controlTypes.ROLE_COLORCHOOSER, - IA2_ROLE_DATE_EDITOR: controlTypes.ROLE_DATEEDITOR, - IA2_ROLE_DESKTOP_ICON: controlTypes.ROLE_DESKTOPICON, - IA2_ROLE_DESKTOP_PANE: controlTypes.ROLE_DESKTOPPANE, - IA2_ROLE_DIRECTORY_PANE: controlTypes.ROLE_DIRECTORYPANE, - IA2_ROLE_EDITBAR: controlTypes.ROLE_EDITBAR, - IA2_ROLE_EMBEDDED_OBJECT: controlTypes.ROLE_EMBEDDEDOBJECT, - IA2_ROLE_ENDNOTE: controlTypes.ROLE_ENDNOTE, - IA2_ROLE_FILE_CHOOSER: controlTypes.ROLE_FILECHOOSER, - IA2_ROLE_FONT_CHOOSER: controlTypes.ROLE_FONTCHOOSER, - IA2_ROLE_FOOTER: controlTypes.ROLE_FOOTER, - IA2_ROLE_FOOTNOTE: controlTypes.ROLE_FOOTNOTE, - IA2_ROLE_FORM: controlTypes.ROLE_FORM, - IA2_ROLE_FRAME: controlTypes.ROLE_FRAME, - IA2_ROLE_GLASS_PANE: controlTypes.ROLE_GLASSPANE, - IA2_ROLE_HEADER: controlTypes.ROLE_HEADER, - IA2_ROLE_HEADING: controlTypes.ROLE_HEADING, - IA2_ROLE_ICON: controlTypes.ROLE_ICON, - IA2_ROLE_IMAGE_MAP: controlTypes.ROLE_IMAGEMAP, - IA2_ROLE_INPUT_METHOD_WINDOW: controlTypes.ROLE_INPUTWINDOW, - IA2_ROLE_INTERNAL_FRAME: controlTypes.ROLE_INTERNALFRAME, - IA2_ROLE_LABEL: controlTypes.ROLE_LABEL, - IA2_ROLE_LAYERED_PANE: controlTypes.ROLE_LAYEREDPANE, - IA2_ROLE_NOTE: controlTypes.ROLE_NOTE, - IA2_ROLE_OPTION_PANE: controlTypes.ROLE_OPTIONPANE, - IA2_ROLE_PAGE: controlTypes.ROLE_PAGE, - IA2_ROLE_PARAGRAPH: controlTypes.ROLE_PARAGRAPH, - IA2_ROLE_RADIO_MENU_ITEM: controlTypes.ROLE_RADIOMENUITEM, - IA2_ROLE_REDUNDANT_OBJECT: controlTypes.ROLE_REDUNDANTOBJECT, - IA2_ROLE_ROOT_PANE: controlTypes.ROLE_ROOTPANE, - IA2_ROLE_RULER: controlTypes.ROLE_RULER, - IA2_ROLE_SCROLL_PANE: controlTypes.ROLE_SCROLLPANE, - IA2_ROLE_SECTION: controlTypes.ROLE_SECTION, - IA2_ROLE_SHAPE: controlTypes.ROLE_SHAPE, - IA2_ROLE_SPLIT_PANE: controlTypes.ROLE_SPLITPANE, - IA2_ROLE_TEAR_OFF_MENU: controlTypes.ROLE_TEAROFFMENU, - IA2_ROLE_TERMINAL: controlTypes.ROLE_TERMINAL, - IA2_ROLE_TEXT_FRAME: controlTypes.ROLE_TEXTFRAME, - IA2_ROLE_TOGGLE_BUTTON: controlTypes.ROLE_TOGGLEBUTTON, - IA2_ROLE_VIEW_PORT: controlTypes.ROLE_VIEWPORT, - IA2_ROLE_CONTENT_DELETION: controlTypes.ROLE_DELETED_CONTENT, - IA2_ROLE_CONTENT_INSERTION: controlTypes.ROLE_INSERTED_CONTENT, - IA2_ROLE_BLOCK_QUOTE: controlTypes.ROLE_BLOCKQUOTE, + IA2.IA2_ROLE_UNKNOWN: controlTypes.ROLE_UNKNOWN, + IA2.IA2_ROLE_CANVAS: controlTypes.ROLE_CANVAS, + IA2.IA2_ROLE_CAPTION: controlTypes.ROLE_CAPTION, + IA2.IA2_ROLE_CHECK_MENU_ITEM: controlTypes.ROLE_CHECKMENUITEM, + IA2.IA2_ROLE_COLOR_CHOOSER: controlTypes.ROLE_COLORCHOOSER, + IA2.IA2_ROLE_DATE_EDITOR: controlTypes.ROLE_DATEEDITOR, + IA2.IA2_ROLE_DESKTOP_ICON: controlTypes.ROLE_DESKTOPICON, + IA2.IA2_ROLE_DESKTOP_PANE: controlTypes.ROLE_DESKTOPPANE, + IA2.IA2_ROLE_DIRECTORY_PANE: controlTypes.ROLE_DIRECTORYPANE, + IA2.IA2_ROLE_EDITBAR: controlTypes.ROLE_EDITBAR, + IA2.IA2_ROLE_EMBEDDED_OBJECT: controlTypes.ROLE_EMBEDDEDOBJECT, + IA2.IA2_ROLE_ENDNOTE: controlTypes.ROLE_ENDNOTE, + IA2.IA2_ROLE_FILE_CHOOSER: controlTypes.ROLE_FILECHOOSER, + IA2.IA2_ROLE_FONT_CHOOSER: controlTypes.ROLE_FONTCHOOSER, + IA2.IA2_ROLE_FOOTER: controlTypes.ROLE_FOOTER, + IA2.IA2_ROLE_FOOTNOTE: controlTypes.ROLE_FOOTNOTE, + IA2.IA2_ROLE_FORM: controlTypes.ROLE_FORM, + IA2.IA2_ROLE_FRAME: controlTypes.ROLE_FRAME, + IA2.IA2_ROLE_GLASS_PANE: controlTypes.ROLE_GLASSPANE, + IA2.IA2_ROLE_HEADER: controlTypes.ROLE_HEADER, + IA2.IA2_ROLE_HEADING: controlTypes.ROLE_HEADING, + IA2.IA2_ROLE_ICON: controlTypes.ROLE_ICON, + IA2.IA2_ROLE_IMAGE_MAP: controlTypes.ROLE_IMAGEMAP, + IA2.IA2_ROLE_INPUT_METHOD_WINDOW: controlTypes.ROLE_INPUTWINDOW, + IA2.IA2_ROLE_INTERNAL_FRAME: controlTypes.ROLE_INTERNALFRAME, + IA2.IA2_ROLE_LABEL: controlTypes.ROLE_LABEL, + IA2.IA2_ROLE_LAYERED_PANE: controlTypes.ROLE_LAYEREDPANE, + IA2.IA2_ROLE_NOTE: controlTypes.ROLE_NOTE, + IA2.IA2_ROLE_OPTION_PANE: controlTypes.ROLE_OPTIONPANE, + IA2.IA2_ROLE_PAGE: controlTypes.ROLE_PAGE, + IA2.IA2_ROLE_PARAGRAPH: controlTypes.ROLE_PARAGRAPH, + IA2.IA2_ROLE_RADIO_MENU_ITEM: controlTypes.ROLE_RADIOMENUITEM, + IA2.IA2_ROLE_REDUNDANT_OBJECT: controlTypes.ROLE_REDUNDANTOBJECT, + IA2.IA2_ROLE_ROOT_PANE: controlTypes.ROLE_ROOTPANE, + IA2.IA2_ROLE_RULER: controlTypes.ROLE_RULER, + IA2.IA2_ROLE_SCROLL_PANE: controlTypes.ROLE_SCROLLPANE, + IA2.IA2_ROLE_SECTION: controlTypes.ROLE_SECTION, + IA2.IA2_ROLE_SHAPE: controlTypes.ROLE_SHAPE, + IA2.IA2_ROLE_SPLIT_PANE: controlTypes.ROLE_SPLITPANE, + IA2.IA2_ROLE_TEAR_OFF_MENU: controlTypes.ROLE_TEAROFFMENU, + IA2.IA2_ROLE_TERMINAL: controlTypes.ROLE_TERMINAL, + IA2.IA2_ROLE_TEXT_FRAME: controlTypes.ROLE_TEXTFRAME, + IA2.IA2_ROLE_TOGGLE_BUTTON: controlTypes.ROLE_TOGGLEBUTTON, + IA2.IA2_ROLE_VIEW_PORT: controlTypes.ROLE_VIEWPORT, + IA2.IA2_ROLE_CONTENT_DELETION: controlTypes.ROLE_DELETED_CONTENT, + IA2.IA2_ROLE_CONTENT_INSERTION: controlTypes.ROLE_INSERTED_CONTENT, + IA2.IA2_ROLE_BLOCK_QUOTE: controlTypes.ROLE_BLOCKQUOTE, IA2.IA2_ROLE_LANDMARK: controlTypes.ROLE_LANDMARK, - IA2_ROLE_MARK: controlTypes.ROLE_MARKED_CONTENT, + IA2.IA2_ROLE_MARK: controlTypes.ROLE_MARKED_CONTENT, # some common string roles "frame": controlTypes.ROLE_FRAME, "iframe": controlTypes.ROLE_INTERNALFRAME, @@ -371,32 +289,32 @@ def isMSAADebugLoggingEnabled(): } IAccessible2StatesToNVDAStates = { - IA2_STATE_REQUIRED: controlTypes.STATE_REQUIRED, - IA2_STATE_DEFUNCT: controlTypes.STATE_DEFUNCT, - # IA2_STATE_STALE:controlTypes.STATE_DEFUNCT, - IA2_STATE_INVALID_ENTRY: controlTypes.STATE_INVALID_ENTRY, - IA2_STATE_MODAL: controlTypes.STATE_MODAL, - IA2_STATE_SUPPORTS_AUTOCOMPLETION: controlTypes.STATE_AUTOCOMPLETE, - IA2_STATE_MULTI_LINE: controlTypes.STATE_MULTILINE, - IA2_STATE_ICONIFIED: controlTypes.STATE_ICONIFIED, - IA2_STATE_EDITABLE: controlTypes.STATE_EDITABLE, - IA2_STATE_PINNED: controlTypes.STATE_PINNED, - IA2_STATE_CHECKABLE: controlTypes.STATE_CHECKABLE, + IA2.IA2_STATE_REQUIRED: controlTypes.STATE_REQUIRED, + IA2.IA2_STATE_DEFUNCT: controlTypes.STATE_DEFUNCT, + # IA2.IA2_STATE_STALE:controlTypes.STATE_DEFUNCT, + IA2.IA2_STATE_INVALID_ENTRY: controlTypes.STATE_INVALID_ENTRY, + IA2.IA2_STATE_MODAL: controlTypes.STATE_MODAL, + IA2.IA2_STATE_SUPPORTS_AUTOCOMPLETION: controlTypes.STATE_AUTOCOMPLETE, + IA2.IA2_STATE_MULTI_LINE: controlTypes.STATE_MULTILINE, + IA2.IA2_STATE_ICONIFIED: controlTypes.STATE_ICONIFIED, + IA2.IA2_STATE_EDITABLE: controlTypes.STATE_EDITABLE, + IA2.IA2_STATE_PINNED: controlTypes.STATE_PINNED, + IA2.IA2_STATE_CHECKABLE: controlTypes.STATE_CHECKABLE, } def normalizeIAccessible(pacc, childID=0): - if not isinstance(pacc, IAccessible): + if not isinstance(pacc, IA.IAccessible): try: - pacc = pacc.QueryInterface(IAccessible) + pacc = pacc.QueryInterface(IA.IAccessible) except COMError: raise RuntimeError("%s Not an IAccessible" % pacc) # #2558: IAccessible2 doesn't support simple children. # Therefore, it doesn't make sense to use IA2 if the child ID is non-0. - if childID == 0 and not isinstance(pacc, IAccessible2): + if childID == 0 and not isinstance(pacc, IA2.IAccessible2): try: s = pacc.QueryInterface(IServiceProvider) - pacc2 = s.QueryService(IAccessible._iid_, IAccessible2) + pacc2 = s.QueryService(IA.IAccessible._iid_, IA2.IAccessible2) if not pacc2: # QueryService should fail if IA2 is not supported, but some applications such as AIM 7 misbehave # and return a null COM pointer. Treat this as if QueryService failed. @@ -595,7 +513,7 @@ def winEventToNVDAEvent(eventID, window, objectID, childID, useCache=True): f"Creating NVDA event from winEvent: {getWinEventLogInfo(window, objectID, childID, eventID)}, " f"use cache {useCache}" ) - NVDAEventName = winEventIDsToNVDAEventNames.get(eventID, None) + NVDAEventName = internalWinEventHandler.winEventIDsToNVDAEventNames.get(eventID, None) if not NVDAEventName: log.debugWarning(f"No NVDA event name for {getWinEventName(eventID)}") return None @@ -1036,7 +954,7 @@ def _fakeFocus(oldFocus): def initialize(): global accPropServices try: - accPropServices = comtypes.client.CreateObject(CAccPropServices) + accPropServices = comtypes.client.CreateObject(IA.CAccPropServices) except (WindowsError, COMError) as e: log.debugWarning("AccPropServices is not available: %s" % e) internalWinEventHandler.initialize(processDestroyWinEvent) @@ -1044,7 +962,7 @@ def initialize(): # C901 'pumpAll' is too complex def pumpAll(): # noqa: C901 - if not _shouldGetEvents(): + if not internalWinEventHandler._shouldGetEvents(): return focusWinEvents = [] validFocus = False @@ -1058,7 +976,7 @@ def pumpAll(): # noqa: C901 alwaysAllowedObjects.append((focus.event_windowHandle, focus.event_objectID, focus.event_childID)) # Receive all the winEvents from the limiter for this cycle - winEvents = winEventLimiter.flushEvents(alwaysAllowedObjects) + winEvents = internalWinEventHandler.winEventLimiter.flushEvents(alwaysAllowedObjects) for winEvent in winEvents: isEventOnCaret = winEvent[2] == winUser.OBJID_CARET @@ -1074,7 +992,7 @@ def pumpAll(): # noqa: C901 if not focus.shouldAcceptShowHideCaretEvent: continue elif not eventHandler.shouldAcceptEvent( - winEventIDsToNVDAEventNames[winEvent[0]], + internalWinEventHandler.winEventIDsToNVDAEventNames[winEvent[0]], windowHandle=winEvent[1] ): continue @@ -1128,7 +1046,7 @@ def terminate(): def getIAccIdentity(pacc, childID): - IAccIdentityObject = pacc.QueryInterface(IAccIdentity) + IAccIdentityObject = pacc.QueryInterface(IA.IAccIdentity) stringPtr, stringSize = IAccIdentityObject.getIdentityString(childID) try: if accPropServices: @@ -1186,16 +1104,16 @@ def findGroupboxObject(obj): # C901 'getRecursiveTextFromIAccessibleTextObject' def getRecursiveTextFromIAccessibleTextObject(obj, startOffset=0, endOffset=-1): # noqa: C901 - if not isinstance(obj, IAccessibleText): + if not isinstance(obj, IA2.IAccessibleText): try: - textObject = obj.QueryInterface(IAccessibleText) + textObject = obj.QueryInterface(IA2.IAccessibleText) except: # noqa: E722 Bare except textObject = None else: textObject = obj - if not isinstance(obj, IAccessible): + if not isinstance(obj, IA.IAccessible): try: - accObject = obj.QueryInterface(IAccessible) + accObject = obj.QueryInterface(IA.IAccessible) except: # noqa: E722 Bare except return "" else: @@ -1219,7 +1137,7 @@ def getRecursiveTextFromIAccessibleTextObject(obj, startOffset=0, endOffset=-1): description = None return " ".join([x for x in [name, value, description] if x and not x.isspace()]) try: - hypertextObject = accObject.QueryInterface(IAccessibleHypertext) + hypertextObject = accObject.QueryInterface(IA2.IAccessibleHypertext) except: # noqa: E722 Bare except return text textList = [] @@ -1227,7 +1145,7 @@ def getRecursiveTextFromIAccessibleTextObject(obj, startOffset=0, endOffset=-1): if ord(t) == 0xFFFC: try: index = hypertextObject.hyperlinkIndex(i + startOffset) - childTextObject = hypertextObject.hyperlink(index).QueryInterface(IAccessible) + childTextObject = hypertextObject.hyperlink(index).QueryInterface(IA.IAccessible) t = " %s " % getRecursiveTextFromIAccessibleTextObject(childTextObject) except: # noqa: E722 Bare except pass @@ -1322,7 +1240,7 @@ def isMarshalledIAccessible(IAccessibleObject): """Looks at the location of the first function in the IAccessible object's vtable (IUnknown::AddRef) to see if it was implemented in oleacc.dll (its local) or ole32.dll (its marshalled). """ - if not isinstance(IAccessibleObject, IAccessible): + if not isinstance(IAccessibleObject, IA.IAccessible): raise TypeError("object should be of type IAccessible, not %s" % IAccessibleObject) buf = create_unicode_buffer(1024) addr = POINTER(c_void_p).from_address( diff --git a/source/IAccessibleHandler/internalWinEventHandler.py b/source/IAccessibleHandler/internalWinEventHandler.py index 9765ea8213b..43ab1376b97 100644 --- a/source/IAccessibleHandler/internalWinEventHandler.py +++ b/source/IAccessibleHandler/internalWinEventHandler.py @@ -16,13 +16,8 @@ from . import getWinEventLogInfo from . import isMSAADebugLoggingEnabled +from comInterfaces import IAccessible2Lib as IA2 -from comInterfaces.IAccessible2Lib import ( - IA2_EVENT_TEXT_CARET_MOVED, - IA2_EVENT_DOCUMENT_LOAD_COMPLETE, - IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, - IA2_EVENT_PAGE_CHANGED, -) from .orderedWinEventLimiter import OrderedWinEventLimiter, MENU_EVENTIDS from logHandler import log @@ -61,10 +56,10 @@ winUser.EVENT_OBJECT_STATECHANGE: "stateChange", winUser.EVENT_OBJECT_VALUECHANGE: "valueChange", winUser.EVENT_OBJECT_LIVEREGIONCHANGED: "liveRegionChange", - IA2_EVENT_TEXT_CARET_MOVED: "caret", - IA2_EVENT_DOCUMENT_LOAD_COMPLETE: "documentLoadComplete", - IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED: "IA2AttributeChange", - IA2_EVENT_PAGE_CHANGED: "pageChange", + IA2.IA2_EVENT_TEXT_CARET_MOVED: "caret", + IA2.IA2_EVENT_DOCUMENT_LOAD_COMPLETE: "documentLoadComplete", + IA2.IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED: "IA2AttributeChange", + IA2.IA2_EVENT_PAGE_CHANGED: "pageChange", } _processDestroyWinEvent = None diff --git a/source/NVDAObjects/IAccessible/__init__.py b/source/NVDAObjects/IAccessible/__init__.py index 0486fdce660..4e1f83f1589 100644 --- a/source/NVDAObjects/IAccessible/__init__.py +++ b/source/NVDAObjects/IAccessible/__init__.py @@ -12,6 +12,7 @@ import itertools import importlib from comInterfaces.tom import ITextDocument +from comInterfaces import IAccessible2Lib as IA2 import tones import languageHandler import textInfos.offsets @@ -124,7 +125,9 @@ def _get_encoding(self): def _getOffsetFromPoint(self,x,y): if self.obj.IAccessibleTextObject.nCharacters>0: - offset = self.obj.IAccessibleTextObject.OffsetAtPoint(x,y,IAccessibleHandler.IA2_COORDTYPE_SCREEN_RELATIVE) + offset = self.obj.IAccessibleTextObject.OffsetAtPoint( + x, y, IA2.IA2_COORDTYPE_SCREEN_RELATIVE + ) # IA2 specifies that a result of -1 indicates that # the point is invalid or there is no character under the point. # Note that Chromium does not follow the spec and returns 0 for invalid or no character points. @@ -138,7 +141,9 @@ def _getOffsetFromPoint(self,x,y): @classmethod def _getBoundingRectFromOffsetInObject(cls,obj,offset): try: - res=RectLTWH(*obj.IAccessibleTextObject.characterExtents(offset,IAccessibleHandler.IA2_COORDTYPE_SCREEN_RELATIVE)) + res = RectLTWH(*obj.IAccessibleTextObject.characterExtents( + offset, IA2.IA2_COORDTYPE_SCREEN_RELATIVE + )) except COMError: raise NotImplementedError if not any(res[2:]): @@ -259,7 +264,7 @@ def _getCharacterOffsets(self,offset): except COMError: pass try: - start,end,text = self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_CHAR) + start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_CHAR) except COMError: return super(IA2TextTextInfo,self)._getCharacterOffsets(offset) if text and (textUtils.isHighSurrogate(text) or textUtils.isLowSurrogate(text)): @@ -275,7 +280,7 @@ def _getWordOffsets(self,offset): except COMError: pass try: - start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_WORD) + start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_WORD) except COMError: return super(IA2TextTextInfo,self)._getWordOffsets(offset) if start>offset or offset>end: @@ -285,7 +290,7 @@ def _getWordOffsets(self,offset): def _getLineOffsets(self,offset): try: - start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_LINE) + start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_LINE) return start,end except COMError: log.debugWarning("IAccessibleText::textAtOffset failed",exc_info=True) @@ -298,7 +303,7 @@ def _getSentenceOffsets(self,offset): except COMError: pass try: - start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_SENTENCE) + start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_SENTENCE) if start==end: raise NotImplementedError return start,end @@ -312,7 +317,7 @@ def _getParagraphOffsets(self,offset): except COMError: pass try: - start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_PARAGRAPH) + start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_PARAGRAPH) if start>=end: raise RuntimeError("did not expand to paragraph correctly") return start,end @@ -564,7 +569,11 @@ def findOverlayClasses(self,clsList): clsList.append(IAccessible) - if self.event_objectID==winUser.OBJID_CLIENT and self.event_childID==0 and not isinstance(self.IAccessibleObject,IAccessibleHandler.IAccessible2): + if( + self.event_objectID == winUser.OBJID_CLIENT + and self.event_childID == 0 + and not isinstance(self.IAccessibleObject, IA2.IAccessible2) + ): # This is the main (client) area of the window, so we can use other classes at the window level. # #3872: However, don't do this for IAccessible2 because # IA2 supersedes window level APIs and might conflict with them. @@ -588,7 +597,7 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No self.IAccessibleChildID=IAccessibleChildID # Try every trick in the book to get the window handle if we don't have it. - if not windowHandle and isinstance(IAccessibleObject,IAccessibleHandler.IAccessible2): + if not windowHandle and isinstance(IAccessibleObject, IA2.IAccessible2): windowHandle=self.IA2WindowHandle try: Identity=IAccessibleHandler.getIAccIdentity(IAccessibleObject,IAccessibleChildID) @@ -614,7 +623,7 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No if not windowHandle: raise InvalidNVDAObject("Can't get a window handle from IAccessible") - if isinstance(IAccessibleObject,IAccessibleHandler.IAccessible2): + if isinstance(IAccessibleObject, IA2.IAccessible2): try: self.IA2UniqueID=IAccessibleObject.uniqueID except COMError: @@ -623,7 +632,7 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No # Set the event params based on our calculated/construction info if we must. if event_windowHandle is None: event_windowHandle=windowHandle - if event_objectID is None and isinstance(IAccessibleObject,IAccessibleHandler.IAccessible2): + if event_objectID is None and isinstance(IAccessibleObject, IA2.IAccessible2): event_objectID=winUser.OBJID_CLIENT if event_childID is None: if self.IA2UniqueID is not None: @@ -637,18 +646,18 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No super(IAccessible,self).__init__(windowHandle=windowHandle) try: - self.IAccessibleActionObject=IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleAction) + self.IAccessibleActionObject = IAccessibleObject.QueryInterface(IA2.IAccessibleAction) except COMError: pass try: - self.IAccessibleTable2Object=self.IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleTable2) + self.IAccessibleTable2Object = self.IAccessibleObject.QueryInterface(IA2.IAccessibleTable2) except COMError: try: - self.IAccessibleTableObject=self.IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleTable) + self.IAccessibleTableObject = self.IAccessibleObject.QueryInterface(IA2.IAccessibleTable) except COMError: pass try: - self.IAccessibleTextObject=IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleText) + self.IAccessibleTextObject = IAccessibleObject.QueryInterface(IA2.IAccessibleText) except COMError: pass if None not in (event_windowHandle,event_objectID,event_childID): @@ -698,7 +707,10 @@ def _isEqual(self,other): return False if self.IAccessibleObject==other.IAccessibleObject: return True - if isinstance(self.IAccessibleObject,IAccessibleHandler.IAccessible2) and isinstance(other.IAccessibleObject,IAccessibleHandler.IAccessible2): + if ( + isinstance(self.IAccessibleObject, IA2.IAccessible2) + and isinstance(other.IAccessibleObject, IA2.IAccessible2) + ): # These are both IAccessible2 objects, so we can test unique ID. # Unique ID is only guaranteed to be unique within a given window, so we must check window handle as well. selfIA2Window=self.IA2WindowHandle @@ -810,7 +822,7 @@ def _get_IAccessibleIdentity(self): return self._IAccessibleIdentity def _get_IAccessibleRole(self): - if isinstance(self.IAccessibleObject,IAccessibleHandler.IAccessible2): + if isinstance(self.IAccessibleObject, IA2.IAccessible2): try: role=self.IAccessibleObject.role() except COMError: @@ -857,7 +869,7 @@ def _get_states(self): log.debugWarning("could not get IAccessible states",exc_info=True) else: states.update(IAccessibleHandler.IAccessibleStatesToNVDAStates[x] for x in (y for y in (1<