Selaa lähdekoodia

2007-03-20 Igor Zelmanovich <[email protected]>

	* Control.cs: fixed ResolveClientUrl method.

svn path=/trunk/mcs/; revision=74678
Igor Zelmanovich 19 vuotta sitten
vanhempi
sitoutus
49957fdafc

+ 4 - 0
mcs/class/System.Web/System.Web.UI/ChangeLog

@@ -1,3 +1,7 @@
+2007-03-20 Igor Zelmanovich <[email protected]>
+
+	* Control.cs: fixed ResolveClientUrl method.
+
 2007-03-18  Marek Habersack  <[email protected]>
 
 	* BaseParser.cs: fix BaseVirtualDir to always return app-absolute

+ 14 - 7
mcs/class/System.Web/System.Web.UI/Control.cs

@@ -1192,18 +1192,25 @@ namespace System.Web.UI
 #endif
 		string ResolveClientUrl (string relativeUrl)
 		{
-			string absoluteUrl = ResolveUrl (relativeUrl);
 #if TARGET_J2EE
 			// There are no relative paths when rendering a J2EE portlet
 			if (Page != null && Page.PortletNamespace != null)
-				return absoluteUrl;
+				return ResolveUrl (relativeUrl);
 #endif
-			if (Context != null && Context.Request != null) {
-				string baseUrl = Context.Request.BaseVirtualDir;
-				if (absoluteUrl.StartsWith (baseUrl + "/"))
-					return absoluteUrl.Substring (baseUrl.Length + 1);
+			if (relativeUrl == null)
+				throw new ArgumentNullException ("relativeUrl");
+
+			if (relativeUrl.Length == 0)
+				return String.Empty;
+
+			if (Context != null && Context.Request != null && VirtualPathUtility.IsAppRelative (relativeUrl)) {
+				string basePath = Context.Request.FilePath;
+				if (basePath.Length > 1 && basePath [basePath.Length - 1] != '/') {
+					basePath = VirtualPathUtility.GetDirectory (basePath);
+				}
+				return VirtualPathUtility.MakeRelative (basePath, relativeUrl);
 			}
-			return absoluteUrl;
+			return relativeUrl;
 		}
 		
 		internal bool HasRenderMethodDelegate () {

+ 21 - 0
mcs/class/System.Web/Test/System.Web.UI/ControlTest.cs

@@ -623,6 +623,27 @@ namespace MonoTests.System.Web.UI
 			p.Controls.Add (ctrl);
 			string url = ctrl.ResolveClientUrl ("~/MyPage.aspx");
 			Assert.AreEqual ("MyPage.aspx", url, "ResolveClientUrl Failed");
+
+			Assert.AreEqual ("", ctrl.ResolveClientUrl (""), "empty string");
+			
+			Assert.AreEqual ("./", ctrl.ResolveClientUrl ("~"), "~");
+			Assert.AreEqual ("./", ctrl.ResolveClientUrl ("~/"), "~/");
+
+			Assert.AreEqual ("../MyPage.aspx", ctrl.ResolveClientUrl ("~/../MyPage.aspx"), "~/../MyPage.aspx");
+			Assert.AreEqual ("../MyPage.aspx", ctrl.ResolveClientUrl ("~\\..\\MyPage.aspx"), "~\\..\\MyPage.aspx");
+			Assert.AreEqual ("MyPage.aspx", ctrl.ResolveClientUrl ("~////MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("/MyPage.aspx", ctrl.ResolveClientUrl ("/MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("/folder/MyPage.aspx", ctrl.ResolveClientUrl ("/folder/MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("/NunitWeb/MyPage.aspx", ctrl.ResolveClientUrl ("/NunitWeb/MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("\\NunitWeb/MyPage.aspx", ctrl.ResolveClientUrl ("\\NunitWeb/MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("///NunitWeb\\..\\MyPage.aspx", ctrl.ResolveClientUrl ("///NunitWeb\\..\\MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("NunitWeb/MyPage.aspx", ctrl.ResolveClientUrl ("NunitWeb/MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("NunitWeb/../MyPage.aspx", ctrl.ResolveClientUrl ("NunitWeb/../MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("NunitWeb/./MyPage.aspx", ctrl.ResolveClientUrl ("NunitWeb/./MyPage.aspx"), "ResolveClientUrl Failed");
+			Assert.AreEqual ("http://google.com/", ctrl.ResolveClientUrl ("http://google.com/"), "ResolveClientUrl Failed");
+
+			Assert.AreEqual ("MyPage.aspx?param=val&yes=no", ctrl.ResolveClientUrl ("~/MyPage.aspx?param=val&yes=no"), "~/../MyPage.aspx");
+			Assert.AreEqual ("../MyPage.aspx?param=val&yes=no", ctrl.ResolveClientUrl ("~/../MyPage.aspx?param=val&yes=no"), "~/../MyPage.aspx");
 		}
 
 		[Test]