Skip to content

Commit cd95ffa

Browse files
Merge 7e0e9e6 into a452470
2 parents a452470 + 7e0e9e6 commit cd95ffa

File tree

3 files changed

+37
-47
lines changed

3 files changed

+37
-47
lines changed

source/NVDAObjects/IAccessible/ia2TextMozilla.py

Lines changed: 16 additions & 22 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):
69-
controlField = super()._getControlFieldForObject(obj)
68+
def _getControlFieldForObject(self, obj, ignoreEditableText=True):
69+
controlField = super()._getControlFieldForObject(obj, ignoreEditableText=ignoreEditableText)
7070
if controlField is None:
7171
return None
7272
# Set the uniqueID of the controlField if we can get one
@@ -267,13 +267,7 @@ 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 (
271-
controlStack is not None
272-
and not (
273-
self._isObjectEditableText(embedded)
274-
or self._isNamedlinkDestination(embedded)
275-
)
276-
):
270+
if controlStack is not None:
277271
controlField = self._getControlFieldForObject(embedded)
278272
controlStack.append(controlField)
279273
if controlField:
@@ -319,19 +313,16 @@ def _getText(self, withFields, formatConfig=None):
319313
ti = self._start
320314
cannotBeStart = False
321315
while obj and obj != rootObj:
322-
if not (
323-
self._isObjectEditableText(obj)
324-
or self._isNamedlinkDestination(obj)
325-
):
326-
field = self._getControlFieldForObject(obj)
316+
field = self._getControlFieldForObject(obj)
317+
if field:
327318
if ti._startOffset == 0:
328319
if not cannotBeStart:
329320
field["_startOfNode"] = True
330321
else:
331322
# We're not at the start of this object, which also means we're not at the start of any ancestors.
332323
cannotBeStart = True
333324
fields.insert(0, textInfos.FieldCommand("controlStart", field))
334-
controlStack.insert(0, field)
325+
controlStack.insert(0, field)
335326
ti = self._getEmbedding(obj)
336327
if not ti:
337328
log.debugWarning(
@@ -350,7 +341,7 @@ def _getText(self, withFields, formatConfig=None):
350341
# (We already handled collapsed above.)
351342
return fields
352343
obj = self._startObj
353-
while fields[-1] is not None and controlStack:
344+
while fields[-1] is not None:
354345
# The end hasn't yet been reached, which means it isn't a descendant of obj.
355346
# Therefore, continue from where obj was embedded.
356347
if withFields:
@@ -363,9 +354,10 @@ def _getText(self, withFields, formatConfig=None):
363354
# range is invalid, so just return nothing.
364355
log.debugWarning("Tried to walk up past the root. Objects probably dead.")
365356
return []
366-
# This object had a control field.
367-
field["_endOfNode"] = True
368-
fields.append(textInfos.FieldCommand("controlEnd", None))
357+
if field:
358+
# This object had a control field.
359+
field["_endOfNode"] = True
360+
fields.append(textInfos.FieldCommand("controlEnd", None))
369361
ti = self._getEmbedding(obj)
370362
if not ti:
371363
log.debugWarning(
@@ -385,11 +377,13 @@ def _getText(self, withFields, formatConfig=None):
385377
# Determine whether the range covers the end of any ancestors of endObj.
386378
obj = self._endObj
387379
ti = self._end
388-
while obj and obj != rootObj and controlStack:
380+
while obj and obj != rootObj:
389381
field = controlStack.pop()
390-
fields.append(textInfos.FieldCommand("controlEnd", None))
382+
if field:
383+
fields.append(textInfos.FieldCommand("controlEnd", None))
391384
if ti.compareEndPoints(self._makeRawTextInfo(obj, textInfos.POSITION_ALL), "endToEnd") == 0:
392-
field["_endOfNode"] = True
385+
if field:
386+
field["_endOfNode"] = True
393387
else:
394388
# We're not at the end of this object, which also means we're not at the end of any ancestors.
395389
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):
350-
field = super(BookPageViewTextInfo, self)._getControlFieldForObject(obj)
349+
def _getControlFieldForObject(self, obj, ignoreEditableText=True):
350+
field = super(BookPageViewTextInfo, self)._getControlFieldForObject(obj, ignoreEditableText=ignoreEditableText)
351351
if field and field["role"] == controlTypes.Role.MATH:
352352
try:
353353
field["mathMl"] = obj.mathMl

source/compoundDocuments.py

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,15 @@ def _isNamedlinkDestination(self, obj: NVDAObject) -> bool:
136136
and controlTypes.State.LINKED not in obj.states
137137
)
138138

139-
def _getControlFieldForObject(self, obj: NVDAObject):
139+
def _getControlFieldForObject(self, obj, ignoreEditableText=True):
140+
if ignoreEditableText and self._isObjectEditableText(obj):
141+
# This is basically just a text node.
142+
return None
140143
role = obj.role
141144
states = obj.states
145+
if role == controlTypes.Role.LINK and controlTypes.STATE_LINKED not in states:
146+
# Named link destination, not a link that can be activated.
147+
return None
142148
field = textInfos.ControlField()
143149
field["role"] = role
144150
field['roleText'] = obj.roleText
@@ -271,11 +277,8 @@ def getTextWithFields(self, formatConfig=None):
271277
rootObj = self.obj.rootNVDAObject
272278
obj = self._startObj
273279
while obj and obj != rootObj:
274-
if not (
275-
self._isObjectEditableText(obj)
276-
or self._isNamedlinkDestination(obj)
277-
):
278-
field = self._getControlFieldForObject(obj)
280+
field = self._getControlFieldForObject(obj)
281+
if field:
279282
fields.insert(0, textInfos.FieldCommand("controlStart", field))
280283
obj = obj.parent
281284

@@ -287,23 +290,16 @@ def getTextWithFields(self, formatConfig=None):
287290
embedIndex = self._getFirstEmbedIndex(ti)
288291
else:
289292
embedIndex += 1
290-
childObject: NVDAObject = ti.obj.getChild(embedIndex)
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(childObject)
297-
controlField["content"] = childObject.name
298-
fields.extend((
299-
textInfos.FieldCommand("controlStart", controlField),
300-
textUtils.OBJ_REPLACEMENT_CHAR,
301-
textInfos.FieldCommand("controlEnd", None),
302-
))
303-
else: # str or fieldCommand
304-
if not isinstance(textWithEmbeddedObjectsItem, (str, textInfos.FieldCommand)):
305-
log.error(f"Unexpected type: {textWithEmbeddedObjectsItem!r}")
306-
fields.append(textWithEmbeddedObjectsItem)
293+
field = ti.obj.getChild(embedIndex)
294+
controlField = self._getControlFieldForObject(field, ignoreEditableText=False)
295+
controlField["content"] = field.name
296+
fields.extend((
297+
textInfos.FieldCommand("controlStart", controlField),
298+
textUtils.OBJ_REPLACEMENT_CHAR,
299+
textInfos.FieldCommand("controlEnd", None)
300+
))
301+
else:
302+
fields.append(field)
307303
return fields
308304

309305
def _findNextContent(self, origin, moveBack=False):

0 commit comments

Comments
 (0)