Created
May 14, 2011 02:36
-
-
Save AquaGeek/971854 to your computer and use it in GitHub Desktop.
Rails Lighthouse ticket #6748
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| From 61eae0f2b1bfcb54f0355b710808bdcd5fe64b84 Mon Sep 17 00:00:00 2001 | |
| From: Chad Krsek <chad.krsek@gmail.com> | |
| Date: Mon, 25 Apr 2011 21:57:28 -0700 | |
| Subject: [PATCH] asset helpers should understand scheme-relative URLs | |
| --- | |
| actionpack/lib/action_view/helpers/asset_paths.rb | 11 +++++++++-- | |
| actionpack/test/template/asset_tag_helper_test.rb | 15 +++++++++++++++ | |
| 2 files changed, 24 insertions(+), 2 deletions(-) | |
| diff --git a/actionpack/lib/action_view/helpers/asset_paths.rb b/actionpack/lib/action_view/helpers/asset_paths.rb | |
| index 55a4c44..0429e60 100644 | |
| --- a/actionpack/lib/action_view/helpers/asset_paths.rb | |
| +++ b/actionpack/lib/action_view/helpers/asset_paths.rb | |
| @@ -12,13 +12,13 @@ module ActionView | |
| @controller = controller | |
| end | |
| - # Add the extension +ext+ if not present. Return full URLs otherwise untouched. | |
| + # Add the extension +ext+ if not present. Return full or scheme-relative URLs otherwise untouched. | |
| # Prefix with <tt>/dir/</tt> if lacking a leading +/+. Account for relative URL | |
| # roots. Rewrite the asset path for cache-busting asset ids. Include | |
| # asset host, if configured, with the correct request protocol. | |
| def compute_public_path(source, dir, ext = nil, include_host = true) | |
| source = source.to_s | |
| - return source if is_uri?(source) | |
| + return source if is_uri?(source) || is_scheme_relative_uri?(source) | |
| source = rewrite_extension(source, dir, ext) if ext | |
| source = "/#{dir}/#{source}" unless source[0] == ?/ | |
| @@ -36,6 +36,13 @@ module ActionView | |
| path =~ %r{^[-a-z]+://|^cid:} | |
| end | |
| + # A URI relative to a base URI's scheme? | |
| + # See http://labs.apache.org/webarch/uri/rfc/rfc3986.html#relative-normal | |
| + # "//g" => "http://g" | |
| + def is_scheme_relative_uri?(path) | |
| + path =~ %r{^//} | |
| + end | |
| + | |
| private | |
| def rewrite_extension(source, dir, ext) | |
| diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb | |
| index 4a93def..2abc806 100644 | |
| --- a/actionpack/test/template/asset_tag_helper_test.rb | |
| +++ b/actionpack/test/template/asset_tag_helper_test.rb | |
| @@ -66,6 +66,7 @@ class AssetTagHelperTest < ActionView::TestCase | |
| %(auto_discovery_link_tag(:xml)) => %(<link href="http://www.example.com" rel="alternate" title="XML" type="application/xml" />), | |
| %(auto_discovery_link_tag(:rss, :action => "feed")) => %(<link href="http://www.example.com" rel="alternate" title="RSS" type="application/rss+xml" />), | |
| %(auto_discovery_link_tag(:rss, "http://localhost/feed")) => %(<link href="http://localhost/feed" rel="alternate" title="RSS" type="application/rss+xml" />), | |
| + %(auto_discovery_link_tag(:rss, "//localhost/feed")) => %(<link href="//localhost/feed" rel="alternate" title="RSS" type="application/rss+xml" />), | |
| %(auto_discovery_link_tag(:rss, {:action => "feed"}, {:title => "My RSS"})) => %(<link href="http://www.example.com" rel="alternate" title="My RSS" type="application/rss+xml" />), | |
| %(auto_discovery_link_tag(:rss, {}, {:title => "My RSS"})) => %(<link href="http://www.example.com" rel="alternate" title="My RSS" type="application/rss+xml" />), | |
| %(auto_discovery_link_tag(nil, {}, {:type => "text/html"})) => %(<link href="http://www.example.com" rel="alternate" title="" type="text/html" />), | |
| @@ -100,6 +101,7 @@ class AssetTagHelperTest < ActionView::TestCase | |
| %(javascript_include_tag("http://example.com/all")) => %(<script src="http://example.com/all" type="text/javascript"></script>), | |
| %(javascript_include_tag("http://example.com/all.js")) => %(<script src="http://example.com/all.js" type="text/javascript"></script>), | |
| + %(javascript_include_tag("//example.com/all.js")) => %(<script src="//example.com/all.js" type="text/javascript"></script>), | |
| } | |
| StylePathToTag = { | |
| @@ -129,6 +131,7 @@ class AssetTagHelperTest < ActionView::TestCase | |
| %(stylesheet_link_tag("http://www.example.com/styles/style")) => %(<link href="http://www.example.com/styles/style" media="screen" rel="stylesheet" type="text/css" />), | |
| %(stylesheet_link_tag("http://www.example.com/styles/style.css")) => %(<link href="http://www.example.com/styles/style.css" media="screen" rel="stylesheet" type="text/css" />), | |
| + %(stylesheet_link_tag("//www.example.com/styles/style.css")) => %(<link href="//www.example.com/styles/style.css" media="screen" rel="stylesheet" type="text/css" />), | |
| } | |
| ImagePathToTag = { | |
| @@ -157,6 +160,7 @@ class AssetTagHelperTest < ActionView::TestCase | |
| %(image_tag("slash..png")) => %(<img alt="Slash." src="/images/slash..png" />), | |
| %(image_tag(".pdf.png")) => %(<img alt=".pdf" src="/images/.pdf.png" />), | |
| %(image_tag("http://www.rubyonrails.com/images/rails.png")) => %(<img alt="Rails" src="http://www.rubyonrails.com/images/rails.png" />), | |
| + %(image_tag("//www.rubyonrails.com/images/rails.png")) => %(<img alt="Rails" src="//www.rubyonrails.com/images/rails.png" />), | |
| %(image_tag("mouse.png", :mouseover => "/images/mouse_over.png")) => %(<img alt="Mouse" onmouseover="this.src='/images/mouse_over.png'" onmouseout="this.src='/images/mouse.png'" src="/images/mouse.png" />), | |
| %(image_tag("mouse.png", :mouseover => image_path("mouse_over.png"))) => %(<img alt="Mouse" onmouseover="this.src='/images/mouse_over.png'" onmouseout="this.src='/images/mouse.png'" src="/images/mouse.png" />), | |
| %(image_tag("mouse.png", :alt => nil)) => %(<img src="/images/mouse.png" />) | |
| @@ -195,6 +199,7 @@ class AssetTagHelperTest < ActionView::TestCase | |
| %(video_tag("error.avi", "size" => "100 x 100")) => %(<video src="/videos/error.avi" />), | |
| %(video_tag("error.avi", "size" => "x")) => %(<video src="/videos/error.avi" />), | |
| %(video_tag("http://media.rubyonrails.org/video/rails_blog_2.mov")) => %(<video src="http://media.rubyonrails.org/video/rails_blog_2.mov" />), | |
| + %(video_tag("//media.rubyonrails.org/video/rails_blog_2.mov")) => %(<video src="//media.rubyonrails.org/video/rails_blog_2.mov" />), | |
| %(video_tag(["multiple.ogg", "multiple.avi"])) => %(<video><source src="multiple.ogg" /><source src="multiple.avi" /></video>), | |
| %(video_tag(["multiple.ogg", "multiple.avi"], :size => "160x120", :controls => true)) => %(<video controls="controls" height="120" width="160"><source src="multiple.ogg" /><source src="multiple.avi" /></video>) | |
| } | |
| @@ -217,6 +222,7 @@ class AssetTagHelperTest < ActionView::TestCase | |
| %(audio_tag("xml.wav")) => %(<audio src="/audios/xml.wav" />), | |
| %(audio_tag("rss.wav", :autoplay => true, :controls => true)) => %(<audio autoplay="autoplay" controls="controls" src="/audios/rss.wav" />), | |
| %(audio_tag("http://media.rubyonrails.org/audio/rails_blog_2.mov")) => %(<audio src="http://media.rubyonrails.org/audio/rails_blog_2.mov" />), | |
| + %(audio_tag("//media.rubyonrails.org/audio/rails_blog_2.mov")) => %(<audio src="//media.rubyonrails.org/audio/rails_blog_2.mov" />), | |
| } | |
| def test_auto_discovery_link_tag | |
| @@ -505,6 +511,10 @@ class AssetTagHelperTest < ActionView::TestCase | |
| assert_equal %(<img alt="Rails" src="http://www.example.com/rails.png" />), image_tag("http://www.example.com/rails.png") | |
| end | |
| + def test_should_skip_asset_id_on_scheme_relative_url | |
| + assert_equal %(<img alt="Rails" src="//www.example.com/rails.png" />), image_tag("//www.example.com/rails.png") | |
| + end | |
| + | |
| def test_should_use_preset_asset_id | |
| ENV["RAILS_ASSET_ID"] = "4500" | |
| assert_equal %(<img alt="Rails" src="/images/rails.png?4500" />), image_tag("rails.png") | |
| @@ -1095,6 +1105,11 @@ class AssetTagHelperNonVhostTest < ActionView::TestCase | |
| assert_dom_equal(%(<link href="http://bar.example.com/stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" />), stylesheet_link_tag("http://bar.example.com/stylesheets/style.css")) | |
| end | |
| + def test_should_ignore_asset_host_on_scheme_relative_url | |
| + @controller.config.asset_host = "http://assets.example.com" | |
| + assert_dom_equal(%(<link href="//bar.example.com/stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" />), stylesheet_link_tag("//bar.example.com/stylesheets/style.css")) | |
| + end | |
| + | |
| def test_should_wildcard_asset_host_between_zero_and_four | |
| @controller.config.asset_host = 'http://a%d.example.com' | |
| assert_match(%r(http://a[0123].example.com/collaboration/hieraki/images/xml.png), image_path('xml.png')) | |
| -- | |
| 1.7.3.5 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment