ui_puppet_lib/
lib.rs
1use fidl_fuchsia_ui_test_conformance::{
6 PuppetEmbedRemoteViewResponse, PuppetFactoryCreateResponse, PuppetFactoryRequest,
7 PuppetFactoryRequestStream, PuppetRequest, PuppetRequestStream,
8 PuppetSetEmbeddedViewPropertiesResponse, Result_,
9};
10use futures::TryStreamExt;
11use log::info;
12use std::cell::RefCell;
13use std::rc::Rc;
14
15mod presentation_loop;
16mod view;
17
18async fn run_puppet(request_stream: PuppetRequestStream, puppet_view: Rc<RefCell<view::View>>) {
19 info!("Starting puppet instance");
20
21 request_stream
22 .try_for_each(|request| async {
23 match request {
24 PuppetRequest::EmbedRemoteView { payload, responder, .. } => {
25 let viewport_id = payload.id.expect("missing viewport id");
26 let properties = payload.properties.expect("missing embedded view properties");
27
28 let view_creation_token =
29 puppet_view.borrow_mut().embed_remote_view(viewport_id, properties).await;
30
31 responder
32 .send(PuppetEmbedRemoteViewResponse {
33 result: Some(Result_::Success),
34 view_creation_token: Some(view_creation_token),
35 ..Default::default()
36 })
37 .expect("failed to respond to EmbedRemoteView request");
38 }
39 PuppetRequest::SetEmbeddedViewProperties { payload, responder, .. } => {
40 let viewport_id = payload.id.expect("missing viewport id");
41 let properties = payload.properties.expect("missing embedded view properties");
42
43 puppet_view
44 .borrow_mut()
45 .set_embedded_view_properties(viewport_id, properties)
46 .await;
47
48 responder
49 .send(&PuppetSetEmbeddedViewPropertiesResponse {
50 result: Some(Result_::Success),
51 ..Default::default()
52 })
53 .expect("failed to respond to SetEmbeddedViewProperties request");
54 }
55 _ => {
56 panic!("unsupported operation");
57 }
58 }
59
60 Ok(())
61 })
62 .await
63 .expect("failed to serve puppet stream");
64
65 info!("reached end of puppet request stream; closing connection");
66}
67
68pub async fn run_puppet_factory(request_stream: PuppetFactoryRequestStream) {
69 info!("handling client connection to puppet factory service");
70
71 request_stream
72 .try_for_each_concurrent(None, |request| async {
73 match request {
74 PuppetFactoryRequest::Create { payload, responder, .. } => {
75 info!("create puppet");
76 let flatland =
77 payload.flatland_client.expect("missing flatland client").into_proxy();
78 let keyboard =
79 payload.keyboard_client.expect("missing keyboard client").into_proxy();
80 let view_token =
81 payload.view_token.expect("missing puppet viewport creation token");
82 let puppet_server = payload.server_end.expect("missing puppet server endpoint");
83 let touch_listener = match payload.touch_listener {
84 None => None,
85 Some(touch_listener) => Some(touch_listener.into_proxy()),
86 };
87 let mouse_listener = match payload.mouse_listener {
88 None => None,
89 Some(mouse_listener) => Some(mouse_listener.into_proxy()),
90 };
91 let keyboard_listener = match payload.keyboard_listener {
92 None => None,
93 Some(keyboard_listener) => Some(keyboard_listener.into_proxy()),
94 };
95 let device_pixel_ratio =
96 payload.device_pixel_ratio.expect("missing device_pixel_ratio");
97
98 let (view, view_ref) = view::View::new(
99 flatland,
100 keyboard,
101 view_token,
102 touch_listener,
103 mouse_listener,
104 keyboard_listener,
105 device_pixel_ratio,
106 payload.focuser,
107 )
108 .await;
109
110 responder
111 .send(PuppetFactoryCreateResponse {
112 result: Some(Result_::Success),
113 view_ref: Some(view_ref),
114 ..Default::default()
115 })
116 .expect("failed to respond to PuppetFactoryRequest::Create");
117
118 run_puppet(puppet_server.into_stream(), view).await;
119 }
120 }
121
122 Ok(())
123 })
124 .await
125 .expect("failed to serve puppet factory stream");
126
127 info!("reached end of puppet factory request stream; closing connection");
128}