Refactor to enable auto-detection of screenshot generation renderer
What changed, and why it matters
This commit is a small internal cleanup that changes how the screenshot test tool tells the splash screen to skip animations and delays. It replaces a parameter passed into the splash screen with a property checked on the renderer object. There is no security-relevant change for end users.
No security action required; this is a routine test-infrastructure refactor.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The refactor removes the is_screenshot_renderer parameter from OpeningSplashView/OpeningSplashScreen and instead queries self.renderer.is_screenshot_generator. A base Renderer returns False; the test-only ScreenshotRenderer subclass returns True. Call sites in the screenshot generator are updated accordingly. Behavior is functionally equivalent; no cryptographic, input-validation, or privilege changes are present.
Changed components
src/seedsigner/gui/renderer.pysrc/seedsigner.views.screensaver.OpeningSplashViewsrc/seedsigner.views.screensaver.OpeningSplashScreentests/screenshot_generator/generator.pytests/screenshot_generator/utils.pyInspect captured patch +16 / −10
diff --git a/src/seedsigner/gui/renderer.py b/src/seedsigner/gui/renderer.py
index 9ec58da..d0e2381 100644
--- a/src/seedsigner/gui/renderer.py
+++ b/src/seedsigner/gui/renderer.py
@@ -20,6 +20,11 @@ class Renderer(ConfigurableSingleton):
lock = Lock()
+ @property
+ def is_screenshot_generator(self) -> bool:
+ return False
+
+
@classmethod
def configure_instance(cls):
# Instantiate the one and only Renderer instance
diff --git a/src/seedsigner/views/screensaver.py b/src/seedsigner/views/screensaver.py
index d607f6e..8b2970d 100644
--- a/src/seedsigner/views/screensaver.py
+++ b/src/seedsigner/views/screensaver.py
@@ -43,21 +43,18 @@ class LogoScreen(BaseScreen):
@dataclass
class OpeningSplashView(View):
- is_screenshot_renderer: bool = False
force_partner_logos: bool|None = None
def run(self):
self.run_screen(
OpeningSplashScreen,
- is_screenshot_renderer=self.is_screenshot_renderer,
force_partner_logos=self.force_partner_logos
)
class OpeningSplashScreen(LogoScreen):
- def __init__(self, is_screenshot_renderer=False, force_partner_logos=None):
- self.is_screenshot_renderer = is_screenshot_renderer
+ def __init__(self, force_partner_logos=None):
self.force_partner_logos = force_partner_logos
super().__init__()
@@ -85,7 +82,7 @@ class OpeningSplashScreen(LogoScreen):
logo_offset_y = 0
background = Image.new("RGBA", size=self.logo.size, color="black")
- if not self.is_screenshot_renderer:
+ if not self.renderer.is_screenshot_generator:
# Fade in alpha
for i in range(250, -1, -25):
self.logo.putalpha(255 - i)
@@ -108,11 +105,11 @@ class OpeningSplashScreen(LogoScreen):
version_y = int(self.canvas_height/2) + int(logo_height/2) + logo_offset_y + GUIConstants.COMPONENT_PADDING
self.renderer.draw.text(xy=(version_x, version_y), text=version, font=font, fill=GUIConstants.ACCENT_COLOR, anchor="mt")
- if not self.is_screenshot_renderer:
+ if not self.renderer.is_screenshot_generator:
self.renderer.show_image()
if show_partner_logos:
- if not self.is_screenshot_renderer:
+ if not self.renderer.is_screenshot_generator:
# Hold on the version num for a moment
time.sleep(1)
@@ -136,7 +133,7 @@ class OpeningSplashScreen(LogoScreen):
self.renderer.show_image()
- if not self.is_screenshot_renderer:
+ if not self.renderer.is_screenshot_generator:
# Hold on the splash screen for a moment
time.sleep(2)
diff --git a/tests/screenshot_generator/generator.py b/tests/screenshot_generator/generator.py
index 91018ea..196e25c 100644
--- a/tests/screenshot_generator/generator.py
+++ b/tests/screenshot_generator/generator.py
@@ -262,8 +262,8 @@ def generate_screenshots(locale):
screenshot_sections = {
"Main Menu Views": [
- ScreenshotConfig(OpeningSplashView, dict(is_screenshot_renderer=True, force_partner_logos=True)),
- ScreenshotConfig(OpeningSplashView, dict(is_screenshot_renderer=True, force_partner_logos=False), screenshot_name="OpeningSplashView_no_partner_logos"),
+ ScreenshotConfig(OpeningSplashView, dict(force_partner_logos=True)),
+ ScreenshotConfig(OpeningSplashView, dict(force_partner_logos=False), screenshot_name="OpeningSplashView_no_partner_logos"),
ScreenshotConfig(MainMenuView),
ScreenshotConfig(MainMenuView, screenshot_name='MainMenuView_SDCardStateChangeToast_removed', toast_thread=SDCardStateChangeToastManagerThread(action=MicroSD.ACTION__REMOVED, activation_delay=0, duration=0)),
ScreenshotConfig(MainMenuView, screenshot_name='MainMenuView_SDCardStateChangeToast_inserted', toast_thread=SDCardStateChangeToastManagerThread(action=MicroSD.ACTION__INSERTED, activation_delay=0, duration=0)),
diff --git a/tests/screenshot_generator/utils.py b/tests/screenshot_generator/utils.py
index d161831..56bfb91 100644
--- a/tests/screenshot_generator/utils.py
+++ b/tests/screenshot_generator/utils.py
@@ -22,6 +22,10 @@ class ScreenshotRenderer(Renderer):
screenshot_path: str = None
screenshot_filename: str = None
+ @property
+ def is_screenshot_generator(self) -> bool:
+ return True
+
@classmethod
def configure_instance(cls):
# Instantiate the one and only Renderer instance
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.