diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index cf7c11740..617a9029b 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1270,7 +1270,8 @@ module ApplicationHelper end def favicon - "".html_safe + fav_path = (current_theme && current_theme.favicon?) ? current_theme.favicon_path : '/favicon.ico' + "".html_safe end def robot_exclusion_tag diff --git a/lib/redmine/themes.rb b/lib/redmine/themes.rb index eb2ba9151..c69244f7e 100644 --- a/lib/redmine/themes.rb +++ b/lib/redmine/themes.rb @@ -75,6 +75,18 @@ module Redmine @javascripts ||= assets("javascripts", "js") end + def favicons + @favicons ||= assets("favicon") + end + + def favicon + favicons.first + end + + def favicon? + favicon.present? + end + def stylesheet_path(source) "/themes/#{dir}/stylesheets/#{source}" end @@ -87,6 +99,10 @@ module Redmine "/themes/#{dir}/javascripts/#{source}" end + def favicon_path + "/themes/#{dir}/favicon/#{favicon}" + end + private def assets(dir, ext=nil) diff --git a/test/integration/lib/redmine/themes_test.rb b/test/integration/lib/redmine/themes_test.rb index 6d286ef10..da413db35 100644 --- a/test/integration/lib/redmine/themes_test.rb +++ b/test/integration/lib/redmine/themes_test.rb @@ -57,9 +57,40 @@ class ThemesTest < ActionController::IntegrationTest @theme.javascripts.delete 'theme' end + def test_use_default_favicon_if_theme_provides_none + get '/' + + assert_response :success + assert_select 'link[rel=shortcut icon][href^=/favicon.ico]' + end + + def test_use_theme_favicon_if_theme_provides_one + # Simulate a theme favicon + @theme.favicons << 'a.ico' + get '/' + + assert_response :success + assert_select "link[rel=shortcut icon][href^=/themes/#{@theme.dir}/favicon/a.ico]" + ensure + @theme.favicons.delete 'a.ico' + end + + def test_use_only_one_theme_favicon_if_theme_provides_many + @theme.favicons.concat %w{b.ico a.png} + get '/' + + assert_response :success + assert_select "link[rel=shortcut icon]", 1 + assert_select "link[rel=shortcut icon][href^=/themes/#{@theme.dir}/favicon/b.ico]" + ensure + @theme.favicons.delete("b.ico") + @theme.favicons.delete("a.png") + end + def test_with_sub_uri Redmine::Utils.relative_url_root = '/foo' @theme.javascripts << 'theme' + @theme.favicons << 'a.ico' get '/' assert_response :success @@ -67,7 +98,7 @@ class ThemesTest < ActionController::IntegrationTest :attributes => {:href => %r{^/foo/themes/#{@theme.dir}/stylesheets/application.css}} assert_tag :tag => 'script', :attributes => {:src => %r{^/foo/themes/#{@theme.dir}/javascripts/theme.js}} - + assert_select "link[rel=shortcut icon][href^=/foo/themes/#{@theme.dir}/favicon/a.ico]" ensure Redmine::Utils.relative_url_root = '' end