Skip to content

Commit 6262596

Browse files
committed
Remove ignoreEditableText param
ControlStack previously had None inserted, now it can be empty.
1 parent e9ba4fe commit 6262596

3 files changed

Lines changed: 54 additions & 37 deletions

File tree

source/NVDAObjects/IAccessible/ia2TextMozilla.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ def _getEmbedded(obj, offset) -> typing.Optional[IAccessible]:
6565

6666
class MozillaCompoundTextInfo(CompoundTextInfo):
6767

68-
def _getControlFieldForObject(self, obj, ignoreEditableText=True):
69-
controlField = super()._getControlFieldForObject(obj, ignoreEditableText=ignoreEditableText)
68+
def _getControlFieldForObject(self, obj):
69+
controlField = super()._getControlFieldForObject(obj)
7070
if controlField is None:
7171
return None
7272
# Set the uniqueID of the controlField if we can get one
@@ -267,7 +267,13 @@ def _iterRecursiveText(self, ti: offsets.OffsetsTextInfo, controlStack, formatCo
267267
elif isinstance(item, int): # Embedded object.
268268
embedded: typing.Optional[IAccessible] = _getEmbedded(ti.obj, item)
269269
notText = _getRawTextInfo(embedded) is NVDAObjectTextInfo
270-
if controlStack is not None:
270+
if (
271+
controlStack is not None
272+
and not (
273+
self._isObjectEditableText(embedded)
274+
or self._isNamedlinkDestination(embedded)
275+
)
276+
):
271277
controlField = self._getControlFieldForObject(embedded)
272278
controlStack.append(controlField)
273279
if controlField:
@@ -313,16 +319,19 @@ def _getText(self, withFields, formatConfig=None):
313319
ti = self._start
314320
cannotBeStart = False
315321
while obj and obj != rootObj:
316-
field = self._getControlFieldForObject(obj)
317-
if field:
322+
if not (
323+
self._isObjectEditableText(obj)
324+
or self._isNamedlinkDestination(obj)
325+
):
326+
field = self._getControlFieldForObject(obj)
318327
if ti._startOffset == 0:
319328
if not cannotBeStart:
320329
field["_startOfNode"] = True
321330
else:
322331
# We're not at the start of this object, which also means we're not at the start of any ancestors.
323332
cannotBeStart = True
324333
fields.insert(0, textInfos.FieldCommand("controlStart", field))
325-
controlStack.insert(0, field)
334+
controlStack.insert(0, field)
326335
ti = self._getEmbedding(obj)
327336
if not ti:
328337
log.debugWarning(
@@ -341,7 +350,7 @@ def _getText(self, withFields, formatConfig=None):
341350
# (We already handled collapsed above.)
342351
return fields
343352
obj = self._startObj
344-
while fields[-1] is not None:
353+
while fields[-1] is not None and controlStack:
345354
# The end hasn't yet been reached, which means it isn't a descendant of obj.
346355
# Therefore, continue from where obj was embedded.
347356
if withFields:
@@ -354,10 +363,9 @@ def _getText(self, withFields, formatConfig=None):
354363
# range is invalid, so just return nothing.
355364
log.debugWarning("Tried to walk up past the root. Objects probably dead.")
356365
return []
357-
if field:
358-
# This object had a control field.
359-
field["_endOfNode"] = True
360-
fields.append(textInfos.FieldCommand("controlEnd", None))
366+
# This object had a control field.
367+
field["_endOfNode"] = True
368+
fields.append(textInfos.FieldCommand("controlEnd", None))
361369
ti = self._getEmbedding(obj)
362370
if not ti:
363371
log.debugWarning(
@@ -377,13 +385,11 @@ def _getText(self, withFields, formatConfig=None):
377385
# Determine whether the range covers the end of any ancestors of endObj.
378386
obj = self._endObj
379387
ti = self._end
380-
while obj and obj != rootObj:
388+
while obj and obj != rootObj and controlStack:
381389
field = controlStack.pop()
382-
if field:
383-
fields.append(textInfos.FieldCommand("controlEnd", None))
390+
fields.append(textInfos.FieldCommand("controlEnd", None))
384391
if ti.compareEndPoints(self._makeRawTextInfo(obj, textInfos.POSITION_ALL), "endToEnd") == 0:
385-
if field:
386-
field["_endOfNode"] = True
392+
field["_endOfNode"] = True
387393
else:
388394
# We're not at the end of this object, which also means we're not at the end of any ancestors.
389395
break

source/appModules/kindle.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,8 @@ def updateSelection(self):
346346
log.debug("Setting selection to (%d, %d)" % (sel._startOffset, sel._endOffset))
347347
sel.updateSelection()
348348

349-
def _getControlFieldForObject(self, obj, ignoreEditableText=True):
350-
field = super(BookPageViewTextInfo, self)._getControlFieldForObject(obj, ignoreEditableText=ignoreEditableText)
349+
def _getControlFieldForObject(self, obj):
350+
field = super(BookPageViewTextInfo, self)._getControlFieldForObject(obj)
351351
if field and field["role"] == controlTypes.Role.MATH:
352352
try:
353353
field["mathMl"] = obj.mathMl

source/compoundDocuments.py

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -124,18 +124,21 @@ def _get_NVDAObjectAtStart(self):
124124
def _get_pointAtStart(self):
125125
return self._start.pointAtStart
126126

127-
def _isObjectEditableText(self, obj):
128-
return obj.role in (controlTypes.Role.PARAGRAPH, controlTypes.Role.EDITABLETEXT)
129-
130-
def _getControlFieldForObject(self, obj, ignoreEditableText=True):
131-
if ignoreEditableText and self._isObjectEditableText(obj):
132-
# This is basically just a text node.
133-
return None
127+
def _isObjectEditableText(self, obj: NVDAObject) -> bool:
128+
return obj.role in (
129+
controlTypes.Role.PARAGRAPH,
130+
controlTypes.Role.EDITABLETEXT,
131+
)
132+
133+
def _isNamedlinkDestination(self, obj: NVDAObject) -> bool:
134+
return ( # Named link destination, not a link that can be activated.
135+
obj.role == controlTypes.Role.LINK
136+
and controlTypes.STATE_LINKED not in obj.states
137+
)
138+
139+
def _getControlFieldForObject(self, obj: NVDAObject):
134140
role = obj.role
135141
states = obj.states
136-
if role == controlTypes.Role.LINK and controlTypes.STATE_LINKED not in states:
137-
# Named link destination, not a link that can be activated.
138-
return None
139142
field = textInfos.ControlField()
140143
field["role"] = role
141144
field['roleText'] = obj.roleText
@@ -266,8 +269,11 @@ def getTextWithFields(self, formatConfig=None):
266269
rootObj = self.obj.rootNVDAObject
267270
obj = self._startObj
268271
while obj and obj != rootObj:
269-
field = self._getControlFieldForObject(obj)
270-
if field:
272+
if not (
273+
self._isObjectEditableText(obj)
274+
or self._isNamedlinkDestination(obj)
275+
):
276+
field = self._getControlFieldForObject(obj)
271277
fields.insert(0, textInfos.FieldCommand("controlStart", field))
272278
obj = obj.parent
273279

@@ -282,13 +288,18 @@ def getTextWithFields(self, formatConfig=None):
282288
else:
283289
embedIndex += 1
284290
field = ti.obj.getChild(embedIndex)
285-
controlField = self._getControlFieldForObject(field, ignoreEditableText=False)
286-
controlField["content"] = field.name
287-
fields.extend((
288-
textInfos.FieldCommand("controlStart", controlField),
289-
textUtils.OBJ_REPLACEMENT_CHAR,
290-
textInfos.FieldCommand("controlEnd", None)
291-
))
291+
if not (
292+
# Don't check for self._isObjectEditableText
293+
# Only for named link destinations.
294+
self._isNamedlinkDestination(obj)
295+
):
296+
controlField = self._getControlFieldForObject(field)
297+
controlField["content"] = field.name
298+
fields.extend((
299+
textInfos.FieldCommand("controlStart", controlField),
300+
textUtils.OBJ_REPLACEMENT_CHAR,
301+
textInfos.FieldCommand("controlEnd", None),
302+
))
292303
else:
293304
fields.append(field)
294305
return fields

0 commit comments

Comments
 (0)