Ticket #48 (closed defect: fixed)

Opened 2 years ago

Last modified 2 years ago

Problems with empty link elements

Reported by: jteh Owned by:
Priority: major Milestone: 2009.1
Component: Virtual buffers Version: development
Keywords: Cc:
Operating system: Blocked by:
Blocking:

Description

It is possible to have a link with no content, like so:

<a href="#"></a>

This is pretty silly, but it is nevertheless possible and you can actually tab to such a link.

Unfortunately, the gecko_ia2 backend does not render these empty link objects into the text at all; i.e. they have a length of 0 characters. This causes two problems:

  • The user cannot access the link by cursoring in the virtual buffer, but pressing k before the link will jump to the supposed start location of the link and say "blank".
  • If the last rendered element in a document is an empty link, links list will cause a crash in Firefox and a lockup in NVDA.
    • This is because the start offset is actually one past the end of the buffer. When the iterator tries to check for a further link, it passes this invalid offset to the buffer and causes a crash.
      • The iterator could perform bounds checking to ensure this doesn't happen, but I'm wondering whether this should be done in storage to prevent similar crashes.

Proposed Solutions


  • The gecko_ia2 backend could expose empty links as a single space character, similar to the way other empty elements such as graphics and checkboxes are exposed. I think this is the preferred solution.
  • The NVDA code to jump to links and the node iterator could ignore 0 length nodes. This would also require the bounds checking described above, either in NVDA or storage.

Test Cases


Attachments

empty_links.html Download (228 bytes) - added by jteh 2 years ago.
Test case.

Change History

Changed 2 years ago by jteh

Test case.

Changed 2 years ago by jteh

  • version set to trunk
  • component changed from Core to Virtual buffers
  • milestone set to 0.6

Changed 2 years ago by jteh

  • status changed from new to closed
  • resolution set to fixed

Actually, the fix was a lot simpler than initially thought. The reason that empty links are not rendered into the buffer is that they are invisible and invisible nodes are not rendered into the buffer. They are still represented as nodes, but they have no text; they have 0 length. Thus, the correct fix is to ignore invisible nodes when searching for nodes, as implemented in r1846. Some bounds checking should perhaps be added to the storage library to prevent crashes, but this is a different issue.

Note: See TracTickets for help on using tickets.