diff --git a/actionview/lib/action_view/helpers/asset_tag_helper.rb b/actionview/lib/action_view/helpers/asset_tag_helper.rb index ec2856e93e..e0aea7757a 100644 --- a/actionview/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionview/lib/action_view/helpers/asset_tag_helper.rb @@ -325,16 +325,17 @@ module ActionView crossorigin = "anonymous" if crossorigin == true || (crossorigin.blank? && as_type == "font") integrity = options[:integrity] nopush = options.delete(:nopush) || false + rel = mime_type == "module" ? "modulepreload" : "preload" link_tag = tag.link(**{ - rel: "preload", + rel: rel, href: href, as: as_type, type: mime_type, crossorigin: crossorigin }.merge!(options.symbolize_keys)) - preload_link = "<#{href}>; rel=preload; as=#{as_type}" + preload_link = "<#{href}>; rel=#{rel}; as=#{as_type}" preload_link += "; type=#{mime_type}" if mime_type preload_link += "; crossorigin=#{crossorigin}" if crossorigin preload_link += "; integrity=#{integrity}" if integrity diff --git a/actionview/test/template/asset_tag_helper_test.rb b/actionview/test/template/asset_tag_helper_test.rb index 65f375adf6..44a5135dc5 100644 --- a/actionview/test/template/asset_tag_helper_test.rb +++ b/actionview/test/template/asset_tag_helper_test.rb @@ -246,6 +246,7 @@ class AssetTagHelperTest < ActionView::TestCase } PreloadLinkToTag = { + %(preload_link_tag '/application.js', type: 'module') => %(), %(preload_link_tag '/styles/custom_theme.css') => %(), %(preload_link_tag '/videos/video.webm') => %(), %(preload_link_tag '/posts.json', as: 'fetch') => %(), @@ -605,6 +606,14 @@ class AssetTagHelperTest < ActionView::TestCase end end + def test_should_set_preload_early_hints_with_rel_modulepreload + with_preload_links_header do + preload_link_tag("http://example.com/all.js", type: "module") + expected = "; rel=modulepreload; as=script; type=module" + assert_equal expected, @response.headers["Link"] + end + end + def test_should_set_preload_links_with_integrity_hashes with_preload_links_header do stylesheet_link_tag("http://example.com/style.css", integrity: "sha256-AbpHGcgLb+kRsJGnwFEktk7uzpZOCcBY74+YBdrKVGs")