Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / xsp / System / Web / UI / PageParserFilter.cs / 1 / PageParserFilter.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
* Abstract class implemented by objects that need to control the parsing of pages.
*
* Copyright (c) 2004 Microsoft Corporation
*/
namespace System.Web.UI {
using System.Globalization;
using System.Collections;
using System.Web.Configuration;
using System.Web.Compilation;
using System.Web.Util;
using System.Security.Permissions;
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Medium)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Medium)]
public abstract class PageParserFilter {
private VirtualPath _virtualPath;
protected string VirtualPath { get { return _virtualPath.VirtualPathString; } }
// The current line number being parsed
private TemplateParser _parser;
protected int Line { get { return _parser._lineNumber; } }
private int _numberOfControlsAllowed;
private int _currentControlCount;
private int _dependenciesAllowed;
private int _currentDependenciesCount;
private int _directDependenciesAllowed;
private int _currentDirectDependenciesCount;
// Create a PageParserFilter and initialize it
internal static PageParserFilter Create(PagesSection pagesConfig, VirtualPath virtualPath, TemplateParser parser) {
PageParserFilter pageParserFilter = pagesConfig.CreateControlTypeFilter();
if (pageParserFilter != null)
pageParserFilter.InitializeInternal(virtualPath, parser);
return pageParserFilter;
}
internal void InitializeInternal(VirtualPath virtualPath, TemplateParser parser) {
_parser = parser;
Debug.Assert(_virtualPath == null);
_virtualPath = virtualPath;
Initialize();
// Get the various limits we need to enforce
_numberOfControlsAllowed = NumberOfControlsAllowed;
// Add 1 to these two, because internally we count the file itself as a
// dependency, but we don't want this to be reflected to the PageParserFilter
// implementor (VSWhidbey 341708)
_dependenciesAllowed = TotalNumberOfDependenciesAllowed+1;
_directDependenciesAllowed = NumberOfDirectDependenciesAllowed+1;
}
// initialize the filter to be used for a specific page
protected virtual void Initialize() {
}
// Informs the filter that the parsing of the page is complete
public virtual void ParseComplete(ControlBuilder rootBuilder) {
Debug.Assert(_virtualPath != null);
}
// Allows the filter to return the compilation mode for the page.
// If it doesn't want to modify it, it can just return current.
public virtual CompilationMode GetCompilationMode(CompilationMode current) {
return current;
}
// Indicates whether code is allowed on the page. This method allows
// forbidding code even on pages that will be compiled (for perf)
public virtual bool AllowCode {
get {
return false;
}
}
// Is the control Type allowed for this page
internal bool AllowControlInternal(Type controlType, ControlBuilder builder) {
OnControlAdded();
return AllowControl(controlType, builder);
}
// Is the control Type allowed for this page
public virtual bool AllowControl(Type controlType, ControlBuilder builder) {
return false;
}
// Is this base type allowed for this page
public virtual bool AllowBaseType(Type baseType) {
return false;
}
internal bool AllowVirtualReference(CompilationSection compConfig, VirtualPath referenceVirtualPath) {
// Get the extension, and from it the type of the BuildProvider
string extension = referenceVirtualPath.Extension;
Type buildProviderType = CompilationUtil.GetBuildProviderTypeFromExtension(
compConfig, extension, BuildProviderAppliesTo.Web, false /*failIfUnknown*/);
// If it's an unknown type, block it
if (buildProviderType == null)
return false;
// Figure out the VirtualReferenceType based on the BuildProvider type
VirtualReferenceType referenceType;
if (buildProviderType == typeof(PageBuildProvider))
referenceType = VirtualReferenceType.Page;
else if (buildProviderType == typeof(UserControlBuildProvider))
referenceType = VirtualReferenceType.UserControl;
else if (buildProviderType == typeof(MasterPageBuildProvider))
referenceType = VirtualReferenceType.Master;
else if (buildProviderType == typeof(SourceFileBuildProvider))
referenceType = VirtualReferenceType.SourceFile;
else
referenceType = VirtualReferenceType.Other;
return AllowVirtualReference(referenceVirtualPath.VirtualPathString, referenceType);
}
// Is the virtual path reference allowed in this page. The referenceType
// indicates the type of references involved.
public virtual bool AllowVirtualReference(string referenceVirtualPath, VirtualReferenceType referenceType) {
return false;
}
// Is the passed in server include () allowed
public virtual bool AllowServerSideInclude(string includeVirtualPath) {
return false;
}
public virtual void PreprocessDirective(string directiveName, IDictionary attributes) { }
public virtual int NumberOfControlsAllowed {
get {
// By default, don't allow any
return 0;
}
}
public virtual int TotalNumberOfDependenciesAllowed {
get {
// By default, don't allow any
return 0;
}
}
public virtual int NumberOfDirectDependenciesAllowed {
get {
// By default, don't allow any
return 0;
}
}
private void OnControlAdded() {
// If it's negative, there is no limit
if (_numberOfControlsAllowed < 0)
return;
// Increase the control count
_currentControlCount++;
// Fail if the limit has been reached
if (_currentControlCount > _numberOfControlsAllowed) {
throw new HttpException(SR.GetString(
SR.Too_many_controls, _numberOfControlsAllowed.ToString(CultureInfo.CurrentCulture)));
}
}
// Called by the parser when a file dependency (direct or indirect) is added
internal void OnDependencyAdded() {
// If it's negative, there is no limit
if (_dependenciesAllowed <= 0)
return;
// Increase the dependency count
_currentDependenciesCount++;
// Fail if the limit has been reached
if (_currentDependenciesCount > _dependenciesAllowed) {
throw new HttpException(SR.GetString(
SR.Too_many_dependencies, VirtualPath,
_dependenciesAllowed.ToString(CultureInfo.CurrentCulture)));
}
}
// Called by the parser when a direct file dependency is added
internal void OnDirectDependencyAdded() {
// If it's negative, there is no limit
if (_directDependenciesAllowed <= 0)
return;
// Increase the direct dependency count
_currentDirectDependenciesCount++;
// Fail if the limit has been reached
if (_currentDirectDependenciesCount > _directDependenciesAllowed) {
throw new HttpException(SR.GetString(
SR.Too_many_direct_dependencies, VirtualPath,
_directDependenciesAllowed.ToString(CultureInfo.CurrentCulture)));
}
}
// Give the filter a chance to process a code block. If it returns true, the
// code block is not processed further by the parser
public virtual bool ProcessCodeConstruct(CodeConstructType codeType, string code) {
return false;
}
// Give the filter a chance to process a databinding attribute (e.g. Text=<%# expr %>)
// If it returns true, the databinding attribute is not processed further by the parser
public virtual bool ProcessDataBindingAttribute(string controlId, string name, string value) {
return false;
}
// Give the filter a chance to process an event hookup (e.g. onclick="ClickHandler")
// If it returns true, the event hookup is not processed further by the parser
public virtual bool ProcessEventHookup(string controlId, string eventName, string handlerName) {
return false;
}
// Return the Type that should be used for NoCompile user controls
public virtual Type GetNoCompileUserControlType() {
return null;
}
// Add a ControlBuilder in the tree at the current parser position
protected void AddControl(Type type, IDictionary attributes) {
_parser.AddControl(type, attributes);
}
// Set a property on the TemplateControl (Page/UserControl/Master)
protected void SetPageProperty(string filter, string name, string value) {
if (filter == null)
filter = String.Empty;
_parser.RootBuilder.PreprocessAttribute(filter, name, value, true /*mainDirectiveMode*/);
}
}
// The type of reference passed to PageParserFilter.AllowVirtualReference
public enum VirtualReferenceType {
Page,
UserControl,
Master,
SourceFile,
Other
}
// Used as parameter to the PageParserFilter.ProcessCodeConstruct API
public enum CodeConstructType {
CodeSnippet, // <% ... %>
ExpressionSnippet, // <%= ... %>
DataBindingSnippet, // <%# ... %>
ScriptTag //
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
* Abstract class implemented by objects that need to control the parsing of pages.
*
* Copyright (c) 2004 Microsoft Corporation
*/
namespace System.Web.UI {
using System.Globalization;
using System.Collections;
using System.Web.Configuration;
using System.Web.Compilation;
using System.Web.Util;
using System.Security.Permissions;
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Medium)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Medium)]
public abstract class PageParserFilter {
private VirtualPath _virtualPath;
protected string VirtualPath { get { return _virtualPath.VirtualPathString; } }
// The current line number being parsed
private TemplateParser _parser;
protected int Line { get { return _parser._lineNumber; } }
private int _numberOfControlsAllowed;
private int _currentControlCount;
private int _dependenciesAllowed;
private int _currentDependenciesCount;
private int _directDependenciesAllowed;
private int _currentDirectDependenciesCount;
// Create a PageParserFilter and initialize it
internal static PageParserFilter Create(PagesSection pagesConfig, VirtualPath virtualPath, TemplateParser parser) {
PageParserFilter pageParserFilter = pagesConfig.CreateControlTypeFilter();
if (pageParserFilter != null)
pageParserFilter.InitializeInternal(virtualPath, parser);
return pageParserFilter;
}
internal void InitializeInternal(VirtualPath virtualPath, TemplateParser parser) {
_parser = parser;
Debug.Assert(_virtualPath == null);
_virtualPath = virtualPath;
Initialize();
// Get the various limits we need to enforce
_numberOfControlsAllowed = NumberOfControlsAllowed;
// Add 1 to these two, because internally we count the file itself as a
// dependency, but we don't want this to be reflected to the PageParserFilter
// implementor (VSWhidbey 341708)
_dependenciesAllowed = TotalNumberOfDependenciesAllowed+1;
_directDependenciesAllowed = NumberOfDirectDependenciesAllowed+1;
}
// initialize the filter to be used for a specific page
protected virtual void Initialize() {
}
// Informs the filter that the parsing of the page is complete
public virtual void ParseComplete(ControlBuilder rootBuilder) {
Debug.Assert(_virtualPath != null);
}
// Allows the filter to return the compilation mode for the page.
// If it doesn't want to modify it, it can just return current.
public virtual CompilationMode GetCompilationMode(CompilationMode current) {
return current;
}
// Indicates whether code is allowed on the page. This method allows
// forbidding code even on pages that will be compiled (for perf)
public virtual bool AllowCode {
get {
return false;
}
}
// Is the control Type allowed for this page
internal bool AllowControlInternal(Type controlType, ControlBuilder builder) {
OnControlAdded();
return AllowControl(controlType, builder);
}
// Is the control Type allowed for this page
public virtual bool AllowControl(Type controlType, ControlBuilder builder) {
return false;
}
// Is this base type allowed for this page
public virtual bool AllowBaseType(Type baseType) {
return false;
}
internal bool AllowVirtualReference(CompilationSection compConfig, VirtualPath referenceVirtualPath) {
// Get the extension, and from it the type of the BuildProvider
string extension = referenceVirtualPath.Extension;
Type buildProviderType = CompilationUtil.GetBuildProviderTypeFromExtension(
compConfig, extension, BuildProviderAppliesTo.Web, false /*failIfUnknown*/);
// If it's an unknown type, block it
if (buildProviderType == null)
return false;
// Figure out the VirtualReferenceType based on the BuildProvider type
VirtualReferenceType referenceType;
if (buildProviderType == typeof(PageBuildProvider))
referenceType = VirtualReferenceType.Page;
else if (buildProviderType == typeof(UserControlBuildProvider))
referenceType = VirtualReferenceType.UserControl;
else if (buildProviderType == typeof(MasterPageBuildProvider))
referenceType = VirtualReferenceType.Master;
else if (buildProviderType == typeof(SourceFileBuildProvider))
referenceType = VirtualReferenceType.SourceFile;
else
referenceType = VirtualReferenceType.Other;
return AllowVirtualReference(referenceVirtualPath.VirtualPathString, referenceType);
}
// Is the virtual path reference allowed in this page. The referenceType
// indicates the type of references involved.
public virtual bool AllowVirtualReference(string referenceVirtualPath, VirtualReferenceType referenceType) {
return false;
}
// Is the passed in server include () allowed
public virtual bool AllowServerSideInclude(string includeVirtualPath) {
return false;
}
public virtual void PreprocessDirective(string directiveName, IDictionary attributes) { }
public virtual int NumberOfControlsAllowed {
get {
// By default, don't allow any
return 0;
}
}
public virtual int TotalNumberOfDependenciesAllowed {
get {
// By default, don't allow any
return 0;
}
}
public virtual int NumberOfDirectDependenciesAllowed {
get {
// By default, don't allow any
return 0;
}
}
private void OnControlAdded() {
// If it's negative, there is no limit
if (_numberOfControlsAllowed < 0)
return;
// Increase the control count
_currentControlCount++;
// Fail if the limit has been reached
if (_currentControlCount > _numberOfControlsAllowed) {
throw new HttpException(SR.GetString(
SR.Too_many_controls, _numberOfControlsAllowed.ToString(CultureInfo.CurrentCulture)));
}
}
// Called by the parser when a file dependency (direct or indirect) is added
internal void OnDependencyAdded() {
// If it's negative, there is no limit
if (_dependenciesAllowed <= 0)
return;
// Increase the dependency count
_currentDependenciesCount++;
// Fail if the limit has been reached
if (_currentDependenciesCount > _dependenciesAllowed) {
throw new HttpException(SR.GetString(
SR.Too_many_dependencies, VirtualPath,
_dependenciesAllowed.ToString(CultureInfo.CurrentCulture)));
}
}
// Called by the parser when a direct file dependency is added
internal void OnDirectDependencyAdded() {
// If it's negative, there is no limit
if (_directDependenciesAllowed <= 0)
return;
// Increase the direct dependency count
_currentDirectDependenciesCount++;
// Fail if the limit has been reached
if (_currentDirectDependenciesCount > _directDependenciesAllowed) {
throw new HttpException(SR.GetString(
SR.Too_many_direct_dependencies, VirtualPath,
_directDependenciesAllowed.ToString(CultureInfo.CurrentCulture)));
}
}
// Give the filter a chance to process a code block. If it returns true, the
// code block is not processed further by the parser
public virtual bool ProcessCodeConstruct(CodeConstructType codeType, string code) {
return false;
}
// Give the filter a chance to process a databinding attribute (e.g. Text=<%# expr %>)
// If it returns true, the databinding attribute is not processed further by the parser
public virtual bool ProcessDataBindingAttribute(string controlId, string name, string value) {
return false;
}
// Give the filter a chance to process an event hookup (e.g. onclick="ClickHandler")
// If it returns true, the event hookup is not processed further by the parser
public virtual bool ProcessEventHookup(string controlId, string eventName, string handlerName) {
return false;
}
// Return the Type that should be used for NoCompile user controls
public virtual Type GetNoCompileUserControlType() {
return null;
}
// Add a ControlBuilder in the tree at the current parser position
protected void AddControl(Type type, IDictionary attributes) {
_parser.AddControl(type, attributes);
}
// Set a property on the TemplateControl (Page/UserControl/Master)
protected void SetPageProperty(string filter, string name, string value) {
if (filter == null)
filter = String.Empty;
_parser.RootBuilder.PreprocessAttribute(filter, name, value, true /*mainDirectiveMode*/);
}
}
// The type of reference passed to PageParserFilter.AllowVirtualReference
public enum VirtualReferenceType {
Page,
UserControl,
Master,
SourceFile,
Other
}
// Used as parameter to the PageParserFilter.ProcessCodeConstruct API
public enum CodeConstructType {
CodeSnippet, // <% ... %>
ExpressionSnippet, // <%= ... %>
DataBindingSnippet, // <%# ... %>
ScriptTag //
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ConnectionStringSettings.cs
- SafeNativeMethodsMilCoreApi.cs
- Addressing.cs
- DbConnectionPoolIdentity.cs
- CreateRefExpr.cs
- IPGlobalProperties.cs
- InternalMappingException.cs
- XhtmlBasicTextViewAdapter.cs
- Calendar.cs
- DropShadowBitmapEffect.cs
- InstrumentationTracker.cs
- Style.cs
- LogExtent.cs
- ExpandableObjectConverter.cs
- DropShadowBitmapEffect.cs
- TriggerBase.cs
- ApplicationManager.cs
- LabelExpression.cs
- Utility.cs
- NavigationCommands.cs
- ChannelSinkStacks.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- XmlMembersMapping.cs
- EventHandlerList.cs
- ConfigurationProperty.cs
- _NestedMultipleAsyncResult.cs
- DrawingImage.cs
- SchemaNotation.cs
- _CookieModule.cs
- ListenerAdapterBase.cs
- TraceHandlerErrorFormatter.cs
- SqlDataSourceSelectingEventArgs.cs
- DbConnectionPoolCounters.cs
- ConsoleKeyInfo.cs
- Attributes.cs
- SQLMoneyStorage.cs
- XamlPointCollectionSerializer.cs
- Size.cs
- EnlistmentTraceIdentifier.cs
- PackagingUtilities.cs
- ComplexTypeEmitter.cs
- FragmentQueryKB.cs
- ItemChangedEventArgs.cs
- LongPath.cs
- EntityDataSourceDataSelectionPanel.cs
- CreateInstanceBinder.cs
- IndexingContentUnit.cs
- _NetRes.cs
- SourceFilter.cs
- TableItemStyle.cs
- SourceItem.cs
- HtmlTableRowCollection.cs
- ActivityCodeDomSerializationManager.cs
- TableLayoutPanel.cs
- XmlSchemaParticle.cs
- AvtEvent.cs
- ControlType.cs
- DiscardableAttribute.cs
- GetPolicyDetailsRequest.cs
- ResumeStoryboard.cs
- ToolStripRendererSwitcher.cs
- CursorConverter.cs
- ExcCanonicalXml.cs
- Int32AnimationUsingKeyFrames.cs
- LicenseProviderAttribute.cs
- TrackingRecordPreFilter.cs
- PanelStyle.cs
- BevelBitmapEffect.cs
- IfJoinedCondition.cs
- CodeDomExtensionMethods.cs
- BaseParser.cs
- RoleGroupCollection.cs
- PropertyIDSet.cs
- ReaderContextStackData.cs
- HyperLink.cs
- DispatchWrapper.cs
- DataSourceProvider.cs
- XamlPathDataSerializer.cs
- UIElementIsland.cs
- AudioLevelUpdatedEventArgs.cs
- Highlights.cs
- StringWriter.cs
- CompModSwitches.cs
- QilTernary.cs
- UserInitiatedNavigationPermission.cs
- OleDbConnectionInternal.cs
- PointConverter.cs
- ScrollBarRenderer.cs
- SequenceQuery.cs
- DbConnectionInternal.cs
- FederatedMessageSecurityOverHttp.cs
- XmlSchemaImport.cs
- Attributes.cs
- SqlDataSourceStatusEventArgs.cs
- URLIdentityPermission.cs
- FormsAuthenticationConfiguration.cs
- XmlConvert.cs
- CardSpaceException.cs
- TransformGroup.cs
- PresentationTraceSources.cs