From b7e758c607eb6188b8b67d765c4aaed4bea8cd23 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 6 Jul 2026 10:58:16 +0000 Subject: [PATCH] PWA: Only emit maskable icons when the variant exists #5696 --- internal/config/config_app.go | 1 + internal/config/pwa/config.go | 1 + internal/config/pwa/icon.go | 20 ++++++ internal/config/pwa/icon_test.go | 58 +++++++++++++++--- internal/config/pwa/manifest_test.go | 5 +- .../testdata/icons/partial/maskable/192.png | Bin 0 -> 9256 bytes .../pwa/testdata/icons/test/maskable/192.png | Bin 0 -> 9256 bytes .../pwa/testdata/icons/test/maskable/512.png | Bin 0 -> 29309 bytes 8 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 internal/config/pwa/testdata/icons/partial/maskable/192.png create mode 100644 internal/config/pwa/testdata/icons/test/maskable/192.png create mode 100644 internal/config/pwa/testdata/icons/test/maskable/512.png diff --git a/internal/config/config_app.go b/internal/config/config_app.go index 13d110fdb..a6e1a01e2 100644 --- a/internal/config/config_app.go +++ b/internal/config/config_app.go @@ -98,6 +98,7 @@ func (c *Config) AppConfig() pwa.Config { BaseUri: c.BaseUri("/"), FrontendUri: c.FrontendUri(""), StaticUri: c.StaticUri(), + StaticPath: c.StaticPath(), SiteUrl: c.SiteUrl(), CdnUrl: c.CdnUrl("/"), ThemeUri: ThemeUri, diff --git a/internal/config/pwa/config.go b/internal/config/pwa/config.go index a46f2893f..1f6dadb29 100644 --- a/internal/config/pwa/config.go +++ b/internal/config/pwa/config.go @@ -11,6 +11,7 @@ type Config struct { BaseUri string `json:"baseUri"` FrontendUri string `json:"frontendUri"` StaticUri string `json:"staticUri"` + StaticPath string `json:"staticPath"` SiteUrl string `json:"siteUrl"` CdnUrl string `json:"cdnUrl"` ThemeUri string `json:"themeUri"` diff --git a/internal/config/pwa/icon.go b/internal/config/pwa/icon.go index 5e6a85b9f..30c0c981c 100644 --- a/internal/config/pwa/icon.go +++ b/internal/config/pwa/icon.go @@ -89,7 +89,14 @@ func NewIcons(c Config) Icons { // Adaptive launcher icons generated from a safe-zone-padded source so Android // fills the home-screen mask shape instead of letterboxing the default icon. + // Emitted only for sizes whose file exists on disk so the manifest never + // advertises a maskable variant that resolves to a 404, e.g. for custom icon + // sets without pre-rendered maskable images. for _, d := range MaskableIconSizes { + if !maskableIconExists(c.StaticPath, appIcon, d) { + continue + } + icons = append(icons, Icon{ Src: fmt.Sprintf("%s/icons/%s/maskable/%d.png", staticUri, appIcon, d), Sizes: fmt.Sprintf("%dx%d", d, d), @@ -100,3 +107,16 @@ func NewIcons(c Config) Icons { return icons } + +// maskableIconExists reports whether a non-empty maskable icon file of the given +// size exists on disk for the specified icon set. It returns false when staticPath +// is unset, since the manifest must not reference variants that cannot be verified. +func maskableIconExists(staticPath, appIcon string, size int) bool { + if staticPath == "" { + return false + } + + fileName := filepath.Join(staticPath, fs.IconsDir, appIcon, "maskable", fmt.Sprintf("%d.png", size)) + + return fs.FileExistsNotEmpty(fileName) +} diff --git a/internal/config/pwa/icon_test.go b/internal/config/pwa/icon_test.go index e24b7010b..c866a0a1a 100644 --- a/internal/config/pwa/icon_test.go +++ b/internal/config/pwa/icon_test.go @@ -10,7 +10,7 @@ import ( func TestNewIcons(t *testing.T) { t.Run("Standard", func(t *testing.T) { - c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", Icon: "test"} + c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", StaticPath: fs.Abs("./testdata"), Icon: "test"} result := NewIcons(c) assert.NotEmpty(t, result) assert.Len(t, result, len(IconSizes)+len(MaskableIconSizes)) @@ -20,14 +20,9 @@ func TestNewIcons(t *testing.T) { assert.Equal(t, "", result[0].Purpose) }) t.Run("Maskable", func(t *testing.T) { - c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", Icon: "test"} + c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", StaticPath: fs.Abs("./testdata"), Icon: "test"} result := NewIcons(c) - maskable := make(Icons, 0, len(MaskableIconSizes)) - for _, icon := range result { - if icon.Purpose == "maskable" { - maskable = append(maskable, icon) - } - } + maskable := maskableIcons(result) assert.Len(t, maskable, len(MaskableIconSizes)) assert.Equal(t, "https://demo-cdn.photoprism.app/static/icons/test/maskable/192.png", maskable[0].Src) assert.Equal(t, "192x192", maskable[0].Sizes) @@ -35,6 +30,26 @@ func TestNewIcons(t *testing.T) { assert.Equal(t, "https://demo-cdn.photoprism.app/static/icons/test/maskable/512.png", maskable[1].Src) assert.Equal(t, "512x512", maskable[1].Sizes) }) + t.Run("MaskablePartial", func(t *testing.T) { + c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", StaticPath: fs.Abs("./testdata"), Icon: "partial"} + result := NewIcons(c) + maskable := maskableIcons(result) + assert.Len(t, maskable, 1) + assert.Equal(t, "https://demo-cdn.photoprism.app/static/icons/partial/maskable/192.png", maskable[0].Src) + assert.Len(t, result, len(IconSizes)+1) + }) + t.Run("MaskableMissing", func(t *testing.T) { + c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", StaticPath: fs.Abs("./testdata"), Icon: "nomask"} + result := NewIcons(c) + assert.Empty(t, maskableIcons(result)) + assert.Len(t, result, len(IconSizes)) + }) + t.Run("StaticPathUnset", func(t *testing.T) { + c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", Icon: "test"} + result := NewIcons(c) + assert.Empty(t, maskableIcons(result)) + assert.Len(t, result, len(IconSizes)) + }) t.Run("Custom", func(t *testing.T) { c := Config{StaticUri: "https://demo-cdn.photoprism.app/static", Icon: "/test.png"} result := NewIcons(c) @@ -56,3 +71,30 @@ func TestNewIcons(t *testing.T) { assert.Equal(t, "", result[0].Purpose) }) } + +func TestMaskableIconExists(t *testing.T) { + staticPath := fs.Abs("./testdata") + t.Run("Exists", func(t *testing.T) { + assert.True(t, maskableIconExists(staticPath, "test", 192)) + assert.True(t, maskableIconExists(staticPath, "test", 512)) + }) + t.Run("Missing", func(t *testing.T) { + assert.False(t, maskableIconExists(staticPath, "test", 256)) + assert.False(t, maskableIconExists(staticPath, "partial", 512)) + assert.False(t, maskableIconExists(staticPath, "nomask", 192)) + }) + t.Run("StaticPathUnset", func(t *testing.T) { + assert.False(t, maskableIconExists("", "test", 192)) + }) +} + +// maskableIcons returns the subset of icons emitted with purpose "maskable". +func maskableIcons(icons Icons) Icons { + maskable := make(Icons, 0, len(MaskableIconSizes)) + for _, icon := range icons { + if icon.Purpose == "maskable" { + maskable = append(maskable, icon) + } + } + return maskable +} diff --git a/internal/config/pwa/manifest_test.go b/internal/config/pwa/manifest_test.go index 884288463..bab8f7950 100644 --- a/internal/config/pwa/manifest_test.go +++ b/internal/config/pwa/manifest_test.go @@ -4,11 +4,13 @@ import ( "testing" "github.com/stretchr/testify/assert" + + "github.com/photoprism/photoprism/pkg/fs" ) func TestNewManifest(t *testing.T) { c := Config{ - Icon: "logo", + Icon: "test", Color: "#aaaaaa", Name: "TestPrism+", Description: "App's Description", @@ -17,6 +19,7 @@ func TestNewManifest(t *testing.T) { BaseUri: "/", FrontendUri: "/library", StaticUri: "/static", + StaticPath: fs.Abs("./testdata"), } t.Run("Standard", func(t *testing.T) { diff --git a/internal/config/pwa/testdata/icons/partial/maskable/192.png b/internal/config/pwa/testdata/icons/partial/maskable/192.png new file mode 100644 index 0000000000000000000000000000000000000000..d377ae492344223b115ccd12a1f44d60a8e085a6 GIT binary patch literal 9256 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 literal 0 HcmV?d00001 diff --git a/internal/config/pwa/testdata/icons/test/maskable/192.png b/internal/config/pwa/testdata/icons/test/maskable/192.png new file mode 100644 index 0000000000000000000000000000000000000000..d377ae492344223b115ccd12a1f44d60a8e085a6 GIT binary patch literal 9256 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 literal 0 HcmV?d00001 diff --git a/internal/config/pwa/testdata/icons/test/maskable/512.png b/internal/config/pwa/testdata/icons/test/maskable/512.png new file mode 100644 index 0000000000000000000000000000000000000000..9c625a4aff5c855928073077a9f720c4020b0487 GIT binary patch literal 29309 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𝔭F*s4v4bt+&C!o8Je>I2oWZs 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 literal 0 HcmV?d00001