New tests.
[mono.git] / mcs / class / System.Web / System.Web.UI / PageParser.cs
index 8231f0294981c52c6f766421a11b7e1b0d11fb07..54eeae730d32df224021f5f9a5adc7e22a3a2521 100644 (file)
@@ -5,7 +5,7 @@
 //     Gonzalo Paniagua Javier (gonzalo@ximian.com)
 //
 // (C) 2002,2003 Ximian, Inc (http://www.ximian.com)
-// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2005-2010 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -45,7 +45,8 @@ namespace System.Web.UI
        public sealed class PageParser : TemplateControlParser
        {
                PagesEnableSessionState enableSessionState = PagesEnableSessionState.True;
-               bool enableViewStateMac = true;
+               bool enableViewStateMac;
+               bool enableViewStateMacSet;
                bool smartNavigation;
                bool haveTrace;
                bool trace;
@@ -60,8 +61,6 @@ namespace System.Web.UI
                string errorPage;
                bool validateRequest;
                string clientTarget;
-
-#if NET_2_0
                bool async;
                int asyncTimeout = -1;
                string masterPage;
@@ -73,10 +72,8 @@ namespace System.Web.UI
                bool enable_event_validation;
                bool maintainScrollPositionOnPostBack;
                int maxPageStateFieldLength = -1;
-               string pageParserFilter = String.Empty;
                Type previousPageType;
                string previousPageVirtualPath;
-#endif
 
                public PageParser ()
                {
@@ -85,64 +82,50 @@ namespace System.Web.UI
                
                internal PageParser (string virtualPath, string inputFile, HttpContext context)
                {
+                       this.VirtualPath = new VirtualPath (virtualPath);
                        Context = context;
                        BaseVirtualDir = VirtualPathUtility.GetDirectory (virtualPath, false);
                        InputFile = inputFile;
                        SetBaseType (null);
                        AddApplicationAssembly ();
                        LoadConfigDefaults ();
-#if NET_2_0
-                       this.VirtualPath = new VirtualPath (virtualPath);
-#endif
                }
 
-#if NET_2_0
-               internal PageParser (string virtualPath, TextReader reader, HttpContext context)
+               internal PageParser (VirtualPath virtualPath, TextReader reader, HttpContext context)
                        : this (virtualPath, null, reader, context)
                {
                }
                
-               internal PageParser (string virtualPath, string inputFile, TextReader reader, HttpContext context)
+               internal PageParser (VirtualPath virtualPath, string inputFile, TextReader reader, HttpContext context)
                {
+                       this.VirtualPath = virtualPath;
                        Context = context;
-                       BaseVirtualDir = VirtualPathUtility.GetDirectory (virtualPath, false);
+                       BaseVirtualDir = virtualPath.DirectoryNoNormalize;
                        Reader = reader;
-                       if (String.IsNullOrEmpty (inputFile)) {
-                               HttpRequest req = context != null ? context.Request : null;
-                               if (req != null)
-                                       InputFile = req.MapPath (virtualPath);
-                       } else
+                       if (String.IsNullOrEmpty (inputFile))
+                               InputFile = virtualPath.PhysicalPath;
+                       else
                                InputFile = inputFile;
                        SetBaseType (null);
                        AddApplicationAssembly ();
                        LoadConfigDefaults ();
-#if NET_2_0
-                       this.VirtualPath = new VirtualPath (virtualPath);
-#endif
                }
-#endif
 
                internal override void LoadConfigDefaults ()
                {
                        base.LoadConfigDefaults ();
-#if NET_2_0
                        PagesSection ps = PagesConfig;
-#else
-                       PagesConfiguration ps = PagesConfig;
-#endif                 
 
                        notBuffer = !ps.Buffer;
                        enableSessionState = ps.EnableSessionState;
                        enableViewStateMac = ps.EnableViewStateMac;
                        smartNavigation = ps.SmartNavigation;
                        validateRequest = ps.ValidateRequest;
-#if NET_2_0
                        masterPage = ps.MasterPageFile;
                        if (masterPage.Length == 0)
                                masterPage = null;
                        enable_event_validation = ps.EnableEventValidation;
                        maxPageStateFieldLength = ps.MaxPageStateFieldLength;
-                       pageParserFilter = ps.PageParserFilterType;
                        theme = ps.Theme;
                        if (theme.Length == 0)
                                theme = null;
@@ -150,20 +133,16 @@ namespace System.Web.UI
                        if (styleSheetTheme.Length == 0)
                                styleSheetTheme = null;
                        maintainScrollPositionOnPostBack = ps.MaintainScrollPositionOnPostBack;
-#endif
                }
                
-               public static IHttpHandler GetCompiledPageInstance (string virtualPath,
-                                                                   string inputFile, 
-                                                                   HttpContext context)
+               public static IHttpHandler GetCompiledPageInstance (string virtualPath, string inputFile, HttpContext context)
                {
-#if NET_2_0
-                       return BuildManager.CreateInstanceFromVirtualPath (virtualPath, typeof (IHttpHandler)) as IHttpHandler;
-#else
-                       PageParser pp = new PageParser (virtualPath, inputFile, context);
-                       IHttpHandler h = (IHttpHandler) pp.GetCompiledInstance ();
-                       return h;
-#endif
+                       bool isFake = false;
+
+                       if (!String.IsNullOrEmpty (inputFile))
+                               isFake = !inputFile.StartsWith (HttpRuntime.AppDomainAppPath);
+                       
+                       return BuildManager.CreateInstanceFromVirtualPath (new VirtualPath (virtualPath, inputFile, isFake), typeof (IHttpHandler)) as IHttpHandler;
                }
                
                internal override void ProcessMainAttributes (Hashtable atts)
@@ -173,11 +152,11 @@ namespace System.Web.UI
                        // attribute is processed case-insensitive
                        string enabless = GetString (atts, "EnableSessionState", null);
                        if (enabless != null) {
-                               if (String.Compare (enabless, "readonly", true) == 0)
+                               if (String.Compare (enabless, "readonly", true, Helpers.InvariantCulture) == 0)
                                        enableSessionState = PagesEnableSessionState.ReadOnly;
-                               else if (String.Compare (enabless, "true", true) == 0)
+                               else if (String.Compare (enabless, "true", true, Helpers.InvariantCulture) == 0)
                                        enableSessionState = PagesEnableSessionState.True;
-                               else if (String.Compare (enabless, "false", true) == 0)
+                               else if (String.Compare (enabless, "false", true, Helpers.InvariantCulture) == 0)
                                        enableSessionState = PagesEnableSessionState.False;
                                else
                                        ThrowParseException ("Invalid value for enableSessionState: " + enabless);
@@ -252,9 +231,7 @@ namespace System.Web.UI
                                
                                CultureInfo ci = null;
                                try {
-#if NET_2_0
                                        if (!culture.StartsWith ("auto"))
-#endif
                                                ci = new CultureInfo (culture);
                                } catch {
                                        ThrowParseException ("Unsupported Culture: " + culture);
@@ -275,9 +252,7 @@ namespace System.Web.UI
                        if (uiculture != null) {
                                CultureInfo ci = null;
                                try {
-#if NET_2_0
                                        if (!uiculture.StartsWith ("auto"))
-#endif
                                                ci = new CultureInfo (uiculture);
                                } catch {
                                        ThrowParseException ("Unsupported Culture: " + uiculture);
@@ -320,12 +295,11 @@ namespace System.Web.UI
                        clientTarget = GetString (atts, "ClientTarget", null);
                        if (clientTarget != null) {
                                clientTarget = clientTarget.Trim ();
-#if NET_2_0
-                               ClientTargetSection sec = (ClientTargetSection)WebConfigurationManager.GetSection ("system.web/clientTarget");
+                               ClientTargetSection sec = GetConfigSection <ClientTargetSection> ("system.web/clientTarget");
                                ClientTarget ct = null;
                                
                                if ((ct = sec.ClientTargets [clientTarget]) == null)
-                                       clientTarget = clientTarget.ToLower (CultureInfo.InvariantCulture);
+                                       clientTarget = clientTarget.ToLowerInvariant ();
                                
                                if (ct == null && (ct = sec.ClientTargets [clientTarget]) == null) {
                                        ThrowParseException (String.Format (
@@ -334,30 +308,9 @@ namespace System.Web.UI
                                                        clientTarget));
                                }
                                clientTarget = ct.UserAgent;
-#else
-                               NameValueCollection coll;
-                               coll = (NameValueCollection) Context.GetConfig ("system.web/clientTarget");
-                               object ct = null;
-                               
-                               if (coll != null) {
-                                       ct = coll [clientTarget];
-                                       if (ct == null)
-                                               ct = coll [clientTarget.ToLower ()];
-                               }
-                               
-                               if (ct == null) {
-                                       ThrowParseException (String.Format (
-                                                       "ClientTarget '{0}' is an invalid alias. See the " +
-                                                       "documentation for <clientTarget> config. section.",
-                                                       clientTarget));
-                               }
-                               clientTarget = (string) ct;
-#endif
                        }
 
                        notBuffer = !GetBool (atts, "Buffer", true);
-                       
-#if NET_2_0
                        async = GetBool (atts, "Async", false);
                        string asyncTimeoutVal = GetString (atts, "AsyncTimeout", null);
                        if (asyncTimeoutVal != null) {
@@ -382,26 +335,33 @@ namespace System.Web.UI
                        styleSheetTheme = GetString (atts, "StyleSheetTheme", styleSheetTheme);
                        enable_event_validation = GetBool (atts, "EnableEventValidation", enable_event_validation);
                        maintainScrollPositionOnPostBack = GetBool (atts, "MaintainScrollPositionOnPostBack", maintainScrollPositionOnPostBack);
-#endif
+
+                       if (atts.ContainsKey ("EnableViewState")) {
+                               enableViewStateMac = GetBool (atts, "EnableViewStateMac", enableViewStateMac);
+                               enableViewStateMacSet = true;
+                       }
+                       
                        // Ignored by now
-                       GetString (atts, "EnableViewStateMac", null);
                        GetString (atts, "SmartNavigation", null);
 
                        base.ProcessMainAttributes (atts);
                }
                
-#if NET_2_0
                internal override void AddDirective (string directive, Hashtable atts)
-               {                       
+               {
                        bool isMasterType = String.Compare ("MasterType", directive, StringComparison.OrdinalIgnoreCase) == 0;
                        bool isPreviousPageType = isMasterType ? false : String.Compare ("PreviousPageType", directive,
                                                                                         StringComparison.OrdinalIgnoreCase) == 0;
-                       
+
                        string typeName = null;
                        string virtualPath = null;
                        Type type = null;
                        
                        if (isMasterType || isPreviousPageType) {
+                               PageParserFilter pfilter = PageParserFilter;
+                               if (pfilter != null)
+                                       pfilter.PreprocessDirective (directive.ToLowerInvariant (), atts);
+                               
                                typeName = GetString (atts, "TypeName", null);
                                virtualPath = GetString (atts, "VirtualPath", null);
 
@@ -433,7 +393,6 @@ namespace System.Web.UI
                        } else
                                base.AddDirective (directive, atts);
                }
-#endif
                
                static string SuggestCulture (string culture)
                {
@@ -447,12 +406,7 @@ namespace System.Web.UI
 
                public static Type GetCompiledPageType (string virtualPath, string inputFile, HttpContext context)
                {
-#if NET_2_0
                        return BuildManager.GetCompiledType (virtualPath);
-#else
-                       PageParser pp = new PageParser (virtualPath, inputFile, context);
-                       return pp.CompileIntoType ();
-#endif
                }
                
                protected override Type CompileIntoType ()
@@ -471,6 +425,10 @@ namespace System.Web.UI
                internal bool EnableViewStateMac {
                        get { return enableViewStateMac; }
                }
+
+               internal bool EnableViewStateMacSet {
+                       get { return enableViewStateMacSet; }
+               }
                
                internal bool SmartNavigation {
                        get { return smartNavigation; }
@@ -494,15 +452,9 @@ namespace System.Web.UI
                        get { return tracemode; }
                }               
 
-#if NET_2_0
                internal override string DefaultBaseTypeName {
                        get { return PagesConfig.PageBaseType; }
                }
-#else
-               internal override string DefaultBaseTypeName {
-                       get { return "System.Web.UI.Page"; }
-               }
-#endif
                
                internal override string DefaultDirectiveName {
                        get { return "page"; }
@@ -548,7 +500,6 @@ namespace System.Web.UI
                        get { return notBuffer; }
                }
 
-#if NET_2_0
                internal bool Async {
                        get { return async; }
                }
@@ -594,10 +545,6 @@ namespace System.Web.UI
                        get { return maxPageStateFieldLength; }
                }
 
-               internal string PageParserFilterType {
-                       get { return pageParserFilter; }
-               }
-
                internal Type PreviousPageType {
                        get {
                                if (previousPageType == null && !String.IsNullOrEmpty (previousPageVirtualPath)) {
@@ -608,7 +555,6 @@ namespace System.Web.UI
                                return previousPageType;
                        }
                }
-#endif
        }
 }