1 //
2 // System.Web.UI.Page.cs
3 //
4 // Authors:
5 //   Duncan Mak  (duncan@ximian.com)
6 //   Gonzalo Paniagua (gonzalo@ximian.com)
7 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //   Marek Habersack (mhabersack@novell.com)
9 //
10 // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com)
11 // Copyright (C) 2003-2010 Novell, Inc (http://www.novell.com)
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 //
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32 
33 using System;
34 using System.Collections;
35 using System.Collections.Generic;
36 using System.Collections.Specialized;
37 using System.ComponentModel;
38 using System.ComponentModel.Design;
39 using System.ComponentModel.Design.Serialization;
40 using System.Globalization;
41 using System.IO;
42 using System.Security.Permissions;
43 using System.Security.Principal;
44 using System.Text;
45 using System.Threading;
46 using System.Web;
47 using System.Web.Caching;
48 using System.Web.Compilation;
49 using System.Web.Configuration;
50 using System.Web.Hosting;
51 using System.Web.SessionState;
52 using System.Web.Util;
53 using System.Web.UI.Adapters;
54 using System.Web.UI.HtmlControls;
55 using System.Web.UI.WebControls;
56 using System.Reflection;
57 using System.Web.Routing;
58 
59 namespace System.Web.UI
60 {
61 // CAS
62 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
63 [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
64 [DefaultEvent ("Load"), DesignerCategory ("ASPXCodeBehind")]
65 [ToolboxItem (false)]
66 [Designer ("Microsoft.VisualStudio.Web.WebForms.WebFormDesigner, " + Consts.AssemblyMicrosoft_VisualStudio_Web, typeof (IRootDesigner))]
67 [DesignerSerializer ("Microsoft.VisualStudio.Web.WebForms.WebFormCodeDomSerializer, " + Consts.AssemblyMicrosoft_VisualStudio_Web, "System.ComponentModel.Design.Serialization.TypeCodeDomSerializer, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
68 public partial class Page : TemplateControl, IHttpHandler
69 {
70 //	static string machineKeyConfigPath = "system.web/machineKey";
71 	bool _eventValidation = true;
72 	object [] _savedControlState;
73 	bool _doLoadPreviousPage;
74 	string _focusedControlID;
75 	bool _hasEnabledControlArray;
76 	bool _viewState;
77 	bool _viewStateMac;
78 	string _errorPage;
79 	bool is_validated;
80 	bool _smartNavigation;
81 	int _transactionMode;
82 	ValidatorCollection _validators;
83 	bool renderingForm;
84 	string _savedViewState;
85 	List <string> _requiresPostBack;
86 	List <string> _requiresPostBackCopy;
87 	List <IPostBackDataHandler> requiresPostDataChanged;
88 	IPostBackEventHandler requiresRaiseEvent;
89 	IPostBackEventHandler formPostedRequiresRaiseEvent;
90 	NameValueCollection secondPostData;
91 	bool requiresPostBackScript;
92 	bool postBackScriptRendered;
93 	bool requiresFormScriptDeclaration;
94 	bool formScriptDeclarationRendered;
95 	bool handleViewState;
96 	string viewStateUserKey;
97 	NameValueCollection _requestValueCollection;
98 	string clientTarget;
99 	ClientScriptManager scriptManager;
100 	bool allow_load; // true when the Form collection belongs to this page (GetTypeHashCode)
101 	PageStatePersister page_state_persister;
102 	CultureInfo _appCulture;
103 	CultureInfo _appUICulture;
104 
105 	// The initial context
106 	HttpContext _context;
107 
108 	// cached from the initial context
109 	HttpApplicationState _application;
110 	HttpResponse _response;
111 	HttpRequest _request;
112 	Cache _cache;
113 
114 	HttpSessionState _session;
115 
116 	[EditorBrowsable (EditorBrowsableState.Never)]
117 	public const string postEventArgumentID = "__EVENTARGUMENT";
118 
119 	[EditorBrowsable (EditorBrowsableState.Never)]
120 	public const string postEventSourceID = "__EVENTTARGET";
121 
122 	const string ScrollPositionXID = "__SCROLLPOSITIONX";
123 	const string ScrollPositionYID = "__SCROLLPOSITIONY";
124 	const string EnabledControlArrayID = "__enabledControlArray";
125 	internal const string LastFocusID = "__LASTFOCUS";
126 	internal const string CallbackArgumentID = "__CALLBACKPARAM";
127 	internal const string CallbackSourceID = "__CALLBACKID";
128 	internal const string PreviousPageID = "__PREVIOUSPAGE";
129 
130 	int maxPageStateFieldLength = -1;
131 	string uniqueFilePathSuffix;
132 	HtmlHead htmlHeader;
133 
134 	MasterPage masterPage;
135 	string masterPageFile;
136 
137 	Page previousPage;
138 	bool isCrossPagePostBack;
139 	bool isPostBack;
140 	bool isCallback;
141 	List <Control> requireStateControls;
142 	HtmlForm _form;
143 
144 	string _title;
145 	string _theme;
146 	string _styleSheetTheme;
147 	string _metaDescription;
148 	string _metaKeywords;
149 	Control _autoPostBackControl;
150 
151 	bool frameworkInitialized;
152 	Hashtable items;
153 
154 	bool _maintainScrollPositionOnPostBack;
155 
156 	bool asyncMode = false;
157 	TimeSpan asyncTimeout;
158 	const double DefaultAsyncTimeout = 45.0;
159 	List<PageAsyncTask> parallelTasks;
160 	List<PageAsyncTask> serialTasks;
161 
162 	ViewStateEncryptionMode viewStateEncryptionMode;
163 	bool controlRegisteredForViewStateEncryption = false;
164 
165 	#region Constructors
Page()166 	public Page ()
167 	{
168 		scriptManager = new ClientScriptManager (this);
169 		Page = this;
170 		ID = "__Page";
171 		PagesSection ps = WebConfigurationManager.GetSection ("system.web/pages") as PagesSection;
172 		if (ps != null) {
173 			asyncTimeout = ps.AsyncTimeout;
174 			viewStateEncryptionMode = ps.ViewStateEncryptionMode;
175 			_viewState = ps.EnableViewState;
176 			_viewStateMac = ps.EnableViewStateMac;
177 		} else {
178 			asyncTimeout = TimeSpan.FromSeconds (DefaultAsyncTimeout);
179 			viewStateEncryptionMode = ViewStateEncryptionMode.Auto;
180 			_viewState = true;
181 		}
182 		this.ViewStateMode = ViewStateMode.Enabled;
183 	}
184 
185 	#endregion
186 
187 	#region Properties
188 
189 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
190 	[Browsable (false)]
191 	public HttpApplicationState Application {
192 		get { return _application; }
193 	}
194 
195 	[EditorBrowsable (EditorBrowsableState.Never)]
196 	protected bool AspCompatMode {
197 		get { return false; }
198 		set {
199 			// nothing to do
200 		}
201 	}
202 
203 	[EditorBrowsable (EditorBrowsableState.Never)]
204 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
205 	[BrowsableAttribute (false)]
206 	public bool Buffer {
207 		get { return Response.BufferOutput; }
208 		set { Response.BufferOutput = value; }
209 	}
210 
211 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
212 	[Browsable (false)]
213 	public Cache Cache {
214 		get {
215 			if (_cache == null)
216 				throw new HttpException ("Cache is not available.");
217 			return _cache;
218 		}
219 	}
220 
221 	[EditorBrowsableAttribute (EditorBrowsableState.Advanced)]
222 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
223 	[Browsable (false), DefaultValue ("")]
224 	[WebSysDescription ("Value do override the automatic browser detection and force the page to use the specified browser.")]
225 	public string ClientTarget {
226 		get { return (clientTarget == null) ? String.Empty : clientTarget; }
227 		set {
228 			clientTarget = value;
229 			if (value == String.Empty)
230 				clientTarget = null;
231 		}
232 	}
233 
234 	[EditorBrowsable (EditorBrowsableState.Never)]
235 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
236 	[BrowsableAttribute (false)]
237 	public int CodePage {
238 		get { return Response.ContentEncoding.CodePage; }
239 		set { Response.ContentEncoding = Encoding.GetEncoding (value); }
240 	}
241 
242 	[EditorBrowsable (EditorBrowsableState.Never)]
243 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
244 	[BrowsableAttribute (false)]
245 	public string ContentType {
246 		get { return Response.ContentType; }
247 		set { Response.ContentType = value; }
248 	}
249 
250 	protected internal override HttpContext Context {
251 		get {
252 			if (_context == null)
253 				return HttpContext.Current;
254 
255 			return _context;
256 		}
257 	}
258 
259 	[EditorBrowsable (EditorBrowsableState.Advanced)]
260 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
261 	[BrowsableAttribute (false)]
262 	public string Culture {
263 		get { return Thread.CurrentThread.CurrentCulture.Name; }
264 		set { Thread.CurrentThread.CurrentCulture = GetPageCulture (value, Thread.CurrentThread.CurrentCulture); }
265 	}
266 
267 	[EditorBrowsable (EditorBrowsableState.Never)]
268 	[Browsable (false)]
269 	[DefaultValue ("true")]
270 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
271 	public virtual bool EnableEventValidation {
272 		get { return _eventValidation; }
273 		set {
274 			if (IsInited)
275 				throw new InvalidOperationException ("The 'EnableEventValidation' property can be set only in the Page_init, the Page directive or in the <pages> configuration section.");
276 			_eventValidation = value;
277 		}
278 	}
279 
280 	[Browsable (false)]
281 	public override bool EnableViewState {
282 		get { return _viewState; }
283 		set { _viewState = value; }
284 	}
285 
286 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
287 	[BrowsableAttribute (false)]
288 	[EditorBrowsable (EditorBrowsableState.Never)]
289 	public bool EnableViewStateMac {
290 		get { return _viewStateMac; }
291 		set { _viewStateMac = value; }
292 	}
293 
294 	internal bool EnableViewStateMacInternal {
295 		get { return _viewStateMac; }
296 		set { _viewStateMac = value; }
297 	}
298 
299 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
300 	[Browsable (false), DefaultValue ("")]
301 	[WebSysDescription ("The URL of a page used for error redirection.")]
302 	public string ErrorPage {
303 		get { return _errorPage; }
304 		set {
305 			HttpContext ctx = Context;
306 
307 			_errorPage = value;
308 			if (ctx != null)
309 				ctx.ErrorPage = value;
310 		}
311 	}
312 
313 	[Obsolete ("The recommended alternative is HttpResponse.AddFileDependencies. http://go.microsoft.com/fwlink/?linkid=14202")]
314 	[EditorBrowsable (EditorBrowsableState.Never)]
315 	protected ArrayList FileDependencies {
316 		set {
317 			if (Response != null)
318 				Response.AddFileDependencies (value);
319 		}
320 	}
321 
322 	[Browsable (false)]
323 	[EditorBrowsable (EditorBrowsableState.Never)]
324 	public override string ID {
325 		get { return base.ID; }
326 		set { base.ID = value; }
327 	}
328 
329 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
330 	[Browsable (false)]
331 	public bool IsPostBack {
332 		get { return isPostBack; }
333 	}
334 
335 	public bool IsPostBackEventControlRegistered {
336 		get { return requiresRaiseEvent != null; }
337 	}
338 
339 	[EditorBrowsable (EditorBrowsableState.Never), Browsable (false)]
340 	public bool IsReusable {
341 		get { return false; }
342 	}
343 
344 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
345 	[Browsable (false)]
346 	public bool IsValid {
347 		get {
348 			if (!is_validated)
349 				throw new HttpException (Locale.GetText ("Page.IsValid cannot be called before validation has taken place. It should be queried in the event handler for a control that has CausesValidation=True and initiated the postback, or after a call to Page.Validate."));
350 
351 			foreach (IValidator val in Validators)
352 				if (!val.IsValid)
353 					return false;
354 			return true;
355 		}
356 	}
357 
358 	[Browsable (false)]
359 	public IDictionary Items {
360 		get {
361 			if (items == null)
362 				items = new Hashtable ();
363 			return items;
364 		}
365 	}
366 
367 	[EditorBrowsable (EditorBrowsableState.Never)]
368 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
369 	[BrowsableAttribute (false)]
370 	public int LCID {
371 		get { return Thread.CurrentThread.CurrentCulture.LCID; }
372 		set { Thread.CurrentThread.CurrentCulture = new CultureInfo (value); }
373 	}
374 
375 	[Browsable (false)]
376 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
377 	public bool MaintainScrollPositionOnPostBack {
378 		get { return _maintainScrollPositionOnPostBack; }
379 		set { _maintainScrollPositionOnPostBack = value; }
380 	}
381 
382 	public PageAdapter PageAdapter {
383 		get {
384 			return Adapter as PageAdapter;
385 		}
386 	}
387 
388 	string _validationStartupScript;
389 	string _validationOnSubmitStatement;
390 	string _validationInitializeScript;
391 	string _webFormScriptReference;
392 
393 	internal string WebFormScriptReference {
394 		get {
395 			if (_webFormScriptReference == null)
396 				_webFormScriptReference = IsMultiForm ? theForm : "window";
397 			return _webFormScriptReference;
398 		}
399 	}
400 
401 	internal string ValidationStartupScript {
402 		get {
403 			if (_validationStartupScript == null) {
404 				_validationStartupScript =
405 @"
406 " + WebFormScriptReference + @".Page_ValidationActive = false;
407 " + WebFormScriptReference + @".ValidatorOnLoad();
408 " + WebFormScriptReference + @".ValidatorOnSubmit = function () {
409 	if (this.Page_ValidationActive) {
410 		return this.ValidatorCommonOnSubmit();
411 	}
412 	return true;
413 };
414 ";
415 			}
416 			return _validationStartupScript;
417 		}
418 	}
419 
420 	internal string ValidationOnSubmitStatement {
421 		get {
422 			if (_validationOnSubmitStatement == null)
423 				_validationOnSubmitStatement = "if (!" + WebFormScriptReference + ".ValidatorOnSubmit()) return false;";
424 			return _validationOnSubmitStatement;
425 		}
426 	}
427 
428 	internal string ValidationInitializeScript {
429 		get {
430 			if (_validationInitializeScript == null)
431 				_validationInitializeScript = "WebFormValidation_Initialize(" + WebFormScriptReference + ");";
432 			return _validationInitializeScript;
433 		}
434 	}
435 
436 	internal IScriptManager ScriptManager {
437 		get { return (IScriptManager) Items [typeof (IScriptManager)]; }
438 	}
439 	internal string theForm {
440 		get {
441 			return "theForm";
442 		}
443 	}
444 
445 	internal bool IsMultiForm {
446 		get { return false; }
447 	}
448 
449 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
450 	[Browsable (false)]
451 	public HttpRequest Request {
452 		get {
453 			if (_request == null)
454 				throw new HttpException("Request is not available in this context.");
455 			return RequestInternal;
456 		}
457 	}
458 
459 	internal HttpRequest RequestInternal {
460 		get { return _request; }
461 	}
462 
463 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
464 	[Browsable (false)]
465 	public HttpResponse Response {
466 		get {
467 			if (_response == null)
468 				throw new HttpException ("Response is not available in this context.");
469 			return _response;
470 		}
471 	}
472 
473 	[EditorBrowsable (EditorBrowsableState.Never)]
474 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
475 	[BrowsableAttribute (false)]
476 	public string ResponseEncoding {
477 		get { return Response.ContentEncoding.WebName; }
478 		set { Response.ContentEncoding = Encoding.GetEncoding (value); }
479 	}
480 
481 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
482 	[Browsable (false)]
483 	public HttpServerUtility Server {
484 		get { return Context.Server; }
485 	}
486 
487 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
488 	[Browsable (false)]
489 	public virtual HttpSessionState Session {
490 		get {
491 			if (_session != null)
492 				return _session;
493 
494 			try {
495 				_session = Context.Session;
496 			} catch {
497 				// ignore, should not throw
498 			}
499 
500 			if (_session == null)
501 				throw new HttpException ("Session state can only be used " +
502 						"when enableSessionState is set to true, either " +
503 						"in a configuration file or in the Page directive.");
504 
505 			return _session;
506 		}
507 	}
508 
509 	[Filterable (false)]
510 	[Obsolete ("The recommended alternative is Page.SetFocus and Page.MaintainScrollPositionOnPostBack. http://go.microsoft.com/fwlink/?linkid=14202")]
511 	[Browsable (false)]
512 	public bool SmartNavigation {
513 		get { return _smartNavigation; }
514 		set { _smartNavigation = value; }
515 	}
516 
517 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
518 	[Filterable (false)]
519 	[Browsable (false)]
520 	public virtual string StyleSheetTheme {
521 		get { return _styleSheetTheme; }
522 		set { _styleSheetTheme = value; }
523 	}
524 
525 	[Browsable (false)]
526 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
527 	public virtual string Theme {
528 		get { return _theme; }
529 		set { _theme = value; }
530 	}
531 
InitializeStyleSheet()532 	void InitializeStyleSheet ()
533 	{
534 		if (_styleSheetTheme == null) {
535 			PagesSection ps = WebConfigurationManager.GetSection ("system.web/pages") as PagesSection;
536 			if (ps != null)
537 				_styleSheetTheme = ps.StyleSheetTheme;
538 		}
539 
540 		if (!String.IsNullOrEmpty (_styleSheetTheme)) {
541 			string virtualPath = "~/App_Themes/" + _styleSheetTheme;
542 			_styleSheetPageTheme = BuildManager.CreateInstanceFromVirtualPath (virtualPath, typeof (PageTheme)) as PageTheme;
543 		}
544 	}
545 
InitializeTheme()546 	void InitializeTheme ()
547 	{
548 		if (_theme == null) {
549 			PagesSection ps = WebConfigurationManager.GetSection ("system.web/pages") as PagesSection;
550 			if (ps != null)
551 				_theme = ps.Theme;
552 		}
553 
554 		if (!String.IsNullOrEmpty (_theme)) {
555 			string virtualPath = "~/App_Themes/" + _theme;
556 			_pageTheme = BuildManager.CreateInstanceFromVirtualPath (virtualPath, typeof (PageTheme)) as PageTheme;
557 			if (_pageTheme != null)
558 				_pageTheme.SetPage (this);
559 		}
560 	}
561 	public Control AutoPostBackControl {
562 		get { return _autoPostBackControl; }
563 		set { _autoPostBackControl = value; }
564 	}
565 
566 	[BrowsableAttribute(false)]
567 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
568 	public RouteData RouteData {
569 		get {
570 			if (_request == null)
571 				return null;
572 
573 			RequestContext reqctx = _request.RequestContext;
574 			if (reqctx == null)
575 				return null;
576 
577 			return reqctx.RouteData;
578 		}
579 	}
580 
581 	[Bindable (true)]
582 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
583 	[Localizable (true)]
584 	public string MetaDescription {
585 		get {
586 			if (_metaDescription == null) {
587 				if (htmlHeader == null) {
588 					if (frameworkInitialized)
589 						throw new InvalidOperationException ("A server-side head element is required to set this property.");
590 					return String.Empty;
591 				} else
592 					return htmlHeader.Description;
593 			}
594 
595 			return _metaDescription;
596 		}
597 
598 		set {
599 			if (htmlHeader == null) {
600 				if (frameworkInitialized)
601 					throw new InvalidOperationException ("A server-side head element is required to set this property.");
602 				_metaDescription = value;
603 			} else
604 				htmlHeader.Description = value;
605 		}
606 	}
607 
608 	[Bindable (true)]
609 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
610 	[Localizable (true)]
611 	public string MetaKeywords {
612 		get {
613 			if (_metaKeywords == null) {
614 				if (htmlHeader == null) {
615 					if (frameworkInitialized)
616 						throw new InvalidOperationException ("A server-side head element is required to set this property.");
617 					return String.Empty;
618 				} else
619 					return htmlHeader.Keywords;
620 			}
621 
622 			return _metaDescription;
623 		}
624 
625 		set {
626 			if (htmlHeader == null) {
627 				if (frameworkInitialized)
628 					throw new InvalidOperationException ("A server-side head element is required to set this property.");
629 				_metaKeywords = value;
630 			} else
631 				htmlHeader.Keywords = value;
632 		}
633 	}
634 	[Localizable (true)]
635 	[Bindable (true)]
636 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
637 	public string Title {
638 		get {
639 			if (_title == null) {
640 				if (htmlHeader != null && htmlHeader.Title != null)
641 					return htmlHeader.Title;
642 				return String.Empty;
643 			}
644 			return _title;
645 		}
646 
647 		set {
648 			if (htmlHeader != null)
649 				htmlHeader.Title = value;
650 			else
651 				_title = value;
652 		}
653 	}
654 
655 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
656 	[Browsable (false)]
657 	public TraceContext Trace {
658 		get { return Context.Trace; }
659 	}
660 
661 	[EditorBrowsable (EditorBrowsableState.Never)]
662 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
663 	[BrowsableAttribute (false)]
664 	public bool TraceEnabled {
665 		get { return Trace.IsEnabled; }
666 		set { Trace.IsEnabled = value; }
667 	}
668 
669 	[EditorBrowsable (EditorBrowsableState.Never)]
670 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
671 	[BrowsableAttribute (false)]
672 	public TraceMode TraceModeValue {
673 		get { return Trace.TraceMode; }
674 		set { Trace.TraceMode = value; }
675 	}
676 
677 	[EditorBrowsable (EditorBrowsableState.Never)]
678 	protected int TransactionMode {
679 		get { return _transactionMode; }
680 		set { _transactionMode = value; }
681 	}
682 
683 	[EditorBrowsable (EditorBrowsableState.Advanced)]
684 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
685 	[BrowsableAttribute (false)]
686 	public string UICulture {
687 		get { return Thread.CurrentThread.CurrentUICulture.Name; }
688 		set { Thread.CurrentThread.CurrentUICulture = GetPageCulture (value, Thread.CurrentThread.CurrentUICulture); }
689 	}
690 
691 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
692 	[Browsable (false)]
693 	public IPrincipal User {
694 		get { return Context.User; }
695 	}
696 
697 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
698 	[Browsable (false)]
699 	public ValidatorCollection Validators {
700 		get {
701 			if (_validators == null)
702 				_validators = new ValidatorCollection ();
703 			return _validators;
704 		}
705 	}
706 
707 	[MonoTODO ("Use this when encrypting/decrypting ViewState")]
708 	[Browsable (false)]
709 	public string ViewStateUserKey {
710 		get { return viewStateUserKey; }
711 		set { viewStateUserKey = value; }
712 	}
713 
714 	[Browsable (false)]
715 	public override bool Visible {
716 		get { return base.Visible; }
717 		set { base.Visible = value; }
718 	}
719 
720 	#endregion
721 
722 	#region Methods
723 
GetPageCulture(string culture, CultureInfo deflt)724 	CultureInfo GetPageCulture (string culture, CultureInfo deflt)
725 	{
726 		if (culture == null)
727 			return deflt;
728 		CultureInfo ret = null;
729 		if (culture.StartsWith ("auto", StringComparison.InvariantCultureIgnoreCase)) {
730 			string[] languages = Request.UserLanguages;
731 			try {
732 				if (languages != null && languages.Length > 0)
733 					ret = CultureInfo.CreateSpecificCulture (languages[0]);
734 			} catch {
735 			}
736 
737 			if (ret == null)
738 				ret = deflt;
739 		} else
740 			ret = CultureInfo.CreateSpecificCulture (culture);
741 
742 		return ret;
743 	}
744 
745 	[EditorBrowsable (EditorBrowsableState.Never)]
AspCompatBeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)746 	protected IAsyncResult AspCompatBeginProcessRequest (HttpContext context,
747 							     AsyncCallback cb,
748 							     object extraData)
749 	{
750 		throw new NotImplementedException ();
751 	}
752 
753 	[EditorBrowsable (EditorBrowsableState.Never)]
754 	[MonoNotSupported ("Mono does not support classic ASP compatibility mode.")]
AspCompatEndProcessRequest(IAsyncResult result)755 	protected void AspCompatEndProcessRequest (IAsyncResult result)
756 	{
757 		throw new NotImplementedException ();
758 	}
759 
760 	[EditorBrowsable (EditorBrowsableState.Advanced)]
CreateHtmlTextWriter(TextWriter tw)761 	protected virtual HtmlTextWriter CreateHtmlTextWriter (TextWriter tw)
762 	{
763 		if (Request.BrowserMightHaveSpecialWriter)
764 			return Request.Browser.CreateHtmlTextWriter(tw);
765 		else
766 			return new HtmlTextWriter (tw);
767 	}
768 
769 	[EditorBrowsable (EditorBrowsableState.Never)]
DesignerInitialize()770 	public void DesignerInitialize ()
771 	{
772 		InitRecursive (null);
773 	}
774 
775 	[EditorBrowsable (EditorBrowsableState.Advanced)]
DeterminePostBackMode()776 	protected internal virtual NameValueCollection DeterminePostBackMode ()
777 	{
778 		// if request was transfered from other page such Transfer
779 		if (_context.IsProcessingInclude)
780 			return null;
781 
782 		HttpRequest req = Request;
783 		if (req == null)
784 			return null;
785 
786 		NameValueCollection coll = null;
787 		if (0 == String.Compare (Request.HttpMethod, "POST", true, Helpers.InvariantCulture))
788 			coll = req.Form;
789 		else {
790 			string query = Request.QueryStringRaw;
791 			if (query == null || query.Length == 0)
792 				return null;
793 
794 			coll = req.QueryString;
795 		}
796 
797 		WebROCollection c = (WebROCollection) coll;
798 		allow_load = !c.GotID;
799 		if (allow_load)
800 			c.ID = GetTypeHashCode ();
801 		else
802 			allow_load = (c.ID == GetTypeHashCode ());
803 
804 		if (coll != null && coll ["__VIEWSTATE"] == null && coll ["__EVENTTARGET"] == null)
805 			return null;
806 		return coll;
807 	}
808 
FindControl(string id)809 	public override Control FindControl (string id) {
810 		if (id == ID)
811 			return this;
812 		else
813 			return base.FindControl (id);
814 	}
815 
FindControl(string id, bool decode)816 	Control FindControl (string id, bool decode) {
817 		return FindControl (id);
818 	}
819 
820 	[Obsolete ("The recommended alternative is ClientScript.GetPostBackEventReference. http://go.microsoft.com/fwlink/?linkid=14202")]
821 	[EditorBrowsable (EditorBrowsableState.Advanced)]
GetPostBackClientEvent(Control control, string argument)822 	public string GetPostBackClientEvent (Control control, string argument)
823 	{
824 		return scriptManager.GetPostBackEventReference (control, argument);
825 	}
826 
827 	[Obsolete ("The recommended alternative is ClientScript.GetPostBackClientHyperlink. http://go.microsoft.com/fwlink/?linkid=14202")]
828 	[EditorBrowsable (EditorBrowsableState.Advanced)]
GetPostBackClientHyperlink(Control control, string argument)829 	public string GetPostBackClientHyperlink (Control control, string argument)
830 	{
831 		return scriptManager.GetPostBackClientHyperlink (control, argument);
832 	}
833 
834 	[Obsolete ("The recommended alternative is ClientScript.GetPostBackEventReference. http://go.microsoft.com/fwlink/?linkid=14202")]
835 	[EditorBrowsable (EditorBrowsableState.Advanced)]
GetPostBackEventReference(Control control)836 	public string GetPostBackEventReference (Control control)
837 	{
838 		return scriptManager.GetPostBackEventReference (control, String.Empty);
839 	}
840 
841 	[Obsolete ("The recommended alternative is ClientScript.GetPostBackEventReference. http://go.microsoft.com/fwlink/?linkid=14202")]
842 	[EditorBrowsable (EditorBrowsableState.Advanced)]
GetPostBackEventReference(Control control, string argument)843 	public string GetPostBackEventReference (Control control, string argument)
844 	{
845 		return scriptManager.GetPostBackEventReference (control, argument);
846 	}
847 
RequiresFormScriptDeclaration()848 	internal void RequiresFormScriptDeclaration ()
849 	{
850 		requiresFormScriptDeclaration = true;
851 	}
852 
RequiresPostBackScript()853 	internal void RequiresPostBackScript ()
854 	{
855 		if (requiresPostBackScript)
856 			return;
857 		ClientScript.RegisterHiddenField (postEventSourceID, String.Empty);
858 		ClientScript.RegisterHiddenField (postEventArgumentID, String.Empty);
859 		requiresPostBackScript = true;
860 		RequiresFormScriptDeclaration ();
861 	}
862 
863 	[EditorBrowsable (EditorBrowsableState.Never)]
GetTypeHashCode()864 	public virtual int GetTypeHashCode ()
865 	{
866 		return 0;
867 	}
868 
869 	[MonoTODO ("The following properties of OutputCacheParameters are silently ignored: CacheProfile, SqlDependency")]
870 	[EditorBrowsable (EditorBrowsableState.Never)]
InitOutputCache(OutputCacheParameters cacheSettings)871 	protected internal virtual void InitOutputCache(OutputCacheParameters cacheSettings)
872 	{
873 		if (cacheSettings.Enabled) {
874 			InitOutputCache(cacheSettings.Duration,
875 					cacheSettings.VaryByContentEncoding,
876 					cacheSettings.VaryByHeader,
877 					cacheSettings.VaryByCustom,
878 					cacheSettings.Location,
879 					cacheSettings.VaryByParam);
880 
881 			HttpResponse response = Response;
882 			HttpCachePolicy cache = response != null ? response.Cache : null;
883 			if (cache != null && cacheSettings.NoStore)
884 				cache.SetNoStore ();
885 		}
886 	}
887 
888 	[MonoTODO ("varyByContentEncoding is not currently used")]
889 	[EditorBrowsable (EditorBrowsableState.Never)]
InitOutputCache(int duration, string varyByContentEncoding, string varyByHeader, string varyByCustom, OutputCacheLocation location, string varyByParam)890 	protected virtual void InitOutputCache(int duration,
891 					       string varyByContentEncoding,
892 					       string varyByHeader,
893 					       string varyByCustom,
894 					       OutputCacheLocation location,
895 					       string varyByParam)
896 	{
897 		if (duration <= 0)
898 			// No need to do anything, cache will be ineffective anyway
899 			return;
900 
901 		HttpResponse response = Response;
902 		HttpCachePolicy cache = response.Cache;
903 		bool set_vary = false;
904 		HttpContext ctx = Context;
905 		DateTime timestamp = ctx != null ? ctx.Timestamp : DateTime.Now;
906 
907 		switch (location) {
908 			case OutputCacheLocation.Any:
909 				cache.SetCacheability (HttpCacheability.Public);
910 				cache.SetMaxAge (new TimeSpan (0, 0, duration));
911 				cache.SetLastModified (timestamp);
912 				set_vary = true;
913 				break;
914 			case OutputCacheLocation.Client:
915 				cache.SetCacheability (HttpCacheability.Private);
916 				cache.SetMaxAge (new TimeSpan (0, 0, duration));
917 				cache.SetLastModified (timestamp);
918 				break;
919 			case OutputCacheLocation.Downstream:
920 				cache.SetCacheability (HttpCacheability.Public);
921 				cache.SetMaxAge (new TimeSpan (0, 0, duration));
922 				cache.SetLastModified (timestamp);
923 				break;
924 			case OutputCacheLocation.Server:
925 				cache.SetCacheability (HttpCacheability.Server);
926 				set_vary = true;
927 				break;
928 			case OutputCacheLocation.None:
929 				break;
930 		}
931 
932 		if (set_vary) {
933 			if (varyByCustom != null)
934 				cache.SetVaryByCustom (varyByCustom);
935 
936 			if (varyByParam != null && varyByParam.Length > 0) {
937 				string[] prms = varyByParam.Split (';');
938 				foreach (string p in prms)
939 					cache.VaryByParams [p.Trim ()] = true;
940 				cache.VaryByParams.IgnoreParams = false;
941 			} else {
942 				cache.VaryByParams.IgnoreParams = true;
943 			}
944 
945 			if (varyByHeader != null && varyByHeader.Length > 0) {
946 				string[] hdrs = varyByHeader.Split (';');
947 				foreach (string h in hdrs)
948 					cache.VaryByHeaders [h.Trim ()] = true;
949 			}
950 
951 			if (PageAdapter != null) {
952 				if (PageAdapter.CacheVaryByParams != null) {
953 					foreach (string p in PageAdapter.CacheVaryByParams)
954 						cache.VaryByParams [p] = true;
955 				}
956 				if (PageAdapter.CacheVaryByHeaders != null) {
957 					foreach (string h in PageAdapter.CacheVaryByHeaders)
958 						cache.VaryByHeaders [h] = true;
959 				}
960 			}
961 		}
962 
963 		response.IsCached = true;
964 		cache.Duration = duration;
965 		cache.SetExpires (timestamp.AddSeconds (duration));
966 	}
967 
968 
969 	[EditorBrowsable (EditorBrowsableState.Never)]
InitOutputCache(int duration, string varyByHeader, string varyByCustom, OutputCacheLocation location, string varyByParam)970 	protected virtual void InitOutputCache (int duration,
971 						string varyByHeader,
972 						string varyByCustom,
973 						OutputCacheLocation location,
974 						string varyByParam)
975 	{
976 		InitOutputCache (duration, null, varyByHeader, varyByCustom, location, varyByParam);
977 	}
978 
979 	[Obsolete ("The recommended alternative is ClientScript.IsClientScriptBlockRegistered(string key). http://go.microsoft.com/fwlink/?linkid=14202")]
IsClientScriptBlockRegistered(string key)980 	public bool IsClientScriptBlockRegistered (string key)
981 	{
982 		return scriptManager.IsClientScriptBlockRegistered (key);
983 	}
984 
985 	[Obsolete ("The recommended alternative is ClientScript.IsStartupScriptRegistered(string key). http://go.microsoft.com/fwlink/?linkid=14202")]
IsStartupScriptRegistered(string key)986 	public bool IsStartupScriptRegistered (string key)
987 	{
988 		return scriptManager.IsStartupScriptRegistered (key);
989 	}
990 
MapPath(string virtualPath)991 	public string MapPath (string virtualPath)
992 	{
993 		return Request.MapPath (virtualPath);
994 	}
995 
Render(HtmlTextWriter writer)996 	protected internal override void Render (HtmlTextWriter writer)
997 	{
998 		if (MaintainScrollPositionOnPostBack) {
999 			ClientScript.RegisterWebFormClientScript ();
1000 
1001 			ClientScript.RegisterHiddenField (ScrollPositionXID, Request [ScrollPositionXID]);
1002 			ClientScript.RegisterHiddenField (ScrollPositionYID, Request [ScrollPositionYID]);
1003 
1004 			StringBuilder script = new StringBuilder ();
1005 			script.AppendLine ("<script type=\"text/javascript\">");
1006 			script.AppendLine (ClientScriptManager.SCRIPT_BLOCK_START);
1007 			script.AppendLine (theForm + ".oldSubmit = " + theForm + ".submit;");
1008 			script.AppendLine (theForm + ".submit = function () { " + WebFormScriptReference + ".WebForm_SaveScrollPositionSubmit(); }");
1009 			script.AppendLine (theForm + ".oldOnSubmit = " + theForm + ".onsubmit;");
1010 			script.AppendLine (theForm + ".onsubmit = function () { " + WebFormScriptReference + ".WebForm_SaveScrollPositionOnSubmit(); }");
1011 			if (IsPostBack) {
1012 				script.AppendLine (theForm + ".oldOnLoad = window.onload;");
1013 				script.AppendLine ("window.onload = function () { " + WebFormScriptReference + ".WebForm_RestoreScrollPosition (); };");
1014 			}
1015 			script.AppendLine (ClientScriptManager.SCRIPT_BLOCK_END);
1016 			script.AppendLine ("</script>");
1017 
1018 			ClientScript.RegisterStartupScript (typeof (Page), "MaintainScrollPositionOnPostBackStartup", script.ToString());
1019 		}
1020 		base.Render (writer);
1021 	}
1022 
RenderPostBackScript(HtmlTextWriter writer, string formUniqueID)1023 	void RenderPostBackScript (HtmlTextWriter writer, string formUniqueID)
1024 	{
1025 		writer.WriteLine ();
1026 		ClientScriptManager.WriteBeginScriptBlock (writer);
1027 		RenderClientScriptFormDeclaration (writer, formUniqueID);
1028 		writer.WriteLine (WebFormScriptReference + "._form = " + theForm + ";");
1029 		writer.WriteLine (WebFormScriptReference + ".__doPostBack = function (eventTarget, eventArgument) {");
1030 		writer.WriteLine ("\tif(" + theForm + ".onsubmit && " + theForm + ".onsubmit() == false) return;");
1031 		writer.WriteLine ("\t" + theForm + "." + postEventSourceID + ".value = eventTarget;");
1032 		writer.WriteLine ("\t" + theForm + "." + postEventArgumentID + ".value = eventArgument;");
1033 		writer.WriteLine ("\t" + theForm + ".submit();");
1034 		writer.WriteLine ("}");
1035 		ClientScriptManager.WriteEndScriptBlock (writer);
1036 	}
1037 
RenderClientScriptFormDeclaration(HtmlTextWriter writer, string formUniqueID)1038 	void RenderClientScriptFormDeclaration (HtmlTextWriter writer, string formUniqueID)
1039 	{
1040 		if (formScriptDeclarationRendered)
1041 			return;
1042 
1043 		if (PageAdapter != null) {
1044  			writer.WriteLine ("\tvar {0} = {1};\n", theForm, PageAdapter.GetPostBackFormReference(formUniqueID));
1045 		} else {
1046 			writer.WriteLine ("\tvar {0};\n\tif (document.getElementById) {{ {0} = document.getElementById ('{1}'); }}", theForm, formUniqueID);
1047 			writer.WriteLine ("\telse {{ {0} = document.{1}; }}", theForm, formUniqueID);
1048 		}
1049 		formScriptDeclarationRendered = true;
1050 	}
1051 
OnFormRender(HtmlTextWriter writer, string formUniqueID)1052 	internal void OnFormRender (HtmlTextWriter writer, string formUniqueID)
1053 	{
1054 		if (renderingForm)
1055 			throw new HttpException ("Only 1 HtmlForm is allowed per page.");
1056 
1057 		renderingForm = true;
1058 		writer.WriteLine ();
1059 
1060 		if (requiresFormScriptDeclaration || (scriptManager != null && scriptManager.ScriptsPresent) || PageAdapter != null) {
1061 			ClientScriptManager.WriteBeginScriptBlock (writer);
1062 			RenderClientScriptFormDeclaration (writer, formUniqueID);
1063 			ClientScriptManager.WriteEndScriptBlock (writer);
1064 		}
1065 
1066 		if (handleViewState)
1067 			scriptManager.RegisterHiddenField ("__VIEWSTATE", _savedViewState);
1068 
1069 		scriptManager.WriteHiddenFields (writer);
1070 		if (requiresPostBackScript) {
1071 			RenderPostBackScript (writer, formUniqueID);
1072 			postBackScriptRendered = true;
1073 		}
1074 
1075 		scriptManager.WriteWebFormClientScript (writer);
1076 		scriptManager.WriteClientScriptBlocks (writer);
1077 	}
1078 
GetFormatter()1079 	internal IStateFormatter GetFormatter ()
1080 	{
1081 		return new ObjectStateFormatter (this);
1082 	}
1083 
GetSavedViewState()1084 	internal string GetSavedViewState ()
1085 	{
1086 		return _savedViewState;
1087 	}
1088 
OnFormPostRender(HtmlTextWriter writer, string formUniqueID)1089 	internal void OnFormPostRender (HtmlTextWriter writer, string formUniqueID)
1090 	{
1091 		scriptManager.SaveEventValidationState ();
1092 		scriptManager.WriteExpandoAttributes (writer);
1093 		scriptManager.WriteHiddenFields (writer);
1094 		if (!postBackScriptRendered && requiresPostBackScript)
1095 			RenderPostBackScript (writer, formUniqueID);
1096 		scriptManager.WriteWebFormClientScript (writer);
1097 		scriptManager.WriteArrayDeclares (writer);
1098 		scriptManager.WriteStartupScriptBlocks (writer);
1099 		renderingForm = false;
1100 		postBackScriptRendered = false;
1101 	}
1102 
ProcessPostData(NameValueCollection data, bool second)1103 	void ProcessPostData (NameValueCollection data, bool second)
1104 	{
1105 		NameValueCollection requestValues = _requestValueCollection == null ? new NameValueCollection (SecureHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant) : _requestValueCollection;
1106 
1107 		if (data != null && data.Count > 0) {
1108 			var used = new Dictionary <string, string> (StringComparer.Ordinal);
1109 			foreach (string id in data.AllKeys) {
1110 				if (id == "__VIEWSTATE" || id == postEventSourceID || id == postEventArgumentID || id == ClientScriptManager.EventStateFieldName)
1111 					continue;
1112 
1113 				if (used.ContainsKey (id))
1114 					continue;
1115 
1116 				used.Add (id, id);
1117 
1118 				Control ctrl = FindControl (id, true);
1119 				if (ctrl != null) {
1120 					IPostBackDataHandler pbdh = ctrl as IPostBackDataHandler;
1121 					IPostBackEventHandler pbeh = ctrl as IPostBackEventHandler;
1122 
1123 					if (pbdh == null) {
1124 						if (pbeh != null)
1125 							formPostedRequiresRaiseEvent = pbeh;
1126 						continue;
1127 					}
1128 
1129 					if (pbdh.LoadPostData (id, requestValues) == true) {
1130 						if (requiresPostDataChanged == null)
1131 							requiresPostDataChanged = new List <IPostBackDataHandler> ();
1132 						requiresPostDataChanged.Add (pbdh);
1133 					}
1134 
1135 					if (_requiresPostBackCopy != null)
1136 						_requiresPostBackCopy.Remove (id);
1137 
1138 				} else if (!second) {
1139 					if (secondPostData == null)
1140 						secondPostData = new NameValueCollection (SecureHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant);
1141 					secondPostData.Add (id, data [id]);
1142 				}
1143 			}
1144 		}
1145 
1146 		List <string> list1 = null;
1147 		if (_requiresPostBackCopy != null && _requiresPostBackCopy.Count > 0) {
1148 			string [] handlers = (string []) _requiresPostBackCopy.ToArray ();
1149 			foreach (string id in handlers) {
1150 				IPostBackDataHandler pbdh = FindControl (id, true) as IPostBackDataHandler;
1151 				if (pbdh != null) {
1152 					_requiresPostBackCopy.Remove (id);
1153 					if (pbdh.LoadPostData (id, requestValues)) {
1154 						if (requiresPostDataChanged == null)
1155 							requiresPostDataChanged = new List <IPostBackDataHandler> ();
1156 
1157 						requiresPostDataChanged.Add (pbdh);
1158 					}
1159 				} else if (!second) {
1160 					if (list1 == null)
1161 						list1 = new List <string> ();
1162 					list1.Add (id);
1163 				}
1164 			}
1165 		}
1166 		_requiresPostBackCopy = second ? null : list1;
1167 		if (second)
1168 			secondPostData = null;
1169 	}
1170 
1171 	[EditorBrowsable (EditorBrowsableState.Never)]
ProcessRequest(HttpContext context)1172 	public virtual void ProcessRequest (HttpContext context)
1173 	{
1174 		SetContext (context);
1175 
1176 		if (clientTarget != null)
1177 			Request.ClientTarget = clientTarget;
1178 
1179 		WireupAutomaticEvents ();
1180 		//-- Control execution lifecycle in the docs
1181 
1182 		// Save culture information because it can be modified in FrameworkInitialize()
1183 		_appCulture = Thread.CurrentThread.CurrentCulture;
1184 		_appUICulture = Thread.CurrentThread.CurrentUICulture;
1185 		FrameworkInitialize ();
1186 		frameworkInitialized = true;
1187 		context.ErrorPage = _errorPage;
1188 
1189 		try {
1190 			InternalProcessRequest ();
1191 		} catch (ThreadAbortException taex) {
1192 			if (FlagEnd.Value == taex.ExceptionState)
1193 				Thread.ResetAbort ();
1194 			else
1195 				throw;
1196 		} catch (Exception e) {
1197 			ProcessException (e);
1198 		} finally {
1199 			ProcessUnload ();
1200 		}
1201 	}
1202 
ProcessException(Exception e)1203 	void ProcessException (Exception e) {
1204 		// We want to remove that error, as we're rethrowing to stop
1205 		// further processing.
1206 		Trace.Warn ("Unhandled Exception", e.ToString (), e);
1207 		_context.AddError (e); // OnError might access LastError
1208 		OnError (EventArgs.Empty);
1209 		if (_context.HasError (e)) {
1210 			_context.ClearError (e);
1211 			throw new HttpUnhandledException (null, e);
1212 		}
1213 	}
1214 
ProcessUnload()1215 	void ProcessUnload () {
1216 			try {
1217 				RenderTrace ();
1218 				UnloadRecursive (true);
1219 			} catch {}
1220 			if (Thread.CurrentThread.CurrentCulture.Equals (_appCulture) == false)
1221 				Thread.CurrentThread.CurrentCulture = _appCulture;
1222 
1223 			if (Thread.CurrentThread.CurrentUICulture.Equals (_appUICulture) == false)
1224 				Thread.CurrentThread.CurrentUICulture = _appUICulture;
1225 
1226 			_appCulture = null;
1227 			_appUICulture = null;
1228 	}
1229 
ProcessRequestDelegate(HttpContext context)1230 	delegate void ProcessRequestDelegate (HttpContext context);
1231 
1232 	sealed class DummyAsyncResult : IAsyncResult
1233 	{
1234 		readonly object state;
1235 		readonly WaitHandle asyncWaitHandle;
1236 		readonly bool completedSynchronously;
1237 		readonly bool isCompleted;
1238 
DummyAsyncResult(bool isCompleted, bool completedSynchronously, object state)1239 		public DummyAsyncResult (bool isCompleted, bool completedSynchronously, object state)
1240 		{
1241 			this.isCompleted = isCompleted;
1242 			this.completedSynchronously = completedSynchronously;
1243 			this.state = state;
1244 			if (isCompleted) {
1245 				asyncWaitHandle = new ManualResetEvent (true);
1246 			}
1247 			else {
1248 				asyncWaitHandle = new ManualResetEvent (false);
1249 			}
1250 		}
1251 
1252 		#region IAsyncResult Members
1253 
1254 		public object AsyncState {
1255 			get { return state; }
1256 		}
1257 
1258 		public WaitHandle AsyncWaitHandle {
1259 			get { return asyncWaitHandle; }
1260 		}
1261 
1262 		public bool CompletedSynchronously {
1263 			get { return completedSynchronously; }
1264 		}
1265 
1266 		public bool IsCompleted {
1267 			get { return isCompleted; }
1268 		}
1269 
1270 		#endregion
1271 	}
1272 
1273 	[EditorBrowsable (EditorBrowsableState.Never)]
AsyncPageBeginProcessRequest(HttpContext context, AsyncCallback callback, object extraData)1274 	protected IAsyncResult AsyncPageBeginProcessRequest (HttpContext context, AsyncCallback callback, object extraData)
1275 	{
1276 		ProcessRequest (context);
1277 		DummyAsyncResult asyncResult = new DummyAsyncResult (true, true, extraData);
1278 
1279 		if (callback != null) {
1280 			callback (asyncResult);
1281 		}
1282 
1283 		return asyncResult;
1284 	}
1285 
1286 	[EditorBrowsable (EditorBrowsableState.Never)]
AsyncPageEndProcessRequest(IAsyncResult result)1287 	protected void AsyncPageEndProcessRequest (IAsyncResult result)
1288 	{
1289 	}
1290 
InternalProcessRequest()1291 	void InternalProcessRequest ()
1292 	{
1293 		if (PageAdapter != null)
1294 			_requestValueCollection = PageAdapter.DeterminePostBackMode();
1295 		else
1296 			_requestValueCollection = this.DeterminePostBackMode();
1297 
1298 		// http://msdn2.microsoft.com/en-us/library/ms178141.aspx
1299 		if (_requestValueCollection != null) {
1300 			if (!isCrossPagePostBack && _requestValueCollection [PreviousPageID] != null && _requestValueCollection [PreviousPageID] != Request.FilePath) {
1301 				_doLoadPreviousPage = true;
1302 			} else {
1303 				isCallback = _requestValueCollection [CallbackArgumentID] != null;
1304 				// LAMESPEC: on Callback IsPostBack is set to false, but true.
1305 				//isPostBack = !isCallback;
1306 				isPostBack = true;
1307 			}
1308 
1309 			string lastFocus = _requestValueCollection [LastFocusID];
1310 			if (!String.IsNullOrEmpty (lastFocus))
1311 				_focusedControlID = UniqueID2ClientID (lastFocus);
1312 		}
1313 
1314 		if (!isCrossPagePostBack) {
1315 			if (_context.PreviousHandler is Page)
1316 				previousPage = (Page) _context.PreviousHandler;
1317 		}
1318 
1319 		Trace.Write ("aspx.page", "Begin PreInit");
1320 		OnPreInit (EventArgs.Empty);
1321 		Trace.Write ("aspx.page", "End PreInit");
1322 
1323 		InitializeTheme ();
1324 		ApplyMasterPage ();
1325 		Trace.Write ("aspx.page", "Begin Init");
1326 		InitRecursive (null);
1327 		Trace.Write ("aspx.page", "End Init");
1328 
1329 		Trace.Write ("aspx.page", "Begin InitComplete");
1330 		OnInitComplete (EventArgs.Empty);
1331 		Trace.Write ("aspx.page", "End InitComplete");
1332 
1333 		renderingForm = false;
1334 
1335 
1336 		RestorePageState ();
1337 		ProcessPostData ();
1338 		ProcessRaiseEvents ();
1339 		if (ProcessLoadComplete ())
1340 			return;
1341 		RenderPage ();
1342 	}
1343 
RestorePageState()1344 	void RestorePageState ()
1345 	{
1346 		if (IsPostBack || IsCallback) {
1347 			if (_requestValueCollection != null)
1348 				scriptManager.RestoreEventValidationState (
1349 					_requestValueCollection [ClientScriptManager.EventStateFieldName]);
1350 			Trace.Write ("aspx.page", "Begin LoadViewState");
1351 			LoadPageViewState ();
1352 			Trace.Write ("aspx.page", "End LoadViewState");
1353 		}
1354 	}
1355 
ProcessPostData()1356 	void ProcessPostData ()
1357 	{
1358 		if (IsPostBack || IsCallback) {
1359 			Trace.Write ("aspx.page", "Begin ProcessPostData");
1360 			ProcessPostData (_requestValueCollection, false);
1361 			Trace.Write ("aspx.page", "End ProcessPostData");
1362 		}
1363 
1364 		ProcessLoad ();
1365 		if (IsPostBack || IsCallback) {
1366 			Trace.Write ("aspx.page", "Begin ProcessPostData Second Try");
1367 			ProcessPostData (secondPostData, true);
1368 			Trace.Write ("aspx.page", "End ProcessPostData Second Try");
1369 		}
1370 	}
1371 
ProcessLoad()1372 	void ProcessLoad ()
1373 	{
1374 		Trace.Write ("aspx.page", "Begin PreLoad");
1375 		OnPreLoad (EventArgs.Empty);
1376 		Trace.Write ("aspx.page", "End PreLoad");
1377 
1378 		Trace.Write ("aspx.page", "Begin Load");
1379 		LoadRecursive ();
1380 		Trace.Write ("aspx.page", "End Load");
1381 	}
1382 
ProcessRaiseEvents()1383 	void ProcessRaiseEvents ()
1384 	{
1385 		if (IsPostBack || IsCallback) {
1386 			Trace.Write ("aspx.page", "Begin Raise ChangedEvents");
1387 			RaiseChangedEvents ();
1388 			Trace.Write ("aspx.page", "End Raise ChangedEvents");
1389 			Trace.Write ("aspx.page", "Begin Raise PostBackEvent");
1390 			RaisePostBackEvents ();
1391 			Trace.Write ("aspx.page", "End Raise PostBackEvent");
1392 		}
1393 	}
1394 
ProcessLoadComplete()1395 	bool ProcessLoadComplete ()
1396 	{
1397 		Trace.Write ("aspx.page", "Begin LoadComplete");
1398 		OnLoadComplete (EventArgs.Empty);
1399 		Trace.Write ("aspx.page", "End LoadComplete");
1400 
1401 		if (IsCrossPagePostBack)
1402 			return true;
1403 
1404 		if (IsCallback) {
1405 			string result = ProcessCallbackData ();
1406 			HtmlTextWriter callbackOutput = new HtmlTextWriter (Response.Output);
1407 			callbackOutput.Write (result);
1408 			callbackOutput.Flush ();
1409 			return true;
1410 		}
1411 
1412 		Trace.Write ("aspx.page", "Begin PreRender");
1413 		PreRenderRecursiveInternal ();
1414 		Trace.Write ("aspx.page", "End PreRender");
1415 
1416 		ExecuteRegisteredAsyncTasks ();
1417 
1418 		Trace.Write ("aspx.page", "Begin PreRenderComplete");
1419 		OnPreRenderComplete (EventArgs.Empty);
1420 		Trace.Write ("aspx.page", "End PreRenderComplete");
1421 
1422 		Trace.Write ("aspx.page", "Begin SaveViewState");
1423 		SavePageViewState ();
1424 		Trace.Write ("aspx.page", "End SaveViewState");
1425 
1426 		Trace.Write ("aspx.page", "Begin SaveStateComplete");
1427 		OnSaveStateComplete (EventArgs.Empty);
1428 		Trace.Write ("aspx.page", "End SaveStateComplete");
1429 		return false;
1430 	}
1431 
RenderPage()1432 	internal void RenderPage ()
1433 	{
1434 		scriptManager.ResetEventValidationState ();
1435 
1436 		//--
1437 		Trace.Write ("aspx.page", "Begin Render");
1438  		HtmlTextWriter output = CreateHtmlTextWriter (Response.Output);
1439 		RenderControl (output);
1440 		Trace.Write ("aspx.page", "End Render");
1441 	}
1442 
SetContext(HttpContext context)1443 	internal void SetContext (HttpContext context)
1444 	{
1445 		_context = context;
1446 
1447 		_application = context.Application;
1448 		_response = context.Response;
1449 		_request = context.Request;
1450 		_cache = context.Cache;
1451 	}
1452 
RenderTrace()1453 	void RenderTrace ()
1454 	{
1455 		TraceManager traceManager = HttpRuntime.TraceManager;
1456 
1457 		if (Trace.HaveTrace && !Trace.IsEnabled || !Trace.HaveTrace && !traceManager.Enabled)
1458 			return;
1459 
1460 		Trace.SaveData ();
1461 
1462 		if (!Trace.HaveTrace && traceManager.Enabled && !traceManager.PageOutput)
1463 			return;
1464 
1465 		if (!traceManager.LocalOnly || Context.Request.IsLocal) {
1466 			HtmlTextWriter output = new HtmlTextWriter (Response.Output);
1467 			Trace.Render (output);
1468 		}
1469 	}
1470 
RaisePostBackEvents()1471 	void RaisePostBackEvents ()
1472 	{
1473 		if (requiresRaiseEvent != null) {
1474 			RaisePostBackEvent (requiresRaiseEvent, null);
1475 			return;
1476 		}
1477 
1478 		if (formPostedRequiresRaiseEvent != null) {
1479 			RaisePostBackEvent (formPostedRequiresRaiseEvent, null);
1480 			return;
1481 		}
1482 
1483 		NameValueCollection postdata = _requestValueCollection;
1484 		if (postdata == null)
1485 			return;
1486 
1487 		string eventTarget = postdata [postEventSourceID];
1488 		IPostBackEventHandler target;
1489 		if (String.IsNullOrEmpty (eventTarget)) {
1490 			target = AutoPostBackControl as IPostBackEventHandler;
1491 			if (target != null)
1492 				RaisePostBackEvent (target, null);
1493 			else
1494 			if (formPostedRequiresRaiseEvent != null)
1495 				RaisePostBackEvent (formPostedRequiresRaiseEvent, null);
1496 			else
1497 				Validate ();
1498 			return;
1499 		}
1500 
1501 		target = FindControl (eventTarget, true) as IPostBackEventHandler;
1502 		if (target == null)
1503 			target = AutoPostBackControl as IPostBackEventHandler;
1504 		if (target == null)
1505 			return;
1506 
1507 		string eventArgument = postdata [postEventArgumentID];
1508 		RaisePostBackEvent (target, eventArgument);
1509 	}
1510 
RaiseChangedEvents()1511 	internal void RaiseChangedEvents ()
1512 	{
1513 		if (requiresPostDataChanged == null)
1514 			return;
1515 
1516 		foreach (IPostBackDataHandler ipdh in requiresPostDataChanged)
1517 			ipdh.RaisePostDataChangedEvent ();
1518 
1519 		requiresPostDataChanged = null;
1520 	}
1521 
1522 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)1523 	protected virtual void RaisePostBackEvent (IPostBackEventHandler sourceControl, string eventArgument)
1524 	{
1525 		sourceControl.RaisePostBackEvent (eventArgument);
1526 	}
1527 
1528 	[Obsolete ("The recommended alternative is ClientScript.RegisterArrayDeclaration(string arrayName, string arrayValue). http://go.microsoft.com/fwlink/?linkid=14202")]
1529 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterArrayDeclaration(string arrayName, string arrayValue)1530 	public void RegisterArrayDeclaration (string arrayName, string arrayValue)
1531 	{
1532 		scriptManager.RegisterArrayDeclaration (arrayName, arrayValue);
1533 	}
1534 
1535 	[Obsolete ("The recommended alternative is ClientScript.RegisterClientScriptBlock(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202")]
1536 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterClientScriptBlock(string key, string script)1537 	public virtual void RegisterClientScriptBlock (string key, string script)
1538 	{
1539 		scriptManager.RegisterClientScriptBlock (key, script);
1540 	}
1541 
1542 	[Obsolete]
1543 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterHiddenField(string hiddenFieldName, string hiddenFieldInitialValue)1544 	public virtual void RegisterHiddenField (string hiddenFieldName, string hiddenFieldInitialValue)
1545 	{
1546 		scriptManager.RegisterHiddenField (hiddenFieldName, hiddenFieldInitialValue);
1547 	}
1548 
1549 	[MonoTODO("Not implemented, Used in HtmlForm")]
RegisterClientScriptFile(string a, string b, string c)1550 	internal void RegisterClientScriptFile (string a, string b, string c)
1551 	{
1552 		throw new NotImplementedException ();
1553 	}
1554 
1555 	[Obsolete ("The recommended alternative is ClientScript.RegisterOnSubmitStatement(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202")]
1556 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterOnSubmitStatement(string key, string script)1557 	public void RegisterOnSubmitStatement (string key, string script)
1558 	{
1559 		scriptManager.RegisterOnSubmitStatement (key, script);
1560 	}
1561 
GetSubmitStatements()1562 	internal string GetSubmitStatements ()
1563 	{
1564 		return scriptManager.WriteSubmitStatements ();
1565 	}
1566 
1567 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterRequiresPostBack(Control control)1568 	public void RegisterRequiresPostBack (Control control)
1569 	{
1570 		if (!(control is IPostBackDataHandler))
1571 			throw new HttpException ("The control to register does not implement the IPostBackDataHandler interface.");
1572 
1573 		if (_requiresPostBack == null)
1574 			_requiresPostBack = new List <string> ();
1575 
1576 		string uniqueID = control.UniqueID;
1577 		if (_requiresPostBack.Contains (uniqueID))
1578 			return;
1579 
1580 		_requiresPostBack.Add (uniqueID);
1581 	}
1582 
1583 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterRequiresRaiseEvent(IPostBackEventHandler control)1584 	public virtual void RegisterRequiresRaiseEvent (IPostBackEventHandler control)
1585 	{
1586 		requiresRaiseEvent = control;
1587 	}
1588 
1589 	[Obsolete ("The recommended alternative is ClientScript.RegisterStartupScript(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202")]
1590 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterStartupScript(string key, string script)1591 	public virtual void RegisterStartupScript (string key, string script)
1592 	{
1593 		scriptManager.RegisterStartupScript (key, script);
1594 	}
1595 
1596 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterViewStateHandler()1597 	public void RegisterViewStateHandler ()
1598 	{
1599 		handleViewState = true;
1600 	}
1601 
1602 	[EditorBrowsable (EditorBrowsableState.Advanced)]
SavePageStateToPersistenceMedium(object state)1603 	protected virtual void SavePageStateToPersistenceMedium (object state)
1604 	{
1605 		PageStatePersister persister = this.PageStatePersister;
1606 		if (persister == null)
1607 			return;
1608 		Pair pair = state as Pair;
1609 		if (pair != null) {
1610 			persister.ViewState = pair.First;
1611 			persister.ControlState = pair.Second;
1612 		} else
1613 			persister.ViewState = state;
1614 		persister.Save ();
1615 	}
1616 
1617 	internal string RawViewState {
1618 		get {
1619 			NameValueCollection postdata = _requestValueCollection;
1620 			string view_state;
1621 			if (postdata == null || (view_state = postdata ["__VIEWSTATE"]) == null)
1622 				return null;
1623 
1624 			if (view_state == String.Empty)
1625 				return null;
1626 			return view_state;
1627 		}
1628 
1629 		set { _savedViewState = value; }
1630 	}
1631 
1632 
1633 	protected virtual PageStatePersister PageStatePersister {
1634 		get {
1635 			if (page_state_persister == null && PageAdapter != null)
1636 					page_state_persister = PageAdapter.GetStatePersister();
1637 			if (page_state_persister == null)
1638 				page_state_persister = new HiddenFieldPageStatePersister (this);
1639 			return page_state_persister;
1640 		}
1641 	}
1642 
1643 	[EditorBrowsable (EditorBrowsableState.Advanced)]
LoadPageStateFromPersistenceMedium()1644 	protected virtual object LoadPageStateFromPersistenceMedium ()
1645 	{
1646 		PageStatePersister persister = this.PageStatePersister;
1647 		if (persister == null)
1648 			return null;
1649 		persister.Load ();
1650 		return new Pair (persister.ViewState, persister.ControlState);
1651 	}
1652 
LoadPageViewState()1653 	internal void LoadPageViewState ()
1654 	{
1655 		Pair sState = LoadPageStateFromPersistenceMedium () as Pair;
1656 		if (sState != null) {
1657 			if (allow_load || isCrossPagePostBack) {
1658 				LoadPageControlState (sState.Second);
1659 
1660 				Pair vsr = sState.First as Pair;
1661 				if (vsr != null) {
1662 					LoadViewStateRecursive (vsr.First);
1663 					_requiresPostBackCopy = vsr.Second as List <string>;
1664 				}
1665 			}
1666 		}
1667 	}
1668 
SavePageViewState()1669 	internal void SavePageViewState ()
1670 	{
1671 		if (!handleViewState)
1672 			return;
1673 
1674 		object controlState = SavePageControlState ();
1675 		Pair vsr = null;
1676 		object viewState = null;
1677 
1678 		if (EnableViewState
1679 		    && this.ViewStateMode == ViewStateMode.Enabled
1680 		)
1681 			viewState = SaveViewStateRecursive ();
1682 
1683 		object reqPostback = (_requiresPostBack != null && _requiresPostBack.Count > 0) ? _requiresPostBack : null;
1684 		if (viewState != null || reqPostback != null)
1685 			vsr = new Pair (viewState, reqPostback);
1686 
1687 		Pair pair = new Pair ();
1688 		pair.First = vsr;
1689 		pair.Second = controlState;
1690 		if (pair.First == null && pair.Second == null)
1691 			SavePageStateToPersistenceMedium (null);
1692 		else
1693 			SavePageStateToPersistenceMedium (pair);
1694 
1695 	}
1696 
Validate()1697 	public virtual void Validate ()
1698 	{
1699 		is_validated = true;
1700 		ValidateCollection (_validators);
1701 	}
1702 
AreValidatorsUplevel()1703 	internal bool AreValidatorsUplevel ()
1704 	{
1705 		return AreValidatorsUplevel (String.Empty);
1706 	}
1707 
AreValidatorsUplevel(string valGroup)1708 	internal bool AreValidatorsUplevel (string valGroup)
1709 	{
1710 		bool uplevel = false;
1711 
1712 		foreach (IValidator v in Validators) {
1713 			BaseValidator bv = v as BaseValidator;
1714 			if (bv == null)
1715 				continue;
1716 
1717 			if (valGroup != bv.ValidationGroup)
1718 				continue;
1719 			if (bv.GetRenderUplevel()) {
1720 				uplevel = true;
1721 				break;
1722 			}
1723 		}
1724 
1725 		return uplevel;
1726 	}
1727 
ValidateCollection(ValidatorCollection validators)1728 	bool ValidateCollection (ValidatorCollection validators)
1729 	{
1730 		if (validators == null || validators.Count == 0)
1731 			return true;
1732 
1733 		bool all_valid = true;
1734 		foreach (IValidator v in validators){
1735 			v.Validate ();
1736 			if (v.IsValid == false)
1737 				all_valid = false;
1738 		}
1739 
1740 		return all_valid;
1741 	}
1742 
1743 	[EditorBrowsable (EditorBrowsableState.Advanced)]
VerifyRenderingInServerForm(Control control)1744 	public virtual void VerifyRenderingInServerForm (Control control)
1745 	{
1746 		if (Context == null)
1747 			return;
1748 		if (IsCallback)
1749 			return;
1750 		if (!renderingForm)
1751 			throw new HttpException ("Control '" +
1752 						 control.ClientID +
1753 						 "' of type '" +
1754 						 control.GetType ().Name +
1755 						 "' must be placed inside a form tag with runat=server.");
1756 	}
1757 
FrameworkInitialize()1758 	protected override void FrameworkInitialize ()
1759 	{
1760 		base.FrameworkInitialize ();
1761 		InitializeStyleSheet ();
1762 	}
1763 #endregion
1764 
1765 	public ClientScriptManager ClientScript {
1766 		get { return scriptManager; }
1767 	}
1768 
1769 	internal static readonly object InitCompleteEvent = new object ();
1770 	internal static readonly object LoadCompleteEvent = new object ();
1771 	internal static readonly object PreInitEvent = new object ();
1772 	internal static readonly object PreLoadEvent = new object ();
1773 	internal static readonly object PreRenderCompleteEvent = new object ();
1774 	internal static readonly object SaveStateCompleteEvent = new object ();
1775 	int event_mask;
1776 	const int initcomplete_mask = 1;
1777 	const int loadcomplete_mask = 1 << 1;
1778 	const int preinit_mask = 1 << 2;
1779 	const int preload_mask = 1 << 3;
1780 	const int prerendercomplete_mask = 1 << 4;
1781 	const int savestatecomplete_mask = 1 << 5;
1782 
1783 	[EditorBrowsable (EditorBrowsableState.Advanced)]
1784 	public event EventHandler InitComplete {
1785 		add {
1786 			event_mask |= initcomplete_mask;
1787 			Events.AddHandler (InitCompleteEvent, value);
1788 		}
1789 		remove { Events.RemoveHandler (InitCompleteEvent, value); }
1790 	}
1791 
1792 	[EditorBrowsable (EditorBrowsableState.Advanced)]
1793 	public event EventHandler LoadComplete {
1794 		add {
1795 			event_mask |= loadcomplete_mask;
1796 			Events.AddHandler (LoadCompleteEvent, value);
1797 		}
1798 		remove { Events.RemoveHandler (LoadCompleteEvent, value); }
1799 	}
1800 
1801 	public event EventHandler PreInit {
1802 		add {
1803 			event_mask |= preinit_mask;
1804 			Events.AddHandler (PreInitEvent, value);
1805 		}
1806 		remove { Events.RemoveHandler (PreInitEvent, value); }
1807 	}
1808 
1809 	[EditorBrowsable (EditorBrowsableState.Advanced)]
1810 	public event EventHandler PreLoad {
1811 		add {
1812 			event_mask |= preload_mask;
1813 			Events.AddHandler (PreLoadEvent, value);
1814 		}
1815 		remove { Events.RemoveHandler (PreLoadEvent, value); }
1816 	}
1817 
1818 	[EditorBrowsable (EditorBrowsableState.Advanced)]
1819 	public event EventHandler PreRenderComplete {
1820 		add {
1821 			event_mask |= prerendercomplete_mask;
1822 			Events.AddHandler (PreRenderCompleteEvent, value);
1823 		}
1824 		remove { Events.RemoveHandler (PreRenderCompleteEvent, value); }
1825 	}
1826 
1827 	[EditorBrowsable (EditorBrowsableState.Advanced)]
1828 	public event EventHandler SaveStateComplete {
1829 		add {
1830 			event_mask |= savestatecomplete_mask;
1831 			Events.AddHandler (SaveStateCompleteEvent, value);
1832 		}
1833 		remove { Events.RemoveHandler (SaveStateCompleteEvent, value); }
1834 	}
1835 
OnInitComplete(EventArgs e)1836 	protected virtual void OnInitComplete (EventArgs e)
1837 	{
1838 		if ((event_mask & initcomplete_mask) != 0) {
1839 			EventHandler eh = (EventHandler) (Events [InitCompleteEvent]);
1840 			if (eh != null) eh (this, e);
1841 		}
1842 	}
1843 
OnLoadComplete(EventArgs e)1844 	protected virtual void OnLoadComplete (EventArgs e)
1845 	{
1846 		if ((event_mask & loadcomplete_mask) != 0) {
1847 			EventHandler eh = (EventHandler) (Events [LoadCompleteEvent]);
1848 			if (eh != null) eh (this, e);
1849 		}
1850 	}
1851 
OnPreInit(EventArgs e)1852 	protected virtual void OnPreInit (EventArgs e)
1853 	{
1854 		if ((event_mask & preinit_mask) != 0) {
1855 			EventHandler eh = (EventHandler) (Events [PreInitEvent]);
1856 			if (eh != null) eh (this, e);
1857 		}
1858 	}
1859 
OnPreLoad(EventArgs e)1860 	protected virtual void OnPreLoad (EventArgs e)
1861 	{
1862 		if ((event_mask & preload_mask) != 0) {
1863 			EventHandler eh = (EventHandler) (Events [PreLoadEvent]);
1864 			if (eh != null) eh (this, e);
1865 		}
1866 	}
1867 
OnPreRenderComplete(EventArgs e)1868 	protected virtual void OnPreRenderComplete (EventArgs e)
1869 	{
1870 		if ((event_mask & prerendercomplete_mask) != 0) {
1871 			EventHandler eh = (EventHandler) (Events [PreRenderCompleteEvent]);
1872 			if (eh != null) eh (this, e);
1873 		}
1874 
1875 		if (Form == null)
1876 			return;
1877 		if (!Form.DetermineRenderUplevel ())
1878 			return;
1879 
1880 		string defaultButtonId = Form.DefaultButton;
1881 		/* figure out if we have some control we're going to focus */
1882 		if (String.IsNullOrEmpty (_focusedControlID)) {
1883 			_focusedControlID = Form.DefaultFocus;
1884 			if (String.IsNullOrEmpty (_focusedControlID))
1885 				_focusedControlID = defaultButtonId;
1886 		}
1887 
1888 		if (!String.IsNullOrEmpty (_focusedControlID)) {
1889 			ClientScript.RegisterWebFormClientScript ();
1890 
1891 			ClientScript.RegisterStartupScript (
1892 				typeof(Page),
1893 				"HtmlForm-DefaultButton-StartupScript",
1894 				"\n" + WebFormScriptReference + ".WebForm_AutoFocus('" + _focusedControlID + "');\n", true);
1895 		}
1896 
1897 		if (Form.SubmitDisabledControls && _hasEnabledControlArray) {
1898 			ClientScript.RegisterWebFormClientScript ();
1899 
1900 			ClientScript.RegisterOnSubmitStatement (
1901 				typeof (Page),
1902 				"HtmlForm-SubmitDisabledControls-SubmitStatement",
1903 				WebFormScriptReference + ".WebForm_ReEnableControls();");
1904 		}
1905 	}
1906 
RegisterEnabledControl(Control control)1907 	internal void RegisterEnabledControl (Control control)
1908 	{
1909 		if (Form == null || !Page.Form.SubmitDisabledControls || !Page.Form.DetermineRenderUplevel ())
1910 			return;
1911 		_hasEnabledControlArray = true;
1912 		Page.ClientScript.RegisterArrayDeclaration (EnabledControlArrayID, String.Concat ("'", control.ClientID, "'"));
1913 	}
1914 
OnSaveStateComplete(EventArgs e)1915 	protected virtual void OnSaveStateComplete (EventArgs e)
1916 	{
1917 		if ((event_mask & savestatecomplete_mask) != 0) {
1918 			EventHandler eh = (EventHandler) (Events [SaveStateCompleteEvent]);
1919 			if (eh != null) eh (this, e);
1920 		}
1921 	}
1922 
1923 	public HtmlForm Form {
1924 		get { return _form; }
1925 	}
1926 
RegisterForm(HtmlForm form)1927 	internal void RegisterForm (HtmlForm form)
1928 	{
1929 		_form = form;
1930 	}
1931 
1932 	public string ClientQueryString {
1933 		get { return Request.UrlComponents.Query; }
1934 	}
1935 
1936 	[BrowsableAttribute (false)]
1937 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1938 	public Page PreviousPage {
1939 		get {
1940 			if (_doLoadPreviousPage) {
1941 				_doLoadPreviousPage = false;
1942 				LoadPreviousPageReference ();
1943 			}
1944 			return previousPage;
1945 		}
1946 	}
1947 
1948 
1949 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1950 	[BrowsableAttribute (false)]
1951 	public bool IsCallback {
1952 		get { return isCallback; }
1953 	}
1954 
1955 	[BrowsableAttribute (false)]
1956 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1957 	public bool IsCrossPagePostBack {
1958 		get { return isCrossPagePostBack; }
1959 	}
1960 
1961 	[Browsable (false)]
1962 	[EditorBrowsable (EditorBrowsableState.Never)]
1963 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
1964 	public new virtual char IdSeparator {
1965 		get {
1966 			//TODO: why override?
1967 			return base.IdSeparator;
1968 		}
1969 	}
1970 
ProcessCallbackData()1971 	string ProcessCallbackData ()
1972 	{
1973 		ICallbackEventHandler target = GetCallbackTarget ();
1974 		string callbackEventError = String.Empty;
1975 		ProcessRaiseCallbackEvent (target, ref callbackEventError);
1976 		return ProcessGetCallbackResult (target, callbackEventError);
1977 	}
1978 
GetCallbackTarget()1979 	ICallbackEventHandler GetCallbackTarget ()
1980 	{
1981 		string callbackTarget = _requestValueCollection [CallbackSourceID];
1982 		if (callbackTarget == null || callbackTarget.Length == 0)
1983 			throw new HttpException ("Callback target not provided.");
1984 
1985 		Control targetControl = FindControl (callbackTarget, true);
1986 		ICallbackEventHandler target = targetControl as ICallbackEventHandler;
1987 		if (target == null)
1988 			throw new HttpException (string.Format ("Invalid callback target '{0}'.", callbackTarget));
1989 		return target;
1990 	}
1991 
ProcessRaiseCallbackEvent(ICallbackEventHandler target, ref string callbackEventError)1992 	void ProcessRaiseCallbackEvent (ICallbackEventHandler target, ref string callbackEventError)
1993 	{
1994 		string callbackArgument = _requestValueCollection [CallbackArgumentID];
1995 
1996 		try {
1997 			target.RaiseCallbackEvent (callbackArgument);
1998 		} catch (Exception ex) {
1999 			callbackEventError = String.Concat ("e", RuntimeHelpers.DebuggingEnabled ? ex.ToString () : ex.Message);
2000 		}
2001 
2002 	}
2003 
ProcessGetCallbackResult(ICallbackEventHandler target, string callbackEventError)2004 	string ProcessGetCallbackResult (ICallbackEventHandler target, string callbackEventError)
2005 	{
2006 		string callBackResult;
2007 		try {
2008 			callBackResult = target.GetCallbackResult ();
2009 		} catch (Exception ex) {
2010 			return String.Concat ("e", RuntimeHelpers.DebuggingEnabled ? ex.ToString () : ex.Message);
2011 		}
2012 
2013 		string eventValidation = ClientScript.GetEventValidationStateFormatted ();
2014 		return callbackEventError + (eventValidation == null ? "0" : eventValidation.Length.ToString ()) + "|" +
2015 			eventValidation + callBackResult;
2016 	}
2017 
2018 	[BrowsableAttribute (false)]
2019 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
2020 	public HtmlHead Header {
2021 		get { return htmlHeader; }
2022 	}
2023 
SetHeader(HtmlHead header)2024 	internal void SetHeader (HtmlHead header)
2025 	{
2026 		htmlHeader = header;
2027 		if (header == null)
2028 			return;
2029 
2030 		if (_title != null) {
2031 			htmlHeader.Title = _title;
2032 			_title = null;
2033 		}
2034 		if (_metaDescription != null) {
2035 			htmlHeader.Description = _metaDescription;
2036 			_metaDescription = null;
2037 		}
2038 
2039 		if (_metaKeywords != null) {
2040 			htmlHeader.Keywords = _metaKeywords;
2041 			_metaKeywords = null;
2042 		}
2043 	}
2044 
2045 	[EditorBrowsable (EditorBrowsableState.Never)]
2046 	protected bool AsyncMode {
2047 		get { return asyncMode; }
2048 		set { asyncMode = value; }
2049 	}
2050 
2051 	[Browsable (false)]
2052 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
2053 	[EditorBrowsable (EditorBrowsableState.Advanced)]
2054 	public TimeSpan AsyncTimeout {
2055 		get { return asyncTimeout; }
2056 		set { asyncTimeout = value; }
2057 	}
2058 
2059 	public bool IsAsync {
2060 		get { return AsyncMode; }
2061 	}
2062 
2063 	protected internal virtual string UniqueFilePathSuffix {
2064 		get {
2065 			if (String.IsNullOrEmpty (uniqueFilePathSuffix))
2066 				uniqueFilePathSuffix = "__ufps=" + AppRelativeVirtualPath.GetHashCode ().ToString ("x");
2067 			return uniqueFilePathSuffix;
2068 		}
2069 	}
2070 
2071 	[MonoTODO ("Actually use the value in code.")]
2072 	[Browsable (false)]
2073 	[EditorBrowsable (EditorBrowsableState.Never)]
2074 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
2075 	public int MaxPageStateFieldLength {
2076 		get { return maxPageStateFieldLength; }
2077 		set { maxPageStateFieldLength = value; }
2078 	}
2079 
AddOnPreRenderCompleteAsync(BeginEventHandler beginHandler, EndEventHandler endHandler)2080 	public void AddOnPreRenderCompleteAsync (BeginEventHandler beginHandler, EndEventHandler endHandler)
2081 	{
2082 		AddOnPreRenderCompleteAsync (beginHandler, endHandler, null);
2083 	}
2084 
AddOnPreRenderCompleteAsync(BeginEventHandler beginHandler, EndEventHandler endHandler, Object state)2085 	public void AddOnPreRenderCompleteAsync (BeginEventHandler beginHandler, EndEventHandler endHandler, Object state)
2086 	{
2087 		if (!IsAsync) {
2088 			throw new InvalidOperationException ("AddOnPreRenderCompleteAsync called and Page.IsAsync == false");
2089 		}
2090 
2091 		if (IsPrerendered) {
2092 			throw new InvalidOperationException ("AddOnPreRenderCompleteAsync can only be called before and during PreRender.");
2093 		}
2094 
2095 		if (beginHandler == null) {
2096 			throw new ArgumentNullException ("beginHandler");
2097 		}
2098 
2099 		if (endHandler == null) {
2100 			throw new ArgumentNullException ("endHandler");
2101 		}
2102 
2103 		RegisterAsyncTask (new PageAsyncTask (beginHandler, endHandler, null, state, false));
2104 	}
2105 
2106 	List<PageAsyncTask> ParallelTasks {
2107 		get {
2108 			if (parallelTasks == null)
2109 				parallelTasks = new List<PageAsyncTask>();
2110 			return parallelTasks;
2111 		}
2112 	}
2113 
2114 	List<PageAsyncTask> SerialTasks {
2115 		get {
2116 			if (serialTasks == null)
2117 				serialTasks = new List<PageAsyncTask> ();
2118 			return serialTasks;
2119 		}
2120 	}
2121 
RegisterAsyncTask(PageAsyncTask task)2122 	public void RegisterAsyncTask (PageAsyncTask task)
2123 	{
2124 		if (task == null)
2125 			throw new ArgumentNullException ("task");
2126 
2127 		if (task.ExecuteInParallel)
2128 			ParallelTasks.Add (task);
2129 		else
2130 			SerialTasks.Add (task);
2131 	}
2132 
ExecuteRegisteredAsyncTasks()2133 	public void ExecuteRegisteredAsyncTasks ()
2134 	{
2135 		if ((parallelTasks == null || parallelTasks.Count == 0) &&
2136 			(serialTasks == null || serialTasks.Count == 0)){
2137 			return;
2138 		}
2139 
2140 		if (parallelTasks != null) {
2141 			DateTime startExecution = DateTime.Now;
2142 			List<PageAsyncTask> localParallelTasks = parallelTasks;
2143 			parallelTasks = null; // Shouldn't execute tasks twice
2144 			List<IAsyncResult> asyncResults = new List<IAsyncResult>();
2145 			foreach (PageAsyncTask parallelTask in localParallelTasks) {
2146 				IAsyncResult result = parallelTask.BeginHandler (this, EventArgs.Empty, new AsyncCallback (EndAsyncTaskCallback), parallelTask);
2147 				if (result.CompletedSynchronously)
2148 					parallelTask.EndHandler (result);
2149 				else
2150 					asyncResults.Add (result);
2151 			}
2152 
2153 			if (asyncResults.Count > 0) {
2154 				WaitHandle [] waitArray = new WaitHandle [asyncResults.Count];
2155 				int i = 0;
2156 				for (i = 0; i < asyncResults.Count; i++) {
2157 					waitArray [i] = asyncResults [i].AsyncWaitHandle;
2158 				}
2159 
2160 				bool allSignalled = WaitHandle.WaitAll (waitArray, AsyncTimeout, false);
2161 				if (!allSignalled) {
2162 					for (i = 0; i < asyncResults.Count; i++) {
2163 						if (!asyncResults [i].IsCompleted) {
2164 							localParallelTasks [i].TimeoutHandler (asyncResults [i]);
2165 						}
2166 					}
2167 				}
2168 			}
2169 			DateTime endWait = DateTime.Now;
2170 			TimeSpan elapsed = endWait - startExecution;
2171 			if (elapsed <= AsyncTimeout)
2172 				AsyncTimeout -= elapsed;
2173 			else
2174 				AsyncTimeout = TimeSpan.FromTicks(0);
2175 		}
2176 
2177 		if (serialTasks != null) {
2178 			List<PageAsyncTask> localSerialTasks = serialTasks;
2179 			serialTasks = null; // Shouldn't execute tasks twice
2180 			foreach (PageAsyncTask serialTask in localSerialTasks) {
2181 				DateTime startExecution = DateTime.Now;
2182 
2183 				IAsyncResult result = serialTask.BeginHandler (this, EventArgs.Empty, new AsyncCallback (EndAsyncTaskCallback), serialTask);
2184 				if (result.CompletedSynchronously)
2185 					serialTask.EndHandler (result);
2186 				else {
2187 					bool done = result.AsyncWaitHandle.WaitOne (AsyncTimeout, false);
2188 					if (!done && !result.IsCompleted) {
2189 						serialTask.TimeoutHandler (result);
2190 					}
2191 				}
2192 				DateTime endWait = DateTime.Now;
2193 				TimeSpan elapsed = endWait - startExecution;
2194 				if (elapsed <= AsyncTimeout)
2195 					AsyncTimeout -= elapsed;
2196 				else
2197 					AsyncTimeout = TimeSpan.FromTicks (0);
2198 			}
2199 		}
2200 		AsyncTimeout = TimeSpan.FromSeconds (DefaultAsyncTimeout);
2201 	}
2202 
EndAsyncTaskCallback(IAsyncResult result)2203 	void EndAsyncTaskCallback (IAsyncResult result)
2204 	{
2205 		PageAsyncTask task = (PageAsyncTask)result.AsyncState;
2206 		task.EndHandler (result);
2207 	}
2208 
CreateHtmlTextWriterFromType(TextWriter tw, Type writerType)2209 	public static HtmlTextWriter CreateHtmlTextWriterFromType (TextWriter tw, Type writerType)
2210 	{
2211 		Type htmlTextWriterType = typeof (HtmlTextWriter);
2212 
2213 		if (!htmlTextWriterType.IsAssignableFrom (writerType)) {
2214 			throw new HttpException (String.Format ("Type '{0}' cannot be assigned to HtmlTextWriter", writerType.FullName));
2215 		}
2216 
2217 		ConstructorInfo constructor = writerType.GetConstructor (new Type [] { typeof (TextWriter) });
2218 		if (constructor == null) {
2219 			throw new HttpException (String.Format ("Type '{0}' does not have a consturctor that takes a TextWriter as parameter", writerType.FullName));
2220 		}
2221 
2222 		return (HtmlTextWriter) Activator.CreateInstance(writerType, tw);
2223 	}
2224 
2225 	[Browsable (false)]
2226 	[DefaultValue ("0")]
2227 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
2228 	[EditorBrowsable (EditorBrowsableState.Never)]
2229 	public ViewStateEncryptionMode ViewStateEncryptionMode {
2230 		get { return viewStateEncryptionMode; }
2231 		set { viewStateEncryptionMode = value; }
2232 	}
2233 
RegisterRequiresViewStateEncryption()2234 	public void RegisterRequiresViewStateEncryption ()
2235 	{
2236 		controlRegisteredForViewStateEncryption = true;
2237 	}
2238 
2239 	internal bool NeedViewStateEncryption {
2240 		get {
2241 			return (ViewStateEncryptionMode == ViewStateEncryptionMode.Always ||
2242 					(ViewStateEncryptionMode == ViewStateEncryptionMode.Auto &&
2243 					 controlRegisteredForViewStateEncryption));
2244 
2245 		}
2246 	}
2247 
ApplyMasterPage()2248 	void ApplyMasterPage ()
2249 	{
2250 		if (masterPageFile != null && masterPageFile.Length > 0) {
2251 			MasterPage master = Master;
2252 
2253 			if (master != null) {
2254 				var appliedMasterPageFiles = new Dictionary <string, bool> (StringComparer.Ordinal);
2255 				MasterPage.ApplyMasterPageRecursive (Request.CurrentExecutionFilePath, HostingEnvironment.VirtualPathProvider, master, appliedMasterPageFiles);
2256 				master.Page = this;
2257 				Controls.Clear ();
2258 				Controls.Add (master);
2259 			}
2260 		}
2261 	}
2262 
2263 	[DefaultValueAttribute ("")]
2264 	public virtual string MasterPageFile {
2265 		get { return masterPageFile; }
2266 		set {
2267 			masterPageFile = value;
2268 			masterPage = null;
2269 		}
2270 	}
2271 
2272 	[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
2273 	[BrowsableAttribute (false)]
2274 	public MasterPage Master {
2275 		get {
2276 			if (Context == null || String.IsNullOrEmpty (masterPageFile))
2277 				return null;
2278 
2279 			if (masterPage == null)
2280 				masterPage = MasterPage.CreateMasterPage (this, Context, masterPageFile, contentTemplates);
2281 
2282 			return masterPage;
2283 		}
2284 	}
2285 
SetFocus(string clientID)2286 	public void SetFocus (string clientID)
2287 	{
2288 		if (String.IsNullOrEmpty (clientID))
2289 			throw new ArgumentNullException ("control");
2290 
2291 		if (IsPrerendered)
2292 			throw new InvalidOperationException ("SetFocus can only be called before and during PreRender.");
2293 
2294 		if(Form==null)
2295 			throw new InvalidOperationException ("A form tag with runat=server must exist on the Page to use SetFocus() or the Focus property.");
2296 
2297 		_focusedControlID = clientID;
2298 	}
2299 
SetFocus(Control control)2300 	public void SetFocus (Control control)
2301 	{
2302 		if (control == null)
2303 			throw new ArgumentNullException ("control");
2304 
2305 		SetFocus (control.ClientID);
2306 	}
2307 
2308 	[EditorBrowsable (EditorBrowsableState.Advanced)]
RegisterRequiresControlState(Control control)2309 	public void RegisterRequiresControlState (Control control)
2310 	{
2311 		if (control == null)
2312 			throw new ArgumentNullException ("control");
2313 
2314 		if (RequiresControlState (control))
2315 			return;
2316 
2317 		if (requireStateControls == null)
2318 			requireStateControls = new List <Control> ();
2319 		requireStateControls.Add (control);
2320 		int n = requireStateControls.Count - 1;
2321 
2322 		if (_savedControlState == null || n >= _savedControlState.Length)
2323 			return;
2324 
2325 		for (Control parent = control.Parent; parent != null; parent = parent.Parent)
2326 			if (parent.IsChildControlStateCleared)
2327 				return;
2328 
2329 		object state = _savedControlState [n];
2330 		if (state != null)
2331 			control.LoadControlState (state);
2332 	}
2333 
RequiresControlState(Control control)2334 	public bool RequiresControlState (Control control)
2335 	{
2336 		if (requireStateControls == null)
2337 			return false;
2338 		return requireStateControls.Contains (control);
2339 	}
2340 
2341 	[EditorBrowsable (EditorBrowsableState.Advanced)]
UnregisterRequiresControlState(Control control)2342 	public void UnregisterRequiresControlState (Control control)
2343 	{
2344 		if (requireStateControls != null)
2345 			requireStateControls.Remove (control);
2346 	}
2347 
GetValidators(string validationGroup)2348 	public ValidatorCollection GetValidators (string validationGroup)
2349 	{
2350 		if (validationGroup == String.Empty)
2351 			validationGroup = null;
2352 
2353 		ValidatorCollection col = new ValidatorCollection ();
2354 		if (_validators == null)
2355 			return col;
2356 
2357 		foreach (IValidator v in _validators)
2358 			if (BelongsToGroup(v, validationGroup))
2359 				col.Add(v);
2360 
2361 		return col;
2362 	}
2363 
BelongsToGroup(IValidator v, string validationGroup)2364 	bool BelongsToGroup(IValidator v, string validationGroup)
2365 	{
2366 		BaseValidator validator = v as BaseValidator;
2367 		if (validationGroup == null)
2368 			return validator == null || String.IsNullOrEmpty (validator.ValidationGroup);
2369 		else
2370 			return validator != null && validator.ValidationGroup == validationGroup;
2371 	}
2372 
Validate(string validationGroup)2373 	public virtual void Validate (string validationGroup)
2374 	{
2375 		is_validated = true;
2376 		ValidateCollection (GetValidators (validationGroup));
2377 	}
2378 
SavePageControlState()2379 	object SavePageControlState ()
2380 	{
2381 		int count = requireStateControls == null ? 0 : requireStateControls.Count;
2382 		if (count == 0)
2383 			return null;
2384 
2385 		object state;
2386 		object[] controlStates = new object [count];
2387 		object[] adapterState = new object [count];
2388 		Control control;
2389 		ControlAdapter adapter;
2390 		bool allNull = true;
2391 		TraceContext trace = (Context != null && Context.Trace.IsEnabled) ? Context.Trace : null;
2392 
2393 		for (int n = 0; n < count; n++) {
2394 			control = requireStateControls [n];
2395 			state = controlStates [n] = control.SaveControlState ();
2396 			if (state != null)
2397 				allNull = false;
2398 
2399 			if (trace != null)
2400 				trace.SaveControlState (control, state);
2401 
2402 			adapter = control.Adapter;
2403 			if (adapter != null) {
2404 				adapterState [n] = adapter.SaveAdapterControlState ();
2405 				if (adapterState [n] != null) allNull = false;
2406 			}
2407 		}
2408 
2409 		if (allNull)
2410 			return null;
2411 		else
2412 			return new Pair (controlStates, adapterState);
2413 	}
2414 
LoadPageControlState(object data)2415 	void LoadPageControlState (object data)
2416 	{
2417 		_savedControlState = null;
2418 		if (data == null) return;
2419 		Pair statePair = (Pair)data;
2420 		_savedControlState = (object[]) statePair.First;
2421 		object[] adapterState = (object[]) statePair.Second;
2422 
2423 		if (requireStateControls == null) return;
2424 
2425 		int min = Math.Min (requireStateControls.Count, _savedControlState != null ? _savedControlState.Length : requireStateControls.Count);
2426 		for (int n=0; n < min; n++) {
2427 			Control ctl = (Control) requireStateControls [n];
2428 			ctl.LoadControlState (_savedControlState != null ? _savedControlState [n] : null);
2429 			if (ctl.Adapter != null)
2430 				ctl.Adapter.LoadAdapterControlState (adapterState != null ? adapterState [n] : null);
2431 		}
2432 	}
2433 
LoadPreviousPageReference()2434 	void LoadPreviousPageReference ()
2435 	{
2436 		if (_requestValueCollection != null) {
2437 			string prevPage = _requestValueCollection [PreviousPageID];
2438 			if (prevPage != null) {
2439 				IHttpHandler handler;
2440 				handler = BuildManager.CreateInstanceFromVirtualPath (prevPage, typeof (IHttpHandler)) as IHttpHandler;
2441 				previousPage = (Page) handler;
2442 				previousPage.isCrossPagePostBack = true;
2443 				Server.Execute (handler, null, true, _context.Request.CurrentExecutionFilePath, null, false, false);
2444 			}
2445 		}
2446 	}
2447 
2448 	Hashtable contentTemplates;
2449 	[EditorBrowsable (EditorBrowsableState.Never)]
AddContentTemplate(string templateName, ITemplate template)2450 	protected internal void AddContentTemplate (string templateName, ITemplate template)
2451 	{
2452 		if (contentTemplates == null)
2453 			contentTemplates = new Hashtable ();
2454 		contentTemplates [templateName] = template;
2455 	}
2456 
2457 	PageTheme _pageTheme;
2458 	internal PageTheme PageTheme {
2459 		get { return _pageTheme; }
2460 	}
2461 
2462 	PageTheme _styleSheetPageTheme;
2463 	internal PageTheme StyleSheetPageTheme {
2464 		get { return _styleSheetPageTheme; }
2465 	}
2466 
2467 	Stack dataItemCtx;
2468 
PushDataItemContext(object o)2469 	internal void PushDataItemContext (object o) {
2470 		if (dataItemCtx == null)
2471 			dataItemCtx = new Stack ();
2472 
2473 		dataItemCtx.Push (o);
2474 	}
2475 
PopDataItemContext()2476 	internal void PopDataItemContext () {
2477 		if (dataItemCtx == null)
2478 			throw new InvalidOperationException ();
2479 
2480 		dataItemCtx.Pop ();
2481 	}
2482 
GetDataItem()2483 	public object GetDataItem() {
2484 		if (dataItemCtx == null || dataItemCtx.Count == 0)
2485 			throw new InvalidOperationException ("No data item");
2486 
2487 		return dataItemCtx.Peek ();
2488 	}
2489 
AddStyleSheets(PageTheme theme, ref List <string> links)2490 	void AddStyleSheets (PageTheme theme, ref List <string> links)
2491 	{
2492 		if (theme == null)
2493 			return;
2494 
2495 		string[] tmpThemes = theme != null ? theme.GetStyleSheets () : null;
2496 		if (tmpThemes == null || tmpThemes.Length == 0)
2497 			return;
2498 
2499 		if (links == null)
2500 			links = new List <string> ();
2501 
2502 		links.AddRange (tmpThemes);
2503 	}
2504 
OnInit(EventArgs e)2505 	protected internal override void OnInit (EventArgs e)
2506 	{
2507 		base.OnInit (e);
2508 
2509 		List <string> themes = null;
2510 		AddStyleSheets (StyleSheetPageTheme, ref themes);
2511 		AddStyleSheets (PageTheme, ref themes);
2512 
2513 		if (themes == null)
2514 			return;
2515 
2516 		HtmlHead header = Header;
2517 		if (themes != null && header == null)
2518 			throw new InvalidOperationException ("Using themed css files requires a header control on the page.");
2519 
2520 		ControlCollection headerControls = header.Controls;
2521 		string lss;
2522 		for (int i = themes.Count - 1; i >= 0; i--) {
2523 			lss = themes [i];
2524 			HtmlLink hl = new HtmlLink ();
2525 			hl.Href = lss;
2526 			hl.Attributes["type"] = "text/css";
2527 			hl.Attributes["rel"] = "stylesheet";
2528 			headerControls.AddAt (0, hl);
2529 		}
2530 	}
2531 
2532 	[MonoDocumentationNote ("Not implemented.  Only used by .net aspx parser")]
2533 	[EditorBrowsable (EditorBrowsableState.Never)]
GetWrappedFileDependencies(string [] virtualFileDependencies)2534 	protected object GetWrappedFileDependencies (string [] virtualFileDependencies)
2535 	{
2536 		return virtualFileDependencies;
2537 	}
2538 
2539 	[MonoDocumentationNote ("Does nothing.  Used by .net aspx parser")]
InitializeCulture()2540 	protected virtual void InitializeCulture ()
2541 	{
2542 	}
2543 
2544 	[MonoDocumentationNote ("Does nothing. Used by .net aspx parser")]
2545 	[EditorBrowsable (EditorBrowsableState.Never)]
AddWrappedFileDependencies(object virtualFileDependencies)2546 	protected internal void AddWrappedFileDependencies (object virtualFileDependencies)
2547 	{
2548 	}
2549 }
2550 }
2551