blob: 78cd98bcc77e56103203e85b46cd279f6766d1d8 [file] [log] [blame] [view]
## Scenic Views, view tree, and ViewRefs
### Scenic View
A UI client that wishes to vend user-visible content must place it in a Scenic
View, which is a [Session](/docs/concepts/ui/scenic/index.md#sessions)-based
[resource](/docs/concepts/ui/scenic/index.md#resources), local to that client. No resource can be
directly referenced outside the scope of their owning Scenic Session.
### ViewRef refers to a Scenic View
For a view resource in particular, it is very useful to have a stable and
consistent view reference, that can be used across
[component](/docs/concepts/components/v2/introduction.md#components_and_the_component_framework)
boundaries.
We define a [fuchsia.ui.views.ViewRef](/sdk/fidl/fuchsia.ui.views/view_ref.fidl)
FIDL datatype that has some desirable properties:
* A ViewRef is globally unique across the operating system, it cannot be
forged. This property arises from the ViewRef's underlying kernel object, an
[eventpair](/docs/concepts/kernel/concepts.md#events_event_pairs).
* A ViewRef is globally unique over the lifetime of the operating system, it
is never reused. This property arises from Zircon's guarantee of
[KOID uniqueness](/docs/concepts/kernel/concepts.md#kernel_object_ids) for
kernel objects.
* A ViewRef can be used in a
[feed-forward](/docs/development/api/fidl.md#feed_forward-dataflow) pattern for
Scenic View creation. Protocols and components that participate in View
creation do not have to "tunnel back" the corresponding ViewRef.
* ViewRef holders can implement lifecycle management by listening for a
[`ZX_EVENTPAIR_PEER_CLOSED`](/docs/reference/syscalls/eventpair_create.md)
zircon signal on the underlying eventpair object.
Each Scenic View has an associated ViewRef.
### View tree
The global scene graph can be thought of as a tree of Views, each containing UI
content and embedding other Views. Because we have a ViewRef for each View, we
can also think of the view tree as a tree of ViewRefs.
In a view tree, parent views have tremendous power over child views: the power
to reposition the child's view, enforce clip boundaries on the child's view,
hide the child's UI content, etc. Because of the inherent power of the view
hierarchy, we use it as a basis of hierarchy outside of Scenic. This hierarchy,
which changes dynamically based on view focusing, is represented with a
"[focus chain](focus_chain.md)".
### How is a ViewRef used?
Typically, a UI client uses a ViewRef to self-identify itself to manager-type
programs.
Because of the feed-forward nature of view creation, a manager program can start
handling View-specific logic prior to the View's creation in Scenic.
Here are some example usages. Accessibility Manager uses ViewRefs to identify
and manage client content; IME Manager uses ViewRefs to identify IME clients,
Shortcuts Manager uses ViewRefs to identify and manage client-authored keyboard
shortcuts, Sys UI uses ViewRefs to identify and manage focus of child views.
### Are ViewRef and ViewToken the same thing?
No. These FIDL datatypes are both backed by eventpairs, but serve different
uses.
The [ViewToken](/sdk/fidl/fuchsia.ui.views/view_token.fidl) is used internally
by Scenic. It connects a View resource to a corresponding ViewHolder resource in
the scene graph. The semantics work because each side of the eventpair is held
uniquely by View (child) and ViewHolder (parent).
The ViewRef is used outside of Scenic. UI clients and manager components use it
to refer to a View.
### ViewRef not for authentication
A ViewRef can easily be propagated across protocol boundaries. Hence, it is
important to *not* use a ViewRef as an authentication mechanism: merely holding
a ViewRef should not grant the holder powers. Instead, use
[capability routing](/docs/concepts/components/v2/capabilities/protocol.md) to
distribute a ViewRef-consuming protocol securely to trusted components.
One example of this is the
[fuchsia.ui.views.ViewRefInstalled](/sdk/fidl/fuchsia.ui.views/view_ref_installed.fidl)
protocol, which allows a client to determine when Scenic has installed a ViewRef
in the view tree.
### ViewRef design tradeoffs
The feedforward pattern is not inherently secure; the client is trusted to not
make a secret copy of the
[ViewRefControl](/sdk/fidl/fuchsia.ui.views/view_ref.fidl) when feeding the
ViewRef and ViewRefControl pair to Scenic.