Index: mojo/services/gfx/composition/interfaces/hit_tests.mojom |
diff --git a/mojo/services/gfx/composition/interfaces/hit_tests.mojom b/mojo/services/gfx/composition/interfaces/hit_tests.mojom |
index d18d868d63c481f534c3aced72d4b30bbea680a8..49c055bfc1a94c9bd6dedf42b842a4bdb2f5d7df 100644 |
--- a/mojo/services/gfx/composition/interfaces/hit_tests.mojom |
+++ b/mojo/services/gfx/composition/interfaces/hit_tests.mojom |
@@ -8,42 +8,100 @@ module mojo.gfx.composition; |
import "mojo/services/geometry/interfaces/geometry.mojom"; |
import "mojo/services/gfx/composition/interfaces/scene_token.mojom"; |
-// Indicates that hit testing is not needed for a given node. |
-const uint32 kHitIdNone = 0; |
+// Determines how a node behaves during hit testing. |
+// |
+// See |Node| for more details of the hit testing traversal process. |
+struct HitTestBehavior { |
+ // The visibility specifies how a node itself is hit and its effect on |
+ // the hit testing traversal. |
+ enum Visibility { |
+ // The node can be hit and prevents other targets visually behind the |
+ // node from being hit. This is the default. |
+ // |
+ // Opaque targets are useful for UI elements like buttons which cover and |
+ // block interaction with content visually behind them. |
+ OPAQUE, |
-// Provides information about the point of intersection of a hit test with |
-// a node in a scene graph. |
-struct Hit { |
- // The scene token of the scene which was hit. |
- SceneToken scene_token; |
- |
- // The version of the scene which was consulted as part of evaluating the |
- // hit test. |
- uint32 scene_version; |
+ // The node can be hit and allows other targets visually behind the node |
+ // to also be hit. |
+ // |
+ // Translucent targets are useful for UI elements like dimissed drawers |
+ // which may not obscure content visually behind them but which do need |
+ // to intercept gestures in that area (perhaps to reveal themselves). |
+ TRANSLUCENT, |
- // The node id of the node which was hit. |
- uint32 node_id; |
+ // The node cannot be hit. |
+ // |
+ // Invisible targets are useful for explicitly suppressing hit testing |
+ // for a node and its children when combined with the |prune| flag. |
+ INVISIBLE, |
+ }; |
- // The hit test id of the node which was hit. |
- uint32 hit_id; |
+ // Specifies the visibility of the node for hit testing purposes. |
+ // The default is opaque. |
+ Visibility visibility = Visibility.OPAQUE; |
- // The coordinates of the hit within the node's content space. |
- mojo.Point intersection; |
-}; |
+ // When set to true, prevents a node's children from being hit tested. |
+ bool prune = false; |
-// The result of a hit test operation. |
-struct HitTestResult { |
- // A sorted list of hits in dispatch order from the top-most hit node |
- // to the nodes underneath it and containing it, or an empty array if none. |
- // Omits nodes for which the hit_id was |kHitIdNone|. |
- array<Hit> hits; |
+ // The rectangle within the node's content space to test for hits. |
+ // If null, the node's entire clip region is tested for hits. |
+ // |
+ // TODO(jeffbrown): Support more complex hit test regions and masks. |
+ mojo.Rect? hit_rect; |
}; |
// A hit testing service for scene graphs. |
interface HitTester { |
// Performs a hit test on the specified point. |
// |
- // TODO(jeffbrown): Specify a timestamp to allow for hit-tests of geometry |
- // as it appeared in the recent past. |
+ // TODO(jeffbrown): Specify a presentation timestamp to allow for |
+ // hit-tests of geometry as it appeared to the user in the recent past. |
HitTest(mojo.Point point) => (HitTestResult result); |
}; |
+ |
+// The result of a hit test operation. |
+// |
+// Hit test results form a hit tree with information about the nodes which |
+// were hit and the scenes which contain them. The structure of the hit |
+// tree reflects the path that the scene graph was traversed during the |
+// hit test. |
+// |
+// To walk the hit nodes in dispatch order, perform a post-order traversal |
+// of the hit tree starting at |root| and processing children before their |
+// parents. |
+struct HitTestResult { |
+ // A tree of hits beginning at the root scene, or null if nothing was hit. |
+ SceneHit? root; |
+}; |
+ |
+// An element in a hit tree. |
+// This either contains a reference to another scene which contains hits or |
+// to a specific node within the containing scene which was hit. |
+union Hit { |
+ SceneHit scene; |
+ NodeHit node; |
+}; |
+ |
+// Describes a collection of hits within a scene. |
+struct SceneHit { |
+ // The scene token of the scene which contains hits. |
+ SceneToken scene_token; |
+ |
+ // The version of the scene which was consulted at the time the hit test |
+ // was performed. |
+ uint32 scene_version; |
+ |
+ // The array of hits within this scene, in dispatch order. |
+ // This list always contains at least one entry. |
+ array<Hit> hits; |
+}; |
+ |
+// Describes the point of intersection of a hit test with a node. |
+struct NodeHit { |
+ // The node id of the node which was hit. |
+ uint32 node_id; |
+ |
+ // The coordinates of the hit within the node's content space. |
+ mojo.Point intersection; |
+}; |