1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-23 23:18:16 +00:00

fix(core): don't send ButtonRequests during menu handling

Use `LayoutContent.page_count()` instead of `ButtonRequest.pages`.

[no changelog]
This commit is contained in:
Roman Zeyde 2025-07-02 15:35:54 +03:00 committed by Roman Zeyde
parent 9d9f3732a3
commit 09be64d1e7
2 changed files with 37 additions and 38 deletions

View File

@ -80,6 +80,7 @@ async def confirm_with_menu(
) -> None:
while True:
result = await interact(main, br_name, br_code)
br_name = None # ButtonRequest should be sent once (for the main layout)
if result is trezorui_api.INFO:
await show_menu(menu, br_name, br_code)
else:

View File

@ -930,9 +930,13 @@ class DebugUI:
def default_input_flow(self) -> InputFlowType:
while True:
yield from self._handle_button_request()
br = yield
if br.code == messages.ButtonRequestType.PinEntry:
self.debuglink.input(self.get_pin())
else:
self._paginate_and_confirm(br.pages)
def _visit_menu_items(self) -> InputFlowType:
def _visit_menu_items(self) -> None:
layout = self.debuglink.read_layout()
if not layout.has_menu():
return
@ -942,54 +946,48 @@ class DebugUI:
# enter info menu layout and paginate through its items
self.debuglink.press_info()
br = yield
assert br.pages is not None
for _ in range(br.pages):
menu_items_count = self.debuglink.read_layout().page_count()
for _ in range(menu_items_count):
self.debuglink.press_middle()
# paginate through all properties and confirm
yield from self._handle_button_request()
self._paginate_and_confirm(None)
# paginate to next menu item
br = yield
self.debuglink.press_right()
# cancel info menu layout
self.debuglink.press_no()
# back to the main layout
br = yield
def _handle_button_request(self) -> InputFlowType:
br = yield
if br.code == messages.ButtonRequestType.PinEntry:
self.debuglink.input(self.get_pin())
else:
# Paginating (going as further as possible)
if br.pages is not None:
for _ in range(br.pages - 1):
if self.debuglink.model is models.T3W1:
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.swipe_up()
def _paginate_and_confirm(self, pages: int | None) -> None:
if pages is None:
pages = self.debuglink.read_layout().page_count()
# Visit info menus (if exist)
yield from self._visit_menu_items()
# Paginating (going as further as possible)
for _ in range(pages - 1):
if self.debuglink.model is models.T3W1:
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.swipe_up()
# Confirm current layout
if self.debuglink.model is models.T3T1:
layout = self.debuglink.read_layout()
if "PromptScreen" in layout.all_components():
self.debuglink.press_yes()
elif "SwipeContent" in layout.all_components():
self.debuglink.swipe_up()
else:
self.debuglink.press_yes()
elif self.debuglink.model is models.T3W1:
layout = self.debuglink.read_layout()
if "TextScreen" in layout.all_components():
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.press_yes()
# Visit info menus (if exist)
self._visit_menu_items()
# Confirm current layout
if self.debuglink.model is models.T3T1:
layout = self.debuglink.read_layout()
if "PromptScreen" in layout.all_components():
self.debuglink.press_yes()
elif "SwipeContent" in layout.all_components():
self.debuglink.swipe_up()
else:
self.debuglink.press_yes()
elif self.debuglink.model is models.T3W1:
layout = self.debuglink.read_layout()
if "TextScreen" in layout.all_components():
self.debuglink.click(self.debuglink.screen_buttons.ok())
else:
self.debuglink.press_yes()
else:
self.debuglink.press_yes()
def button_request(self, br: messages.ButtonRequest) -> None:
self.debuglink.snapshot_legacy()