Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit 5612ca8

Browse files
committed
- Modified `UrlResolutionTagHelper` to utilize new CSS selector attributes to restrict when it applies. It now only appies to tags that have their values starting with `~/`. - `UrlResolutionTagHelper` no longer applies to dynamic content such as `href="@SomethingResultingInTildaSlash"`. - Updated tests to reflect new behavior.
1 parent f3740b2 commit 5612ca8

File tree

3 files changed

+36
-36
lines changed

3 files changed

+36
-36
lines changed

src/Microsoft.AspNetCore.Mvc.Razor/TagHelpers/UrlResolutionTagHelper.cs

+29-29
Original file line numberDiff line numberDiff line change
@@ -21,35 +21,35 @@ namespace Microsoft.AspNetCore.Mvc.Razor.TagHelpers
2121
/// <remarks>Resolves URLs starting with '~/' (relative to the application's 'webroot' setting) that are not
2222
/// targeted by other <see cref="ITagHelper"/>s. Runs prior to other <see cref="ITagHelper"/>s to ensure
2323
/// application-relative URLs are resolved.</remarks>
24-
[HtmlTargetElement("*", Attributes = "itemid")]
25-
[HtmlTargetElement("a", Attributes = "href")]
26-
[HtmlTargetElement("applet", Attributes = "archive")]
27-
[HtmlTargetElement("area", Attributes = "href", TagStructure = TagStructure.WithoutEndTag)]
28-
[HtmlTargetElement("audio", Attributes = "src")]
29-
[HtmlTargetElement("base", Attributes = "href", TagStructure = TagStructure.WithoutEndTag)]
30-
[HtmlTargetElement("blockquote", Attributes = "cite")]
31-
[HtmlTargetElement("button", Attributes = "formaction")]
32-
[HtmlTargetElement("del", Attributes = "cite")]
33-
[HtmlTargetElement("embed", Attributes = "src", TagStructure = TagStructure.WithoutEndTag)]
34-
[HtmlTargetElement("form", Attributes = "action")]
35-
[HtmlTargetElement("html", Attributes = "manifest")]
36-
[HtmlTargetElement("iframe", Attributes = "src")]
37-
[HtmlTargetElement("img", Attributes = "src", TagStructure = TagStructure.WithoutEndTag)]
38-
[HtmlTargetElement("img", Attributes = "srcset", TagStructure = TagStructure.WithoutEndTag)]
39-
[HtmlTargetElement("input", Attributes = "src", TagStructure = TagStructure.WithoutEndTag)]
40-
[HtmlTargetElement("input", Attributes = "formaction", TagStructure = TagStructure.WithoutEndTag)]
41-
[HtmlTargetElement("ins", Attributes = "cite")]
42-
[HtmlTargetElement("link", Attributes = "href", TagStructure = TagStructure.WithoutEndTag)]
43-
[HtmlTargetElement("menuitem", Attributes = "icon")]
44-
[HtmlTargetElement("object", Attributes = "archive")]
45-
[HtmlTargetElement("object", Attributes = "data")]
46-
[HtmlTargetElement("q", Attributes = "cite")]
47-
[HtmlTargetElement("script", Attributes = "src")]
48-
[HtmlTargetElement("source", Attributes = "src", TagStructure = TagStructure.WithoutEndTag)]
49-
[HtmlTargetElement("source", Attributes = "srcset", TagStructure = TagStructure.WithoutEndTag)]
50-
[HtmlTargetElement("track", Attributes = "src", TagStructure = TagStructure.WithoutEndTag)]
51-
[HtmlTargetElement("video", Attributes = "src")]
52-
[HtmlTargetElement("video", Attributes = "poster")]
24+
[HtmlTargetElement("*", Attributes = "[itemid^='~/']")]
25+
[HtmlTargetElement("a", Attributes = "[href^='~/']")]
26+
[HtmlTargetElement("applet", Attributes = "[archive^='~/']")]
27+
[HtmlTargetElement("area", Attributes = "[href^='~/']", TagStructure = TagStructure.WithoutEndTag)]
28+
[HtmlTargetElement("audio", Attributes = "[src^='~/']")]
29+
[HtmlTargetElement("base", Attributes = "[href^='~/']", TagStructure = TagStructure.WithoutEndTag)]
30+
[HtmlTargetElement("blockquote", Attributes = "[cite^='~/']")]
31+
[HtmlTargetElement("button", Attributes = "[formaction^='~/']")]
32+
[HtmlTargetElement("del", Attributes = "[cite^='~/']")]
33+
[HtmlTargetElement("embed", Attributes = "[src^='~/']", TagStructure = TagStructure.WithoutEndTag)]
34+
[HtmlTargetElement("form", Attributes = "[action^='~/']")]
35+
[HtmlTargetElement("html", Attributes = "[manifest^='~/']")]
36+
[HtmlTargetElement("iframe", Attributes = "[src^='~/']")]
37+
[HtmlTargetElement("img", Attributes = "[src^='~/']", TagStructure = TagStructure.WithoutEndTag)]
38+
[HtmlTargetElement("img", Attributes = "[srcset^='~/']", TagStructure = TagStructure.WithoutEndTag)]
39+
[HtmlTargetElement("input", Attributes = "[src^='~/']", TagStructure = TagStructure.WithoutEndTag)]
40+
[HtmlTargetElement("input", Attributes = "[formaction^='~/']", TagStructure = TagStructure.WithoutEndTag)]
41+
[HtmlTargetElement("ins", Attributes = "[cite^='~/']")]
42+
[HtmlTargetElement("link", Attributes = "[href^='~/']", TagStructure = TagStructure.WithoutEndTag)]
43+
[HtmlTargetElement("menuitem", Attributes = "[icon^='~/']")]
44+
[HtmlTargetElement("object", Attributes = "[archive^='~/']")]
45+
[HtmlTargetElement("object", Attributes = "[data^='~/']")]
46+
[HtmlTargetElement("q", Attributes = "[cite^='~/']")]
47+
[HtmlTargetElement("script", Attributes = "[src^='~/']")]
48+
[HtmlTargetElement("source", Attributes = "[src^='~/']", TagStructure = TagStructure.WithoutEndTag)]
49+
[HtmlTargetElement("source", Attributes = "[srcset^='~/']", TagStructure = TagStructure.WithoutEndTag)]
50+
[HtmlTargetElement("track", Attributes = "[src^='~/']", TagStructure = TagStructure.WithoutEndTag)]
51+
[HtmlTargetElement("video", Attributes = "[src^='~/']")]
52+
[HtmlTargetElement("video", Attributes = "[poster^='~/']")]
5353
[EditorBrowsable(EditorBrowsableState.Never)]
5454
public class UrlResolutionTagHelper : TagHelper
5555
{

test/Microsoft.AspNetCore.Mvc.FunctionalTests/compiler/resources/RazorWebSite.UrlResolution.Index.Encoded.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
<a href="HtmlEncode[[/]]Person">Person</a>
88
<area href="HtmlEncode[[/]]Person/HtmlEncode[[John Doe]]" alt="Url stuff">
99
<link href="HtmlEncode[[/]]Person/HtmlEncode[[John Doe]]/CSS" rel="stylesheet">
10-
<video poster="HtmlEncode[[~/SomeUrl]]" src="HtmlEncode[[~/SomeUrl]]/HtmlEncode[[video]]" />
10+
<video poster=HtmlEncode[[~/SomeUrl]] src='HtmlEncode[[~/SomeUrl]]/HtmlEncode[[video]]' />
1111
<audio src="HtmlEncode[[~/SomeUrl]]">
1212
<source src="HtmlEncode[[/]]Person" srcset="HtmlEncode[[/]]Person">
1313
<track src="HtmlEncode[[/]]emailHtmlEncode[[~/SomeUrl]]">
1414
</audio>
1515
<embed src="HtmlEncode[[/]]email@dyanmicUrl">
16-
<iframe src="HtmlEncode[[~/SomeUrl]]" />
16+
<iframe src=HtmlEncode[[~/SomeUrl]] />
1717
<img src="HtmlEncode[[/]]HtmlEncode[[John Doe]]" srcset="HtmlEncode[[/]]HtmlEncode[[John Doe]]">
1818
<script src="HtmlEncode[[/]]Person/HtmlEncode[[John Doe]]/JS"></script>
1919
<input src="HtmlEncode[[/]]/Person" itemscope itemid="HtmlEncode[[/]]Person" formaction="HtmlEncode[[~/SomeUrl]]">
@@ -27,7 +27,7 @@
2727
<menuitem icon="HtmlEncode[[/]]Person" />
2828
</menu>
2929
<object data="HtmlEncode[[/]]Person" archive="HtmlEncode[[/]]Person/HtmlEncode[[John Doe]]" data="HtmlEncode[[/]]Person" archive="HtmlEncode[[/]]Person/HtmlEncode[[John Doe]]" />
30-
<object archive="HtmlEncode[[/]]Person/HtmlEncode[[John Doe]]" />
30+
<object archive="~/Person/HtmlEncode[[John Doe]] " />
3131
<applet archive="HtmlEncode[[/]]A+Really(Crazy),Url.Is:This/HtmlEncode[[John Doe]]/Detail" />
3232
</body>
3333
</html>

test/Microsoft.AspNetCore.Mvc.FunctionalTests/compiler/resources/RazorWebSite.UrlResolution.Index.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
<a href="/Person">Person</a>
88
<area href="/Person/John Doe" alt="Url stuff">
99
<link href="/Person/John Doe/CSS" rel="stylesheet">
10-
<video poster="/SomeUrl" src="/SomeUrl/video" />
11-
<audio src="/SomeUrl">
10+
<video poster=~/SomeUrl src='~/SomeUrl/video' />
11+
<audio src="~/SomeUrl">
1212
<source src="/Person" srcset="/Person">
1313
<track src="/email~/SomeUrl">
1414
</audio>
1515
<embed src="/email@dyanmicUrl">
16-
<iframe src="/SomeUrl" />
16+
<iframe src=~/SomeUrl />
1717
<img src="/John Doe" srcset="/John Doe">
1818
<script src="/Person/John Doe/JS"></script>
1919
<input src="//Person" itemscope itemid="/Person" formaction="/SomeUrl">
@@ -27,7 +27,7 @@
2727
<menuitem icon="/Person" />
2828
</menu>
2929
<object data="/Person" archive="/Person/John Doe" data="/Person" archive="/Person/John Doe" />
30-
<object archive="/Person/John Doe" />
30+
<object archive="~/Person/John Doe " />
3131
<applet archive="/A+Really(Crazy),Url.Is:This/John Doe/Detail" />
3232
</body>
3333
</html>

0 commit comments

Comments
 (0)