diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb
index e4ec17467e0200b34380a4c1be538ef997b338f1..1ca95b7dd1e185a1a003062ad585f2140a620242 100644
--- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb
+++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb
@@ -501,6 +501,44 @@ def stylesheet_link_tag(*sources)
end
end
+ # Returns a link tag for a favicon.
+ #
+ # <%= favicon_link_tag %>
+ #
+ # generates
+ #
+ #
+ #
+ # You can specify a different icon file in the first argument:
+ #
+ # <%= favicon_link_tag 'favicon.ico' %>
+ #
+ # That's passed to +image_path+ as is, so the example above would render
+ #
+ #
+ #
+ # The helper accepts an additional options hash where you can override "rel" and "type".
+ def favicon_link_tag(source=nil, options={})
+ tag('link', {
+ :rel => 'shortcut icon',
+ :type => 'image/vnd.microsoft.icon',
+ :href => image_path(source || '/favicon.ico')
+ }.merge(options.symbolize_keys))
+ end
+
+ # Returns a link tag for an icon targetted at iPod Touch, iPhone, and iPad.
+ #
+ # <%= apple_touch_icon_link_tag 'my_site.png' %>
+ #
+ # generates
+ #
+ #
+ #
+ # The source argument is passed to +image_path+ as is.
+ def apple_touch_icon_link_tag(source)
+ tag('link', :rel => 'apple-touch-icon', :href => image_path(source))
+ end
+
# Computes the path to an image asset in the public images directory.
# Full paths from the document root will be passed through.
# Used internally by +image_tag+ to build the image path.
diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb
index 223a430f92f7247f39e64108495e7b436cb576c0..71052fb22c68dd2a068c6a2ae33b73558c9ec0d6 100644
--- a/actionpack/test/template/asset_tag_helper_test.rb
+++ b/actionpack/test/template/asset_tag_helper_test.rb
@@ -157,6 +157,17 @@ def teardown
%(image_tag("mouse.png", :mouseover => image_path("mouse_over.png"))) => %(
)
}
+ FaviconLinkToTag = {
+ %(favicon_link_tag) => %(),
+ %(favicon_link_tag 'favicon.ico') => %(),
+ %(favicon_link_tag 'favicon.ico', :rel => 'foo') => %(),
+ %(favicon_link_tag 'favicon.ico', :rel => 'foo', :type => 'bar') => %()
+ }
+
+ AppleTouchIconLinkToTag = {
+ %(apple_touch_icon_link_tag 'my_site.png') => %()
+ }
+
VideoPathToTag = {
%(video_path("xml")) => %(/videos/xml),
%(video_path("xml.ogg")) => %(/videos/xml.ogg),
@@ -331,6 +342,14 @@ def test_image_tag
ImageLinkToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
end
+ def test_favicon_link_tag
+ FaviconLinkToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
+ end
+
+ def test_apple_touch_link_tag
+ AppleTouchIconLinkToTag.each { |method, tag| assert_dom_equal(tag, eval(method)) }
+ end
+
def test_image_tag_windows_behaviour
old_asset_id, ENV["RAILS_ASSET_ID"] = ENV["RAILS_ASSET_ID"], "1"
# This simulates the behaviour of File#exist? on windows when testing a file ending in "."