From 8b999962dec50fc4599f77c1a23fbdc7b43dab21 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 11 Jan 2014 11:22:46 +0000 Subject: [PATCH] Make favicon themeable (#15689). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch by Felix Schäfer modified by Jean-Philippe Lang. git-svn-id: http://svn.redmine.org/redmine/trunk@12646 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/helpers/application_helper.rb | 3 +- lib/redmine/themes.rb | 16 ++++++++++ test/integration/lib/redmine/themes_test.rb | 33 ++++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) 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