28 rapidjson::Value request,
30 auto method = request.FindMember(
"method");
31 if (method == request.MemberEnd() || !method->value.IsString()) {
35 if (method->value ==
"View.focus.getCurrent") {
36 Complete(std::move(response), is_focused_ ?
"[true]" :
"[false]");
37 }
else if (method->value ==
"View.focus.getNext") {
38 if (next_focus_request_) {
39 FML_LOG(
ERROR) <<
"An outstanding PlatformMessageResponse already exists "
40 "for the next focus state!";
41 Complete(std::move(response),
"[null]");
43 next_focus_request_ = std::move(response);
45 }
else if (method->value ==
"View.focus.request") {
46 auto args_it = request.FindMember(
"args");
47 if (args_it == request.MemberEnd() || !args_it->value.IsObject()) {
51 const auto&
args = args_it->value;
53 auto view_ref =
args.FindMember(
"viewRef");
54 if (!view_ref->value.IsUint64()) {
59 zx_handle_t handle = view_ref->value.GetUint64();
60 zx_handle_t out_handle;
62 zx_handle_duplicate(handle, ZX_RIGHT_SAME_RIGHTS, &out_handle);
63 if (status != ZX_OK) {
67 auto ref = fuchsia::ui::views::ViewRef({
68 .reference = zx::eventpair(out_handle),
70 return RequestFocusByViewRef(std::move(ref), std::move(response));
72 }
else if (method->value ==
"View.focus.requestById") {
73 auto args_it = request.FindMember(
"args");
74 if (args_it == request.MemberEnd() || !args_it->value.IsObject()) {
78 const auto&
args = args_it->value;
80 auto view_id =
args.FindMember(
"viewId");
81 if (!view_id->value.IsUint64()) {
86 auto id = view_id->value.GetUint64();
87 if (child_view_view_refs_.count(
id) != 1) {
89 <<
") does not refer to a valid ChildView";
90 Complete(std::move(response),
"[1]");
94 return RequestFocusById(
id, std::move(response));
148 Complete(std::move(response),
"[" + std::to_string(result_code) +
"]");