When TabContainer calls accessibility_update_add_related_controls(), it
triggers _ensure_node() which creates a new AccessKit node. Since the
node pointer was nulled after the previous tree update push, this creates
an empty node without any properties.
TabBar only sets tab properties (name, bounds) when accessibility_item_dirty
is true. After initial setup, dirty=false, so recreated nodes would be
pushed without names, causing screen readers to announce "page tab" without
the tab name.
This fix re-applies the stored name (and name_extra_info) when _ensure_node
creates a new node, ensuring tab names persist across node recreations.
Two fixes for text field accessibility:
1. Fix character count being off by one due to trailing newline always
being appended to the last line. Add `is_last_line` parameter to
`accessibility_create_sub_text_edit_elements()` to control this.
2. Link adjacent TextRuns via `previous_on_line`/`next_on_line` so
screen readers can properly navigate lines. Without these links,
AccessKit treats each TextRun as a separate line, causing incorrect
announcements when arrowing through multi-line text.