I needed the ability to do a few extra things with a `WebBrowser` control on a .NET Windows Forms Form, and I found it needed some updates. So, I made a few. I added some JavaScript manipulation, and a configuration class so that it can be tweaked a lot. I wanted to be able to add and execute arbitrary JavaScript, as well as change how it acts. (By default, it works in Internet Explorer 7 mode, which is dumb. So I figured I would implement all the Feature Control items as well as this change.) Without further ado: /// <summary> /// Extends the <code>System.Windows.Forms.WebBrowser</code> and adds the IsClosing event, as well as some JavaScript manipulation. It also adds some configuration that can be used to customize the operation of the control. /// </summary> public class ExtendedWebBrowser : WebBrowser { private const int WM_PARENTNOTIFY = 528; private const int WM_DESTROY = 2; /// <summary> /// This event is called anytime the WebBrowser is set to destroy itself, including Javascript window.close() calls. /// </summary> public event EventHandler<EventArgs> IsClosing; /// <summary> /// Overrides the default <see cref="ExtendedWebBrowser.WndProc(Message)"/> method. /// </summary> /// <param name="m">The <code>System.Windows.Forms.Message</code> being sent to the control.</param> protected override void WndProc(ref Message m) { if (m.Msg == WM_PARENTNOTIFY) { if (!DesignMode && m.WParam.ToInt32() == WM_DESTROY) { IsClosing(this, new EventArgs()); } DefWndProc(ref m); } else { base.WndProc(ref m); } } /// <summary> /// Injects some JavaScript to the <see cref="ExtendedWebBrowser"/>. /// </summary> /// <param name="javaScript">The code to inject.</param> /// <param name="name">The name of the script.</param> public HtmlElement InjectScript(string javaScript, string name) { var head = Document.GetElementsByTagName("head")[0]; var scriptElement = Document.CreateElement("script"); scriptElement.Name = name; scriptElement.SetAttribute("text", javaScript); head.AppendChild(scriptElement); return scriptElement; } /// <summary> /// Executes a JavaScript method in the <see cref="ExtendedWebBrowser"/>. /// </summary> /// <param name="scriptName">The name of the method to invoke.</param> /// <param name="args">The arguments to pass to the method.</param> public void ExecuteScript(string scriptName, params object[] args) { Document.InvokeScript(scriptName, args); } /// <summary> /// Executes arbitrary JavaScript code. /// </summary> /// <param name="script">The code to invoke.</param> /// <remarks> /// This creates an element with the name <code>arbitrary-script</code> with a javascript method called <code>arbitraryScript</code>. If a method with this name is present in the document, this method may not have the desired effect. If an element with the aforementioned name is present, it will be altered. /// </remarks> public void ExecuteArbitraryJavaScript(string script) { var arbitraryScript = Document.GetElementById("arbitrary-script"); if (arbitraryScript == null) { arbitraryScript = InjectScript("function arbitraryScript() { " + script + " }", "arbitrary-script"); } else { arbitraryScript.SetAttribute("text", "function arbitraryScript() { " + script + " }"); } ExecuteScript("arbitraryScript"); arbitraryScript.SetAttribute("text", ""); } private void SetDWordKey(string baseKey, string name, uint value) { using (var key = Registry.CurrentUser.CreateSubKey(baseKey, RegistryKeyPermissionCheck.ReadWriteSubTree)) { key.SetValue(name, value, RegistryValueKind.DWord); } } /// <summary> /// Initializes the <see cref="ExtendedWebBrowser"/> with the provided configuration. /// </summary> /// <param name="config">The <see cref="ExtendedWebBrowserConfiguration"/> to update the registry with.</param> /// <remarks> /// This method will update the registry values of all properties with the <see cref="FeatureControlAttribute"/> on them, of the specified key to the provided value in the configuration object. /// /// See: http://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx for more information on Feature Controls. /// </remarks> public void Initialize(ExtendedWebBrowserConfiguration config) { var name = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); if (name.ToLower() == "devenv.exe" || name.ToLower() == "xdesproc.exe") { return; } foreach (var prop in config.GetType().GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(FeatureControlAttribute)))) { var attribute = (FeatureControlAttribute)prop.GetCustomAttributes(typeof(FeatureControlAttribute), true)[0]; var rawValue = prop.GetValue(config); var cleanValue = 0u; if (rawValue is bool) { cleanValue = (bool)rawValue ? 1u : 0u; } else { cleanValue = (uint)rawValue; } SetDWordKey(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\" + attribute.Key, name, cleanValue); } } } The configuration class: public class ExtendedWebBrowserConfiguration { private int _emulationVersion; public int EmulationVersion { get { return _emulationVersion; } set { if (value >= 7 && value <= 11) { _emulationVersion = value; return; } throw new ArgumentException("The provided value is invalid. Valid versions are values from 7 through 11."); } } /// <summary> /// FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7 /// </summary> [FeatureControl("FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7")] public bool AboutProtocolRestriction { get; set; } /// <summary> /// FEATURE_SAFE_BINDTOOBJECT /// </summary> [FeatureControl("FEATURE_SAFE_BINDTOOBJECT")] public bool ActiveXBindingSafetyChecks { get; set; } /// <summary> /// FEATURE_OBJECT_CACHING /// </summary> [FeatureControl("FEATURE_OBJECT_CACHING")] public bool ActiveXObjectCaching { get; set; } /// <summary> /// FEATURE_RESTRICT_ACTIVEXINSTALL /// </summary> [FeatureControl("FEATURE_RESTRICT_ACTIVEXINSTALL")] public bool ActiveXUpdateRestriction { get; set; } /// <summary> /// FEATURE_FORCE_ADDR_AND_STATUS /// </summary> [FeatureControl("FEATURE_FORCE_ADDR_AND_STATUS")] public bool AddressAndStatusBarDisplay { get; set; } /// <summary> /// FEATURE_AJAX_CONNECTIONEVENTS /// </summary> [FeatureControl("FEATURE_AJAX_CONNECTIONEVENTS")] public bool AjaxConnectionEvents { get; set; } /// <summary> /// FEATURE_SHOW_APP_PROTOCOL_WARN_DIALOG /// </summary> [FeatureControl("FEATURE_SHOW_APP_PROTOCOL_WARN_DIALOG")] public bool ApplicationProtocolConfirmation { get; set; } /// <summary> /// FEATURE_BEHAVIORS /// </summary> [FeatureControl("FEATURE_BEHAVIORS")] public bool BinaryBehaviorSecurity { get; set; } /// <summary> /// FEATURE_BROWSER_EMULATION /// </summary> [FeatureControl("FEATURE_BROWSER_EMULATION")] public uint BrowserEmulation { get { return (uint)EmulationVersion * 1000; } set { EmulationVersion = (int)value / 1000; } } /// <summary> /// FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION /// </summary> [FeatureControl("FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION")] public bool ChildWindowClipping { get; set; } /// <summary> /// FEATURE_MANAGE_SCRIPT_CIRCULAR_REFS /// </summary> [FeatureControl("FEATURE_MANAGE_SCRIPT_CIRCULAR_REFS")] public bool CircularReferencesInScriptManagement { get; set; } /// <summary> /// FEATURE_ENABLE_SCRIPT_PASTE_URLACTION_IF_PROMPT /// </summary> [FeatureControl("FEATURE_ENABLE_SCRIPT_PASTE_URLACTION_IF_PROMPT")] public bool ClipboardScriptControl { get; set; } /// <summary> /// FEATURE_BLOCK_SETCAPTURE_XDOMAIN /// </summary> [FeatureControl("FEATURE_BLOCK_SETCAPTURE_XDOMAIN")] public bool CrossDomainCaptureEvent { get; set; } /// <summary> /// FEATURE_CROSS_DOMAIN_REDIRECT_MITIGATION /// </summary> [FeatureControl("FEATURE_CROSS_DOMAIN_REDIRECT_MITIGATION")] public bool CrossDomainRedirection { get; set; } /// <summary> /// FEATURE_DOWNLOAD_INITIATOR_HTTP_HEADER /// </summary> [FeatureControl("FEATURE_DOWNLOAD_INITIATOR_HTTP_HEADER")] public bool DebuggingNetworkTrafficRequests { get; set; } /// <summary> /// FEATURE_DOMSTORAGE /// </summary> [FeatureControl("FEATURE_DOMSTORAGE")] public bool DomWebStorageApiSupport { get; set; } /// <summary> /// FEATURE_CFSTR_INETURLW_DRAGDROP_FORMAT /// </summary> [FeatureControl("FEATURE_CFSTR_INETURLW_DRAGDROP_FORMAT")] public bool DragAndDropUrlFormat { get; set; } /// <summary> /// FEATURE_FEEDS /// </summary> [FeatureControl("FEATURE_FEEDS")] public bool Feeds { get; set; } /// <summary> /// FEATURE_RESTRICT_FILEDOWNLOAD /// </summary> [FeatureControl("FEATURE_RESTRICT_FILEDOWNLOAD")] public bool FileDownloadRestrictions { get; set; } /// <summary> /// FEATURE_BLOCK_CROSS_PROTOCOL_FILE_NAVIGATION /// </summary> [FeatureControl("FEATURE_BLOCK_CROSS_PROTOCOL_FILE_NAVIGATION")] public bool FileProtocolNavigation { get; set; } /// <summary> /// FEATURE_IE6_DEFAULT_FRAME_NAVIGATION_BEHAVIOR /// </summary> [FeatureControl("FEATURE_IE6_DEFAULT_FRAME_NAVIGATION_BEHAVIOR")] public bool FrameContentModification { get; set; } /// <summary> /// FEATURE_VIEWLINKEDWEBOC_IS_UNSAFE /// </summary> [FeatureControl("FEATURE_VIEWLINKEDWEBOC_IS_UNSAFE")] public bool FrameContentSecurity { get; set; } /// <summary> /// FEATURE_GPU_RENDERING /// </summary> [FeatureControl("FEATURE_GPU_RENDERING")] public bool GpuRendering { get; set; } /// <summary> /// FEATURE_MAXCONNECTIONSPER1_0SERVER /// </summary> [FeatureControl("FEATURE_MAXCONNECTIONSPER1_0SERVER")] public uint Http10ConnectionMaximum { get; set; } /// <summary> /// MAXCONNECTIONSPERSERVER /// </summary> [FeatureControl("MAXCONNECTIONSPERSERVER")] public uint Http11ConnectionMaximum { get; set; } /// <summary> /// FEATURE_IFRAME_MAILTO_THRESHOLD /// </summary> [FeatureControl("FEATURE_IFRAME_MAILTO_THRESHOLD")] public bool IFrameMailToThreshold { get; set; } /// <summary> /// FEATURE_MIME_TREAT_IMAGE_AS_AUTHORITATIVE /// </summary> [FeatureControl("FEATURE_MIME_TREAT_IMAGE_AS_AUTHORITATIVE")] public bool ImageMimeTypeDetermination { get; set; } /// <summary> /// FEATURE_SECURITYBAND /// </summary> [FeatureControl("FEATURE_SECURITYBAND")] public bool InformationBarHandling { get; set; } /// <summary> /// FEATURE_BLOCK_INPUT_PROMPTS /// </summary> [FeatureControl("FEATURE_BLOCK_INPUT_PROMPTS")] public bool InputPromptBlocking { get; set; } /// <summary> /// FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI /// </summary> [FeatureControl("FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI")] public bool IViewObjectLegacyDrawing { get; set; } /// <summary> /// FEATURE_NINPUT_LEGACYMODE /// </summary> [FeatureControl("FEATURE_NINPUT_LEGACYMODE")] public bool LegacyInputModel { get; set; } /// <summary> /// FEATURE_DISABLE_LEGACY_COMPRESSION /// </summary> [FeatureControl("FEATURE_DISABLE_LEGACY_COMPRESSION")] public bool LegacyCompressionSupport { get; set; } /// <summary> /// FEATURE_LOCALMACHINE_LOCKDOWN /// </summary> [FeatureControl("FEATURE_LOCALMACHINE_LOCKDOWN")] public bool LocalMachineLockdown { get; set; } /// <summary> /// FEATURE_BLOCK_LMZ_IMG /// </summary> [FeatureControl("FEATURE_BLOCK_LMZ_IMG")] public bool LocalImageBlocking { get; set; } /// <summary> /// FEATURE_BLOCK_LMZ_OBJECT /// </summary> [FeatureControl("FEATURE_BLOCK_LMZ_OBJECT")] public bool LocalObjectBlocking { get; set; } /// <summary> /// FEATURE_BLOCK_LMZ_SCRIPT /// </summary> [FeatureControl("FEATURE_BLOCK_LMZ_SCRIPT")] public bool LocalScriptBlocking { get; set; } /// <summary> /// FEATURE_MIME_SNIFFING /// </summary> [FeatureControl("FEATURE_MIME_SNIFFING")] public bool MimeTypeDetermination { get; set; } /// <summary> /// FEATURE_MIME_HANDLING /// </summary> [FeatureControl("FEATURE_MIME_HANDLING")] public bool MimeTypeHandling { get; set; } /// <summary> /// FEATURE_DISABLE_MK_PROTOCOL /// </summary> [FeatureControl("FEATURE_DISABLE_MK_PROTOCOL")] public bool MKProtocolSupport { get; set; } /// <summary> /// FEATURE_ISOLATE_NAMED_WINDOWS /// </summary> [FeatureControl("FEATURE_ISOLATE_NAMED_WINDOWS")] public bool NamedWindowIsolation { get; set; } /// <summary> /// FEATURE_DISABLE_NAVIGATION_SOUNDS /// </summary> [FeatureControl("FEATURE_DISABLE_NAVIGATION_SOUNDS")] public bool NavigationSoundSupport { get; set; } /// <summary> /// FEATURE_PROTOCOL_LOCKDOWN /// </summary> [FeatureControl("FEATURE_PROTOCOL_LOCKDOWN")] public bool ProtocolLockdown { get; set; } /// <summary> /// FEATURE_RESTRICT_ACTIVEXINSTALL /// </summary> [FeatureControl("FEATURE_RESTRICT_ACTIVEXINSTALL")] public bool ResourceProtocolRestriction { get; set; } /// <summary> /// FEATURE_DOWNLOAD_PROMPT_META_CONTROL /// </summary> [FeatureControl("FEATURE_DOWNLOAD_PROMPT_META_CONTROL")] public bool SaveDialogButtonHiding { get; set; } /// <summary> /// FEATURE_SCRIPTURL_MITIGATION /// </summary> [FeatureControl("FEATURE_SCRIPTURL_MITIGATION")] public bool ScriptUrlMitigation { get; set; } /// <summary> /// FEATURE_WARN_ON_SEC_CERT_REV_FAILED /// </summary> [FeatureControl("FEATURE_WARN_ON_SEC_CERT_REV_FAILED")] public bool SecurityCertificateRevocationFailure { get; set; } /// <summary> /// FEATURE_LOAD_SHDOCLC_RESOURCES /// </summary> [FeatureControl("FEATURE_LOAD_SHDOCLC_RESOURCES")] public bool ShdoclcDllResourceLoading { get; set; } /// <summary> /// FEATURE_SPELLCHECKING /// </summary> [FeatureControl("FEATURE_SPELLCHECKING")] public bool SpellcheckAndAutoCorrectSupport { get; set; } /// <summary> /// FEATURE_SSLUX /// </summary> [FeatureControl("FEATURE_SSLUX")] public bool SslSecurityAlertDisplay { get; set; } /// <summary> /// FEATURE_STATUS_BAR_THROTTLING /// </summary> [FeatureControl("FEATURE_STATUS_BAR_THROTTLING")] public bool StatusBarUpdateFrequency { get; set; } /// <summary> /// FEATURE_RESTRICT_CDL_CLSIDSNIFF /// </summary> [FeatureControl("FEATURE_RESTRICT_CDL_CLSIDSNIFF")] public bool StructuredStorageDetection { get; set; } /// <summary> /// FEATURE_TABBED_BROWSING /// </summary> [FeatureControl("FEATURE_TABBED_BROWSING")] public bool TabbedBrowsingShortcutsAndNotifications { get; set; } /// <summary> /// FEATURE_DISABLE_TELNET_PROTOCOL /// </summary> [FeatureControl("FEATURE_DISABLE_TELNET_PROTOCOL")] public bool TelnetProtocolSupport { get; set; } /// <summary> /// FEATURE_UNC_SAVEDFILECHECK /// </summary> [FeatureControl("FEATURE_UNC_SAVEDFILECHECK")] public bool UncFileSupportForMotW { get; set; } /// <summary> /// FEATURE_HTTP_USERNAME_PASSWORD_DISABLE /// </summary> [FeatureControl("FEATURE_HTTP_USERNAME_PASSWORD_DISABLE")] public bool UsernamesAndPasswordsInUrls { get; set; } /// <summary> /// FEATURE_VALIDATE_NAVIGATE_URL /// </summary> [FeatureControl("FEATURE_VALIDATE_NAVIGATE_URL")] public bool ValidateUrlNavigation { get; set; } /// <summary> /// FEATURE_SHIM_MSHELP_COMBINE /// </summary> [FeatureControl("FEATURE_SHIM_MSHELP_COMBINE")] public bool VisualStudioLegacyHelpSupport { get; set; } /// <summary> /// FEATURE_WEBOC_DOCUMENT_ZOOM /// </summary> [FeatureControl("FEATURE_WEBOC_DOCUMENT_ZOOM")] public bool WebBrowserControlDocumentZoom { get; set; } /// <summary> /// FEATURE_WEBOC_POPUPMANAGEMENT /// </summary> [FeatureControl("FEATURE_WEBOC_POPUPMANAGEMENT")] public bool WebBrowserControlPopupManagement { get; set; } /// <summary> /// FEATURE_WEBOC_MOVESIZECHILD /// </summary> [FeatureControl("FEATURE_WEBOC_MOVESIZECHILD")] public bool WebBrowserControlWindowControl { get; set; } /// <summary> /// FEATURE_ENABLE_WEB_CONTROL_VISUALS /// </summary> [FeatureControl("FEATURE_ENABLE_WEB_CONTROL_VISUALS")] public bool WebControlVisuals { get; set; } /// <summary> /// FEATURE_ADDON_MANAGEMENT /// </summary> [FeatureControl("FEATURE_ADDON_MANAGEMENT")] public bool WebOcAddonManagement { get; set; } /// <summary> /// FEATURE_WEBSOCKET /// </summary> [FeatureControl("FEATURE_WEBSOCKET")] public bool WebSocket { get; set; } /// <summary> /// FEATURE_WEBSOCKET_AUTHPROMPT /// </summary> [FeatureControl("FEATURE_WEBSOCKET_AUTHPROMPT")] public bool WebSocketAuthenticationPrompt { get; set; } /// <summary> /// FEATURE_WEBSOCKET_CLOSETIMEOUT /// </summary> [FeatureControl("FEATURE_WEBSOCKET_CLOSETIMEOUT")] public uint WebSocketCloseTimeout { get; set; } /// <summary> /// FEATURE_WEBSOCKET_MAXCONNECTIONSPERSERVER /// </summary> [FeatureControl("FEATURE_WEBSOCKET_MAXCONNECTIONSPERSERVER")] public uint WebSocketMaximumServerConnections { get; set; } /// <summary> /// FEATURE_WEBSOCKET_FOLLOWHTTPREDIRECT /// </summary> [FeatureControl("FEATURE_WEBSOCKET_FOLLOWHTTPREDIRECT")] public bool WebSocketFollowRedirects { get; set; } /// <summary> /// FEATURE_WINDOW_RESTRICTIONS /// </summary> [FeatureControl("FEATURE_WINDOW_RESTRICTIONS")] public bool WindowRestrictions { get; set; } /// <summary> /// FEATURE_XDOMAINREQUEST /// </summary> [FeatureControl("FEATURE_XDOMAINREQUEST")] public bool XDomainRequestObjectSupport { get; set; } /// <summary> /// FEATURE_XMLHTTP /// </summary> [FeatureControl("FEATURE_XMLHTTP")] public bool XmlHttpRequestObjectSupport { get; set; } /// <summary> /// FEATURE_ZONE_ELEVATION /// </summary> [FeatureControl("FEATURE_ZONE_ELEVATION")] public bool ZoneElevation { get; set; } /// <summary> /// FEATURE_RESTRICTED_ZONE_WHEN_FILE_NOT_FOUND /// </summary> [FeatureControl("FEATURE_RESTRICTED_ZONE_WHEN_FILE_NOT_FOUND")] public bool ZoneHandlingForMissingFiles { get; set; } /// <summary> /// FEATURE_READ_ZONE_STRINGS_FROM_REGISTRY /// </summary> [FeatureControl("FEATURE_READ_ZONE_STRINGS_FROM_REGISTRY")] public bool ZoneStringLoading { get; set; } public static readonly ExtendedWebBrowserConfiguration WebBrowserControlDefault = new ExtendedWebBrowserConfiguration { AboutProtocolRestriction = false, ActiveXBindingSafetyChecks = true, ActiveXObjectCaching = true, ActiveXUpdateRestriction = false, AddressAndStatusBarDisplay = false, AjaxConnectionEvents = false, ApplicationProtocolConfirmation = false, BinaryBehaviorSecurity = true, BrowserEmulation = 7000u, ChildWindowClipping = true, CircularReferencesInScriptManagement = true, ClipboardScriptControl = true, CrossDomainCaptureEvent = true, CrossDomainRedirection = true, DebuggingNetworkTrafficRequests = false, DomWebStorageApiSupport = true, DragAndDropUrlFormat = true, Feeds = false, FileDownloadRestrictions = false, FileProtocolNavigation = false, FrameContentModification = false, FrameContentSecurity = false, GpuRendering = false, Http10ConnectionMaximum = 6, Http11ConnectionMaximum = 6, IFrameMailToThreshold = false, ImageMimeTypeDetermination = true, InformationBarHandling = false, InputPromptBlocking = false, IViewObjectLegacyDrawing = true, LegacyInputModel = true, LegacyCompressionSupport = true, LocalMachineLockdown = false, LocalImageBlocking = false, LocalObjectBlocking = false, LocalScriptBlocking = false, MimeTypeDetermination = true, MimeTypeHandling = false, MKProtocolSupport = true, NamedWindowIsolation = true, NavigationSoundSupport = false, ProtocolLockdown = false, ResourceProtocolRestriction = false, SaveDialogButtonHiding = true, ScriptUrlMitigation = false, SecurityCertificateRevocationFailure = false, ShdoclcDllResourceLoading = false, SpellcheckAndAutoCorrectSupport = false, SslSecurityAlertDisplay = false, StatusBarUpdateFrequency = false, StructuredStorageDetection = false, TabbedBrowsingShortcutsAndNotifications = false, TelnetProtocolSupport = false, UncFileSupportForMotW = false, UsernamesAndPasswordsInUrls = false, ValidateUrlNavigation = false, VisualStudioLegacyHelpSupport = true, WebBrowserControlDocumentZoom = false, WebBrowserControlPopupManagement = true, WebBrowserControlWindowControl = false, WebControlVisuals = false, WebOcAddonManagement = false, WebSocket = true, WebSocketAuthenticationPrompt = false, WebSocketCloseTimeout = 15000, WebSocketMaximumServerConnections = 6, WebSocketFollowRedirects = false, WindowRestrictions = true, XDomainRequestObjectSupport = true, XmlHttpRequestObjectSupport = true, ZoneElevation = true, ZoneHandlingForMissingFiles = false, ZoneStringLoading = false, }; public static readonly ExtendedWebBrowserConfiguration InternetExplorerDefault = new ExtendedWebBrowserConfiguration { AboutProtocolRestriction = true, ActiveXBindingSafetyChecks = true, ActiveXObjectCaching = true, ActiveXUpdateRestriction = false, AddressAndStatusBarDisplay = true, AjaxConnectionEvents = true, ApplicationProtocolConfirmation = true, BinaryBehaviorSecurity = true, BrowserEmulation = 11000u, ChildWindowClipping = true, CircularReferencesInScriptManagement = true, ClipboardScriptControl = false, CrossDomainCaptureEvent = true, CrossDomainRedirection = true, DebuggingNetworkTrafficRequests = false, DomWebStorageApiSupport = true, DragAndDropUrlFormat = true, Feeds = true, FileDownloadRestrictions = false, FileProtocolNavigation = true, FrameContentModification = false, FrameContentSecurity = true, GpuRendering = true, Http10ConnectionMaximum = 6, Http11ConnectionMaximum = 6, IFrameMailToThreshold = true, ImageMimeTypeDetermination = true, InformationBarHandling = true, InputPromptBlocking = true, IViewObjectLegacyDrawing = true, LegacyInputModel = false, LegacyCompressionSupport = true, LocalMachineLockdown = true, LocalImageBlocking = true, LocalObjectBlocking = true, LocalScriptBlocking = true, MimeTypeDetermination = true, MimeTypeHandling = true, MKProtocolSupport = true, NamedWindowIsolation = true, NavigationSoundSupport = false, ProtocolLockdown = false, ResourceProtocolRestriction = true, SaveDialogButtonHiding = true, ScriptUrlMitigation = true, SecurityCertificateRevocationFailure = false, ShdoclcDllResourceLoading = false, SpellcheckAndAutoCorrectSupport = false, SslSecurityAlertDisplay = false, StatusBarUpdateFrequency = true, StructuredStorageDetection = false, TabbedBrowsingShortcutsAndNotifications = true, TelnetProtocolSupport = true, UncFileSupportForMotW = true, UsernamesAndPasswordsInUrls = true, ValidateUrlNavigation = true, VisualStudioLegacyHelpSupport = false, WebBrowserControlDocumentZoom = true, WebBrowserControlPopupManagement = true, WebBrowserControlWindowControl = false, WebControlVisuals = false, WebOcAddonManagement = false, WebSocket = true, WebSocketAuthenticationPrompt = false, WebSocketCloseTimeout = 15000, WebSocketMaximumServerConnections = 6, WebSocketFollowRedirects = false, WindowRestrictions = true, XDomainRequestObjectSupport = true, XmlHttpRequestObjectSupport = true, ZoneElevation = true, ZoneHandlingForMissingFiles = false, ZoneStringLoading = false, }; } And the attribute: [AttributeUsage(AttributeTargets.Property)] public class FeatureControlAttribute : Attribute { public string Key { get; set; } public FeatureControlAttribute(string key) { Key = key; } }