|
//------------------------------------------------------------------------------
// <copyright file="HttpCapabilitiesBase.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
/*
* Base class for browser capabilities object: just a read-only dictionary
* holder that supports Init()
*
*
*/
namespace System.Web.Configuration {
using System.Collections;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Collections.Specialized;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Web.Compilation;
using System.Web.UI;
using System.Web.Util;
using System.Web.UI.Adapters;
using Debug=System.Web.Util.Debug;
/*
* Abstract base class for Capabilities
*/
public class HttpCapabilitiesBase : IFilterResolutionService {
#if !DONTUSEFACTORYGENERATOR
private static FactoryGenerator _controlAdapterFactoryGenerator;
private static Hashtable _controlAdapterFactoryTable;
private static object _staticLock = new object();
#endif // DONTUSEFACTORYGENERATOR
private static object s_nullAdapterSingleton = new object();
private bool _useOptimizedCacheKey = true;
private static object _emptyHttpCapabilitiesBaseLock = new object();
private static HttpCapabilitiesProvider _browserCapabilitiesProvider = null;
private static HttpCapabilitiesBase _emptyHttpCapabilitiesBase;
internal static HttpCapabilitiesBase EmptyHttpCapabilitiesBase {
get {
if (_emptyHttpCapabilitiesBase != null) {
return _emptyHttpCapabilitiesBase;
}
lock (_emptyHttpCapabilitiesBaseLock) {
if (_emptyHttpCapabilitiesBase != null) {
return _emptyHttpCapabilitiesBase;
}
_emptyHttpCapabilitiesBase = new HttpCapabilitiesBase();
}
return _emptyHttpCapabilitiesBase;
}
}
public static HttpCapabilitiesProvider BrowserCapabilitiesProvider {
get {
return _browserCapabilitiesProvider;
}
set {
_browserCapabilitiesProvider = value;
}
}
public bool UseOptimizedCacheKey {
get {
return _useOptimizedCacheKey;
}
}
public void DisableOptimizedCacheKey() {
_useOptimizedCacheKey = false;
}
//
// Public API for retrieving capabilities from config.
//
// Note that this API will return an empty HttpCapabilitiesBase
// if capabilties cannot be found.
//
[ConfigurationPermission(SecurityAction.Assert, Unrestricted = true)]
public static HttpCapabilitiesBase GetConfigCapabilities(string configKey, HttpRequest request) {
HttpCapabilitiesBase capabilities = null;
if (configKey == "system.web/browserCaps") {
// Use cached config for system.web/browserCaps
capabilities = GetBrowserCapabilities(request);
}
else {
//
// Slower code path to get capabilities from any section
// that implements System.Web.Configuration.HttpCapabilitiesSectionHandler.
// This code path will hit a demand for ConfigurationPermission.
//
HttpCapabilitiesDefaultProvider capsbuilder = (HttpCapabilitiesDefaultProvider) request.Context.GetSection(configKey);
if (capsbuilder != null) {
if (BrowserCapabilitiesProvider != null) {
capsbuilder.BrowserCapabilitiesProvider = BrowserCapabilitiesProvider;
}
if (capsbuilder.BrowserCapabilitiesProvider == null) {
capabilities = capsbuilder.Evaluate(request);
}
else {
capabilities = capsbuilder.BrowserCapabilitiesProvider.GetBrowserCapabilities(request);
}
}
}
if (capabilities == null) {
capabilities = EmptyHttpCapabilitiesBase;
}
return capabilities;
}
//
// Get browser capabilities from config that are stored at "system.web/browserCaps".
//
// This code path will use the cached config object and avoid the demand for ConfigurationPermission
// after the first request for config.
//
// Note: this API will return null if the section isn't found.
//
internal static HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request) {
HttpCapabilitiesBase capabilities = null;
// Get the config evaluator from the cached config object.
HttpCapabilitiesDefaultProvider capsbuilder = request.Context.IsRuntimeErrorReported ?
RuntimeConfig.GetLKGConfig(request.Context).BrowserCaps : RuntimeConfig.GetConfig(request.Context).BrowserCaps;
if (capsbuilder != null) {
if (BrowserCapabilitiesProvider != null) {
capsbuilder.BrowserCapabilitiesProvider = BrowserCapabilitiesProvider;
}
if (capsbuilder.BrowserCapabilitiesProvider == null) {
capabilities = capsbuilder.Evaluate(request);
}
else {
capabilities = capsbuilder.BrowserCapabilitiesProvider.GetBrowserCapabilities(request);
}
}
return (HttpBrowserCapabilities) capabilities;
}
/*
* A Capabilities object is just a read-only dictionary
*/
/// <devdoc>
/// <para>Allows access to individual dictionary values.</para>
/// </devdoc>
public virtual String this[String key] {
get {
return (String)_items[key];
}
}
public HtmlTextWriter CreateHtmlTextWriter(TextWriter w) {
string mtw = HtmlTextWriter;
if (mtw != null && mtw.Length != 0) {
HtmlTextWriter writer = null;
try {
Type writerType = BuildManager.GetType(mtw, true /* throwOnFail */, false /* ignoreCase */);
object[] arr = new object[1];
arr[0] = w;
writer = (HtmlTextWriter)Activator.CreateInstance(writerType, arr);
if (writer != null) {
return writer;
}
}
catch {
throw new Exception(SR.GetString(SR.Could_not_create_type_instance, mtw));
}
}
return CreateHtmlTextWriterInternal(w);
}
internal HtmlTextWriter CreateHtmlTextWriterInternal(TextWriter tw) {
Type tagWriter = TagWriter;
if (tagWriter != null) {
return Page.CreateHtmlTextWriterFromType(tw, tagWriter);
}
// Fall back to Html 3.2
return new Html32TextWriter(tw);
}
/*
* It provides an overridable Init method
*/
/// <internalonly/>
/// <devdoc>
/// </devdoc>
protected virtual void Init() {
}
/*
* The actual initializer sets up Item[] before calling Init()
*/
internal void InitInternal(HttpBrowserCapabilities browserCaps) {
if (_items != null) {
throw new ArgumentException(SR.GetString(SR.Caps_cannot_be_inited_twice));
}
_items = browserCaps._items;
_adapters = browserCaps._adapters;
_browsers = browserCaps._browsers;
_htmlTextWriter = browserCaps._htmlTextWriter;
_useOptimizedCacheKey = browserCaps._useOptimizedCacheKey;
Init();
}
internal ControlAdapter GetAdapter(System.Web.UI.Control control) {
if (_adapters == null || _adapters.Count == 0) {
return null;
}
if (control == null) {
return null;
}
//see if we have already cached the type;
Type controlType = control.GetType();
object o = AdapterTypes[controlType];
// Common desktop case: simply return null since we already tried to resolve the adapter.
if (object.ReferenceEquals(o, s_nullAdapterSingleton))
return null;
Type adapterType = (Type)o;
if (adapterType == null) {
Type tempControlType = controlType;
string controlTypename = null;
string adapterTypename = null;
while (adapterTypename == null && tempControlType != typeof(Control)) {
controlTypename = tempControlType.AssemblyQualifiedName;
adapterTypename = (string)Adapters[controlTypename];
if (adapterTypename == null) {
controlTypename = tempControlType.FullName;
adapterTypename = (string)Adapters[controlTypename];
}
if (adapterTypename != null) {
break;
}
tempControlType = tempControlType.BaseType;
}
// Remember it so that we do not walk the control hierarchy again.
if (String.IsNullOrEmpty(adapterTypename)) {
AdapterTypes[controlType] = s_nullAdapterSingleton;
return null;
}
//do not thrownOnFail or ignoreCase
adapterType = BuildManager.GetType(adapterTypename, false, false);
if (adapterType == null) {
throw new Exception(SR.GetString(SR.ControlAdapters_TypeNotFound, adapterTypename));
}
AdapterTypes[controlType] = adapterType;
}
#if DONTUSEFACTORYGENERATOR
ControlAdapter adapter = (ControlAdapter) HttpRuntime.CreatePublicInstance(adapterType);
#else
IWebObjectFactory factory = GetAdapterFactory(adapterType);
ControlAdapter adapter = (ControlAdapter)factory.CreateInstance();
#endif // DONTUSEFACTORYGENERATOR
adapter._control = control;
return adapter;
}
#if !DONTUSEFACTORYGENERATOR
private IWebObjectFactory GetAdapterFactory(Type adapterType) {
if (_controlAdapterFactoryGenerator == null) {
lock (_staticLock) {
if (_controlAdapterFactoryGenerator == null) {
_controlAdapterFactoryTable = new Hashtable();
_controlAdapterFactoryGenerator = new FactoryGenerator();
}
}
}
IWebObjectFactory factory = (IWebObjectFactory)_controlAdapterFactoryTable[adapterType];
if (factory == null) {
lock (_controlAdapterFactoryTable.SyncRoot) {
factory = (IWebObjectFactory)_controlAdapterFactoryTable[adapterType];
if (factory == null) {
try {
factory = _controlAdapterFactoryGenerator.CreateFactory(adapterType);
}
catch {
throw new Exception(SR.GetString(SR.Could_not_create_type_instance, adapterType.ToString()));
}
_controlAdapterFactoryTable[adapterType] = factory;
}
}
}
return factory;
}
#endif // DONTUSEFACTORYGENERATOR
public IDictionary Capabilities {
get {
return _items;
}
set {
_items = value;
}
}
public IDictionary Adapters {
get {
if (_adapters == null) {
lock (_staticLock) {
if (_adapters == null) {
_adapters = new Hashtable(StringComparer.OrdinalIgnoreCase);
}
}
}
return _adapters;
}
}
public string HtmlTextWriter {
get {
return _htmlTextWriter;
}
set {
_htmlTextWriter = value;
}
}
private Hashtable AdapterTypes {
get {
if (_adapterTypes == null) {
lock (_staticLock) {
if (_adapterTypes == null) {
_adapterTypes = Hashtable.Synchronized(new Hashtable());
}
}
}
return _adapterTypes;
}
}
public string Id {
get {
if (_browsers != null) {
return (string)_browsers[_browsers.Count - 1];
}
else return String.Empty;
}
}
public ArrayList Browsers {
get {
return _browsers;
}
}
Hashtable _adapterTypes;
private IDictionary _adapters;
private string _htmlTextWriter;
private IDictionary _items;
public Version ClrVersion {
get {
Version[] clrVersions = GetClrVersions();
if (clrVersions != null) {
return clrVersions[clrVersions.Length - 1];
}
return null;
}
}
public Version[] GetClrVersions() {
string ua = HttpCapabilitiesDefaultProvider.GetUserAgent(HttpContext.Current.Request);
if (String.IsNullOrEmpty(ua)) {
return null;
}
// Adding timeout for Regex in case of malicious UA string causing DoS
Regex regex = RegexUtil.CreateRegex("\\.NET CLR (?'clrVersion'[0-9\\.]*)", RegexOptions.None);
MatchCollection matches = regex.Matches(ua);
if (matches.Count == 0) {
return new Version[1] { new Version() };
}
ArrayList versionList = new ArrayList();
foreach (Match match in matches) {
try {
Version version = new Version(match.Groups["clrVersion"].Value);
versionList.Add(version);
}
catch (System.FormatException) {
//got imvalid version data
}
}
versionList.Sort();
return (Version[])versionList.ToArray(typeof(Version));
}
public string Type {
get {
if (!_havetype) {
_type = this["type"];
_havetype = true;
}
return _type;
}
}
public string Browser {
get {
if (!_havebrowser) {
_browser = this["browser"];
_havebrowser = true;
}
return _browser;
}
}
public string Version {
get {
if (!_haveversion) {
_version = this["version"];
_haveversion = true;
}
return _version;
}
}
public int MajorVersion {
get {
if (!_havemajorversion) {
try {
_majorversion = int.Parse(this["majorversion"], CultureInfo.InvariantCulture);
_havemajorversion = true;
}
catch (FormatException e) {
throw BuildParseError(e, "majorversion");
}
}
return _majorversion;
}
}
Exception BuildParseError(Exception e, string capsKey) {
string message = SR.GetString(SR.Invalid_string_from_browser_caps, e.Message, capsKey, this[capsKey]);
// to show ConfigurationException in stack trace
ConfigurationErrorsException configEx = new ConfigurationErrorsException(message, e);
// I want it to look like an unhandled exception
HttpUnhandledException httpUnhandledEx = new HttpUnhandledException(null, null);
// but show message from outer exception (it normally shows the inner-most)
httpUnhandledEx.SetFormatter(new UseLastUnhandledErrorFormatter(configEx));
return httpUnhandledEx;
}
bool CapsParseBoolDefault(string capsKey, bool defaultValue) {
string value = this[capsKey];
if (value == null) {
return defaultValue;
}
try {
return bool.Parse(value);
}
catch (FormatException) {
return defaultValue;
}
}
bool CapsParseBool(string capsKey) {
try {
return bool.Parse(this[capsKey]);
}
catch (FormatException e) {
throw BuildParseError(e, capsKey);
}
}
public string MinorVersionString {
get {
return this["minorversion"];
}
}
public double MinorVersion {
get {
if (!_haveminorversion) {
lock(_staticLock) {
if (!_haveminorversion)
{
try
{
// see ASURT 11176
_minorversion = double.Parse(
this["minorversion"],
NumberStyles.Float | NumberStyles.AllowDecimalPoint,
NumberFormatInfo.InvariantInfo);
_haveminorversion = true;
}
catch (FormatException e)
{
// Check if there's more than one decimal
// The only exception case we handle is of form .4.1, it becomes .4
string minor = this["minorversion"];
int firstDecimal = minor.IndexOf('.');
if (firstDecimal != -1)
{
int nextDecimal = minor.IndexOf('.', firstDecimal + 1);
if (nextDecimal != -1)
{
try
{
_minorversion = double.Parse(
minor.Substring(0, nextDecimal),
NumberStyles.Float | NumberStyles.AllowDecimalPoint,
NumberFormatInfo.InvariantInfo);
Thread.MemoryBarrier();
_haveminorversion = true;
}
catch (FormatException)
{
}
}
}
if (!_haveminorversion)
{
throw BuildParseError(e, "minorversion");
}
}
}
}
}
return _minorversion;
}
}
public string Platform {
get {
if (!_haveplatform) {
_platform = this["platform"];
_haveplatform = true;
}
return _platform;
}
}
public Type TagWriter {
get {
try {
if (!_havetagwriter) {
string tagWriter = this["tagwriter"];
if (String.IsNullOrEmpty(tagWriter)) {
_tagwriter = null;
}
else if (string.Compare(tagWriter, typeof(System.Web.UI.HtmlTextWriter).FullName, StringComparison.Ordinal) == 0) {
_tagwriter = typeof(System.Web.UI.HtmlTextWriter);
}
else {
_tagwriter = BuildManager.GetType(tagWriter, true /*throwOnError*/);
}
_havetagwriter = true;
}
}
catch (Exception e) {
throw BuildParseError(e, "tagwriter");
}
return _tagwriter;
}
}
public Version EcmaScriptVersion {
get {
if (!_haveecmascriptversion) {
_ecmascriptversion = new Version(this["ecmascriptversion"]);
_haveecmascriptversion = true;
}
return _ecmascriptversion;
}
}
public Version MSDomVersion {
get {
if (!_havemsdomversion) {
_msdomversion = new Version(this["msdomversion"]);
_havemsdomversion = true;
}
return _msdomversion;
}
}
public Version W3CDomVersion {
get {
if (!_havew3cdomversion) {
_w3cdomversion = new Version(this["w3cdomversion"]);
_havew3cdomversion = true;
}
return _w3cdomversion;
}
}
public bool Beta {
get {
if (!_havebeta) {
_beta = CapsParseBool("beta");
_havebeta = true;
}
return _beta;
}
}
public bool Crawler {
get {
if (!_havecrawler) {
_crawler = CapsParseBool("crawler");
_havecrawler = true;
}
return _crawler;
}
}
public bool AOL {
get {
if (!_haveaol) {
_aol = CapsParseBool("aol");
_haveaol = true;
}
return _aol;
}
}
public bool Win16 {
get {
if (!_havewin16) {
_win16 = CapsParseBool("win16");
_havewin16 = true;
}
return _win16;
}
}
public bool Win32 {
get {
if (!_havewin32) {
_win32 = CapsParseBool("win32");
_havewin32 = true;
}
return _win32;
}
}
public bool Frames {
get {
if (!_haveframes) {
_frames = CapsParseBool("frames");
_haveframes = true;
}
return _frames;
}
}
public bool RequiresControlStateInSession {
get {
if (!_haverequiresControlStateInSession) {
if (this["requiresControlStateInSession"] != null) {
_requiresControlStateInSession = CapsParseBoolDefault("requiresControlStateInSession", false);
}
_haverequiresControlStateInSession = true;
}
return _requiresControlStateInSession;
}
}
public bool Tables {
get {
if (!_havetables) {
_tables = CapsParseBool("tables");
_havetables = true;
}
return _tables;
}
}
public bool Cookies {
get {
if (!_havecookies) {
_cookies = CapsParseBool("cookies");
_havecookies = true;
}
return _cookies;
}
}
public bool VBScript {
get {
if (!_havevbscript) {
_vbscript = CapsParseBool("vbscript");
_havevbscript = true;
}
return _vbscript;
}
}
[Obsolete("The recommended alternative is the EcmaScriptVersion property. A Major version value greater than or equal to 1 implies JavaScript support. http://go.microsoft.com/fwlink/?linkid=14202")]
public bool JavaScript {
get {
if (!_havejavascript) {
_javascript = CapsParseBool("javascript");
_havejavascript = true;
}
return _javascript;
}
}
public bool JavaApplets {
get {
if (!_havejavaapplets) {
_javaapplets = CapsParseBool("javaapplets");
_havejavaapplets = true;
}
return _javaapplets;
}
}
public Version JScriptVersion {
get {
if (!_havejscriptversion) {
_jscriptversion = new Version(this["jscriptversion"]);
_havejscriptversion = true;
}
return _jscriptversion;
}
}
public bool ActiveXControls {
get {
if (!_haveactivexcontrols) {
_activexcontrols = CapsParseBool("activexcontrols");
_haveactivexcontrols = true;
}
return _activexcontrols;
}
}
public bool BackgroundSounds {
get {
if (!_havebackgroundsounds) {
_backgroundsounds = CapsParseBool("backgroundsounds");
_havebackgroundsounds = true;
}
return _backgroundsounds;
}
}
public bool CDF {
get {
if (!_havecdf) {
_cdf = CapsParseBool("cdf");
_havecdf = true;
}
return _cdf;
}
}
//previously in System.Web.Mobile
public virtual String MobileDeviceManufacturer {
get {
if (!_haveMobileDeviceManufacturer) {
_mobileDeviceManufacturer = this["mobileDeviceManufacturer"];
_haveMobileDeviceManufacturer = true;
}
return _mobileDeviceManufacturer;
}
}
public virtual String MobileDeviceModel {
get {
if (!_haveMobileDeviceModel) {
_mobileDeviceModel = this["mobileDeviceModel"];
_haveMobileDeviceModel = true;
}
return _mobileDeviceModel;
}
}
public virtual String GatewayVersion {
get {
if (!_haveGatewayVersion) {
_gatewayVersion = this["gatewayVersion"];
_haveGatewayVersion = true;
}
return _gatewayVersion;
}
}
public virtual int GatewayMajorVersion {
get {
if (!_haveGatewayMajorVersion) {
_gatewayMajorVersion = Convert.ToInt32(this["gatewayMajorVersion"], CultureInfo.InvariantCulture);
_haveGatewayMajorVersion = true;
}
return _gatewayMajorVersion;
}
}
public virtual double GatewayMinorVersion {
get {
if (!_haveGatewayMinorVersion) {
// The conversion below does not use Convert.ToDouble()
// because it depends on the current locale. So a german machine it would look for
// a comma as a seperator "1,5" where all user-agent strings use english
// decimal points "1.5". URT11176
//
_gatewayMinorVersion = double.Parse(
this["gatewayMinorVersion"],
NumberStyles.Float | NumberStyles.AllowDecimalPoint,
NumberFormatInfo.InvariantInfo);
_haveGatewayMinorVersion = true;
}
return _gatewayMinorVersion;
}
}
public virtual String PreferredRenderingType {
get {
if (!_havePreferredRenderingType) {
_preferredRenderingType = this["preferredRenderingType"];
_havePreferredRenderingType = true;
}
return _preferredRenderingType;
}
}
public virtual String PreferredRequestEncoding {
get {
if (!_havePreferredRequestEncoding) {
_preferredRequestEncoding = this["preferredRequestEncoding"];
Thread.MemoryBarrier();
_havePreferredRequestEncoding = true;
}
return _preferredRequestEncoding;
}
}
public virtual String PreferredResponseEncoding {
get {
if (!_havePreferredResponseEncoding) {
_preferredResponseEncoding = this["preferredResponseEncoding"];
_havePreferredResponseEncoding = true;
}
return _preferredResponseEncoding;
}
}
public virtual String PreferredRenderingMime {
get {
if (!_havePreferredRenderingMime) {
_preferredRenderingMime = this["preferredRenderingMime"];
_havePreferredRenderingMime = true;
}
return _preferredRenderingMime;
}
}
public virtual String PreferredImageMime {
get {
if (!_havePreferredImageMime) {
_preferredImageMime = this["preferredImageMime"];
_havePreferredImageMime = true;
}
return _preferredImageMime;
}
}
public virtual int ScreenCharactersWidth {
get {
if (!_haveScreenCharactersWidth) {
if (this["screenCharactersWidth"] == null) {
// calculate from best partial information
int screenPixelsWidthToUse = 640;
int characterWidthToUse = 8;
if (this["screenPixelsWidth"] != null && this["characterWidth"] != null) {
screenPixelsWidthToUse = Convert.ToInt32(this["screenPixelsWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = Convert.ToInt32(this["characterWidth"], CultureInfo.InvariantCulture);
}
else if (this["screenPixelsWidth"] != null) {
screenPixelsWidthToUse = Convert.ToInt32(this["screenPixelsWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = Convert.ToInt32(this["defaultCharacterWidth"], CultureInfo.InvariantCulture);
}
else if (this["characterWidth"] != null) {
screenPixelsWidthToUse = Convert.ToInt32(this["defaultScreenPixelsWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = Convert.ToInt32(this["characterWidth"], CultureInfo.InvariantCulture);
}
else if (this["defaultScreenCharactersWidth"] != null) {
screenPixelsWidthToUse = Convert.ToInt32(this["defaultScreenCharactersWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = 1;
}
_screenCharactersWidth = screenPixelsWidthToUse / characterWidthToUse;
}
else {
_screenCharactersWidth = Convert.ToInt32(this["screenCharactersWidth"], CultureInfo.InvariantCulture);
}
_haveScreenCharactersWidth = true;
}
return _screenCharactersWidth;
}
}
public virtual int ScreenCharactersHeight {
get {
if (!_haveScreenCharactersHeight) {
if (this["screenCharactersHeight"] == null) {
// calculate from best partial information
int screenPixelHeightToUse = 480;
int characterHeightToUse = 12;
if (this["screenPixelsHeight"] != null && this["characterHeight"] != null) {
screenPixelHeightToUse = Convert.ToInt32(this["screenPixelsHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = Convert.ToInt32(this["characterHeight"], CultureInfo.InvariantCulture);
}
else if (this["screenPixelsHeight"] != null) {
screenPixelHeightToUse = Convert.ToInt32(this["screenPixelsHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = Convert.ToInt32(this["defaultCharacterHeight"], CultureInfo.InvariantCulture);
}
else if (this["characterHeight"] != null) {
screenPixelHeightToUse = Convert.ToInt32(this["defaultScreenPixelsHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = Convert.ToInt32(this["characterHeight"], CultureInfo.InvariantCulture);
}
else if (this["defaultScreenCharactersHeight"] != null) {
screenPixelHeightToUse = Convert.ToInt32(this["defaultScreenCharactersHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = 1;
}
_screenCharactersHeight = screenPixelHeightToUse / characterHeightToUse;
}
else {
_screenCharactersHeight = Convert.ToInt32(this["screenCharactersHeight"], CultureInfo.InvariantCulture);
}
_haveScreenCharactersHeight = true;
}
return _screenCharactersHeight;
}
}
public virtual int ScreenPixelsWidth {
get {
if (!_haveScreenPixelsWidth) {
if (this["screenPixelsWidth"] == null) {
// calculate from best partial information
int screenCharactersWidthToUse = 80;
int characterWidthToUse = 8;
if (this["screenCharactersWidth"] != null && this["characterWidth"] != null) {
screenCharactersWidthToUse = Convert.ToInt32(this["screenCharactersWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = Convert.ToInt32(this["characterWidth"], CultureInfo.InvariantCulture);
}
else if (this["screenCharactersWidth"] != null) {
screenCharactersWidthToUse = Convert.ToInt32(this["screenCharactersWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = Convert.ToInt32(this["defaultCharacterWidth"], CultureInfo.InvariantCulture);
}
else if (this["characterWidth"] != null) {
screenCharactersWidthToUse = Convert.ToInt32(this["defaultScreenCharactersWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = Convert.ToInt32(this["characterWidth"], CultureInfo.InvariantCulture);
}
else if (this["defaultScreenPixelsWidth"] != null) {
screenCharactersWidthToUse = Convert.ToInt32(this["defaultScreenPixelsWidth"], CultureInfo.InvariantCulture);
characterWidthToUse = 1;
}
_screenPixelsWidth = screenCharactersWidthToUse * characterWidthToUse;
}
else {
_screenPixelsWidth = Convert.ToInt32(this["screenPixelsWidth"], CultureInfo.InvariantCulture);
}
_haveScreenPixelsWidth = true;
}
return _screenPixelsWidth;
}
}
public virtual int ScreenPixelsHeight {
get {
if (!_haveScreenPixelsHeight) {
if (this["screenPixelsHeight"] == null) {
int screenCharactersHeightToUse = 480 / 12;
int characterHeightToUse = 12;
if (this["screenCharactersHeight"] != null && this["characterHeight"] != null) {
screenCharactersHeightToUse = Convert.ToInt32(this["screenCharactersHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = Convert.ToInt32(this["characterHeight"], CultureInfo.InvariantCulture);
}
else if (this["screenCharactersHeight"] != null) {
screenCharactersHeightToUse = Convert.ToInt32(this["screenCharactersHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = Convert.ToInt32(this["defaultCharacterHeight"], CultureInfo.InvariantCulture);
}
else if (this["characterHeight"] != null) {
screenCharactersHeightToUse = Convert.ToInt32(this["defaultScreenCharactersHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = Convert.ToInt32(this["characterHeight"], CultureInfo.InvariantCulture);
}
else if (this["defaultScreenPixelsHeight"] != null) {
screenCharactersHeightToUse = Convert.ToInt32(this["defaultScreenPixelsHeight"], CultureInfo.InvariantCulture);
characterHeightToUse = 1;
}
_screenPixelsHeight = screenCharactersHeightToUse * characterHeightToUse;
}
else {
_screenPixelsHeight = Convert.ToInt32(this["screenPixelsHeight"], CultureInfo.InvariantCulture);
}
_haveScreenPixelsHeight = true;
}
return _screenPixelsHeight;
}
}
public virtual int ScreenBitDepth {
get {
if (!_haveScreenBitDepth) {
_screenBitDepth = Convert.ToInt32(this["screenBitDepth"], CultureInfo.InvariantCulture);
_haveScreenBitDepth = true;
}
return _screenBitDepth;
}
}
public virtual bool IsColor {
get {
if (!_haveIsColor) {
String isColorString = this["isColor"];
if (isColorString == null) {
_isColor = false;
}
else {
_isColor = Convert.ToBoolean(this["isColor"], CultureInfo.InvariantCulture);
}
_haveIsColor = true;
}
return _isColor;
}
}
public virtual String InputType {
get {
if (!_haveInputType) {
_inputType = this["inputType"];
_haveInputType = true;
}
return _inputType;
}
}
public virtual int NumberOfSoftkeys {
get {
if (!_haveNumberOfSoftkeys) {
_numberOfSoftkeys = Convert.ToInt32(this["numberOfSoftkeys"], CultureInfo.InvariantCulture);
_haveNumberOfSoftkeys = true;
}
return _numberOfSoftkeys;
}
}
public virtual int MaximumSoftkeyLabelLength {
get {
if (!_haveMaximumSoftkeyLabelLength) {
_maximumSoftkeyLabelLength = Convert.ToInt32(this["maximumSoftkeyLabelLength"], CultureInfo.InvariantCulture);
_haveMaximumSoftkeyLabelLength = true;
}
return _maximumSoftkeyLabelLength;
}
}
public virtual bool CanInitiateVoiceCall {
get {
if (!_haveCanInitiateVoiceCall) {
_canInitiateVoiceCall = CapsParseBoolDefault("canInitiateVoiceCall", false);
_haveCanInitiateVoiceCall = true;
}
return _canInitiateVoiceCall;
}
}
public virtual bool CanSendMail {
get {
if (!_haveCanSendMail) {
_canSendMail = CapsParseBoolDefault("canSendMail", true);
_haveCanSendMail = true;
}
return _canSendMail;
}
}
public virtual bool HasBackButton {
get {
if (!_haveHasBackButton) {
_hasBackButton = CapsParseBoolDefault("hasBackButton", true);
_haveHasBackButton = true;
}
return _hasBackButton;
}
}
public virtual bool RendersWmlDoAcceptsInline {
get {
if (!_haveRendersWmlDoAcceptsInline) {
_rendersWmlDoAcceptsInline = CapsParseBoolDefault("rendersWmlDoAcceptsInline", true);
_haveRendersWmlDoAcceptsInline = true;
}
return _rendersWmlDoAcceptsInline;
}
}
public virtual bool RendersWmlSelectsAsMenuCards {
get {
if (!_haveRendersWmlSelectsAsMenuCards) {
_rendersWmlSelectsAsMenuCards = CapsParseBoolDefault("rendersWmlSelectsAsMenuCards", false);
_haveRendersWmlSelectsAsMenuCards = true;
}
return _rendersWmlSelectsAsMenuCards;
}
}
public virtual bool RendersBreaksAfterWmlAnchor {
get {
if (!_haveRendersBreaksAfterWmlAnchor) {
_rendersBreaksAfterWmlAnchor = CapsParseBoolDefault("rendersBreaksAfterWmlAnchor", true);
_haveRendersBreaksAfterWmlAnchor = true;
}
return _rendersBreaksAfterWmlAnchor;
}
}
public virtual bool RendersBreaksAfterWmlInput {
get {
if (!_haveRendersBreaksAfterWmlInput) {
_rendersBreaksAfterWmlInput = CapsParseBoolDefault("rendersBreaksAfterWmlInput", true);
_haveRendersBreaksAfterWmlInput = true;
}
return _rendersBreaksAfterWmlInput;
}
}
public virtual bool RendersBreakBeforeWmlSelectAndInput {
get {
if (!_haveRendersBreakBeforeWmlSelectAndInput) {
_rendersBreakBeforeWmlSelectAndInput = CapsParseBoolDefault("rendersBreakBeforeWmlSelectAndInput", false);
_haveRendersBreakBeforeWmlSelectAndInput = true;
}
return _rendersBreakBeforeWmlSelectAndInput;
}
}
public virtual bool RequiresPhoneNumbersAsPlainText {
get {
if (!_haveRequiresPhoneNumbersAsPlainText) {
_requiresPhoneNumbersAsPlainText = CapsParseBoolDefault("requiresPhoneNumbersAsPlainText", false);
_haveRequiresPhoneNumbersAsPlainText = true;
}
return _requiresPhoneNumbersAsPlainText;
}
}
public virtual bool RequiresUrlEncodedPostfieldValues {
get {
if (!_haveRequiresUrlEncodedPostfieldValues) {
_requiresUrlEncodedPostfieldValues = CapsParseBoolDefault("requiresUrlEncodedPostfieldValues", true);
_haveRequiresUrlEncodedPostfieldValues = true;
}
return _requiresUrlEncodedPostfieldValues;
}
}
public virtual String RequiredMetaTagNameValue {
get {
if (!_haveRequiredMetaTagNameValue) {
String value = this["requiredMetaTagNameValue"];
if (!String.IsNullOrEmpty(value)) {
_requiredMetaTagNameValue = value;
}
else {
_requiredMetaTagNameValue = null;
}
_haveRequiredMetaTagNameValue = true;
}
return _requiredMetaTagNameValue;
}
}
public virtual bool RendersBreaksAfterHtmlLists {
get {
if (!_haveRendersBreaksAfterHtmlLists) {
_rendersBreaksAfterHtmlLists = CapsParseBoolDefault("rendersBreaksAfterHtmlLists", true);
_haveRendersBreaksAfterHtmlLists = true;
}
return _rendersBreaksAfterHtmlLists;
}
}
public virtual bool RequiresUniqueHtmlInputNames {
get {
if (!_haveRequiresUniqueHtmlInputNames) {
_requiresUniqueHtmlInputNames = CapsParseBoolDefault("requiresUniqueHtmlInputNames", false);
_haveRequiresUniqueHtmlInputNames = true;
}
return _requiresUniqueHtmlInputNames;
}
}
public virtual bool RequiresUniqueHtmlCheckboxNames {
get {
if (!_haveRequiresUniqueHtmlCheckboxNames) {
_requiresUniqueHtmlCheckboxNames = CapsParseBoolDefault("requiresUniqueHtmlCheckboxNames", false);
_haveRequiresUniqueHtmlCheckboxNames = true;
}
return _requiresUniqueHtmlCheckboxNames;
}
}
public virtual bool SupportsCss {
get {
if (!_haveSupportsCss) {
_supportsCss = CapsParseBoolDefault("supportsCss", false);
_haveSupportsCss = true;
}
return _supportsCss;
}
}
public virtual bool HidesRightAlignedMultiselectScrollbars {
get {
if (!_haveHidesRightAlignedMultiselectScrollbars) {
_hidesRightAlignedMultiselectScrollbars = CapsParseBoolDefault("hidesRightAlignedMultiselectScrollbars", false);
_haveHidesRightAlignedMultiselectScrollbars = true;
}
return _hidesRightAlignedMultiselectScrollbars;
}
}
public virtual bool IsMobileDevice {
get {
if (!_haveIsMobileDevice) {
_isMobileDevice = CapsParseBoolDefault("isMobileDevice", false);
_haveIsMobileDevice = true;
}
return _isMobileDevice;
}
}
public virtual bool RequiresAttributeColonSubstitution {
get {
if (!_haveRequiresAttributeColonSubstitution) {
_requiresAttributeColonSubstitution = CapsParseBoolDefault("requiresAttributeColonSubstitution", false);
_haveRequiresAttributeColonSubstitution = true;
}
return _requiresAttributeColonSubstitution;
}
}
public virtual bool CanRenderOneventAndPrevElementsTogether {
get {
if (!_haveCanRenderOneventAndPrevElementsTogether) {
_canRenderOneventAndPrevElementsTogether = CapsParseBoolDefault("canRenderOneventAndPrevElementsTogether", true);
_haveCanRenderOneventAndPrevElementsTogether = true;
}
return _canRenderOneventAndPrevElementsTogether;
}
}
public virtual bool CanRenderInputAndSelectElementsTogether {
get {
if (!_haveCanRenderInputAndSelectElementsTogether) {
_canRenderInputAndSelectElementsTogether = CapsParseBoolDefault("canRenderInputAndSelectElementsTogether", true);
_haveCanRenderInputAndSelectElementsTogether = true;
}
return _canRenderInputAndSelectElementsTogether;
}
}
public virtual bool CanRenderAfterInputOrSelectElement {
get {
if (!_haveCanRenderAfterInputOrSelectElement) {
_canRenderAfterInputOrSelectElement = CapsParseBoolDefault("canRenderAfterInputOrSelectElement", true);
_haveCanRenderAfterInputOrSelectElement = true;
}
return _canRenderAfterInputOrSelectElement;
}
}
public virtual bool CanRenderPostBackCards {
get {
if (!_haveCanRenderPostBackCards) {
_canRenderPostBackCards = CapsParseBoolDefault("canRenderPostBackCards", true);
_haveCanRenderPostBackCards = true;
}
return _canRenderPostBackCards;
}
}
public virtual bool CanRenderMixedSelects {
get {
if (!_haveCanRenderMixedSelects) {
_canRenderMixedSelects = CapsParseBoolDefault("canRenderMixedSelects", true);
_haveCanRenderMixedSelects = true;
}
return _canRenderMixedSelects;
}
}
public virtual bool CanCombineFormsInDeck {
get {
if (!_haveCanCombineFormsInDeck) {
_canCombineFormsInDeck = CapsParseBoolDefault("canCombineFormsInDeck", true);
_haveCanCombineFormsInDeck = true;
}
return _canCombineFormsInDeck;
}
}
public virtual bool CanRenderSetvarZeroWithMultiSelectionList {
get {
if (!_haveCanRenderSetvarZeroWithMultiSelectionList) {
_canRenderSetvarZeroWithMultiSelectionList = CapsParseBoolDefault("canRenderSetvarZeroWithMultiSelectionList", true);
_haveCanRenderSetvarZeroWithMultiSelectionList = true;
}
return _canRenderSetvarZeroWithMultiSelectionList;
}
}
public virtual bool SupportsImageSubmit {
get {
if (!_haveSupportsImageSubmit) {
_supportsImageSubmit = CapsParseBoolDefault("supportsImageSubmit", false);
_haveSupportsImageSubmit = true;
}
return _supportsImageSubmit;
}
}
public virtual bool RequiresUniqueFilePathSuffix {
get {
if (!_haveRequiresUniqueFilePathSuffix) {
_requiresUniqueFilePathSuffix = CapsParseBoolDefault("requiresUniqueFilePathSuffix", false);
_haveRequiresUniqueFilePathSuffix = true;
}
return _requiresUniqueFilePathSuffix;
}
}
public virtual bool RequiresNoBreakInFormatting {
get {
if (!_haveRequiresNoBreakInFormatting) {
_requiresNoBreakInFormatting = CapsParseBoolDefault("requiresNoBreakInFormatting", false);
_haveRequiresNoBreakInFormatting = true;
}
return _requiresNoBreakInFormatting;
}
}
public virtual bool RequiresLeadingPageBreak {
get {
if (!_haveRequiresLeadingPageBreak) {
_requiresLeadingPageBreak = CapsParseBoolDefault("requiresLeadingPageBreak", false);
_haveRequiresLeadingPageBreak = true;
}
return _requiresLeadingPageBreak;
}
}
public virtual bool SupportsSelectMultiple {
get {
if (!_haveSupportsSelectMultiple) {
_supportsSelectMultiple = CapsParseBoolDefault("supportsSelectMultiple", false);
_haveSupportsSelectMultiple = true;
}
return _supportsSelectMultiple;
}
}
public /*new*/ virtual bool SupportsBold {
get {
if (!_haveSupportsBold) {
_supportsBold = CapsParseBoolDefault("supportsBold", true);
_haveSupportsBold = true;
}
return _supportsBold;
}
}
public /*new*/ virtual bool SupportsItalic {
get {
if (!_haveSupportsItalic) {
_supportsItalic = CapsParseBoolDefault("supportsItalic", true);
_haveSupportsItalic = true;
}
return _supportsItalic;
}
}
public virtual bool SupportsFontSize {
get {
if (!_haveSupportsFontSize) {
_supportsFontSize = CapsParseBoolDefault("supportsFontSize", false);
_haveSupportsFontSize = true;
}
return _supportsFontSize;
}
}
public virtual bool SupportsFontName {
get {
if (!_haveSupportsFontName) {
_supportsFontName = CapsParseBoolDefault("supportsFontName", false);
_haveSupportsFontName = true;
}
return _supportsFontName;
}
}
public virtual bool SupportsFontColor {
get {
if (!_haveSupportsFontColor) {
_supportsFontColor = CapsParseBoolDefault("supportsFontColor", false);
_haveSupportsFontColor = true;
}
return _supportsFontColor;
}
}
public virtual bool SupportsBodyColor {
get {
if (!_haveSupportsBodyColor) {
_supportsBodyColor = CapsParseBoolDefault("supportsBodyColor", false);
_haveSupportsBodyColor = true;
}
return _supportsBodyColor;
}
}
public virtual bool SupportsDivAlign {
get {
if (!_haveSupportsDivAlign) {
_supportsDivAlign = CapsParseBoolDefault("supportsDivAlign", false);
_haveSupportsDivAlign = true;
}
return _supportsDivAlign;
}
}
public virtual bool SupportsDivNoWrap {
get {
if (!_haveSupportsDivNoWrap) {
_supportsDivNoWrap = CapsParseBoolDefault("supportsDivNoWrap", false);
_haveSupportsDivNoWrap = true;
}
return _supportsDivNoWrap;
}
}
internal bool SupportsMaintainScrollPositionOnPostback {
get {
if (!_haveSupportsMaintainScrollPositionOnPostback) {
_supportsMaintainScrollPositionOnPostback = CapsParseBoolDefault("supportsMaintainScrollPositionOnPostback", false);
_haveSupportsMaintainScrollPositionOnPostback = true;
}
return _supportsMaintainScrollPositionOnPostback;
}
}
public virtual bool RequiresContentTypeMetaTag {
get {
if (!_haveRequiresContentTypeMetaTag) {
_requiresContentTypeMetaTag = CapsParseBoolDefault("requiresContentTypeMetaTag", false);
_haveRequiresContentTypeMetaTag = true;
}
return _requiresContentTypeMetaTag;
}
}
public virtual bool RequiresDBCSCharacter {
get {
if (!_haveRequiresDBCSCharacter) {
_requiresDBCSCharacter = CapsParseBoolDefault("requiresDBCSCharacter", false);
_haveRequiresDBCSCharacter = true;
}
return _requiresDBCSCharacter;
}
}
public virtual bool RequiresHtmlAdaptiveErrorReporting {
get {
if (!_haveRequiresHtmlAdaptiveErrorReporting) {
_requiresHtmlAdaptiveErrorReporting = CapsParseBoolDefault("requiresHtmlAdaptiveErrorReporting", false);
_haveRequiresHtmlAdaptiveErrorReporting = true;
}
return _requiresHtmlAdaptiveErrorReporting;
}
}
public virtual bool RequiresOutputOptimization {
get {
if (!_haveRequiresOutputOptimization) {
_requiresOutputOptimization = CapsParseBoolDefault("requiresOutputOptimization", false);
_haveRequiresOutputOptimization = true;
}
return _requiresOutputOptimization;
}
}
public virtual bool SupportsAccesskeyAttribute {
get {
if (!_haveSupportsAccesskeyAttribute) {
_supportsAccesskeyAttribute = CapsParseBoolDefault("supportsAccesskeyAttribute", false);
_haveSupportsAccesskeyAttribute = true;
}
return _supportsAccesskeyAttribute;
}
}
public virtual bool SupportsInputIStyle {
get {
if (!_haveSupportsInputIStyle) {
_supportsInputIStyle = CapsParseBoolDefault("supportsInputIStyle", false);
_haveSupportsInputIStyle = true;
}
return _supportsInputIStyle;
}
}
public virtual bool SupportsInputMode {
get {
if (!_haveSupportsInputMode) {
_supportsInputMode = CapsParseBoolDefault("supportsInputMode", false);
_haveSupportsInputMode = true;
}
return _supportsInputMode;
}
}
public virtual bool SupportsIModeSymbols {
get {
if (!_haveSupportsIModeSymbols) {
_supportsIModeSymbols = CapsParseBoolDefault("supportsIModeSymbols", false);
_haveSupportsIModeSymbols = true;
}
return _supportsIModeSymbols;
}
}
public virtual bool SupportsJPhoneSymbols {
get {
if (!_haveSupportsJPhoneSymbols) {
_supportsJPhoneSymbols = CapsParseBoolDefault("supportsJPhoneSymbols", false);
_haveSupportsJPhoneSymbols = true;
}
return _supportsJPhoneSymbols;
}
}
public virtual bool SupportsJPhoneMultiMediaAttributes {
get {
if (!_haveSupportsJPhoneMultiMediaAttributes) {
_supportsJPhoneMultiMediaAttributes = CapsParseBoolDefault("supportsJPhoneMultiMediaAttributes", false);
_haveSupportsJPhoneMultiMediaAttributes = true;
}
return _supportsJPhoneMultiMediaAttributes;
}
}
public virtual int MaximumRenderedPageSize {
get {
if (!_haveMaximumRenderedPageSize) {
_maximumRenderedPageSize = Convert.ToInt32(this["maximumRenderedPageSize"], CultureInfo.InvariantCulture);
_haveMaximumRenderedPageSize = true;
}
return _maximumRenderedPageSize;
}
}
public virtual bool RequiresSpecialViewStateEncoding {
get {
if (!_haveRequiresSpecialViewStateEncoding) {
_requiresSpecialViewStateEncoding = CapsParseBoolDefault("requiresSpecialViewStateEncoding", false);
_haveRequiresSpecialViewStateEncoding = true;
}
return _requiresSpecialViewStateEncoding;
}
}
public virtual bool SupportsQueryStringInFormAction {
get {
if (!_haveSupportsQueryStringInFormAction) {
_supportsQueryStringInFormAction = CapsParseBoolDefault("supportsQueryStringInFormAction", true);
_haveSupportsQueryStringInFormAction = true;
}
return _supportsQueryStringInFormAction;
}
}
public virtual bool SupportsCacheControlMetaTag {
get {
if (!_haveSupportsCacheControlMetaTag) {
_supportsCacheControlMetaTag = CapsParseBoolDefault("supportsCacheControlMetaTag", true);
_haveSupportsCacheControlMetaTag = true;
}
return _supportsCacheControlMetaTag;
}
}
public virtual bool SupportsUncheck {
get {
if (!_haveSupportsUncheck) {
_supportsUncheck = CapsParseBoolDefault("supportsUncheck", true);
_haveSupportsUncheck = true;
}
return _supportsUncheck;
}
}
public virtual bool CanRenderEmptySelects {
get {
if (!_haveCanRenderEmptySelects) {
_canRenderEmptySelects = CapsParseBoolDefault("canRenderEmptySelects", true);
_haveCanRenderEmptySelects = true;
}
return _canRenderEmptySelects;
}
}
public virtual bool SupportsRedirectWithCookie {
get {
if (!_haveSupportsRedirectWithCookie) {
_supportsRedirectWithCookie = CapsParseBoolDefault("supportsRedirectWithCookie", true);
_haveSupportsRedirectWithCookie = true;
}
return _supportsRedirectWithCookie;
}
}
public virtual bool SupportsEmptyStringInCookieValue {
get {
if (!_haveSupportsEmptyStringInCookieValue) {
_supportsEmptyStringInCookieValue = CapsParseBoolDefault("supportsEmptyStringInCookieValue", true);
_haveSupportsEmptyStringInCookieValue = true;
}
return _supportsEmptyStringInCookieValue;
}
}
public virtual int DefaultSubmitButtonLimit {
get {
if (!_haveDefaultSubmitButtonLimit) {
String s = this["defaultSubmitButtonLimit"];
_defaultSubmitButtonLimit = s != null ? Convert.ToInt32(this["defaultSubmitButtonLimit"], CultureInfo.InvariantCulture) : 1;
_haveDefaultSubmitButtonLimit = true;
}
return _defaultSubmitButtonLimit;
}
}
public virtual bool SupportsXmlHttp {
get {
if (!_haveSupportsXmlHttp) {
_supportsXmlHttp = CapsParseBoolDefault("supportsXmlHttp", false);
_haveSupportsXmlHttp = true;
}
return _supportsXmlHttp;
}
}
public virtual bool SupportsCallback {
get {
if (!_haveSupportsCallback) {
_supportsCallback = CapsParseBoolDefault("supportsCallback", false);
_haveSupportsCallback = true;
}
return _supportsCallback;
}
}
public virtual int MaximumHrefLength {
get {
if (!_haveMaximumHrefLength) {
_maximumHrefLength = Convert.ToInt32(this["maximumHrefLength"], CultureInfo.InvariantCulture);
_haveMaximumHrefLength = true;
}
return _maximumHrefLength;
}
}
public bool IsBrowser(string browserName) {
if (String.IsNullOrEmpty(browserName)) {
return false;
}
if (_browsers == null) {
return false;
}
for (int i = 0; i < _browsers.Count; i++) {
if (String.Equals(browserName, (string)_browsers[i], StringComparison.OrdinalIgnoreCase)) {
return true;
}
}
return false;
}
public void AddBrowser(string browserName) {
if (_browsers == null) {
lock (_staticLock) {
if (_browsers == null) {
_browsers = new ArrayList(6);
}
}
}
_browsers.Add(browserName.ToLower(CultureInfo.InvariantCulture));
}
private ArrayList _browsers;
volatile private string _type;
volatile private string _browser;
volatile private string _version;
volatile private int _majorversion;
private double _minorversion;
volatile private string _platform;
volatile private Type _tagwriter;
volatile private Version _ecmascriptversion;
volatile private Version _jscriptversion;
volatile private Version _msdomversion;
volatile private Version _w3cdomversion;
volatile private bool _beta;
volatile private bool _crawler;
volatile private bool _aol;
volatile private bool _win16;
volatile private bool _win32;
volatile private bool _requiresControlStateInSession;
volatile private bool _frames;
//private bool _supportsbold;
//private bool _supportsitalic;
volatile private bool _tables;
volatile private bool _cookies;
volatile private bool _vbscript;
volatile private bool _javascript;
volatile private bool _javaapplets;
volatile private bool _activexcontrols;
volatile private bool _backgroundsounds;
volatile private bool _cdf;
volatile private bool _havetype;
volatile private bool _havebrowser;
volatile private bool _haveversion;
volatile private bool _havemajorversion;
volatile private bool _haveminorversion;
volatile private bool _haveplatform;
volatile private bool _havetagwriter;
volatile private bool _haveecmascriptversion;
volatile private bool _havemsdomversion;
volatile private bool _havew3cdomversion;
volatile private bool _havebeta;
volatile private bool _havecrawler;
volatile private bool _haveaol;
volatile private bool _havewin16;
volatile private bool _havewin32;
volatile private bool _haveframes;
volatile private bool _haverequiresControlStateInSession;
//private bool _havesupportsbold;
//private bool _havesupportsitalic;
volatile private bool _havetables;
volatile private bool _havecookies;
volatile private bool _havevbscript;
volatile private bool _havejavascript;
volatile private bool _havejavaapplets;
volatile private bool _haveactivexcontrols;
volatile private bool _havebackgroundsounds;
volatile private bool _havecdf;
//previously in System.Web.Mobile
volatile private String _mobileDeviceManufacturer;
volatile private String _mobileDeviceModel;
volatile private String _gatewayVersion;
volatile private int _gatewayMajorVersion;
private double _gatewayMinorVersion;
volatile private String _preferredRenderingType; //
volatile private String _preferredRenderingMime;
volatile private String _preferredImageMime;
volatile private String _requiredMetaTagNameValue;
volatile private String _preferredRequestEncoding;
volatile private String _preferredResponseEncoding;
volatile private int _screenCharactersWidth;
volatile private int _screenCharactersHeight;
volatile private int _screenPixelsWidth;
volatile private int _screenPixelsHeight;
volatile private int _screenBitDepth;
volatile private bool _isColor;
volatile private String _inputType;
volatile private int _numberOfSoftkeys;
volatile private int _maximumSoftkeyLabelLength;
volatile private bool _canInitiateVoiceCall;
volatile private bool _canSendMail;
volatile private bool _hasBackButton;
volatile private bool _rendersWmlDoAcceptsInline;
volatile private bool _rendersWmlSelectsAsMenuCards;
volatile private bool _rendersBreaksAfterWmlAnchor;
volatile private bool _rendersBreaksAfterWmlInput;
volatile private bool _rendersBreakBeforeWmlSelectAndInput;
volatile private bool _requiresPhoneNumbersAsPlainText;
volatile private bool _requiresAttributeColonSubstitution;
volatile private bool _requiresUrlEncodedPostfieldValues;
volatile private bool _rendersBreaksAfterHtmlLists;
volatile private bool _requiresUniqueHtmlCheckboxNames;
volatile private bool _requiresUniqueHtmlInputNames;
volatile private bool _supportsCss;
volatile private bool _hidesRightAlignedMultiselectScrollbars;
volatile private bool _isMobileDevice;
volatile private bool _canRenderOneventAndPrevElementsTogether;
volatile private bool _canRenderInputAndSelectElementsTogether;
volatile private bool _canRenderAfterInputOrSelectElement;
volatile private bool _canRenderPostBackCards;
volatile private bool _canRenderMixedSelects;
volatile private bool _canCombineFormsInDeck;
volatile private bool _canRenderSetvarZeroWithMultiSelectionList;
volatile private bool _supportsImageSubmit;
volatile private bool _requiresUniqueFilePathSuffix;
volatile private bool _requiresNoBreakInFormatting;
volatile private bool _requiresLeadingPageBreak;
volatile private bool _supportsSelectMultiple;
volatile private bool _supportsBold;
volatile private bool _supportsItalic;
volatile private bool _supportsFontSize;
volatile private bool _supportsFontName;
volatile private bool _supportsFontColor;
volatile private bool _supportsBodyColor;
volatile private bool _supportsDivAlign;
volatile private bool _supportsDivNoWrap;
volatile private bool _requiresHtmlAdaptiveErrorReporting;
volatile private bool _requiresContentTypeMetaTag;
volatile private bool _requiresDBCSCharacter;
volatile private bool _requiresOutputOptimization;
volatile private bool _supportsAccesskeyAttribute;
volatile private bool _supportsInputIStyle;
volatile private bool _supportsInputMode;
volatile private bool _supportsIModeSymbols;
volatile private bool _supportsJPhoneSymbols;
volatile private bool _supportsJPhoneMultiMediaAttributes;
volatile private int _maximumRenderedPageSize;
volatile private bool _requiresSpecialViewStateEncoding;
volatile private bool _supportsQueryStringInFormAction;
volatile private bool _supportsCacheControlMetaTag;
volatile private bool _supportsUncheck;
volatile private bool _canRenderEmptySelects;
volatile private bool _supportsRedirectWithCookie;
volatile private bool _supportsEmptyStringInCookieValue;
volatile private int _defaultSubmitButtonLimit;
volatile private bool _supportsXmlHttp;
volatile private bool _supportsCallback;
volatile private bool _supportsMaintainScrollPositionOnPostback;
volatile private int _maximumHrefLength;
volatile private bool _haveMobileDeviceManufacturer;
volatile private bool _haveMobileDeviceModel;
volatile private bool _haveGatewayVersion;
volatile private bool _haveGatewayMajorVersion;
volatile private bool _haveGatewayMinorVersion;
volatile private bool _havePreferredRenderingType;
volatile private bool _havePreferredRenderingMime;
volatile private bool _havePreferredImageMime;
volatile private bool _havePreferredRequestEncoding;
volatile private bool _havePreferredResponseEncoding;
volatile private bool _haveScreenCharactersWidth;
volatile private bool _haveScreenCharactersHeight;
volatile private bool _haveScreenPixelsWidth;
volatile private bool _haveScreenPixelsHeight;
volatile private bool _haveScreenBitDepth;
volatile private bool _haveIsColor;
volatile private bool _haveInputType;
volatile private bool _haveNumberOfSoftkeys;
volatile private bool _haveMaximumSoftkeyLabelLength;
volatile private bool _haveCanInitiateVoiceCall;
volatile private bool _haveCanSendMail;
volatile private bool _haveHasBackButton;
volatile private bool _haveRendersWmlDoAcceptsInline;
volatile private bool _haveRendersWmlSelectsAsMenuCards;
volatile private bool _haveRendersBreaksAfterWmlAnchor;
volatile private bool _haveRendersBreaksAfterWmlInput;
volatile private bool _haveRendersBreakBeforeWmlSelectAndInput;
volatile private bool _haveRequiresPhoneNumbersAsPlainText;
volatile private bool _haveRequiresUrlEncodedPostfieldValues;
volatile private bool _haveRequiredMetaTagNameValue;
volatile private bool _haveRendersBreaksAfterHtmlLists;
volatile private bool _haveRequiresUniqueHtmlCheckboxNames;
volatile private bool _haveRequiresUniqueHtmlInputNames;
volatile private bool _haveSupportsCss;
volatile private bool _haveHidesRightAlignedMultiselectScrollbars;
volatile private bool _haveIsMobileDevice;
volatile private bool _haveCanRenderOneventAndPrevElementsTogether;
volatile private bool _haveCanRenderInputAndSelectElementsTogether;
volatile private bool _haveCanRenderAfterInputOrSelectElement;
volatile private bool _haveCanRenderPostBackCards;
volatile private bool _haveCanCombineFormsInDeck;
volatile private bool _haveCanRenderMixedSelects;
volatile private bool _haveCanRenderSetvarZeroWithMultiSelectionList;
volatile private bool _haveSupportsImageSubmit;
volatile private bool _haveRequiresUniqueFilePathSuffix;
volatile private bool _haveRequiresNoBreakInFormatting;
volatile private bool _haveRequiresLeadingPageBreak;
volatile private bool _haveSupportsSelectMultiple;
volatile private bool _haveRequiresAttributeColonSubstitution;
volatile private bool _haveRequiresHtmlAdaptiveErrorReporting;
volatile private bool _haveRequiresContentTypeMetaTag;
volatile private bool _haveRequiresDBCSCharacter;
volatile private bool _haveRequiresOutputOptimization;
volatile private bool _haveSupportsAccesskeyAttribute;
volatile private bool _haveSupportsInputIStyle;
volatile private bool _haveSupportsInputMode;
volatile private bool _haveSupportsIModeSymbols;
volatile private bool _haveSupportsJPhoneSymbols;
volatile private bool _haveSupportsJPhoneMultiMediaAttributes;
volatile private bool _haveSupportsRedirectWithCookie;
volatile private bool _haveSupportsEmptyStringInCookieValue = false;
volatile private bool _haveSupportsBold;
volatile private bool _haveSupportsItalic;
volatile private bool _haveSupportsFontSize;
volatile private bool _haveSupportsFontName;
volatile private bool _haveSupportsFontColor;
volatile private bool _haveSupportsBodyColor;
volatile private bool _haveSupportsDivAlign;
volatile private bool _haveSupportsDivNoWrap;
volatile private bool _haveMaximumRenderedPageSize;
volatile private bool _haveRequiresSpecialViewStateEncoding;
volatile private bool _haveSupportsQueryStringInFormAction;
volatile private bool _haveSupportsCacheControlMetaTag;
volatile private bool _haveSupportsUncheck;
volatile private bool _haveCanRenderEmptySelects;
volatile private bool _haveDefaultSubmitButtonLimit;
volatile private bool _haveSupportsXmlHttp;
volatile private bool _haveSupportsCallback;
volatile private bool _haveSupportsMaintainScrollPositionOnPostback;
volatile private bool _haveMaximumHrefLength;
volatile private bool _havejscriptversion;
#region IFilterResolutionService implementation
/// <internalonly/>
bool IFilterResolutionService.EvaluateFilter(string filterName) {
return IsBrowser(filterName);
}
/// <internalonly/>
int IFilterResolutionService.CompareFilters(string filter1, string filter2) {
return BrowserCapabilitiesCompiler.BrowserCapabilitiesFactory.CompareFilters(filter1, filter2);
}
#endregion
}
}
|