Skip to main content

AccessibilityTree

Struct AccessibilityTree 

Source
pub struct AccessibilityTree {
    nodes: FxHashMap<NodeId, ArcRefCell<AccessibilityNode>>,
    opaque_node_to_id: FxHashMap<OpaqueNode, NodeId>,
    id_to_opaque_node: FxHashMap<NodeId, OpaqueNode>,
    tree_id: TreeId,
    root_node: Option<ArcRefCell<AccessibilityNode>>,
    pending_scroll_updates: FxHashMap<ExternalScrollId, LayoutVector2D>,
    embedder_epoch: Epoch,
    debug: DiagnosticsLogging,
}
Expand description

A retained, internal representation of the accessibility tree for a document.

accesskit only provides interchange types for tree updates and action requests, so we need to define our own representation for incremental tree building.

Fields§

§nodes: FxHashMap<NodeId, ArcRefCell<AccessibilityNode>>

All nodes currently in the tree as of the most recent update. New nodes are added and stale nodes are pruned during AccessibilityTree::update_tree().

§opaque_node_to_id: FxHashMap<OpaqueNode, NodeId>

A map to allow retrieving the AccessibilityNode which corresponds to a particular DOM node, if any.

This must be kept in sync with Self::id_to_opaque_node.

§id_to_opaque_node: FxHashMap<NodeId, OpaqueNode>

A map to retrieve the OpaqueNode corresponding to a particular AccessibilityNode, if any.

This must be kept in sync with Self::opaque_node_to_id.

§tree_id: TreeId

Sent with each accesskit::TreeUpdate. This allows this tree to be grafted into an application’s tree.

§root_node: Option<ArcRefCell<AccessibilityNode>>

This node’s ID is sent with each accesskit::TreeUpdate to identify the root node. Also used for any complete tree walk, such as in Self::assert_integrity() and Self::print().

§pending_scroll_updates: FxHashMap<ExternalScrollId, LayoutVector2D>

If any nodes were scrolled since the last update, they are tracked here so that the next update can update the tree accordingly.

§embedder_epoch: Epoch

Sent to the embedder alongside each accesskit::TreeUpdate, so that the embedder can drop updates from documents which have been navigated away from.

§debug: DiagnosticsLogging

Debug options, copied from configuration to this AccessibilityTree in order to avoid having to constantly access the thread-safe global options.

Implementations§

Source§

impl AccessibilityTree

Source

pub(crate) fn new(tree_id: TreeId, embedder_epoch: Epoch) -> Self

See Self::tree_id and Self::embedder_epoch for explanations of the parameters.

Source

pub(crate) fn update_tree<'update>( &mut self, root_dom_node: &ServoLayoutNode<'update>, damage_from_dom: FxHashMap<OpaqueNode, (ServoLayoutNode<'update>, AccessibilityDamage)>, context: AccessibilityContext<'update>, rooted_nodes: Option<FxHashSet<OpaqueNode>>, ) -> (Option<TreeUpdate>, UpdateCounters)

Update this tree based on the current state of the given DOM tree, and if anything changed, return an accesskit::TreeUpdate representing what changed.

Source

pub(crate) fn add_pending_scroll_updates( &mut self, scroll_states: FxHashMap<ExternalScrollId, LayoutVector2D>, )

Source

pub(crate) fn add_pending_scroll_update( &mut self, external_scroll_id: ExternalScrollId, offset: LayoutVector2D, )

Source

fn ensure_root_node<'update>( &mut self, root_dom_node: &ServoLayoutNode<'update>, context: &AccessibilityContext<'update>, update: &mut AccessibilityUpdate<'update>, )

Get the node corresponding to the root DOM node, and set it as this tree’s root. If the root node is newly created, which probably means this accessibility tree is newly created, append an AccessibilityDamage::Rebuild value for it to damage_from_dom.

Source

fn apply_changes_from_dom_tree( &mut self, context: &AccessibilityContext<'_>, update: &mut AccessibilityUpdate<'_>, )

Update all nodes with damage tracked in update based on their AccessibilityDamage. If any LocalAccessibilityDamage results from the update, propagate LocalAccessibilityDamage::SubtreeChanged to its ancestors.

Source

fn populate_pending_scroll_updates_from_scroll_tree( &mut self, context: &AccessibilityContext<'_>, )

Read all scroll offsets directly from the scroll tree, and use them to populate Self::pending_scroll_updates. This will clear any previous pending scroll updates, as the scroll tree contains all scroll information.

Source

fn handle_pending_scroll_updates( &mut self, update: &mut AccessibilityUpdate<'_>, )

For each entry in Self::pending_scroll_updates, set the scroll offset on the AccessibilityNode corresponding to its ExternalScrollId, if any. This sets a transformation on every direct child of the scrolled node.

This should be called after the tree has been updated, so that we can be sure not to miss any newly-added nodes.

Source

fn mark_nodes_and_ancestors_dirty( &mut self, update: &mut AccessibilityUpdate<'_>, ) -> Option<NodeId>

Given an iterator of NodeIds corresponding to nodes which have received some damage from the DOM:

  • mark each node as dirty;
  • mark all of each node’s ancestors as has_dirty_descendants;
  • return the lowest common ancestor node of all the damaged nodes.
Source

fn get_or_create_node( &mut self, dom_node: &ServoLayoutNode<'_>, update: &mut AccessibilityUpdate<'_>, ) -> (NodeId, ArcRefCell<AccessibilityNode>)

Get the AccessibilityNode corresponding to the given DOM node. If there is no existing AccessibilityNode for this DOM node, it will be created and marked as having AccessibilityDamage::Rebuild in update.

Source

fn get_or_create_node_with_id( &mut self, id: NodeId, update: &mut AccessibilityUpdate<'_>, ) -> ArcRefCell<AccessibilityNode>

Source

fn node_for_id(&self, id: NodeId) -> Option<ArcRefCell<AccessibilityNode>>

Source

fn assert_node_for_id(&self, id: &NodeId) -> ArcRefCell<AccessibilityNode>

Source

fn node_for_opaque( &self, opaque: OpaqueNode, ) -> Option<ArcRefCell<AccessibilityNode>>

Source

fn drop_removed_nodes(&mut self, update: AccessibilityUpdate<'_>)

Consume the AccessibilityUpdate by deleting all nodes it detected as being removed from the tree.

Source

fn assert_removed_nodes_were_rooted( &mut self, update: &AccessibilityUpdate<'_>, rooted_nodes: &mut FxHashSet<OpaqueNode>, )

If we got rooted_nodes from the document’s AccessibilityData, assert that every node we marked as TreeChange::Removed during this update was rooted.

Source

fn assert_remaining_rooted_nodes_not_in_tree( &self, rooted_nodes: FxHashSet<OpaqueNode>, )

If we got rooted_nodes from the document’s AccessibilityData, assert that any nodes which were rooted but not marked as TreeChange::Removed are no longer in the tree after dropping all nodes which were removed from the tree. They may have been part of a subtree which was marked TreeChange::Removed on an ancestor node, or may have never made it into the accessibility tree to begin with.

Source

fn get_or_create_id_for_opaque(&mut self, opaque: OpaqueNode) -> NodeId

Source

fn existing_id_for_opaque(&self, opaque: OpaqueNode) -> Option<NodeId>

Source

pub(crate) fn embedder_epoch(&self) -> Epoch

Source

fn assert_integrity(&self)

Assert that the tree is a tree without any dangling references or orphaned nodes.

For accessibility tests only, because it’s expensive.

Source

fn print(&self)

Trait Implementations§

Source§

impl Debug for AccessibilityTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> MaybeBoxed<Box<T>> for T

Source§

fn maybe_boxed(self) -> Box<T>

Convert
Source§

impl<T> MaybeBoxed<T> for T

Source§

fn maybe_boxed(self) -> T

Convert
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,